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 old_radio_rts_threshold) { 4568 rdev->wiphy.rts_threshold = 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 if (changed & WIPHY_PARAM_COVERAGE_CLASS) 4574 rdev->wiphy.coverage_class = coverage_class; 4575 if (changed & WIPHY_PARAM_TXQ_LIMIT) 4576 rdev->wiphy.txq_limit = txq_limit; 4577 if (changed & WIPHY_PARAM_TXQ_MEMORY_LIMIT) 4578 rdev->wiphy.txq_memory_limit = txq_memory_limit; 4579 if (changed & WIPHY_PARAM_TXQ_QUANTUM) 4580 rdev->wiphy.txq_quantum = txq_quantum; 4581 4582 result = rdev_set_wiphy_params(rdev, radio_idx, changed); 4583 if (result) { 4584 rdev->wiphy.retry_short = old_retry_short; 4585 rdev->wiphy.retry_long = old_retry_long; 4586 rdev->wiphy.frag_threshold = old_frag_threshold; 4587 rdev->wiphy.rts_threshold = old_rts_threshold; 4588 if (old_radio_rts_threshold) { 4589 for (i = 0 ; i < rdev->wiphy.n_radio; i++) 4590 rdev->wiphy.radio_cfg[i].rts_threshold = 4591 old_radio_rts_threshold[i]; 4592 } 4593 rdev->wiphy.coverage_class = old_coverage_class; 4594 rdev->wiphy.txq_limit = old_txq_limit; 4595 rdev->wiphy.txq_memory_limit = old_txq_memory_limit; 4596 rdev->wiphy.txq_quantum = old_txq_quantum; 4597 } 4598 4599 kfree(old_radio_rts_threshold); 4600 return result; 4601 } 4602 4603 return 0; 4604 } 4605 4606 int nl80211_send_chandef(struct sk_buff *msg, const struct cfg80211_chan_def *chandef) 4607 { 4608 if (WARN_ON(!cfg80211_chandef_valid(chandef))) 4609 return -EINVAL; 4610 4611 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, 4612 chandef->chan->center_freq)) 4613 return -ENOBUFS; 4614 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, 4615 chandef->chan->freq_offset)) 4616 return -ENOBUFS; 4617 switch (chandef->width) { 4618 case NL80211_CHAN_WIDTH_20_NOHT: 4619 case NL80211_CHAN_WIDTH_20: 4620 case NL80211_CHAN_WIDTH_40: 4621 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 4622 cfg80211_get_chandef_type(chandef))) 4623 return -ENOBUFS; 4624 break; 4625 default: 4626 break; 4627 } 4628 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width)) 4629 return -ENOBUFS; 4630 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1)) 4631 return -ENOBUFS; 4632 if (chandef->freq1_offset && 4633 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1_OFFSET, 4634 chandef->freq1_offset)) 4635 return -ENOBUFS; 4636 if (chandef->center_freq2 && 4637 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2)) 4638 return -ENOBUFS; 4639 if (chandef->punctured && 4640 nla_put_u32(msg, NL80211_ATTR_PUNCT_BITMAP, chandef->punctured)) 4641 return -ENOBUFS; 4642 if (chandef->s1g_primary_2mhz && 4643 nla_put_flag(msg, NL80211_ATTR_S1G_PRIMARY_2MHZ)) 4644 return -ENOBUFS; 4645 4646 if (chandef->npca_chan && 4647 nla_put_u32(msg, NL80211_ATTR_NPCA_PRIMARY_FREQ, 4648 chandef->npca_chan->center_freq)) 4649 return -ENOBUFS; 4650 if (chandef->npca_punctured && 4651 nla_put_u32(msg, NL80211_ATTR_NPCA_PUNCT_BITMAP, 4652 chandef->npca_punctured)) 4653 return -ENOBUFS; 4654 4655 return 0; 4656 } 4657 EXPORT_SYMBOL(nl80211_send_chandef); 4658 4659 static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags, 4660 struct cfg80211_registered_device *rdev, 4661 struct wireless_dev *wdev, 4662 enum nl80211_commands cmd) 4663 { 4664 struct net_device *dev = wdev->netdev; 4665 void *hdr; 4666 4667 lockdep_assert_wiphy(&rdev->wiphy); 4668 4669 WARN_ON(cmd != NL80211_CMD_NEW_INTERFACE && 4670 cmd != NL80211_CMD_DEL_INTERFACE && 4671 cmd != NL80211_CMD_SET_INTERFACE); 4672 4673 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 4674 if (!hdr) 4675 return -1; 4676 4677 if (dev && 4678 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 4679 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name))) 4680 goto nla_put_failure; 4681 4682 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 4683 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || 4684 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 4685 NL80211_ATTR_PAD) || 4686 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, wdev_address(wdev)) || 4687 nla_put_u32(msg, NL80211_ATTR_GENERATION, 4688 rdev->devlist_generation ^ 4689 (cfg80211_rdev_list_generation << 2)) || 4690 nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr) || 4691 nla_put_u32(msg, NL80211_ATTR_VIF_RADIO_MASK, wdev->radio_mask)) 4692 goto nla_put_failure; 4693 4694 if (rdev->ops->get_channel && !wdev->valid_links) { 4695 struct cfg80211_chan_def chandef = {}; 4696 int ret; 4697 4698 ret = rdev_get_channel(rdev, wdev, 0, &chandef); 4699 if (ret == 0 && nl80211_send_chandef(msg, &chandef)) 4700 goto nla_put_failure; 4701 } 4702 4703 if (rdev->ops->get_tx_power && !wdev->valid_links) { 4704 int dbm, ret; 4705 4706 ret = rdev_get_tx_power(rdev, wdev, -1, 0, &dbm); 4707 if (ret == 0 && 4708 nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL, 4709 DBM_TO_MBM(dbm))) 4710 goto nla_put_failure; 4711 } 4712 4713 switch (wdev->iftype) { 4714 case NL80211_IFTYPE_AP: 4715 case NL80211_IFTYPE_P2P_GO: 4716 if (wdev->u.ap.ssid_len && 4717 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len, 4718 wdev->u.ap.ssid)) 4719 goto nla_put_failure; 4720 break; 4721 case NL80211_IFTYPE_STATION: 4722 case NL80211_IFTYPE_P2P_CLIENT: 4723 if (wdev->u.client.ssid_len && 4724 nla_put(msg, NL80211_ATTR_SSID, wdev->u.client.ssid_len, 4725 wdev->u.client.ssid)) 4726 goto nla_put_failure; 4727 break; 4728 case NL80211_IFTYPE_ADHOC: 4729 if (wdev->u.ibss.ssid_len && 4730 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ibss.ssid_len, 4731 wdev->u.ibss.ssid)) 4732 goto nla_put_failure; 4733 break; 4734 default: 4735 /* nothing */ 4736 break; 4737 } 4738 4739 if (rdev->ops->get_txq_stats) { 4740 struct cfg80211_txq_stats txqstats = {}; 4741 int ret = rdev_get_txq_stats(rdev, wdev, &txqstats); 4742 4743 if (ret == 0 && 4744 !nl80211_put_txq_stats(msg, &txqstats, 4745 NL80211_ATTR_TXQ_STATS)) 4746 goto nla_put_failure; 4747 } 4748 4749 if (wdev->valid_links) { 4750 unsigned int link_id; 4751 struct nlattr *links = nla_nest_start(msg, 4752 NL80211_ATTR_MLO_LINKS); 4753 4754 if (!links) 4755 goto nla_put_failure; 4756 4757 for_each_valid_link(wdev, link_id) { 4758 struct nlattr *link = nla_nest_start(msg, link_id + 1); 4759 struct cfg80211_chan_def chandef = {}; 4760 int ret; 4761 4762 if (!link) 4763 goto nla_put_failure; 4764 4765 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 4766 goto nla_put_failure; 4767 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 4768 wdev->links[link_id].addr)) 4769 goto nla_put_failure; 4770 4771 ret = rdev_get_channel(rdev, wdev, link_id, &chandef); 4772 if (ret == 0 && nl80211_send_chandef(msg, &chandef)) 4773 goto nla_put_failure; 4774 4775 if (rdev->ops->get_tx_power) { 4776 int dbm, ret; 4777 4778 ret = rdev_get_tx_power(rdev, wdev, -1, link_id, &dbm); 4779 if (ret == 0 && 4780 nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL, 4781 DBM_TO_MBM(dbm))) 4782 goto nla_put_failure; 4783 } 4784 nla_nest_end(msg, link); 4785 } 4786 4787 nla_nest_end(msg, links); 4788 } 4789 4790 genlmsg_end(msg, hdr); 4791 return 0; 4792 4793 nla_put_failure: 4794 genlmsg_cancel(msg, hdr); 4795 return -EMSGSIZE; 4796 } 4797 4798 static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb) 4799 { 4800 int wp_idx = 0; 4801 int if_idx = 0; 4802 int wp_start = cb->args[0]; 4803 int if_start = cb->args[1]; 4804 int filter_wiphy = -1; 4805 struct cfg80211_registered_device *rdev; 4806 struct wireless_dev *wdev; 4807 int ret; 4808 4809 rtnl_lock(); 4810 if (!cb->args[2]) { 4811 struct nl80211_dump_wiphy_state state = { 4812 .filter_wiphy = -1, 4813 }; 4814 4815 ret = nl80211_dump_wiphy_parse(skb, cb, &state); 4816 if (ret) 4817 goto out_unlock; 4818 4819 filter_wiphy = state.filter_wiphy; 4820 4821 /* 4822 * if filtering, set cb->args[2] to +1 since 0 is the default 4823 * value needed to determine that parsing is necessary. 4824 */ 4825 if (filter_wiphy >= 0) 4826 cb->args[2] = filter_wiphy + 1; 4827 else 4828 cb->args[2] = -1; 4829 } else if (cb->args[2] > 0) { 4830 filter_wiphy = cb->args[2] - 1; 4831 } 4832 4833 for_each_rdev(rdev) { 4834 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) 4835 continue; 4836 if (wp_idx < wp_start) { 4837 wp_idx++; 4838 continue; 4839 } 4840 4841 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx) 4842 continue; 4843 4844 if_idx = 0; 4845 4846 guard(wiphy)(&rdev->wiphy); 4847 4848 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 4849 if (if_idx < if_start) { 4850 if_idx++; 4851 continue; 4852 } 4853 4854 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, 4855 cb->nlh->nlmsg_seq, NLM_F_MULTI, 4856 rdev, wdev, 4857 NL80211_CMD_NEW_INTERFACE) < 0) 4858 goto out; 4859 4860 if_idx++; 4861 } 4862 4863 if_start = 0; 4864 wp_idx++; 4865 } 4866 out: 4867 cb->args[0] = wp_idx; 4868 cb->args[1] = if_idx; 4869 4870 ret = skb->len; 4871 out_unlock: 4872 rtnl_unlock(); 4873 4874 return ret; 4875 } 4876 4877 static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info) 4878 { 4879 struct sk_buff *msg; 4880 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4881 struct wireless_dev *wdev = info->user_ptr[1]; 4882 4883 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 4884 if (!msg) 4885 return -ENOMEM; 4886 4887 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, 4888 rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) { 4889 nlmsg_free(msg); 4890 return -ENOBUFS; 4891 } 4892 4893 return genlmsg_reply(msg, info); 4894 } 4895 4896 static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = { 4897 [NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG }, 4898 [NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG }, 4899 [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG }, 4900 [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG }, 4901 [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG }, 4902 [NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG }, 4903 [NL80211_MNTR_FLAG_SKIP_TX] = { .type = NLA_FLAG }, 4904 }; 4905 4906 static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags) 4907 { 4908 struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1]; 4909 int flag; 4910 4911 *mntrflags = 0; 4912 4913 if (!nla) 4914 return -EINVAL; 4915 4916 if (nla_parse_nested_deprecated(flags, NL80211_MNTR_FLAG_MAX, nla, mntr_flags_policy, NULL)) 4917 return -EINVAL; 4918 4919 for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++) 4920 if (flags[flag]) 4921 *mntrflags |= (1<<flag); 4922 4923 /* cooked monitor mode is incompatible with other modes */ 4924 if (*mntrflags & MONITOR_FLAG_COOK_FRAMES && 4925 *mntrflags != MONITOR_FLAG_COOK_FRAMES) 4926 return -EOPNOTSUPP; 4927 4928 *mntrflags |= MONITOR_FLAG_CHANGED; 4929 4930 return 0; 4931 } 4932 4933 static int nl80211_parse_mon_options(struct cfg80211_registered_device *rdev, 4934 enum nl80211_iftype type, 4935 struct genl_info *info, 4936 struct vif_params *params) 4937 { 4938 bool change = false; 4939 int err; 4940 4941 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { 4942 if (type != NL80211_IFTYPE_MONITOR) 4943 return -EINVAL; 4944 4945 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], 4946 ¶ms->flags); 4947 if (err) 4948 return err; 4949 4950 change = true; 4951 } 4952 4953 /* MONITOR_FLAG_COOK_FRAMES is deprecated, refuse cooperation */ 4954 if (params->flags & MONITOR_FLAG_COOK_FRAMES) 4955 return -EOPNOTSUPP; 4956 4957 if (params->flags & MONITOR_FLAG_ACTIVE && 4958 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) 4959 return -EOPNOTSUPP; 4960 4961 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) { 4962 const u8 *mumimo_groups; 4963 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER; 4964 4965 if (type != NL80211_IFTYPE_MONITOR) 4966 return -EINVAL; 4967 4968 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) 4969 return -EOPNOTSUPP; 4970 4971 mumimo_groups = 4972 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); 4973 4974 /* bits 0 and 63 are reserved and must be zero */ 4975 if ((mumimo_groups[0] & BIT(0)) || 4976 (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7))) 4977 return -EINVAL; 4978 4979 params->vht_mumimo_groups = mumimo_groups; 4980 change = true; 4981 } 4982 4983 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) { 4984 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER; 4985 4986 if (type != NL80211_IFTYPE_MONITOR) 4987 return -EINVAL; 4988 4989 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) 4990 return -EOPNOTSUPP; 4991 4992 params->vht_mumimo_follow_addr = 4993 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]); 4994 change = true; 4995 } 4996 4997 return change ? 1 : 0; 4998 } 4999 5000 static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev, 5001 struct net_device *netdev, u8 use_4addr, 5002 enum nl80211_iftype iftype) 5003 { 5004 if (!use_4addr) { 5005 if (netdev && netif_is_bridge_port(netdev)) 5006 return -EBUSY; 5007 return 0; 5008 } 5009 5010 switch (iftype) { 5011 case NL80211_IFTYPE_AP_VLAN: 5012 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP) 5013 return 0; 5014 break; 5015 case NL80211_IFTYPE_STATION: 5016 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION) 5017 return 0; 5018 break; 5019 default: 5020 break; 5021 } 5022 5023 return -EOPNOTSUPP; 5024 } 5025 5026 static int nl80211_parse_vif_radio_mask(struct genl_info *info, 5027 u32 *radio_mask) 5028 { 5029 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5030 struct nlattr *attr = info->attrs[NL80211_ATTR_VIF_RADIO_MASK]; 5031 u32 mask, allowed; 5032 5033 if (!attr) { 5034 *radio_mask = 0; 5035 return 0; 5036 } 5037 5038 allowed = BIT(rdev->wiphy.n_radio) - 1; 5039 mask = nla_get_u32(attr); 5040 if (mask & ~allowed) 5041 return -EINVAL; 5042 if (!mask) 5043 mask = allowed; 5044 *radio_mask = mask; 5045 5046 return 1; 5047 } 5048 5049 static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info) 5050 { 5051 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5052 struct vif_params params; 5053 int err; 5054 enum nl80211_iftype otype, ntype; 5055 struct net_device *dev = info->user_ptr[1]; 5056 struct wireless_dev *wdev = dev->ieee80211_ptr; 5057 u32 radio_mask = 0; 5058 bool change = false; 5059 5060 memset(¶ms, 0, sizeof(params)); 5061 5062 otype = ntype = dev->ieee80211_ptr->iftype; 5063 5064 if (info->attrs[NL80211_ATTR_IFTYPE]) { 5065 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); 5066 if (otype != ntype) 5067 change = true; 5068 } 5069 5070 if (info->attrs[NL80211_ATTR_MESH_ID]) { 5071 if (ntype != NL80211_IFTYPE_MESH_POINT) 5072 return -EINVAL; 5073 if (otype != NL80211_IFTYPE_MESH_POINT) 5074 return -EINVAL; 5075 if (netif_running(dev)) 5076 return -EBUSY; 5077 5078 wdev->u.mesh.id_up_len = 5079 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 5080 memcpy(wdev->u.mesh.id, 5081 nla_data(info->attrs[NL80211_ATTR_MESH_ID]), 5082 wdev->u.mesh.id_up_len); 5083 } 5084 5085 if (info->attrs[NL80211_ATTR_4ADDR]) { 5086 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); 5087 change = true; 5088 err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype); 5089 if (err) 5090 return err; 5091 } else { 5092 params.use_4addr = -1; 5093 } 5094 5095 err = nl80211_parse_mon_options(rdev, ntype, info, ¶ms); 5096 if (err < 0) 5097 return err; 5098 if (err > 0) 5099 change = true; 5100 5101 err = nl80211_parse_vif_radio_mask(info, &radio_mask); 5102 if (err < 0) 5103 return err; 5104 if (err && netif_running(dev)) 5105 return -EBUSY; 5106 5107 if (change) 5108 err = cfg80211_change_iface(rdev, dev, ntype, ¶ms); 5109 else 5110 err = 0; 5111 5112 if (!err && params.use_4addr != -1) 5113 dev->ieee80211_ptr->use_4addr = params.use_4addr; 5114 5115 if (radio_mask) 5116 wdev->radio_mask = radio_mask; 5117 5118 if (change && !err) 5119 nl80211_notify_iface(rdev, wdev, NL80211_CMD_SET_INTERFACE); 5120 5121 return err; 5122 } 5123 5124 static int _nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) 5125 { 5126 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5127 struct vif_params params; 5128 struct wireless_dev *wdev; 5129 struct sk_buff *msg; 5130 u32 radio_mask; 5131 int err; 5132 enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED; 5133 5134 memset(¶ms, 0, sizeof(params)); 5135 5136 if (!info->attrs[NL80211_ATTR_IFNAME]) 5137 return -EINVAL; 5138 5139 if (info->attrs[NL80211_ATTR_IFTYPE]) 5140 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); 5141 5142 if (!rdev->ops->add_virtual_intf) 5143 return -EOPNOTSUPP; 5144 5145 if ((type == NL80211_IFTYPE_P2P_DEVICE || type == NL80211_IFTYPE_NAN || 5146 type == NL80211_IFTYPE_PD || 5147 rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) && 5148 info->attrs[NL80211_ATTR_MAC]) { 5149 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], 5150 ETH_ALEN); 5151 if (!is_valid_ether_addr(params.macaddr)) 5152 return -EADDRNOTAVAIL; 5153 } 5154 5155 if (info->attrs[NL80211_ATTR_4ADDR]) { 5156 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); 5157 err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type); 5158 if (err) 5159 return err; 5160 } 5161 5162 if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0)) 5163 return -EOPNOTSUPP; 5164 5165 err = nl80211_parse_mon_options(rdev, type, info, ¶ms); 5166 if (err < 0) 5167 return err; 5168 5169 err = nl80211_parse_vif_radio_mask(info, &radio_mask); 5170 if (err < 0) 5171 return err; 5172 5173 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 5174 if (!msg) 5175 return -ENOMEM; 5176 5177 wdev = rdev_add_virtual_intf(rdev, 5178 nla_data(info->attrs[NL80211_ATTR_IFNAME]), 5179 NET_NAME_USER, type, ¶ms); 5180 if (WARN_ON(!wdev)) { 5181 nlmsg_free(msg); 5182 return -EPROTO; 5183 } else if (IS_ERR(wdev)) { 5184 nlmsg_free(msg); 5185 return PTR_ERR(wdev); 5186 } 5187 5188 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 5189 wdev->owner_nlportid = info->snd_portid; 5190 5191 switch (type) { 5192 case NL80211_IFTYPE_MESH_POINT: 5193 if (!info->attrs[NL80211_ATTR_MESH_ID]) 5194 break; 5195 wdev->u.mesh.id_up_len = 5196 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 5197 memcpy(wdev->u.mesh.id, 5198 nla_data(info->attrs[NL80211_ATTR_MESH_ID]), 5199 wdev->u.mesh.id_up_len); 5200 break; 5201 case NL80211_IFTYPE_NAN: 5202 case NL80211_IFTYPE_P2P_DEVICE: 5203 case NL80211_IFTYPE_PD: 5204 /* 5205 * P2P Device, NAN and PD do not have a netdev, so don't go 5206 * through the netdev notifier and must be added here 5207 */ 5208 cfg80211_init_wdev(wdev); 5209 cfg80211_register_wdev(rdev, wdev); 5210 break; 5211 default: 5212 break; 5213 } 5214 5215 if (radio_mask) 5216 wdev->radio_mask = radio_mask; 5217 5218 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, 5219 rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) { 5220 nlmsg_free(msg); 5221 return -ENOBUFS; 5222 } 5223 5224 return genlmsg_reply(msg, info); 5225 } 5226 5227 static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) 5228 { 5229 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5230 5231 /* to avoid failing a new interface creation due to pending removal */ 5232 cfg80211_destroy_ifaces(rdev); 5233 5234 guard(wiphy)(&rdev->wiphy); 5235 5236 return _nl80211_new_interface(skb, info); 5237 } 5238 5239 static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info) 5240 { 5241 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5242 struct wireless_dev *wdev = info->user_ptr[1]; 5243 5244 if (!rdev->ops->del_virtual_intf) 5245 return -EOPNOTSUPP; 5246 5247 /* 5248 * We hold RTNL, so this is safe, without RTNL opencount cannot 5249 * reach 0, and thus the rdev cannot be deleted. 5250 * 5251 * We need to do it for the dev_close(), since that will call 5252 * the netdev notifiers, and we need to acquire the mutex there 5253 * but don't know if we get there from here or from some other 5254 * place (e.g. "ip link set ... down"). 5255 */ 5256 mutex_unlock(&rdev->wiphy.mtx); 5257 5258 /* 5259 * If we remove a wireless device without a netdev then clear 5260 * user_ptr[1] so that nl80211_post_doit won't dereference it 5261 * to check if it needs to do dev_put(). Otherwise it crashes 5262 * since the wdev has been freed, unlike with a netdev where 5263 * we need the dev_put() for the netdev to really be freed. 5264 */ 5265 if (!wdev->netdev) 5266 info->user_ptr[1] = NULL; 5267 else 5268 dev_close(wdev->netdev); 5269 5270 cfg80211_close_dependents(rdev, wdev); 5271 5272 mutex_lock(&rdev->wiphy.mtx); 5273 5274 return cfg80211_remove_virtual_intf(rdev, wdev); 5275 } 5276 5277 static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info) 5278 { 5279 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5280 struct net_device *dev = info->user_ptr[1]; 5281 u16 noack_map; 5282 5283 if (!info->attrs[NL80211_ATTR_NOACK_MAP]) 5284 return -EINVAL; 5285 5286 if (!rdev->ops->set_noack_map) 5287 return -EOPNOTSUPP; 5288 5289 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]); 5290 5291 return rdev_set_noack_map(rdev, dev, noack_map); 5292 } 5293 5294 static int nl80211_validate_key_link_id(struct genl_info *info, 5295 struct wireless_dev *wdev, 5296 int link_id, bool pairwise) 5297 { 5298 if (pairwise) { 5299 if (link_id != -1) { 5300 GENL_SET_ERR_MSG(info, 5301 "link ID not allowed for pairwise key"); 5302 return -EINVAL; 5303 } 5304 5305 return 0; 5306 } 5307 5308 if (wdev->valid_links) { 5309 if (link_id == -1) { 5310 GENL_SET_ERR_MSG(info, 5311 "link ID must be set for MLO group key"); 5312 return -EINVAL; 5313 } 5314 if (!(wdev->valid_links & BIT(link_id))) { 5315 GENL_SET_ERR_MSG(info, "invalid link ID for MLO group key"); 5316 return -EINVAL; 5317 } 5318 } else if (link_id != -1) { 5319 GENL_SET_ERR_MSG(info, "link ID not allowed for non-MLO group key"); 5320 return -EINVAL; 5321 } 5322 5323 return 0; 5324 } 5325 5326 struct get_key_cookie { 5327 struct sk_buff *msg; 5328 int error; 5329 int idx; 5330 }; 5331 5332 static void get_key_callback(void *c, struct key_params *params) 5333 { 5334 struct nlattr *key; 5335 struct get_key_cookie *cookie = c; 5336 5337 if ((params->seq && 5338 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ, 5339 params->seq_len, params->seq)) || 5340 (params->cipher && 5341 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER, 5342 params->cipher))) 5343 goto nla_put_failure; 5344 5345 key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY); 5346 if (!key) 5347 goto nla_put_failure; 5348 5349 if ((params->seq && 5350 nla_put(cookie->msg, NL80211_KEY_SEQ, 5351 params->seq_len, params->seq)) || 5352 (params->cipher && 5353 nla_put_u32(cookie->msg, NL80211_KEY_CIPHER, 5354 params->cipher))) 5355 goto nla_put_failure; 5356 5357 if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx)) 5358 goto nla_put_failure; 5359 5360 nla_nest_end(cookie->msg, key); 5361 5362 return; 5363 nla_put_failure: 5364 cookie->error = 1; 5365 } 5366 5367 static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) 5368 { 5369 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5370 int err; 5371 struct wireless_dev *wdev = info->user_ptr[1]; 5372 u8 key_idx = 0; 5373 const u8 *mac_addr = NULL; 5374 bool pairwise; 5375 struct get_key_cookie cookie = { 5376 .error = 0, 5377 }; 5378 void *hdr; 5379 struct sk_buff *msg; 5380 bool bigtk_support = false; 5381 int link_id = nl80211_link_id_or_invalid(info->attrs); 5382 5383 if (wiphy_ext_feature_isset(&rdev->wiphy, 5384 NL80211_EXT_FEATURE_BEACON_PROTECTION)) 5385 bigtk_support = true; 5386 5387 if ((wdev->iftype == NL80211_IFTYPE_STATION || 5388 wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) && 5389 wiphy_ext_feature_isset(&rdev->wiphy, 5390 NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT)) 5391 bigtk_support = true; 5392 5393 if (info->attrs[NL80211_ATTR_KEY_IDX]) { 5394 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); 5395 5396 if (key_idx >= 6 && key_idx <= 7 && !bigtk_support) { 5397 GENL_SET_ERR_MSG(info, "BIGTK not supported"); 5398 return -EINVAL; 5399 } 5400 } 5401 5402 if (info->attrs[NL80211_ATTR_MAC]) 5403 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5404 5405 pairwise = !!mac_addr; 5406 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { 5407 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); 5408 5409 if (kt != NL80211_KEYTYPE_GROUP && 5410 kt != NL80211_KEYTYPE_PAIRWISE) 5411 return -EINVAL; 5412 pairwise = kt == NL80211_KEYTYPE_PAIRWISE; 5413 } 5414 5415 if (!rdev->ops->get_key) 5416 return -EOPNOTSUPP; 5417 5418 if (!cfg80211_valid_key_idx(wdev, key_idx, pairwise, mac_addr)) 5419 return -ENOENT; 5420 5421 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 5422 if (!msg) 5423 return -ENOMEM; 5424 5425 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 5426 NL80211_CMD_NEW_KEY); 5427 if (!hdr) 5428 goto nla_put_failure; 5429 5430 cookie.msg = msg; 5431 cookie.idx = key_idx; 5432 5433 if ((wdev->netdev && 5434 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) || 5435 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 5436 NL80211_ATTR_PAD) || 5437 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_idx)) 5438 goto nla_put_failure; 5439 if (mac_addr && 5440 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr)) 5441 goto nla_put_failure; 5442 5443 err = nl80211_validate_key_link_id(info, wdev, link_id, pairwise); 5444 if (err) 5445 goto free_msg; 5446 5447 err = rdev_get_key(rdev, wdev, link_id, key_idx, pairwise, mac_addr, 5448 &cookie, get_key_callback); 5449 5450 if (err) 5451 goto free_msg; 5452 5453 if (cookie.error) 5454 goto nla_put_failure; 5455 5456 genlmsg_end(msg, hdr); 5457 return genlmsg_reply(msg, info); 5458 5459 nla_put_failure: 5460 err = -ENOBUFS; 5461 free_msg: 5462 nlmsg_free(msg); 5463 return err; 5464 } 5465 5466 static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info) 5467 { 5468 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5469 struct key_parse key; 5470 int err; 5471 struct wireless_dev *wdev = info->user_ptr[1]; 5472 int link_id = nl80211_link_id_or_invalid(info->attrs); 5473 5474 err = nl80211_parse_key(info, &key); 5475 if (err) 5476 return err; 5477 5478 if (key.idx < 0) 5479 return -EINVAL; 5480 5481 /* Only support setting default key and 5482 * Extended Key ID action NL80211_KEY_SET_TX. 5483 */ 5484 if (!key.def && !key.defmgmt && !key.defbeacon && 5485 !(key.p.mode == NL80211_KEY_SET_TX)) 5486 return -EINVAL; 5487 5488 if (key.def) { 5489 if (!rdev->ops->set_default_key) 5490 return -EOPNOTSUPP; 5491 5492 if (!wdev->netdev) 5493 return -EINVAL; 5494 5495 err = nl80211_key_allowed(wdev); 5496 if (err) 5497 return err; 5498 5499 err = nl80211_validate_key_link_id(info, wdev, link_id, false); 5500 if (err) 5501 return err; 5502 5503 err = rdev_set_default_key(rdev, wdev->netdev, link_id, key.idx, 5504 key.def_uni, key.def_multi); 5505 5506 if (err) 5507 return err; 5508 5509 #ifdef CONFIG_CFG80211_WEXT 5510 wdev->wext.default_key = key.idx; 5511 #endif 5512 return 0; 5513 } else if (key.defmgmt) { 5514 if (key.def_uni || !key.def_multi) 5515 return -EINVAL; 5516 5517 if (!rdev->ops->set_default_mgmt_key) 5518 return -EOPNOTSUPP; 5519 5520 err = nl80211_key_allowed(wdev); 5521 if (err) 5522 return err; 5523 5524 err = nl80211_validate_key_link_id(info, wdev, link_id, false); 5525 if (err) 5526 return err; 5527 5528 err = rdev_set_default_mgmt_key(rdev, wdev, link_id, key.idx); 5529 if (err) 5530 return err; 5531 5532 #ifdef CONFIG_CFG80211_WEXT 5533 wdev->wext.default_mgmt_key = key.idx; 5534 #endif 5535 return 0; 5536 } else if (key.defbeacon) { 5537 if (key.def_uni || !key.def_multi) 5538 return -EINVAL; 5539 5540 if (!rdev->ops->set_default_beacon_key) 5541 return -EOPNOTSUPP; 5542 5543 err = nl80211_key_allowed(wdev); 5544 if (err) 5545 return err; 5546 5547 err = nl80211_validate_key_link_id(info, wdev, link_id, false); 5548 if (err) 5549 return err; 5550 5551 return rdev_set_default_beacon_key(rdev, wdev, link_id, 5552 key.idx); 5553 } else if (key.p.mode == NL80211_KEY_SET_TX && 5554 wiphy_ext_feature_isset(&rdev->wiphy, 5555 NL80211_EXT_FEATURE_EXT_KEY_ID)) { 5556 u8 *mac_addr = NULL; 5557 5558 if (info->attrs[NL80211_ATTR_MAC]) 5559 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5560 5561 if (!mac_addr || key.idx < 0 || key.idx > 1) 5562 return -EINVAL; 5563 5564 err = nl80211_validate_key_link_id(info, wdev, link_id, true); 5565 if (err) 5566 return err; 5567 5568 return rdev_add_key(rdev, wdev, link_id, key.idx, 5569 NL80211_KEYTYPE_PAIRWISE, 5570 mac_addr, &key.p); 5571 } 5572 5573 return -EINVAL; 5574 } 5575 5576 static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info) 5577 { 5578 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5579 int err; 5580 struct wireless_dev *wdev = info->user_ptr[1]; 5581 struct key_parse key; 5582 const u8 *mac_addr = NULL; 5583 int link_id = nl80211_link_id_or_invalid(info->attrs); 5584 5585 err = nl80211_parse_key(info, &key); 5586 if (err) 5587 return err; 5588 5589 if (!key.p.key) { 5590 GENL_SET_ERR_MSG(info, "no key"); 5591 return -EINVAL; 5592 } 5593 5594 if (info->attrs[NL80211_ATTR_MAC]) 5595 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5596 5597 if (key.type == -1) { 5598 if (mac_addr) 5599 key.type = NL80211_KEYTYPE_PAIRWISE; 5600 else 5601 key.type = NL80211_KEYTYPE_GROUP; 5602 } 5603 5604 /* for now */ 5605 if (key.type != NL80211_KEYTYPE_PAIRWISE && 5606 key.type != NL80211_KEYTYPE_GROUP) { 5607 GENL_SET_ERR_MSG(info, "key type not pairwise or group"); 5608 return -EINVAL; 5609 } 5610 5611 if (key.type == NL80211_KEYTYPE_GROUP && 5612 info->attrs[NL80211_ATTR_VLAN_ID]) 5613 key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 5614 5615 if (!rdev->ops->add_key) 5616 return -EOPNOTSUPP; 5617 5618 if (cfg80211_validate_key_settings(rdev, wdev, &key.p, key.idx, 5619 key.type == NL80211_KEYTYPE_PAIRWISE, 5620 mac_addr)) { 5621 GENL_SET_ERR_MSG(info, "key setting validation failed"); 5622 return -EINVAL; 5623 } 5624 5625 err = nl80211_key_allowed(wdev); 5626 if (err) 5627 GENL_SET_ERR_MSG(info, "key not allowed"); 5628 5629 if (!err) 5630 err = nl80211_validate_key_link_id(info, wdev, link_id, 5631 key.type == NL80211_KEYTYPE_PAIRWISE); 5632 5633 if (!err) { 5634 err = rdev_add_key(rdev, wdev, link_id, key.idx, 5635 key.type == NL80211_KEYTYPE_PAIRWISE, 5636 mac_addr, &key.p); 5637 if (err) 5638 GENL_SET_ERR_MSG(info, "key addition failed"); 5639 } 5640 5641 return err; 5642 } 5643 5644 static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info) 5645 { 5646 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5647 int err; 5648 struct wireless_dev *wdev = info->user_ptr[1]; 5649 u8 *mac_addr = NULL; 5650 struct key_parse key; 5651 int link_id = nl80211_link_id_or_invalid(info->attrs); 5652 5653 err = nl80211_parse_key(info, &key); 5654 if (err) 5655 return err; 5656 5657 if (info->attrs[NL80211_ATTR_MAC]) 5658 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5659 5660 if (key.type == -1) { 5661 if (mac_addr) 5662 key.type = NL80211_KEYTYPE_PAIRWISE; 5663 else 5664 key.type = NL80211_KEYTYPE_GROUP; 5665 } 5666 5667 /* for now */ 5668 if (key.type != NL80211_KEYTYPE_PAIRWISE && 5669 key.type != NL80211_KEYTYPE_GROUP) 5670 return -EINVAL; 5671 5672 if (!cfg80211_valid_key_idx(wdev, key.idx, 5673 key.type == NL80211_KEYTYPE_PAIRWISE, 5674 mac_addr)) 5675 return -EINVAL; 5676 5677 if (!rdev->ops->del_key) 5678 return -EOPNOTSUPP; 5679 5680 err = nl80211_key_allowed(wdev); 5681 5682 if (!err) 5683 err = nl80211_validate_key_link_id(info, wdev, link_id, 5684 key.type == NL80211_KEYTYPE_PAIRWISE); 5685 5686 if (!err) 5687 err = rdev_del_key(rdev, wdev, link_id, key.idx, 5688 key.type == NL80211_KEYTYPE_PAIRWISE, 5689 mac_addr); 5690 5691 #ifdef CONFIG_CFG80211_WEXT 5692 if (!err) { 5693 if (key.idx == wdev->wext.default_key) 5694 wdev->wext.default_key = -1; 5695 else if (key.idx == wdev->wext.default_mgmt_key) 5696 wdev->wext.default_mgmt_key = -1; 5697 } 5698 #endif 5699 5700 return err; 5701 } 5702 5703 /* This function returns an error or the number of nested attributes */ 5704 static int validate_acl_mac_addrs(struct nlattr *nl_attr) 5705 { 5706 struct nlattr *attr; 5707 int n_entries = 0, tmp; 5708 5709 nla_for_each_nested(attr, nl_attr, tmp) { 5710 if (nla_len(attr) != ETH_ALEN) 5711 return -EINVAL; 5712 5713 n_entries++; 5714 } 5715 5716 return n_entries; 5717 } 5718 5719 /* 5720 * This function parses ACL information and allocates memory for ACL data. 5721 * On successful return, the calling function is responsible to free the 5722 * ACL buffer returned by this function. 5723 */ 5724 static struct cfg80211_acl_data *parse_acl_data(struct wiphy *wiphy, 5725 struct genl_info *info) 5726 { 5727 enum nl80211_acl_policy acl_policy; 5728 struct nlattr *attr; 5729 struct cfg80211_acl_data *acl; 5730 int i = 0, n_entries, tmp; 5731 5732 if (!wiphy->max_acl_mac_addrs) 5733 return ERR_PTR(-EOPNOTSUPP); 5734 5735 if (!info->attrs[NL80211_ATTR_ACL_POLICY]) 5736 return ERR_PTR(-EINVAL); 5737 5738 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]); 5739 if (acl_policy != NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED && 5740 acl_policy != NL80211_ACL_POLICY_DENY_UNLESS_LISTED) 5741 return ERR_PTR(-EINVAL); 5742 5743 if (!info->attrs[NL80211_ATTR_MAC_ADDRS]) 5744 return ERR_PTR(-EINVAL); 5745 5746 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]); 5747 if (n_entries < 0) 5748 return ERR_PTR(n_entries); 5749 5750 if (n_entries > wiphy->max_acl_mac_addrs) 5751 return ERR_PTR(-EOPNOTSUPP); 5752 5753 acl = kzalloc_flex(*acl, mac_addrs, n_entries); 5754 if (!acl) 5755 return ERR_PTR(-ENOMEM); 5756 acl->n_acl_entries = n_entries; 5757 5758 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { 5759 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); 5760 i++; 5761 } 5762 acl->acl_policy = acl_policy; 5763 5764 return acl; 5765 } 5766 5767 static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info) 5768 { 5769 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5770 struct net_device *dev = info->user_ptr[1]; 5771 struct cfg80211_acl_data *acl; 5772 int err; 5773 5774 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 5775 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 5776 return -EOPNOTSUPP; 5777 5778 if (!dev->ieee80211_ptr->links[0].ap.beacon_interval) 5779 return -EINVAL; 5780 5781 acl = parse_acl_data(&rdev->wiphy, info); 5782 if (IS_ERR(acl)) 5783 return PTR_ERR(acl); 5784 5785 err = rdev_set_mac_acl(rdev, dev, acl); 5786 5787 kfree(acl); 5788 5789 return err; 5790 } 5791 5792 static u32 rateset_to_mask(struct ieee80211_supported_band *sband, 5793 u8 *rates, u8 rates_len) 5794 { 5795 u8 i; 5796 u32 mask = 0; 5797 5798 for (i = 0; i < rates_len; i++) { 5799 int rate = (rates[i] & 0x7f) * 5; 5800 int ridx; 5801 5802 for (ridx = 0; ridx < sband->n_bitrates; ridx++) { 5803 struct ieee80211_rate *srate = 5804 &sband->bitrates[ridx]; 5805 if (rate == srate->bitrate) { 5806 mask |= 1 << ridx; 5807 break; 5808 } 5809 } 5810 if (ridx == sband->n_bitrates) 5811 return 0; /* rate not found */ 5812 } 5813 5814 return mask; 5815 } 5816 5817 static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband, 5818 u8 *rates, u8 rates_len, 5819 u8 mcs[IEEE80211_HT_MCS_MASK_LEN]) 5820 { 5821 u8 i; 5822 5823 memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN); 5824 5825 for (i = 0; i < rates_len; i++) { 5826 int ridx, rbit; 5827 5828 ridx = rates[i] / 8; 5829 rbit = BIT(rates[i] % 8); 5830 5831 /* check validity */ 5832 if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN)) 5833 return false; 5834 5835 /* check availability */ 5836 ridx = array_index_nospec(ridx, IEEE80211_HT_MCS_MASK_LEN); 5837 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) 5838 mcs[ridx] |= rbit; 5839 else 5840 return false; 5841 } 5842 5843 return true; 5844 } 5845 5846 static u16 vht_mcs_map_to_mcs_mask(u8 vht_mcs_map) 5847 { 5848 u16 mcs_mask = 0; 5849 5850 switch (vht_mcs_map) { 5851 case IEEE80211_VHT_MCS_NOT_SUPPORTED: 5852 break; 5853 case IEEE80211_VHT_MCS_SUPPORT_0_7: 5854 mcs_mask = 0x00FF; 5855 break; 5856 case IEEE80211_VHT_MCS_SUPPORT_0_8: 5857 mcs_mask = 0x01FF; 5858 break; 5859 case IEEE80211_VHT_MCS_SUPPORT_0_9: 5860 mcs_mask = 0x03FF; 5861 break; 5862 default: 5863 break; 5864 } 5865 5866 return mcs_mask; 5867 } 5868 5869 static void vht_build_mcs_mask(u16 vht_mcs_map, 5870 u16 vht_mcs_mask[NL80211_VHT_NSS_MAX]) 5871 { 5872 u8 nss; 5873 5874 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) { 5875 vht_mcs_mask[nss] = vht_mcs_map_to_mcs_mask(vht_mcs_map & 0x03); 5876 vht_mcs_map >>= 2; 5877 } 5878 } 5879 5880 static bool vht_set_mcs_mask(struct ieee80211_supported_band *sband, 5881 struct nl80211_txrate_vht *txrate, 5882 u16 mcs[NL80211_VHT_NSS_MAX]) 5883 { 5884 u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 5885 u16 tx_mcs_mask[NL80211_VHT_NSS_MAX] = {}; 5886 u8 i; 5887 5888 if (!sband->vht_cap.vht_supported) 5889 return false; 5890 5891 memset(mcs, 0, sizeof(u16) * NL80211_VHT_NSS_MAX); 5892 5893 /* Build vht_mcs_mask from VHT capabilities */ 5894 vht_build_mcs_mask(tx_mcs_map, tx_mcs_mask); 5895 5896 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 5897 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) 5898 mcs[i] = txrate->mcs[i]; 5899 else 5900 return false; 5901 } 5902 5903 return true; 5904 } 5905 5906 static u16 he_mcs_map_to_mcs_mask(u8 he_mcs_map) 5907 { 5908 switch (he_mcs_map) { 5909 case IEEE80211_HE_MCS_NOT_SUPPORTED: 5910 return 0; 5911 case IEEE80211_HE_MCS_SUPPORT_0_7: 5912 return 0x00FF; 5913 case IEEE80211_HE_MCS_SUPPORT_0_9: 5914 return 0x03FF; 5915 case IEEE80211_HE_MCS_SUPPORT_0_11: 5916 return 0xFFF; 5917 default: 5918 break; 5919 } 5920 return 0; 5921 } 5922 5923 static void he_build_mcs_mask(u16 he_mcs_map, 5924 u16 he_mcs_mask[NL80211_HE_NSS_MAX]) 5925 { 5926 u8 nss; 5927 5928 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) { 5929 he_mcs_mask[nss] = he_mcs_map_to_mcs_mask(he_mcs_map & 0x03); 5930 he_mcs_map >>= 2; 5931 } 5932 } 5933 5934 static u16 he_get_txmcsmap(struct genl_info *info, unsigned int link_id, 5935 const struct ieee80211_sta_he_cap *he_cap) 5936 { 5937 struct net_device *dev = info->user_ptr[1]; 5938 struct wireless_dev *wdev = dev->ieee80211_ptr; 5939 struct cfg80211_chan_def *chandef; 5940 __le16 tx_mcs; 5941 5942 chandef = wdev_chandef(wdev, link_id); 5943 if (!chandef) { 5944 /* 5945 * This is probably broken, but we never maintained 5946 * a chandef in these cases, so it always was. 5947 */ 5948 return le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); 5949 } 5950 5951 switch (chandef->width) { 5952 case NL80211_CHAN_WIDTH_80P80: 5953 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80p80; 5954 break; 5955 case NL80211_CHAN_WIDTH_160: 5956 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_160; 5957 break; 5958 default: 5959 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80; 5960 break; 5961 } 5962 5963 return le16_to_cpu(tx_mcs); 5964 } 5965 5966 static bool he_set_mcs_mask(struct genl_info *info, 5967 struct wireless_dev *wdev, 5968 struct ieee80211_supported_band *sband, 5969 struct nl80211_txrate_he *txrate, 5970 u16 mcs[NL80211_HE_NSS_MAX], 5971 unsigned int link_id) 5972 { 5973 const struct ieee80211_sta_he_cap *he_cap; 5974 u16 tx_mcs_mask[NL80211_HE_NSS_MAX] = {}; 5975 u16 tx_mcs_map = 0; 5976 u8 i; 5977 5978 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); 5979 if (!he_cap) 5980 return false; 5981 5982 memset(mcs, 0, sizeof(u16) * NL80211_HE_NSS_MAX); 5983 5984 tx_mcs_map = he_get_txmcsmap(info, link_id, he_cap); 5985 5986 /* Build he_mcs_mask from HE capabilities */ 5987 he_build_mcs_mask(tx_mcs_map, tx_mcs_mask); 5988 5989 for (i = 0; i < NL80211_HE_NSS_MAX; i++) { 5990 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) 5991 mcs[i] = txrate->mcs[i]; 5992 else 5993 return false; 5994 } 5995 5996 return true; 5997 } 5998 5999 static void eht_build_mcs_mask(struct genl_info *info, 6000 const struct ieee80211_sta_eht_cap *eht_cap, 6001 u8 mcs_nss_len, u16 *mcs_mask) 6002 { 6003 struct net_device *dev = info->user_ptr[1]; 6004 struct wireless_dev *wdev = dev->ieee80211_ptr; 6005 u8 nss, mcs_7 = 0, mcs_9 = 0, mcs_11 = 0, mcs_13 = 0; 6006 unsigned int link_id = nl80211_link_id(info->attrs); 6007 6008 if (mcs_nss_len == 4) { 6009 const struct ieee80211_eht_mcs_nss_supp_20mhz_only *mcs = 6010 &eht_cap->eht_mcs_nss_supp.only_20mhz; 6011 6012 mcs_7 = u8_get_bits(mcs->rx_tx_mcs7_max_nss, 6013 IEEE80211_EHT_MCS_NSS_TX); 6014 mcs_9 = u8_get_bits(mcs->rx_tx_mcs9_max_nss, 6015 IEEE80211_EHT_MCS_NSS_TX); 6016 mcs_11 = u8_get_bits(mcs->rx_tx_mcs11_max_nss, 6017 IEEE80211_EHT_MCS_NSS_TX); 6018 mcs_13 = u8_get_bits(mcs->rx_tx_mcs13_max_nss, 6019 IEEE80211_EHT_MCS_NSS_TX); 6020 6021 } else { 6022 const struct ieee80211_eht_mcs_nss_supp_bw *mcs; 6023 enum nl80211_chan_width width; 6024 6025 switch (wdev->iftype) { 6026 case NL80211_IFTYPE_ADHOC: 6027 width = wdev->u.ibss.chandef.width; 6028 break; 6029 case NL80211_IFTYPE_MESH_POINT: 6030 width = wdev->u.mesh.chandef.width; 6031 break; 6032 case NL80211_IFTYPE_OCB: 6033 width = wdev->u.ocb.chandef.width; 6034 break; 6035 default: 6036 if (wdev->valid_links) 6037 width = wdev->links[link_id].ap.chandef.width; 6038 else 6039 width = wdev->u.ap.preset_chandef.width; 6040 break; 6041 } 6042 6043 switch (width) { 6044 case NL80211_CHAN_WIDTH_320: 6045 mcs = &eht_cap->eht_mcs_nss_supp.bw._320; 6046 break; 6047 case NL80211_CHAN_WIDTH_160: 6048 mcs = &eht_cap->eht_mcs_nss_supp.bw._160; 6049 break; 6050 default: 6051 mcs = &eht_cap->eht_mcs_nss_supp.bw._80; 6052 break; 6053 } 6054 6055 mcs_7 = u8_get_bits(mcs->rx_tx_mcs9_max_nss, 6056 IEEE80211_EHT_MCS_NSS_TX); 6057 mcs_9 = u8_get_bits(mcs->rx_tx_mcs9_max_nss, 6058 IEEE80211_EHT_MCS_NSS_TX); 6059 mcs_11 = u8_get_bits(mcs->rx_tx_mcs11_max_nss, 6060 IEEE80211_EHT_MCS_NSS_TX); 6061 mcs_13 = u8_get_bits(mcs->rx_tx_mcs13_max_nss, 6062 IEEE80211_EHT_MCS_NSS_TX); 6063 } 6064 6065 /* Enable MCS 14 for NSS 0 */ 6066 if (eht_cap->eht_cap_elem.phy_cap_info[6] & 6067 IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP) 6068 mcs_mask[0] |= 0x4000; 6069 6070 /* Enable MCS 15 for NSS 0 */ 6071 mcs_mask[0] |= 0x8000; 6072 6073 for (nss = 0; nss < NL80211_EHT_NSS_MAX; nss++) { 6074 if (!mcs_7) 6075 continue; 6076 mcs_mask[nss] |= 0x00FF; 6077 mcs_7--; 6078 6079 if (!mcs_9) 6080 continue; 6081 mcs_mask[nss] |= 0x0300; 6082 mcs_9--; 6083 6084 if (!mcs_11) 6085 continue; 6086 mcs_mask[nss] |= 0x0C00; 6087 mcs_11--; 6088 6089 if (!mcs_13) 6090 continue; 6091 mcs_mask[nss] |= 0x3000; 6092 mcs_13--; 6093 } 6094 } 6095 6096 static bool eht_set_mcs_mask(struct genl_info *info, struct wireless_dev *wdev, 6097 struct ieee80211_supported_band *sband, 6098 struct nl80211_txrate_eht *txrate, 6099 u16 mcs[NL80211_EHT_NSS_MAX]) 6100 { 6101 const struct ieee80211_sta_he_cap *he_cap; 6102 const struct ieee80211_sta_eht_cap *eht_cap; 6103 u16 tx_mcs_mask[NL80211_EHT_NSS_MAX] = { 0 }; 6104 u8 i, mcs_nss_len; 6105 6106 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); 6107 if (!he_cap) 6108 return false; 6109 6110 eht_cap = ieee80211_get_eht_iftype_cap(sband, wdev->iftype); 6111 if (!eht_cap) 6112 return false; 6113 6114 /* Checks for MCS 14 */ 6115 if (txrate->mcs[0] & 0x4000) { 6116 if (sband->band != NL80211_BAND_6GHZ) 6117 return false; 6118 6119 if (!(eht_cap->eht_cap_elem.phy_cap_info[6] & 6120 IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP)) 6121 return false; 6122 } 6123 6124 mcs_nss_len = ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem, 6125 &eht_cap->eht_cap_elem, 6126 wdev->iftype == 6127 NL80211_IFTYPE_STATION); 6128 6129 if (mcs_nss_len == 3) { 6130 /* Supported iftypes for setting non-20 MHZ only EHT MCS */ 6131 switch (wdev->iftype) { 6132 case NL80211_IFTYPE_ADHOC: 6133 case NL80211_IFTYPE_AP: 6134 case NL80211_IFTYPE_P2P_GO: 6135 case NL80211_IFTYPE_MESH_POINT: 6136 case NL80211_IFTYPE_OCB: 6137 break; 6138 default: 6139 return false; 6140 } 6141 } 6142 6143 /* Build eht_mcs_mask from EHT and HE capabilities */ 6144 eht_build_mcs_mask(info, eht_cap, mcs_nss_len, tx_mcs_mask); 6145 6146 memset(mcs, 0, sizeof(u16) * NL80211_EHT_NSS_MAX); 6147 for (i = 0; i < NL80211_EHT_NSS_MAX; i++) { 6148 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) 6149 mcs[i] = txrate->mcs[i]; 6150 else 6151 return false; 6152 } 6153 6154 return true; 6155 } 6156 6157 static int nl80211_parse_tx_bitrate_mask(struct genl_info *info, 6158 struct nlattr *attrs[], 6159 enum nl80211_attrs attr, 6160 struct cfg80211_bitrate_mask *mask, 6161 struct net_device *dev, 6162 bool default_all_enabled, 6163 unsigned int link_id) 6164 { 6165 struct nlattr *tb[NL80211_TXRATE_MAX + 1]; 6166 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6167 struct wireless_dev *wdev = dev->ieee80211_ptr; 6168 int rem, i; 6169 struct nlattr *tx_rates; 6170 struct ieee80211_supported_band *sband; 6171 u16 vht_tx_mcs_map, he_tx_mcs_map; 6172 6173 memset(mask, 0, sizeof(*mask)); 6174 /* Default to all rates enabled */ 6175 for (i = 0; i < NUM_NL80211_BANDS; i++) { 6176 const struct ieee80211_sta_he_cap *he_cap; 6177 const struct ieee80211_sta_eht_cap *eht_cap; 6178 u8 mcs_nss_len; 6179 6180 if (!default_all_enabled) 6181 break; 6182 6183 sband = rdev->wiphy.bands[i]; 6184 6185 if (!sband) 6186 continue; 6187 6188 mask->control[i].legacy = (1 << sband->n_bitrates) - 1; 6189 memcpy(mask->control[i].ht_mcs, 6190 sband->ht_cap.mcs.rx_mask, 6191 sizeof(mask->control[i].ht_mcs)); 6192 6193 if (sband->vht_cap.vht_supported) { 6194 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 6195 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs); 6196 } 6197 6198 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); 6199 if (!he_cap) 6200 continue; 6201 6202 he_tx_mcs_map = he_get_txmcsmap(info, link_id, he_cap); 6203 he_build_mcs_mask(he_tx_mcs_map, mask->control[i].he_mcs); 6204 6205 mask->control[i].he_gi = 0xFF; 6206 mask->control[i].he_ltf = 0xFF; 6207 6208 eht_cap = ieee80211_get_eht_iftype_cap(sband, wdev->iftype); 6209 if (!eht_cap) 6210 continue; 6211 6212 mcs_nss_len = ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem, 6213 &eht_cap->eht_cap_elem, 6214 wdev->iftype == 6215 NL80211_IFTYPE_STATION); 6216 6217 eht_build_mcs_mask(info, eht_cap, mcs_nss_len, 6218 mask->control[i].eht_mcs); 6219 6220 mask->control[i].eht_gi = 0xFF; 6221 mask->control[i].eht_ltf = 0xFF; 6222 } 6223 6224 /* if no rates are given set it back to the defaults */ 6225 if (!attrs[attr]) 6226 goto out; 6227 6228 /* The nested attribute uses enum nl80211_band as the index. This maps 6229 * directly to the enum nl80211_band values used in cfg80211. 6230 */ 6231 BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8); 6232 nla_for_each_nested(tx_rates, attrs[attr], rem) { 6233 int band = nla_type(tx_rates); 6234 int err; 6235 6236 if (band < 0 || band >= NUM_NL80211_BANDS) 6237 return -EINVAL; 6238 sband = rdev->wiphy.bands[band]; 6239 if (sband == NULL) 6240 return -EINVAL; 6241 err = nla_parse_nested_deprecated(tb, NL80211_TXRATE_MAX, 6242 tx_rates, 6243 nl80211_txattr_policy, 6244 info->extack); 6245 if (err) 6246 return err; 6247 if (tb[NL80211_TXRATE_LEGACY]) { 6248 mask->control[band].legacy = rateset_to_mask( 6249 sband, 6250 nla_data(tb[NL80211_TXRATE_LEGACY]), 6251 nla_len(tb[NL80211_TXRATE_LEGACY])); 6252 if ((mask->control[band].legacy == 0) && 6253 nla_len(tb[NL80211_TXRATE_LEGACY])) 6254 return -EINVAL; 6255 } 6256 if (tb[NL80211_TXRATE_HT]) { 6257 if (!ht_rateset_to_mask( 6258 sband, 6259 nla_data(tb[NL80211_TXRATE_HT]), 6260 nla_len(tb[NL80211_TXRATE_HT]), 6261 mask->control[band].ht_mcs)) 6262 return -EINVAL; 6263 } 6264 6265 if (tb[NL80211_TXRATE_VHT]) { 6266 if (!vht_set_mcs_mask( 6267 sband, 6268 nla_data(tb[NL80211_TXRATE_VHT]), 6269 mask->control[band].vht_mcs)) 6270 return -EINVAL; 6271 } 6272 6273 if (tb[NL80211_TXRATE_GI]) { 6274 mask->control[band].gi = 6275 nla_get_u8(tb[NL80211_TXRATE_GI]); 6276 if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI) 6277 return -EINVAL; 6278 } 6279 if (tb[NL80211_TXRATE_HE] && 6280 !he_set_mcs_mask(info, wdev, sband, 6281 nla_data(tb[NL80211_TXRATE_HE]), 6282 mask->control[band].he_mcs, 6283 link_id)) 6284 return -EINVAL; 6285 6286 if (tb[NL80211_TXRATE_HE_GI]) 6287 mask->control[band].he_gi = 6288 nla_get_u8(tb[NL80211_TXRATE_HE_GI]); 6289 if (tb[NL80211_TXRATE_HE_LTF]) 6290 mask->control[band].he_ltf = 6291 nla_get_u8(tb[NL80211_TXRATE_HE_LTF]); 6292 6293 if (tb[NL80211_TXRATE_EHT] && 6294 !eht_set_mcs_mask(info, wdev, sband, 6295 nla_data(tb[NL80211_TXRATE_EHT]), 6296 mask->control[band].eht_mcs)) 6297 return -EINVAL; 6298 6299 if (tb[NL80211_TXRATE_EHT_GI]) 6300 mask->control[band].eht_gi = 6301 nla_get_u8(tb[NL80211_TXRATE_EHT_GI]); 6302 if (tb[NL80211_TXRATE_EHT_LTF]) 6303 mask->control[band].eht_ltf = 6304 nla_get_u8(tb[NL80211_TXRATE_EHT_LTF]); 6305 6306 if (mask->control[band].legacy == 0) { 6307 /* don't allow empty legacy rates if HT, VHT, HE or EHT 6308 * are not even supported. 6309 */ 6310 if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported || 6311 rdev->wiphy.bands[band]->vht_cap.vht_supported || 6312 ieee80211_get_he_iftype_cap(sband, wdev->iftype) || 6313 ieee80211_get_eht_iftype_cap(sband, wdev->iftype))) 6314 return -EINVAL; 6315 6316 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) 6317 if (mask->control[band].ht_mcs[i]) 6318 goto out; 6319 6320 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) 6321 if (mask->control[band].vht_mcs[i]) 6322 goto out; 6323 6324 for (i = 0; i < NL80211_HE_NSS_MAX; i++) 6325 if (mask->control[band].he_mcs[i]) 6326 goto out; 6327 6328 for (i = 0; i < NL80211_EHT_NSS_MAX; i++) 6329 if (mask->control[band].eht_mcs[i]) 6330 goto out; 6331 6332 /* legacy and mcs rates may not be both empty */ 6333 return -EINVAL; 6334 } 6335 } 6336 6337 out: 6338 return 0; 6339 } 6340 6341 static int validate_beacon_tx_rate(struct cfg80211_registered_device *rdev, 6342 enum nl80211_band band, 6343 struct cfg80211_bitrate_mask *beacon_rate) 6344 { 6345 u32 count_ht, count_vht, count_he, count_eht, i; 6346 u32 rate = beacon_rate->control[band].legacy; 6347 6348 /* Allow only one rate */ 6349 if (hweight32(rate) > 1) 6350 return -EINVAL; 6351 6352 count_ht = 0; 6353 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) { 6354 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) { 6355 return -EINVAL; 6356 } else if (beacon_rate->control[band].ht_mcs[i]) { 6357 count_ht++; 6358 if (count_ht > 1) 6359 return -EINVAL; 6360 } 6361 if (count_ht && rate) 6362 return -EINVAL; 6363 } 6364 6365 count_vht = 0; 6366 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 6367 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) { 6368 return -EINVAL; 6369 } else if (beacon_rate->control[band].vht_mcs[i]) { 6370 count_vht++; 6371 if (count_vht > 1) 6372 return -EINVAL; 6373 } 6374 if (count_vht && rate) 6375 return -EINVAL; 6376 } 6377 6378 count_he = 0; 6379 for (i = 0; i < NL80211_HE_NSS_MAX; i++) { 6380 if (hweight16(beacon_rate->control[band].he_mcs[i]) > 1) { 6381 return -EINVAL; 6382 } else if (beacon_rate->control[band].he_mcs[i]) { 6383 count_he++; 6384 if (count_he > 1) 6385 return -EINVAL; 6386 } 6387 if (count_he && rate) 6388 return -EINVAL; 6389 } 6390 6391 count_eht = 0; 6392 for (i = 0; i < NL80211_EHT_NSS_MAX; i++) { 6393 if (hweight16(beacon_rate->control[band].eht_mcs[i]) > 1) { 6394 return -EINVAL; 6395 } else if (beacon_rate->control[band].eht_mcs[i]) { 6396 count_eht++; 6397 if (count_eht > 1) 6398 return -EINVAL; 6399 } 6400 if (count_eht && rate) 6401 return -EINVAL; 6402 } 6403 6404 if ((count_ht && count_vht && count_he && count_eht) || 6405 (!rate && !count_ht && !count_vht && !count_he && !count_eht)) 6406 return -EINVAL; 6407 6408 if (rate && 6409 !wiphy_ext_feature_isset(&rdev->wiphy, 6410 NL80211_EXT_FEATURE_BEACON_RATE_LEGACY)) 6411 return -EINVAL; 6412 if (count_ht && 6413 !wiphy_ext_feature_isset(&rdev->wiphy, 6414 NL80211_EXT_FEATURE_BEACON_RATE_HT)) 6415 return -EINVAL; 6416 if (count_vht && 6417 !wiphy_ext_feature_isset(&rdev->wiphy, 6418 NL80211_EXT_FEATURE_BEACON_RATE_VHT)) 6419 return -EINVAL; 6420 if (count_he && 6421 !wiphy_ext_feature_isset(&rdev->wiphy, 6422 NL80211_EXT_FEATURE_BEACON_RATE_HE)) 6423 return -EINVAL; 6424 6425 if (count_eht && 6426 !wiphy_ext_feature_isset(&rdev->wiphy, 6427 NL80211_EXT_FEATURE_BEACON_RATE_EHT)) 6428 return -EINVAL; 6429 6430 return 0; 6431 } 6432 6433 static int nl80211_parse_mbssid_config(struct wiphy *wiphy, 6434 struct net_device *dev, 6435 unsigned int link_id, 6436 struct nlattr *attrs, 6437 struct cfg80211_mbssid_config *config, 6438 u8 num_elems) 6439 { 6440 struct nlattr *tb[NL80211_MBSSID_CONFIG_ATTR_MAX + 1]; 6441 int tx_link_id = -1; 6442 6443 if (!wiphy->mbssid_max_interfaces) 6444 return -EOPNOTSUPP; 6445 6446 if (nla_parse_nested(tb, NL80211_MBSSID_CONFIG_ATTR_MAX, attrs, NULL, 6447 NULL) || 6448 !tb[NL80211_MBSSID_CONFIG_ATTR_INDEX]) 6449 return -EINVAL; 6450 6451 config->ema = nla_get_flag(tb[NL80211_MBSSID_CONFIG_ATTR_EMA]); 6452 if (config->ema) { 6453 if (!wiphy->ema_max_profile_periodicity) 6454 return -EOPNOTSUPP; 6455 6456 if (num_elems > wiphy->ema_max_profile_periodicity) 6457 return -EINVAL; 6458 } 6459 6460 config->index = nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_INDEX]); 6461 if (config->index >= wiphy->mbssid_max_interfaces || 6462 (!config->index && !num_elems)) 6463 return -EINVAL; 6464 6465 if (tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID]) 6466 tx_link_id = nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID]); 6467 6468 if (tb[NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX]) { 6469 u32 tx_ifindex = 6470 nla_get_u32(tb[NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX]); 6471 6472 if ((!config->index && tx_ifindex != dev->ifindex) || 6473 (config->index && tx_ifindex == dev->ifindex)) 6474 return -EINVAL; 6475 6476 if (tx_ifindex != dev->ifindex) { 6477 struct net_device *tx_netdev = 6478 dev_get_by_index(wiphy_net(wiphy), tx_ifindex); 6479 6480 if (!tx_netdev || !tx_netdev->ieee80211_ptr || 6481 tx_netdev->ieee80211_ptr->wiphy != wiphy || 6482 tx_netdev->ieee80211_ptr->iftype != 6483 NL80211_IFTYPE_AP) { 6484 dev_put(tx_netdev); 6485 return -EINVAL; 6486 } 6487 6488 config->tx_wdev = tx_netdev->ieee80211_ptr; 6489 /* Caller should call dev_put(config->tx_wdev) from this point */ 6490 6491 if (config->tx_wdev->valid_links) { 6492 if (tx_link_id == -1 || 6493 !(config->tx_wdev->valid_links & BIT(tx_link_id))) 6494 return -ENOLINK; 6495 6496 config->tx_link_id = tx_link_id; 6497 } 6498 } else { 6499 if (tx_link_id >= 0 && tx_link_id != link_id) 6500 return -EINVAL; 6501 6502 config->tx_wdev = dev->ieee80211_ptr; 6503 } 6504 } else if (!config->index) { 6505 if (tx_link_id >= 0 && tx_link_id != link_id) 6506 return -EINVAL; 6507 6508 config->tx_wdev = dev->ieee80211_ptr; 6509 } else { 6510 return -EINVAL; 6511 } 6512 6513 return 0; 6514 } 6515 6516 static struct cfg80211_mbssid_elems * 6517 nl80211_parse_mbssid_elems(struct wiphy *wiphy, struct nlattr *attrs, 6518 struct netlink_ext_ack *extack) 6519 { 6520 struct nlattr *nl_elems; 6521 struct cfg80211_mbssid_elems *elems; 6522 int rem_elems; 6523 u8 i = 0, num_elems = 0; 6524 6525 if (!wiphy->mbssid_max_interfaces) 6526 return ERR_PTR(-EINVAL); 6527 6528 nla_for_each_nested(nl_elems, attrs, rem_elems) { 6529 int ret; 6530 6531 ret = validate_ie_attr(nl_elems, extack); 6532 if (ret) 6533 return ERR_PTR(ret); 6534 6535 if (num_elems >= 255) 6536 return ERR_PTR(-EINVAL); 6537 num_elems++; 6538 } 6539 6540 elems = kzalloc_flex(*elems, elem, num_elems); 6541 if (!elems) 6542 return ERR_PTR(-ENOMEM); 6543 elems->cnt = num_elems; 6544 6545 nla_for_each_nested(nl_elems, attrs, rem_elems) { 6546 elems->elem[i].data = nla_data(nl_elems); 6547 elems->elem[i].len = nla_len(nl_elems); 6548 i++; 6549 } 6550 return elems; 6551 } 6552 6553 static struct cfg80211_rnr_elems * 6554 nl80211_parse_rnr_elems(struct wiphy *wiphy, struct nlattr *attrs, 6555 struct netlink_ext_ack *extack) 6556 { 6557 struct nlattr *nl_elems; 6558 struct cfg80211_rnr_elems *elems; 6559 int rem_elems; 6560 u8 i = 0, num_elems = 0; 6561 6562 nla_for_each_nested(nl_elems, attrs, rem_elems) { 6563 int ret; 6564 6565 ret = validate_ie_attr(nl_elems, extack); 6566 if (ret) 6567 return ERR_PTR(ret); 6568 6569 if (num_elems >= 255) 6570 return ERR_PTR(-EINVAL); 6571 6572 num_elems++; 6573 } 6574 6575 elems = kzalloc_flex(*elems, elem, num_elems); 6576 if (!elems) 6577 return ERR_PTR(-ENOMEM); 6578 elems->cnt = num_elems; 6579 6580 nla_for_each_nested(nl_elems, attrs, rem_elems) { 6581 elems->elem[i].data = nla_data(nl_elems); 6582 elems->elem[i].len = nla_len(nl_elems); 6583 i++; 6584 } 6585 return elems; 6586 } 6587 6588 static int nl80211_parse_he_bss_color(struct nlattr *attrs, 6589 struct cfg80211_he_bss_color *he_bss_color) 6590 { 6591 struct nlattr *tb[NL80211_HE_BSS_COLOR_ATTR_MAX + 1]; 6592 int err; 6593 6594 err = nla_parse_nested(tb, NL80211_HE_BSS_COLOR_ATTR_MAX, attrs, 6595 he_bss_color_policy, NULL); 6596 if (err) 6597 return err; 6598 6599 if (!tb[NL80211_HE_BSS_COLOR_ATTR_COLOR]) 6600 return -EINVAL; 6601 6602 he_bss_color->color = 6603 nla_get_u8(tb[NL80211_HE_BSS_COLOR_ATTR_COLOR]); 6604 he_bss_color->enabled = 6605 !nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_DISABLED]); 6606 he_bss_color->partial = 6607 nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_PARTIAL]); 6608 6609 return 0; 6610 } 6611 6612 static void nl80211_check_ap_rate_selectors(struct cfg80211_beacon_data *bcn, 6613 const struct element *rates) 6614 { 6615 int i; 6616 6617 if (!rates) 6618 return; 6619 6620 for (i = 0; i < rates->datalen; i++) { 6621 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY) 6622 bcn->ht_required = true; 6623 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY) 6624 bcn->vht_required = true; 6625 } 6626 } 6627 6628 /* 6629 * Since the nl80211 API didn't include, from the beginning, attributes about 6630 * HT/VHT/... operation, we parse them out of the elements and check for 6631 * validity for use by drivers/mac80211. 6632 */ 6633 static int nl80211_calculate_ap_operation(struct nlattr *attrs[], 6634 struct cfg80211_beacon_data *bcn, 6635 struct netlink_ext_ack *extack) 6636 { 6637 size_t ies_len = bcn->tail_len; 6638 const u8 *ies = bcn->tail; 6639 const struct element *rates; 6640 const struct element *op; 6641 6642 rates = cfg80211_find_elem(WLAN_EID_SUPP_RATES, ies, ies_len); 6643 nl80211_check_ap_rate_selectors(bcn, rates); 6644 6645 rates = cfg80211_find_elem(WLAN_EID_EXT_SUPP_RATES, ies, ies_len); 6646 nl80211_check_ap_rate_selectors(bcn, rates); 6647 6648 op = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION, ies, ies_len); 6649 if (op) { 6650 if (op->datalen < sizeof(*bcn->he_oper) + 1) { 6651 NL_SET_ERR_MSG(extack, "bad HE operation in beacon"); 6652 return -EINVAL; 6653 } 6654 bcn->he_oper = (void *)(op->data + 1); 6655 /* takes extension ID into account */ 6656 if (op->datalen < ieee80211_he_oper_size((void *)bcn->he_oper)) { 6657 NL_SET_ERR_MSG(extack, "bad HE operation in beacon"); 6658 return -EINVAL; 6659 } 6660 } 6661 6662 op = cfg80211_find_elem(WLAN_EID_HT_OPERATION, ies, ies_len); 6663 if (op) { 6664 if (op->datalen < sizeof(*bcn->ht_oper)) { 6665 NL_SET_ERR_MSG(extack, "bad HT operation in beacon"); 6666 return -EINVAL; 6667 } 6668 bcn->ht_oper = (void *)op->data; 6669 } 6670 6671 op = cfg80211_find_elem(WLAN_EID_VHT_OPERATION, ies, ies_len); 6672 if (op) { 6673 if (op->datalen < sizeof(*bcn->vht_oper)) { 6674 NL_SET_ERR_MSG(extack, "bad VHT operation in beacon"); 6675 return -EINVAL; 6676 } 6677 bcn->vht_oper = (void *)op->data; 6678 } 6679 6680 op = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_OPERATION, ies, ies_len); 6681 if (op) { 6682 if (!ieee80211_eht_oper_size_ok(op->data + 1, 6683 op->datalen - 1)) { 6684 NL_SET_ERR_MSG(extack, "bad EHT operation in beacon"); 6685 return -EINVAL; 6686 } 6687 bcn->eht_oper = (void *)(op->data + 1); 6688 } 6689 6690 op = cfg80211_find_ext_elem(WLAN_EID_EXT_UHR_OPER, ies, ies_len); 6691 if (op) { 6692 /* need full UHR operation separately */ 6693 if (!attrs[NL80211_ATTR_UHR_OPERATION]) { 6694 NL_SET_ERR_MSG(extack, "missing UHR operation"); 6695 return -EINVAL; 6696 } 6697 bcn->uhr_oper = nla_data(attrs[NL80211_ATTR_UHR_OPERATION]); 6698 } else if (attrs[NL80211_ATTR_UHR_OPERATION]) { 6699 NL_SET_ERR_MSG(extack, "unexpected UHR operation"); 6700 return -EINVAL; 6701 } 6702 6703 return 0; 6704 } 6705 6706 static int nl80211_parse_beacon(struct cfg80211_registered_device *rdev, 6707 struct nlattr *attrs[], 6708 struct cfg80211_beacon_data *bcn, 6709 struct ieee80211_channel *chan, 6710 struct netlink_ext_ack *extack) 6711 { 6712 bool haveinfo = false; 6713 int err; 6714 6715 memset(bcn, 0, sizeof(*bcn)); 6716 6717 bcn->link_id = nl80211_link_id(attrs); 6718 6719 if (attrs[NL80211_ATTR_BEACON_HEAD]) { 6720 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); 6721 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); 6722 if (!bcn->head_len) 6723 return -EINVAL; 6724 haveinfo = true; 6725 } 6726 6727 if (attrs[NL80211_ATTR_BEACON_TAIL]) { 6728 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]); 6729 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]); 6730 haveinfo = true; 6731 } 6732 6733 if (!haveinfo) 6734 return -EINVAL; 6735 6736 if (attrs[NL80211_ATTR_IE]) { 6737 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]); 6738 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]); 6739 } 6740 6741 if (attrs[NL80211_ATTR_IE_PROBE_RESP]) { 6742 bcn->proberesp_ies = 6743 nla_data(attrs[NL80211_ATTR_IE_PROBE_RESP]); 6744 bcn->proberesp_ies_len = 6745 nla_len(attrs[NL80211_ATTR_IE_PROBE_RESP]); 6746 } 6747 6748 if (attrs[NL80211_ATTR_IE_ASSOC_RESP]) { 6749 bcn->assocresp_ies = 6750 nla_data(attrs[NL80211_ATTR_IE_ASSOC_RESP]); 6751 bcn->assocresp_ies_len = 6752 nla_len(attrs[NL80211_ATTR_IE_ASSOC_RESP]); 6753 } 6754 6755 if (attrs[NL80211_ATTR_PROBE_RESP]) { 6756 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]); 6757 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]); 6758 } 6759 6760 if (attrs[NL80211_ATTR_FTM_RESPONDER]) { 6761 struct nlattr *tb[NL80211_FTM_RESP_ATTR_MAX + 1]; 6762 6763 err = nla_parse_nested_deprecated(tb, 6764 NL80211_FTM_RESP_ATTR_MAX, 6765 attrs[NL80211_ATTR_FTM_RESPONDER], 6766 NULL, NULL); 6767 if (err) 6768 return err; 6769 6770 if (tb[NL80211_FTM_RESP_ATTR_ENABLED] && 6771 wiphy_ext_feature_isset(&rdev->wiphy, 6772 NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER)) 6773 bcn->ftm_responder = 1; 6774 else 6775 return -EOPNOTSUPP; 6776 6777 if (tb[NL80211_FTM_RESP_ATTR_LCI]) { 6778 bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]); 6779 bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]); 6780 } 6781 6782 if (tb[NL80211_FTM_RESP_ATTR_CIVICLOC]) { 6783 bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); 6784 bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); 6785 } 6786 } else { 6787 bcn->ftm_responder = -1; 6788 } 6789 6790 if (attrs[NL80211_ATTR_HE_BSS_COLOR]) { 6791 err = nl80211_parse_he_bss_color(attrs[NL80211_ATTR_HE_BSS_COLOR], 6792 &bcn->he_bss_color); 6793 if (err) 6794 return err; 6795 bcn->he_bss_color_valid = true; 6796 } 6797 6798 if (attrs[NL80211_ATTR_MBSSID_ELEMS]) { 6799 struct cfg80211_mbssid_elems *mbssid = 6800 nl80211_parse_mbssid_elems(&rdev->wiphy, 6801 attrs[NL80211_ATTR_MBSSID_ELEMS], 6802 extack); 6803 6804 if (IS_ERR(mbssid)) 6805 return PTR_ERR(mbssid); 6806 6807 bcn->mbssid_ies = mbssid; 6808 6809 if (bcn->mbssid_ies && attrs[NL80211_ATTR_EMA_RNR_ELEMS]) { 6810 struct cfg80211_rnr_elems *rnr = 6811 nl80211_parse_rnr_elems(&rdev->wiphy, 6812 attrs[NL80211_ATTR_EMA_RNR_ELEMS], 6813 extack); 6814 6815 if (IS_ERR(rnr)) 6816 return PTR_ERR(rnr); 6817 6818 if (rnr && rnr->cnt < bcn->mbssid_ies->cnt) { 6819 kfree(rnr); 6820 return -EINVAL; 6821 } 6822 6823 bcn->rnr_ies = rnr; 6824 } 6825 } 6826 6827 err = nl80211_calculate_ap_operation(attrs, bcn, extack); 6828 if (err) 6829 return err; 6830 6831 if (bcn->he_oper && (chan->flags & IEEE80211_CHAN_NO_HE)) 6832 return -EOPNOTSUPP; 6833 6834 if (bcn->eht_oper && (chan->flags & IEEE80211_CHAN_NO_EHT)) 6835 return -EOPNOTSUPP; 6836 6837 if (bcn->uhr_oper && (chan->flags & IEEE80211_CHAN_NO_UHR)) 6838 return -EOPNOTSUPP; 6839 6840 return 0; 6841 } 6842 6843 static int nl80211_parse_he_obss_pd(struct nlattr *attrs, 6844 struct ieee80211_he_obss_pd *he_obss_pd) 6845 { 6846 struct nlattr *tb[NL80211_HE_OBSS_PD_ATTR_MAX + 1]; 6847 int err; 6848 6849 err = nla_parse_nested(tb, NL80211_HE_OBSS_PD_ATTR_MAX, attrs, 6850 he_obss_pd_policy, NULL); 6851 if (err) 6852 return err; 6853 6854 if (!tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]) 6855 return -EINVAL; 6856 6857 he_obss_pd->sr_ctrl = nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]); 6858 6859 if (tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET]) 6860 he_obss_pd->min_offset = 6861 nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET]); 6862 if (tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]) 6863 he_obss_pd->max_offset = 6864 nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]); 6865 if (tb[NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET]) 6866 he_obss_pd->non_srg_max_offset = 6867 nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET]); 6868 6869 if (he_obss_pd->min_offset > he_obss_pd->max_offset) 6870 return -EINVAL; 6871 6872 if (tb[NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP]) 6873 memcpy(he_obss_pd->bss_color_bitmap, 6874 nla_data(tb[NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP]), 6875 sizeof(he_obss_pd->bss_color_bitmap)); 6876 6877 if (tb[NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP]) 6878 memcpy(he_obss_pd->partial_bssid_bitmap, 6879 nla_data(tb[NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP]), 6880 sizeof(he_obss_pd->partial_bssid_bitmap)); 6881 6882 he_obss_pd->enable = true; 6883 6884 return 0; 6885 } 6886 6887 static int nl80211_parse_fils_discovery(struct cfg80211_registered_device *rdev, 6888 struct nlattr *attrs, 6889 struct cfg80211_fils_discovery *fd) 6890 { 6891 struct nlattr *tb[NL80211_FILS_DISCOVERY_ATTR_MAX + 1]; 6892 int ret; 6893 6894 if (!wiphy_ext_feature_isset(&rdev->wiphy, 6895 NL80211_EXT_FEATURE_FILS_DISCOVERY)) 6896 return -EINVAL; 6897 6898 ret = nla_parse_nested(tb, NL80211_FILS_DISCOVERY_ATTR_MAX, attrs, 6899 NULL, NULL); 6900 if (ret) 6901 return ret; 6902 6903 if (!tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN] && 6904 !tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX] && 6905 !tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]) { 6906 fd->update = true; 6907 return 0; 6908 } 6909 6910 if (!tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN] || 6911 !tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX] || 6912 !tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]) 6913 return -EINVAL; 6914 6915 fd->tmpl_len = nla_len(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); 6916 fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); 6917 fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]); 6918 fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]); 6919 fd->update = true; 6920 return 0; 6921 } 6922 6923 static int 6924 nl80211_parse_unsol_bcast_probe_resp(struct cfg80211_registered_device *rdev, 6925 struct nlattr *attrs, 6926 struct cfg80211_unsol_bcast_probe_resp *presp) 6927 { 6928 struct nlattr *tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX + 1]; 6929 int ret; 6930 6931 if (!wiphy_ext_feature_isset(&rdev->wiphy, 6932 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP)) 6933 return -EINVAL; 6934 6935 ret = nla_parse_nested(tb, NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX, 6936 attrs, NULL, NULL); 6937 if (ret) 6938 return ret; 6939 6940 if (!tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] && 6941 !tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]) { 6942 presp->update = true; 6943 return 0; 6944 } 6945 6946 if (!tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] || 6947 !tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]) 6948 return -EINVAL; 6949 6950 presp->tmpl = nla_data(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); 6951 presp->tmpl_len = nla_len(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); 6952 presp->interval = nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT]); 6953 presp->update = true; 6954 return 0; 6955 } 6956 6957 /* 6958 * Since the nl80211 API didn't include, from the beginning, attributes about 6959 * HT/VHT/... capabilities, we parse them out of the elements and check for 6960 * validity for use by drivers/mac80211. 6961 */ 6962 static int nl80211_calculate_ap_capabilities(struct genl_info *info, 6963 struct cfg80211_ap_settings *params) 6964 { 6965 size_t ies_len = params->beacon.tail_len; 6966 const u8 *ies = params->beacon.tail; 6967 const struct element *cap; 6968 6969 cap = cfg80211_find_elem(WLAN_EID_HT_CAPABILITY, ies, ies_len); 6970 if (cap) { 6971 if (cap->datalen < sizeof(*params->ht_cap)) { 6972 GENL_SET_ERR_MSG(info, "bad HT capability in beacon"); 6973 return -EINVAL; 6974 } 6975 params->ht_cap = (void *)cap->data; 6976 } 6977 6978 cap = cfg80211_find_elem(WLAN_EID_VHT_CAPABILITY, ies, ies_len); 6979 if (cap) { 6980 if (cap->datalen < sizeof(*params->vht_cap)) { 6981 GENL_SET_ERR_MSG(info, "bad VHT capability in beacon"); 6982 return -EINVAL; 6983 } 6984 params->vht_cap = (void *)cap->data; 6985 } 6986 6987 cap = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_CAPABILITY, ies, ies_len); 6988 if (cap) { 6989 if (cap->datalen < sizeof(*params->he_cap) + 1) { 6990 GENL_SET_ERR_MSG(info, "bad HE capability in beacon"); 6991 return -EINVAL; 6992 } 6993 params->he_cap = (void *)(cap->data + 1); 6994 } 6995 6996 cap = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_CAPABILITY, ies, ies_len); 6997 if (cap) { 6998 params->eht_cap = (void *)(cap->data + 1); 6999 if (!ieee80211_eht_capa_size_ok((const u8 *)params->he_cap, 7000 (const u8 *)params->eht_cap, 7001 cap->datalen - 1, true)) { 7002 GENL_SET_ERR_MSG(info, "bad EHT capability in beacon"); 7003 return -EINVAL; 7004 } 7005 } 7006 7007 if (!!params->he_cap != !!params->beacon.he_oper) 7008 return -EINVAL; 7009 7010 if (!!params->eht_cap != !!params->beacon.eht_oper) 7011 return -EINVAL; 7012 7013 return 0; 7014 } 7015 7016 static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev, 7017 struct cfg80211_ap_settings *params) 7018 { 7019 struct wireless_dev *wdev; 7020 7021 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 7022 if (wdev->iftype != NL80211_IFTYPE_AP && 7023 wdev->iftype != NL80211_IFTYPE_P2P_GO) 7024 continue; 7025 7026 if (!wdev->u.ap.preset_chandef.chan) 7027 continue; 7028 7029 params->chandef = wdev->u.ap.preset_chandef; 7030 return true; 7031 } 7032 7033 return false; 7034 } 7035 7036 static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev, 7037 enum nl80211_auth_type auth_type, 7038 enum nl80211_commands cmd) 7039 { 7040 if (auth_type > NL80211_AUTHTYPE_MAX) 7041 return false; 7042 7043 switch (cmd) { 7044 case NL80211_CMD_AUTHENTICATE: 7045 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && 7046 auth_type == NL80211_AUTHTYPE_SAE) 7047 return false; 7048 if (!wiphy_ext_feature_isset(&rdev->wiphy, 7049 NL80211_EXT_FEATURE_FILS_STA) && 7050 (auth_type == NL80211_AUTHTYPE_FILS_SK || 7051 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 7052 auth_type == NL80211_AUTHTYPE_FILS_PK)) 7053 return false; 7054 if (!wiphy_ext_feature_isset(&rdev->wiphy, 7055 NL80211_EXT_FEATURE_EPPKE) && 7056 auth_type == NL80211_AUTHTYPE_EPPKE) 7057 return false; 7058 if (!wiphy_ext_feature_isset(&rdev->wiphy, 7059 NL80211_EXT_FEATURE_IEEE8021X_AUTH) && 7060 auth_type == NL80211_AUTHTYPE_IEEE8021X) 7061 return false; 7062 return true; 7063 case NL80211_CMD_CONNECT: 7064 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && 7065 !wiphy_ext_feature_isset(&rdev->wiphy, 7066 NL80211_EXT_FEATURE_SAE_OFFLOAD) && 7067 auth_type == NL80211_AUTHTYPE_SAE) 7068 return false; 7069 7070 /* FILS with SK PFS or PK not supported yet */ 7071 if (auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 7072 auth_type == NL80211_AUTHTYPE_FILS_PK) 7073 return false; 7074 if (!wiphy_ext_feature_isset( 7075 &rdev->wiphy, 7076 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) && 7077 auth_type == NL80211_AUTHTYPE_FILS_SK) 7078 return false; 7079 if (!wiphy_ext_feature_isset(&rdev->wiphy, 7080 NL80211_EXT_FEATURE_EPPKE) && 7081 auth_type == NL80211_AUTHTYPE_EPPKE) 7082 return false; 7083 if (!wiphy_ext_feature_isset(&rdev->wiphy, 7084 NL80211_EXT_FEATURE_IEEE8021X_AUTH) && 7085 auth_type == NL80211_AUTHTYPE_IEEE8021X) 7086 return false; 7087 return true; 7088 case NL80211_CMD_START_AP: 7089 if (!wiphy_ext_feature_isset(&rdev->wiphy, 7090 NL80211_EXT_FEATURE_SAE_OFFLOAD_AP) && 7091 auth_type == NL80211_AUTHTYPE_SAE) 7092 return false; 7093 /* FILS not supported yet */ 7094 if (auth_type == NL80211_AUTHTYPE_FILS_SK || 7095 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 7096 auth_type == NL80211_AUTHTYPE_FILS_PK) 7097 return false; 7098 return true; 7099 default: 7100 return false; 7101 } 7102 } 7103 7104 static void nl80211_send_ap_started(struct wireless_dev *wdev, 7105 unsigned int link_id) 7106 { 7107 struct wiphy *wiphy = wdev->wiphy; 7108 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 7109 struct sk_buff *msg; 7110 void *hdr; 7111 7112 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 7113 if (!msg) 7114 return; 7115 7116 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_START_AP); 7117 if (!hdr) 7118 goto out; 7119 7120 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 7121 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || 7122 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 7123 NL80211_ATTR_PAD) || 7124 (wdev->u.ap.ssid_len && 7125 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len, 7126 wdev->u.ap.ssid)) || 7127 (wdev->valid_links && 7128 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))) 7129 goto out; 7130 7131 genlmsg_end(msg, hdr); 7132 7133 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0, 7134 NL80211_MCGRP_MLME, GFP_KERNEL); 7135 return; 7136 out: 7137 nlmsg_free(msg); 7138 } 7139 7140 static int 7141 nl80211_parse_s1g_short_beacon(struct cfg80211_registered_device *rdev, 7142 struct nlattr *attrs, 7143 struct cfg80211_s1g_short_beacon *sb) 7144 { 7145 struct nlattr *tb[NL80211_S1G_SHORT_BEACON_ATTR_MAX + 1]; 7146 int ret; 7147 7148 if (!rdev->wiphy.bands[NL80211_BAND_S1GHZ]) 7149 return -EINVAL; 7150 7151 ret = nla_parse_nested(tb, NL80211_S1G_SHORT_BEACON_ATTR_MAX, attrs, 7152 NULL, NULL); 7153 if (ret) 7154 return ret; 7155 7156 /* Short beacon tail is optional (i.e might only include the TIM) */ 7157 if (!tb[NL80211_S1G_SHORT_BEACON_ATTR_HEAD]) 7158 return -EINVAL; 7159 7160 sb->short_head = nla_data(tb[NL80211_S1G_SHORT_BEACON_ATTR_HEAD]); 7161 sb->short_head_len = nla_len(tb[NL80211_S1G_SHORT_BEACON_ATTR_HEAD]); 7162 sb->short_tail_len = 0; 7163 7164 if (tb[NL80211_S1G_SHORT_BEACON_ATTR_TAIL]) { 7165 sb->short_tail = 7166 nla_data(tb[NL80211_S1G_SHORT_BEACON_ATTR_TAIL]); 7167 sb->short_tail_len = 7168 nla_len(tb[NL80211_S1G_SHORT_BEACON_ATTR_TAIL]); 7169 } 7170 7171 sb->update = true; 7172 return 0; 7173 } 7174 7175 static int nl80211_check_npca(struct cfg80211_registered_device *rdev, 7176 const struct cfg80211_chan_def *chandef, 7177 enum nl80211_iftype iftype, 7178 struct netlink_ext_ack *extack) 7179 { 7180 const struct ieee80211_supported_band *sband; 7181 const struct ieee80211_sta_uhr_cap *uhr_cap; 7182 7183 if (!chandef->npca_chan) 7184 return 0; 7185 7186 sband = rdev->wiphy.bands[chandef->chan->band]; 7187 uhr_cap = ieee80211_get_uhr_iftype_cap(sband, iftype); 7188 7189 if (uhr_cap && 7190 (uhr_cap->mac.mac_cap[0] & IEEE80211_UHR_MAC_CAP0_NPCA_SUPP)) 7191 return 0; 7192 7193 NL_SET_ERR_MSG(extack, "NPCA not supported"); 7194 return -EINVAL; 7195 } 7196 7197 static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) 7198 { 7199 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7200 struct cfg80211_beaconing_check_config beacon_check = {}; 7201 unsigned int link_id = nl80211_link_id(info->attrs); 7202 struct net_device *dev = info->user_ptr[1]; 7203 struct wireless_dev *wdev = dev->ieee80211_ptr; 7204 struct cfg80211_ap_settings *params; 7205 int err; 7206 7207 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 7208 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 7209 return -EOPNOTSUPP; 7210 7211 if (!rdev->ops->start_ap) 7212 return -EOPNOTSUPP; 7213 7214 if (wdev->links[link_id].cac_started) 7215 return -EBUSY; 7216 7217 if (wdev->links[link_id].ap.beacon_interval) 7218 return -EALREADY; 7219 7220 /* these are required for START_AP */ 7221 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] || 7222 !info->attrs[NL80211_ATTR_DTIM_PERIOD] || 7223 !info->attrs[NL80211_ATTR_BEACON_HEAD]) 7224 return -EINVAL; 7225 7226 if (info->attrs[NL80211_ATTR_SMPS_MODE] && 7227 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]) != NL80211_SMPS_OFF) 7228 return -EOPNOTSUPP; 7229 7230 params = kzalloc_obj(*params); 7231 if (!params) 7232 return -ENOMEM; 7233 7234 params->beacon_interval = 7235 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 7236 params->dtim_period = 7237 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 7238 7239 err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype, 7240 params->beacon_interval); 7241 if (err) 7242 goto out; 7243 7244 /* 7245 * In theory, some of these attributes should be required here 7246 * but since they were not used when the command was originally 7247 * added, keep them optional for old user space programs to let 7248 * them continue to work with drivers that do not need the 7249 * additional information -- drivers must check! 7250 */ 7251 if (info->attrs[NL80211_ATTR_SSID]) { 7252 params->ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 7253 params->ssid_len = 7254 nla_len(info->attrs[NL80211_ATTR_SSID]); 7255 if (params->ssid_len == 0) { 7256 err = -EINVAL; 7257 goto out; 7258 } 7259 7260 if (wdev->u.ap.ssid_len && 7261 (wdev->u.ap.ssid_len != params->ssid_len || 7262 memcmp(wdev->u.ap.ssid, params->ssid, params->ssid_len))) { 7263 /* require identical SSID for MLO */ 7264 err = -EINVAL; 7265 goto out; 7266 } 7267 } else if (wdev->valid_links) { 7268 /* require SSID for MLO */ 7269 err = -EINVAL; 7270 goto out; 7271 } 7272 7273 if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) 7274 params->hidden_ssid = nla_get_u32( 7275 info->attrs[NL80211_ATTR_HIDDEN_SSID]); 7276 7277 params->privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 7278 7279 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 7280 params->auth_type = nla_get_u32( 7281 info->attrs[NL80211_ATTR_AUTH_TYPE]); 7282 if (!nl80211_valid_auth_type(rdev, params->auth_type, 7283 NL80211_CMD_START_AP)) { 7284 err = -EINVAL; 7285 goto out; 7286 } 7287 } else 7288 params->auth_type = NL80211_AUTHTYPE_AUTOMATIC; 7289 7290 err = nl80211_crypto_settings(rdev, info, ¶ms->crypto, 7291 NL80211_MAX_NR_CIPHER_SUITES); 7292 if (err) 7293 goto out; 7294 7295 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) { 7296 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) { 7297 err = -EOPNOTSUPP; 7298 goto out; 7299 } 7300 params->inactivity_timeout = nla_get_u16( 7301 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]); 7302 } 7303 7304 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 7305 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 7306 err = -EINVAL; 7307 goto out; 7308 } 7309 params->p2p_ctwindow = 7310 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 7311 if (params->p2p_ctwindow != 0 && 7312 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) { 7313 err = -EINVAL; 7314 goto out; 7315 } 7316 } 7317 7318 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 7319 u8 tmp; 7320 7321 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 7322 err = -EINVAL; 7323 goto out; 7324 } 7325 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 7326 params->p2p_opp_ps = tmp; 7327 if (params->p2p_opp_ps != 0 && 7328 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) { 7329 err = -EINVAL; 7330 goto out; 7331 } 7332 } 7333 7334 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 7335 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 7336 ¶ms->chandef, true); 7337 if (err) 7338 goto out; 7339 } else if (wdev->valid_links) { 7340 /* with MLD need to specify the channel configuration */ 7341 err = -EINVAL; 7342 goto out; 7343 } else if (wdev->u.ap.preset_chandef.chan) { 7344 params->chandef = wdev->u.ap.preset_chandef; 7345 } else if (!nl80211_get_ap_channel(rdev, params)) { 7346 err = -EINVAL; 7347 goto out; 7348 } 7349 7350 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms->beacon, 7351 params->chandef.chan, info->extack); 7352 if (err) 7353 goto out; 7354 7355 err = nl80211_check_npca(rdev, ¶ms->chandef, wdev->iftype, 7356 info->extack); 7357 if (err) 7358 goto out; 7359 7360 beacon_check.iftype = wdev->iftype; 7361 beacon_check.relax = true; 7362 beacon_check.reg_power = 7363 cfg80211_get_6ghz_power_type(params->beacon.tail, 7364 params->beacon.tail_len, 0); 7365 if (!cfg80211_reg_check_beaconing(&rdev->wiphy, ¶ms->chandef, 7366 &beacon_check)) { 7367 err = -EINVAL; 7368 goto out; 7369 } 7370 7371 if (info->attrs[NL80211_ATTR_TX_RATES]) { 7372 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, 7373 NL80211_ATTR_TX_RATES, 7374 ¶ms->beacon_rate, 7375 dev, false, link_id); 7376 if (err) 7377 goto out; 7378 7379 err = validate_beacon_tx_rate(rdev, params->chandef.chan->band, 7380 ¶ms->beacon_rate); 7381 if (err) 7382 goto out; 7383 } 7384 7385 params->pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); 7386 if (params->pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { 7387 err = -EOPNOTSUPP; 7388 goto out; 7389 } 7390 7391 if (info->attrs[NL80211_ATTR_ACL_POLICY]) { 7392 params->acl = parse_acl_data(&rdev->wiphy, info); 7393 if (IS_ERR(params->acl)) { 7394 err = PTR_ERR(params->acl); 7395 params->acl = NULL; 7396 goto out; 7397 } 7398 } 7399 7400 params->twt_responder = 7401 nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]); 7402 7403 if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) { 7404 err = nl80211_parse_he_obss_pd( 7405 info->attrs[NL80211_ATTR_HE_OBSS_PD], 7406 ¶ms->he_obss_pd); 7407 if (err) 7408 goto out; 7409 } 7410 7411 if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) { 7412 err = nl80211_parse_fils_discovery(rdev, 7413 info->attrs[NL80211_ATTR_FILS_DISCOVERY], 7414 ¶ms->fils_discovery); 7415 if (err) 7416 goto out; 7417 } 7418 7419 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { 7420 err = nl80211_parse_unsol_bcast_probe_resp( 7421 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], 7422 ¶ms->unsol_bcast_probe_resp); 7423 if (err) 7424 goto out; 7425 } 7426 7427 if (info->attrs[NL80211_ATTR_MBSSID_CONFIG]) { 7428 err = nl80211_parse_mbssid_config(&rdev->wiphy, dev, link_id, 7429 info->attrs[NL80211_ATTR_MBSSID_CONFIG], 7430 ¶ms->mbssid_config, 7431 params->beacon.mbssid_ies ? 7432 params->beacon.mbssid_ies->cnt : 7433 0); 7434 if (err) 7435 goto out; 7436 } 7437 7438 if (!params->mbssid_config.ema && params->beacon.rnr_ies) { 7439 err = -EINVAL; 7440 goto out; 7441 } 7442 7443 if (info->attrs[NL80211_ATTR_S1G_SHORT_BEACON]) { 7444 if (!info->attrs[NL80211_ATTR_S1G_LONG_BEACON_PERIOD]) { 7445 err = -EINVAL; 7446 goto out; 7447 } 7448 7449 params->s1g_long_beacon_period = nla_get_u8( 7450 info->attrs[NL80211_ATTR_S1G_LONG_BEACON_PERIOD]); 7451 7452 err = nl80211_parse_s1g_short_beacon( 7453 rdev, info->attrs[NL80211_ATTR_S1G_SHORT_BEACON], 7454 ¶ms->s1g_short_beacon); 7455 if (err) 7456 goto out; 7457 } 7458 7459 err = nl80211_calculate_ap_capabilities(info, params); 7460 if (err) 7461 goto out; 7462 7463 if (info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]) 7464 params->flags = nla_get_u32( 7465 info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]); 7466 else if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT]) 7467 params->flags |= NL80211_AP_SETTINGS_EXTERNAL_AUTH_SUPPORT; 7468 7469 if (wdev->conn_owner_nlportid && 7470 info->attrs[NL80211_ATTR_SOCKET_OWNER] && 7471 wdev->conn_owner_nlportid != info->snd_portid) { 7472 err = -EINVAL; 7473 goto out; 7474 } 7475 7476 /* FIXME: validate MLO/link-id against driver capabilities */ 7477 7478 err = rdev_start_ap(rdev, dev, params); 7479 if (!err) { 7480 wdev->links[link_id].ap.beacon_interval = params->beacon_interval; 7481 wdev->links[link_id].ap.chandef = params->chandef; 7482 wdev->u.ap.ssid_len = params->ssid_len; 7483 memcpy(wdev->u.ap.ssid, params->ssid, 7484 params->ssid_len); 7485 7486 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 7487 wdev->conn_owner_nlportid = info->snd_portid; 7488 7489 nl80211_send_ap_started(wdev, link_id); 7490 } 7491 out: 7492 kfree(params->acl); 7493 kfree(params->beacon.mbssid_ies); 7494 if (params->mbssid_config.tx_wdev && 7495 params->mbssid_config.tx_wdev->netdev && 7496 params->mbssid_config.tx_wdev->netdev != dev) 7497 dev_put(params->mbssid_config.tx_wdev->netdev); 7498 kfree(params->beacon.rnr_ies); 7499 kfree(params); 7500 7501 return err; 7502 } 7503 7504 static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info) 7505 { 7506 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7507 struct cfg80211_beaconing_check_config beacon_check = {}; 7508 unsigned int link_id = nl80211_link_id(info->attrs); 7509 struct net_device *dev = info->user_ptr[1]; 7510 struct wireless_dev *wdev = dev->ieee80211_ptr; 7511 struct cfg80211_ap_update *params; 7512 struct nlattr *attr; 7513 int err; 7514 7515 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 7516 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 7517 return -EOPNOTSUPP; 7518 7519 if (!rdev->ops->change_beacon) 7520 return -EOPNOTSUPP; 7521 7522 if (!wdev->links[link_id].ap.beacon_interval) 7523 return -EINVAL; 7524 7525 params = kzalloc_obj(*params); 7526 if (!params) 7527 return -ENOMEM; 7528 7529 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms->beacon, 7530 wdev->links[link_id].ap.chandef.chan, 7531 info->extack); 7532 if (err) 7533 goto out; 7534 7535 /* recheck beaconing is permitted with possibly changed power type */ 7536 beacon_check.iftype = wdev->iftype; 7537 beacon_check.relax = true; 7538 beacon_check.reg_power = 7539 cfg80211_get_6ghz_power_type(params->beacon.tail, 7540 params->beacon.tail_len, 0); 7541 if (!cfg80211_reg_check_beaconing(&rdev->wiphy, 7542 &wdev->links[link_id].ap.chandef, 7543 &beacon_check)) { 7544 err = -EINVAL; 7545 goto out; 7546 } 7547 7548 attr = info->attrs[NL80211_ATTR_FILS_DISCOVERY]; 7549 if (attr) { 7550 err = nl80211_parse_fils_discovery(rdev, attr, 7551 ¶ms->fils_discovery); 7552 if (err) 7553 goto out; 7554 } 7555 7556 attr = info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]; 7557 if (attr) { 7558 err = nl80211_parse_unsol_bcast_probe_resp(rdev, attr, 7559 ¶ms->unsol_bcast_probe_resp); 7560 if (err) 7561 goto out; 7562 } 7563 7564 attr = info->attrs[NL80211_ATTR_S1G_SHORT_BEACON]; 7565 if (attr) { 7566 err = nl80211_parse_s1g_short_beacon(rdev, attr, 7567 ¶ms->s1g_short_beacon); 7568 if (err) 7569 goto out; 7570 } 7571 7572 err = rdev_change_beacon(rdev, dev, params); 7573 7574 out: 7575 kfree(params->beacon.mbssid_ies); 7576 kfree(params->beacon.rnr_ies); 7577 kfree(params); 7578 return err; 7579 } 7580 7581 static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info) 7582 { 7583 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7584 unsigned int link_id = nl80211_link_id(info->attrs); 7585 struct net_device *dev = info->user_ptr[1]; 7586 7587 return cfg80211_stop_ap(rdev, dev, link_id, false); 7588 } 7589 7590 static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = { 7591 [NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG }, 7592 [NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG }, 7593 [NL80211_STA_FLAG_WME] = { .type = NLA_FLAG }, 7594 [NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG }, 7595 [NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG }, 7596 [NL80211_STA_FLAG_TDLS_PEER] = { .type = NLA_FLAG }, 7597 }; 7598 7599 static int parse_station_flags(struct genl_info *info, 7600 enum nl80211_iftype iftype, 7601 struct station_parameters *params) 7602 { 7603 struct nlattr *flags[NL80211_STA_FLAG_MAX + 1]; 7604 struct nlattr *nla; 7605 int flag; 7606 7607 /* 7608 * Try parsing the new attribute first so userspace 7609 * can specify both for older kernels. 7610 */ 7611 nla = info->attrs[NL80211_ATTR_STA_FLAGS2]; 7612 if (nla) { 7613 struct nl80211_sta_flag_update *sta_flags; 7614 7615 sta_flags = nla_data(nla); 7616 params->sta_flags_mask = sta_flags->mask; 7617 params->sta_flags_set = sta_flags->set; 7618 params->sta_flags_set &= params->sta_flags_mask; 7619 if ((params->sta_flags_mask | 7620 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID)) 7621 return -EINVAL; 7622 7623 if ((iftype == NL80211_IFTYPE_NAN || 7624 iftype == NL80211_IFTYPE_NAN_DATA) && 7625 params->sta_flags_mask & 7626 ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) | 7627 BIT(NL80211_STA_FLAG_ASSOCIATED) | 7628 BIT(NL80211_STA_FLAG_AUTHORIZED) | 7629 BIT(NL80211_STA_FLAG_MFP))) 7630 return -EINVAL; 7631 7632 /* WME is always used in NAN */ 7633 if (iftype == NL80211_IFTYPE_NAN_DATA) { 7634 /* but don't let userspace control it */ 7635 if (params->sta_flags_mask & BIT(NL80211_STA_FLAG_WME)) 7636 return -EINVAL; 7637 7638 params->sta_flags_mask |= BIT(NL80211_STA_FLAG_WME); 7639 params->sta_flags_set |= BIT(NL80211_STA_FLAG_WME); 7640 } 7641 7642 return 0; 7643 } 7644 7645 /* if present, parse the old attribute */ 7646 7647 nla = info->attrs[NL80211_ATTR_STA_FLAGS]; 7648 if (!nla) 7649 return 0; 7650 7651 if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack)) 7652 return -EINVAL; 7653 7654 /* 7655 * Only allow certain flags for interface types so that 7656 * other attributes are silently ignored. Remember that 7657 * this is backward compatibility code with old userspace 7658 * and shouldn't be hit in other cases anyway. 7659 */ 7660 switch (iftype) { 7661 case NL80211_IFTYPE_AP: 7662 case NL80211_IFTYPE_AP_VLAN: 7663 case NL80211_IFTYPE_P2P_GO: 7664 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 7665 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 7666 BIT(NL80211_STA_FLAG_WME) | 7667 BIT(NL80211_STA_FLAG_MFP); 7668 break; 7669 case NL80211_IFTYPE_P2P_CLIENT: 7670 case NL80211_IFTYPE_STATION: 7671 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 7672 BIT(NL80211_STA_FLAG_TDLS_PEER); 7673 break; 7674 case NL80211_IFTYPE_MESH_POINT: 7675 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | 7676 BIT(NL80211_STA_FLAG_MFP) | 7677 BIT(NL80211_STA_FLAG_AUTHORIZED); 7678 break; 7679 default: 7680 return -EINVAL; 7681 } 7682 7683 for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++) { 7684 if (flags[flag]) { 7685 params->sta_flags_set |= (1<<flag); 7686 7687 /* no longer support new API additions in old API */ 7688 if (flag > NL80211_STA_FLAG_MAX_OLD_API) 7689 return -EINVAL; 7690 } 7691 } 7692 7693 return 0; 7694 } 7695 7696 bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info, int attr) 7697 { 7698 struct nlattr *rate; 7699 u32 bitrate; 7700 u16 bitrate_compat; 7701 enum nl80211_rate_info rate_flg; 7702 7703 rate = nla_nest_start_noflag(msg, attr); 7704 if (!rate) 7705 return false; 7706 7707 /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */ 7708 bitrate = cfg80211_calculate_bitrate(info); 7709 /* report 16-bit bitrate only if we can */ 7710 bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0; 7711 if (bitrate > 0 && 7712 nla_put_u32(msg, NL80211_RATE_INFO_BITRATE32, bitrate)) 7713 return false; 7714 if (bitrate_compat > 0 && 7715 nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat)) 7716 return false; 7717 7718 switch (info->bw) { 7719 case RATE_INFO_BW_1: 7720 rate_flg = NL80211_RATE_INFO_1_MHZ_WIDTH; 7721 break; 7722 case RATE_INFO_BW_2: 7723 rate_flg = NL80211_RATE_INFO_2_MHZ_WIDTH; 7724 break; 7725 case RATE_INFO_BW_4: 7726 rate_flg = NL80211_RATE_INFO_4_MHZ_WIDTH; 7727 break; 7728 case RATE_INFO_BW_5: 7729 rate_flg = NL80211_RATE_INFO_5_MHZ_WIDTH; 7730 break; 7731 case RATE_INFO_BW_8: 7732 rate_flg = NL80211_RATE_INFO_8_MHZ_WIDTH; 7733 break; 7734 case RATE_INFO_BW_10: 7735 rate_flg = NL80211_RATE_INFO_10_MHZ_WIDTH; 7736 break; 7737 case RATE_INFO_BW_16: 7738 rate_flg = NL80211_RATE_INFO_16_MHZ_WIDTH; 7739 break; 7740 default: 7741 WARN_ON(1); 7742 fallthrough; 7743 case RATE_INFO_BW_20: 7744 rate_flg = 0; 7745 break; 7746 case RATE_INFO_BW_40: 7747 rate_flg = NL80211_RATE_INFO_40_MHZ_WIDTH; 7748 break; 7749 case RATE_INFO_BW_80: 7750 rate_flg = NL80211_RATE_INFO_80_MHZ_WIDTH; 7751 break; 7752 case RATE_INFO_BW_160: 7753 rate_flg = NL80211_RATE_INFO_160_MHZ_WIDTH; 7754 break; 7755 case RATE_INFO_BW_HE_RU: 7756 rate_flg = 0; 7757 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS)); 7758 break; 7759 case RATE_INFO_BW_320: 7760 rate_flg = NL80211_RATE_INFO_320_MHZ_WIDTH; 7761 break; 7762 case RATE_INFO_BW_EHT_RU: 7763 rate_flg = 0; 7764 WARN_ON(!(info->flags & RATE_INFO_FLAGS_EHT_MCS) && 7765 !(info->flags & RATE_INFO_FLAGS_UHR_MCS)); 7766 break; 7767 } 7768 7769 if (rate_flg && nla_put_flag(msg, rate_flg)) 7770 return false; 7771 7772 if (info->flags & RATE_INFO_FLAGS_MCS) { 7773 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) 7774 return false; 7775 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 7776 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 7777 return false; 7778 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) { 7779 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs)) 7780 return false; 7781 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) 7782 return false; 7783 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 7784 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 7785 return false; 7786 } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) { 7787 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs)) 7788 return false; 7789 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss)) 7790 return false; 7791 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi)) 7792 return false; 7793 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm)) 7794 return false; 7795 if (info->bw == RATE_INFO_BW_HE_RU && 7796 nla_put_u8(msg, NL80211_RATE_INFO_HE_RU_ALLOC, 7797 info->he_ru_alloc)) 7798 return false; 7799 } else if (info->flags & RATE_INFO_FLAGS_S1G_MCS) { 7800 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_MCS, info->mcs)) 7801 return false; 7802 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_NSS, info->nss)) 7803 return false; 7804 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 7805 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 7806 return false; 7807 } else if (info->flags & RATE_INFO_FLAGS_EHT_MCS) { 7808 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_MCS, info->mcs)) 7809 return false; 7810 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_NSS, info->nss)) 7811 return false; 7812 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_GI, info->eht_gi)) 7813 return false; 7814 if (info->bw == RATE_INFO_BW_EHT_RU && 7815 nla_put_u8(msg, NL80211_RATE_INFO_EHT_RU_ALLOC, 7816 info->eht_ru_alloc)) 7817 return false; 7818 } else if (info->flags & RATE_INFO_FLAGS_UHR_MCS) { 7819 if (nla_put_u8(msg, NL80211_RATE_INFO_UHR_MCS, info->mcs)) 7820 return false; 7821 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_NSS, info->nss)) 7822 return false; 7823 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_GI, info->eht_gi)) 7824 return false; 7825 if (info->bw == RATE_INFO_BW_EHT_RU && 7826 nla_put_u8(msg, NL80211_RATE_INFO_EHT_RU_ALLOC, 7827 info->eht_ru_alloc)) 7828 return false; 7829 if (info->flags & RATE_INFO_FLAGS_UHR_ELR_MCS && 7830 nla_put_flag(msg, NL80211_RATE_INFO_UHR_ELR)) 7831 return false; 7832 if (info->flags & RATE_INFO_FLAGS_UHR_IM && 7833 nla_put_flag(msg, NL80211_RATE_INFO_UHR_IM)) 7834 return false; 7835 } 7836 7837 nla_nest_end(msg, rate); 7838 return true; 7839 } 7840 7841 static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal, 7842 int id) 7843 { 7844 void *attr; 7845 int i = 0; 7846 7847 if (!mask) 7848 return true; 7849 7850 attr = nla_nest_start_noflag(msg, id); 7851 if (!attr) 7852 return false; 7853 7854 for (i = 0; i < IEEE80211_MAX_CHAINS; i++) { 7855 if (!(mask & BIT(i))) 7856 continue; 7857 7858 if (nla_put_u8(msg, i, signal[i])) 7859 return false; 7860 } 7861 7862 nla_nest_end(msg, attr); 7863 7864 return true; 7865 } 7866 7867 static int nl80211_fill_link_station(struct sk_buff *msg, 7868 struct cfg80211_registered_device *rdev, 7869 struct link_station_info *link_sinfo) 7870 { 7871 struct nlattr *bss_param, *link_sinfoattr; 7872 7873 #define PUT_LINK_SINFO(attr, memb, type) do { \ 7874 BUILD_BUG_ON(sizeof(type) == sizeof(u64)); \ 7875 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 7876 nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr, \ 7877 link_sinfo->memb)) \ 7878 goto nla_put_failure; \ 7879 } while (0) 7880 #define PUT_LINK_SINFO_U64(attr, memb) do { \ 7881 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 7882 nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr, \ 7883 link_sinfo->memb, NL80211_STA_INFO_PAD)) \ 7884 goto nla_put_failure; \ 7885 } while (0) 7886 7887 link_sinfoattr = nla_nest_start(msg, NL80211_ATTR_STA_INFO); 7888 if (!link_sinfoattr) 7889 goto nla_put_failure; 7890 7891 PUT_LINK_SINFO(INACTIVE_TIME, inactive_time, u32); 7892 7893 if (link_sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | 7894 BIT_ULL(NL80211_STA_INFO_RX_BYTES64)) && 7895 nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES, 7896 (u32)link_sinfo->rx_bytes)) 7897 goto nla_put_failure; 7898 7899 if (link_sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | 7900 BIT_ULL(NL80211_STA_INFO_TX_BYTES64)) && 7901 nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES, 7902 (u32)link_sinfo->tx_bytes)) 7903 goto nla_put_failure; 7904 7905 PUT_LINK_SINFO_U64(RX_BYTES64, rx_bytes); 7906 PUT_LINK_SINFO_U64(TX_BYTES64, tx_bytes); 7907 PUT_LINK_SINFO_U64(RX_DURATION, rx_duration); 7908 PUT_LINK_SINFO_U64(TX_DURATION, tx_duration); 7909 7910 if (wiphy_ext_feature_isset(&rdev->wiphy, 7911 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 7912 PUT_LINK_SINFO(AIRTIME_WEIGHT, airtime_weight, u16); 7913 7914 switch (rdev->wiphy.signal_type) { 7915 case CFG80211_SIGNAL_TYPE_MBM: 7916 PUT_LINK_SINFO(SIGNAL, signal, u8); 7917 PUT_LINK_SINFO(SIGNAL_AVG, signal_avg, u8); 7918 break; 7919 default: 7920 break; 7921 } 7922 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { 7923 if (!nl80211_put_signal(msg, link_sinfo->chains, 7924 link_sinfo->chain_signal, 7925 NL80211_STA_INFO_CHAIN_SIGNAL)) 7926 goto nla_put_failure; 7927 } 7928 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { 7929 if (!nl80211_put_signal(msg, link_sinfo->chains, 7930 link_sinfo->chain_signal_avg, 7931 NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) 7932 goto nla_put_failure; 7933 } 7934 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { 7935 if (!nl80211_put_sta_rate(msg, &link_sinfo->txrate, 7936 NL80211_STA_INFO_TX_BITRATE)) 7937 goto nla_put_failure; 7938 } 7939 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { 7940 if (!nl80211_put_sta_rate(msg, &link_sinfo->rxrate, 7941 NL80211_STA_INFO_RX_BITRATE)) 7942 goto nla_put_failure; 7943 } 7944 7945 PUT_LINK_SINFO(RX_PACKETS, rx_packets, u32); 7946 PUT_LINK_SINFO(TX_PACKETS, tx_packets, u32); 7947 PUT_LINK_SINFO(TX_RETRIES, tx_retries, u32); 7948 PUT_LINK_SINFO(TX_FAILED, tx_failed, u32); 7949 PUT_LINK_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32); 7950 PUT_LINK_SINFO(BEACON_LOSS, beacon_loss_count, u32); 7951 7952 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { 7953 bss_param = nla_nest_start(msg, 7954 NL80211_STA_INFO_BSS_PARAM); 7955 if (!bss_param) 7956 goto nla_put_failure; 7957 7958 if (((link_sinfo->bss_param.flags & 7959 BSS_PARAM_FLAGS_CTS_PROT) && 7960 nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) || 7961 ((link_sinfo->bss_param.flags & 7962 BSS_PARAM_FLAGS_SHORT_PREAMBLE) && 7963 nla_put_flag(msg, 7964 NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) || 7965 ((link_sinfo->bss_param.flags & 7966 BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && 7967 nla_put_flag(msg, 7968 NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) || 7969 nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD, 7970 link_sinfo->bss_param.dtim_period) || 7971 nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL, 7972 link_sinfo->bss_param.beacon_interval)) 7973 goto nla_put_failure; 7974 7975 nla_nest_end(msg, bss_param); 7976 } 7977 7978 PUT_LINK_SINFO_U64(RX_DROP_MISC, rx_dropped_misc); 7979 PUT_LINK_SINFO_U64(BEACON_RX, rx_beacon); 7980 PUT_LINK_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8); 7981 PUT_LINK_SINFO(RX_MPDUS, rx_mpdu_count, u32); 7982 PUT_LINK_SINFO(FCS_ERROR_COUNT, fcs_err_count, u32); 7983 if (wiphy_ext_feature_isset(&rdev->wiphy, 7984 NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT)) { 7985 PUT_LINK_SINFO(ACK_SIGNAL, ack_signal, u8); 7986 PUT_LINK_SINFO(ACK_SIGNAL_AVG, avg_ack_signal, s8); 7987 } 7988 7989 #undef PUT_LINK_SINFO 7990 #undef PUT_LINK_SINFO_U64 7991 7992 if (link_sinfo->pertid) { 7993 struct nlattr *tidsattr; 7994 int tid; 7995 7996 tidsattr = nla_nest_start(msg, NL80211_STA_INFO_TID_STATS); 7997 if (!tidsattr) 7998 goto nla_put_failure; 7999 8000 for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) { 8001 struct cfg80211_tid_stats *tidstats; 8002 struct nlattr *tidattr; 8003 8004 tidstats = &link_sinfo->pertid[tid]; 8005 8006 if (!tidstats->filled) 8007 continue; 8008 8009 tidattr = nla_nest_start(msg, tid + 1); 8010 if (!tidattr) 8011 goto nla_put_failure; 8012 8013 #define PUT_TIDVAL_U64(attr, memb) do { \ 8014 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ 8015 nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr, \ 8016 tidstats->memb, NL80211_TID_STATS_PAD)) \ 8017 goto nla_put_failure; \ 8018 } while (0) 8019 8020 PUT_TIDVAL_U64(RX_MSDU, rx_msdu); 8021 PUT_TIDVAL_U64(TX_MSDU, tx_msdu); 8022 PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries); 8023 PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed); 8024 8025 #undef PUT_TIDVAL_U64 8026 if ((tidstats->filled & 8027 BIT(NL80211_TID_STATS_TXQ_STATS)) && 8028 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, 8029 NL80211_TID_STATS_TXQ_STATS)) 8030 goto nla_put_failure; 8031 8032 nla_nest_end(msg, tidattr); 8033 } 8034 8035 nla_nest_end(msg, tidsattr); 8036 } 8037 8038 nla_nest_end(msg, link_sinfoattr); 8039 return 0; 8040 8041 nla_put_failure: 8042 return -EMSGSIZE; 8043 } 8044 8045 static int nl80211_put_sta_info_common(struct sk_buff *msg, 8046 struct cfg80211_registered_device *rdev, 8047 struct station_info *sinfo) 8048 { 8049 struct nlattr *sinfoattr, *bss_param; 8050 8051 sinfoattr = nla_nest_start(msg, NL80211_ATTR_STA_INFO); 8052 if (!sinfoattr) 8053 return -EMSGSIZE; 8054 8055 #define PUT_SINFO(attr, memb, type) do { \ 8056 BUILD_BUG_ON(sizeof(type) == sizeof(u64)); \ 8057 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 8058 nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr, \ 8059 sinfo->memb)) \ 8060 goto nla_put_failure; \ 8061 } while (0) 8062 #define PUT_SINFO_U64(attr, memb) do { \ 8063 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 8064 nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr, \ 8065 sinfo->memb, NL80211_STA_INFO_PAD)) \ 8066 goto nla_put_failure; \ 8067 } while (0) 8068 8069 PUT_SINFO(CONNECTED_TIME, connected_time, u32); 8070 PUT_SINFO(INACTIVE_TIME, inactive_time, u32); 8071 PUT_SINFO_U64(ASSOC_AT_BOOTTIME, assoc_at); 8072 8073 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | 8074 BIT_ULL(NL80211_STA_INFO_RX_BYTES64)) && 8075 nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES, 8076 (u32)sinfo->rx_bytes)) 8077 goto nla_put_failure; 8078 8079 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | 8080 BIT_ULL(NL80211_STA_INFO_TX_BYTES64)) && 8081 nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES, 8082 (u32)sinfo->tx_bytes)) 8083 goto nla_put_failure; 8084 8085 PUT_SINFO_U64(RX_BYTES64, rx_bytes); 8086 PUT_SINFO_U64(TX_BYTES64, tx_bytes); 8087 PUT_SINFO_U64(RX_DURATION, rx_duration); 8088 PUT_SINFO_U64(TX_DURATION, tx_duration); 8089 8090 if (wiphy_ext_feature_isset(&rdev->wiphy, 8091 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 8092 PUT_SINFO(AIRTIME_WEIGHT, airtime_weight, u16); 8093 8094 switch (rdev->wiphy.signal_type) { 8095 case CFG80211_SIGNAL_TYPE_MBM: 8096 PUT_SINFO(SIGNAL, signal, u8); 8097 PUT_SINFO(SIGNAL_AVG, signal_avg, u8); 8098 break; 8099 default: 8100 break; 8101 } 8102 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { 8103 if (!nl80211_put_signal(msg, sinfo->chains, 8104 sinfo->chain_signal, 8105 NL80211_STA_INFO_CHAIN_SIGNAL)) 8106 goto nla_put_failure; 8107 } 8108 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { 8109 if (!nl80211_put_signal(msg, sinfo->chains, 8110 sinfo->chain_signal_avg, 8111 NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) 8112 goto nla_put_failure; 8113 } 8114 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { 8115 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, 8116 NL80211_STA_INFO_TX_BITRATE)) 8117 goto nla_put_failure; 8118 } 8119 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { 8120 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, 8121 NL80211_STA_INFO_RX_BITRATE)) 8122 goto nla_put_failure; 8123 } 8124 8125 PUT_SINFO(RX_PACKETS, rx_packets, u32); 8126 PUT_SINFO(TX_PACKETS, tx_packets, u32); 8127 PUT_SINFO(TX_RETRIES, tx_retries, u32); 8128 PUT_SINFO(TX_FAILED, tx_failed, u32); 8129 PUT_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32); 8130 PUT_SINFO(BEACON_LOSS, beacon_loss_count, u32); 8131 8132 PUT_SINFO(LLID, llid, u16); 8133 PUT_SINFO(PLID, plid, u16); 8134 PUT_SINFO(PLINK_STATE, plink_state, u8); 8135 PUT_SINFO(AIRTIME_LINK_METRIC, airtime_link_metric, u32); 8136 PUT_SINFO(LOCAL_PM, local_pm, u32); 8137 PUT_SINFO(PEER_PM, peer_pm, u32); 8138 PUT_SINFO(NONPEER_PM, nonpeer_pm, u32); 8139 PUT_SINFO(CONNECTED_TO_GATE, connected_to_gate, u8); 8140 PUT_SINFO(CONNECTED_TO_AS, connected_to_as, u8); 8141 PUT_SINFO_U64(T_OFFSET, t_offset); 8142 8143 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { 8144 bss_param = nla_nest_start(msg, NL80211_STA_INFO_BSS_PARAM); 8145 if (!bss_param) 8146 goto nla_put_failure; 8147 8148 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) && 8149 nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) || 8150 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) && 8151 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) || 8152 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && 8153 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) || 8154 nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD, 8155 sinfo->bss_param.dtim_period) || 8156 nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL, 8157 sinfo->bss_param.beacon_interval)) 8158 goto nla_put_failure; 8159 8160 nla_nest_end(msg, bss_param); 8161 } 8162 if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) && 8163 nla_put(msg, NL80211_STA_INFO_STA_FLAGS, 8164 sizeof(struct nl80211_sta_flag_update), 8165 &sinfo->sta_flags)) 8166 goto nla_put_failure; 8167 8168 PUT_SINFO_U64(RX_DROP_MISC, rx_dropped_misc); 8169 PUT_SINFO_U64(BEACON_RX, rx_beacon); 8170 PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8); 8171 PUT_SINFO(RX_MPDUS, rx_mpdu_count, u32); 8172 PUT_SINFO(FCS_ERROR_COUNT, fcs_err_count, u32); 8173 if (wiphy_ext_feature_isset(&rdev->wiphy, 8174 NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT)) { 8175 PUT_SINFO(ACK_SIGNAL, ack_signal, u8); 8176 PUT_SINFO(ACK_SIGNAL_AVG, avg_ack_signal, s8); 8177 } 8178 8179 #undef PUT_SINFO 8180 #undef PUT_SINFO_U64 8181 8182 if (sinfo->pertid) { 8183 struct nlattr *tidsattr; 8184 int tid; 8185 8186 tidsattr = nla_nest_start(msg, NL80211_STA_INFO_TID_STATS); 8187 if (!tidsattr) 8188 goto nla_put_failure; 8189 8190 for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) { 8191 struct cfg80211_tid_stats *tidstats; 8192 struct nlattr *tidattr; 8193 8194 tidstats = &sinfo->pertid[tid]; 8195 8196 if (!tidstats->filled) 8197 continue; 8198 8199 tidattr = nla_nest_start(msg, tid + 1); 8200 if (!tidattr) 8201 goto nla_put_failure; 8202 8203 #define PUT_TIDVAL_U64(attr, memb) do { \ 8204 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ 8205 nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr, \ 8206 tidstats->memb, NL80211_TID_STATS_PAD)) \ 8207 goto nla_put_failure; \ 8208 } while (0) 8209 8210 PUT_TIDVAL_U64(RX_MSDU, rx_msdu); 8211 PUT_TIDVAL_U64(TX_MSDU, tx_msdu); 8212 PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries); 8213 PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed); 8214 8215 #undef PUT_TIDVAL_U64 8216 if ((tidstats->filled & 8217 BIT(NL80211_TID_STATS_TXQ_STATS)) && 8218 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, 8219 NL80211_TID_STATS_TXQ_STATS)) 8220 goto nla_put_failure; 8221 8222 nla_nest_end(msg, tidattr); 8223 } 8224 8225 nla_nest_end(msg, tidsattr); 8226 } 8227 8228 nla_nest_end(msg, sinfoattr); 8229 return 0; 8230 8231 nla_put_failure: 8232 nla_nest_cancel(msg, sinfoattr); 8233 return -EMSGSIZE; 8234 } 8235 8236 static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid, 8237 u32 seq, int flags, 8238 struct cfg80211_registered_device *rdev, 8239 struct wireless_dev *wdev, 8240 const u8 *mac_addr, struct station_info *sinfo) 8241 { 8242 void *hdr; 8243 8244 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 8245 if (!hdr) { 8246 cfg80211_sinfo_release_content(sinfo); 8247 return -1; 8248 } 8249 8250 if ((wdev->netdev && 8251 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) || 8252 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 8253 NL80211_ATTR_PAD) || 8254 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 8255 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation)) 8256 goto nla_put_failure; 8257 8258 if (nl80211_put_sta_info_common(msg, rdev, sinfo)) 8259 goto nla_put_failure; 8260 8261 if (sinfo->assoc_req_ies_len && 8262 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, 8263 sinfo->assoc_req_ies)) 8264 goto nla_put_failure; 8265 8266 if (sinfo->assoc_resp_ies_len && 8267 nla_put(msg, NL80211_ATTR_RESP_IE, sinfo->assoc_resp_ies_len, 8268 sinfo->assoc_resp_ies)) 8269 goto nla_put_failure; 8270 8271 if (sinfo->mlo_params_valid) { 8272 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, 8273 sinfo->assoc_link_id)) 8274 goto nla_put_failure; 8275 8276 if (!is_zero_ether_addr(sinfo->mld_addr) && 8277 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, 8278 sinfo->mld_addr)) 8279 goto nla_put_failure; 8280 } 8281 8282 cfg80211_sinfo_release_content(sinfo); 8283 genlmsg_end(msg, hdr); 8284 return 0; 8285 8286 nla_put_failure: 8287 cfg80211_sinfo_release_content(sinfo); 8288 genlmsg_cancel(msg, hdr); 8289 return -EMSGSIZE; 8290 } 8291 8292 static void cfg80211_sta_set_mld_sinfo(struct station_info *sinfo) 8293 { 8294 struct link_station_info *link_sinfo; 8295 int link_id, init = 0; 8296 u32 link_inactive_time; 8297 8298 sinfo->signal = -99; 8299 8300 for_each_valid_link(sinfo, link_id) { 8301 link_sinfo = sinfo->links[link_id]; 8302 if (!link_sinfo) 8303 continue; 8304 8305 if ((link_sinfo->filled & 8306 BIT_ULL(NL80211_STA_INFO_TX_PACKETS))) { 8307 sinfo->tx_packets += link_sinfo->tx_packets; 8308 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS); 8309 } 8310 8311 if ((link_sinfo->filled & 8312 BIT_ULL(NL80211_STA_INFO_RX_PACKETS))) { 8313 sinfo->rx_packets += link_sinfo->rx_packets; 8314 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS); 8315 } 8316 8317 if (link_sinfo->filled & 8318 (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | 8319 BIT_ULL(NL80211_STA_INFO_TX_BYTES64))) { 8320 sinfo->tx_bytes += link_sinfo->tx_bytes; 8321 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES); 8322 } 8323 8324 if (link_sinfo->filled & 8325 (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | 8326 BIT_ULL(NL80211_STA_INFO_TX_BYTES64))) { 8327 sinfo->rx_bytes += link_sinfo->rx_bytes; 8328 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES); 8329 } 8330 8331 if (link_sinfo->filled & 8332 BIT_ULL(NL80211_STA_INFO_TX_RETRIES)) { 8333 sinfo->tx_retries += link_sinfo->tx_retries; 8334 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); 8335 } 8336 8337 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_FAILED)) { 8338 sinfo->tx_failed += link_sinfo->tx_failed; 8339 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); 8340 } 8341 8342 if (link_sinfo->filled & 8343 BIT_ULL(NL80211_STA_INFO_RX_DROP_MISC)) { 8344 sinfo->rx_dropped_misc += link_sinfo->rx_dropped_misc; 8345 sinfo->filled |= 8346 BIT_ULL(NL80211_STA_INFO_RX_DROP_MISC); 8347 } 8348 8349 if (link_sinfo->filled & 8350 BIT_ULL(NL80211_STA_INFO_BEACON_LOSS)) { 8351 sinfo->beacon_loss_count += 8352 link_sinfo->beacon_loss_count; 8353 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_LOSS); 8354 } 8355 8356 if (link_sinfo->filled & 8357 BIT_ULL(NL80211_STA_INFO_EXPECTED_THROUGHPUT)) { 8358 sinfo->expected_throughput += 8359 link_sinfo->expected_throughput; 8360 sinfo->filled |= 8361 BIT_ULL(NL80211_STA_INFO_EXPECTED_THROUGHPUT); 8362 } 8363 8364 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_MPDUS)) { 8365 sinfo->rx_mpdu_count += link_sinfo->rx_mpdu_count; 8366 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_MPDUS); 8367 } 8368 8369 if (link_sinfo->filled & 8370 BIT_ULL(NL80211_STA_INFO_FCS_ERROR_COUNT)) { 8371 sinfo->fcs_err_count += link_sinfo->fcs_err_count; 8372 sinfo->filled |= 8373 BIT_ULL(NL80211_STA_INFO_FCS_ERROR_COUNT); 8374 } 8375 8376 if (link_sinfo->filled & 8377 BIT_ULL(NL80211_STA_INFO_BEACON_RX)) { 8378 sinfo->rx_beacon += link_sinfo->rx_beacon; 8379 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_RX); 8380 } 8381 8382 /* Update MLO signal, signal_avg as best among links */ 8383 if ((link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_SIGNAL)) && 8384 link_sinfo->signal > sinfo->signal) { 8385 sinfo->signal = link_sinfo->signal; 8386 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); 8387 } 8388 8389 if ((link_sinfo->filled & 8390 BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG)) && 8391 link_sinfo->signal_avg > sinfo->signal_avg) { 8392 sinfo->signal_avg = link_sinfo->signal_avg; 8393 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); 8394 } 8395 8396 /* Update MLO inactive_time, bss_param based on least 8397 * value for corresponding field of link. 8398 */ 8399 if ((link_sinfo->filled & 8400 BIT_ULL(NL80211_STA_INFO_INACTIVE_TIME)) && 8401 (!init || 8402 link_inactive_time > link_sinfo->inactive_time)) { 8403 link_inactive_time = link_sinfo->inactive_time; 8404 sinfo->inactive_time = link_sinfo->inactive_time; 8405 sinfo->filled |= NL80211_STA_INFO_INACTIVE_TIME; 8406 } 8407 8408 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM) && 8409 (!init || 8410 sinfo->bss_param.dtim_period > 8411 link_sinfo->bss_param.dtim_period)) { 8412 sinfo->bss_param.dtim_period = 8413 link_sinfo->bss_param.dtim_period; 8414 sinfo->filled |= NL80211_STA_BSS_PARAM_DTIM_PERIOD; 8415 sinfo->bss_param.beacon_interval = 8416 link_sinfo->bss_param.beacon_interval; 8417 sinfo->filled |= NL80211_STA_BSS_PARAM_BEACON_INTERVAL; 8418 } 8419 8420 /* Update MLO rates as per last updated link rate */ 8421 if ((link_sinfo->filled & 8422 BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) && 8423 (!init || 8424 link_inactive_time > link_sinfo->inactive_time)) { 8425 sinfo->txrate = link_sinfo->txrate; 8426 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 8427 } 8428 if ((link_sinfo->filled & 8429 BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) && 8430 (!init || 8431 link_inactive_time > link_sinfo->inactive_time)) { 8432 sinfo->rxrate = link_sinfo->rxrate; 8433 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE); 8434 } 8435 8436 if (link_sinfo->filled & 8437 BIT_ULL(NL80211_STA_INFO_TX_DURATION) && 8438 (!init || 8439 link_inactive_time > link_sinfo->inactive_time)) { 8440 sinfo->tx_duration += link_sinfo->tx_duration; 8441 sinfo->filled |= 8442 BIT_ULL(NL80211_STA_INFO_TX_DURATION); 8443 } 8444 if (link_sinfo->filled & 8445 BIT_ULL(NL80211_STA_INFO_RX_DURATION) && 8446 (!init || 8447 link_inactive_time > link_sinfo->inactive_time)) { 8448 sinfo->rx_duration += link_sinfo->rx_duration; 8449 sinfo->filled |= 8450 BIT_ULL(NL80211_STA_INFO_RX_DURATION); 8451 } 8452 init++; 8453 8454 /* pertid stats accumulate for rx/tx fields */ 8455 if (sinfo->pertid) { 8456 sinfo->pertid->rx_msdu += 8457 link_sinfo->pertid->rx_msdu; 8458 sinfo->pertid->tx_msdu += 8459 link_sinfo->pertid->tx_msdu; 8460 sinfo->pertid->tx_msdu_retries += 8461 link_sinfo->pertid->tx_msdu_retries; 8462 sinfo->pertid->tx_msdu_failed += 8463 link_sinfo->pertid->tx_msdu_failed; 8464 8465 sinfo->pertid->filled |= 8466 BIT(NL80211_TID_STATS_RX_MSDU) | 8467 BIT(NL80211_TID_STATS_TX_MSDU) | 8468 BIT(NL80211_TID_STATS_TX_MSDU_RETRIES) | 8469 BIT(NL80211_TID_STATS_TX_MSDU_FAILED); 8470 } 8471 } 8472 8473 /* Reset sinfo->filled bits to exclude fields which don't make 8474 * much sense at the MLO level. 8475 */ 8476 sinfo->filled &= ~BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL); 8477 sinfo->filled &= ~BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG); 8478 } 8479 8480 enum nl80211_dump_station_phase { 8481 NL80211_DUMP_STA_PHASE_AGGREGATED = 0, 8482 NL80211_DUMP_STA_PHASE_PER_LINK = 1, 8483 }; 8484 8485 struct nl80211_dump_station_ctx { 8486 int sta_idx; 8487 int link_idx; 8488 enum nl80211_dump_station_phase phase; 8489 bool dump_link_stats; 8490 bool filter_mac; 8491 u8 filter_mac_addr[ETH_ALEN]; 8492 u8 mac_addr[ETH_ALEN]; 8493 struct station_info sinfo; 8494 }; 8495 8496 static int nl80211_put_link_station_payload(struct sk_buff *msg, 8497 struct cfg80211_registered_device *rdev, 8498 struct station_info *sinfo, 8499 int link_idx) 8500 { 8501 struct link_station_info *link_sinfo = sinfo->links[link_idx]; 8502 struct nlattr *links, *link; 8503 8504 if (WARN_ON_ONCE(!link_sinfo)) 8505 return -ENOENT; 8506 8507 if (!is_valid_ether_addr(link_sinfo->addr)) 8508 return -EADDRNOTAVAIL; 8509 8510 links = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 8511 if (!links) 8512 return -EMSGSIZE; 8513 8514 link = nla_nest_start(msg, link_idx + 1); 8515 if (!link) 8516 goto nla_put_failure; 8517 8518 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_idx) || 8519 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, link_sinfo->addr)) 8520 goto nla_put_failure; 8521 8522 if (nl80211_fill_link_station(msg, rdev, link_sinfo)) 8523 goto nla_put_failure; 8524 8525 nla_nest_end(msg, link); 8526 nla_nest_end(msg, links); 8527 return 0; 8528 8529 nla_put_failure: 8530 nla_nest_cancel(msg, links); 8531 return -EMSGSIZE; 8532 } 8533 8534 static int nl80211_dump_station(struct sk_buff *skb, 8535 struct netlink_callback *cb) 8536 { 8537 struct cfg80211_registered_device *rdev; 8538 struct wireless_dev *wdev; 8539 struct nl80211_dump_station_ctx *ctx = (void *)cb->args[2]; 8540 struct nlattr **attrbuf __free(kfree) = NULL; 8541 int err; 8542 8543 if (!ctx) { 8544 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 8545 if (!attrbuf) 8546 return -ENOMEM; 8547 } 8548 8549 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, attrbuf); 8550 if (err) 8551 return err; 8552 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 8553 __acquire(&rdev->wiphy.mtx); 8554 8555 if (!ctx) { 8556 ctx = kzalloc_obj(*ctx); 8557 if (!ctx) { 8558 err = -ENOMEM; 8559 goto out_err; 8560 } 8561 cb->args[2] = (long)ctx; 8562 ctx->phase = NL80211_DUMP_STA_PHASE_AGGREGATED; 8563 ctx->dump_link_stats = 8564 !!attrbuf[NL80211_ATTR_STA_DUMP_LINK_STATS]; 8565 if (attrbuf[NL80211_ATTR_MAC]) { 8566 const u8 *mac = nla_data(attrbuf[NL80211_ATTR_MAC]); 8567 8568 if (!is_valid_ether_addr(mac)) { 8569 kfree(ctx); 8570 cb->args[2] = 0; 8571 err = -EINVAL; 8572 goto out_err; 8573 } 8574 ctx->filter_mac = true; 8575 memcpy(ctx->filter_mac_addr, mac, ETH_ALEN); 8576 } 8577 } 8578 8579 if (!wdev->netdev && wdev->iftype != NL80211_IFTYPE_NAN) { 8580 err = -EINVAL; 8581 goto out_err; 8582 } 8583 8584 if (ctx->filter_mac) { 8585 if (!rdev->ops->get_station) { 8586 err = -EOPNOTSUPP; 8587 goto out_err; 8588 } 8589 } else if (!rdev->ops->dump_station) { 8590 err = -EOPNOTSUPP; 8591 goto out_err; 8592 } 8593 8594 while (true) { 8595 void *hdr; 8596 int ret; 8597 8598 /* AGGREGATED phase: fetch sinfo from driver once per station */ 8599 if (ctx->phase == NL80211_DUMP_STA_PHASE_AGGREGATED) { 8600 memset(&ctx->sinfo, 0, sizeof(ctx->sinfo)); 8601 for (int i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) { 8602 ctx->sinfo.links[i] = 8603 kzalloc_obj(*ctx->sinfo.links[0]); 8604 if (!ctx->sinfo.links[i]) { 8605 err = -ENOMEM; 8606 goto out_err_release; 8607 } 8608 } 8609 8610 if (ctx->filter_mac) { 8611 if (ctx->sta_idx > 0) { 8612 err = skb->len; 8613 goto out_err_release; 8614 } 8615 err = rdev_get_station(rdev, wdev, 8616 ctx->filter_mac_addr, 8617 &ctx->sinfo); 8618 if (!err) 8619 memcpy(ctx->mac_addr, 8620 ctx->filter_mac_addr, ETH_ALEN); 8621 } else { 8622 err = rdev_dump_station(rdev, wdev, ctx->sta_idx, 8623 ctx->mac_addr, 8624 &ctx->sinfo); 8625 } 8626 if (err == -ENOENT) { 8627 err = skb->len; 8628 goto out_err_release; 8629 } 8630 if (err) 8631 goto out_err_release; 8632 8633 if (ctx->sinfo.valid_links) 8634 cfg80211_sta_set_mld_sinfo(&ctx->sinfo); 8635 } else { 8636 /* PER_LINK phase: advance to next valid link */ 8637 while (ctx->link_idx < IEEE80211_MLD_MAX_NUM_LINKS && 8638 !(ctx->sinfo.valid_links & BIT(ctx->link_idx))) 8639 ctx->link_idx++; 8640 8641 if (ctx->link_idx >= IEEE80211_MLD_MAX_NUM_LINKS) { 8642 cfg80211_sinfo_release_content(&ctx->sinfo); 8643 ctx->sta_idx++; 8644 ctx->phase = NL80211_DUMP_STA_PHASE_AGGREGATED; 8645 continue; 8646 } 8647 } 8648 8649 /* Build common header for both phases */ 8650 hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 8651 cb->nlh->nlmsg_seq, NLM_F_MULTI, 8652 NL80211_CMD_NEW_STATION); 8653 if (!hdr) { 8654 err = skb->len; 8655 if (ctx->phase == NL80211_DUMP_STA_PHASE_PER_LINK) 8656 goto out_err; 8657 goto out_err_release; 8658 } 8659 8660 if ((wdev->netdev && 8661 nla_put_u32(skb, NL80211_ATTR_IFINDEX, 8662 wdev->netdev->ifindex)) || 8663 nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 8664 wdev_id(wdev), NL80211_ATTR_PAD) || 8665 nla_put(skb, NL80211_ATTR_MAC, ETH_ALEN, ctx->mac_addr) || 8666 nla_put_u32(skb, NL80211_ATTR_GENERATION, 8667 ctx->sinfo.generation)) { 8668 genlmsg_cancel(skb, hdr); 8669 err = skb->len; 8670 if (ctx->phase == NL80211_DUMP_STA_PHASE_PER_LINK) 8671 goto out_err; 8672 goto out_err_release; 8673 } 8674 8675 switch (ctx->phase) { 8676 case NL80211_DUMP_STA_PHASE_AGGREGATED: 8677 ret = nl80211_put_sta_info_common(skb, rdev, &ctx->sinfo); 8678 if (ret) { 8679 genlmsg_cancel(skb, hdr); 8680 err = ret; 8681 goto out_err_release; 8682 } 8683 genlmsg_end(skb, hdr); 8684 8685 if (ctx->dump_link_stats && ctx->sinfo.valid_links) { 8686 ctx->phase = NL80211_DUMP_STA_PHASE_PER_LINK; 8687 ctx->link_idx = 0; 8688 } else { 8689 cfg80211_sinfo_release_content(&ctx->sinfo); 8690 ctx->sta_idx++; 8691 } 8692 break; 8693 8694 case NL80211_DUMP_STA_PHASE_PER_LINK: 8695 ret = nl80211_put_link_station_payload(skb, rdev, 8696 &ctx->sinfo, 8697 ctx->link_idx); 8698 if (ret == -EMSGSIZE) { 8699 genlmsg_cancel(skb, hdr); 8700 err = skb->len; 8701 goto out_err; 8702 } 8703 if (ret) { 8704 /* skip invalid link, do not abort the dump */ 8705 genlmsg_cancel(skb, hdr); 8706 ctx->link_idx++; 8707 continue; 8708 } 8709 genlmsg_end(skb, hdr); 8710 ctx->link_idx++; 8711 break; 8712 } 8713 } 8714 8715 out_err_release: 8716 cfg80211_sinfo_release_content(&ctx->sinfo); 8717 memset(&ctx->sinfo, 0, sizeof(ctx->sinfo)); 8718 out_err: 8719 wiphy_unlock(&rdev->wiphy); 8720 8721 return err; 8722 } 8723 8724 static int nl80211_dump_station_done(struct netlink_callback *cb) 8725 { 8726 struct nl80211_dump_station_ctx *ctx = (void *)cb->args[2]; 8727 8728 if (ctx) { 8729 cfg80211_sinfo_release_content(&ctx->sinfo); 8730 kfree(ctx); 8731 } 8732 return 0; 8733 } 8734 8735 static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info) 8736 { 8737 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8738 struct wireless_dev *wdev = info->user_ptr[1]; 8739 struct station_info sinfo; 8740 struct sk_buff *msg; 8741 u8 *mac_addr = NULL; 8742 int err, i; 8743 8744 memset(&sinfo, 0, sizeof(sinfo)); 8745 8746 if (!wdev->netdev) 8747 return -EINVAL; 8748 8749 if (!info->attrs[NL80211_ATTR_MAC]) 8750 return -EINVAL; 8751 8752 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 8753 8754 if (!rdev->ops->get_station) 8755 return -EOPNOTSUPP; 8756 8757 for (i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) { 8758 sinfo.links[i] = kzalloc_obj(*sinfo.links[0]); 8759 if (!sinfo.links[i]) { 8760 cfg80211_sinfo_release_content(&sinfo); 8761 return -ENOMEM; 8762 } 8763 } 8764 8765 err = rdev_get_station(rdev, wdev, mac_addr, &sinfo); 8766 if (err) { 8767 cfg80211_sinfo_release_content(&sinfo); 8768 return err; 8769 } 8770 8771 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 8772 if (!msg) { 8773 cfg80211_sinfo_release_content(&sinfo); 8774 return -ENOMEM; 8775 } 8776 8777 if (sinfo.valid_links) 8778 cfg80211_sta_set_mld_sinfo(&sinfo); 8779 8780 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 8781 info->snd_portid, info->snd_seq, 0, 8782 rdev, wdev, mac_addr, &sinfo) < 0) { 8783 nlmsg_free(msg); 8784 return -ENOBUFS; 8785 } 8786 8787 return genlmsg_reply(msg, info); 8788 } 8789 8790 int cfg80211_check_station_change(struct wiphy *wiphy, 8791 struct station_parameters *params, 8792 enum cfg80211_station_type statype) 8793 { 8794 if (params->listen_interval != -1 && 8795 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 8796 return -EINVAL; 8797 8798 if (params->support_p2p_ps != -1 && 8799 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 8800 return -EINVAL; 8801 8802 if (params->aid && 8803 !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) && 8804 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 8805 return -EINVAL; 8806 8807 /* When you run into this, adjust the code below for the new flag */ 8808 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 8); 8809 8810 switch (statype) { 8811 case CFG80211_STA_MESH_PEER_KERNEL: 8812 case CFG80211_STA_MESH_PEER_USER: 8813 /* 8814 * No ignoring the TDLS flag here -- the userspace mesh 8815 * code doesn't have the bug of including TDLS in the 8816 * mask everywhere. 8817 */ 8818 if (params->sta_flags_mask & 8819 ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) | 8820 BIT(NL80211_STA_FLAG_MFP) | 8821 BIT(NL80211_STA_FLAG_AUTHORIZED))) 8822 return -EINVAL; 8823 break; 8824 case CFG80211_STA_TDLS_PEER_SETUP: 8825 case CFG80211_STA_TDLS_PEER_ACTIVE: 8826 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 8827 return -EINVAL; 8828 /* ignore since it can't change */ 8829 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 8830 break; 8831 default: 8832 /* disallow mesh-specific things */ 8833 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) 8834 return -EINVAL; 8835 if (params->local_pm) 8836 return -EINVAL; 8837 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) 8838 return -EINVAL; 8839 } 8840 8841 if (statype != CFG80211_STA_TDLS_PEER_SETUP && 8842 statype != CFG80211_STA_TDLS_PEER_ACTIVE) { 8843 /* TDLS can't be set, ... */ 8844 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) 8845 return -EINVAL; 8846 /* 8847 * ... but don't bother the driver with it. This works around 8848 * a hostapd/wpa_supplicant issue -- it always includes the 8849 * TLDS_PEER flag in the mask even for AP mode. 8850 */ 8851 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 8852 } 8853 8854 if (statype != CFG80211_STA_TDLS_PEER_SETUP && 8855 statype != CFG80211_STA_AP_CLIENT_UNASSOC) { 8856 /* reject other things that can't change */ 8857 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) 8858 return -EINVAL; 8859 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) 8860 return -EINVAL; 8861 if (params->link_sta_params.supported_rates) 8862 return -EINVAL; 8863 if (statype != CFG80211_STA_NAN_MGMT && 8864 (params->link_sta_params.ht_capa || 8865 params->link_sta_params.vht_capa || 8866 params->link_sta_params.he_capa)) 8867 return -EINVAL; 8868 if (params->ext_capab || params->link_sta_params.eht_capa || 8869 params->link_sta_params.uhr_capa) 8870 return -EINVAL; 8871 if (params->sta_flags_mask & BIT(NL80211_STA_FLAG_SPP_AMSDU)) 8872 return -EINVAL; 8873 } 8874 8875 if (statype != CFG80211_STA_AP_CLIENT && 8876 statype != CFG80211_STA_AP_CLIENT_UNASSOC) { 8877 if (params->vlan) 8878 return -EINVAL; 8879 } 8880 8881 /* Accept EMLSR capabilities only for AP client before association */ 8882 if (statype != CFG80211_STA_AP_CLIENT_UNASSOC && 8883 params->eml_cap_present) 8884 return -EINVAL; 8885 8886 switch (statype) { 8887 case CFG80211_STA_AP_MLME_CLIENT: 8888 /* Use this only for authorizing/unauthorizing a station */ 8889 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) 8890 return -EOPNOTSUPP; 8891 break; 8892 case CFG80211_STA_AP_CLIENT: 8893 case CFG80211_STA_AP_CLIENT_UNASSOC: 8894 /* accept only the listed bits */ 8895 if (params->sta_flags_mask & 8896 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 8897 BIT(NL80211_STA_FLAG_AUTHENTICATED) | 8898 BIT(NL80211_STA_FLAG_ASSOCIATED) | 8899 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 8900 BIT(NL80211_STA_FLAG_WME) | 8901 BIT(NL80211_STA_FLAG_MFP) | 8902 BIT(NL80211_STA_FLAG_SPP_AMSDU))) 8903 return -EINVAL; 8904 8905 /* but authenticated/associated only if driver handles it */ 8906 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 8907 params->sta_flags_mask & 8908 (BIT(NL80211_STA_FLAG_AUTHENTICATED) | 8909 BIT(NL80211_STA_FLAG_ASSOCIATED))) 8910 return -EINVAL; 8911 break; 8912 case CFG80211_STA_IBSS: 8913 case CFG80211_STA_AP_STA: 8914 /* reject any changes other than AUTHORIZED */ 8915 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) 8916 return -EINVAL; 8917 break; 8918 case CFG80211_STA_TDLS_PEER_SETUP: 8919 /* reject any changes other than AUTHORIZED or WME */ 8920 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 8921 BIT(NL80211_STA_FLAG_WME))) 8922 return -EINVAL; 8923 /* force (at least) rates when authorizing */ 8924 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) && 8925 !params->link_sta_params.supported_rates) 8926 return -EINVAL; 8927 break; 8928 case CFG80211_STA_TDLS_PEER_ACTIVE: 8929 /* reject any changes */ 8930 return -EINVAL; 8931 case CFG80211_STA_MESH_PEER_KERNEL: 8932 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) 8933 return -EINVAL; 8934 break; 8935 case CFG80211_STA_MESH_PEER_USER: 8936 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION && 8937 params->plink_action != NL80211_PLINK_ACTION_BLOCK) 8938 return -EINVAL; 8939 break; 8940 case CFG80211_STA_NAN_MGMT: 8941 if (params->sta_flags_mask & 8942 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 8943 BIT(NL80211_STA_FLAG_MFP))) 8944 return -EINVAL; 8945 break; 8946 case CFG80211_STA_NAN_DATA: 8947 if (params->sta_flags_mask & 8948 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 8949 BIT(NL80211_STA_FLAG_MFP) | 8950 BIT(NL80211_STA_FLAG_WME))) 8951 return -EINVAL; 8952 break; 8953 } 8954 8955 /* 8956 * Older kernel versions ignored this attribute entirely, so don't 8957 * reject attempts to update it but mark it as unused instead so the 8958 * driver won't look at the data. 8959 */ 8960 if (statype != CFG80211_STA_AP_CLIENT_UNASSOC && 8961 statype != CFG80211_STA_TDLS_PEER_SETUP) 8962 params->link_sta_params.opmode_notif_used = false; 8963 8964 return 0; 8965 } 8966 EXPORT_SYMBOL(cfg80211_check_station_change); 8967 8968 /* 8969 * Get vlan interface making sure it is running, on the right wiphy 8970 * and actually belongs to the given AP/P2P_GO interface. 8971 */ 8972 static struct net_device *get_vlan(struct genl_info *info, 8973 struct cfg80211_registered_device *rdev, 8974 struct net_device *dev) 8975 { 8976 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; 8977 struct net_device *v; 8978 int ret; 8979 8980 if (!vlanattr) 8981 return NULL; 8982 8983 v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr)); 8984 if (!v) 8985 return ERR_PTR(-ENODEV); 8986 8987 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { 8988 ret = -EINVAL; 8989 goto error; 8990 } 8991 8992 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && 8993 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 8994 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 8995 ret = -EINVAL; 8996 goto error; 8997 } 8998 8999 if (!netif_running(v)) { 9000 ret = -ENETDOWN; 9001 goto error; 9002 } 9003 9004 /* Check if the VLAN interface belongs to the AP interface */ 9005 if (!dev || !ether_addr_equal(v->dev_addr, dev->dev_addr)) { 9006 ret = -EINVAL; 9007 goto error; 9008 } 9009 9010 return v; 9011 error: 9012 dev_put(v); 9013 return ERR_PTR(ret); 9014 } 9015 9016 static int nl80211_parse_sta_wme(struct genl_info *info, 9017 struct station_parameters *params) 9018 { 9019 struct nlattr *tb[NL80211_STA_WME_MAX + 1]; 9020 struct nlattr *nla; 9021 int err; 9022 9023 /* parse WME attributes if present */ 9024 if (!info->attrs[NL80211_ATTR_STA_WME]) 9025 return 0; 9026 9027 nla = info->attrs[NL80211_ATTR_STA_WME]; 9028 err = nla_parse_nested_deprecated(tb, NL80211_STA_WME_MAX, nla, 9029 nl80211_sta_wme_policy, 9030 info->extack); 9031 if (err) 9032 return err; 9033 9034 if (tb[NL80211_STA_WME_UAPSD_QUEUES]) 9035 params->uapsd_queues = nla_get_u8( 9036 tb[NL80211_STA_WME_UAPSD_QUEUES]); 9037 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) 9038 return -EINVAL; 9039 9040 if (tb[NL80211_STA_WME_MAX_SP]) 9041 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); 9042 9043 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) 9044 return -EINVAL; 9045 9046 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; 9047 9048 return 0; 9049 } 9050 9051 static int nl80211_parse_sta_channel_info(struct genl_info *info, 9052 struct station_parameters *params) 9053 { 9054 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { 9055 params->supported_channels = 9056 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 9057 params->supported_channels_len = 9058 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 9059 /* 9060 * Need to include at least one (first channel, number of 9061 * channels) tuple for each subband (checked in policy), 9062 * and must have proper tuples for the rest of the data as well. 9063 */ 9064 if (params->supported_channels_len % 2) 9065 return -EINVAL; 9066 } 9067 9068 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { 9069 params->supported_oper_classes = 9070 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 9071 params->supported_oper_classes_len = 9072 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 9073 } 9074 return 0; 9075 } 9076 9077 static int nl80211_set_station_tdls(struct genl_info *info, 9078 struct station_parameters *params) 9079 { 9080 int err; 9081 /* Dummy STA entry gets updated once the peer capabilities are known */ 9082 if (info->attrs[NL80211_ATTR_PEER_AID]) 9083 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 9084 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 9085 params->link_sta_params.ht_capa = 9086 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 9087 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 9088 params->link_sta_params.vht_capa = 9089 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 9090 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 9091 params->link_sta_params.he_capa = 9092 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 9093 params->link_sta_params.he_capa_len = 9094 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 9095 9096 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { 9097 params->link_sta_params.eht_capa = 9098 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 9099 params->link_sta_params.eht_capa_len = 9100 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 9101 9102 if (!ieee80211_eht_capa_size_ok((const u8 *)params->link_sta_params.he_capa, 9103 (const u8 *)params->link_sta_params.eht_capa, 9104 params->link_sta_params.eht_capa_len, 9105 false)) 9106 return -EINVAL; 9107 } 9108 } 9109 9110 if (info->attrs[NL80211_ATTR_UHR_CAPABILITY]) { 9111 if (!params->link_sta_params.eht_capa) 9112 return -EINVAL; 9113 9114 params->link_sta_params.uhr_capa = 9115 nla_data(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 9116 params->link_sta_params.uhr_capa_len = 9117 nla_len(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 9118 } 9119 9120 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) 9121 params->link_sta_params.s1g_capa = 9122 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]); 9123 9124 err = nl80211_parse_sta_channel_info(info, params); 9125 if (err) 9126 return err; 9127 9128 return nl80211_parse_sta_wme(info, params); 9129 } 9130 9131 static int nl80211_parse_sta_txpower_setting(struct genl_info *info, 9132 struct sta_txpwr *txpwr, 9133 bool *txpwr_set) 9134 { 9135 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9136 int idx; 9137 9138 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) { 9139 if (!rdev->ops->set_tx_power || 9140 !wiphy_ext_feature_isset(&rdev->wiphy, 9141 NL80211_EXT_FEATURE_STA_TX_PWR)) 9142 return -EOPNOTSUPP; 9143 9144 idx = NL80211_ATTR_STA_TX_POWER_SETTING; 9145 txpwr->type = nla_get_u8(info->attrs[idx]); 9146 9147 if (txpwr->type == NL80211_TX_POWER_LIMITED) { 9148 idx = NL80211_ATTR_STA_TX_POWER; 9149 9150 if (info->attrs[idx]) 9151 txpwr->power = nla_get_s16(info->attrs[idx]); 9152 else 9153 return -EINVAL; 9154 } 9155 9156 *txpwr_set = true; 9157 } else { 9158 *txpwr_set = false; 9159 } 9160 9161 return 0; 9162 } 9163 9164 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) 9165 { 9166 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9167 struct wireless_dev *wdev = info->user_ptr[1]; 9168 struct net_device *dev = wdev->netdev; 9169 struct station_parameters params; 9170 u8 *mac_addr; 9171 int err; 9172 9173 memset(¶ms, 0, sizeof(params)); 9174 9175 if (!dev && wdev->iftype != NL80211_IFTYPE_NAN && 9176 wdev->iftype != NL80211_IFTYPE_NAN_DATA) 9177 return -EINVAL; 9178 9179 if (!rdev->ops->change_station) 9180 return -EOPNOTSUPP; 9181 9182 /* 9183 * AID and listen_interval properties can be set only for unassociated 9184 * station. Include these parameters here and will check them in 9185 * cfg80211_check_station_change(). 9186 */ 9187 if (info->attrs[NL80211_ATTR_STA_AID]) 9188 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 9189 9190 if (info->attrs[NL80211_ATTR_VLAN_ID]) 9191 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 9192 9193 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 9194 params.listen_interval = 9195 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 9196 else 9197 params.listen_interval = -1; 9198 9199 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) 9200 params.support_p2p_ps = 9201 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); 9202 else 9203 params.support_p2p_ps = -1; 9204 9205 if (!info->attrs[NL80211_ATTR_MAC]) 9206 return -EINVAL; 9207 9208 params.link_sta_params.link_id = 9209 nl80211_link_id_or_invalid(info->attrs); 9210 9211 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { 9212 /* If MLD_ADDR attribute is set then this is an MLD station 9213 * and the MLD_ADDR attribute holds the MLD address and the 9214 * MAC attribute holds for the LINK address. 9215 * In that case, the link_id is also expected to be valid. 9216 */ 9217 if (params.link_sta_params.link_id < 0) 9218 return -EINVAL; 9219 9220 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 9221 params.link_sta_params.mld_mac = mac_addr; 9222 params.link_sta_params.link_mac = 9223 nla_data(info->attrs[NL80211_ATTR_MAC]); 9224 if (!is_valid_ether_addr(params.link_sta_params.link_mac)) 9225 return -EINVAL; 9226 } else { 9227 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 9228 } 9229 9230 9231 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 9232 params.link_sta_params.supported_rates = 9233 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 9234 params.link_sta_params.supported_rates_len = 9235 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 9236 } 9237 9238 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 9239 params.capability = 9240 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 9241 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 9242 } 9243 9244 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 9245 params.ext_capab = 9246 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 9247 params.ext_capab_len = 9248 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 9249 } 9250 9251 if (parse_station_flags(info, wdev->iftype, ¶ms)) 9252 return -EINVAL; 9253 9254 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) 9255 params.plink_action = 9256 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 9257 9258 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { 9259 params.plink_state = 9260 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); 9261 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) 9262 params.peer_aid = nla_get_u16( 9263 info->attrs[NL80211_ATTR_MESH_PEER_AID]); 9264 params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE; 9265 } 9266 9267 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) 9268 params.local_pm = nla_get_u32( 9269 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); 9270 9271 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 9272 params.link_sta_params.opmode_notif_used = true; 9273 params.link_sta_params.opmode_notif = 9274 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 9275 } 9276 9277 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) 9278 params.link_sta_params.he_6ghz_capa = 9279 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); 9280 9281 if (info->attrs[NL80211_ATTR_EML_CAPABILITY]) { 9282 params.eml_cap_present = true; 9283 params.eml_cap = 9284 nla_get_u16(info->attrs[NL80211_ATTR_EML_CAPABILITY]); 9285 } 9286 9287 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) 9288 params.airtime_weight = 9289 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); 9290 9291 if (params.airtime_weight && 9292 !wiphy_ext_feature_isset(&rdev->wiphy, 9293 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 9294 return -EOPNOTSUPP; 9295 9296 err = nl80211_parse_sta_txpower_setting(info, 9297 ¶ms.link_sta_params.txpwr, 9298 ¶ms.link_sta_params.txpwr_set); 9299 if (err) 9300 return err; 9301 9302 /* Include parameters for TDLS peer (will check later) */ 9303 err = nl80211_set_station_tdls(info, ¶ms); 9304 if (err) 9305 return err; 9306 9307 params.vlan = get_vlan(info, rdev, dev); 9308 if (IS_ERR(params.vlan)) 9309 return PTR_ERR(params.vlan); 9310 9311 switch (wdev->iftype) { 9312 case NL80211_IFTYPE_AP: 9313 case NL80211_IFTYPE_AP_VLAN: 9314 case NL80211_IFTYPE_P2P_GO: 9315 case NL80211_IFTYPE_P2P_CLIENT: 9316 case NL80211_IFTYPE_STATION: 9317 case NL80211_IFTYPE_ADHOC: 9318 case NL80211_IFTYPE_MESH_POINT: 9319 case NL80211_IFTYPE_NAN: 9320 case NL80211_IFTYPE_NAN_DATA: 9321 break; 9322 default: 9323 err = -EOPNOTSUPP; 9324 goto out_put_vlan; 9325 } 9326 9327 /* driver will call cfg80211_check_station_change() */ 9328 err = rdev_change_station(rdev, wdev, mac_addr, ¶ms); 9329 9330 out_put_vlan: 9331 dev_put(params.vlan); 9332 9333 return err; 9334 } 9335 9336 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info) 9337 { 9338 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9339 int err, link_id; 9340 struct wireless_dev *wdev = info->user_ptr[1]; 9341 struct net_device *dev = wdev->netdev; 9342 struct station_parameters params; 9343 u8 *mac_addr = NULL; 9344 u32 auth_assoc = BIT(NL80211_STA_FLAG_AUTHENTICATED) | 9345 BIT(NL80211_STA_FLAG_ASSOCIATED); 9346 9347 memset(¶ms, 0, sizeof(params)); 9348 9349 if (!dev && wdev->iftype != NL80211_IFTYPE_NAN) 9350 return -EINVAL; 9351 9352 if (!rdev->ops->add_station) 9353 return -EOPNOTSUPP; 9354 9355 if (!info->attrs[NL80211_ATTR_MAC]) 9356 return -EINVAL; 9357 9358 if (wdev->iftype == NL80211_IFTYPE_NAN || 9359 wdev->iftype == NL80211_IFTYPE_NAN_DATA) { 9360 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 9361 return -EINVAL; 9362 if (wdev->iftype == NL80211_IFTYPE_NAN_DATA) { 9363 if (!info->attrs[NL80211_ATTR_NAN_NMI_MAC]) 9364 return -EINVAL; 9365 9366 /* Only NMI stations receive the HT/VHT/HE capabilities */ 9367 if (info->attrs[NL80211_ATTR_HT_CAPABILITY] || 9368 info->attrs[NL80211_ATTR_VHT_CAPABILITY] || 9369 info->attrs[NL80211_ATTR_HE_CAPABILITY]) 9370 return -EINVAL; 9371 } 9372 } else { 9373 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 9374 return -EINVAL; 9375 9376 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 9377 return -EINVAL; 9378 9379 if (!info->attrs[NL80211_ATTR_STA_AID] && 9380 !info->attrs[NL80211_ATTR_PEER_AID]) 9381 return -EINVAL; 9382 } 9383 9384 params.link_sta_params.link_id = 9385 nl80211_link_id_or_invalid(info->attrs); 9386 9387 if (wdev->valid_links) { 9388 if (params.link_sta_params.link_id < 0) 9389 return -EINVAL; 9390 if (!(wdev->valid_links & BIT(params.link_sta_params.link_id))) 9391 return -ENOLINK; 9392 } else { 9393 if (params.link_sta_params.link_id >= 0) 9394 return -EINVAL; 9395 } 9396 9397 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { 9398 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 9399 params.link_sta_params.mld_mac = mac_addr; 9400 params.link_sta_params.link_mac = 9401 nla_data(info->attrs[NL80211_ATTR_MAC]); 9402 if (!is_valid_ether_addr(params.link_sta_params.link_mac)) 9403 return -EINVAL; 9404 } else { 9405 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 9406 } 9407 9408 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 9409 params.link_sta_params.supported_rates = 9410 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 9411 params.link_sta_params.supported_rates_len = 9412 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 9413 } 9414 9415 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 9416 params.listen_interval = 9417 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 9418 9419 if (info->attrs[NL80211_ATTR_VLAN_ID]) 9420 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 9421 9422 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { 9423 params.support_p2p_ps = 9424 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); 9425 } else { 9426 /* 9427 * if not specified, assume it's supported for P2P GO interface, 9428 * and is NOT supported for AP interface 9429 */ 9430 params.support_p2p_ps = 9431 wdev->iftype == NL80211_IFTYPE_P2P_GO; 9432 } 9433 9434 if (info->attrs[NL80211_ATTR_PEER_AID]) 9435 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 9436 else if (info->attrs[NL80211_ATTR_STA_AID]) 9437 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 9438 9439 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 9440 params.capability = 9441 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 9442 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 9443 } 9444 9445 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 9446 params.ext_capab = 9447 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 9448 params.ext_capab_len = 9449 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 9450 } 9451 9452 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 9453 params.link_sta_params.ht_capa = 9454 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 9455 9456 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 9457 params.link_sta_params.vht_capa = 9458 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 9459 9460 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 9461 params.link_sta_params.he_capa = 9462 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 9463 params.link_sta_params.he_capa_len = 9464 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 9465 9466 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { 9467 params.link_sta_params.eht_capa = 9468 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 9469 params.link_sta_params.eht_capa_len = 9470 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 9471 9472 if (!ieee80211_eht_capa_size_ok((const u8 *)params.link_sta_params.he_capa, 9473 (const u8 *)params.link_sta_params.eht_capa, 9474 params.link_sta_params.eht_capa_len, 9475 false)) 9476 return -EINVAL; 9477 } 9478 } 9479 9480 if (info->attrs[NL80211_ATTR_UHR_CAPABILITY]) { 9481 if (!params.link_sta_params.eht_capa) 9482 return -EINVAL; 9483 9484 params.link_sta_params.uhr_capa = 9485 nla_data(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 9486 params.link_sta_params.uhr_capa_len = 9487 nla_len(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 9488 } 9489 9490 if (info->attrs[NL80211_ATTR_EML_CAPABILITY]) { 9491 params.eml_cap_present = true; 9492 params.eml_cap = 9493 nla_get_u16(info->attrs[NL80211_ATTR_EML_CAPABILITY]); 9494 } 9495 9496 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) 9497 params.link_sta_params.he_6ghz_capa = 9498 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); 9499 9500 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) 9501 params.link_sta_params.s1g_capa = 9502 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]); 9503 9504 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 9505 params.link_sta_params.opmode_notif_used = true; 9506 params.link_sta_params.opmode_notif = 9507 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 9508 } 9509 9510 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) 9511 params.plink_action = 9512 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 9513 9514 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) 9515 params.airtime_weight = 9516 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); 9517 9518 if (params.airtime_weight && 9519 !wiphy_ext_feature_isset(&rdev->wiphy, 9520 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 9521 return -EOPNOTSUPP; 9522 9523 err = nl80211_parse_sta_txpower_setting(info, 9524 ¶ms.link_sta_params.txpwr, 9525 ¶ms.link_sta_params.txpwr_set); 9526 if (err) 9527 return err; 9528 9529 err = nl80211_parse_sta_channel_info(info, ¶ms); 9530 if (err) 9531 return err; 9532 9533 err = nl80211_parse_sta_wme(info, ¶ms); 9534 if (err) 9535 return err; 9536 9537 if (parse_station_flags(info, wdev->iftype, ¶ms)) 9538 return -EINVAL; 9539 9540 /* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT 9541 * as userspace might just pass through the capabilities from the IEs 9542 * directly, rather than enforcing this restriction and returning an 9543 * error in this case. 9544 */ 9545 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) { 9546 params.link_sta_params.ht_capa = NULL; 9547 params.link_sta_params.vht_capa = NULL; 9548 9549 /* HE, EHT and UHR require WME */ 9550 if (params.link_sta_params.he_capa_len || 9551 params.link_sta_params.he_6ghz_capa || 9552 params.link_sta_params.eht_capa_len || 9553 params.link_sta_params.uhr_capa_len) 9554 return -EINVAL; 9555 } 9556 9557 if (wdev->iftype == NL80211_IFTYPE_NAN || 9558 wdev->iftype == NL80211_IFTYPE_NAN_DATA) { 9559 if (params.sta_modify_mask & STATION_PARAM_APPLY_UAPSD) 9560 return -EINVAL; 9561 /* NAN NMI station must be added in associated or authorized state */ 9562 if (!(params.sta_flags_set & (BIT(NL80211_STA_FLAG_ASSOCIATED) | 9563 BIT(NL80211_STA_FLAG_AUTHENTICATED)))) 9564 return -EINVAL; 9565 } 9566 9567 /* Ensure that HT/VHT capabilities are not set for 6 GHz HE STA */ 9568 if (params.link_sta_params.he_6ghz_capa && 9569 (params.link_sta_params.ht_capa || params.link_sta_params.vht_capa)) 9570 return -EINVAL; 9571 9572 /* When you run into this, adjust the code below for the new flag */ 9573 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 8); 9574 9575 switch (wdev->iftype) { 9576 case NL80211_IFTYPE_AP: 9577 case NL80211_IFTYPE_P2P_GO: 9578 /* Add a new station only after the AP and link has been started */ 9579 link_id = wdev->valid_links ? params.link_sta_params.link_id : 0; 9580 if (!wdev->links[link_id].ap.beacon_interval) 9581 return -ENETDOWN; 9582 9583 /* ignore WME attributes if iface/sta is not capable */ 9584 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || 9585 !(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) 9586 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 9587 9588 /* TDLS peers cannot be added */ 9589 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 9590 info->attrs[NL80211_ATTR_PEER_AID]) 9591 return -EINVAL; 9592 /* but don't bother the driver with it */ 9593 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 9594 9595 /* allow authenticated/associated only if driver handles it */ 9596 if (!(rdev->wiphy.features & 9597 NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 9598 params.sta_flags_mask & auth_assoc) 9599 return -EINVAL; 9600 9601 if (!wiphy_ext_feature_isset(&rdev->wiphy, 9602 NL80211_EXT_FEATURE_SPP_AMSDU_SUPPORT) && 9603 params.sta_flags_mask & BIT(NL80211_STA_FLAG_SPP_AMSDU)) 9604 return -EINVAL; 9605 9606 /* Older userspace, or userspace wanting to be compatible with 9607 * !NL80211_FEATURE_FULL_AP_CLIENT_STATE, will not set the auth 9608 * and assoc flags in the mask, but assumes the station will be 9609 * added as associated anyway since this was the required driver 9610 * behaviour before NL80211_FEATURE_FULL_AP_CLIENT_STATE was 9611 * introduced. 9612 * In order to not bother drivers with this quirk in the API 9613 * set the flags in both the mask and set for new stations in 9614 * this case. 9615 */ 9616 if (!(params.sta_flags_mask & auth_assoc)) { 9617 params.sta_flags_mask |= auth_assoc; 9618 params.sta_flags_set |= auth_assoc; 9619 } 9620 9621 /* must be last in here for error handling */ 9622 params.vlan = get_vlan(info, rdev, dev); 9623 if (IS_ERR(params.vlan)) 9624 return PTR_ERR(params.vlan); 9625 break; 9626 case NL80211_IFTYPE_MESH_POINT: 9627 /* 9628 * Add a new station only after the mesh has been started. 9629 * libertas doesn't implement join_mesh(); it configures the 9630 * mesh via sysfs and joins it when the channel is set, so 9631 * use that as the started indication instead. 9632 */ 9633 if (rdev->ops->libertas_set_mesh_channel) { 9634 if (!wdev->u.mesh.chandef.chan) 9635 return -ENETDOWN; 9636 } else if (!wdev->u.mesh.beacon_interval) { 9637 return -ENETDOWN; 9638 } 9639 9640 /* ignore uAPSD data */ 9641 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 9642 9643 /* associated is disallowed */ 9644 if (params.sta_flags_mask & BIT(NL80211_STA_FLAG_ASSOCIATED)) 9645 return -EINVAL; 9646 /* TDLS peers cannot be added */ 9647 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 9648 info->attrs[NL80211_ATTR_PEER_AID]) 9649 return -EINVAL; 9650 break; 9651 case NL80211_IFTYPE_STATION: 9652 case NL80211_IFTYPE_P2P_CLIENT: 9653 /* ignore uAPSD data */ 9654 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 9655 9656 /* these are disallowed */ 9657 if (params.sta_flags_mask & 9658 (BIT(NL80211_STA_FLAG_ASSOCIATED) | 9659 BIT(NL80211_STA_FLAG_AUTHENTICATED))) 9660 return -EINVAL; 9661 /* Only TDLS peers can be added */ 9662 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 9663 return -EINVAL; 9664 /* Can only add if TDLS ... */ 9665 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) 9666 return -EOPNOTSUPP; 9667 /* ... with external setup is supported */ 9668 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) 9669 return -EOPNOTSUPP; 9670 /* 9671 * Older wpa_supplicant versions always mark the TDLS peer 9672 * as authorized, but it shouldn't yet be. 9673 */ 9674 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_AUTHORIZED); 9675 break; 9676 case NL80211_IFTYPE_NAN: 9677 break; 9678 case NL80211_IFTYPE_NAN_DATA: 9679 params.nmi_mac = nla_data(info->attrs[NL80211_ATTR_NAN_NMI_MAC]); 9680 break; 9681 default: 9682 return -EOPNOTSUPP; 9683 } 9684 9685 /* be aware of params.vlan when changing code here */ 9686 9687 params.epp_peer = 9688 nla_get_flag(info->attrs[NL80211_ATTR_EPP_PEER]); 9689 9690 err = rdev_add_station(rdev, wdev, mac_addr, ¶ms); 9691 dev_put(params.vlan); 9692 return err; 9693 } 9694 9695 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info) 9696 { 9697 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9698 struct wireless_dev *wdev = info->user_ptr[1]; 9699 struct net_device *dev = wdev->netdev; 9700 struct station_del_parameters params; 9701 int link_id = nl80211_link_id_or_invalid(info->attrs); 9702 9703 memset(¶ms, 0, sizeof(params)); 9704 9705 if (!dev && wdev->iftype != NL80211_IFTYPE_NAN) 9706 return -EINVAL; 9707 9708 if (info->attrs[NL80211_ATTR_MAC]) 9709 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]); 9710 9711 switch (wdev->iftype) { 9712 case NL80211_IFTYPE_AP: 9713 case NL80211_IFTYPE_AP_VLAN: 9714 case NL80211_IFTYPE_MESH_POINT: 9715 case NL80211_IFTYPE_P2P_GO: 9716 case NL80211_IFTYPE_NAN: 9717 case NL80211_IFTYPE_NAN_DATA: 9718 /* always accept these */ 9719 break; 9720 case NL80211_IFTYPE_ADHOC: 9721 /* conditionally accept */ 9722 if (wiphy_ext_feature_isset(&rdev->wiphy, 9723 NL80211_EXT_FEATURE_DEL_IBSS_STA)) 9724 break; 9725 return -EINVAL; 9726 default: 9727 return -EINVAL; 9728 } 9729 9730 if (!rdev->ops->del_station) 9731 return -EOPNOTSUPP; 9732 9733 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) { 9734 params.subtype = 9735 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]); 9736 if (params.subtype != IEEE80211_STYPE_DISASSOC >> 4 && 9737 params.subtype != IEEE80211_STYPE_DEAUTH >> 4) 9738 return -EINVAL; 9739 } else { 9740 /* Default to Deauthentication frame */ 9741 params.subtype = IEEE80211_STYPE_DEAUTH >> 4; 9742 } 9743 9744 if (info->attrs[NL80211_ATTR_REASON_CODE]) { 9745 params.reason_code = 9746 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 9747 if (params.reason_code == 0) 9748 return -EINVAL; /* 0 is reserved */ 9749 } else { 9750 /* Default to reason code 2 */ 9751 params.reason_code = WLAN_REASON_PREV_AUTH_NOT_VALID; 9752 } 9753 9754 /* Link ID not expected in case of non-ML operation */ 9755 if (!wdev->valid_links && link_id != -1) 9756 return -EINVAL; 9757 9758 /* If given, a valid link ID should be passed during MLO */ 9759 if (wdev->valid_links && link_id >= 0 && 9760 !(wdev->valid_links & BIT(link_id))) 9761 return -EINVAL; 9762 9763 params.link_id = link_id; 9764 9765 return rdev_del_station(rdev, wdev, ¶ms); 9766 } 9767 9768 static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq, 9769 int flags, struct net_device *dev, 9770 u8 *dst, u8 *next_hop, 9771 struct mpath_info *pinfo) 9772 { 9773 void *hdr; 9774 struct nlattr *pinfoattr; 9775 9776 hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_MPATH); 9777 if (!hdr) 9778 return -1; 9779 9780 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 9781 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dst) || 9782 nla_put(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop) || 9783 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) 9784 goto nla_put_failure; 9785 9786 pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MPATH_INFO); 9787 if (!pinfoattr) 9788 goto nla_put_failure; 9789 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && 9790 nla_put_u32(msg, NL80211_MPATH_INFO_FRAME_QLEN, 9791 pinfo->frame_qlen)) 9792 goto nla_put_failure; 9793 if (((pinfo->filled & MPATH_INFO_SN) && 9794 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || 9795 ((pinfo->filled & MPATH_INFO_METRIC) && 9796 nla_put_u32(msg, NL80211_MPATH_INFO_METRIC, 9797 pinfo->metric)) || 9798 ((pinfo->filled & MPATH_INFO_EXPTIME) && 9799 nla_put_u32(msg, NL80211_MPATH_INFO_EXPTIME, 9800 pinfo->exptime)) || 9801 ((pinfo->filled & MPATH_INFO_FLAGS) && 9802 nla_put_u8(msg, NL80211_MPATH_INFO_FLAGS, 9803 pinfo->flags)) || 9804 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && 9805 nla_put_u32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT, 9806 pinfo->discovery_timeout)) || 9807 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && 9808 nla_put_u8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES, 9809 pinfo->discovery_retries)) || 9810 ((pinfo->filled & MPATH_INFO_HOP_COUNT) && 9811 nla_put_u8(msg, NL80211_MPATH_INFO_HOP_COUNT, 9812 pinfo->hop_count)) || 9813 ((pinfo->filled & MPATH_INFO_PATH_CHANGE) && 9814 nla_put_u32(msg, NL80211_MPATH_INFO_PATH_CHANGE, 9815 pinfo->path_change_count))) 9816 goto nla_put_failure; 9817 9818 nla_nest_end(msg, pinfoattr); 9819 9820 genlmsg_end(msg, hdr); 9821 return 0; 9822 9823 nla_put_failure: 9824 genlmsg_cancel(msg, hdr); 9825 return -EMSGSIZE; 9826 } 9827 9828 static int nl80211_dump_mpath(struct sk_buff *skb, 9829 struct netlink_callback *cb) 9830 { 9831 struct mpath_info pinfo; 9832 struct cfg80211_registered_device *rdev; 9833 struct wireless_dev *wdev; 9834 u8 dst[ETH_ALEN]; 9835 u8 next_hop[ETH_ALEN]; 9836 int path_idx = cb->args[2]; 9837 int err; 9838 9839 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL); 9840 if (err) 9841 return err; 9842 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 9843 __acquire(&rdev->wiphy.mtx); 9844 9845 if (!rdev->ops->dump_mpath) { 9846 err = -EOPNOTSUPP; 9847 goto out_err; 9848 } 9849 9850 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 9851 err = -EOPNOTSUPP; 9852 goto out_err; 9853 } 9854 9855 while (1) { 9856 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst, 9857 next_hop, &pinfo); 9858 if (err == -ENOENT) 9859 break; 9860 if (err) 9861 goto out_err; 9862 9863 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 9864 cb->nlh->nlmsg_seq, NLM_F_MULTI, 9865 wdev->netdev, dst, next_hop, 9866 &pinfo) < 0) 9867 goto out; 9868 9869 path_idx++; 9870 } 9871 9872 out: 9873 cb->args[2] = path_idx; 9874 err = skb->len; 9875 out_err: 9876 wiphy_unlock(&rdev->wiphy); 9877 return err; 9878 } 9879 9880 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info) 9881 { 9882 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9883 int err; 9884 struct net_device *dev = info->user_ptr[1]; 9885 struct mpath_info pinfo; 9886 struct sk_buff *msg; 9887 u8 *dst = NULL; 9888 u8 next_hop[ETH_ALEN]; 9889 9890 memset(&pinfo, 0, sizeof(pinfo)); 9891 9892 if (!info->attrs[NL80211_ATTR_MAC]) 9893 return -EINVAL; 9894 9895 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9896 9897 if (!rdev->ops->get_mpath) 9898 return -EOPNOTSUPP; 9899 9900 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9901 return -EOPNOTSUPP; 9902 9903 err = rdev_get_mpath(rdev, dev, dst, next_hop, &pinfo); 9904 if (err) 9905 return err; 9906 9907 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9908 if (!msg) 9909 return -ENOMEM; 9910 9911 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 9912 dev, dst, next_hop, &pinfo) < 0) { 9913 nlmsg_free(msg); 9914 return -ENOBUFS; 9915 } 9916 9917 return genlmsg_reply(msg, info); 9918 } 9919 9920 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info) 9921 { 9922 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9923 struct net_device *dev = info->user_ptr[1]; 9924 u8 *dst = NULL; 9925 u8 *next_hop = NULL; 9926 9927 if (!info->attrs[NL80211_ATTR_MAC]) 9928 return -EINVAL; 9929 9930 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 9931 return -EINVAL; 9932 9933 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9934 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 9935 9936 if (!rdev->ops->change_mpath) 9937 return -EOPNOTSUPP; 9938 9939 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9940 return -EOPNOTSUPP; 9941 9942 return rdev_change_mpath(rdev, dev, dst, next_hop); 9943 } 9944 9945 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info) 9946 { 9947 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9948 struct net_device *dev = info->user_ptr[1]; 9949 u8 *dst = NULL; 9950 u8 *next_hop = NULL; 9951 9952 if (!info->attrs[NL80211_ATTR_MAC]) 9953 return -EINVAL; 9954 9955 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 9956 return -EINVAL; 9957 9958 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9959 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 9960 9961 if (!rdev->ops->add_mpath) 9962 return -EOPNOTSUPP; 9963 9964 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9965 return -EOPNOTSUPP; 9966 9967 return rdev_add_mpath(rdev, dev, dst, next_hop); 9968 } 9969 9970 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info) 9971 { 9972 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9973 struct net_device *dev = info->user_ptr[1]; 9974 u8 *dst = NULL; 9975 9976 if (info->attrs[NL80211_ATTR_MAC]) 9977 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9978 9979 if (!rdev->ops->del_mpath) 9980 return -EOPNOTSUPP; 9981 9982 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9983 return -EOPNOTSUPP; 9984 9985 return rdev_del_mpath(rdev, dev, dst); 9986 } 9987 9988 static int nl80211_get_mpp(struct sk_buff *skb, struct genl_info *info) 9989 { 9990 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9991 int err; 9992 struct net_device *dev = info->user_ptr[1]; 9993 struct mpath_info pinfo; 9994 struct sk_buff *msg; 9995 u8 *dst = NULL; 9996 u8 mpp[ETH_ALEN]; 9997 9998 memset(&pinfo, 0, sizeof(pinfo)); 9999 10000 if (!info->attrs[NL80211_ATTR_MAC]) 10001 return -EINVAL; 10002 10003 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 10004 10005 if (!rdev->ops->get_mpp) 10006 return -EOPNOTSUPP; 10007 10008 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 10009 return -EOPNOTSUPP; 10010 10011 err = rdev_get_mpp(rdev, dev, dst, mpp, &pinfo); 10012 if (err) 10013 return err; 10014 10015 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 10016 if (!msg) 10017 return -ENOMEM; 10018 10019 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 10020 dev, dst, mpp, &pinfo) < 0) { 10021 nlmsg_free(msg); 10022 return -ENOBUFS; 10023 } 10024 10025 return genlmsg_reply(msg, info); 10026 } 10027 10028 static int nl80211_dump_mpp(struct sk_buff *skb, 10029 struct netlink_callback *cb) 10030 { 10031 struct mpath_info pinfo; 10032 struct cfg80211_registered_device *rdev; 10033 struct wireless_dev *wdev; 10034 u8 dst[ETH_ALEN]; 10035 u8 mpp[ETH_ALEN]; 10036 int path_idx = cb->args[2]; 10037 int err; 10038 10039 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL); 10040 if (err) 10041 return err; 10042 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 10043 __acquire(&rdev->wiphy.mtx); 10044 10045 if (!rdev->ops->dump_mpp) { 10046 err = -EOPNOTSUPP; 10047 goto out_err; 10048 } 10049 10050 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 10051 err = -EOPNOTSUPP; 10052 goto out_err; 10053 } 10054 10055 while (1) { 10056 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst, 10057 mpp, &pinfo); 10058 if (err == -ENOENT) 10059 break; 10060 if (err) 10061 goto out_err; 10062 10063 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 10064 cb->nlh->nlmsg_seq, NLM_F_MULTI, 10065 wdev->netdev, dst, mpp, 10066 &pinfo) < 0) 10067 goto out; 10068 10069 path_idx++; 10070 } 10071 10072 out: 10073 cb->args[2] = path_idx; 10074 err = skb->len; 10075 out_err: 10076 wiphy_unlock(&rdev->wiphy); 10077 return err; 10078 } 10079 10080 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info) 10081 { 10082 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10083 struct net_device *dev = info->user_ptr[1]; 10084 struct bss_parameters params; 10085 u32 bss_param_support = rdev->wiphy.bss_param_support; 10086 u32 changed = 0; 10087 bool strict; 10088 10089 memset(¶ms, 0, sizeof(params)); 10090 params.link_id = nl80211_link_id_or_invalid(info->attrs); 10091 /* default to not changing parameters */ 10092 params.use_cts_prot = -1; 10093 params.use_short_preamble = -1; 10094 params.use_short_slot_time = -1; 10095 params.ap_isolate = -1; 10096 params.ht_opmode = -1; 10097 params.p2p_ctwindow = -1; 10098 params.p2p_opp_ps = -1; 10099 10100 strict = nla_get_flag(info->attrs[NL80211_ATTR_BSS_PARAM]); 10101 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) { 10102 if (strict && !(bss_param_support & WIPHY_BSS_PARAM_CTS_PROT)) 10103 return -EINVAL; 10104 params.use_cts_prot = 10105 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); 10106 changed |= WIPHY_BSS_PARAM_CTS_PROT; 10107 } 10108 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) { 10109 if (strict && 10110 !(bss_param_support & WIPHY_BSS_PARAM_SHORT_PREAMBLE)) 10111 return -EINVAL; 10112 params.use_short_preamble = 10113 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); 10114 changed |= WIPHY_BSS_PARAM_SHORT_PREAMBLE; 10115 } 10116 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) { 10117 if (strict && 10118 !(bss_param_support & WIPHY_BSS_PARAM_SHORT_SLOT_TIME)) 10119 return -EINVAL; 10120 params.use_short_slot_time = 10121 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); 10122 changed |= WIPHY_BSS_PARAM_SHORT_SLOT_TIME; 10123 } 10124 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 10125 if (strict && 10126 !(bss_param_support & WIPHY_BSS_PARAM_BASIC_RATES)) 10127 return -EINVAL; 10128 params.basic_rates = 10129 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 10130 params.basic_rates_len = 10131 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 10132 changed |= WIPHY_BSS_PARAM_BASIC_RATES; 10133 } 10134 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) { 10135 if (strict && !(bss_param_support & WIPHY_BSS_PARAM_AP_ISOLATE)) 10136 return -EINVAL; 10137 params.ap_isolate = 10138 !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); 10139 changed |= WIPHY_BSS_PARAM_AP_ISOLATE; 10140 } 10141 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) { 10142 if (strict && !(bss_param_support & WIPHY_BSS_PARAM_HT_OPMODE)) 10143 return -EINVAL; 10144 params.ht_opmode = 10145 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); 10146 changed |= WIPHY_BSS_PARAM_HT_OPMODE; 10147 } 10148 10149 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 10150 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 10151 return -EINVAL; 10152 params.p2p_ctwindow = 10153 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 10154 if (params.p2p_ctwindow != 0 && 10155 !(bss_param_support & WIPHY_BSS_PARAM_P2P_CTWINDOW)) 10156 return -EINVAL; 10157 changed |= WIPHY_BSS_PARAM_P2P_CTWINDOW; 10158 } 10159 10160 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 10161 u8 tmp; 10162 10163 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 10164 return -EINVAL; 10165 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 10166 if (tmp && !(bss_param_support & WIPHY_BSS_PARAM_P2P_OPPPS)) 10167 return -EINVAL; 10168 params.p2p_opp_ps = tmp; 10169 if (params.p2p_opp_ps && 10170 !(rdev->wiphy.bss_param_support & WIPHY_BSS_PARAM_P2P_OPPPS)) 10171 return -EINVAL; 10172 } 10173 10174 if (!rdev->ops->change_bss) 10175 return -EOPNOTSUPP; 10176 10177 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 10178 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 10179 return -EOPNOTSUPP; 10180 10181 changed &= rdev->wiphy.bss_param_support; 10182 if (!changed) 10183 return 0; 10184 10185 return rdev_change_bss(rdev, dev, ¶ms); 10186 } 10187 10188 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info) 10189 { 10190 char *data = NULL; 10191 bool is_indoor; 10192 enum nl80211_user_reg_hint_type user_reg_hint_type; 10193 u32 owner_nlportid; 10194 10195 /* 10196 * You should only get this when cfg80211 hasn't yet initialized 10197 * completely when built-in to the kernel right between the time 10198 * window between nl80211_init() and regulatory_init(), if that is 10199 * even possible. 10200 */ 10201 if (unlikely(!rcu_access_pointer(cfg80211_regdomain))) 10202 return -EINPROGRESS; 10203 10204 user_reg_hint_type = 10205 nla_get_u32_default(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE], 10206 NL80211_USER_REG_HINT_USER); 10207 10208 switch (user_reg_hint_type) { 10209 case NL80211_USER_REG_HINT_USER: 10210 case NL80211_USER_REG_HINT_CELL_BASE: 10211 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 10212 return -EINVAL; 10213 10214 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 10215 return regulatory_hint_user(data, user_reg_hint_type); 10216 case NL80211_USER_REG_HINT_INDOOR: 10217 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 10218 owner_nlportid = info->snd_portid; 10219 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR]; 10220 } else { 10221 owner_nlportid = 0; 10222 is_indoor = true; 10223 } 10224 10225 regulatory_hint_indoor(is_indoor, owner_nlportid); 10226 return 0; 10227 default: 10228 return -EINVAL; 10229 } 10230 } 10231 10232 static int nl80211_reload_regdb(struct sk_buff *skb, struct genl_info *info) 10233 { 10234 return reg_reload_regdb(); 10235 } 10236 10237 static int nl80211_get_mesh_config(struct sk_buff *skb, 10238 struct genl_info *info) 10239 { 10240 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10241 struct net_device *dev = info->user_ptr[1]; 10242 struct wireless_dev *wdev = dev->ieee80211_ptr; 10243 struct mesh_config cur_params; 10244 int err = 0; 10245 void *hdr; 10246 struct nlattr *pinfoattr; 10247 struct sk_buff *msg; 10248 10249 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 10250 return -EOPNOTSUPP; 10251 10252 if (!rdev->ops->get_mesh_config) 10253 return -EOPNOTSUPP; 10254 10255 /* If not connected, get default parameters */ 10256 if (!wdev->u.mesh.id_len) 10257 memcpy(&cur_params, &default_mesh_config, sizeof(cur_params)); 10258 else 10259 err = rdev_get_mesh_config(rdev, dev, &cur_params); 10260 10261 if (err) 10262 return err; 10263 10264 /* Draw up a netlink message to send back */ 10265 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 10266 if (!msg) 10267 return -ENOMEM; 10268 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 10269 NL80211_CMD_GET_MESH_CONFIG); 10270 if (!hdr) 10271 goto out; 10272 pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MESH_CONFIG); 10273 if (!pinfoattr) 10274 goto nla_put_failure; 10275 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 10276 nla_put_u16(msg, NL80211_MESHCONF_RETRY_TIMEOUT, 10277 cur_params.dot11MeshRetryTimeout) || 10278 nla_put_u16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT, 10279 cur_params.dot11MeshConfirmTimeout) || 10280 nla_put_u16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT, 10281 cur_params.dot11MeshHoldingTimeout) || 10282 nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS, 10283 cur_params.dot11MeshMaxPeerLinks) || 10284 nla_put_u8(msg, NL80211_MESHCONF_MAX_RETRIES, 10285 cur_params.dot11MeshMaxRetries) || 10286 nla_put_u8(msg, NL80211_MESHCONF_TTL, 10287 cur_params.dot11MeshTTL) || 10288 nla_put_u8(msg, NL80211_MESHCONF_ELEMENT_TTL, 10289 cur_params.element_ttl) || 10290 nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS, 10291 cur_params.auto_open_plinks) || 10292 nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 10293 cur_params.dot11MeshNbrOffsetMaxNeighbor) || 10294 nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 10295 cur_params.dot11MeshHWMPmaxPREQretries) || 10296 nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME, 10297 cur_params.path_refresh_time) || 10298 nla_put_u16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 10299 cur_params.min_discovery_timeout) || 10300 nla_put_u32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 10301 cur_params.dot11MeshHWMPactivePathTimeout) || 10302 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 10303 cur_params.dot11MeshHWMPpreqMinInterval) || 10304 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 10305 cur_params.dot11MeshHWMPperrMinInterval) || 10306 nla_put_u16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 10307 cur_params.dot11MeshHWMPnetDiameterTraversalTime) || 10308 nla_put_u8(msg, NL80211_MESHCONF_HWMP_ROOTMODE, 10309 cur_params.dot11MeshHWMPRootMode) || 10310 nla_put_u16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL, 10311 cur_params.dot11MeshHWMPRannInterval) || 10312 nla_put_u8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 10313 cur_params.dot11MeshGateAnnouncementProtocol) || 10314 nla_put_u8(msg, NL80211_MESHCONF_FORWARDING, 10315 cur_params.dot11MeshForwarding) || 10316 nla_put_s32(msg, NL80211_MESHCONF_RSSI_THRESHOLD, 10317 cur_params.rssi_threshold) || 10318 nla_put_u32(msg, NL80211_MESHCONF_HT_OPMODE, 10319 cur_params.ht_opmode) || 10320 nla_put_u32(msg, NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 10321 cur_params.dot11MeshHWMPactivePathToRootTimeout) || 10322 nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 10323 cur_params.dot11MeshHWMProotInterval) || 10324 nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 10325 cur_params.dot11MeshHWMPconfirmationInterval) || 10326 nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE, 10327 cur_params.power_mode) || 10328 nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW, 10329 cur_params.dot11MeshAwakeWindowDuration) || 10330 nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT, 10331 cur_params.plink_timeout) || 10332 nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_GATE, 10333 cur_params.dot11MeshConnectedToMeshGate) || 10334 nla_put_u8(msg, NL80211_MESHCONF_NOLEARN, 10335 cur_params.dot11MeshNolearn) || 10336 nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_AS, 10337 cur_params.dot11MeshConnectedToAuthServer)) 10338 goto nla_put_failure; 10339 nla_nest_end(msg, pinfoattr); 10340 genlmsg_end(msg, hdr); 10341 return genlmsg_reply(msg, info); 10342 10343 nla_put_failure: 10344 out: 10345 nlmsg_free(msg); 10346 return -ENOBUFS; 10347 } 10348 10349 static const struct nla_policy 10350 nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = { 10351 [NL80211_MESHCONF_RETRY_TIMEOUT] = 10352 NLA_POLICY_RANGE(NLA_U16, 1, 255), 10353 [NL80211_MESHCONF_CONFIRM_TIMEOUT] = 10354 NLA_POLICY_RANGE(NLA_U16, 1, 255), 10355 [NL80211_MESHCONF_HOLDING_TIMEOUT] = 10356 NLA_POLICY_RANGE(NLA_U16, 1, 255), 10357 [NL80211_MESHCONF_MAX_PEER_LINKS] = 10358 NLA_POLICY_RANGE(NLA_U16, 0, 255), 10359 [NL80211_MESHCONF_MAX_RETRIES] = NLA_POLICY_MAX(NLA_U8, 16), 10360 [NL80211_MESHCONF_TTL] = NLA_POLICY_MIN(NLA_U8, 1), 10361 [NL80211_MESHCONF_ELEMENT_TTL] = NLA_POLICY_MIN(NLA_U8, 1), 10362 [NL80211_MESHCONF_AUTO_OPEN_PLINKS] = NLA_POLICY_MAX(NLA_U8, 1), 10363 [NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] = 10364 NLA_POLICY_RANGE(NLA_U32, 1, 255), 10365 [NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 }, 10366 [NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 }, 10367 [NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = NLA_POLICY_MIN(NLA_U16, 1), 10368 [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 }, 10369 [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = 10370 NLA_POLICY_MIN(NLA_U16, 1), 10371 [NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] = 10372 NLA_POLICY_MIN(NLA_U16, 1), 10373 [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = 10374 NLA_POLICY_MIN(NLA_U16, 1), 10375 [NL80211_MESHCONF_HWMP_ROOTMODE] = NLA_POLICY_MAX(NLA_U8, 4), 10376 [NL80211_MESHCONF_HWMP_RANN_INTERVAL] = 10377 NLA_POLICY_MIN(NLA_U16, 1), 10378 [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = NLA_POLICY_MAX(NLA_U8, 1), 10379 [NL80211_MESHCONF_FORWARDING] = NLA_POLICY_MAX(NLA_U8, 1), 10380 [NL80211_MESHCONF_RSSI_THRESHOLD] = 10381 NLA_POLICY_RANGE(NLA_S32, -255, 0), 10382 [NL80211_MESHCONF_HT_OPMODE] = { .type = NLA_U16 }, 10383 [NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 }, 10384 [NL80211_MESHCONF_HWMP_ROOT_INTERVAL] = 10385 NLA_POLICY_MIN(NLA_U16, 1), 10386 [NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] = 10387 NLA_POLICY_MIN(NLA_U16, 1), 10388 [NL80211_MESHCONF_POWER_MODE] = 10389 NLA_POLICY_RANGE(NLA_U32, 10390 NL80211_MESH_POWER_ACTIVE, 10391 NL80211_MESH_POWER_MAX), 10392 [NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 }, 10393 [NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 }, 10394 [NL80211_MESHCONF_CONNECTED_TO_GATE] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 10395 [NL80211_MESHCONF_NOLEARN] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 10396 [NL80211_MESHCONF_CONNECTED_TO_AS] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 10397 }; 10398 10399 static const struct nla_policy 10400 nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = { 10401 [NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 }, 10402 [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 }, 10403 [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 }, 10404 [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG }, 10405 [NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 }, 10406 [NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG }, 10407 [NL80211_MESH_SETUP_IE] = 10408 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 10409 IEEE80211_MAX_DATA_LEN), 10410 [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG }, 10411 }; 10412 10413 static int nl80211_parse_mesh_config(struct genl_info *info, 10414 struct mesh_config *cfg, 10415 u32 *mask_out) 10416 { 10417 struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1]; 10418 u32 mask = 0; 10419 u16 ht_opmode; 10420 10421 #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, mask, attr, fn) \ 10422 do { \ 10423 if (tb[attr]) { \ 10424 cfg->param = fn(tb[attr]); \ 10425 mask |= BIT((attr) - 1); \ 10426 } \ 10427 } while (0) 10428 10429 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) 10430 return -EINVAL; 10431 if (nla_parse_nested_deprecated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params_policy, info->extack)) 10432 return -EINVAL; 10433 10434 /* This makes sure that there aren't more than 32 mesh config 10435 * parameters (otherwise our bitfield scheme would not work.) */ 10436 BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32); 10437 10438 /* Fill in the params struct */ 10439 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout, mask, 10440 NL80211_MESHCONF_RETRY_TIMEOUT, nla_get_u16); 10441 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout, mask, 10442 NL80211_MESHCONF_CONFIRM_TIMEOUT, 10443 nla_get_u16); 10444 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout, mask, 10445 NL80211_MESHCONF_HOLDING_TIMEOUT, 10446 nla_get_u16); 10447 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks, mask, 10448 NL80211_MESHCONF_MAX_PEER_LINKS, 10449 nla_get_u16); 10450 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries, mask, 10451 NL80211_MESHCONF_MAX_RETRIES, nla_get_u8); 10452 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL, mask, 10453 NL80211_MESHCONF_TTL, nla_get_u8); 10454 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl, mask, 10455 NL80211_MESHCONF_ELEMENT_TTL, nla_get_u8); 10456 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks, mask, 10457 NL80211_MESHCONF_AUTO_OPEN_PLINKS, 10458 nla_get_u8); 10459 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor, 10460 mask, 10461 NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 10462 nla_get_u32); 10463 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries, mask, 10464 NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 10465 nla_get_u8); 10466 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time, mask, 10467 NL80211_MESHCONF_PATH_REFRESH_TIME, 10468 nla_get_u32); 10469 if (mask & BIT(NL80211_MESHCONF_PATH_REFRESH_TIME) && 10470 (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535)) 10471 return -EINVAL; 10472 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout, mask, 10473 NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 10474 nla_get_u16); 10475 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout, 10476 mask, 10477 NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 10478 nla_get_u32); 10479 if (mask & BIT(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT) && 10480 (cfg->dot11MeshHWMPactivePathTimeout < 1 || 10481 cfg->dot11MeshHWMPactivePathTimeout > 65535)) 10482 return -EINVAL; 10483 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval, mask, 10484 NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 10485 nla_get_u16); 10486 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPperrMinInterval, mask, 10487 NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 10488 nla_get_u16); 10489 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 10490 dot11MeshHWMPnetDiameterTraversalTime, mask, 10491 NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 10492 nla_get_u16); 10493 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRootMode, mask, 10494 NL80211_MESHCONF_HWMP_ROOTMODE, nla_get_u8); 10495 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRannInterval, mask, 10496 NL80211_MESHCONF_HWMP_RANN_INTERVAL, 10497 nla_get_u16); 10498 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshGateAnnouncementProtocol, 10499 mask, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 10500 nla_get_u8); 10501 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, mask, 10502 NL80211_MESHCONF_FORWARDING, nla_get_u8); 10503 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, mask, 10504 NL80211_MESHCONF_RSSI_THRESHOLD, 10505 nla_get_s32); 10506 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToMeshGate, mask, 10507 NL80211_MESHCONF_CONNECTED_TO_GATE, 10508 nla_get_u8); 10509 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToAuthServer, mask, 10510 NL80211_MESHCONF_CONNECTED_TO_AS, 10511 nla_get_u8); 10512 /* 10513 * Check HT operation mode based on 10514 * IEEE 802.11-2016 9.4.2.57 HT Operation element. 10515 */ 10516 if (tb[NL80211_MESHCONF_HT_OPMODE]) { 10517 ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]); 10518 10519 if (ht_opmode & ~(IEEE80211_HT_OP_MODE_PROTECTION | 10520 IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT | 10521 IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)) 10522 return -EINVAL; 10523 10524 /* NON_HT_STA bit is reserved, but some programs set it */ 10525 ht_opmode &= ~IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT; 10526 10527 cfg->ht_opmode = ht_opmode; 10528 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); 10529 } 10530 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 10531 dot11MeshHWMPactivePathToRootTimeout, mask, 10532 NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 10533 nla_get_u32); 10534 if (mask & BIT(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT) && 10535 (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 || 10536 cfg->dot11MeshHWMPactivePathToRootTimeout > 65535)) 10537 return -EINVAL; 10538 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMProotInterval, mask, 10539 NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 10540 nla_get_u16); 10541 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPconfirmationInterval, 10542 mask, 10543 NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 10544 nla_get_u16); 10545 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode, mask, 10546 NL80211_MESHCONF_POWER_MODE, nla_get_u32); 10547 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration, mask, 10548 NL80211_MESHCONF_AWAKE_WINDOW, nla_get_u16); 10549 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, plink_timeout, mask, 10550 NL80211_MESHCONF_PLINK_TIMEOUT, nla_get_u32); 10551 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNolearn, mask, 10552 NL80211_MESHCONF_NOLEARN, nla_get_u8); 10553 if (mask_out) 10554 *mask_out = mask; 10555 10556 return 0; 10557 10558 #undef FILL_IN_MESH_PARAM_IF_SET 10559 } 10560 10561 static int nl80211_parse_mesh_setup(struct genl_info *info, 10562 struct mesh_setup *setup) 10563 { 10564 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10565 struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1]; 10566 10567 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) 10568 return -EINVAL; 10569 if (nla_parse_nested_deprecated(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_params_policy, info->extack)) 10570 return -EINVAL; 10571 10572 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC]) 10573 setup->sync_method = 10574 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ? 10575 IEEE80211_SYNC_METHOD_VENDOR : 10576 IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET; 10577 10578 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL]) 10579 setup->path_sel_proto = 10580 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ? 10581 IEEE80211_PATH_PROTOCOL_VENDOR : 10582 IEEE80211_PATH_PROTOCOL_HWMP; 10583 10584 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC]) 10585 setup->path_metric = 10586 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ? 10587 IEEE80211_PATH_METRIC_VENDOR : 10588 IEEE80211_PATH_METRIC_AIRTIME; 10589 10590 if (tb[NL80211_MESH_SETUP_IE]) { 10591 struct nlattr *ieattr = 10592 tb[NL80211_MESH_SETUP_IE]; 10593 setup->ie = nla_data(ieattr); 10594 setup->ie_len = nla_len(ieattr); 10595 } 10596 if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] && 10597 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) 10598 return -EINVAL; 10599 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); 10600 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); 10601 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); 10602 if (setup->is_secure) 10603 setup->user_mpm = true; 10604 10605 if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) { 10606 if (!setup->user_mpm) 10607 return -EINVAL; 10608 setup->auth_id = 10609 nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]); 10610 } 10611 10612 return 0; 10613 } 10614 10615 static int nl80211_update_mesh_config(struct sk_buff *skb, 10616 struct genl_info *info) 10617 { 10618 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10619 struct net_device *dev = info->user_ptr[1]; 10620 struct wireless_dev *wdev = dev->ieee80211_ptr; 10621 struct mesh_config cfg = {}; 10622 u32 mask; 10623 int err; 10624 10625 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 10626 return -EOPNOTSUPP; 10627 10628 if (!rdev->ops->update_mesh_config) 10629 return -EOPNOTSUPP; 10630 10631 err = nl80211_parse_mesh_config(info, &cfg, &mask); 10632 if (err) 10633 return err; 10634 10635 if (!wdev->u.mesh.id_len) 10636 err = -ENOLINK; 10637 10638 if (!err) 10639 err = rdev_update_mesh_config(rdev, dev, mask, &cfg); 10640 10641 return err; 10642 } 10643 10644 static int nl80211_put_regdom(const struct ieee80211_regdomain *regdom, 10645 struct sk_buff *msg) 10646 { 10647 struct nlattr *nl_reg_rules; 10648 unsigned int i; 10649 10650 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || 10651 (regdom->dfs_region && 10652 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) 10653 goto nla_put_failure; 10654 10655 nl_reg_rules = nla_nest_start_noflag(msg, NL80211_ATTR_REG_RULES); 10656 if (!nl_reg_rules) 10657 goto nla_put_failure; 10658 10659 for (i = 0; i < regdom->n_reg_rules; i++) { 10660 struct nlattr *nl_reg_rule; 10661 const struct ieee80211_reg_rule *reg_rule; 10662 const struct ieee80211_freq_range *freq_range; 10663 const struct ieee80211_power_rule *power_rule; 10664 unsigned int max_bandwidth_khz; 10665 10666 reg_rule = ®dom->reg_rules[i]; 10667 freq_range = ®_rule->freq_range; 10668 power_rule = ®_rule->power_rule; 10669 10670 nl_reg_rule = nla_nest_start_noflag(msg, i); 10671 if (!nl_reg_rule) 10672 goto nla_put_failure; 10673 10674 max_bandwidth_khz = freq_range->max_bandwidth_khz; 10675 if (!max_bandwidth_khz) 10676 max_bandwidth_khz = reg_get_max_bandwidth(regdom, 10677 reg_rule); 10678 10679 if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS, 10680 reg_rule->flags) || 10681 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START, 10682 freq_range->start_freq_khz) || 10683 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END, 10684 freq_range->end_freq_khz) || 10685 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW, 10686 max_bandwidth_khz) || 10687 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN, 10688 power_rule->max_antenna_gain) || 10689 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP, 10690 power_rule->max_eirp) || 10691 nla_put_u32(msg, NL80211_ATTR_DFS_CAC_TIME, 10692 reg_rule->dfs_cac_ms)) 10693 goto nla_put_failure; 10694 10695 if ((reg_rule->flags & NL80211_RRF_PSD) && 10696 nla_put_s8(msg, NL80211_ATTR_POWER_RULE_PSD, 10697 reg_rule->psd)) 10698 goto nla_put_failure; 10699 10700 nla_nest_end(msg, nl_reg_rule); 10701 } 10702 10703 nla_nest_end(msg, nl_reg_rules); 10704 return 0; 10705 10706 nla_put_failure: 10707 return -EMSGSIZE; 10708 } 10709 10710 static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info) 10711 { 10712 const struct ieee80211_regdomain *regdom = NULL; 10713 struct cfg80211_registered_device *rdev; 10714 struct wiphy *wiphy = NULL; 10715 struct sk_buff *msg; 10716 int err = -EMSGSIZE; 10717 void *hdr; 10718 10719 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 10720 if (!msg) 10721 return -ENOBUFS; 10722 10723 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 10724 NL80211_CMD_GET_REG); 10725 if (!hdr) 10726 goto put_failure; 10727 10728 rtnl_lock(); 10729 10730 if (info->attrs[NL80211_ATTR_WIPHY]) { 10731 bool self_managed; 10732 10733 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 10734 if (IS_ERR(rdev)) { 10735 err = PTR_ERR(rdev); 10736 goto nla_put_failure; 10737 } 10738 10739 wiphy = &rdev->wiphy; 10740 self_managed = wiphy->regulatory_flags & 10741 REGULATORY_WIPHY_SELF_MANAGED; 10742 10743 rcu_read_lock(); 10744 10745 regdom = get_wiphy_regdom(wiphy); 10746 10747 /* a self-managed-reg device must have a private regdom */ 10748 if (WARN_ON(!regdom && self_managed)) { 10749 err = -EINVAL; 10750 goto nla_put_failure_rcu; 10751 } 10752 10753 if (regdom && 10754 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 10755 goto nla_put_failure_rcu; 10756 } else { 10757 rcu_read_lock(); 10758 } 10759 10760 if (!wiphy && reg_last_request_cell_base() && 10761 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 10762 NL80211_USER_REG_HINT_CELL_BASE)) 10763 goto nla_put_failure_rcu; 10764 10765 if (!regdom) 10766 regdom = rcu_dereference(cfg80211_regdomain); 10767 10768 if (nl80211_put_regdom(regdom, msg)) 10769 goto nla_put_failure_rcu; 10770 10771 rcu_read_unlock(); 10772 10773 genlmsg_end(msg, hdr); 10774 rtnl_unlock(); 10775 return genlmsg_reply(msg, info); 10776 10777 nla_put_failure_rcu: 10778 rcu_read_unlock(); 10779 nla_put_failure: 10780 rtnl_unlock(); 10781 put_failure: 10782 nlmsg_free(msg); 10783 return err; 10784 } 10785 10786 static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb, 10787 u32 seq, int flags, struct wiphy *wiphy, 10788 const struct ieee80211_regdomain *regdom) 10789 { 10790 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 10791 NL80211_CMD_GET_REG); 10792 10793 if (!hdr) 10794 return -1; 10795 10796 genl_dump_check_consistent(cb, hdr); 10797 10798 if (nl80211_put_regdom(regdom, msg)) 10799 goto nla_put_failure; 10800 10801 if (!wiphy && reg_last_request_cell_base() && 10802 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 10803 NL80211_USER_REG_HINT_CELL_BASE)) 10804 goto nla_put_failure; 10805 10806 if (wiphy && 10807 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 10808 goto nla_put_failure; 10809 10810 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 10811 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 10812 goto nla_put_failure; 10813 10814 genlmsg_end(msg, hdr); 10815 return 0; 10816 10817 nla_put_failure: 10818 genlmsg_cancel(msg, hdr); 10819 return -EMSGSIZE; 10820 } 10821 10822 static int nl80211_get_reg_dump(struct sk_buff *skb, 10823 struct netlink_callback *cb) 10824 { 10825 const struct ieee80211_regdomain *regdom = NULL; 10826 struct cfg80211_registered_device *rdev; 10827 int err, reg_idx, start = cb->args[2]; 10828 10829 rcu_read_lock(); 10830 10831 if (cfg80211_regdomain && start == 0) { 10832 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, 10833 NLM_F_MULTI, NULL, 10834 rcu_dereference(cfg80211_regdomain)); 10835 if (err < 0) 10836 goto out_err; 10837 } 10838 10839 /* the global regdom is idx 0 */ 10840 reg_idx = 1; 10841 list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) { 10842 regdom = get_wiphy_regdom(&rdev->wiphy); 10843 if (!regdom) 10844 continue; 10845 10846 if (++reg_idx <= start) 10847 continue; 10848 10849 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, 10850 NLM_F_MULTI, &rdev->wiphy, regdom); 10851 if (err < 0) { 10852 reg_idx--; 10853 break; 10854 } 10855 } 10856 10857 cb->args[2] = reg_idx; 10858 err = skb->len; 10859 out_err: 10860 rcu_read_unlock(); 10861 return err; 10862 } 10863 10864 #ifdef CONFIG_CFG80211_CRDA_SUPPORT 10865 static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = { 10866 [NL80211_ATTR_REG_RULE_FLAGS] = { .type = NLA_U32 }, 10867 [NL80211_ATTR_FREQ_RANGE_START] = { .type = NLA_U32 }, 10868 [NL80211_ATTR_FREQ_RANGE_END] = { .type = NLA_U32 }, 10869 [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 }, 10870 [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 }, 10871 [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 }, 10872 [NL80211_ATTR_DFS_CAC_TIME] = { .type = NLA_U32 }, 10873 }; 10874 10875 static int parse_reg_rule(struct nlattr *tb[], 10876 struct ieee80211_reg_rule *reg_rule) 10877 { 10878 struct ieee80211_freq_range *freq_range = ®_rule->freq_range; 10879 struct ieee80211_power_rule *power_rule = ®_rule->power_rule; 10880 10881 if (!tb[NL80211_ATTR_REG_RULE_FLAGS]) 10882 return -EINVAL; 10883 if (!tb[NL80211_ATTR_FREQ_RANGE_START]) 10884 return -EINVAL; 10885 if (!tb[NL80211_ATTR_FREQ_RANGE_END]) 10886 return -EINVAL; 10887 if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]) 10888 return -EINVAL; 10889 if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]) 10890 return -EINVAL; 10891 10892 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); 10893 10894 freq_range->start_freq_khz = 10895 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]); 10896 freq_range->end_freq_khz = 10897 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]); 10898 freq_range->max_bandwidth_khz = 10899 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]); 10900 10901 power_rule->max_eirp = 10902 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]); 10903 10904 if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]) 10905 power_rule->max_antenna_gain = 10906 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]); 10907 10908 if (tb[NL80211_ATTR_DFS_CAC_TIME]) 10909 reg_rule->dfs_cac_ms = 10910 nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]); 10911 10912 return 0; 10913 } 10914 10915 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info) 10916 { 10917 struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1]; 10918 struct nlattr *nl_reg_rule; 10919 char *alpha2; 10920 int rem_reg_rules, r; 10921 u32 num_rules = 0, rule_idx = 0; 10922 enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET; 10923 struct ieee80211_regdomain *rd; 10924 10925 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 10926 return -EINVAL; 10927 10928 if (!info->attrs[NL80211_ATTR_REG_RULES]) 10929 return -EINVAL; 10930 10931 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 10932 10933 if (info->attrs[NL80211_ATTR_DFS_REGION]) 10934 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); 10935 10936 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 10937 rem_reg_rules) { 10938 num_rules++; 10939 if (num_rules > NL80211_MAX_SUPP_REG_RULES) 10940 return -EINVAL; 10941 } 10942 10943 rtnl_lock(); 10944 if (!reg_is_valid_request(alpha2)) { 10945 r = -EINVAL; 10946 goto out; 10947 } 10948 10949 rd = kzalloc_flex(*rd, reg_rules, num_rules); 10950 if (!rd) { 10951 r = -ENOMEM; 10952 goto out; 10953 } 10954 10955 rd->n_reg_rules = num_rules; 10956 rd->alpha2[0] = alpha2[0]; 10957 rd->alpha2[1] = alpha2[1]; 10958 10959 /* 10960 * Disable DFS master mode if the DFS region was 10961 * not supported or known on this kernel. 10962 */ 10963 if (reg_supported_dfs_region(dfs_region)) 10964 rd->dfs_region = dfs_region; 10965 10966 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 10967 rem_reg_rules) { 10968 r = nla_parse_nested_deprecated(tb, NL80211_REG_RULE_ATTR_MAX, 10969 nl_reg_rule, reg_rule_policy, 10970 info->extack); 10971 if (r) 10972 goto bad_reg; 10973 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); 10974 if (r) 10975 goto bad_reg; 10976 10977 rule_idx++; 10978 10979 if (rule_idx > NL80211_MAX_SUPP_REG_RULES) { 10980 r = -EINVAL; 10981 goto bad_reg; 10982 } 10983 } 10984 10985 r = set_regdom(rd, REGD_SOURCE_CRDA); 10986 /* set_regdom takes ownership of rd */ 10987 rd = NULL; 10988 bad_reg: 10989 kfree(rd); 10990 out: 10991 rtnl_unlock(); 10992 return r; 10993 } 10994 #endif /* CONFIG_CFG80211_CRDA_SUPPORT */ 10995 10996 static int validate_scan_freqs(struct nlattr *freqs) 10997 { 10998 struct nlattr *attr1, *attr2; 10999 int n_channels = 0, tmp1, tmp2; 11000 11001 nla_for_each_nested(attr1, freqs, tmp1) 11002 if (nla_len(attr1) != sizeof(u32)) 11003 return 0; 11004 11005 nla_for_each_nested(attr1, freqs, tmp1) { 11006 n_channels++; 11007 /* 11008 * Some hardware has a limited channel list for 11009 * scanning, and it is pretty much nonsensical 11010 * to scan for a channel twice, so disallow that 11011 * and don't require drivers to check that the 11012 * channel list they get isn't longer than what 11013 * they can scan, as long as they can scan all 11014 * the channels they registered at once. 11015 */ 11016 nla_for_each_nested(attr2, freqs, tmp2) 11017 if (attr1 != attr2 && 11018 nla_get_u32(attr1) == nla_get_u32(attr2)) 11019 return 0; 11020 } 11021 11022 return n_channels; 11023 } 11024 11025 static bool is_band_valid(struct wiphy *wiphy, enum nl80211_band b) 11026 { 11027 return b < NUM_NL80211_BANDS && wiphy->bands[b]; 11028 } 11029 11030 static int parse_bss_select(struct nlattr *nla, struct wiphy *wiphy, 11031 struct cfg80211_bss_selection *bss_select) 11032 { 11033 struct nlattr *attr[NL80211_BSS_SELECT_ATTR_MAX + 1]; 11034 struct nlattr *nest; 11035 int err; 11036 bool found = false; 11037 int i; 11038 11039 /* only process one nested attribute */ 11040 nest = nla_data(nla); 11041 if (!nla_ok(nest, nla_len(nest))) 11042 return -EINVAL; 11043 11044 err = nla_parse_nested_deprecated(attr, NL80211_BSS_SELECT_ATTR_MAX, 11045 nest, nl80211_bss_select_policy, 11046 NULL); 11047 if (err) 11048 return err; 11049 11050 /* only one attribute may be given */ 11051 for (i = 0; i <= NL80211_BSS_SELECT_ATTR_MAX; i++) { 11052 if (attr[i]) { 11053 if (found) 11054 return -EINVAL; 11055 found = true; 11056 } 11057 } 11058 11059 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID; 11060 11061 if (attr[NL80211_BSS_SELECT_ATTR_RSSI]) 11062 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI; 11063 11064 if (attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]) { 11065 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF; 11066 bss_select->param.band_pref = 11067 nla_get_u32(attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]); 11068 if (!is_band_valid(wiphy, bss_select->param.band_pref)) 11069 return -EINVAL; 11070 } 11071 11072 if (attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]) { 11073 struct nl80211_bss_select_rssi_adjust *adj_param; 11074 11075 adj_param = nla_data(attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]); 11076 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST; 11077 bss_select->param.adjust.band = adj_param->band; 11078 bss_select->param.adjust.delta = adj_param->delta; 11079 if (!is_band_valid(wiphy, bss_select->param.adjust.band)) 11080 return -EINVAL; 11081 } 11082 11083 /* user-space did not provide behaviour attribute */ 11084 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID) 11085 return -EINVAL; 11086 11087 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour))) 11088 return -EINVAL; 11089 11090 return 0; 11091 } 11092 11093 int nl80211_parse_random_mac(struct nlattr **attrs, 11094 u8 *mac_addr, u8 *mac_addr_mask) 11095 { 11096 int i; 11097 11098 if (!attrs[NL80211_ATTR_MAC] && !attrs[NL80211_ATTR_MAC_MASK]) { 11099 eth_zero_addr(mac_addr); 11100 eth_zero_addr(mac_addr_mask); 11101 mac_addr[0] = 0x2; 11102 mac_addr_mask[0] = 0x3; 11103 11104 return 0; 11105 } 11106 11107 /* need both or none */ 11108 if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_MAC_MASK]) 11109 return -EINVAL; 11110 11111 memcpy(mac_addr, nla_data(attrs[NL80211_ATTR_MAC]), ETH_ALEN); 11112 memcpy(mac_addr_mask, nla_data(attrs[NL80211_ATTR_MAC_MASK]), ETH_ALEN); 11113 11114 /* don't allow or configure an mcast address */ 11115 if (!is_multicast_ether_addr(mac_addr_mask) || 11116 is_multicast_ether_addr(mac_addr)) 11117 return -EINVAL; 11118 11119 /* 11120 * allow users to pass a MAC address that has bits set outside 11121 * of the mask, but don't bother drivers with having to deal 11122 * with such bits 11123 */ 11124 for (i = 0; i < ETH_ALEN; i++) 11125 mac_addr[i] &= mac_addr_mask[i]; 11126 11127 return 0; 11128 } 11129 11130 static bool cfg80211_off_channel_oper_allowed(struct wireless_dev *wdev, 11131 struct ieee80211_channel *chan) 11132 { 11133 unsigned int link_id; 11134 bool all_ok = true; 11135 int radio_idx; 11136 11137 lockdep_assert_wiphy(wdev->wiphy); 11138 11139 if (!cfg80211_wdev_channel_allowed(wdev, chan)) 11140 return false; 11141 11142 if (!cfg80211_beaconing_iface_active(wdev)) 11143 return true; 11144 11145 radio_idx = cfg80211_get_radio_idx_by_chan(wdev->wiphy, chan); 11146 11147 /* 11148 * FIXME: check if we have a free radio/link for chan 11149 * 11150 * This, as well as the FIXME below, requires knowing the link 11151 * capabilities of the hardware. 11152 */ 11153 11154 /* we cannot leave radar channels */ 11155 for_each_valid_link(wdev, link_id) { 11156 struct cfg80211_chan_def *chandef; 11157 int link_radio_idx; 11158 11159 chandef = wdev_chandef(wdev, link_id); 11160 if (!chandef || !chandef->chan) 11161 continue; 11162 11163 if (!(chandef->chan->flags & IEEE80211_CHAN_RADAR)) 11164 continue; 11165 11166 /* 11167 * chandef->chan is a radar channel. If the radio/link onto 11168 * which this radar channel falls is the same radio/link onto 11169 * which the input 'chan' falls, off-channel operation should 11170 * not be allowed. Hence, set 'all_ok' to false. 11171 */ 11172 11173 link_radio_idx = cfg80211_get_radio_idx_by_chan(wdev->wiphy, 11174 chandef->chan); 11175 if (link_radio_idx == radio_idx) { 11176 all_ok = false; 11177 break; 11178 } 11179 } 11180 11181 if (all_ok) 11182 return true; 11183 11184 return regulatory_pre_cac_allowed(wdev->wiphy); 11185 } 11186 11187 static bool nl80211_check_scan_feat(struct wiphy *wiphy, u32 flags, u32 flag, 11188 enum nl80211_ext_feature_index feat) 11189 { 11190 if (!(flags & flag)) 11191 return true; 11192 if (wiphy_ext_feature_isset(wiphy, feat)) 11193 return true; 11194 return false; 11195 } 11196 11197 static int 11198 nl80211_check_scan_flags(struct wiphy *wiphy, struct wireless_dev *wdev, 11199 struct nlattr **attrs, u8 *mac_addr, u8 *mac_addr_mask, 11200 u32 *flags, enum nl80211_feature_flags randomness_flag) 11201 { 11202 if (!attrs[NL80211_ATTR_SCAN_FLAGS]) 11203 return 0; 11204 11205 *flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]); 11206 11207 if (((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) && 11208 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) || 11209 !nl80211_check_scan_feat(wiphy, *flags, 11210 NL80211_SCAN_FLAG_LOW_SPAN, 11211 NL80211_EXT_FEATURE_LOW_SPAN_SCAN) || 11212 !nl80211_check_scan_feat(wiphy, *flags, 11213 NL80211_SCAN_FLAG_LOW_POWER, 11214 NL80211_EXT_FEATURE_LOW_POWER_SCAN) || 11215 !nl80211_check_scan_feat(wiphy, *flags, 11216 NL80211_SCAN_FLAG_HIGH_ACCURACY, 11217 NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN) || 11218 !nl80211_check_scan_feat(wiphy, *flags, 11219 NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME, 11220 NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME) || 11221 !nl80211_check_scan_feat(wiphy, *flags, 11222 NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP, 11223 NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP) || 11224 !nl80211_check_scan_feat(wiphy, *flags, 11225 NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION, 11226 NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION) || 11227 !nl80211_check_scan_feat(wiphy, *flags, 11228 NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE, 11229 NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE) || 11230 !nl80211_check_scan_feat(wiphy, *flags, 11231 NL80211_SCAN_FLAG_RANDOM_SN, 11232 NL80211_EXT_FEATURE_SCAN_RANDOM_SN) || 11233 !nl80211_check_scan_feat(wiphy, *flags, 11234 NL80211_SCAN_FLAG_MIN_PREQ_CONTENT, 11235 NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT)) 11236 return -EOPNOTSUPP; 11237 11238 if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { 11239 int err; 11240 11241 if (!(wiphy->features & randomness_flag) || 11242 (wdev && wdev->connected)) 11243 return -EOPNOTSUPP; 11244 11245 err = nl80211_parse_random_mac(attrs, mac_addr, mac_addr_mask); 11246 if (err) 11247 return err; 11248 } 11249 11250 return 0; 11251 } 11252 11253 static int 11254 nl80211_check_scan_flags_sched(struct wiphy *wiphy, struct wireless_dev *wdev, 11255 struct nlattr **attrs, 11256 struct cfg80211_sched_scan_request *req) 11257 { 11258 return nl80211_check_scan_flags(wiphy, wdev, attrs, 11259 req->mac_addr, req->mac_addr_mask, 11260 &req->flags, 11261 wdev ? NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR : 11262 NL80211_FEATURE_ND_RANDOM_MAC_ADDR); 11263 } 11264 11265 static int 11266 nl80211_check_scan_flags_reg(struct wiphy *wiphy, struct wireless_dev *wdev, 11267 struct nlattr **attrs, 11268 struct cfg80211_scan_request_int *req) 11269 { 11270 return nl80211_check_scan_flags(wiphy, wdev, attrs, 11271 req->req.mac_addr, 11272 req->req.mac_addr_mask, 11273 &req->req.flags, 11274 NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR); 11275 } 11276 11277 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) 11278 { 11279 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11280 struct wireless_dev *wdev = info->user_ptr[1]; 11281 struct cfg80211_scan_request_int *request; 11282 struct nlattr *scan_freqs = NULL; 11283 bool scan_freqs_khz = false; 11284 struct nlattr *attr; 11285 struct wiphy *wiphy; 11286 int err, tmp, n_ssids = 0, n_channels, i; 11287 size_t ie_len, size; 11288 size_t ssids_offset, ie_offset; 11289 11290 wiphy = &rdev->wiphy; 11291 11292 if (wdev->iftype == NL80211_IFTYPE_NAN || 11293 wdev->iftype == NL80211_IFTYPE_PD) 11294 return -EOPNOTSUPP; 11295 11296 if (!rdev->ops->scan) 11297 return -EOPNOTSUPP; 11298 11299 if (rdev->scan_req || rdev->scan_msg) 11300 return -EBUSY; 11301 11302 if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) { 11303 if (!wiphy_ext_feature_isset(wiphy, 11304 NL80211_EXT_FEATURE_SCAN_FREQ_KHZ)) 11305 return -EOPNOTSUPP; 11306 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]; 11307 scan_freqs_khz = true; 11308 } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) 11309 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]; 11310 11311 if (scan_freqs) { 11312 n_channels = validate_scan_freqs(scan_freqs); 11313 if (!n_channels) 11314 return -EINVAL; 11315 } else { 11316 n_channels = ieee80211_get_num_supported_channels(wiphy); 11317 } 11318 11319 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) 11320 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) 11321 n_ssids++; 11322 11323 if (n_ssids > wiphy->max_scan_ssids) 11324 return -EINVAL; 11325 11326 if (info->attrs[NL80211_ATTR_IE]) 11327 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 11328 else 11329 ie_len = 0; 11330 11331 if (ie_len > wiphy->max_scan_ie_len) 11332 return -EINVAL; 11333 11334 size = struct_size(request, req.channels, n_channels); 11335 ssids_offset = size; 11336 size = size_add(size, array_size(sizeof(*request->req.ssids), n_ssids)); 11337 ie_offset = size; 11338 size = size_add(size, ie_len); 11339 request = kzalloc(size, GFP_KERNEL); 11340 if (!request) 11341 return -ENOMEM; 11342 11343 if (n_ssids) 11344 request->req.ssids = (void *)request + ssids_offset; 11345 request->req.n_ssids = n_ssids; 11346 if (ie_len) 11347 request->req.ie = (void *)request + ie_offset; 11348 11349 i = 0; 11350 if (scan_freqs) { 11351 /* user specified, bail out if channel not found */ 11352 nla_for_each_nested(attr, scan_freqs, tmp) { 11353 struct ieee80211_channel *chan; 11354 int freq = nla_get_u32(attr); 11355 11356 if (!scan_freqs_khz) 11357 freq = MHZ_TO_KHZ(freq); 11358 11359 chan = ieee80211_get_channel_khz(wiphy, freq); 11360 if (!chan) { 11361 err = -EINVAL; 11362 goto out_free; 11363 } 11364 11365 /* Ignore disabled / no primary channels */ 11366 if (chan->flags & IEEE80211_CHAN_DISABLED || 11367 chan->flags & IEEE80211_CHAN_S1G_NO_PRIMARY || 11368 !cfg80211_wdev_channel_allowed(wdev, chan)) 11369 continue; 11370 11371 request->req.channels[i] = chan; 11372 i++; 11373 } 11374 } else { 11375 enum nl80211_band band; 11376 11377 /* all channels */ 11378 for (band = 0; band < NUM_NL80211_BANDS; band++) { 11379 int j; 11380 11381 if (!wiphy->bands[band]) 11382 continue; 11383 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 11384 struct ieee80211_channel *chan; 11385 11386 chan = &wiphy->bands[band]->channels[j]; 11387 11388 if (chan->flags & IEEE80211_CHAN_DISABLED || 11389 chan->flags & 11390 IEEE80211_CHAN_S1G_NO_PRIMARY || 11391 !cfg80211_wdev_channel_allowed(wdev, chan)) 11392 continue; 11393 11394 request->req.channels[i] = chan; 11395 i++; 11396 } 11397 } 11398 } 11399 11400 if (!i) { 11401 err = -EINVAL; 11402 goto out_free; 11403 } 11404 11405 request->req.n_channels = i; 11406 11407 for (i = 0; i < request->req.n_channels; i++) { 11408 struct ieee80211_channel *chan = request->req.channels[i]; 11409 11410 /* if we can go off-channel to the target channel we're good */ 11411 if (cfg80211_off_channel_oper_allowed(wdev, chan)) 11412 continue; 11413 11414 if (!cfg80211_wdev_on_sub_chan(wdev, chan, true)) { 11415 err = -EBUSY; 11416 goto out_free; 11417 } 11418 } 11419 11420 i = 0; 11421 if (n_ssids) { 11422 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { 11423 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 11424 err = -EINVAL; 11425 goto out_free; 11426 } 11427 request->req.ssids[i].ssid_len = nla_len(attr); 11428 memcpy(request->req.ssids[i].ssid, 11429 nla_data(attr), nla_len(attr)); 11430 i++; 11431 } 11432 } 11433 11434 if (info->attrs[NL80211_ATTR_IE]) { 11435 request->req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 11436 memcpy((void *)request->req.ie, 11437 nla_data(info->attrs[NL80211_ATTR_IE]), 11438 request->req.ie_len); 11439 } 11440 11441 for (i = 0; i < NUM_NL80211_BANDS; i++) 11442 if (wiphy->bands[i]) 11443 request->req.rates[i] = 11444 (1 << wiphy->bands[i]->n_bitrates) - 1; 11445 11446 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { 11447 nla_for_each_nested(attr, 11448 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], 11449 tmp) { 11450 int band = nla_type(attr); 11451 11452 if (band < 0 || band >= NUM_NL80211_BANDS) { 11453 err = -EINVAL; 11454 goto out_free; 11455 } 11456 11457 if (!wiphy->bands[band]) 11458 continue; 11459 11460 err = ieee80211_get_ratemask(wiphy->bands[band], 11461 nla_data(attr), 11462 nla_len(attr), 11463 &request->req.rates[band]); 11464 if (err) 11465 goto out_free; 11466 } 11467 } 11468 11469 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { 11470 request->req.duration = 11471 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); 11472 request->req.duration_mandatory = 11473 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); 11474 } 11475 11476 err = nl80211_check_scan_flags_reg(wiphy, wdev, info->attrs, request); 11477 if (err) 11478 goto out_free; 11479 11480 request->req.no_cck = 11481 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 11482 11483 /* Initial implementation used NL80211_ATTR_MAC to set the specific 11484 * BSSID to scan for. This was problematic because that same attribute 11485 * was already used for another purpose (local random MAC address). The 11486 * NL80211_ATTR_BSSID attribute was added to fix this. For backwards 11487 * compatibility with older userspace components, also use the 11488 * NL80211_ATTR_MAC value here if it can be determined to be used for 11489 * the specific BSSID use case instead of the random MAC address 11490 * (NL80211_ATTR_SCAN_FLAGS is used to enable random MAC address use). 11491 */ 11492 if (info->attrs[NL80211_ATTR_BSSID]) 11493 memcpy(request->req.bssid, 11494 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); 11495 else if (!(request->req.flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && 11496 info->attrs[NL80211_ATTR_MAC]) 11497 memcpy(request->req.bssid, 11498 nla_data(info->attrs[NL80211_ATTR_MAC]), 11499 ETH_ALEN); 11500 else 11501 eth_broadcast_addr(request->req.bssid); 11502 11503 request->req.tsf_report_link_id = 11504 nl80211_link_id_or_invalid(info->attrs); 11505 request->req.wdev = wdev; 11506 request->req.wiphy = &rdev->wiphy; 11507 request->req.scan_start = jiffies; 11508 11509 rdev->scan_req = request; 11510 err = cfg80211_scan(rdev); 11511 11512 if (err) 11513 goto out_free; 11514 11515 nl80211_send_scan_start(rdev, wdev); 11516 dev_hold(wdev->netdev); 11517 11518 return 0; 11519 11520 out_free: 11521 rdev->scan_req = NULL; 11522 kfree(request); 11523 11524 return err; 11525 } 11526 11527 static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info) 11528 { 11529 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11530 struct wireless_dev *wdev = info->user_ptr[1]; 11531 11532 if (!rdev->ops->abort_scan) 11533 return -EOPNOTSUPP; 11534 11535 if (rdev->scan_msg) 11536 return 0; 11537 11538 if (!rdev->scan_req) 11539 return -ENOENT; 11540 11541 rdev_abort_scan(rdev, wdev); 11542 return 0; 11543 } 11544 11545 static int 11546 nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans, 11547 struct cfg80211_sched_scan_request *request, 11548 struct nlattr **attrs) 11549 { 11550 int tmp, err, i = 0; 11551 struct nlattr *attr; 11552 11553 if (!attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) { 11554 u32 interval; 11555 11556 /* 11557 * If scan plans are not specified, 11558 * %NL80211_ATTR_SCHED_SCAN_INTERVAL will be specified. In this 11559 * case one scan plan will be set with the specified scan 11560 * interval and infinite number of iterations. 11561 */ 11562 interval = nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]); 11563 if (!interval) 11564 return -EINVAL; 11565 11566 request->scan_plans[0].interval = 11567 DIV_ROUND_UP(interval, MSEC_PER_SEC); 11568 if (!request->scan_plans[0].interval) 11569 return -EINVAL; 11570 11571 if (request->scan_plans[0].interval > 11572 wiphy->max_sched_scan_plan_interval) 11573 request->scan_plans[0].interval = 11574 wiphy->max_sched_scan_plan_interval; 11575 11576 return 0; 11577 } 11578 11579 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) { 11580 struct nlattr *plan[NL80211_SCHED_SCAN_PLAN_MAX + 1]; 11581 11582 if (WARN_ON(i >= n_plans)) 11583 return -EINVAL; 11584 11585 err = nla_parse_nested_deprecated(plan, 11586 NL80211_SCHED_SCAN_PLAN_MAX, 11587 attr, nl80211_plan_policy, 11588 NULL); 11589 if (err) 11590 return err; 11591 11592 if (!plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]) 11593 return -EINVAL; 11594 11595 request->scan_plans[i].interval = 11596 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]); 11597 if (!request->scan_plans[i].interval || 11598 request->scan_plans[i].interval > 11599 wiphy->max_sched_scan_plan_interval) 11600 return -EINVAL; 11601 11602 if (plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]) { 11603 request->scan_plans[i].iterations = 11604 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]); 11605 if (!request->scan_plans[i].iterations || 11606 (request->scan_plans[i].iterations > 11607 wiphy->max_sched_scan_plan_iterations)) 11608 return -EINVAL; 11609 } else if (i < n_plans - 1) { 11610 /* 11611 * All scan plans but the last one must specify 11612 * a finite number of iterations 11613 */ 11614 return -EINVAL; 11615 } 11616 11617 i++; 11618 } 11619 11620 /* 11621 * The last scan plan must not specify the number of 11622 * iterations, it is supposed to run infinitely 11623 */ 11624 if (request->scan_plans[n_plans - 1].iterations) 11625 return -EINVAL; 11626 11627 return 0; 11628 } 11629 11630 static struct cfg80211_sched_scan_request * 11631 nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev, 11632 struct nlattr **attrs, int max_match_sets) 11633 { 11634 struct cfg80211_sched_scan_request *request; 11635 struct nlattr *attr; 11636 int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i, n_plans = 0; 11637 enum nl80211_band band; 11638 size_t ie_len, size; 11639 struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1]; 11640 s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF; 11641 11642 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 11643 n_channels = validate_scan_freqs( 11644 attrs[NL80211_ATTR_SCAN_FREQUENCIES]); 11645 if (!n_channels) 11646 return ERR_PTR(-EINVAL); 11647 } else { 11648 n_channels = ieee80211_get_num_supported_channels(wiphy); 11649 } 11650 11651 if (attrs[NL80211_ATTR_SCAN_SSIDS]) 11652 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS], 11653 tmp) 11654 n_ssids++; 11655 11656 if (n_ssids > wiphy->max_sched_scan_ssids) 11657 return ERR_PTR(-EINVAL); 11658 11659 /* 11660 * First, count the number of 'real' matchsets. Due to an issue with 11661 * the old implementation, matchsets containing only the RSSI attribute 11662 * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default' 11663 * RSSI for all matchsets, rather than their own matchset for reporting 11664 * all APs with a strong RSSI. This is needed to be compatible with 11665 * older userspace that treated a matchset with only the RSSI as the 11666 * global RSSI for all other matchsets - if there are other matchsets. 11667 */ 11668 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 11669 nla_for_each_nested(attr, 11670 attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 11671 tmp) { 11672 struct nlattr *rssi; 11673 11674 err = nla_parse_nested_deprecated(tb, 11675 NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 11676 attr, 11677 nl80211_match_policy, 11678 NULL); 11679 if (err) 11680 return ERR_PTR(err); 11681 11682 /* SSID and BSSID are mutually exclusive */ 11683 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] && 11684 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) 11685 return ERR_PTR(-EINVAL); 11686 11687 /* add other standalone attributes here */ 11688 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] || 11689 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) { 11690 n_match_sets++; 11691 continue; 11692 } 11693 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 11694 if (rssi) 11695 default_match_rssi = nla_get_s32(rssi); 11696 } 11697 } 11698 11699 /* However, if there's no other matchset, add the RSSI one */ 11700 if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF) 11701 n_match_sets = 1; 11702 11703 if (n_match_sets > max_match_sets) 11704 return ERR_PTR(-EINVAL); 11705 11706 if (attrs[NL80211_ATTR_IE]) 11707 ie_len = nla_len(attrs[NL80211_ATTR_IE]); 11708 else 11709 ie_len = 0; 11710 11711 if (ie_len > wiphy->max_sched_scan_ie_len) 11712 return ERR_PTR(-EINVAL); 11713 11714 if (attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) { 11715 /* 11716 * NL80211_ATTR_SCHED_SCAN_INTERVAL must not be specified since 11717 * each scan plan already specifies its own interval 11718 */ 11719 if (attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 11720 return ERR_PTR(-EINVAL); 11721 11722 nla_for_each_nested(attr, 11723 attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) 11724 n_plans++; 11725 } else { 11726 /* 11727 * The scan interval attribute is kept for backward 11728 * compatibility. If no scan plans are specified and sched scan 11729 * interval is specified, one scan plan will be set with this 11730 * scan interval and infinite number of iterations. 11731 */ 11732 if (!attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 11733 return ERR_PTR(-EINVAL); 11734 11735 n_plans = 1; 11736 } 11737 11738 if (!n_plans || n_plans > wiphy->max_sched_scan_plans) 11739 return ERR_PTR(-EINVAL); 11740 11741 if (!wiphy_ext_feature_isset( 11742 wiphy, NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI) && 11743 (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] || 11744 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST])) 11745 return ERR_PTR(-EINVAL); 11746 11747 size = struct_size(request, channels, n_channels); 11748 size = size_add(size, array_size(sizeof(*request->ssids), n_ssids)); 11749 size = size_add(size, array_size(sizeof(*request->match_sets), 11750 n_match_sets)); 11751 size = size_add(size, array_size(sizeof(*request->scan_plans), 11752 n_plans)); 11753 size = size_add(size, ie_len); 11754 request = kzalloc(size, GFP_KERNEL); 11755 if (!request) 11756 return ERR_PTR(-ENOMEM); 11757 request->n_channels = n_channels; 11758 11759 if (n_ssids) 11760 request->ssids = (void *)request + 11761 struct_size(request, channels, n_channels); 11762 request->n_ssids = n_ssids; 11763 if (ie_len) { 11764 if (n_ssids) 11765 request->ie = (void *)(request->ssids + n_ssids); 11766 else 11767 request->ie = (void *)(request->channels + n_channels); 11768 } 11769 11770 if (n_match_sets) { 11771 if (request->ie) 11772 request->match_sets = (void *)(request->ie + ie_len); 11773 else if (n_ssids) 11774 request->match_sets = 11775 (void *)(request->ssids + n_ssids); 11776 else 11777 request->match_sets = 11778 (void *)(request->channels + n_channels); 11779 } 11780 request->n_match_sets = n_match_sets; 11781 11782 if (n_match_sets) 11783 request->scan_plans = (void *)(request->match_sets + 11784 n_match_sets); 11785 else if (request->ie) 11786 request->scan_plans = (void *)(request->ie + ie_len); 11787 else if (n_ssids) 11788 request->scan_plans = (void *)(request->ssids + n_ssids); 11789 else 11790 request->scan_plans = (void *)(request->channels + n_channels); 11791 11792 request->n_scan_plans = n_plans; 11793 11794 i = 0; 11795 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 11796 /* user specified, bail out if channel not found */ 11797 nla_for_each_nested(attr, 11798 attrs[NL80211_ATTR_SCAN_FREQUENCIES], 11799 tmp) { 11800 struct ieee80211_channel *chan; 11801 11802 chan = ieee80211_get_channel(wiphy, nla_get_u32(attr)); 11803 11804 if (!chan) { 11805 err = -EINVAL; 11806 goto out_free; 11807 } 11808 11809 /* ignore disabled channels */ 11810 if (chan->flags & IEEE80211_CHAN_DISABLED) 11811 continue; 11812 11813 request->channels[i] = chan; 11814 i++; 11815 } 11816 } else { 11817 /* all channels */ 11818 for (band = 0; band < NUM_NL80211_BANDS; band++) { 11819 int j; 11820 11821 if (!wiphy->bands[band]) 11822 continue; 11823 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 11824 struct ieee80211_channel *chan; 11825 11826 chan = &wiphy->bands[band]->channels[j]; 11827 11828 if (chan->flags & IEEE80211_CHAN_DISABLED) 11829 continue; 11830 11831 request->channels[i] = chan; 11832 i++; 11833 } 11834 } 11835 } 11836 11837 if (!i) { 11838 err = -EINVAL; 11839 goto out_free; 11840 } 11841 11842 request->n_channels = i; 11843 11844 i = 0; 11845 if (n_ssids) { 11846 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS], 11847 tmp) { 11848 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 11849 err = -EINVAL; 11850 goto out_free; 11851 } 11852 request->ssids[i].ssid_len = nla_len(attr); 11853 memcpy(request->ssids[i].ssid, nla_data(attr), 11854 nla_len(attr)); 11855 i++; 11856 } 11857 } 11858 11859 i = 0; 11860 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 11861 nla_for_each_nested(attr, 11862 attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 11863 tmp) { 11864 struct nlattr *ssid, *bssid, *rssi; 11865 11866 err = nla_parse_nested_deprecated(tb, 11867 NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 11868 attr, 11869 nl80211_match_policy, 11870 NULL); 11871 if (err) 11872 goto out_free; 11873 ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID]; 11874 bssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]; 11875 11876 if (!ssid && !bssid) { 11877 i++; 11878 continue; 11879 } 11880 11881 if (WARN_ON(i >= n_match_sets)) { 11882 /* this indicates a programming error, 11883 * the loop above should have verified 11884 * things properly 11885 */ 11886 err = -EINVAL; 11887 goto out_free; 11888 } 11889 11890 if (ssid) { 11891 memcpy(request->match_sets[i].ssid.ssid, 11892 nla_data(ssid), nla_len(ssid)); 11893 request->match_sets[i].ssid.ssid_len = 11894 nla_len(ssid); 11895 } 11896 if (bssid) 11897 memcpy(request->match_sets[i].bssid, 11898 nla_data(bssid), ETH_ALEN); 11899 11900 /* special attribute - old implementation w/a */ 11901 request->match_sets[i].rssi_thold = default_match_rssi; 11902 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 11903 if (rssi) 11904 request->match_sets[i].rssi_thold = 11905 nla_get_s32(rssi); 11906 i++; 11907 } 11908 11909 /* there was no other matchset, so the RSSI one is alone */ 11910 if (i == 0 && n_match_sets) 11911 request->match_sets[0].rssi_thold = default_match_rssi; 11912 11913 request->min_rssi_thold = INT_MAX; 11914 for (i = 0; i < n_match_sets; i++) 11915 request->min_rssi_thold = 11916 min(request->match_sets[i].rssi_thold, 11917 request->min_rssi_thold); 11918 } else { 11919 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF; 11920 } 11921 11922 if (ie_len) { 11923 request->ie_len = ie_len; 11924 memcpy((void *)request->ie, 11925 nla_data(attrs[NL80211_ATTR_IE]), 11926 request->ie_len); 11927 } 11928 11929 err = nl80211_check_scan_flags_sched(wiphy, wdev, attrs, request); 11930 if (err) 11931 goto out_free; 11932 11933 if (attrs[NL80211_ATTR_SCHED_SCAN_DELAY]) 11934 request->delay = 11935 nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_DELAY]); 11936 11937 if (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]) { 11938 request->relative_rssi = nla_get_s8( 11939 attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]); 11940 request->relative_rssi_set = true; 11941 } 11942 11943 if (request->relative_rssi_set && 11944 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]) { 11945 struct nl80211_bss_select_rssi_adjust *rssi_adjust; 11946 11947 rssi_adjust = nla_data( 11948 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]); 11949 request->rssi_adjust.band = rssi_adjust->band; 11950 request->rssi_adjust.delta = rssi_adjust->delta; 11951 if (!is_band_valid(wiphy, request->rssi_adjust.band)) { 11952 err = -EINVAL; 11953 goto out_free; 11954 } 11955 } 11956 11957 err = nl80211_parse_sched_scan_plans(wiphy, n_plans, request, attrs); 11958 if (err) 11959 goto out_free; 11960 11961 request->scan_start = jiffies; 11962 11963 return request; 11964 11965 out_free: 11966 kfree(request); 11967 return ERR_PTR(err); 11968 } 11969 11970 static int nl80211_start_sched_scan(struct sk_buff *skb, 11971 struct genl_info *info) 11972 { 11973 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11974 struct net_device *dev = info->user_ptr[1]; 11975 struct wireless_dev *wdev = dev->ieee80211_ptr; 11976 struct cfg80211_sched_scan_request *sched_scan_req; 11977 bool want_multi; 11978 int err; 11979 11980 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start) 11981 return -EOPNOTSUPP; 11982 11983 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI]; 11984 err = cfg80211_sched_scan_req_possible(rdev, want_multi); 11985 if (err) 11986 return err; 11987 11988 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev, 11989 info->attrs, 11990 rdev->wiphy.max_match_sets); 11991 11992 err = PTR_ERR_OR_ZERO(sched_scan_req); 11993 if (err) 11994 goto out_err; 11995 11996 /* leave request id zero for legacy request 11997 * or if driver does not support multi-scheduled scan 11998 */ 11999 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) 12000 sched_scan_req->reqid = cfg80211_assign_cookie(rdev); 12001 12002 err = rdev_sched_scan_start(rdev, dev, sched_scan_req); 12003 if (err) 12004 goto out_free; 12005 12006 sched_scan_req->dev = dev; 12007 sched_scan_req->wiphy = &rdev->wiphy; 12008 12009 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 12010 sched_scan_req->owner_nlportid = info->snd_portid; 12011 12012 cfg80211_add_sched_scan_req(rdev, sched_scan_req); 12013 12014 nl80211_send_sched_scan(sched_scan_req, NL80211_CMD_START_SCHED_SCAN); 12015 return 0; 12016 12017 out_free: 12018 kfree(sched_scan_req); 12019 out_err: 12020 return err; 12021 } 12022 12023 static int nl80211_stop_sched_scan(struct sk_buff *skb, 12024 struct genl_info *info) 12025 { 12026 struct cfg80211_sched_scan_request *req; 12027 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12028 u64 cookie; 12029 12030 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop) 12031 return -EOPNOTSUPP; 12032 12033 if (info->attrs[NL80211_ATTR_COOKIE]) { 12034 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 12035 return __cfg80211_stop_sched_scan(rdev, cookie, false); 12036 } 12037 12038 req = list_first_or_null_rcu(&rdev->sched_scan_req_list, 12039 struct cfg80211_sched_scan_request, 12040 list); 12041 if (!req || req->reqid || 12042 (req->owner_nlportid && 12043 req->owner_nlportid != info->snd_portid)) 12044 return -ENOENT; 12045 12046 return cfg80211_stop_sched_scan_req(rdev, req, false); 12047 } 12048 12049 static int nl80211_start_radar_detection(struct sk_buff *skb, 12050 struct genl_info *info) 12051 { 12052 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12053 struct net_device *dev = info->user_ptr[1]; 12054 struct wireless_dev *wdev = dev->ieee80211_ptr; 12055 int link_id = nl80211_link_id(info->attrs); 12056 struct wiphy *wiphy = wdev->wiphy; 12057 struct cfg80211_chan_def chandef; 12058 enum nl80211_dfs_regions dfs_region; 12059 unsigned int cac_time_ms; 12060 int err; 12061 12062 flush_delayed_work(&rdev->dfs_update_channels_wk); 12063 12064 switch (wdev->iftype) { 12065 case NL80211_IFTYPE_AP: 12066 case NL80211_IFTYPE_P2P_GO: 12067 case NL80211_IFTYPE_MESH_POINT: 12068 case NL80211_IFTYPE_ADHOC: 12069 break; 12070 default: 12071 /* caution - see cfg80211_beaconing_iface_active() below */ 12072 return -EINVAL; 12073 } 12074 12075 guard(wiphy)(wiphy); 12076 12077 dfs_region = reg_get_dfs_region(wiphy); 12078 if (dfs_region == NL80211_DFS_UNSET) 12079 return -EINVAL; 12080 12081 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef, 12082 false); 12083 if (err) 12084 return err; 12085 12086 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); 12087 if (err < 0) 12088 return err; 12089 12090 if (err == 0) 12091 return -EINVAL; 12092 12093 if (!cfg80211_chandef_dfs_usable(wiphy, &chandef)) 12094 return -EINVAL; 12095 12096 if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_BACKGROUND])) 12097 return cfg80211_start_background_radar_detection(rdev, wdev, 12098 &chandef); 12099 12100 if (cfg80211_beaconing_iface_active(wdev)) { 12101 /* During MLO other link(s) can beacon, only the current link 12102 * can not already beacon 12103 */ 12104 if (wdev->valid_links && 12105 !wdev->links[link_id].ap.beacon_interval) { 12106 /* nothing */ 12107 } else { 12108 return -EBUSY; 12109 } 12110 } 12111 12112 if (wdev->links[link_id].cac_started) 12113 return -EBUSY; 12114 12115 /* CAC start is offloaded to HW and can't be started manually */ 12116 if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD)) 12117 return -EOPNOTSUPP; 12118 12119 if (!rdev->ops->start_radar_detection) 12120 return -EOPNOTSUPP; 12121 12122 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); 12123 if (WARN_ON(!cac_time_ms)) 12124 cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS; 12125 12126 err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms, 12127 link_id); 12128 if (err) 12129 return err; 12130 12131 switch (wdev->iftype) { 12132 case NL80211_IFTYPE_AP: 12133 case NL80211_IFTYPE_P2P_GO: 12134 wdev->links[link_id].ap.chandef = chandef; 12135 break; 12136 case NL80211_IFTYPE_ADHOC: 12137 wdev->u.ibss.chandef = chandef; 12138 break; 12139 case NL80211_IFTYPE_MESH_POINT: 12140 wdev->u.mesh.chandef = chandef; 12141 break; 12142 default: 12143 break; 12144 } 12145 wdev->links[link_id].cac_started = true; 12146 wdev->links[link_id].cac_start_time = jiffies; 12147 wdev->links[link_id].cac_time_ms = cac_time_ms; 12148 cfg80211_set_cac_state(wiphy, &chandef, true); 12149 12150 return 0; 12151 } 12152 12153 static int nl80211_notify_radar_detection(struct sk_buff *skb, 12154 struct genl_info *info) 12155 { 12156 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12157 struct net_device *dev = info->user_ptr[1]; 12158 struct wireless_dev *wdev = dev->ieee80211_ptr; 12159 struct wiphy *wiphy = wdev->wiphy; 12160 struct cfg80211_chan_def chandef; 12161 enum nl80211_dfs_regions dfs_region; 12162 int err; 12163 12164 dfs_region = reg_get_dfs_region(wiphy); 12165 if (dfs_region == NL80211_DFS_UNSET) { 12166 GENL_SET_ERR_MSG(info, 12167 "DFS Region is not set. Unexpected Radar indication"); 12168 return -EINVAL; 12169 } 12170 12171 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef, 12172 false); 12173 if (err) { 12174 GENL_SET_ERR_MSG(info, "Unable to extract chandef info"); 12175 return err; 12176 } 12177 12178 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); 12179 if (err < 0) { 12180 GENL_SET_ERR_MSG(info, "chandef is invalid"); 12181 return err; 12182 } 12183 12184 if (err == 0) { 12185 GENL_SET_ERR_MSG(info, 12186 "Unexpected Radar indication for chandef/iftype"); 12187 return -EINVAL; 12188 } 12189 12190 /* Do not process this notification if radar is already detected 12191 * by kernel on this channel, and return success. 12192 */ 12193 if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE) 12194 return 0; 12195 12196 cfg80211_set_dfs_state(wiphy, &chandef, NL80211_DFS_UNAVAILABLE); 12197 12198 cfg80211_sched_dfs_chan_update(rdev); 12199 12200 rdev->radar_chandef = chandef; 12201 12202 /* Propagate this notification to other radios as well */ 12203 queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); 12204 12205 return 0; 12206 } 12207 12208 static int nl80211_parse_counter_offsets(struct cfg80211_registered_device *rdev, 12209 const u8 *data, size_t datalen, 12210 int first_count, struct nlattr *attr, 12211 const u16 **offsets, unsigned int *n_offsets) 12212 { 12213 int i; 12214 12215 *n_offsets = 0; 12216 12217 if (!attr) 12218 return 0; 12219 12220 if (!nla_len(attr) || (nla_len(attr) % sizeof(u16))) 12221 return -EINVAL; 12222 12223 *n_offsets = nla_len(attr) / sizeof(u16); 12224 if (rdev->wiphy.max_num_csa_counters && 12225 (*n_offsets > rdev->wiphy.max_num_csa_counters)) 12226 return -EINVAL; 12227 12228 *offsets = nla_data(attr); 12229 12230 /* sanity checks - counters should fit and be the same */ 12231 for (i = 0; i < *n_offsets; i++) { 12232 u16 offset = (*offsets)[i]; 12233 12234 if (offset >= datalen) 12235 return -EINVAL; 12236 12237 if (first_count != -1 && data[offset] != first_count) 12238 return -EINVAL; 12239 } 12240 12241 return 0; 12242 } 12243 12244 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info) 12245 { 12246 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12247 unsigned int link_id = nl80211_link_id(info->attrs); 12248 struct net_device *dev = info->user_ptr[1]; 12249 struct wireless_dev *wdev = dev->ieee80211_ptr; 12250 struct cfg80211_csa_settings params; 12251 struct nlattr **csa_attrs = NULL; 12252 int err; 12253 bool need_new_beacon = false; 12254 bool need_handle_dfs_flag = true; 12255 bool permit_npca = false; 12256 u32 cs_count; 12257 12258 if (!rdev->ops->channel_switch || 12259 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) 12260 return -EOPNOTSUPP; 12261 12262 switch (dev->ieee80211_ptr->iftype) { 12263 case NL80211_IFTYPE_AP: 12264 case NL80211_IFTYPE_P2P_GO: 12265 need_new_beacon = true; 12266 /* For all modes except AP the handle_dfs flag needs to be 12267 * supplied to tell the kernel that userspace will handle radar 12268 * events when they happen. Otherwise a switch to a channel 12269 * requiring DFS will be rejected. 12270 */ 12271 need_handle_dfs_flag = false; 12272 12273 permit_npca = true; 12274 12275 /* useless if AP is not running */ 12276 if (!wdev->links[link_id].ap.beacon_interval) 12277 return -ENOTCONN; 12278 break; 12279 case NL80211_IFTYPE_ADHOC: 12280 if (!wdev->u.ibss.ssid_len) 12281 return -ENOTCONN; 12282 break; 12283 case NL80211_IFTYPE_MESH_POINT: 12284 if (!wdev->u.mesh.id_len) 12285 return -ENOTCONN; 12286 break; 12287 default: 12288 return -EOPNOTSUPP; 12289 } 12290 12291 memset(¶ms, 0, sizeof(params)); 12292 params.beacon_csa.ftm_responder = -1; 12293 12294 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 12295 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) 12296 return -EINVAL; 12297 12298 /* only important for AP, IBSS and mesh create IEs internally */ 12299 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) 12300 return -EINVAL; 12301 12302 /* Even though the attribute is u32, the specification says 12303 * u8, so let's make sure we don't overflow. 12304 */ 12305 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); 12306 if (cs_count > 255) 12307 return -EINVAL; 12308 12309 params.count = cs_count; 12310 12311 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 12312 ¶ms.chandef, permit_npca); 12313 if (err) 12314 goto free; 12315 12316 err = nl80211_check_npca(rdev, ¶ms.chandef, wdev->iftype, 12317 info->extack); 12318 if (err) 12319 goto free; 12320 12321 if (!need_new_beacon) 12322 goto skip_beacons; 12323 12324 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_after, 12325 params.chandef.chan, info->extack); 12326 if (err) 12327 goto free; 12328 12329 csa_attrs = kzalloc_objs(*csa_attrs, NL80211_ATTR_MAX + 1); 12330 if (!csa_attrs) { 12331 err = -ENOMEM; 12332 goto free; 12333 } 12334 12335 err = nla_parse_nested_deprecated(csa_attrs, NL80211_ATTR_MAX, 12336 info->attrs[NL80211_ATTR_CSA_IES], 12337 nl80211_policy, info->extack); 12338 if (err) 12339 goto free; 12340 12341 err = nl80211_parse_beacon(rdev, csa_attrs, ¶ms.beacon_csa, 12342 wdev->links[link_id].ap.chandef.chan, 12343 info->extack); 12344 if (err) 12345 goto free; 12346 12347 if (!csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON]) { 12348 err = -EINVAL; 12349 goto free; 12350 } 12351 12352 err = nl80211_parse_counter_offsets(rdev, params.beacon_csa.tail, 12353 params.beacon_csa.tail_len, 12354 params.count, 12355 csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON], 12356 ¶ms.counter_offsets_beacon, 12357 ¶ms.n_counter_offsets_beacon); 12358 if (err) 12359 goto free; 12360 12361 err = nl80211_parse_counter_offsets(rdev, params.beacon_csa.probe_resp, 12362 params.beacon_csa.probe_resp_len, 12363 params.count, 12364 csa_attrs[NL80211_ATTR_CNTDWN_OFFS_PRESP], 12365 ¶ms.counter_offsets_presp, 12366 ¶ms.n_counter_offsets_presp); 12367 if (err) 12368 goto free; 12369 12370 skip_beacons: 12371 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, 12372 wdev->iftype)) { 12373 err = -EINVAL; 12374 goto free; 12375 } 12376 12377 err = cfg80211_chandef_dfs_required(wdev->wiphy, 12378 ¶ms.chandef, 12379 wdev->iftype); 12380 if (err < 0) 12381 goto free; 12382 12383 if (err > 0) { 12384 params.radar_required = true; 12385 if (need_handle_dfs_flag && 12386 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) { 12387 err = -EINVAL; 12388 goto free; 12389 } 12390 } 12391 12392 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) 12393 params.block_tx = true; 12394 12395 if ((wdev->iftype == NL80211_IFTYPE_AP || 12396 wdev->iftype == NL80211_IFTYPE_P2P_GO) && 12397 info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { 12398 err = nl80211_parse_unsol_bcast_probe_resp( 12399 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], 12400 ¶ms.unsol_bcast_probe_resp); 12401 if (err) 12402 goto free; 12403 } 12404 12405 params.link_id = link_id; 12406 err = rdev_channel_switch(rdev, dev, ¶ms); 12407 12408 free: 12409 kfree(params.beacon_after.mbssid_ies); 12410 kfree(params.beacon_csa.mbssid_ies); 12411 kfree(params.beacon_after.rnr_ies); 12412 kfree(params.beacon_csa.rnr_ies); 12413 kfree(csa_attrs); 12414 return err; 12415 } 12416 12417 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb, 12418 u32 seq, int flags, 12419 struct cfg80211_registered_device *rdev, 12420 struct wireless_dev *wdev, 12421 struct cfg80211_internal_bss *intbss) 12422 { 12423 struct cfg80211_bss *res = &intbss->pub; 12424 const struct cfg80211_bss_ies *ies; 12425 unsigned int link_id; 12426 void *hdr; 12427 struct nlattr *bss; 12428 12429 lockdep_assert_wiphy(wdev->wiphy); 12430 12431 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 12432 NL80211_CMD_NEW_SCAN_RESULTS); 12433 if (!hdr) 12434 return -1; 12435 12436 genl_dump_check_consistent(cb, hdr); 12437 12438 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) 12439 goto nla_put_failure; 12440 if (wdev->netdev && 12441 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) 12442 goto nla_put_failure; 12443 if (nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 12444 NL80211_ATTR_PAD)) 12445 goto nla_put_failure; 12446 12447 bss = nla_nest_start_noflag(msg, NL80211_ATTR_BSS); 12448 if (!bss) 12449 goto nla_put_failure; 12450 if ((!is_zero_ether_addr(res->bssid) && 12451 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) 12452 goto nla_put_failure; 12453 12454 rcu_read_lock(); 12455 /* indicate whether we have probe response data or not */ 12456 if (rcu_access_pointer(res->proberesp_ies) && 12457 nla_put_flag(msg, NL80211_BSS_PRESP_DATA)) 12458 goto fail_unlock_rcu; 12459 12460 /* this pointer prefers to be pointed to probe response data 12461 * but is always valid 12462 */ 12463 ies = rcu_dereference(res->ies); 12464 if (ies) { 12465 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf, 12466 NL80211_BSS_PAD)) 12467 goto fail_unlock_rcu; 12468 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, 12469 ies->len, ies->data)) 12470 goto fail_unlock_rcu; 12471 } 12472 12473 /* and this pointer is always (unless driver didn't know) beacon data */ 12474 ies = rcu_dereference(res->beacon_ies); 12475 if (ies && ies->from_beacon) { 12476 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf, 12477 NL80211_BSS_PAD)) 12478 goto fail_unlock_rcu; 12479 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, 12480 ies->len, ies->data)) 12481 goto fail_unlock_rcu; 12482 } 12483 rcu_read_unlock(); 12484 12485 if (res->beacon_interval && 12486 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) 12487 goto nla_put_failure; 12488 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || 12489 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || 12490 nla_put_u32(msg, NL80211_BSS_FREQUENCY_OFFSET, 12491 res->channel->freq_offset) || 12492 nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO, 12493 jiffies_to_msecs(jiffies - intbss->ts))) 12494 goto nla_put_failure; 12495 12496 if (intbss->parent_tsf && 12497 (nla_put_u64_64bit(msg, NL80211_BSS_PARENT_TSF, 12498 intbss->parent_tsf, NL80211_BSS_PAD) || 12499 nla_put(msg, NL80211_BSS_PARENT_BSSID, ETH_ALEN, 12500 intbss->parent_bssid))) 12501 goto nla_put_failure; 12502 12503 if (res->ts_boottime && 12504 nla_put_u64_64bit(msg, NL80211_BSS_LAST_SEEN_BOOTTIME, 12505 res->ts_boottime, NL80211_BSS_PAD)) 12506 goto nla_put_failure; 12507 12508 if (!nl80211_put_signal(msg, intbss->pub.chains, 12509 intbss->pub.chain_signal, 12510 NL80211_BSS_CHAIN_SIGNAL)) 12511 goto nla_put_failure; 12512 12513 if (intbss->bss_source != BSS_SOURCE_STA_PROFILE) { 12514 switch (rdev->wiphy.signal_type) { 12515 case CFG80211_SIGNAL_TYPE_MBM: 12516 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, 12517 res->signal)) 12518 goto nla_put_failure; 12519 break; 12520 case CFG80211_SIGNAL_TYPE_UNSPEC: 12521 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, 12522 res->signal)) 12523 goto nla_put_failure; 12524 break; 12525 default: 12526 break; 12527 } 12528 } 12529 12530 switch (wdev->iftype) { 12531 case NL80211_IFTYPE_P2P_CLIENT: 12532 case NL80211_IFTYPE_STATION: 12533 for_each_valid_link(wdev, link_id) { 12534 if (intbss == wdev->links[link_id].client.current_bss && 12535 (nla_put_u32(msg, NL80211_BSS_STATUS, 12536 NL80211_BSS_STATUS_ASSOCIATED) || 12537 (wdev->valid_links && 12538 (nla_put_u8(msg, NL80211_BSS_MLO_LINK_ID, 12539 link_id) || 12540 nla_put(msg, NL80211_BSS_MLD_ADDR, ETH_ALEN, 12541 wdev->u.client.connected_addr))))) 12542 goto nla_put_failure; 12543 } 12544 break; 12545 case NL80211_IFTYPE_ADHOC: 12546 if (intbss == wdev->u.ibss.current_bss && 12547 nla_put_u32(msg, NL80211_BSS_STATUS, 12548 NL80211_BSS_STATUS_IBSS_JOINED)) 12549 goto nla_put_failure; 12550 break; 12551 default: 12552 break; 12553 } 12554 12555 if (nla_put_u32(msg, NL80211_BSS_USE_FOR, res->use_for)) 12556 goto nla_put_failure; 12557 12558 if (res->cannot_use_reasons && 12559 nla_put_u64_64bit(msg, NL80211_BSS_CANNOT_USE_REASONS, 12560 res->cannot_use_reasons, 12561 NL80211_BSS_PAD)) 12562 goto nla_put_failure; 12563 12564 nla_nest_end(msg, bss); 12565 12566 genlmsg_end(msg, hdr); 12567 return 0; 12568 12569 fail_unlock_rcu: 12570 rcu_read_unlock(); 12571 nla_put_failure: 12572 genlmsg_cancel(msg, hdr); 12573 return -EMSGSIZE; 12574 } 12575 12576 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb) 12577 { 12578 struct cfg80211_registered_device *rdev; 12579 struct cfg80211_internal_bss *scan; 12580 struct wireless_dev *wdev; 12581 struct nlattr **attrbuf; 12582 int start = cb->args[2], idx = 0; 12583 bool dump_include_use_data; 12584 int err; 12585 12586 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 12587 if (!attrbuf) 12588 return -ENOMEM; 12589 12590 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, attrbuf); 12591 if (err) { 12592 kfree(attrbuf); 12593 return err; 12594 } 12595 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 12596 __acquire(&rdev->wiphy.mtx); 12597 12598 dump_include_use_data = 12599 attrbuf[NL80211_ATTR_BSS_DUMP_INCLUDE_USE_DATA]; 12600 kfree(attrbuf); 12601 12602 spin_lock_bh(&rdev->bss_lock); 12603 12604 /* 12605 * dump_scan will be called multiple times to break up the scan results 12606 * into multiple messages. It is unlikely that any more bss-es will be 12607 * expired after the first call, so only call only call this on the 12608 * first dump_scan invocation. 12609 */ 12610 if (start == 0) 12611 cfg80211_bss_expire(rdev); 12612 12613 cb->seq = rdev->bss_generation; 12614 12615 list_for_each_entry(scan, &rdev->bss_list, list) { 12616 if (++idx <= start) 12617 continue; 12618 if (!dump_include_use_data && 12619 !(scan->pub.use_for & NL80211_BSS_USE_FOR_NORMAL)) 12620 continue; 12621 if (nl80211_send_bss(skb, cb, 12622 cb->nlh->nlmsg_seq, NLM_F_MULTI, 12623 rdev, wdev, scan) < 0) { 12624 idx--; 12625 break; 12626 } 12627 } 12628 12629 spin_unlock_bh(&rdev->bss_lock); 12630 12631 cb->args[2] = idx; 12632 wiphy_unlock(&rdev->wiphy); 12633 12634 return skb->len; 12635 } 12636 12637 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq, 12638 int flags, struct net_device *dev, 12639 bool allow_radio_stats, 12640 struct survey_info *survey) 12641 { 12642 void *hdr; 12643 struct nlattr *infoattr; 12644 12645 /* skip radio stats if userspace didn't request them */ 12646 if (!survey->channel && !allow_radio_stats) 12647 return 0; 12648 12649 hdr = nl80211hdr_put(msg, portid, seq, flags, 12650 NL80211_CMD_NEW_SURVEY_RESULTS); 12651 if (!hdr) 12652 return -ENOMEM; 12653 12654 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 12655 goto nla_put_failure; 12656 12657 infoattr = nla_nest_start_noflag(msg, NL80211_ATTR_SURVEY_INFO); 12658 if (!infoattr) 12659 goto nla_put_failure; 12660 12661 if (survey->channel && 12662 nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY, 12663 survey->channel->center_freq)) 12664 goto nla_put_failure; 12665 12666 if (survey->channel && survey->channel->freq_offset && 12667 nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY_OFFSET, 12668 survey->channel->freq_offset)) 12669 goto nla_put_failure; 12670 12671 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && 12672 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) 12673 goto nla_put_failure; 12674 if ((survey->filled & SURVEY_INFO_IN_USE) && 12675 nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE)) 12676 goto nla_put_failure; 12677 if ((survey->filled & SURVEY_INFO_TIME) && 12678 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME, 12679 survey->time, NL80211_SURVEY_INFO_PAD)) 12680 goto nla_put_failure; 12681 if ((survey->filled & SURVEY_INFO_TIME_BUSY) && 12682 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BUSY, 12683 survey->time_busy, NL80211_SURVEY_INFO_PAD)) 12684 goto nla_put_failure; 12685 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) && 12686 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_EXT_BUSY, 12687 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD)) 12688 goto nla_put_failure; 12689 if ((survey->filled & SURVEY_INFO_TIME_RX) && 12690 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_RX, 12691 survey->time_rx, NL80211_SURVEY_INFO_PAD)) 12692 goto nla_put_failure; 12693 if ((survey->filled & SURVEY_INFO_TIME_TX) && 12694 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_TX, 12695 survey->time_tx, NL80211_SURVEY_INFO_PAD)) 12696 goto nla_put_failure; 12697 if ((survey->filled & SURVEY_INFO_TIME_SCAN) && 12698 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_SCAN, 12699 survey->time_scan, NL80211_SURVEY_INFO_PAD)) 12700 goto nla_put_failure; 12701 if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) && 12702 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BSS_RX, 12703 survey->time_bss_rx, NL80211_SURVEY_INFO_PAD)) 12704 goto nla_put_failure; 12705 12706 nla_nest_end(msg, infoattr); 12707 12708 genlmsg_end(msg, hdr); 12709 return 0; 12710 12711 nla_put_failure: 12712 genlmsg_cancel(msg, hdr); 12713 return -EMSGSIZE; 12714 } 12715 12716 static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb) 12717 { 12718 struct nlattr **attrbuf; 12719 struct survey_info survey; 12720 struct cfg80211_registered_device *rdev; 12721 struct wireless_dev *wdev; 12722 int survey_idx = cb->args[2]; 12723 int res; 12724 bool radio_stats; 12725 12726 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 12727 if (!attrbuf) 12728 return -ENOMEM; 12729 12730 res = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, attrbuf); 12731 if (res) { 12732 kfree(attrbuf); 12733 return res; 12734 } 12735 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 12736 __acquire(&rdev->wiphy.mtx); 12737 12738 /* prepare_wdev_dump parsed the attributes */ 12739 radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS]; 12740 12741 if (!wdev->netdev) { 12742 res = -EINVAL; 12743 goto out_err; 12744 } 12745 12746 if (!rdev->ops->dump_survey) { 12747 res = -EOPNOTSUPP; 12748 goto out_err; 12749 } 12750 12751 while (1) { 12752 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey); 12753 if (res == -ENOENT) 12754 break; 12755 if (res) 12756 goto out_err; 12757 12758 /* don't send disabled channels, but do send non-channel data */ 12759 if (survey.channel && 12760 survey.channel->flags & IEEE80211_CHAN_DISABLED) { 12761 survey_idx++; 12762 continue; 12763 } 12764 12765 if (nl80211_send_survey(skb, 12766 NETLINK_CB(cb->skb).portid, 12767 cb->nlh->nlmsg_seq, NLM_F_MULTI, 12768 wdev->netdev, radio_stats, &survey) < 0) 12769 goto out; 12770 survey_idx++; 12771 } 12772 12773 out: 12774 cb->args[2] = survey_idx; 12775 res = skb->len; 12776 out_err: 12777 kfree(attrbuf); 12778 wiphy_unlock(&rdev->wiphy); 12779 return res; 12780 } 12781 12782 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info) 12783 { 12784 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12785 struct net_device *dev = info->user_ptr[1]; 12786 struct ieee80211_channel *chan; 12787 const u8 *bssid, *ssid; 12788 int err, ssid_len; 12789 enum nl80211_auth_type auth_type; 12790 struct key_parse key; 12791 bool local_state_change; 12792 struct cfg80211_auth_request req = {}; 12793 u32 freq; 12794 12795 if (!info->attrs[NL80211_ATTR_MAC]) 12796 return -EINVAL; 12797 12798 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) 12799 return -EINVAL; 12800 12801 if (!info->attrs[NL80211_ATTR_SSID]) 12802 return -EINVAL; 12803 12804 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 12805 return -EINVAL; 12806 12807 err = nl80211_parse_key(info, &key); 12808 if (err) 12809 return err; 12810 12811 if (key.idx >= 0) { 12812 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) 12813 return -EINVAL; 12814 if (!key.p.key || !key.p.key_len) 12815 return -EINVAL; 12816 if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 || 12817 key.p.key_len != WLAN_KEY_LEN_WEP40) && 12818 (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 || 12819 key.p.key_len != WLAN_KEY_LEN_WEP104)) 12820 return -EINVAL; 12821 if (key.idx > 3) 12822 return -EINVAL; 12823 } else { 12824 key.p.key_len = 0; 12825 key.p.key = NULL; 12826 } 12827 12828 if (key.idx >= 0) { 12829 int i; 12830 bool ok = false; 12831 12832 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { 12833 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { 12834 ok = true; 12835 break; 12836 } 12837 } 12838 if (!ok) 12839 return -EINVAL; 12840 } 12841 12842 if (!rdev->ops->auth) 12843 return -EOPNOTSUPP; 12844 12845 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 12846 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 12847 return -EOPNOTSUPP; 12848 12849 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 12850 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); 12851 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 12852 freq += 12853 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 12854 12855 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); 12856 if (!chan) 12857 return -EINVAL; 12858 12859 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 12860 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 12861 12862 if (info->attrs[NL80211_ATTR_IE]) { 12863 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 12864 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 12865 } 12866 12867 if (info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]) { 12868 req.supported_selectors = 12869 nla_data(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 12870 req.supported_selectors_len = 12871 nla_len(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 12872 } 12873 12874 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 12875 if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE)) 12876 return -EINVAL; 12877 12878 if ((auth_type == NL80211_AUTHTYPE_SAE || 12879 auth_type == NL80211_AUTHTYPE_FILS_SK || 12880 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 12881 auth_type == NL80211_AUTHTYPE_FILS_PK || 12882 auth_type == NL80211_AUTHTYPE_EPPKE || 12883 auth_type == NL80211_AUTHTYPE_IEEE8021X) && 12884 !info->attrs[NL80211_ATTR_AUTH_DATA]) 12885 return -EINVAL; 12886 12887 if (info->attrs[NL80211_ATTR_AUTH_DATA]) { 12888 if (auth_type != NL80211_AUTHTYPE_SAE && 12889 auth_type != NL80211_AUTHTYPE_FILS_SK && 12890 auth_type != NL80211_AUTHTYPE_FILS_SK_PFS && 12891 auth_type != NL80211_AUTHTYPE_FILS_PK && 12892 auth_type != NL80211_AUTHTYPE_EPPKE && 12893 auth_type != NL80211_AUTHTYPE_IEEE8021X) 12894 return -EINVAL; 12895 req.auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]); 12896 req.auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]); 12897 } 12898 12899 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 12900 12901 /* 12902 * Since we no longer track auth state, ignore 12903 * requests to only change local state. 12904 */ 12905 if (local_state_change) 12906 return 0; 12907 12908 req.auth_type = auth_type; 12909 req.key = key.p.key; 12910 req.key_len = key.p.key_len; 12911 req.key_idx = key.idx; 12912 req.link_id = nl80211_link_id_or_invalid(info->attrs); 12913 if (req.link_id >= 0) { 12914 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) 12915 return -EINVAL; 12916 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) 12917 return -EINVAL; 12918 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 12919 if (!is_valid_ether_addr(req.ap_mld_addr)) 12920 return -EINVAL; 12921 } 12922 12923 req.bss = __cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len, 12924 IEEE80211_BSS_TYPE_ESS, 12925 IEEE80211_PRIVACY_ANY, 12926 NL80211_BSS_USE_FOR_NORMAL, 12927 info->extack); 12928 if (!req.bss) 12929 return -ENOENT; 12930 12931 err = cfg80211_mlme_auth(rdev, dev, &req); 12932 12933 cfg80211_put_bss(&rdev->wiphy, req.bss); 12934 12935 return err; 12936 } 12937 12938 static int validate_pae_over_nl80211(struct cfg80211_registered_device *rdev, 12939 struct genl_info *info) 12940 { 12941 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 12942 GENL_SET_ERR_MSG(info, "SOCKET_OWNER not set"); 12943 return -EINVAL; 12944 } 12945 12946 if (!rdev->ops->tx_control_port || 12947 !wiphy_ext_feature_isset(&rdev->wiphy, 12948 NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211)) 12949 return -EOPNOTSUPP; 12950 12951 return 0; 12952 } 12953 12954 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, 12955 struct genl_info *info, 12956 struct cfg80211_crypto_settings *settings, 12957 int cipher_limit) 12958 { 12959 memset(settings, 0, sizeof(*settings)); 12960 12961 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; 12962 12963 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { 12964 u16 proto; 12965 12966 proto = nla_get_u16( 12967 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); 12968 settings->control_port_ethertype = cpu_to_be16(proto); 12969 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && 12970 proto != ETH_P_PAE) 12971 return -EINVAL; 12972 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) 12973 settings->control_port_no_encrypt = true; 12974 } else 12975 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); 12976 12977 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 12978 int r = validate_pae_over_nl80211(rdev, info); 12979 12980 if (r < 0) 12981 return r; 12982 12983 settings->control_port_over_nl80211 = true; 12984 12985 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH]) 12986 settings->control_port_no_preauth = true; 12987 } 12988 12989 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { 12990 void *data; 12991 int len, i; 12992 12993 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 12994 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 12995 settings->n_ciphers_pairwise = len / sizeof(u32); 12996 12997 if (len % sizeof(u32)) 12998 return -EINVAL; 12999 13000 if (settings->n_ciphers_pairwise > cipher_limit) 13001 return -EINVAL; 13002 13003 memcpy(settings->ciphers_pairwise, data, len); 13004 13005 for (i = 0; i < settings->n_ciphers_pairwise; i++) 13006 if (!cfg80211_supported_cipher_suite( 13007 &rdev->wiphy, 13008 settings->ciphers_pairwise[i])) 13009 return -EINVAL; 13010 } 13011 13012 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { 13013 settings->cipher_group = 13014 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); 13015 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, 13016 settings->cipher_group)) 13017 return -EINVAL; 13018 } 13019 13020 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) 13021 settings->wpa_versions = 13022 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); 13023 13024 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { 13025 void *data; 13026 int len; 13027 13028 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); 13029 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); 13030 settings->n_akm_suites = len / sizeof(u32); 13031 13032 if (len % sizeof(u32)) 13033 return -EINVAL; 13034 13035 if (settings->n_akm_suites > rdev->wiphy.max_num_akm_suites) 13036 return -EINVAL; 13037 13038 memcpy(settings->akm_suites, data, len); 13039 } 13040 13041 if (info->attrs[NL80211_ATTR_PMK]) { 13042 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN) 13043 return -EINVAL; 13044 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13045 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK) && 13046 !wiphy_ext_feature_isset(&rdev->wiphy, 13047 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK)) 13048 return -EINVAL; 13049 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]); 13050 } 13051 13052 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) { 13053 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13054 NL80211_EXT_FEATURE_SAE_OFFLOAD) && 13055 !wiphy_ext_feature_isset(&rdev->wiphy, 13056 NL80211_EXT_FEATURE_SAE_OFFLOAD_AP)) 13057 return -EINVAL; 13058 settings->sae_pwd = 13059 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]); 13060 settings->sae_pwd_len = 13061 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); 13062 } 13063 13064 settings->sae_pwe = 13065 nla_get_u8_default(info->attrs[NL80211_ATTR_SAE_PWE], 13066 NL80211_SAE_PWE_UNSPECIFIED); 13067 13068 return 0; 13069 } 13070 13071 static struct cfg80211_bss *nl80211_assoc_bss(struct cfg80211_registered_device *rdev, 13072 struct genl_info *info, 13073 const u8 *ssid, int ssid_len, 13074 struct nlattr **attrs, 13075 int assoc_link_id, int link_id) 13076 { 13077 struct ieee80211_channel *chan; 13078 struct cfg80211_bss *bss; 13079 const u8 *bssid; 13080 u32 freq, use_for = 0; 13081 13082 if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_WIPHY_FREQ]) { 13083 GENL_SET_ERR_MSG(info, "BSSID or frequency missing"); 13084 return ERR_PTR(-EINVAL); 13085 } 13086 13087 bssid = nla_data(attrs[NL80211_ATTR_MAC]); 13088 13089 freq = MHZ_TO_KHZ(nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ])); 13090 if (attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 13091 freq += nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 13092 13093 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); 13094 if (!chan) { 13095 GENL_SET_ERR_MSG(info, "invalid or disabled channel"); 13096 return ERR_PTR(-EINVAL); 13097 } 13098 13099 if (assoc_link_id >= 0) 13100 use_for = NL80211_BSS_USE_FOR_MLD_LINK; 13101 if (assoc_link_id == link_id) 13102 use_for |= NL80211_BSS_USE_FOR_NORMAL; 13103 13104 bss = __cfg80211_get_bss(&rdev->wiphy, chan, bssid, 13105 ssid, ssid_len, 13106 IEEE80211_BSS_TYPE_ESS, 13107 IEEE80211_PRIVACY_ANY, 13108 use_for, info->extack); 13109 if (!bss) 13110 return ERR_PTR(-ENOENT); 13111 13112 return bss; 13113 } 13114 13115 static int nl80211_process_links(struct cfg80211_registered_device *rdev, 13116 struct cfg80211_assoc_link *links, 13117 int assoc_link_id, 13118 const u8 *ssid, int ssid_len, 13119 struct genl_info *info) 13120 { 13121 unsigned int attrsize = NUM_NL80211_ATTR * sizeof(struct nlattr *); 13122 struct nlattr **attrs __free(kfree) = kzalloc(attrsize, GFP_KERNEL); 13123 struct nlattr *link; 13124 unsigned int link_id; 13125 int rem, err; 13126 13127 if (!attrs) 13128 return -ENOMEM; 13129 13130 nla_for_each_nested(link, info->attrs[NL80211_ATTR_MLO_LINKS], rem) { 13131 memset(attrs, 0, attrsize); 13132 13133 nla_parse_nested(attrs, NL80211_ATTR_MAX, link, NULL, NULL); 13134 13135 if (!attrs[NL80211_ATTR_MLO_LINK_ID]) { 13136 NL_SET_BAD_ATTR(info->extack, link); 13137 return -EINVAL; 13138 } 13139 13140 link_id = nla_get_u8(attrs[NL80211_ATTR_MLO_LINK_ID]); 13141 /* cannot use the same link ID again */ 13142 if (links[link_id].bss) { 13143 NL_SET_BAD_ATTR(info->extack, link); 13144 return -EINVAL; 13145 } 13146 links[link_id].bss = 13147 nl80211_assoc_bss(rdev, info, ssid, ssid_len, attrs, 13148 assoc_link_id, link_id); 13149 if (IS_ERR(links[link_id].bss)) { 13150 err = PTR_ERR(links[link_id].bss); 13151 links[link_id].bss = NULL; 13152 /* the BSS lookup set the specific message already */ 13153 NL_SET_BAD_ATTR(info->extack, link); 13154 return err; 13155 } 13156 13157 if (attrs[NL80211_ATTR_IE]) { 13158 links[link_id].elems = nla_data(attrs[NL80211_ATTR_IE]); 13159 links[link_id].elems_len = 13160 nla_len(attrs[NL80211_ATTR_IE]); 13161 13162 if (cfg80211_find_elem(WLAN_EID_FRAGMENT, 13163 links[link_id].elems, 13164 links[link_id].elems_len)) { 13165 NL_SET_ERR_MSG_ATTR(info->extack, 13166 attrs[NL80211_ATTR_IE], 13167 "cannot deal with fragmentation"); 13168 return -EINVAL; 13169 } 13170 13171 if (cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE, 13172 links[link_id].elems, 13173 links[link_id].elems_len)) { 13174 NL_SET_ERR_MSG_ATTR(info->extack, 13175 attrs[NL80211_ATTR_IE], 13176 "cannot deal with non-inheritance"); 13177 return -EINVAL; 13178 } 13179 } 13180 } 13181 13182 return 0; 13183 } 13184 13185 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info) 13186 { 13187 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13188 struct net_device *dev = info->user_ptr[1]; 13189 struct cfg80211_assoc_request req = {}; 13190 const u8 *ap_addr, *ssid; 13191 unsigned int link_id; 13192 int err, ssid_len; 13193 13194 if (dev->ieee80211_ptr->conn_owner_nlportid && 13195 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 13196 return -EPERM; 13197 13198 if (!info->attrs[NL80211_ATTR_SSID]) 13199 return -EINVAL; 13200 13201 if (!rdev->ops->assoc) 13202 return -EOPNOTSUPP; 13203 13204 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 13205 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 13206 return -EOPNOTSUPP; 13207 13208 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 13209 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 13210 13211 if (info->attrs[NL80211_ATTR_IE]) { 13212 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13213 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13214 13215 if (cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE, 13216 req.ie, req.ie_len)) { 13217 NL_SET_ERR_MSG_ATTR(info->extack, 13218 info->attrs[NL80211_ATTR_IE], 13219 "non-inheritance makes no sense"); 13220 return -EINVAL; 13221 } 13222 } 13223 13224 if (info->attrs[NL80211_ATTR_USE_MFP]) { 13225 enum nl80211_mfp mfp = 13226 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 13227 if (mfp == NL80211_MFP_REQUIRED) 13228 req.use_mfp = true; 13229 else if (mfp != NL80211_MFP_NO) 13230 return -EINVAL; 13231 } 13232 13233 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 13234 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 13235 13236 if (info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]) { 13237 req.supported_selectors = 13238 nla_data(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 13239 req.supported_selectors_len = 13240 nla_len(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 13241 } 13242 13243 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 13244 req.flags |= ASSOC_REQ_DISABLE_HT; 13245 13246 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 13247 memcpy(&req.ht_capa_mask, 13248 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 13249 sizeof(req.ht_capa_mask)); 13250 13251 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 13252 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 13253 return -EINVAL; 13254 memcpy(&req.ht_capa, 13255 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 13256 sizeof(req.ht_capa)); 13257 } 13258 13259 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 13260 req.flags |= ASSOC_REQ_DISABLE_VHT; 13261 13262 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) 13263 req.flags |= ASSOC_REQ_DISABLE_HE; 13264 13265 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) 13266 req.flags |= ASSOC_REQ_DISABLE_EHT; 13267 13268 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_UHR])) 13269 req.flags |= ASSOC_REQ_DISABLE_UHR; 13270 13271 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 13272 memcpy(&req.vht_capa_mask, 13273 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 13274 sizeof(req.vht_capa_mask)); 13275 13276 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 13277 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 13278 return -EINVAL; 13279 memcpy(&req.vht_capa, 13280 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 13281 sizeof(req.vht_capa)); 13282 } 13283 13284 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { 13285 if (!((rdev->wiphy.features & 13286 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) && 13287 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && 13288 !wiphy_ext_feature_isset(&rdev->wiphy, 13289 NL80211_EXT_FEATURE_RRM)) 13290 return -EINVAL; 13291 req.flags |= ASSOC_REQ_USE_RRM; 13292 } 13293 13294 if (info->attrs[NL80211_ATTR_FILS_KEK]) { 13295 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); 13296 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); 13297 if (!info->attrs[NL80211_ATTR_FILS_NONCES]) 13298 return -EINVAL; 13299 req.fils_nonces = 13300 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); 13301 } 13302 13303 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) { 13304 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY]) 13305 return -EINVAL; 13306 memcpy(&req.s1g_capa_mask, 13307 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]), 13308 sizeof(req.s1g_capa_mask)); 13309 } 13310 13311 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) { 13312 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) 13313 return -EINVAL; 13314 memcpy(&req.s1g_capa, 13315 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]), 13316 sizeof(req.s1g_capa)); 13317 } 13318 13319 if (nla_get_flag(info->attrs[NL80211_ATTR_ASSOC_SPP_AMSDU])) { 13320 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13321 NL80211_EXT_FEATURE_SPP_AMSDU_SUPPORT)) { 13322 GENL_SET_ERR_MSG(info, "SPP A-MSDUs not supported"); 13323 return -EINVAL; 13324 } 13325 req.flags |= ASSOC_REQ_SPP_AMSDU; 13326 } 13327 13328 req.link_id = nl80211_link_id_or_invalid(info->attrs); 13329 13330 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { 13331 if (req.link_id < 0) 13332 return -EINVAL; 13333 13334 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) 13335 return -EINVAL; 13336 13337 if (info->attrs[NL80211_ATTR_MAC] || 13338 info->attrs[NL80211_ATTR_WIPHY_FREQ] || 13339 !info->attrs[NL80211_ATTR_MLD_ADDR]) 13340 return -EINVAL; 13341 13342 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 13343 ap_addr = req.ap_mld_addr; 13344 13345 err = nl80211_process_links(rdev, req.links, req.link_id, 13346 ssid, ssid_len, info); 13347 if (err) 13348 goto free; 13349 13350 if (!req.links[req.link_id].bss) { 13351 err = -EINVAL; 13352 goto free; 13353 } 13354 13355 if (req.links[req.link_id].elems_len) { 13356 GENL_SET_ERR_MSG(info, 13357 "cannot have per-link elems on assoc link"); 13358 err = -EINVAL; 13359 goto free; 13360 } 13361 13362 if (info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]) 13363 req.ext_mld_capa_ops = 13364 nla_get_u16(info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]); 13365 } else { 13366 if (req.link_id >= 0) 13367 return -EINVAL; 13368 13369 req.bss = nl80211_assoc_bss(rdev, info, ssid, ssid_len, info->attrs, 13370 -1, -1); 13371 if (IS_ERR(req.bss)) 13372 return PTR_ERR(req.bss); 13373 ap_addr = req.bss->bssid; 13374 13375 if (info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]) 13376 return -EINVAL; 13377 } 13378 13379 err = nl80211_crypto_settings(rdev, info, &req.crypto, 1); 13380 if (!err) { 13381 struct nlattr *link; 13382 int rem = 0; 13383 13384 err = cfg80211_mlme_assoc(rdev, dev, &req, 13385 info->extack); 13386 13387 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 13388 dev->ieee80211_ptr->conn_owner_nlportid = 13389 info->snd_portid; 13390 memcpy(dev->ieee80211_ptr->disconnect_bssid, 13391 ap_addr, ETH_ALEN); 13392 } 13393 13394 /* Report error from first problematic link */ 13395 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { 13396 nla_for_each_nested(link, 13397 info->attrs[NL80211_ATTR_MLO_LINKS], 13398 rem) { 13399 struct nlattr *link_id_attr = 13400 nla_find_nested(link, NL80211_ATTR_MLO_LINK_ID); 13401 13402 if (!link_id_attr) 13403 continue; 13404 13405 link_id = nla_get_u8(link_id_attr); 13406 13407 if (link_id == req.link_id) 13408 continue; 13409 13410 if (!req.links[link_id].error || 13411 WARN_ON(req.links[link_id].error > 0)) 13412 continue; 13413 13414 WARN_ON(err >= 0); 13415 13416 NL_SET_BAD_ATTR(info->extack, link); 13417 err = req.links[link_id].error; 13418 break; 13419 } 13420 } 13421 } 13422 13423 free: 13424 for (link_id = 0; link_id < ARRAY_SIZE(req.links); link_id++) 13425 cfg80211_put_bss(&rdev->wiphy, req.links[link_id].bss); 13426 cfg80211_put_bss(&rdev->wiphy, req.bss); 13427 13428 return err; 13429 } 13430 13431 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info) 13432 { 13433 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13434 struct net_device *dev = info->user_ptr[1]; 13435 const u8 *ie = NULL, *bssid; 13436 int ie_len = 0; 13437 u16 reason_code; 13438 bool local_state_change; 13439 13440 if (dev->ieee80211_ptr->conn_owner_nlportid && 13441 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 13442 return -EPERM; 13443 13444 if (!info->attrs[NL80211_ATTR_MAC]) 13445 return -EINVAL; 13446 13447 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 13448 return -EINVAL; 13449 13450 if (!rdev->ops->deauth) 13451 return -EOPNOTSUPP; 13452 13453 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 13454 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 13455 return -EOPNOTSUPP; 13456 13457 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 13458 13459 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 13460 if (reason_code == 0) { 13461 /* Reason Code 0 is reserved */ 13462 return -EINVAL; 13463 } 13464 13465 if (info->attrs[NL80211_ATTR_IE]) { 13466 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13467 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13468 } 13469 13470 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 13471 13472 return cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code, 13473 local_state_change); 13474 } 13475 13476 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) 13477 { 13478 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13479 struct net_device *dev = info->user_ptr[1]; 13480 const u8 *ie = NULL, *bssid; 13481 int ie_len = 0; 13482 u16 reason_code; 13483 bool local_state_change; 13484 13485 if (dev->ieee80211_ptr->conn_owner_nlportid && 13486 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 13487 return -EPERM; 13488 13489 if (!info->attrs[NL80211_ATTR_MAC]) 13490 return -EINVAL; 13491 13492 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 13493 return -EINVAL; 13494 13495 if (!rdev->ops->disassoc) 13496 return -EOPNOTSUPP; 13497 13498 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 13499 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 13500 return -EOPNOTSUPP; 13501 13502 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 13503 13504 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 13505 if (reason_code == 0) { 13506 /* Reason Code 0 is reserved */ 13507 return -EINVAL; 13508 } 13509 13510 if (info->attrs[NL80211_ATTR_IE]) { 13511 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13512 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13513 } 13514 13515 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 13516 13517 return cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code, 13518 local_state_change); 13519 } 13520 13521 static bool 13522 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev, 13523 int mcast_rate[NUM_NL80211_BANDS], 13524 int rateval) 13525 { 13526 struct wiphy *wiphy = &rdev->wiphy; 13527 bool found = false; 13528 int band, i; 13529 13530 for (band = 0; band < NUM_NL80211_BANDS; band++) { 13531 struct ieee80211_supported_band *sband; 13532 13533 sband = wiphy->bands[band]; 13534 if (!sband) 13535 continue; 13536 13537 for (i = 0; i < sband->n_bitrates; i++) { 13538 if (sband->bitrates[i].bitrate == rateval) { 13539 mcast_rate[band] = i + 1; 13540 found = true; 13541 break; 13542 } 13543 } 13544 } 13545 13546 return found; 13547 } 13548 13549 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info) 13550 { 13551 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13552 struct net_device *dev = info->user_ptr[1]; 13553 struct cfg80211_ibss_params ibss; 13554 struct wiphy *wiphy; 13555 struct cfg80211_cached_keys *connkeys = NULL; 13556 int err; 13557 13558 memset(&ibss, 0, sizeof(ibss)); 13559 13560 if (!info->attrs[NL80211_ATTR_SSID] || 13561 !nla_len(info->attrs[NL80211_ATTR_SSID])) 13562 return -EINVAL; 13563 13564 ibss.beacon_interval = 100; 13565 13566 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) 13567 ibss.beacon_interval = 13568 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 13569 13570 err = cfg80211_validate_beacon_int(rdev, NL80211_IFTYPE_ADHOC, 13571 ibss.beacon_interval); 13572 if (err) 13573 return err; 13574 13575 if (!rdev->ops->join_ibss) 13576 return -EOPNOTSUPP; 13577 13578 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 13579 return -EOPNOTSUPP; 13580 13581 wiphy = &rdev->wiphy; 13582 13583 if (info->attrs[NL80211_ATTR_MAC]) { 13584 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 13585 13586 if (!is_valid_ether_addr(ibss.bssid)) 13587 return -EINVAL; 13588 } 13589 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 13590 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 13591 13592 if (info->attrs[NL80211_ATTR_IE]) { 13593 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13594 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13595 } 13596 13597 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 13598 &ibss.chandef, false); 13599 if (err) 13600 return err; 13601 13602 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef, 13603 NL80211_IFTYPE_ADHOC)) 13604 return -EINVAL; 13605 13606 switch (ibss.chandef.width) { 13607 case NL80211_CHAN_WIDTH_20_NOHT: 13608 break; 13609 case NL80211_CHAN_WIDTH_20: 13610 case NL80211_CHAN_WIDTH_40: 13611 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) 13612 return -EINVAL; 13613 break; 13614 case NL80211_CHAN_WIDTH_80: 13615 case NL80211_CHAN_WIDTH_80P80: 13616 case NL80211_CHAN_WIDTH_160: 13617 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) 13618 return -EINVAL; 13619 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13620 NL80211_EXT_FEATURE_VHT_IBSS)) 13621 return -EINVAL; 13622 break; 13623 case NL80211_CHAN_WIDTH_320: 13624 return -EINVAL; 13625 default: 13626 return -EINVAL; 13627 } 13628 13629 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; 13630 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 13631 13632 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 13633 u8 *rates = 13634 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 13635 int n_rates = 13636 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 13637 struct ieee80211_supported_band *sband = 13638 wiphy->bands[ibss.chandef.chan->band]; 13639 13640 err = ieee80211_get_ratemask(sband, rates, n_rates, 13641 &ibss.basic_rates); 13642 if (err) 13643 return err; 13644 } 13645 13646 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 13647 memcpy(&ibss.ht_capa_mask, 13648 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 13649 sizeof(ibss.ht_capa_mask)); 13650 13651 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 13652 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 13653 return -EINVAL; 13654 memcpy(&ibss.ht_capa, 13655 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 13656 sizeof(ibss.ht_capa)); 13657 } 13658 13659 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 13660 !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate, 13661 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 13662 return -EINVAL; 13663 13664 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { 13665 bool no_ht = false; 13666 13667 connkeys = nl80211_parse_connkeys(rdev, dev->ieee80211_ptr, 13668 info, &no_ht); 13669 if (IS_ERR(connkeys)) 13670 return PTR_ERR(connkeys); 13671 13672 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) && 13673 no_ht) { 13674 kfree_sensitive(connkeys); 13675 return -EINVAL; 13676 } 13677 } 13678 13679 ibss.control_port = 13680 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); 13681 13682 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 13683 int r = validate_pae_over_nl80211(rdev, info); 13684 13685 if (r < 0) { 13686 kfree_sensitive(connkeys); 13687 return r; 13688 } 13689 13690 ibss.control_port_over_nl80211 = true; 13691 } 13692 13693 ibss.userspace_handles_dfs = 13694 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 13695 13696 err = __cfg80211_join_ibss(rdev, dev, &ibss, connkeys); 13697 if (err) 13698 kfree_sensitive(connkeys); 13699 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 13700 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 13701 13702 return err; 13703 } 13704 13705 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info) 13706 { 13707 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13708 struct net_device *dev = info->user_ptr[1]; 13709 13710 if (!rdev->ops->leave_ibss) 13711 return -EOPNOTSUPP; 13712 13713 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 13714 return -EOPNOTSUPP; 13715 13716 return cfg80211_leave_ibss(rdev, dev, false); 13717 } 13718 13719 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info) 13720 { 13721 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13722 struct net_device *dev = info->user_ptr[1]; 13723 int mcast_rate[NUM_NL80211_BANDS]; 13724 u32 nla_rate; 13725 13726 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && 13727 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && 13728 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) 13729 return -EOPNOTSUPP; 13730 13731 if (!rdev->ops->set_mcast_rate) 13732 return -EOPNOTSUPP; 13733 13734 memset(mcast_rate, 0, sizeof(mcast_rate)); 13735 13736 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) 13737 return -EINVAL; 13738 13739 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); 13740 if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate)) 13741 return -EINVAL; 13742 13743 return rdev_set_mcast_rate(rdev, dev, mcast_rate); 13744 } 13745 13746 static struct sk_buff * 13747 __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev, 13748 struct wireless_dev *wdev, int approxlen, 13749 u32 portid, u32 seq, enum nl80211_commands cmd, 13750 enum nl80211_attrs attr, 13751 const struct nl80211_vendor_cmd_info *info, 13752 gfp_t gfp) 13753 { 13754 struct sk_buff *skb; 13755 void *hdr; 13756 struct nlattr *data; 13757 13758 skb = nlmsg_new(approxlen + 100, gfp); 13759 if (!skb) 13760 return NULL; 13761 13762 hdr = nl80211hdr_put(skb, portid, seq, 0, cmd); 13763 if (!hdr) { 13764 kfree_skb(skb); 13765 return NULL; 13766 } 13767 13768 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 13769 goto nla_put_failure; 13770 13771 if (info) { 13772 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID, 13773 info->vendor_id)) 13774 goto nla_put_failure; 13775 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD, 13776 info->subcmd)) 13777 goto nla_put_failure; 13778 } 13779 13780 if (wdev) { 13781 if (nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 13782 wdev_id(wdev), NL80211_ATTR_PAD)) 13783 goto nla_put_failure; 13784 if (wdev->netdev && 13785 nla_put_u32(skb, NL80211_ATTR_IFINDEX, 13786 wdev->netdev->ifindex)) 13787 goto nla_put_failure; 13788 } 13789 13790 data = nla_nest_start_noflag(skb, attr); 13791 if (!data) 13792 goto nla_put_failure; 13793 13794 ((void **)skb->cb)[0] = rdev; 13795 ((void **)skb->cb)[1] = hdr; 13796 ((void **)skb->cb)[2] = data; 13797 13798 return skb; 13799 13800 nla_put_failure: 13801 kfree_skb(skb); 13802 return NULL; 13803 } 13804 13805 struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy, 13806 struct wireless_dev *wdev, 13807 enum nl80211_commands cmd, 13808 enum nl80211_attrs attr, 13809 unsigned int portid, 13810 int vendor_event_idx, 13811 int approxlen, gfp_t gfp) 13812 { 13813 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 13814 const struct nl80211_vendor_cmd_info *info; 13815 13816 switch (cmd) { 13817 case NL80211_CMD_TESTMODE: 13818 if (WARN_ON(vendor_event_idx != -1)) 13819 return NULL; 13820 info = NULL; 13821 break; 13822 case NL80211_CMD_VENDOR: 13823 if (WARN_ON(vendor_event_idx < 0 || 13824 vendor_event_idx >= wiphy->n_vendor_events)) 13825 return NULL; 13826 info = &wiphy->vendor_events[vendor_event_idx]; 13827 break; 13828 default: 13829 WARN_ON(1); 13830 return NULL; 13831 } 13832 13833 return __cfg80211_alloc_vendor_skb(rdev, wdev, approxlen, portid, 0, 13834 cmd, attr, info, gfp); 13835 } 13836 EXPORT_SYMBOL(__cfg80211_alloc_event_skb); 13837 13838 void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp) 13839 { 13840 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 13841 void *hdr = ((void **)skb->cb)[1]; 13842 struct nlmsghdr *nlhdr = nlmsg_hdr(skb); 13843 struct nlattr *data = ((void **)skb->cb)[2]; 13844 enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE; 13845 13846 /* clear CB data for netlink core to own from now on */ 13847 memset(skb->cb, 0, sizeof(skb->cb)); 13848 13849 nla_nest_end(skb, data); 13850 genlmsg_end(skb, hdr); 13851 13852 if (nlhdr->nlmsg_pid) { 13853 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb, 13854 nlhdr->nlmsg_pid); 13855 } else { 13856 if (data->nla_type == NL80211_ATTR_VENDOR_DATA) 13857 mcgrp = NL80211_MCGRP_VENDOR; 13858 13859 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 13860 skb, 0, mcgrp, gfp); 13861 } 13862 } 13863 EXPORT_SYMBOL(__cfg80211_send_event_skb); 13864 13865 #ifdef CONFIG_NL80211_TESTMODE 13866 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) 13867 { 13868 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13869 struct wireless_dev *wdev; 13870 int err; 13871 13872 lockdep_assert_held(&rdev->wiphy.mtx); 13873 13874 wdev = __cfg80211_wdev_from_attrs(rdev, genl_info_net(info), 13875 info->attrs); 13876 13877 if (!rdev->ops->testmode_cmd) 13878 return -EOPNOTSUPP; 13879 13880 if (IS_ERR(wdev)) { 13881 err = PTR_ERR(wdev); 13882 if (err != -EINVAL) 13883 return err; 13884 wdev = NULL; 13885 } else if (wdev->wiphy != &rdev->wiphy) { 13886 return -EINVAL; 13887 } 13888 13889 if (!info->attrs[NL80211_ATTR_TESTDATA]) 13890 return -EINVAL; 13891 13892 rdev->cur_cmd_info = info; 13893 err = rdev_testmode_cmd(rdev, wdev, 13894 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), 13895 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); 13896 rdev->cur_cmd_info = NULL; 13897 13898 return err; 13899 } 13900 13901 static int nl80211_testmode_dump(struct sk_buff *skb, 13902 struct netlink_callback *cb) 13903 { 13904 struct cfg80211_registered_device *rdev; 13905 struct nlattr **attrbuf = NULL; 13906 int err; 13907 long phy_idx; 13908 void *data = NULL; 13909 int data_len = 0; 13910 13911 rtnl_lock(); 13912 13913 if (cb->args[0]) { 13914 /* 13915 * 0 is a valid index, but not valid for args[0], 13916 * so we need to offset by 1. 13917 */ 13918 phy_idx = cb->args[0] - 1; 13919 13920 rdev = cfg80211_rdev_by_wiphy_idx(phy_idx); 13921 if (!rdev) { 13922 err = -ENOENT; 13923 goto out_err; 13924 } 13925 13926 /* 13927 * The wiphy may have moved netns between dumpit 13928 * invocations (via NL80211_CMD_SET_WIPHY_NETNS), so 13929 * re-check that it still matches the caller's netns. 13930 */ 13931 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) { 13932 err = -ENODEV; 13933 goto out_err; 13934 } 13935 } else { 13936 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 13937 if (!attrbuf) { 13938 err = -ENOMEM; 13939 goto out_err; 13940 } 13941 13942 err = nlmsg_parse_deprecated(cb->nlh, 13943 GENL_HDRLEN + nl80211_fam.hdrsize, 13944 attrbuf, nl80211_fam.maxattr, 13945 nl80211_policy, NULL); 13946 if (err) 13947 goto out_err; 13948 13949 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); 13950 if (IS_ERR(rdev)) { 13951 err = PTR_ERR(rdev); 13952 goto out_err; 13953 } 13954 phy_idx = rdev->wiphy_idx; 13955 13956 if (attrbuf[NL80211_ATTR_TESTDATA]) 13957 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; 13958 } 13959 13960 if (cb->args[1]) { 13961 data = nla_data((void *)cb->args[1]); 13962 data_len = nla_len((void *)cb->args[1]); 13963 } 13964 13965 if (!rdev->ops->testmode_dump) { 13966 err = -EOPNOTSUPP; 13967 goto out_err; 13968 } 13969 13970 while (1) { 13971 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 13972 cb->nlh->nlmsg_seq, NLM_F_MULTI, 13973 NL80211_CMD_TESTMODE); 13974 struct nlattr *tmdata; 13975 13976 if (!hdr) 13977 break; 13978 13979 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) { 13980 genlmsg_cancel(skb, hdr); 13981 break; 13982 } 13983 13984 tmdata = nla_nest_start_noflag(skb, NL80211_ATTR_TESTDATA); 13985 if (!tmdata) { 13986 genlmsg_cancel(skb, hdr); 13987 break; 13988 } 13989 err = rdev_testmode_dump(rdev, skb, cb, data, data_len); 13990 nla_nest_end(skb, tmdata); 13991 13992 if (err == -ENOBUFS || err == -ENOENT) { 13993 genlmsg_cancel(skb, hdr); 13994 break; 13995 } else if (err) { 13996 genlmsg_cancel(skb, hdr); 13997 goto out_err; 13998 } 13999 14000 genlmsg_end(skb, hdr); 14001 } 14002 14003 err = skb->len; 14004 /* see above */ 14005 cb->args[0] = phy_idx + 1; 14006 out_err: 14007 kfree(attrbuf); 14008 rtnl_unlock(); 14009 return err; 14010 } 14011 #endif 14012 14013 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info) 14014 { 14015 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14016 struct net_device *dev = info->user_ptr[1]; 14017 struct cfg80211_connect_params connect; 14018 struct wiphy *wiphy; 14019 struct cfg80211_cached_keys *connkeys = NULL; 14020 u32 freq = 0; 14021 int err; 14022 14023 memset(&connect, 0, sizeof(connect)); 14024 14025 if (!info->attrs[NL80211_ATTR_SSID] || 14026 !nla_len(info->attrs[NL80211_ATTR_SSID])) 14027 return -EINVAL; 14028 14029 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 14030 connect.auth_type = 14031 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 14032 if (!nl80211_valid_auth_type(rdev, connect.auth_type, 14033 NL80211_CMD_CONNECT)) 14034 return -EINVAL; 14035 } else 14036 connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC; 14037 14038 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; 14039 14040 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] && 14041 !wiphy_ext_feature_isset(&rdev->wiphy, 14042 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 14043 return -EINVAL; 14044 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS]; 14045 14046 err = nl80211_crypto_settings(rdev, info, &connect.crypto, 14047 NL80211_MAX_NR_CIPHER_SUITES); 14048 if (err) 14049 return err; 14050 14051 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14052 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 14053 return -EOPNOTSUPP; 14054 14055 wiphy = &rdev->wiphy; 14056 14057 connect.bg_scan_period = -1; 14058 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && 14059 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { 14060 connect.bg_scan_period = 14061 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); 14062 } 14063 14064 if (info->attrs[NL80211_ATTR_MAC]) 14065 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 14066 else if (info->attrs[NL80211_ATTR_MAC_HINT]) 14067 connect.bssid_hint = 14068 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]); 14069 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 14070 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 14071 14072 if (info->attrs[NL80211_ATTR_IE]) { 14073 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 14074 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 14075 } 14076 14077 if (info->attrs[NL80211_ATTR_USE_MFP]) { 14078 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 14079 if (connect.mfp == NL80211_MFP_OPTIONAL && 14080 !wiphy_ext_feature_isset(&rdev->wiphy, 14081 NL80211_EXT_FEATURE_MFP_OPTIONAL)) 14082 return -EOPNOTSUPP; 14083 } else { 14084 connect.mfp = NL80211_MFP_NO; 14085 } 14086 14087 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 14088 connect.prev_bssid = 14089 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 14090 14091 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) 14092 freq = MHZ_TO_KHZ(nla_get_u32( 14093 info->attrs[NL80211_ATTR_WIPHY_FREQ])); 14094 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 14095 freq += 14096 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 14097 14098 if (freq) { 14099 connect.channel = nl80211_get_valid_chan(wiphy, freq); 14100 if (!connect.channel) 14101 return -EINVAL; 14102 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) { 14103 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]); 14104 freq = MHZ_TO_KHZ(freq); 14105 connect.channel_hint = nl80211_get_valid_chan(wiphy, freq); 14106 if (!connect.channel_hint) 14107 return -EINVAL; 14108 } 14109 14110 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { 14111 connect.edmg.channels = 14112 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); 14113 14114 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) 14115 connect.edmg.bw_config = 14116 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); 14117 } 14118 14119 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { 14120 connkeys = nl80211_parse_connkeys(rdev, dev->ieee80211_ptr, 14121 info, NULL); 14122 if (IS_ERR(connkeys)) 14123 return PTR_ERR(connkeys); 14124 } 14125 14126 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 14127 connect.flags |= ASSOC_REQ_DISABLE_HT; 14128 14129 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 14130 memcpy(&connect.ht_capa_mask, 14131 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 14132 sizeof(connect.ht_capa_mask)); 14133 14134 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 14135 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { 14136 kfree_sensitive(connkeys); 14137 return -EINVAL; 14138 } 14139 memcpy(&connect.ht_capa, 14140 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 14141 sizeof(connect.ht_capa)); 14142 } 14143 14144 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 14145 connect.flags |= ASSOC_REQ_DISABLE_VHT; 14146 14147 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) 14148 connect.flags |= ASSOC_REQ_DISABLE_HE; 14149 14150 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) 14151 connect.flags |= ASSOC_REQ_DISABLE_EHT; 14152 14153 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_UHR])) 14154 connect.flags |= ASSOC_REQ_DISABLE_UHR; 14155 14156 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 14157 memcpy(&connect.vht_capa_mask, 14158 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 14159 sizeof(connect.vht_capa_mask)); 14160 14161 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 14162 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { 14163 kfree_sensitive(connkeys); 14164 return -EINVAL; 14165 } 14166 memcpy(&connect.vht_capa, 14167 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 14168 sizeof(connect.vht_capa)); 14169 } 14170 14171 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { 14172 if (!((rdev->wiphy.features & 14173 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) && 14174 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && 14175 !wiphy_ext_feature_isset(&rdev->wiphy, 14176 NL80211_EXT_FEATURE_RRM)) { 14177 kfree_sensitive(connkeys); 14178 return -EINVAL; 14179 } 14180 connect.flags |= ASSOC_REQ_USE_RRM; 14181 } 14182 14183 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); 14184 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { 14185 kfree_sensitive(connkeys); 14186 return -EOPNOTSUPP; 14187 } 14188 14189 if (info->attrs[NL80211_ATTR_BSS_SELECT]) { 14190 /* bss selection makes no sense if bssid is set */ 14191 if (connect.bssid) { 14192 kfree_sensitive(connkeys); 14193 return -EINVAL; 14194 } 14195 14196 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT], 14197 wiphy, &connect.bss_select); 14198 if (err) { 14199 kfree_sensitive(connkeys); 14200 return err; 14201 } 14202 } 14203 14204 if (wiphy_ext_feature_isset(&rdev->wiphy, 14205 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) && 14206 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && 14207 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && 14208 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && 14209 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 14210 connect.fils_erp_username = 14211 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 14212 connect.fils_erp_username_len = 14213 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 14214 connect.fils_erp_realm = 14215 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 14216 connect.fils_erp_realm_len = 14217 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 14218 connect.fils_erp_next_seq_num = 14219 nla_get_u16( 14220 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); 14221 connect.fils_erp_rrk = 14222 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 14223 connect.fils_erp_rrk_len = 14224 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 14225 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || 14226 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || 14227 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || 14228 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 14229 kfree_sensitive(connkeys); 14230 return -EINVAL; 14231 } 14232 14233 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) { 14234 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 14235 kfree_sensitive(connkeys); 14236 GENL_SET_ERR_MSG(info, 14237 "external auth requires connection ownership"); 14238 return -EINVAL; 14239 } 14240 connect.flags |= CONNECT_REQ_EXTERNAL_AUTH_SUPPORT; 14241 } 14242 14243 if (nla_get_flag(info->attrs[NL80211_ATTR_MLO_SUPPORT])) 14244 connect.flags |= CONNECT_REQ_MLO_SUPPORT; 14245 14246 err = cfg80211_connect(rdev, dev, &connect, connkeys, 14247 connect.prev_bssid); 14248 if (err) 14249 kfree_sensitive(connkeys); 14250 14251 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 14252 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 14253 if (connect.bssid) 14254 memcpy(dev->ieee80211_ptr->disconnect_bssid, 14255 connect.bssid, ETH_ALEN); 14256 else 14257 eth_zero_addr(dev->ieee80211_ptr->disconnect_bssid); 14258 } 14259 14260 return err; 14261 } 14262 14263 static int nl80211_update_connect_params(struct sk_buff *skb, 14264 struct genl_info *info) 14265 { 14266 struct cfg80211_connect_params connect = {}; 14267 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14268 struct net_device *dev = info->user_ptr[1]; 14269 struct wireless_dev *wdev = dev->ieee80211_ptr; 14270 bool fils_sk_offload; 14271 u32 auth_type; 14272 u32 changed = 0; 14273 14274 if (!rdev->ops->update_connect_params) 14275 return -EOPNOTSUPP; 14276 14277 if (info->attrs[NL80211_ATTR_IE]) { 14278 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 14279 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 14280 changed |= UPDATE_ASSOC_IES; 14281 } 14282 14283 fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy, 14284 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD); 14285 14286 /* 14287 * when driver supports fils-sk offload all attributes must be 14288 * provided. So the else covers "fils-sk-not-all" and 14289 * "no-fils-sk-any". 14290 */ 14291 if (fils_sk_offload && 14292 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && 14293 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && 14294 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && 14295 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 14296 connect.fils_erp_username = 14297 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 14298 connect.fils_erp_username_len = 14299 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 14300 connect.fils_erp_realm = 14301 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 14302 connect.fils_erp_realm_len = 14303 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 14304 connect.fils_erp_next_seq_num = 14305 nla_get_u16( 14306 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); 14307 connect.fils_erp_rrk = 14308 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 14309 connect.fils_erp_rrk_len = 14310 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 14311 changed |= UPDATE_FILS_ERP_INFO; 14312 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || 14313 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || 14314 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || 14315 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 14316 return -EINVAL; 14317 } 14318 14319 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 14320 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 14321 if (!nl80211_valid_auth_type(rdev, auth_type, 14322 NL80211_CMD_CONNECT)) 14323 return -EINVAL; 14324 14325 if (auth_type == NL80211_AUTHTYPE_FILS_SK && 14326 fils_sk_offload && !(changed & UPDATE_FILS_ERP_INFO)) 14327 return -EINVAL; 14328 14329 connect.auth_type = auth_type; 14330 changed |= UPDATE_AUTH_TYPE; 14331 } 14332 14333 if (!wdev->connected) 14334 return -ENOLINK; 14335 14336 return rdev_update_connect_params(rdev, dev, &connect, changed); 14337 } 14338 14339 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info) 14340 { 14341 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14342 struct net_device *dev = info->user_ptr[1]; 14343 u16 reason; 14344 14345 if (dev->ieee80211_ptr->conn_owner_nlportid && 14346 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 14347 return -EPERM; 14348 14349 reason = nla_get_u16_default(info->attrs[NL80211_ATTR_REASON_CODE], 14350 WLAN_REASON_DEAUTH_LEAVING); 14351 14352 if (reason == 0) 14353 return -EINVAL; 14354 14355 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14356 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 14357 return -EOPNOTSUPP; 14358 14359 return cfg80211_disconnect(rdev, dev, reason, true); 14360 } 14361 14362 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info) 14363 { 14364 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14365 struct net *net; 14366 int err; 14367 14368 if (info->attrs[NL80211_ATTR_PID]) { 14369 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); 14370 14371 net = get_net_ns_by_pid(pid); 14372 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) { 14373 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]); 14374 14375 net = get_net_ns_by_fd(fd); 14376 } else { 14377 return -EINVAL; 14378 } 14379 14380 if (IS_ERR(net)) 14381 return PTR_ERR(net); 14382 14383 /* 14384 * The caller already has CAP_NET_ADMIN over the source netns 14385 * (enforced by GENL_UNS_ADMIN_PERM on the genl op). Mirror the 14386 * convention used by net/core/rtnetlink.c::rtnl_get_net_ns_capable() 14387 * and require CAP_NET_ADMIN over the target netns as well, so that 14388 * a caller that is privileged in their own user namespace cannot 14389 * push a wiphy into a netns where they have no privilege. 14390 */ 14391 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) { 14392 put_net(net); 14393 return -EPERM; 14394 } 14395 14396 err = 0; 14397 14398 /* check if anything to do */ 14399 if (!net_eq(wiphy_net(&rdev->wiphy), net)) 14400 err = cfg80211_switch_netns(rdev, net); 14401 14402 put_net(net); 14403 return err; 14404 } 14405 14406 static int nl80211_set_pmksa(struct sk_buff *skb, struct genl_info *info) 14407 { 14408 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14409 struct net_device *dev = info->user_ptr[1]; 14410 struct cfg80211_pmksa pmksa; 14411 bool ap_pmksa_caching_support = false; 14412 14413 memset(&pmksa, 0, sizeof(struct cfg80211_pmksa)); 14414 14415 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, 14416 NL80211_EXT_FEATURE_AP_PMKSA_CACHING); 14417 14418 if (!info->attrs[NL80211_ATTR_PMKID]) 14419 return -EINVAL; 14420 14421 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 14422 14423 if (info->attrs[NL80211_ATTR_MAC]) { 14424 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 14425 } else if (info->attrs[NL80211_ATTR_SSID] && 14426 info->attrs[NL80211_ATTR_FILS_CACHE_ID] && 14427 info->attrs[NL80211_ATTR_PMK]) { 14428 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 14429 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 14430 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); 14431 } else { 14432 return -EINVAL; 14433 } 14434 14435 if (info->attrs[NL80211_ATTR_PMK]) { 14436 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); 14437 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); 14438 } 14439 14440 if (info->attrs[NL80211_ATTR_PMK_LIFETIME]) 14441 pmksa.pmk_lifetime = 14442 nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]); 14443 14444 if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]) 14445 pmksa.pmk_reauth_threshold = 14446 nla_get_u8(info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]); 14447 14448 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14449 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && 14450 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || 14451 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && 14452 ap_pmksa_caching_support)) 14453 return -EOPNOTSUPP; 14454 14455 if (!rdev->ops->set_pmksa) 14456 return -EOPNOTSUPP; 14457 14458 return rdev_set_pmksa(rdev, dev, &pmksa); 14459 } 14460 14461 static int nl80211_del_pmksa(struct sk_buff *skb, struct genl_info *info) 14462 { 14463 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14464 struct net_device *dev = info->user_ptr[1]; 14465 struct cfg80211_pmksa pmksa; 14466 bool sae_offload_support = false; 14467 bool owe_offload_support = false; 14468 bool ap_pmksa_caching_support = false; 14469 14470 memset(&pmksa, 0, sizeof(struct cfg80211_pmksa)); 14471 14472 sae_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, 14473 NL80211_EXT_FEATURE_SAE_OFFLOAD); 14474 owe_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, 14475 NL80211_EXT_FEATURE_OWE_OFFLOAD); 14476 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, 14477 NL80211_EXT_FEATURE_AP_PMKSA_CACHING); 14478 14479 if (info->attrs[NL80211_ATTR_PMKID]) 14480 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 14481 14482 if (info->attrs[NL80211_ATTR_MAC]) { 14483 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 14484 } else if (info->attrs[NL80211_ATTR_SSID]) { 14485 /* SSID based pmksa flush supported only for FILS, 14486 * OWE/SAE OFFLOAD cases 14487 */ 14488 if (info->attrs[NL80211_ATTR_FILS_CACHE_ID] && 14489 info->attrs[NL80211_ATTR_PMK]) { 14490 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); 14491 } else if (!sae_offload_support && !owe_offload_support) { 14492 return -EINVAL; 14493 } 14494 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 14495 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 14496 } else { 14497 return -EINVAL; 14498 } 14499 14500 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14501 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && 14502 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || 14503 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && 14504 ap_pmksa_caching_support)) 14505 return -EOPNOTSUPP; 14506 14507 if (!rdev->ops->del_pmksa) 14508 return -EOPNOTSUPP; 14509 14510 return rdev_del_pmksa(rdev, dev, &pmksa); 14511 } 14512 14513 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info) 14514 { 14515 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14516 struct net_device *dev = info->user_ptr[1]; 14517 14518 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14519 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 14520 return -EOPNOTSUPP; 14521 14522 if (!rdev->ops->flush_pmksa) 14523 return -EOPNOTSUPP; 14524 14525 return rdev_flush_pmksa(rdev, dev); 14526 } 14527 14528 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info) 14529 { 14530 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14531 struct net_device *dev = info->user_ptr[1]; 14532 u8 action_code, dialog_token; 14533 u32 peer_capability = 0; 14534 u16 status_code; 14535 u8 *peer; 14536 int link_id; 14537 bool initiator; 14538 14539 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 14540 !rdev->ops->tdls_mgmt) 14541 return -EOPNOTSUPP; 14542 14543 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || 14544 !info->attrs[NL80211_ATTR_STATUS_CODE] || 14545 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || 14546 !info->attrs[NL80211_ATTR_IE] || 14547 !info->attrs[NL80211_ATTR_MAC]) 14548 return -EINVAL; 14549 14550 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 14551 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); 14552 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 14553 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); 14554 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]); 14555 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]) 14556 peer_capability = 14557 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]); 14558 link_id = nl80211_link_id_or_invalid(info->attrs); 14559 14560 return rdev_tdls_mgmt(rdev, dev, peer, link_id, action_code, 14561 dialog_token, status_code, peer_capability, 14562 initiator, 14563 nla_data(info->attrs[NL80211_ATTR_IE]), 14564 nla_len(info->attrs[NL80211_ATTR_IE])); 14565 } 14566 14567 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info) 14568 { 14569 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14570 struct net_device *dev = info->user_ptr[1]; 14571 enum nl80211_tdls_operation operation; 14572 u8 *peer; 14573 14574 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 14575 !rdev->ops->tdls_oper) 14576 return -EOPNOTSUPP; 14577 14578 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || 14579 !info->attrs[NL80211_ATTR_MAC]) 14580 return -EINVAL; 14581 14582 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); 14583 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 14584 14585 return rdev_tdls_oper(rdev, dev, peer, operation); 14586 } 14587 14588 static int nl80211_remain_on_channel(struct sk_buff *skb, 14589 struct genl_info *info) 14590 { 14591 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14592 unsigned int link_id = nl80211_link_id(info->attrs); 14593 struct wireless_dev *wdev = info->user_ptr[1]; 14594 struct cfg80211_chan_def chandef; 14595 const u8 *rx_addr = NULL; 14596 struct sk_buff *msg; 14597 void *hdr; 14598 u64 cookie; 14599 u32 duration; 14600 int err; 14601 14602 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 14603 !info->attrs[NL80211_ATTR_DURATION]) 14604 return -EINVAL; 14605 14606 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 14607 14608 if (info->attrs[NL80211_ATTR_MAC]) 14609 rx_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 14610 14611 if (rx_addr && 14612 !wiphy_ext_feature_isset(wdev->wiphy, 14613 NL80211_EXT_FEATURE_ROC_ADDR_FILTER)) 14614 return -EOPNOTSUPP; 14615 14616 if (!rdev->ops->remain_on_channel || 14617 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) 14618 return -EOPNOTSUPP; 14619 14620 /* 14621 * We should be on that channel for at least a minimum amount of 14622 * time (10ms) but no longer than the driver supports. 14623 */ 14624 if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 14625 duration > rdev->wiphy.max_remain_on_channel_duration) 14626 return -EINVAL; 14627 14628 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef, 14629 false); 14630 if (err) 14631 return err; 14632 14633 if (!cfg80211_off_channel_oper_allowed(wdev, chandef.chan)) { 14634 const struct cfg80211_chan_def *oper_chandef, *compat_chandef; 14635 14636 oper_chandef = wdev_chandef(wdev, link_id); 14637 14638 if (WARN_ON(!oper_chandef)) { 14639 /* cannot happen since we must beacon to get here */ 14640 WARN_ON(1); 14641 return -EBUSY; 14642 } 14643 14644 /* note: returns first one if identical chandefs */ 14645 compat_chandef = cfg80211_chandef_compatible(&chandef, 14646 oper_chandef); 14647 14648 if (compat_chandef != &chandef) 14649 return -EBUSY; 14650 } 14651 14652 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14653 if (!msg) 14654 return -ENOMEM; 14655 14656 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 14657 NL80211_CMD_REMAIN_ON_CHANNEL); 14658 if (!hdr) { 14659 err = -ENOBUFS; 14660 goto free_msg; 14661 } 14662 14663 cookie = cfg80211_assign_cookie(rdev); 14664 err = rdev_remain_on_channel(rdev, wdev, chandef.chan, 14665 duration, cookie, rx_addr); 14666 14667 if (err) 14668 goto free_msg; 14669 14670 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 14671 NL80211_ATTR_PAD)) 14672 goto nla_put_failure; 14673 14674 genlmsg_end(msg, hdr); 14675 14676 return genlmsg_reply(msg, info); 14677 14678 nla_put_failure: 14679 err = -ENOBUFS; 14680 free_msg: 14681 nlmsg_free(msg); 14682 return err; 14683 } 14684 14685 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb, 14686 struct genl_info *info) 14687 { 14688 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14689 struct wireless_dev *wdev = info->user_ptr[1]; 14690 u64 cookie; 14691 14692 if (!info->attrs[NL80211_ATTR_COOKIE]) 14693 return -EINVAL; 14694 14695 if (!rdev->ops->cancel_remain_on_channel) 14696 return -EOPNOTSUPP; 14697 14698 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 14699 14700 return rdev_cancel_remain_on_channel(rdev, wdev, cookie); 14701 } 14702 14703 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb, 14704 struct genl_info *info) 14705 { 14706 struct cfg80211_bitrate_mask mask; 14707 unsigned int link_id = nl80211_link_id(info->attrs); 14708 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14709 struct net_device *dev = info->user_ptr[1]; 14710 int err; 14711 14712 if (!rdev->ops->set_bitrate_mask) 14713 return -EOPNOTSUPP; 14714 14715 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, 14716 NL80211_ATTR_TX_RATES, &mask, 14717 dev, true, link_id); 14718 if (err) 14719 return err; 14720 14721 return rdev_set_bitrate_mask(rdev, dev, link_id, NULL, &mask); 14722 } 14723 14724 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info) 14725 { 14726 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14727 struct wireless_dev *wdev = info->user_ptr[1]; 14728 u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION; 14729 14730 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) 14731 return -EINVAL; 14732 14733 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) 14734 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); 14735 14736 switch (wdev->iftype) { 14737 case NL80211_IFTYPE_STATION: 14738 case NL80211_IFTYPE_ADHOC: 14739 case NL80211_IFTYPE_P2P_CLIENT: 14740 case NL80211_IFTYPE_AP: 14741 case NL80211_IFTYPE_AP_VLAN: 14742 case NL80211_IFTYPE_MESH_POINT: 14743 case NL80211_IFTYPE_P2P_GO: 14744 case NL80211_IFTYPE_P2P_DEVICE: 14745 break; 14746 case NL80211_IFTYPE_NAN: 14747 case NL80211_IFTYPE_NAN_DATA: 14748 if (!wiphy_ext_feature_isset(wdev->wiphy, 14749 NL80211_EXT_FEATURE_SECURE_NAN) && 14750 !(wdev->wiphy->nan_capa.flags & 14751 WIPHY_NAN_FLAGS_USERSPACE_DE)) 14752 return -EOPNOTSUPP; 14753 break; 14754 case NL80211_IFTYPE_PD: 14755 if (!wiphy_ext_feature_isset(wdev->wiphy, 14756 NL80211_EXT_FEATURE_SECURE_RTT)) 14757 return -EOPNOTSUPP; 14758 break; 14759 default: 14760 return -EOPNOTSUPP; 14761 } 14762 14763 /* not much point in registering if we can't reply */ 14764 if (!rdev->ops->mgmt_tx) 14765 return -EOPNOTSUPP; 14766 14767 if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] && 14768 !wiphy_ext_feature_isset(&rdev->wiphy, 14769 NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS)) { 14770 GENL_SET_ERR_MSG(info, 14771 "multicast RX registrations are not supported"); 14772 return -EOPNOTSUPP; 14773 } 14774 14775 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, 14776 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), 14777 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]), 14778 info->attrs[NL80211_ATTR_RECEIVE_MULTICAST], 14779 info->extack); 14780 } 14781 14782 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info) 14783 { 14784 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14785 struct wireless_dev *wdev = info->user_ptr[1]; 14786 struct cfg80211_chan_def chandef; 14787 int err; 14788 void *hdr = NULL; 14789 u64 cookie; 14790 struct sk_buff *msg = NULL; 14791 struct cfg80211_mgmt_tx_params params = { 14792 .dont_wait_for_ack = 14793 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], 14794 }; 14795 14796 if (!info->attrs[NL80211_ATTR_FRAME]) 14797 return -EINVAL; 14798 14799 if (!rdev->ops->mgmt_tx) 14800 return -EOPNOTSUPP; 14801 14802 switch (wdev->iftype) { 14803 case NL80211_IFTYPE_P2P_DEVICE: 14804 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 14805 return -EINVAL; 14806 break; 14807 case NL80211_IFTYPE_STATION: 14808 case NL80211_IFTYPE_ADHOC: 14809 case NL80211_IFTYPE_P2P_CLIENT: 14810 case NL80211_IFTYPE_AP: 14811 case NL80211_IFTYPE_AP_VLAN: 14812 case NL80211_IFTYPE_MESH_POINT: 14813 case NL80211_IFTYPE_P2P_GO: 14814 break; 14815 case NL80211_IFTYPE_NAN: 14816 case NL80211_IFTYPE_NAN_DATA: 14817 if (!wiphy_ext_feature_isset(wdev->wiphy, 14818 NL80211_EXT_FEATURE_SECURE_NAN) && 14819 !(wdev->wiphy->nan_capa.flags & 14820 WIPHY_NAN_FLAGS_USERSPACE_DE)) 14821 return -EOPNOTSUPP; 14822 break; 14823 case NL80211_IFTYPE_PD: 14824 if (!wiphy_ext_feature_isset(wdev->wiphy, 14825 NL80211_EXT_FEATURE_SECURE_RTT)) 14826 return -EOPNOTSUPP; 14827 break; 14828 default: 14829 return -EOPNOTSUPP; 14830 } 14831 14832 if (info->attrs[NL80211_ATTR_DURATION]) { 14833 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 14834 return -EINVAL; 14835 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 14836 14837 /* 14838 * We should wait on the channel for at least a minimum amount 14839 * of time (10ms) but no longer than the driver supports. 14840 */ 14841 if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 14842 params.wait > rdev->wiphy.max_remain_on_channel_duration) 14843 return -EINVAL; 14844 } 14845 14846 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; 14847 14848 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 14849 return -EINVAL; 14850 14851 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 14852 14853 /* get the channel if any has been specified, otherwise pass NULL to 14854 * the driver. The latter will use the current one 14855 */ 14856 chandef.chan = NULL; 14857 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 14858 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 14859 &chandef, false); 14860 if (err) 14861 return err; 14862 } 14863 14864 if (!chandef.chan && params.offchan) 14865 return -EINVAL; 14866 14867 if (params.offchan && 14868 !cfg80211_off_channel_oper_allowed(wdev, chandef.chan)) 14869 return -EBUSY; 14870 14871 params.link_id = nl80211_link_id_or_invalid(info->attrs); 14872 /* 14873 * This now races due to the unlock, but we cannot check 14874 * the valid links for the _station_ anyway, so that's up 14875 * to the driver. 14876 */ 14877 if (params.link_id >= 0 && 14878 !(wdev->valid_links & BIT(params.link_id))) 14879 return -EINVAL; 14880 14881 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 14882 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 14883 14884 err = nl80211_parse_counter_offsets(rdev, NULL, params.len, -1, 14885 info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX], 14886 ¶ms.csa_offsets, 14887 ¶ms.n_csa_offsets); 14888 if (err) 14889 return err; 14890 14891 if (!params.dont_wait_for_ack) { 14892 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14893 if (!msg) 14894 return -ENOMEM; 14895 14896 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 14897 NL80211_CMD_FRAME); 14898 if (!hdr) { 14899 err = -ENOBUFS; 14900 goto free_msg; 14901 } 14902 } 14903 14904 params.chan = chandef.chan; 14905 cookie = cfg80211_assign_cookie(rdev); 14906 err = cfg80211_mlme_mgmt_tx(rdev, wdev, ¶ms, cookie); 14907 if (err) 14908 goto free_msg; 14909 14910 if (msg) { 14911 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 14912 NL80211_ATTR_PAD)) 14913 goto nla_put_failure; 14914 14915 genlmsg_end(msg, hdr); 14916 return genlmsg_reply(msg, info); 14917 } 14918 14919 return 0; 14920 14921 nla_put_failure: 14922 err = -ENOBUFS; 14923 free_msg: 14924 nlmsg_free(msg); 14925 return err; 14926 } 14927 14928 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info) 14929 { 14930 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14931 struct wireless_dev *wdev = info->user_ptr[1]; 14932 u64 cookie; 14933 14934 if (!info->attrs[NL80211_ATTR_COOKIE]) 14935 return -EINVAL; 14936 14937 if (!rdev->ops->mgmt_tx_cancel_wait) 14938 return -EOPNOTSUPP; 14939 14940 switch (wdev->iftype) { 14941 case NL80211_IFTYPE_STATION: 14942 case NL80211_IFTYPE_ADHOC: 14943 case NL80211_IFTYPE_P2P_CLIENT: 14944 case NL80211_IFTYPE_AP: 14945 case NL80211_IFTYPE_AP_VLAN: 14946 case NL80211_IFTYPE_P2P_GO: 14947 case NL80211_IFTYPE_P2P_DEVICE: 14948 break; 14949 case NL80211_IFTYPE_NAN: 14950 if (!wiphy_ext_feature_isset(wdev->wiphy, 14951 NL80211_EXT_FEATURE_SECURE_NAN)) 14952 return -EOPNOTSUPP; 14953 break; 14954 case NL80211_IFTYPE_PD: 14955 if (!wiphy_ext_feature_isset(wdev->wiphy, 14956 NL80211_EXT_FEATURE_SECURE_RTT)) 14957 return -EOPNOTSUPP; 14958 break; 14959 default: 14960 return -EOPNOTSUPP; 14961 } 14962 14963 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 14964 14965 return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie); 14966 } 14967 14968 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info) 14969 { 14970 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14971 struct wireless_dev *wdev; 14972 struct net_device *dev = info->user_ptr[1]; 14973 u8 ps_state; 14974 bool state; 14975 int err; 14976 14977 if (!info->attrs[NL80211_ATTR_PS_STATE]) 14978 return -EINVAL; 14979 14980 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); 14981 14982 wdev = dev->ieee80211_ptr; 14983 14984 if (!rdev->ops->set_power_mgmt) 14985 return -EOPNOTSUPP; 14986 14987 state = (ps_state == NL80211_PS_ENABLED) ? true : false; 14988 14989 if (state == wdev->ps) 14990 return 0; 14991 14992 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); 14993 if (!err) 14994 wdev->ps = state; 14995 return err; 14996 } 14997 14998 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info) 14999 { 15000 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15001 enum nl80211_ps_state ps_state; 15002 struct wireless_dev *wdev; 15003 struct net_device *dev = info->user_ptr[1]; 15004 struct sk_buff *msg; 15005 void *hdr; 15006 int err; 15007 15008 wdev = dev->ieee80211_ptr; 15009 15010 if (!rdev->ops->set_power_mgmt) 15011 return -EOPNOTSUPP; 15012 15013 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 15014 if (!msg) 15015 return -ENOMEM; 15016 15017 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 15018 NL80211_CMD_GET_POWER_SAVE); 15019 if (!hdr) { 15020 err = -ENOBUFS; 15021 goto free_msg; 15022 } 15023 15024 if (wdev->ps) 15025 ps_state = NL80211_PS_ENABLED; 15026 else 15027 ps_state = NL80211_PS_DISABLED; 15028 15029 if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state)) 15030 goto nla_put_failure; 15031 15032 genlmsg_end(msg, hdr); 15033 return genlmsg_reply(msg, info); 15034 15035 nla_put_failure: 15036 err = -ENOBUFS; 15037 free_msg: 15038 nlmsg_free(msg); 15039 return err; 15040 } 15041 15042 static const struct nla_policy 15043 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = { 15044 [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_BINARY }, 15045 [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 }, 15046 [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 }, 15047 [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 }, 15048 [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 }, 15049 [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 }, 15050 [NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_S32 }, 15051 }; 15052 15053 static int nl80211_set_cqm_txe(struct genl_info *info, 15054 u32 rate, u32 pkts, u32 intvl) 15055 { 15056 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15057 struct net_device *dev = info->user_ptr[1]; 15058 struct wireless_dev *wdev = dev->ieee80211_ptr; 15059 15060 if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL) 15061 return -EINVAL; 15062 15063 if (!rdev->ops->set_cqm_txe_config) 15064 return -EOPNOTSUPP; 15065 15066 if (wdev->iftype != NL80211_IFTYPE_STATION && 15067 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 15068 return -EOPNOTSUPP; 15069 15070 return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl); 15071 } 15072 15073 static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev, 15074 struct net_device *dev, 15075 struct cfg80211_cqm_config *cqm_config) 15076 { 15077 struct wireless_dev *wdev = dev->ieee80211_ptr; 15078 s32 last, low, high; 15079 u32 hyst; 15080 int i, n, low_index; 15081 int err; 15082 15083 /* 15084 * Obtain current RSSI value if possible, if not and no RSSI threshold 15085 * event has been received yet, we should receive an event after a 15086 * connection is established and enough beacons received to calculate 15087 * the average. 15088 */ 15089 if (!cqm_config->last_rssi_event_value && 15090 wdev->links[0].client.current_bss && 15091 rdev->ops->get_station) { 15092 struct station_info sinfo = {}; 15093 u8 *mac_addr; 15094 15095 mac_addr = wdev->links[0].client.current_bss->pub.bssid; 15096 15097 err = rdev_get_station(rdev, wdev, mac_addr, &sinfo); 15098 if (err) 15099 return err; 15100 15101 cfg80211_sinfo_release_content(&sinfo); 15102 if (sinfo.filled & BIT_ULL(NL80211_STA_INFO_BEACON_SIGNAL_AVG)) 15103 cqm_config->last_rssi_event_value = 15104 (s8) sinfo.rx_beacon_signal_avg; 15105 } 15106 15107 last = cqm_config->last_rssi_event_value; 15108 hyst = cqm_config->rssi_hyst; 15109 n = cqm_config->n_rssi_thresholds; 15110 15111 for (i = 0; i < n; i++) { 15112 i = array_index_nospec(i, n); 15113 if (last < cqm_config->rssi_thresholds[i]) 15114 break; 15115 } 15116 15117 low_index = i - 1; 15118 if (low_index >= 0) { 15119 low_index = array_index_nospec(low_index, n); 15120 low = cqm_config->rssi_thresholds[low_index] - hyst; 15121 } else { 15122 low = S32_MIN; 15123 } 15124 if (i < n) { 15125 i = array_index_nospec(i, n); 15126 high = cqm_config->rssi_thresholds[i] + hyst - 1; 15127 } else { 15128 high = S32_MAX; 15129 } 15130 15131 return rdev_set_cqm_rssi_range_config(rdev, dev, low, high); 15132 } 15133 15134 static int nl80211_set_cqm_rssi(struct genl_info *info, 15135 const s32 *thresholds, int n_thresholds, 15136 u32 hysteresis) 15137 { 15138 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15139 struct cfg80211_cqm_config *cqm_config = NULL, *old; 15140 struct net_device *dev = info->user_ptr[1]; 15141 struct wireless_dev *wdev = dev->ieee80211_ptr; 15142 s32 prev = S32_MIN; 15143 int i, err; 15144 15145 /* Check all values negative and sorted */ 15146 for (i = 0; i < n_thresholds; i++) { 15147 if (thresholds[i] > 0 || thresholds[i] <= prev) 15148 return -EINVAL; 15149 15150 prev = thresholds[i]; 15151 } 15152 15153 if (wdev->iftype != NL80211_IFTYPE_STATION && 15154 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 15155 return -EOPNOTSUPP; 15156 15157 if (n_thresholds == 1 && thresholds[0] == 0) /* Disabling */ 15158 n_thresholds = 0; 15159 15160 old = wiphy_dereference(wdev->wiphy, wdev->cqm_config); 15161 15162 /* if already disabled just succeed */ 15163 if (!n_thresholds && !old) 15164 return 0; 15165 15166 if (n_thresholds > 1) { 15167 if (!wiphy_ext_feature_isset(&rdev->wiphy, 15168 NL80211_EXT_FEATURE_CQM_RSSI_LIST) || 15169 !rdev->ops->set_cqm_rssi_range_config) 15170 return -EOPNOTSUPP; 15171 } else { 15172 if (!rdev->ops->set_cqm_rssi_config) 15173 return -EOPNOTSUPP; 15174 } 15175 15176 if (n_thresholds) { 15177 cqm_config = kzalloc_flex(*cqm_config, rssi_thresholds, 15178 n_thresholds); 15179 if (!cqm_config) 15180 return -ENOMEM; 15181 15182 cqm_config->rssi_hyst = hysteresis; 15183 cqm_config->n_rssi_thresholds = n_thresholds; 15184 memcpy(cqm_config->rssi_thresholds, thresholds, 15185 flex_array_size(cqm_config, rssi_thresholds, 15186 n_thresholds)); 15187 cqm_config->use_range_api = n_thresholds > 1 || 15188 !rdev->ops->set_cqm_rssi_config; 15189 15190 rcu_assign_pointer(wdev->cqm_config, cqm_config); 15191 15192 if (cqm_config->use_range_api) 15193 err = cfg80211_cqm_rssi_update(rdev, dev, cqm_config); 15194 else 15195 err = rdev_set_cqm_rssi_config(rdev, dev, 15196 thresholds[0], 15197 hysteresis); 15198 } else { 15199 RCU_INIT_POINTER(wdev->cqm_config, NULL); 15200 /* if enabled as range also disable via range */ 15201 if (old->use_range_api) 15202 err = rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0); 15203 else 15204 err = rdev_set_cqm_rssi_config(rdev, dev, 0, 0); 15205 } 15206 15207 if (err) { 15208 rcu_assign_pointer(wdev->cqm_config, old); 15209 kfree_rcu(cqm_config, rcu_head); 15210 } else { 15211 kfree_rcu(old, rcu_head); 15212 } 15213 15214 return err; 15215 } 15216 15217 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info) 15218 { 15219 struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1]; 15220 struct nlattr *cqm; 15221 int err; 15222 15223 cqm = info->attrs[NL80211_ATTR_CQM]; 15224 if (!cqm) 15225 return -EINVAL; 15226 15227 err = nla_parse_nested_deprecated(attrs, NL80211_ATTR_CQM_MAX, cqm, 15228 nl80211_attr_cqm_policy, 15229 info->extack); 15230 if (err) 15231 return err; 15232 15233 if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] && 15234 attrs[NL80211_ATTR_CQM_RSSI_HYST]) { 15235 const s32 *thresholds = 15236 nla_data(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 15237 int len = nla_len(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 15238 u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]); 15239 15240 if (len % 4) 15241 return -EINVAL; 15242 15243 return nl80211_set_cqm_rssi(info, thresholds, len / 4, 15244 hysteresis); 15245 } 15246 15247 if (attrs[NL80211_ATTR_CQM_TXE_RATE] && 15248 attrs[NL80211_ATTR_CQM_TXE_PKTS] && 15249 attrs[NL80211_ATTR_CQM_TXE_INTVL]) { 15250 u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]); 15251 u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]); 15252 u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]); 15253 15254 return nl80211_set_cqm_txe(info, rate, pkts, intvl); 15255 } 15256 15257 return -EINVAL; 15258 } 15259 15260 static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info) 15261 { 15262 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15263 struct net_device *dev = info->user_ptr[1]; 15264 struct ocb_setup setup = {}; 15265 int err; 15266 15267 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 15268 &setup.chandef, false); 15269 if (err) 15270 return err; 15271 15272 return cfg80211_join_ocb(rdev, dev, &setup); 15273 } 15274 15275 static int nl80211_leave_ocb(struct sk_buff *skb, struct genl_info *info) 15276 { 15277 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15278 struct net_device *dev = info->user_ptr[1]; 15279 15280 return cfg80211_leave_ocb(rdev, dev); 15281 } 15282 15283 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info) 15284 { 15285 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15286 struct net_device *dev = info->user_ptr[1]; 15287 struct mesh_config cfg; 15288 struct mesh_setup setup; 15289 int err; 15290 15291 /* start with default */ 15292 memcpy(&cfg, &default_mesh_config, sizeof(cfg)); 15293 memcpy(&setup, &default_mesh_setup, sizeof(setup)); 15294 15295 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { 15296 /* and parse parameters if given */ 15297 err = nl80211_parse_mesh_config(info, &cfg, NULL); 15298 if (err) 15299 return err; 15300 } 15301 15302 if (!info->attrs[NL80211_ATTR_MESH_ID] || 15303 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) 15304 return -EINVAL; 15305 15306 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); 15307 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 15308 15309 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 15310 !nl80211_parse_mcast_rate(rdev, setup.mcast_rate, 15311 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 15312 return -EINVAL; 15313 15314 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { 15315 setup.beacon_interval = 15316 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 15317 15318 err = cfg80211_validate_beacon_int(rdev, 15319 NL80211_IFTYPE_MESH_POINT, 15320 setup.beacon_interval); 15321 if (err) 15322 return err; 15323 } 15324 15325 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { 15326 setup.dtim_period = 15327 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 15328 if (setup.dtim_period < 1 || setup.dtim_period > 100) 15329 return -EINVAL; 15330 } 15331 15332 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { 15333 /* parse additional setup parameters if given */ 15334 err = nl80211_parse_mesh_setup(info, &setup); 15335 if (err) 15336 return err; 15337 } 15338 15339 if (setup.user_mpm) 15340 cfg.auto_open_plinks = false; 15341 15342 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 15343 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 15344 &setup.chandef, false); 15345 if (err) 15346 return err; 15347 } else { 15348 /* __cfg80211_join_mesh() will sort it out */ 15349 setup.chandef.chan = NULL; 15350 } 15351 15352 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 15353 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 15354 int n_rates = 15355 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 15356 struct ieee80211_supported_band *sband; 15357 15358 if (!setup.chandef.chan) 15359 return -EINVAL; 15360 15361 sband = rdev->wiphy.bands[setup.chandef.chan->band]; 15362 15363 err = ieee80211_get_ratemask(sband, rates, n_rates, 15364 &setup.basic_rates); 15365 if (err) 15366 return err; 15367 } 15368 15369 if (info->attrs[NL80211_ATTR_TX_RATES]) { 15370 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, 15371 NL80211_ATTR_TX_RATES, 15372 &setup.beacon_rate, 15373 dev, false, 0); 15374 if (err) 15375 return err; 15376 15377 if (!setup.chandef.chan) 15378 return -EINVAL; 15379 15380 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band, 15381 &setup.beacon_rate); 15382 if (err) 15383 return err; 15384 } 15385 15386 setup.userspace_handles_dfs = 15387 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 15388 15389 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 15390 int r = validate_pae_over_nl80211(rdev, info); 15391 15392 if (r < 0) 15393 return r; 15394 15395 setup.control_port_over_nl80211 = true; 15396 } 15397 15398 err = __cfg80211_join_mesh(rdev, dev, &setup, &cfg); 15399 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) 15400 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 15401 15402 return err; 15403 } 15404 15405 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info) 15406 { 15407 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15408 struct net_device *dev = info->user_ptr[1]; 15409 15410 return cfg80211_leave_mesh(rdev, dev); 15411 } 15412 15413 #ifdef CONFIG_PM 15414 static int nl80211_send_wowlan_patterns(struct sk_buff *msg, 15415 struct cfg80211_registered_device *rdev) 15416 { 15417 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; 15418 struct nlattr *nl_pats, *nl_pat; 15419 int i, pat_len; 15420 15421 if (!wowlan->n_patterns) 15422 return 0; 15423 15424 nl_pats = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN); 15425 if (!nl_pats) 15426 return -ENOBUFS; 15427 15428 for (i = 0; i < wowlan->n_patterns; i++) { 15429 nl_pat = nla_nest_start_noflag(msg, i + 1); 15430 if (!nl_pat) 15431 return -ENOBUFS; 15432 pat_len = wowlan->patterns[i].pattern_len; 15433 if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8), 15434 wowlan->patterns[i].mask) || 15435 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 15436 wowlan->patterns[i].pattern) || 15437 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 15438 wowlan->patterns[i].pkt_offset)) 15439 return -ENOBUFS; 15440 nla_nest_end(msg, nl_pat); 15441 } 15442 nla_nest_end(msg, nl_pats); 15443 15444 return 0; 15445 } 15446 15447 static int nl80211_send_wowlan_tcp(struct sk_buff *msg, 15448 struct cfg80211_wowlan_tcp *tcp) 15449 { 15450 struct nlattr *nl_tcp; 15451 15452 if (!tcp) 15453 return 0; 15454 15455 nl_tcp = nla_nest_start_noflag(msg, 15456 NL80211_WOWLAN_TRIG_TCP_CONNECTION); 15457 if (!nl_tcp) 15458 return -ENOBUFS; 15459 15460 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || 15461 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || 15462 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || 15463 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || 15464 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || 15465 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 15466 tcp->payload_len, tcp->payload) || 15467 nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 15468 tcp->data_interval) || 15469 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 15470 tcp->wake_len, tcp->wake_data) || 15471 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK, 15472 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) 15473 return -ENOBUFS; 15474 15475 if (tcp->payload_seq.len && 15476 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ, 15477 sizeof(tcp->payload_seq), &tcp->payload_seq)) 15478 return -ENOBUFS; 15479 15480 if (tcp->payload_tok.len && 15481 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 15482 sizeof(tcp->payload_tok) + tcp->tokens_size, 15483 &tcp->payload_tok)) 15484 return -ENOBUFS; 15485 15486 nla_nest_end(msg, nl_tcp); 15487 15488 return 0; 15489 } 15490 15491 static int nl80211_send_wowlan_nd(struct sk_buff *msg, 15492 struct cfg80211_sched_scan_request *req) 15493 { 15494 struct nlattr *nd, *freqs, *matches, *match, *scan_plans, *scan_plan; 15495 int i; 15496 15497 if (!req) 15498 return 0; 15499 15500 nd = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_NET_DETECT); 15501 if (!nd) 15502 return -ENOBUFS; 15503 15504 if (req->n_scan_plans == 1 && 15505 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_INTERVAL, 15506 req->scan_plans[0].interval * 1000)) 15507 return -ENOBUFS; 15508 15509 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay)) 15510 return -ENOBUFS; 15511 15512 if (req->relative_rssi_set) { 15513 struct nl80211_bss_select_rssi_adjust rssi_adjust; 15514 15515 if (nla_put_s8(msg, NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI, 15516 req->relative_rssi)) 15517 return -ENOBUFS; 15518 15519 rssi_adjust.band = req->rssi_adjust.band; 15520 rssi_adjust.delta = req->rssi_adjust.delta; 15521 if (nla_put(msg, NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST, 15522 sizeof(rssi_adjust), &rssi_adjust)) 15523 return -ENOBUFS; 15524 } 15525 15526 freqs = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_FREQUENCIES); 15527 if (!freqs) 15528 return -ENOBUFS; 15529 15530 for (i = 0; i < req->n_channels; i++) { 15531 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) 15532 return -ENOBUFS; 15533 } 15534 15535 nla_nest_end(msg, freqs); 15536 15537 if (req->n_match_sets) { 15538 matches = nla_nest_start_noflag(msg, 15539 NL80211_ATTR_SCHED_SCAN_MATCH); 15540 if (!matches) 15541 return -ENOBUFS; 15542 15543 for (i = 0; i < req->n_match_sets; i++) { 15544 match = nla_nest_start_noflag(msg, i); 15545 if (!match) 15546 return -ENOBUFS; 15547 15548 if (nla_put(msg, NL80211_SCHED_SCAN_MATCH_ATTR_SSID, 15549 req->match_sets[i].ssid.ssid_len, 15550 req->match_sets[i].ssid.ssid)) 15551 return -ENOBUFS; 15552 nla_nest_end(msg, match); 15553 } 15554 nla_nest_end(msg, matches); 15555 } 15556 15557 scan_plans = nla_nest_start_noflag(msg, NL80211_ATTR_SCHED_SCAN_PLANS); 15558 if (!scan_plans) 15559 return -ENOBUFS; 15560 15561 for (i = 0; i < req->n_scan_plans; i++) { 15562 scan_plan = nla_nest_start_noflag(msg, i + 1); 15563 if (!scan_plan) 15564 return -ENOBUFS; 15565 15566 if (nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_INTERVAL, 15567 req->scan_plans[i].interval) || 15568 (req->scan_plans[i].iterations && 15569 nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_ITERATIONS, 15570 req->scan_plans[i].iterations))) 15571 return -ENOBUFS; 15572 nla_nest_end(msg, scan_plan); 15573 } 15574 nla_nest_end(msg, scan_plans); 15575 15576 nla_nest_end(msg, nd); 15577 15578 return 0; 15579 } 15580 15581 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info) 15582 { 15583 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15584 struct sk_buff *msg; 15585 void *hdr; 15586 u32 size = NLMSG_DEFAULT_SIZE; 15587 15588 if (!rdev->wiphy.wowlan) 15589 return -EOPNOTSUPP; 15590 15591 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { 15592 /* adjust size to have room for all the data */ 15593 size += rdev->wiphy.wowlan_config->tcp->tokens_size + 15594 rdev->wiphy.wowlan_config->tcp->payload_len + 15595 rdev->wiphy.wowlan_config->tcp->wake_len + 15596 rdev->wiphy.wowlan_config->tcp->wake_len / 8; 15597 } 15598 15599 msg = nlmsg_new(size, GFP_KERNEL); 15600 if (!msg) 15601 return -ENOMEM; 15602 15603 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 15604 NL80211_CMD_GET_WOWLAN); 15605 if (!hdr) 15606 goto nla_put_failure; 15607 15608 if (rdev->wiphy.wowlan_config) { 15609 struct nlattr *nl_wowlan; 15610 15611 nl_wowlan = nla_nest_start_noflag(msg, 15612 NL80211_ATTR_WOWLAN_TRIGGERS); 15613 if (!nl_wowlan) 15614 goto nla_put_failure; 15615 15616 if ((rdev->wiphy.wowlan_config->any && 15617 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 15618 (rdev->wiphy.wowlan_config->disconnect && 15619 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 15620 (rdev->wiphy.wowlan_config->magic_pkt && 15621 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 15622 (rdev->wiphy.wowlan_config->gtk_rekey_failure && 15623 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 15624 (rdev->wiphy.wowlan_config->eap_identity_req && 15625 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 15626 (rdev->wiphy.wowlan_config->four_way_handshake && 15627 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 15628 (rdev->wiphy.wowlan_config->rfkill_release && 15629 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 15630 goto nla_put_failure; 15631 15632 if (nl80211_send_wowlan_patterns(msg, rdev)) 15633 goto nla_put_failure; 15634 15635 if (nl80211_send_wowlan_tcp(msg, 15636 rdev->wiphy.wowlan_config->tcp)) 15637 goto nla_put_failure; 15638 15639 if (nl80211_send_wowlan_nd( 15640 msg, 15641 rdev->wiphy.wowlan_config->nd_config)) 15642 goto nla_put_failure; 15643 15644 nla_nest_end(msg, nl_wowlan); 15645 } 15646 15647 genlmsg_end(msg, hdr); 15648 return genlmsg_reply(msg, info); 15649 15650 nla_put_failure: 15651 nlmsg_free(msg); 15652 return -ENOBUFS; 15653 } 15654 15655 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev, 15656 struct nlattr *attr, 15657 struct cfg80211_wowlan *trig) 15658 { 15659 struct nlattr *tb[NUM_NL80211_WOWLAN_TCP]; 15660 struct cfg80211_wowlan_tcp *cfg; 15661 struct nl80211_wowlan_tcp_data_token *tok = NULL; 15662 struct nl80211_wowlan_tcp_data_seq *seq = NULL; 15663 u32 size; 15664 u32 data_size, wake_size, tokens_size = 0, wake_mask_size; 15665 int err, port; 15666 15667 if (!rdev->wiphy.wowlan->tcp) 15668 return -EINVAL; 15669 15670 err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TCP, attr, 15671 nl80211_wowlan_tcp_policy, NULL); 15672 if (err) 15673 return err; 15674 15675 if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] || 15676 !tb[NL80211_WOWLAN_TCP_DST_IPV4] || 15677 !tb[NL80211_WOWLAN_TCP_DST_MAC] || 15678 !tb[NL80211_WOWLAN_TCP_DST_PORT] || 15679 !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] || 15680 !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] || 15681 !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] || 15682 !tb[NL80211_WOWLAN_TCP_WAKE_MASK]) 15683 return -EINVAL; 15684 15685 data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]); 15686 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) 15687 return -EINVAL; 15688 15689 if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) > 15690 rdev->wiphy.wowlan->tcp->data_interval_max || 15691 nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0) 15692 return -EINVAL; 15693 15694 wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]); 15695 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) 15696 return -EINVAL; 15697 15698 wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]); 15699 if (wake_mask_size != DIV_ROUND_UP(wake_size, 8)) 15700 return -EINVAL; 15701 15702 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) { 15703 u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 15704 15705 tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 15706 tokens_size = tokln - sizeof(*tok); 15707 15708 if (!tok->len || tokens_size % tok->len) 15709 return -EINVAL; 15710 if (!rdev->wiphy.wowlan->tcp->tok) 15711 return -EINVAL; 15712 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) 15713 return -EINVAL; 15714 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) 15715 return -EINVAL; 15716 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) 15717 return -EINVAL; 15718 if (tok->offset + tok->len > data_size) 15719 return -EINVAL; 15720 } 15721 15722 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) { 15723 seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]); 15724 if (!rdev->wiphy.wowlan->tcp->seq) 15725 return -EINVAL; 15726 if (seq->len == 0 || seq->len > 4) 15727 return -EINVAL; 15728 if (seq->len + seq->offset > data_size) 15729 return -EINVAL; 15730 } 15731 15732 size = sizeof(*cfg); 15733 size += data_size; 15734 size += wake_size + wake_mask_size; 15735 size += tokens_size; 15736 15737 cfg = kzalloc(size, GFP_KERNEL); 15738 if (!cfg) 15739 return -ENOMEM; 15740 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); 15741 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]); 15742 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), 15743 ETH_ALEN); 15744 port = nla_get_u16_default(tb[NL80211_WOWLAN_TCP_SRC_PORT], 0); 15745 #ifdef CONFIG_INET 15746 /* allocate a socket and port for it and use it */ 15747 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, 15748 IPPROTO_TCP, &cfg->sock, 1); 15749 if (err) { 15750 kfree(cfg); 15751 return err; 15752 } 15753 if (inet_csk_get_port(cfg->sock->sk, port)) { 15754 sock_release(cfg->sock); 15755 kfree(cfg); 15756 return -EADDRINUSE; 15757 } 15758 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; 15759 #else 15760 if (!port) { 15761 kfree(cfg); 15762 return -EINVAL; 15763 } 15764 cfg->src_port = port; 15765 #endif 15766 15767 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); 15768 cfg->payload_len = data_size; 15769 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; 15770 memcpy((void *)cfg->payload, 15771 nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]), 15772 data_size); 15773 if (seq) 15774 cfg->payload_seq = *seq; 15775 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); 15776 cfg->wake_len = wake_size; 15777 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; 15778 memcpy((void *)cfg->wake_data, 15779 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]), 15780 wake_size); 15781 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + 15782 data_size + wake_size; 15783 memcpy((void *)cfg->wake_mask, 15784 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]), 15785 wake_mask_size); 15786 if (tok) { 15787 cfg->tokens_size = tokens_size; 15788 cfg->payload_tok = *tok; 15789 memcpy(cfg->payload_tok.token_stream, tok->token_stream, 15790 tokens_size); 15791 } 15792 15793 trig->tcp = cfg; 15794 15795 return 0; 15796 } 15797 15798 static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev, 15799 const struct wiphy_wowlan_support *wowlan, 15800 struct nlattr *attr, 15801 struct cfg80211_wowlan *trig) 15802 { 15803 struct nlattr **tb; 15804 int err; 15805 15806 tb = kzalloc_objs(*tb, NUM_NL80211_ATTR); 15807 if (!tb) 15808 return -ENOMEM; 15809 15810 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) { 15811 err = -EOPNOTSUPP; 15812 goto out; 15813 } 15814 15815 err = nla_parse_nested_deprecated(tb, NL80211_ATTR_MAX, attr, 15816 nl80211_policy, NULL); 15817 if (err) 15818 goto out; 15819 15820 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb, 15821 wowlan->max_nd_match_sets); 15822 err = PTR_ERR_OR_ZERO(trig->nd_config); 15823 if (err) 15824 trig->nd_config = NULL; 15825 15826 out: 15827 kfree(tb); 15828 return err; 15829 } 15830 15831 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info) 15832 { 15833 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15834 struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG]; 15835 struct cfg80211_wowlan new_triggers = {}; 15836 struct cfg80211_wowlan *ntrig; 15837 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; 15838 int err, i; 15839 bool prev_enabled = rdev->wiphy.wowlan_config; 15840 bool regular = false; 15841 15842 if (!wowlan) 15843 return -EOPNOTSUPP; 15844 15845 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { 15846 cfg80211_rdev_free_wowlan(rdev); 15847 rdev->wiphy.wowlan_config = NULL; 15848 goto set_wakeup; 15849 } 15850 15851 err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TRIG, 15852 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS], 15853 nl80211_wowlan_policy, info->extack); 15854 if (err) 15855 return err; 15856 15857 if (tb[NL80211_WOWLAN_TRIG_ANY]) { 15858 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) 15859 return -EINVAL; 15860 new_triggers.any = true; 15861 } 15862 15863 if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) { 15864 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) 15865 return -EINVAL; 15866 new_triggers.disconnect = true; 15867 regular = true; 15868 } 15869 15870 if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) { 15871 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) 15872 return -EINVAL; 15873 new_triggers.magic_pkt = true; 15874 regular = true; 15875 } 15876 15877 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED]) 15878 return -EINVAL; 15879 15880 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) { 15881 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) 15882 return -EINVAL; 15883 new_triggers.gtk_rekey_failure = true; 15884 regular = true; 15885 } 15886 15887 if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) { 15888 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) 15889 return -EINVAL; 15890 new_triggers.eap_identity_req = true; 15891 regular = true; 15892 } 15893 15894 if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) { 15895 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) 15896 return -EINVAL; 15897 new_triggers.four_way_handshake = true; 15898 regular = true; 15899 } 15900 15901 if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) { 15902 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) 15903 return -EINVAL; 15904 new_triggers.rfkill_release = true; 15905 regular = true; 15906 } 15907 15908 if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) { 15909 struct nlattr *pat; 15910 int n_patterns = 0; 15911 int rem, pat_len, mask_len, pkt_offset; 15912 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 15913 15914 regular = true; 15915 15916 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 15917 rem) 15918 n_patterns++; 15919 if (n_patterns > wowlan->n_patterns) 15920 return -EINVAL; 15921 15922 new_triggers.patterns = kzalloc_objs(new_triggers.patterns[0], 15923 n_patterns); 15924 if (!new_triggers.patterns) 15925 return -ENOMEM; 15926 15927 new_triggers.n_patterns = n_patterns; 15928 i = 0; 15929 15930 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 15931 rem) { 15932 u8 *mask_pat; 15933 15934 err = nla_parse_nested_deprecated(pat_tb, 15935 MAX_NL80211_PKTPAT, 15936 pat, 15937 nl80211_packet_pattern_policy, 15938 info->extack); 15939 if (err) 15940 goto error; 15941 15942 err = -EINVAL; 15943 if (!pat_tb[NL80211_PKTPAT_MASK] || 15944 !pat_tb[NL80211_PKTPAT_PATTERN]) 15945 goto error; 15946 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 15947 mask_len = DIV_ROUND_UP(pat_len, 8); 15948 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 15949 goto error; 15950 if (pat_len > wowlan->pattern_max_len || 15951 pat_len < wowlan->pattern_min_len) 15952 goto error; 15953 15954 pkt_offset = 15955 nla_get_u32_default(pat_tb[NL80211_PKTPAT_OFFSET], 15956 0); 15957 if (pkt_offset > wowlan->max_pkt_offset) 15958 goto error; 15959 new_triggers.patterns[i].pkt_offset = pkt_offset; 15960 15961 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL); 15962 if (!mask_pat) { 15963 err = -ENOMEM; 15964 goto error; 15965 } 15966 new_triggers.patterns[i].mask = mask_pat; 15967 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]), 15968 mask_len); 15969 mask_pat += mask_len; 15970 new_triggers.patterns[i].pattern = mask_pat; 15971 new_triggers.patterns[i].pattern_len = pat_len; 15972 memcpy(mask_pat, 15973 nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 15974 pat_len); 15975 i++; 15976 } 15977 } 15978 15979 if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) { 15980 regular = true; 15981 err = nl80211_parse_wowlan_tcp( 15982 rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION], 15983 &new_triggers); 15984 if (err) 15985 goto error; 15986 } 15987 15988 if (tb[NL80211_WOWLAN_TRIG_NET_DETECT]) { 15989 regular = true; 15990 err = nl80211_parse_wowlan_nd( 15991 rdev, wowlan, tb[NL80211_WOWLAN_TRIG_NET_DETECT], 15992 &new_triggers); 15993 if (err) 15994 goto error; 15995 } 15996 15997 /* The 'any' trigger means the device continues operating more or less 15998 * as in its normal operation mode and wakes up the host on most of the 15999 * normal interrupts (like packet RX, ...) 16000 * It therefore makes little sense to combine with the more constrained 16001 * wakeup trigger modes. 16002 */ 16003 if (new_triggers.any && regular) { 16004 err = -EINVAL; 16005 goto error; 16006 } 16007 16008 ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL); 16009 if (!ntrig) { 16010 err = -ENOMEM; 16011 goto error; 16012 } 16013 cfg80211_rdev_free_wowlan(rdev); 16014 rdev->wiphy.wowlan_config = ntrig; 16015 16016 set_wakeup: 16017 if (rdev->ops->set_wakeup && 16018 prev_enabled != !!rdev->wiphy.wowlan_config) 16019 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); 16020 16021 return 0; 16022 error: 16023 for (i = 0; i < new_triggers.n_patterns; i++) 16024 kfree(new_triggers.patterns[i].mask); 16025 kfree(new_triggers.patterns); 16026 if (new_triggers.tcp && new_triggers.tcp->sock) 16027 sock_release(new_triggers.tcp->sock); 16028 kfree(new_triggers.tcp); 16029 kfree(new_triggers.nd_config); 16030 return err; 16031 } 16032 #endif 16033 16034 static int nl80211_send_coalesce_rules(struct sk_buff *msg, 16035 struct cfg80211_registered_device *rdev) 16036 { 16037 struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules; 16038 int i, j, pat_len; 16039 struct cfg80211_coalesce_rules *rule; 16040 16041 if (!rdev->coalesce->n_rules) 16042 return 0; 16043 16044 nl_rules = nla_nest_start_noflag(msg, NL80211_ATTR_COALESCE_RULE); 16045 if (!nl_rules) 16046 return -ENOBUFS; 16047 16048 for (i = 0; i < rdev->coalesce->n_rules; i++) { 16049 nl_rule = nla_nest_start_noflag(msg, i + 1); 16050 if (!nl_rule) 16051 return -ENOBUFS; 16052 16053 rule = &rdev->coalesce->rules[i]; 16054 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY, 16055 rule->delay)) 16056 return -ENOBUFS; 16057 16058 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION, 16059 rule->condition)) 16060 return -ENOBUFS; 16061 16062 nl_pats = nla_nest_start_noflag(msg, 16063 NL80211_ATTR_COALESCE_RULE_PKT_PATTERN); 16064 if (!nl_pats) 16065 return -ENOBUFS; 16066 16067 for (j = 0; j < rule->n_patterns; j++) { 16068 nl_pat = nla_nest_start_noflag(msg, j + 1); 16069 if (!nl_pat) 16070 return -ENOBUFS; 16071 pat_len = rule->patterns[j].pattern_len; 16072 if (nla_put(msg, NL80211_PKTPAT_MASK, 16073 DIV_ROUND_UP(pat_len, 8), 16074 rule->patterns[j].mask) || 16075 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 16076 rule->patterns[j].pattern) || 16077 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 16078 rule->patterns[j].pkt_offset)) 16079 return -ENOBUFS; 16080 nla_nest_end(msg, nl_pat); 16081 } 16082 nla_nest_end(msg, nl_pats); 16083 nla_nest_end(msg, nl_rule); 16084 } 16085 nla_nest_end(msg, nl_rules); 16086 16087 return 0; 16088 } 16089 16090 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info) 16091 { 16092 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16093 struct sk_buff *msg; 16094 void *hdr; 16095 16096 if (!rdev->wiphy.coalesce) 16097 return -EOPNOTSUPP; 16098 16099 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 16100 if (!msg) 16101 return -ENOMEM; 16102 16103 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 16104 NL80211_CMD_GET_COALESCE); 16105 if (!hdr) 16106 goto nla_put_failure; 16107 16108 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) 16109 goto nla_put_failure; 16110 16111 genlmsg_end(msg, hdr); 16112 return genlmsg_reply(msg, info); 16113 16114 nla_put_failure: 16115 nlmsg_free(msg); 16116 return -ENOBUFS; 16117 } 16118 16119 void cfg80211_free_coalesce(struct cfg80211_coalesce *coalesce) 16120 { 16121 int i, j; 16122 struct cfg80211_coalesce_rules *rule; 16123 16124 if (!coalesce) 16125 return; 16126 16127 for (i = 0; i < coalesce->n_rules; i++) { 16128 rule = &coalesce->rules[i]; 16129 for (j = 0; j < rule->n_patterns; j++) 16130 kfree(rule->patterns[j].mask); 16131 kfree(rule->patterns); 16132 } 16133 kfree(coalesce); 16134 } 16135 16136 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev, 16137 struct nlattr *rule, 16138 struct cfg80211_coalesce_rules *new_rule) 16139 { 16140 int err, i; 16141 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 16142 struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat; 16143 int rem, pat_len, mask_len, pkt_offset, n_patterns = 0; 16144 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 16145 16146 err = nla_parse_nested_deprecated(tb, NL80211_ATTR_COALESCE_RULE_MAX, 16147 rule, nl80211_coalesce_policy, NULL); 16148 if (err) 16149 return err; 16150 16151 if (tb[NL80211_ATTR_COALESCE_RULE_DELAY]) 16152 new_rule->delay = 16153 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]); 16154 if (new_rule->delay > coalesce->max_delay) 16155 return -EINVAL; 16156 16157 if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION]) 16158 new_rule->condition = 16159 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]); 16160 16161 if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN]) 16162 return -EINVAL; 16163 16164 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 16165 rem) 16166 n_patterns++; 16167 if (n_patterns > coalesce->n_patterns) 16168 return -EINVAL; 16169 16170 new_rule->patterns = kzalloc_objs(new_rule->patterns[0], n_patterns); 16171 if (!new_rule->patterns) 16172 return -ENOMEM; 16173 16174 new_rule->n_patterns = n_patterns; 16175 i = 0; 16176 16177 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 16178 rem) { 16179 u8 *mask_pat; 16180 16181 err = nla_parse_nested_deprecated(pat_tb, MAX_NL80211_PKTPAT, 16182 pat, 16183 nl80211_packet_pattern_policy, 16184 NULL); 16185 if (err) 16186 return err; 16187 16188 if (!pat_tb[NL80211_PKTPAT_MASK] || 16189 !pat_tb[NL80211_PKTPAT_PATTERN]) 16190 return -EINVAL; 16191 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 16192 mask_len = DIV_ROUND_UP(pat_len, 8); 16193 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 16194 return -EINVAL; 16195 if (pat_len > coalesce->pattern_max_len || 16196 pat_len < coalesce->pattern_min_len) 16197 return -EINVAL; 16198 16199 pkt_offset = nla_get_u32_default(pat_tb[NL80211_PKTPAT_OFFSET], 16200 0); 16201 if (pkt_offset > coalesce->max_pkt_offset) 16202 return -EINVAL; 16203 new_rule->patterns[i].pkt_offset = pkt_offset; 16204 16205 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL); 16206 if (!mask_pat) 16207 return -ENOMEM; 16208 16209 new_rule->patterns[i].mask = mask_pat; 16210 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]), 16211 mask_len); 16212 16213 mask_pat += mask_len; 16214 new_rule->patterns[i].pattern = mask_pat; 16215 new_rule->patterns[i].pattern_len = pat_len; 16216 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 16217 pat_len); 16218 i++; 16219 } 16220 16221 return 0; 16222 } 16223 16224 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info) 16225 { 16226 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16227 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 16228 struct cfg80211_coalesce *new_coalesce; 16229 int err, rem_rule, n_rules = 0, i; 16230 struct nlattr *rule; 16231 16232 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) 16233 return -EOPNOTSUPP; 16234 16235 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { 16236 cfg80211_free_coalesce(rdev->coalesce); 16237 rdev->coalesce = NULL; 16238 rdev_set_coalesce(rdev, NULL); 16239 return 0; 16240 } 16241 16242 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 16243 rem_rule) 16244 n_rules++; 16245 if (n_rules > coalesce->n_rules) 16246 return -EINVAL; 16247 16248 new_coalesce = kzalloc_flex(*new_coalesce, rules, n_rules); 16249 if (!new_coalesce) 16250 return -ENOMEM; 16251 16252 new_coalesce->n_rules = n_rules; 16253 i = 0; 16254 16255 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 16256 rem_rule) { 16257 err = nl80211_parse_coalesce_rule(rdev, rule, 16258 &new_coalesce->rules[i]); 16259 if (err) 16260 goto error; 16261 16262 i++; 16263 } 16264 16265 err = rdev_set_coalesce(rdev, new_coalesce); 16266 if (err) 16267 goto error; 16268 16269 cfg80211_free_coalesce(rdev->coalesce); 16270 rdev->coalesce = new_coalesce; 16271 16272 return 0; 16273 error: 16274 cfg80211_free_coalesce(new_coalesce); 16275 16276 return err; 16277 } 16278 16279 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info) 16280 { 16281 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16282 struct net_device *dev = info->user_ptr[1]; 16283 struct wireless_dev *wdev = dev->ieee80211_ptr; 16284 struct nlattr *tb[NUM_NL80211_REKEY_DATA]; 16285 struct cfg80211_gtk_rekey_data rekey_data = {}; 16286 int err; 16287 16288 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) 16289 return -EINVAL; 16290 16291 err = nla_parse_nested_deprecated(tb, MAX_NL80211_REKEY_DATA, 16292 info->attrs[NL80211_ATTR_REKEY_DATA], 16293 nl80211_rekey_policy, info->extack); 16294 if (err) 16295 return err; 16296 16297 if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] || 16298 !tb[NL80211_REKEY_DATA_KCK]) 16299 return -EINVAL; 16300 if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN && 16301 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && 16302 nla_len(tb[NL80211_REKEY_DATA_KEK]) == NL80211_KEK_EXT_LEN)) 16303 return -ERANGE; 16304 if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN && 16305 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && 16306 nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN) && 16307 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KCK_32 && 16308 nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN_32)) 16309 return -ERANGE; 16310 16311 rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]); 16312 rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]); 16313 rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]); 16314 rekey_data.kek_len = nla_len(tb[NL80211_REKEY_DATA_KEK]); 16315 rekey_data.kck_len = nla_len(tb[NL80211_REKEY_DATA_KCK]); 16316 if (tb[NL80211_REKEY_DATA_AKM]) 16317 rekey_data.akm = nla_get_u32(tb[NL80211_REKEY_DATA_AKM]); 16318 16319 if (!wdev->connected) 16320 return -ENOTCONN; 16321 16322 if (!rdev->ops->set_rekey_data) 16323 return -EOPNOTSUPP; 16324 16325 return rdev_set_rekey_data(rdev, dev, &rekey_data); 16326 } 16327 16328 static int nl80211_register_unexpected_frame(struct sk_buff *skb, 16329 struct genl_info *info) 16330 { 16331 struct net_device *dev = info->user_ptr[1]; 16332 struct wireless_dev *wdev = dev->ieee80211_ptr; 16333 16334 if (wdev->iftype != NL80211_IFTYPE_AP && 16335 wdev->iftype != NL80211_IFTYPE_P2P_GO && 16336 wdev->iftype != NL80211_IFTYPE_NAN_DATA) 16337 return -EINVAL; 16338 16339 if (wdev->unexpected_nlportid) 16340 return -EBUSY; 16341 16342 wdev->unexpected_nlportid = info->snd_portid; 16343 return 0; 16344 } 16345 16346 static int nl80211_probe_peer(struct sk_buff *skb, struct genl_info *info) 16347 { 16348 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16349 struct net_device *dev = info->user_ptr[1]; 16350 struct wireless_dev *wdev = dev->ieee80211_ptr; 16351 struct sk_buff *msg; 16352 void *hdr; 16353 const u8 *addr = NULL; 16354 u64 cookie; 16355 int err; 16356 16357 /* Allow in AP, STA, and their P2P counterparts */ 16358 switch (wdev->iftype) { 16359 case NL80211_IFTYPE_AP: 16360 case NL80211_IFTYPE_P2P_GO: 16361 if (!info->attrs[NL80211_ATTR_MAC]) 16362 return -EINVAL; 16363 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 16364 break; 16365 case NL80211_IFTYPE_STATION: 16366 case NL80211_IFTYPE_P2P_CLIENT: 16367 if (!wiphy_ext_feature_isset(&rdev->wiphy, 16368 NL80211_EXT_FEATURE_PROBE_AP)) 16369 return -EOPNOTSUPP; 16370 if (!wdev->connected) 16371 return -ENOLINK; 16372 /* STA/P2P-client probes the currently associated AP/GO. */ 16373 if (info->attrs[NL80211_ATTR_MAC]) 16374 return -EINVAL; 16375 break; 16376 default: 16377 return -EOPNOTSUPP; 16378 } 16379 16380 if (!rdev->ops->probe_peer) 16381 return -EOPNOTSUPP; 16382 16383 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 16384 if (!msg) 16385 return -ENOMEM; 16386 16387 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 16388 NL80211_CMD_PROBE_PEER); 16389 if (!hdr) { 16390 err = -ENOBUFS; 16391 goto free_msg; 16392 } 16393 16394 cookie = cfg80211_assign_cookie(rdev); 16395 err = rdev_probe_peer(rdev, dev, addr, cookie); 16396 if (err) 16397 goto free_msg; 16398 16399 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 16400 NL80211_ATTR_PAD)) 16401 goto nla_put_failure; 16402 16403 genlmsg_end(msg, hdr); 16404 16405 return genlmsg_reply(msg, info); 16406 16407 nla_put_failure: 16408 err = -ENOBUFS; 16409 free_msg: 16410 nlmsg_free(msg); 16411 return err; 16412 } 16413 16414 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info) 16415 { 16416 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16417 struct cfg80211_beacon_registration *reg, *nreg; 16418 int rv; 16419 16420 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) 16421 return -EOPNOTSUPP; 16422 16423 nreg = kzalloc_obj(*nreg); 16424 if (!nreg) 16425 return -ENOMEM; 16426 16427 /* First, check if already registered. */ 16428 spin_lock_bh(&rdev->beacon_registrations_lock); 16429 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 16430 if (reg->nlportid == info->snd_portid) { 16431 rv = -EALREADY; 16432 goto out_err; 16433 } 16434 } 16435 /* Add it to the list */ 16436 nreg->nlportid = info->snd_portid; 16437 list_add(&nreg->list, &rdev->beacon_registrations); 16438 16439 spin_unlock_bh(&rdev->beacon_registrations_lock); 16440 16441 return 0; 16442 out_err: 16443 spin_unlock_bh(&rdev->beacon_registrations_lock); 16444 kfree(nreg); 16445 return rv; 16446 } 16447 16448 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info) 16449 { 16450 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16451 struct wireless_dev *wdev = info->user_ptr[1]; 16452 int err; 16453 16454 if (!rdev->ops->start_p2p_device) 16455 return -EOPNOTSUPP; 16456 16457 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 16458 return -EOPNOTSUPP; 16459 16460 if (wdev_running(wdev)) 16461 return 0; 16462 16463 if (rfkill_blocked(rdev->wiphy.rfkill)) 16464 return -ERFKILL; 16465 16466 err = rdev_start_p2p_device(rdev, wdev); 16467 if (err) 16468 return err; 16469 16470 wdev->is_running = true; 16471 rdev->opencount++; 16472 16473 return 0; 16474 } 16475 16476 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info) 16477 { 16478 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16479 struct wireless_dev *wdev = info->user_ptr[1]; 16480 16481 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 16482 return -EOPNOTSUPP; 16483 16484 if (!rdev->ops->stop_p2p_device) 16485 return -EOPNOTSUPP; 16486 16487 cfg80211_stop_p2p_device(rdev, wdev); 16488 16489 return 0; 16490 } 16491 16492 static struct ieee80211_channel *nl80211_get_nan_channel(struct wiphy *wiphy, 16493 int freq) 16494 { 16495 struct ieee80211_channel *chan; 16496 struct cfg80211_chan_def def; 16497 16498 /* Check if the frequency is valid for NAN */ 16499 if (freq != 5220 && freq != 5745 && freq != 2437) 16500 return NULL; 16501 16502 chan = ieee80211_get_channel(wiphy, freq); 16503 if (!chan) 16504 return NULL; 16505 16506 cfg80211_chandef_create(&def, chan, NL80211_CHAN_NO_HT); 16507 16508 /* Check if the channel is allowed */ 16509 if (cfg80211_reg_can_beacon(wiphy, &def, NL80211_IFTYPE_NAN)) 16510 return chan; 16511 16512 return NULL; 16513 } 16514 16515 static int nl80211_parse_nan_band_config(struct wiphy *wiphy, 16516 struct nlattr **tb, 16517 struct cfg80211_nan_band_config *cfg, 16518 enum nl80211_band band) 16519 { 16520 if (BIT(band) & ~(u32)wiphy->nan_supported_bands) 16521 return -EINVAL; 16522 16523 if (tb[NL80211_NAN_BAND_CONF_FREQ]) { 16524 u16 freq = nla_get_u16(tb[NL80211_NAN_BAND_CONF_FREQ]); 16525 16526 if (band != NL80211_BAND_5GHZ) 16527 return -EINVAL; 16528 16529 cfg->chan = nl80211_get_nan_channel(wiphy, freq); 16530 if (!cfg->chan) 16531 return -EINVAL; 16532 } 16533 16534 if (tb[NL80211_NAN_BAND_CONF_RSSI_CLOSE]) { 16535 cfg->rssi_close = 16536 nla_get_s8(tb[NL80211_NAN_BAND_CONF_RSSI_CLOSE]); 16537 if (!tb[NL80211_NAN_BAND_CONF_RSSI_MIDDLE]) 16538 return -EINVAL; 16539 } 16540 16541 if (tb[NL80211_NAN_BAND_CONF_RSSI_MIDDLE]) { 16542 cfg->rssi_middle = 16543 nla_get_s8(tb[NL80211_NAN_BAND_CONF_RSSI_MIDDLE]); 16544 if (!cfg->rssi_close || cfg->rssi_middle >= cfg->rssi_close) 16545 return -EINVAL; 16546 } 16547 16548 if (tb[NL80211_NAN_BAND_CONF_WAKE_DW]) { 16549 cfg->awake_dw_interval = 16550 nla_get_u8(tb[NL80211_NAN_BAND_CONF_WAKE_DW]); 16551 16552 if (band == NL80211_BAND_2GHZ && cfg->awake_dw_interval == 0) 16553 return -EINVAL; 16554 } 16555 16556 cfg->disable_scan = 16557 nla_get_flag(tb[NL80211_NAN_BAND_CONF_DISABLE_SCAN]); 16558 return 0; 16559 } 16560 16561 static int nl80211_parse_nan_conf(struct wiphy *wiphy, 16562 struct genl_info *info, 16563 struct cfg80211_nan_conf *conf, 16564 u32 *changed_flags, 16565 bool start) 16566 { 16567 struct nlattr *attrs[NL80211_NAN_CONF_ATTR_MAX + 1]; 16568 int err, rem; 16569 u32 changed = 0; 16570 struct nlattr *band_config; 16571 16572 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { 16573 conf->master_pref = 16574 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); 16575 16576 changed |= CFG80211_NAN_CONF_CHANGED_PREF; 16577 } 16578 16579 if (info->attrs[NL80211_ATTR_BANDS]) { 16580 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); 16581 16582 if (bands & ~(u32)wiphy->nan_supported_bands) 16583 return -EOPNOTSUPP; 16584 16585 if (bands && !(bands & BIT(NL80211_BAND_2GHZ))) 16586 return -EINVAL; 16587 16588 conf->bands = bands; 16589 changed |= CFG80211_NAN_CONF_CHANGED_BANDS; 16590 } 16591 16592 conf->band_cfgs[NL80211_BAND_2GHZ].awake_dw_interval = 1; 16593 if (conf->bands & BIT(NL80211_BAND_5GHZ) || !conf->bands) 16594 conf->band_cfgs[NL80211_BAND_5GHZ].awake_dw_interval = 1; 16595 16596 /* On 2.4 GHz band use channel 6 */ 16597 conf->band_cfgs[NL80211_BAND_2GHZ].chan = 16598 nl80211_get_nan_channel(wiphy, 2437); 16599 if (!conf->band_cfgs[NL80211_BAND_2GHZ].chan) 16600 return -EINVAL; 16601 16602 if (!info->attrs[NL80211_ATTR_NAN_CONFIG]) 16603 goto out; 16604 16605 err = nla_parse_nested(attrs, NL80211_NAN_CONF_ATTR_MAX, 16606 info->attrs[NL80211_ATTR_NAN_CONFIG], NULL, 16607 info->extack); 16608 if (err) 16609 return err; 16610 16611 changed |= CFG80211_NAN_CONF_CHANGED_CONFIG; 16612 if (attrs[NL80211_NAN_CONF_CLUSTER_ID] && start) { 16613 ether_addr_copy(conf->cluster_id, 16614 nla_data(attrs[NL80211_NAN_CONF_CLUSTER_ID])); 16615 } else if (start) { 16616 conf->cluster_id[0] = 0x50; 16617 conf->cluster_id[1] = 0x6f; 16618 conf->cluster_id[2] = 0x9a; 16619 conf->cluster_id[3] = 0x01; 16620 get_random_bytes(&conf->cluster_id[4], 2); 16621 } 16622 16623 if (attrs[NL80211_NAN_CONF_EXTRA_ATTRS]) { 16624 conf->extra_nan_attrs = 16625 nla_data(attrs[NL80211_NAN_CONF_EXTRA_ATTRS]); 16626 conf->extra_nan_attrs_len = 16627 nla_len(attrs[NL80211_NAN_CONF_EXTRA_ATTRS]); 16628 } 16629 16630 if (attrs[NL80211_NAN_CONF_VENDOR_ELEMS]) { 16631 conf->vendor_elems = 16632 nla_data(attrs[NL80211_NAN_CONF_VENDOR_ELEMS]); 16633 conf->vendor_elems_len = 16634 nla_len(attrs[NL80211_NAN_CONF_VENDOR_ELEMS]); 16635 } 16636 16637 if (attrs[NL80211_NAN_CONF_BAND_CONFIGS]) { 16638 nla_for_each_nested(band_config, 16639 attrs[NL80211_NAN_CONF_BAND_CONFIGS], 16640 rem) { 16641 enum nl80211_band band; 16642 struct cfg80211_nan_band_config *cfg; 16643 struct nlattr *tb[NL80211_NAN_BAND_CONF_ATTR_MAX + 1]; 16644 16645 err = nla_parse_nested(tb, 16646 NL80211_NAN_BAND_CONF_ATTR_MAX, 16647 band_config, NULL, 16648 info->extack); 16649 if (err) 16650 return err; 16651 16652 if (!tb[NL80211_NAN_BAND_CONF_BAND]) 16653 return -EINVAL; 16654 16655 band = nla_get_u8(tb[NL80211_NAN_BAND_CONF_BAND]); 16656 if (conf->bands && !(conf->bands & BIT(band))) 16657 return -EINVAL; 16658 16659 cfg = &conf->band_cfgs[band]; 16660 16661 err = nl80211_parse_nan_band_config(wiphy, tb, cfg, 16662 band); 16663 if (err) 16664 return err; 16665 } 16666 } 16667 16668 if (attrs[NL80211_NAN_CONF_SCAN_PERIOD]) 16669 conf->scan_period = 16670 nla_get_u16(attrs[NL80211_NAN_CONF_SCAN_PERIOD]); 16671 16672 if (attrs[NL80211_NAN_CONF_SCAN_DWELL_TIME]) 16673 conf->scan_dwell_time = 16674 nla_get_u16(attrs[NL80211_NAN_CONF_SCAN_DWELL_TIME]); 16675 16676 if (attrs[NL80211_NAN_CONF_DISCOVERY_BEACON_INTERVAL]) 16677 conf->discovery_beacon_interval = 16678 nla_get_u8(attrs[NL80211_NAN_CONF_DISCOVERY_BEACON_INTERVAL]); 16679 16680 if (attrs[NL80211_NAN_CONF_NOTIFY_DW]) 16681 conf->enable_dw_notification = 16682 nla_get_flag(attrs[NL80211_NAN_CONF_NOTIFY_DW]); 16683 16684 out: 16685 if (!conf->band_cfgs[NL80211_BAND_5GHZ].chan && 16686 (!conf->bands || conf->bands & BIT(NL80211_BAND_5GHZ))) { 16687 /* If no 5GHz channel is specified use default, if possible */ 16688 conf->band_cfgs[NL80211_BAND_5GHZ].chan = 16689 nl80211_get_nan_channel(wiphy, 5745); 16690 if (!conf->band_cfgs[NL80211_BAND_5GHZ].chan) 16691 conf->band_cfgs[NL80211_BAND_5GHZ].chan = 16692 nl80211_get_nan_channel(wiphy, 5220); 16693 16694 /* Return error if user space asked explicitly for 5 GHz */ 16695 if (!conf->band_cfgs[NL80211_BAND_5GHZ].chan && 16696 conf->bands & BIT(NL80211_BAND_5GHZ)) { 16697 NL_SET_ERR_MSG_ATTR(info->extack, 16698 info->attrs[NL80211_ATTR_BANDS], 16699 "5 GHz band operation is not allowed"); 16700 return -EINVAL; 16701 } 16702 } 16703 16704 if (changed_flags) 16705 *changed_flags = changed; 16706 16707 return 0; 16708 } 16709 16710 static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info) 16711 { 16712 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16713 struct wireless_dev *wdev = info->user_ptr[1]; 16714 struct cfg80211_nan_conf conf = {}; 16715 int err; 16716 16717 if (wdev->iftype != NL80211_IFTYPE_NAN) 16718 return -EOPNOTSUPP; 16719 16720 if (wdev_running(wdev)) 16721 return -EEXIST; 16722 16723 if (rfkill_blocked(rdev->wiphy.rfkill)) 16724 return -ERFKILL; 16725 16726 /* Master preference is mandatory for START_NAN */ 16727 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) 16728 return -EINVAL; 16729 16730 err = nl80211_parse_nan_conf(&rdev->wiphy, info, &conf, NULL, true); 16731 if (err) 16732 return err; 16733 16734 err = rdev_start_nan(rdev, wdev, &conf); 16735 if (err) 16736 return err; 16737 16738 wdev->is_running = true; 16739 rdev->opencount++; 16740 16741 return 0; 16742 } 16743 16744 static int nl80211_stop_nan(struct sk_buff *skb, struct genl_info *info) 16745 { 16746 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16747 struct wireless_dev *wdev = info->user_ptr[1]; 16748 16749 if (wdev->iftype != NL80211_IFTYPE_NAN) 16750 return -EOPNOTSUPP; 16751 16752 cfg80211_close_dependents(rdev, wdev); 16753 16754 guard(wiphy)(&rdev->wiphy); 16755 16756 cfg80211_stop_nan(rdev, wdev); 16757 16758 return 0; 16759 } 16760 16761 static int validate_nan_filter(struct nlattr *filter_attr) 16762 { 16763 struct nlattr *attr; 16764 int len = 0, n_entries = 0, rem; 16765 16766 nla_for_each_nested(attr, filter_attr, rem) { 16767 len += nla_len(attr); 16768 n_entries++; 16769 } 16770 16771 if (len >= U8_MAX) 16772 return -EINVAL; 16773 16774 return n_entries; 16775 } 16776 16777 static int handle_nan_filter(struct nlattr *attr_filter, 16778 struct cfg80211_nan_func *func, 16779 bool tx) 16780 { 16781 struct nlattr *attr; 16782 int n_entries, rem, i; 16783 struct cfg80211_nan_func_filter *filter; 16784 16785 n_entries = validate_nan_filter(attr_filter); 16786 if (n_entries < 0) 16787 return n_entries; 16788 16789 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters)); 16790 16791 filter = kzalloc_objs(*func->rx_filters, n_entries); 16792 if (!filter) 16793 return -ENOMEM; 16794 16795 i = 0; 16796 nla_for_each_nested(attr, attr_filter, rem) { 16797 filter[i].filter = nla_memdup(attr, GFP_KERNEL); 16798 if (!filter[i].filter) 16799 goto err; 16800 16801 filter[i].len = nla_len(attr); 16802 i++; 16803 } 16804 if (tx) { 16805 func->num_tx_filters = n_entries; 16806 func->tx_filters = filter; 16807 } else { 16808 func->num_rx_filters = n_entries; 16809 func->rx_filters = filter; 16810 } 16811 16812 return 0; 16813 16814 err: 16815 i = 0; 16816 nla_for_each_nested(attr, attr_filter, rem) { 16817 kfree(filter[i].filter); 16818 i++; 16819 } 16820 kfree(filter); 16821 return -ENOMEM; 16822 } 16823 16824 static int nl80211_nan_add_func(struct sk_buff *skb, 16825 struct genl_info *info) 16826 { 16827 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16828 struct wireless_dev *wdev = info->user_ptr[1]; 16829 struct nlattr *tb[NUM_NL80211_NAN_FUNC_ATTR], *func_attr; 16830 struct cfg80211_nan_func *func; 16831 struct sk_buff *msg = NULL; 16832 void *hdr = NULL; 16833 int err = 0; 16834 16835 if (wdev->iftype != NL80211_IFTYPE_NAN) 16836 return -EOPNOTSUPP; 16837 16838 if (!wdev_running(wdev)) 16839 return -ENOTCONN; 16840 16841 if (!info->attrs[NL80211_ATTR_NAN_FUNC]) 16842 return -EINVAL; 16843 16844 err = nla_parse_nested_deprecated(tb, NL80211_NAN_FUNC_ATTR_MAX, 16845 info->attrs[NL80211_ATTR_NAN_FUNC], 16846 nl80211_nan_func_policy, 16847 info->extack); 16848 if (err) 16849 return err; 16850 16851 func = kzalloc_obj(*func); 16852 if (!func) 16853 return -ENOMEM; 16854 16855 func->cookie = cfg80211_assign_cookie(rdev); 16856 16857 if (!tb[NL80211_NAN_FUNC_TYPE]) { 16858 err = -EINVAL; 16859 goto out; 16860 } 16861 16862 16863 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]); 16864 16865 if (!tb[NL80211_NAN_FUNC_SERVICE_ID]) { 16866 err = -EINVAL; 16867 goto out; 16868 } 16869 16870 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]), 16871 sizeof(func->service_id)); 16872 16873 func->close_range = 16874 nla_get_flag(tb[NL80211_NAN_FUNC_CLOSE_RANGE]); 16875 16876 if (tb[NL80211_NAN_FUNC_SERVICE_INFO]) { 16877 func->serv_spec_info_len = 16878 nla_len(tb[NL80211_NAN_FUNC_SERVICE_INFO]); 16879 func->serv_spec_info = 16880 kmemdup(nla_data(tb[NL80211_NAN_FUNC_SERVICE_INFO]), 16881 func->serv_spec_info_len, 16882 GFP_KERNEL); 16883 if (!func->serv_spec_info) { 16884 err = -ENOMEM; 16885 goto out; 16886 } 16887 } 16888 16889 if (tb[NL80211_NAN_FUNC_TTL]) 16890 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]); 16891 16892 switch (func->type) { 16893 case NL80211_NAN_FUNC_PUBLISH: 16894 if (!tb[NL80211_NAN_FUNC_PUBLISH_TYPE]) { 16895 err = -EINVAL; 16896 goto out; 16897 } 16898 16899 func->publish_type = 16900 nla_get_u8(tb[NL80211_NAN_FUNC_PUBLISH_TYPE]); 16901 func->publish_bcast = 16902 nla_get_flag(tb[NL80211_NAN_FUNC_PUBLISH_BCAST]); 16903 16904 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) && 16905 func->publish_bcast) { 16906 err = -EINVAL; 16907 goto out; 16908 } 16909 break; 16910 case NL80211_NAN_FUNC_SUBSCRIBE: 16911 func->subscribe_active = 16912 nla_get_flag(tb[NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE]); 16913 break; 16914 case NL80211_NAN_FUNC_FOLLOW_UP: 16915 if (!tb[NL80211_NAN_FUNC_FOLLOW_UP_ID] || 16916 !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] || 16917 !tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]) { 16918 err = -EINVAL; 16919 goto out; 16920 } 16921 16922 func->followup_id = 16923 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_ID]); 16924 func->followup_reqid = 16925 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]); 16926 memcpy(func->followup_dest.addr, 16927 nla_data(tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]), 16928 sizeof(func->followup_dest.addr)); 16929 if (func->ttl) { 16930 err = -EINVAL; 16931 goto out; 16932 } 16933 break; 16934 default: 16935 err = -EINVAL; 16936 goto out; 16937 } 16938 16939 if (tb[NL80211_NAN_FUNC_SRF]) { 16940 struct nlattr *srf_tb[NUM_NL80211_NAN_SRF_ATTR]; 16941 16942 err = nla_parse_nested_deprecated(srf_tb, 16943 NL80211_NAN_SRF_ATTR_MAX, 16944 tb[NL80211_NAN_FUNC_SRF], 16945 nl80211_nan_srf_policy, 16946 info->extack); 16947 if (err) 16948 goto out; 16949 16950 func->srf_include = 16951 nla_get_flag(srf_tb[NL80211_NAN_SRF_INCLUDE]); 16952 16953 if (srf_tb[NL80211_NAN_SRF_BF]) { 16954 if (srf_tb[NL80211_NAN_SRF_MAC_ADDRS] || 16955 !srf_tb[NL80211_NAN_SRF_BF_IDX]) { 16956 err = -EINVAL; 16957 goto out; 16958 } 16959 16960 func->srf_bf_len = 16961 nla_len(srf_tb[NL80211_NAN_SRF_BF]); 16962 func->srf_bf = 16963 kmemdup(nla_data(srf_tb[NL80211_NAN_SRF_BF]), 16964 func->srf_bf_len, GFP_KERNEL); 16965 if (!func->srf_bf) { 16966 err = -ENOMEM; 16967 goto out; 16968 } 16969 16970 func->srf_bf_idx = 16971 nla_get_u8(srf_tb[NL80211_NAN_SRF_BF_IDX]); 16972 } else { 16973 struct nlattr *attr, *mac_attr = 16974 srf_tb[NL80211_NAN_SRF_MAC_ADDRS]; 16975 int n_entries, rem, i = 0; 16976 16977 if (!mac_attr) { 16978 err = -EINVAL; 16979 goto out; 16980 } 16981 16982 n_entries = validate_acl_mac_addrs(mac_attr); 16983 if (n_entries <= 0) { 16984 err = -EINVAL; 16985 goto out; 16986 } 16987 16988 func->srf_num_macs = n_entries; 16989 func->srf_macs = 16990 kzalloc_objs(*func->srf_macs, n_entries); 16991 if (!func->srf_macs) { 16992 err = -ENOMEM; 16993 goto out; 16994 } 16995 16996 nla_for_each_nested(attr, mac_attr, rem) 16997 memcpy(func->srf_macs[i++].addr, nla_data(attr), 16998 sizeof(*func->srf_macs)); 16999 } 17000 } 17001 17002 if (tb[NL80211_NAN_FUNC_TX_MATCH_FILTER]) { 17003 err = handle_nan_filter(tb[NL80211_NAN_FUNC_TX_MATCH_FILTER], 17004 func, true); 17005 if (err) 17006 goto out; 17007 } 17008 17009 if (tb[NL80211_NAN_FUNC_RX_MATCH_FILTER]) { 17010 err = handle_nan_filter(tb[NL80211_NAN_FUNC_RX_MATCH_FILTER], 17011 func, false); 17012 if (err) 17013 goto out; 17014 } 17015 17016 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 17017 if (!msg) { 17018 err = -ENOMEM; 17019 goto out; 17020 } 17021 17022 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 17023 NL80211_CMD_ADD_NAN_FUNCTION); 17024 /* This can't really happen - we just allocated 4KB */ 17025 if (WARN_ON(!hdr)) { 17026 err = -ENOMEM; 17027 goto out; 17028 } 17029 17030 err = rdev_add_nan_func(rdev, wdev, func); 17031 out: 17032 if (err < 0) { 17033 cfg80211_free_nan_func(func); 17034 nlmsg_free(msg); 17035 return err; 17036 } 17037 17038 /* propagate the instance id and cookie to userspace */ 17039 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie, 17040 NL80211_ATTR_PAD)) 17041 goto nla_put_failure; 17042 17043 func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC); 17044 if (!func_attr) 17045 goto nla_put_failure; 17046 17047 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, 17048 func->instance_id)) 17049 goto nla_put_failure; 17050 17051 nla_nest_end(msg, func_attr); 17052 17053 genlmsg_end(msg, hdr); 17054 return genlmsg_reply(msg, info); 17055 17056 nla_put_failure: 17057 nlmsg_free(msg); 17058 return -ENOBUFS; 17059 } 17060 17061 static int nl80211_nan_del_func(struct sk_buff *skb, 17062 struct genl_info *info) 17063 { 17064 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17065 struct wireless_dev *wdev = info->user_ptr[1]; 17066 u64 cookie; 17067 17068 if (wdev->iftype != NL80211_IFTYPE_NAN) 17069 return -EOPNOTSUPP; 17070 17071 if (!wdev_running(wdev)) 17072 return -ENOTCONN; 17073 17074 if (!info->attrs[NL80211_ATTR_COOKIE]) 17075 return -EINVAL; 17076 17077 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 17078 17079 rdev_del_nan_func(rdev, wdev, cookie); 17080 17081 return 0; 17082 } 17083 17084 static int nl80211_nan_change_config(struct sk_buff *skb, 17085 struct genl_info *info) 17086 { 17087 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17088 struct wireless_dev *wdev = info->user_ptr[1]; 17089 struct cfg80211_nan_conf conf = {}; 17090 u32 changed = 0; 17091 int err; 17092 17093 if (wdev->iftype != NL80211_IFTYPE_NAN) 17094 return -EOPNOTSUPP; 17095 17096 if (!wdev_running(wdev)) 17097 return -ENOTCONN; 17098 17099 err = nl80211_parse_nan_conf(&rdev->wiphy, info, &conf, &changed, false); 17100 if (err) 17101 return err; 17102 17103 if (!changed) 17104 return -EINVAL; 17105 17106 return rdev_nan_change_conf(rdev, wdev, &conf, changed); 17107 } 17108 17109 static int nl80211_start_pd(struct sk_buff *skb, struct genl_info *info) 17110 { 17111 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17112 struct wireless_dev *wdev = info->user_ptr[1]; 17113 int err; 17114 17115 if (wdev->iftype != NL80211_IFTYPE_PD) 17116 return -EOPNOTSUPP; 17117 17118 if (wdev_running(wdev)) 17119 return -EEXIST; 17120 17121 if (rfkill_blocked(rdev->wiphy.rfkill)) 17122 return -ERFKILL; 17123 17124 if (!rdev->ops->start_pd) 17125 return -EOPNOTSUPP; 17126 17127 err = rdev_start_pd(rdev, wdev); 17128 if (err) 17129 return err; 17130 wdev->is_running = true; 17131 rdev->opencount++; 17132 17133 return 0; 17134 } 17135 17136 static int nl80211_stop_pd(struct sk_buff *skb, struct genl_info *info) 17137 { 17138 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17139 struct wireless_dev *wdev = info->user_ptr[1]; 17140 17141 if (wdev->iftype != NL80211_IFTYPE_PD) 17142 return -EOPNOTSUPP; 17143 17144 cfg80211_stop_pd(rdev, wdev); 17145 17146 return 0; 17147 } 17148 17149 void cfg80211_nan_match(struct wireless_dev *wdev, 17150 struct cfg80211_nan_match_params *match, gfp_t gfp) 17151 { 17152 struct wiphy *wiphy = wdev->wiphy; 17153 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 17154 struct nlattr *match_attr, *local_func_attr, *peer_func_attr; 17155 struct sk_buff *msg; 17156 void *hdr; 17157 17158 if (WARN_ON(wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_USERSPACE_DE)) 17159 return; 17160 17161 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr)) 17162 return; 17163 17164 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 17165 if (!msg) 17166 return; 17167 17168 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_MATCH); 17169 if (!hdr) { 17170 nlmsg_free(msg); 17171 return; 17172 } 17173 17174 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17175 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 17176 wdev->netdev->ifindex)) || 17177 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 17178 NL80211_ATTR_PAD)) 17179 goto nla_put_failure; 17180 17181 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie, 17182 NL80211_ATTR_PAD) || 17183 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr)) 17184 goto nla_put_failure; 17185 17186 match_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_MATCH); 17187 if (!match_attr) 17188 goto nla_put_failure; 17189 17190 local_func_attr = nla_nest_start_noflag(msg, 17191 NL80211_NAN_MATCH_FUNC_LOCAL); 17192 if (!local_func_attr) 17193 goto nla_put_failure; 17194 17195 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id)) 17196 goto nla_put_failure; 17197 17198 nla_nest_end(msg, local_func_attr); 17199 17200 peer_func_attr = nla_nest_start_noflag(msg, 17201 NL80211_NAN_MATCH_FUNC_PEER); 17202 if (!peer_func_attr) 17203 goto nla_put_failure; 17204 17205 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) || 17206 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id)) 17207 goto nla_put_failure; 17208 17209 if (match->info && match->info_len && 17210 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len, 17211 match->info)) 17212 goto nla_put_failure; 17213 17214 nla_nest_end(msg, peer_func_attr); 17215 nla_nest_end(msg, match_attr); 17216 genlmsg_end(msg, hdr); 17217 17218 if (!wdev->owner_nlportid) 17219 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 17220 msg, 0, NL80211_MCGRP_NAN, gfp); 17221 else 17222 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 17223 wdev->owner_nlportid); 17224 17225 return; 17226 17227 nla_put_failure: 17228 nlmsg_free(msg); 17229 } 17230 EXPORT_SYMBOL(cfg80211_nan_match); 17231 17232 void cfg80211_nan_func_terminated(struct wireless_dev *wdev, 17233 u8 inst_id, 17234 enum nl80211_nan_func_term_reason reason, 17235 u64 cookie, gfp_t gfp) 17236 { 17237 struct wiphy *wiphy = wdev->wiphy; 17238 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 17239 struct sk_buff *msg; 17240 struct nlattr *func_attr; 17241 void *hdr; 17242 17243 if (WARN_ON(wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_USERSPACE_DE)) 17244 return; 17245 17246 if (WARN_ON(!inst_id)) 17247 return; 17248 17249 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 17250 if (!msg) 17251 return; 17252 17253 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_NAN_FUNCTION); 17254 if (!hdr) { 17255 nlmsg_free(msg); 17256 return; 17257 } 17258 17259 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17260 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 17261 wdev->netdev->ifindex)) || 17262 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 17263 NL80211_ATTR_PAD)) 17264 goto nla_put_failure; 17265 17266 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 17267 NL80211_ATTR_PAD)) 17268 goto nla_put_failure; 17269 17270 func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC); 17271 if (!func_attr) 17272 goto nla_put_failure; 17273 17274 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, inst_id) || 17275 nla_put_u8(msg, NL80211_NAN_FUNC_TERM_REASON, reason)) 17276 goto nla_put_failure; 17277 17278 nla_nest_end(msg, func_attr); 17279 genlmsg_end(msg, hdr); 17280 17281 if (!wdev->owner_nlportid) 17282 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 17283 msg, 0, NL80211_MCGRP_NAN, gfp); 17284 else 17285 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 17286 wdev->owner_nlportid); 17287 17288 return; 17289 17290 nla_put_failure: 17291 nlmsg_free(msg); 17292 } 17293 EXPORT_SYMBOL(cfg80211_nan_func_terminated); 17294 17295 void cfg80211_nan_sched_update_done(struct wireless_dev *wdev, bool success, 17296 gfp_t gfp) 17297 { 17298 struct wiphy *wiphy = wdev->wiphy; 17299 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 17300 struct sk_buff *msg; 17301 void *hdr; 17302 17303 trace_cfg80211_nan_sched_update_done(wiphy, wdev, success); 17304 17305 /* Can happen if we stopped NAN */ 17306 if (!wdev->u.nan.sched_update_pending) 17307 return; 17308 17309 wdev->u.nan.sched_update_pending = false; 17310 17311 if (!wdev->owner_nlportid) 17312 return; 17313 17314 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 17315 if (!msg) 17316 return; 17317 17318 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_SCHED_UPDATE_DONE); 17319 if (!hdr) 17320 goto nla_put_failure; 17321 17322 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17323 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 17324 NL80211_ATTR_PAD) || 17325 (success && 17326 nla_put_flag(msg, NL80211_ATTR_NAN_SCHED_UPDATE_SUCCESS))) 17327 goto nla_put_failure; 17328 17329 genlmsg_end(msg, hdr); 17330 17331 genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid); 17332 17333 return; 17334 17335 nla_put_failure: 17336 nlmsg_free(msg); 17337 } 17338 EXPORT_SYMBOL(cfg80211_nan_sched_update_done); 17339 17340 static int nl80211_parse_nan_channel(struct cfg80211_registered_device *rdev, 17341 struct nlattr *channel, 17342 struct genl_info *info, 17343 struct cfg80211_nan_channel *nan_channels, 17344 u8 index, bool local) 17345 { 17346 struct nlattr **channel_parsed __free(kfree) = NULL; 17347 struct cfg80211_chan_def chandef; 17348 u8 n_rx_nss; 17349 int ret; 17350 17351 channel_parsed = kzalloc_objs(*channel_parsed, NL80211_ATTR_MAX + 1); 17352 if (!channel_parsed) 17353 return -ENOMEM; 17354 17355 ret = nla_parse_nested(channel_parsed, NL80211_ATTR_MAX, channel, NULL, 17356 info->extack); 17357 if (ret) 17358 return ret; 17359 17360 ret = nl80211_parse_chandef(rdev, info->extack, channel_parsed, 17361 &chandef, false); 17362 if (ret) 17363 return ret; 17364 17365 if (chandef.chan->band == NL80211_BAND_6GHZ) { 17366 NL_SET_ERR_MSG(info->extack, 17367 "6 GHz band is not supported"); 17368 return -EOPNOTSUPP; 17369 } 17370 17371 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &chandef, 17372 NL80211_IFTYPE_NAN)) { 17373 NL_SET_ERR_MSG_ATTR(info->extack, channel, 17374 "Channel in NAN schedule is not allowed for NAN operation"); 17375 return -EINVAL; 17376 } 17377 17378 if (local) { 17379 for (int i = 0; i < index; i++) { 17380 if (cfg80211_chandef_compatible(&nan_channels[i].chandef, 17381 &chandef)) { 17382 NL_SET_ERR_MSG_ATTR(info->extack, channel, 17383 "Channels in NAN schedule must be mutually incompatible"); 17384 return -EINVAL; 17385 } 17386 } 17387 } 17388 17389 if (!channel_parsed[NL80211_ATTR_NAN_CHANNEL_ENTRY]) { 17390 NL_SET_ERR_MSG(info->extack, 17391 "Missing NAN channel entry attribute"); 17392 return -EINVAL; 17393 } 17394 17395 nan_channels[index].channel_entry = 17396 nla_data(channel_parsed[NL80211_ATTR_NAN_CHANNEL_ENTRY]); 17397 17398 if (!channel_parsed[NL80211_ATTR_NAN_RX_NSS]) { 17399 NL_SET_ERR_MSG(info->extack, 17400 "Missing NAN RX NSS attribute"); 17401 return -EINVAL; 17402 } 17403 17404 nan_channels[index].rx_nss = 17405 nla_get_u8(channel_parsed[NL80211_ATTR_NAN_RX_NSS]); 17406 17407 n_rx_nss = u8_get_bits(rdev->wiphy.nan_capa.n_antennas, 0x03); 17408 if ((local && nan_channels[index].rx_nss > n_rx_nss) || 17409 !nan_channels[index].rx_nss) { 17410 NL_SET_ERR_MSG_ATTR(info->extack, channel, 17411 "Invalid RX NSS in NAN channel definition"); 17412 return -EINVAL; 17413 } 17414 17415 nan_channels[index].chandef = chandef; 17416 17417 return 0; 17418 } 17419 17420 static int 17421 nl80211_parse_nan_schedule(struct genl_info *info, struct nlattr *slots_attr, 17422 u8 schedule[CFG80211_NAN_SCHED_NUM_TIME_SLOTS], 17423 u8 n_channels) 17424 { 17425 if (WARN_ON(nla_len(slots_attr) != CFG80211_NAN_SCHED_NUM_TIME_SLOTS)) 17426 return -EINVAL; 17427 17428 memcpy(schedule, nla_data(slots_attr), nla_len(slots_attr)); 17429 17430 for (int slot = 0; slot < CFG80211_NAN_SCHED_NUM_TIME_SLOTS; slot++) { 17431 if (schedule[slot] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT && 17432 schedule[slot] >= n_channels) { 17433 NL_SET_ERR_MSG_FMT(info->extack, 17434 "Invalid time slot: slot %d refers to channel index %d, n_channels=%d", 17435 slot, schedule[slot], n_channels); 17436 return -EINVAL; 17437 } 17438 } 17439 17440 return 0; 17441 } 17442 17443 static int 17444 nl80211_parse_nan_peer_map(struct genl_info *info, struct nlattr *map_attr, 17445 struct cfg80211_nan_peer_map *map, u8 n_channels) 17446 { 17447 struct nlattr *tb[NL80211_NAN_PEER_MAP_ATTR_MAX + 1]; 17448 int ret; 17449 17450 ret = nla_parse_nested(tb, NL80211_NAN_PEER_MAP_ATTR_MAX, map_attr, 17451 nl80211_nan_peer_map_policy, info->extack); 17452 if (ret) 17453 return ret; 17454 17455 if (!tb[NL80211_NAN_PEER_MAP_ATTR_MAP_ID] || 17456 !tb[NL80211_NAN_PEER_MAP_ATTR_TIME_SLOTS]) { 17457 NL_SET_ERR_MSG(info->extack, 17458 "Missing required peer map attributes"); 17459 return -EINVAL; 17460 } 17461 17462 map->map_id = nla_get_u8(tb[NL80211_NAN_PEER_MAP_ATTR_MAP_ID]); 17463 17464 /* Parse schedule */ 17465 return nl80211_parse_nan_schedule(info, 17466 tb[NL80211_NAN_PEER_MAP_ATTR_TIME_SLOTS], 17467 map->schedule, n_channels); 17468 } 17469 17470 static int nl80211_nan_validate_map_pair(struct wiphy *wiphy, 17471 struct genl_info *info, 17472 const struct cfg80211_nan_peer_map *map1, 17473 const struct cfg80211_nan_peer_map *map2, 17474 struct cfg80211_nan_channel *nan_channels) 17475 { 17476 /* Check for duplicate map_id */ 17477 if (map1->map_id == map2->map_id) { 17478 NL_SET_ERR_MSG_FMT(info->extack, "Duplicate map_id %u", 17479 map1->map_id); 17480 return -EINVAL; 17481 } 17482 17483 /* Check for compatible channels between maps */ 17484 for (int i = 0; i < ARRAY_SIZE(map1->schedule); i++) { 17485 if (map1->schedule[i] == NL80211_NAN_SCHED_NOT_AVAIL_SLOT) 17486 continue; 17487 17488 for (int j = 0; j < ARRAY_SIZE(map2->schedule); j++) { 17489 u8 ch1 = map1->schedule[i]; 17490 u8 ch2 = map2->schedule[j]; 17491 17492 if (ch2 == NL80211_NAN_SCHED_NOT_AVAIL_SLOT) 17493 continue; 17494 17495 if (cfg80211_chandef_compatible(&nan_channels[ch1].chandef, 17496 &nan_channels[ch2].chandef)) { 17497 NL_SET_ERR_MSG_FMT(info->extack, 17498 "Maps %u and %u have compatible channels %d and %d", 17499 map1->map_id, map2->map_id, 17500 ch1, ch2); 17501 return -EINVAL; 17502 } 17503 } 17504 } 17505 17506 /* 17507 * Check for conflicting time slots between maps. 17508 * Only check for single-radio devices (n_radio <= 1) which cannot 17509 * operate on multiple channels simultaneously. 17510 */ 17511 if (wiphy->n_radio > 1) 17512 return 0; 17513 17514 for (int i = 0; i < ARRAY_SIZE(map1->schedule); i++) { 17515 if (map1->schedule[i] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT && 17516 map2->schedule[i] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT) { 17517 NL_SET_ERR_MSG_FMT(info->extack, 17518 "Maps %u and %u both schedule slot %d", 17519 map1->map_id, map2->map_id, i); 17520 return -EINVAL; 17521 } 17522 } 17523 17524 return 0; 17525 } 17526 17527 static int nl80211_nan_set_peer_sched(struct sk_buff *skb, 17528 struct genl_info *info) 17529 { 17530 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17531 struct cfg80211_nan_channel *nan_channels __free(kfree) = NULL; 17532 struct cfg80211_nan_peer_sched sched = {}; 17533 struct wireless_dev *wdev = info->user_ptr[1]; 17534 struct nlattr *map_attr, *channel; 17535 int ret, n_maps = 0, n_channels = 0, i = 0, rem; 17536 17537 if (wdev->iftype != NL80211_IFTYPE_NAN) 17538 return -EOPNOTSUPP; 17539 17540 if (!info->attrs[NL80211_ATTR_MAC] || 17541 !info->attrs[NL80211_ATTR_NAN_COMMITTED_DW]) { 17542 NL_SET_ERR_MSG(info->extack, 17543 "Required NAN peer schedule attributes are missing"); 17544 return -EINVAL; 17545 } 17546 17547 /* First count how many channel attributes we got */ 17548 nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL, 17549 info->nlhdr, GENL_HDRLEN, rem) 17550 n_channels++; 17551 17552 if (!((info->attrs[NL80211_ATTR_NAN_SEQ_ID] && 17553 info->attrs[NL80211_ATTR_NAN_PEER_MAPS] && n_channels) || 17554 ((!info->attrs[NL80211_ATTR_NAN_SEQ_ID] && 17555 !info->attrs[NL80211_ATTR_NAN_PEER_MAPS] && !n_channels)))) { 17556 NL_SET_ERR_MSG(info->extack, 17557 "Either provide all of: seq id, channels and maps, or none"); 17558 return -EINVAL; 17559 } 17560 17561 /* 17562 * Limit the number of peer channels to: 17563 * local_channels * 4 (possible BWs) * 2 (possible NSS values) 17564 */ 17565 if (n_channels && n_channels > wdev->u.nan.n_channels * 4 * 2) { 17566 NL_SET_ERR_MSG_FMT(info->extack, 17567 "Too many peer channels: %d (max %d)", 17568 n_channels, 17569 wdev->u.nan.n_channels * 4 * 2); 17570 return -EINVAL; 17571 } 17572 17573 if (n_channels) { 17574 nan_channels = kzalloc_objs(*nan_channels, n_channels); 17575 if (!nan_channels) 17576 return -ENOMEM; 17577 } 17578 17579 /* Parse peer channels */ 17580 nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL, 17581 info->nlhdr, GENL_HDRLEN, rem) { 17582 bool compatible = false; 17583 17584 ret = nl80211_parse_nan_channel(rdev, channel, info, 17585 nan_channels, i, false); 17586 if (ret) 17587 return ret; 17588 17589 /* Verify channel is compatible with at least one local channel */ 17590 for (int j = 0; j < wdev->u.nan.n_channels; j++) { 17591 if (cfg80211_chandef_compatible(&nan_channels[i].chandef, 17592 &wdev->u.nan.chandefs[j])) { 17593 compatible = true; 17594 break; 17595 } 17596 } 17597 if (!compatible) { 17598 NL_SET_ERR_MSG_FMT(info->extack, 17599 "Channel %d not compatible with any local channel", 17600 i); 17601 return -EINVAL; 17602 } 17603 i++; 17604 } 17605 17606 sched.n_channels = n_channels; 17607 sched.nan_channels = nan_channels; 17608 sched.peer_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 17609 sched.seq_id = nla_get_u8_default(info->attrs[NL80211_ATTR_NAN_SEQ_ID], 0); 17610 sched.committed_dw = nla_get_u16(info->attrs[NL80211_ATTR_NAN_COMMITTED_DW]); 17611 sched.max_chan_switch = 17612 nla_get_u16_default(info->attrs[NL80211_ATTR_NAN_MAX_CHAN_SWITCH_TIME], 0); 17613 17614 if (info->attrs[NL80211_ATTR_NAN_ULW]) { 17615 sched.ulw_size = nla_len(info->attrs[NL80211_ATTR_NAN_ULW]); 17616 sched.init_ulw = nla_data(info->attrs[NL80211_ATTR_NAN_ULW]); 17617 } 17618 17619 /* Initialize all maps as invalid */ 17620 for (int j = 0; j < ARRAY_SIZE(sched.maps); j++) 17621 sched.maps[j].map_id = CFG80211_NAN_INVALID_MAP_ID; 17622 17623 if (info->attrs[NL80211_ATTR_NAN_PEER_MAPS]) { 17624 /* Parse each map */ 17625 nla_for_each_nested(map_attr, info->attrs[NL80211_ATTR_NAN_PEER_MAPS], 17626 rem) { 17627 if (n_maps >= ARRAY_SIZE(sched.maps)) { 17628 NL_SET_ERR_MSG(info->extack, "Too many peer maps"); 17629 return -EINVAL; 17630 } 17631 17632 ret = nl80211_parse_nan_peer_map(info, map_attr, 17633 &sched.maps[n_maps], 17634 n_channels); 17635 if (ret) 17636 return ret; 17637 17638 /* Validate against previous maps */ 17639 for (int j = 0; j < n_maps; j++) { 17640 ret = nl80211_nan_validate_map_pair(&rdev->wiphy, info, 17641 &sched.maps[j], 17642 &sched.maps[n_maps], 17643 nan_channels); 17644 if (ret) 17645 return ret; 17646 } 17647 17648 n_maps++; 17649 } 17650 } 17651 17652 /* Verify each channel is scheduled at least once */ 17653 for (int ch = 0; ch < n_channels; ch++) { 17654 bool scheduled = false; 17655 17656 for (int m = 0; m < n_maps && !scheduled; m++) { 17657 for (int s = 0; s < ARRAY_SIZE(sched.maps[m].schedule); s++) { 17658 if (sched.maps[m].schedule[s] == ch) { 17659 scheduled = true; 17660 break; 17661 } 17662 } 17663 } 17664 if (!scheduled) { 17665 NL_SET_ERR_MSG_FMT(info->extack, 17666 "Channel %d is not scheduled in any map", 17667 ch); 17668 return -EINVAL; 17669 } 17670 } 17671 17672 return rdev_nan_set_peer_sched(rdev, wdev, &sched); 17673 } 17674 17675 static bool nl80211_nan_is_sched_empty(struct cfg80211_nan_local_sched *sched) 17676 { 17677 if (!sched->n_channels) 17678 return true; 17679 17680 for (int i = 0; i < ARRAY_SIZE(sched->schedule); i++) { 17681 if (sched->schedule[i] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT) 17682 return false; 17683 } 17684 17685 return true; 17686 } 17687 17688 static int nl80211_nan_set_local_sched(struct sk_buff *skb, 17689 struct genl_info *info) 17690 { 17691 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17692 struct cfg80211_nan_local_sched *sched __free(kfree) = NULL; 17693 struct wireless_dev *wdev = info->user_ptr[1]; 17694 int rem, i = 0, n_channels = 0, ret; 17695 struct nlattr *channel; 17696 bool sched_empty; 17697 17698 if (wdev->iftype != NL80211_IFTYPE_NAN) 17699 return -EOPNOTSUPP; 17700 17701 if (!wdev_running(wdev)) 17702 return -ENOTCONN; 17703 17704 if (!info->attrs[NL80211_ATTR_NAN_TIME_SLOTS]) 17705 return -EINVAL; 17706 17707 /* First count how many channel attributes we got */ 17708 nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL, 17709 info->nlhdr, GENL_HDRLEN, rem) 17710 n_channels++; 17711 17712 sched = kzalloc_flex(*sched, nan_channels, n_channels); 17713 if (!sched) 17714 return -ENOMEM; 17715 17716 sched->n_channels = n_channels; 17717 17718 nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL, 17719 info->nlhdr, GENL_HDRLEN, rem) { 17720 ret = nl80211_parse_nan_channel(rdev, channel, info, 17721 sched->nan_channels, i, true); 17722 17723 if (ret) 17724 return ret; 17725 i++; 17726 } 17727 17728 /* Parse and validate schedule */ 17729 ret = nl80211_parse_nan_schedule(info, 17730 info->attrs[NL80211_ATTR_NAN_TIME_SLOTS], 17731 sched->schedule, sched->n_channels); 17732 if (ret) 17733 return ret; 17734 17735 sched_empty = nl80211_nan_is_sched_empty(sched); 17736 17737 sched->deferred = 17738 nla_get_flag(info->attrs[NL80211_ATTR_NAN_SCHED_DEFERRED]); 17739 17740 if (sched_empty) { 17741 if (sched->deferred) { 17742 NL_SET_ERR_MSG(info->extack, 17743 "Schedule cannot be deferred if all time slots are unavailable"); 17744 return -EINVAL; 17745 } 17746 17747 if (info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]) { 17748 NL_SET_ERR_MSG(info->extack, 17749 "NAN Availability blob must be empty if all time slots are unavailable"); 17750 return -EINVAL; 17751 } 17752 } else { 17753 if (!info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]) { 17754 NL_SET_ERR_MSG(info->extack, 17755 "NAN Availability blob attribute is required"); 17756 return -EINVAL; 17757 } 17758 17759 sched->nan_avail_blob = 17760 nla_data(info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]); 17761 sched->nan_avail_blob_len = 17762 nla_len(info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]); 17763 } 17764 17765 return cfg80211_nan_set_local_schedule(rdev, wdev, sched); 17766 } 17767 17768 static int nl80211_get_protocol_features(struct sk_buff *skb, 17769 struct genl_info *info) 17770 { 17771 void *hdr; 17772 struct sk_buff *msg; 17773 17774 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 17775 if (!msg) 17776 return -ENOMEM; 17777 17778 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 17779 NL80211_CMD_GET_PROTOCOL_FEATURES); 17780 if (!hdr) 17781 goto nla_put_failure; 17782 17783 if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES, 17784 NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP)) 17785 goto nla_put_failure; 17786 17787 genlmsg_end(msg, hdr); 17788 return genlmsg_reply(msg, info); 17789 17790 nla_put_failure: 17791 kfree_skb(msg); 17792 return -ENOBUFS; 17793 } 17794 17795 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info) 17796 { 17797 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17798 struct cfg80211_update_ft_ies_params ft_params; 17799 struct net_device *dev = info->user_ptr[1]; 17800 17801 if (!rdev->ops->update_ft_ies) 17802 return -EOPNOTSUPP; 17803 17804 if (!info->attrs[NL80211_ATTR_MDID] || 17805 !info->attrs[NL80211_ATTR_IE]) 17806 return -EINVAL; 17807 17808 memset(&ft_params, 0, sizeof(ft_params)); 17809 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); 17810 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 17811 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 17812 17813 return rdev_update_ft_ies(rdev, dev, &ft_params); 17814 } 17815 17816 static int nl80211_crit_protocol_start(struct sk_buff *skb, 17817 struct genl_info *info) 17818 { 17819 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17820 struct wireless_dev *wdev = info->user_ptr[1]; 17821 enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC; 17822 u16 duration; 17823 int ret; 17824 17825 if (!rdev->ops->crit_proto_start) 17826 return -EOPNOTSUPP; 17827 17828 if (WARN_ON(!rdev->ops->crit_proto_stop)) 17829 return -EINVAL; 17830 17831 if (rdev->crit_proto_nlportid) 17832 return -EBUSY; 17833 17834 /* determine protocol if provided */ 17835 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) 17836 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); 17837 17838 if (proto >= NUM_NL80211_CRIT_PROTO) 17839 return -EINVAL; 17840 17841 /* timeout must be provided */ 17842 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) 17843 return -EINVAL; 17844 17845 duration = 17846 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); 17847 17848 ret = rdev_crit_proto_start(rdev, wdev, proto, duration); 17849 if (!ret) 17850 rdev->crit_proto_nlportid = info->snd_portid; 17851 17852 return ret; 17853 } 17854 17855 static int nl80211_crit_protocol_stop(struct sk_buff *skb, 17856 struct genl_info *info) 17857 { 17858 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17859 struct wireless_dev *wdev = info->user_ptr[1]; 17860 17861 if (!rdev->ops->crit_proto_stop) 17862 return -EOPNOTSUPP; 17863 17864 if (rdev->crit_proto_nlportid) { 17865 rdev->crit_proto_nlportid = 0; 17866 rdev_crit_proto_stop(rdev, wdev); 17867 } 17868 return 0; 17869 } 17870 17871 static int nl80211_vendor_check_policy(const struct wiphy_vendor_command *vcmd, 17872 struct nlattr *attr, 17873 struct netlink_ext_ack *extack) 17874 { 17875 if (vcmd->policy == VENDOR_CMD_RAW_DATA) { 17876 if (attr->nla_type & NLA_F_NESTED) { 17877 NL_SET_ERR_MSG_ATTR(extack, attr, 17878 "unexpected nested data"); 17879 return -EINVAL; 17880 } 17881 17882 return 0; 17883 } 17884 17885 if (!(attr->nla_type & NLA_F_NESTED)) { 17886 NL_SET_ERR_MSG_ATTR(extack, attr, "expected nested data"); 17887 return -EINVAL; 17888 } 17889 17890 return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack); 17891 } 17892 17893 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info) 17894 { 17895 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17896 struct wireless_dev *wdev = 17897 __cfg80211_wdev_from_attrs(rdev, genl_info_net(info), 17898 info->attrs); 17899 int i, err; 17900 u32 vid, subcmd; 17901 17902 if (!rdev->wiphy.vendor_commands) 17903 return -EOPNOTSUPP; 17904 17905 if (IS_ERR(wdev)) { 17906 err = PTR_ERR(wdev); 17907 if (err != -EINVAL) 17908 return err; 17909 wdev = NULL; 17910 } else if (wdev->wiphy != &rdev->wiphy) { 17911 return -EINVAL; 17912 } 17913 17914 if (!info->attrs[NL80211_ATTR_VENDOR_ID] || 17915 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD]) 17916 return -EINVAL; 17917 17918 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]); 17919 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]); 17920 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { 17921 const struct wiphy_vendor_command *vcmd; 17922 void *data = NULL; 17923 int len = 0; 17924 17925 vcmd = &rdev->wiphy.vendor_commands[i]; 17926 17927 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) 17928 continue; 17929 17930 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | 17931 WIPHY_VENDOR_CMD_NEED_NETDEV)) { 17932 if (!wdev) 17933 return -EINVAL; 17934 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && 17935 !wdev->netdev) 17936 return -EINVAL; 17937 17938 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { 17939 if (!wdev_running(wdev)) 17940 return -ENETDOWN; 17941 } 17942 } else { 17943 wdev = NULL; 17944 } 17945 17946 if (!vcmd->doit) 17947 return -EOPNOTSUPP; 17948 17949 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { 17950 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); 17951 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); 17952 17953 err = nl80211_vendor_check_policy(vcmd, 17954 info->attrs[NL80211_ATTR_VENDOR_DATA], 17955 info->extack); 17956 if (err) 17957 return err; 17958 } 17959 17960 rdev->cur_cmd_info = info; 17961 err = vcmd->doit(&rdev->wiphy, wdev, data, len); 17962 rdev->cur_cmd_info = NULL; 17963 return err; 17964 } 17965 17966 return -EOPNOTSUPP; 17967 } 17968 17969 static int nl80211_prepare_vendor_dump(struct sk_buff *skb, 17970 struct netlink_callback *cb, 17971 struct cfg80211_registered_device **rdev, 17972 struct wireless_dev **wdev) 17973 { 17974 struct nlattr **attrbuf; 17975 u32 vid, subcmd; 17976 unsigned int i; 17977 int vcmd_idx = -1; 17978 int err; 17979 void *data = NULL; 17980 unsigned int data_len = 0; 17981 17982 if (cb->args[0]) { 17983 /* subtract the 1 again here */ 17984 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); 17985 struct wireless_dev *tmp; 17986 17987 if (!wiphy) 17988 return -ENODEV; 17989 17990 /* 17991 * The wiphy may have moved netns between dumpit 17992 * invocations (via NL80211_CMD_SET_WIPHY_NETNS), so 17993 * re-check that it still matches the caller's netns. 17994 */ 17995 if (!net_eq(wiphy_net(wiphy), sock_net(skb->sk))) 17996 return -ENODEV; 17997 17998 *rdev = wiphy_to_rdev(wiphy); 17999 *wdev = NULL; 18000 18001 if (cb->args[1]) { 18002 list_for_each_entry(tmp, &wiphy->wdev_list, list) { 18003 if (tmp->identifier == cb->args[1] - 1) { 18004 *wdev = tmp; 18005 break; 18006 } 18007 } 18008 } 18009 18010 /* keep rtnl locked in successful case */ 18011 return 0; 18012 } 18013 18014 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 18015 if (!attrbuf) 18016 return -ENOMEM; 18017 18018 err = nlmsg_parse_deprecated(cb->nlh, 18019 GENL_HDRLEN + nl80211_fam.hdrsize, 18020 attrbuf, nl80211_fam.maxattr, 18021 nl80211_policy, NULL); 18022 if (err) 18023 goto out; 18024 18025 if (!attrbuf[NL80211_ATTR_VENDOR_ID] || 18026 !attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) { 18027 err = -EINVAL; 18028 goto out; 18029 } 18030 18031 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(skb->sk), attrbuf); 18032 if (IS_ERR(*wdev)) 18033 *wdev = NULL; 18034 18035 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); 18036 if (IS_ERR(*rdev)) { 18037 err = PTR_ERR(*rdev); 18038 goto out; 18039 } 18040 18041 vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]); 18042 subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]); 18043 18044 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { 18045 const struct wiphy_vendor_command *vcmd; 18046 18047 vcmd = &(*rdev)->wiphy.vendor_commands[i]; 18048 18049 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) 18050 continue; 18051 18052 if (!vcmd->dumpit) { 18053 err = -EOPNOTSUPP; 18054 goto out; 18055 } 18056 18057 vcmd_idx = i; 18058 break; 18059 } 18060 18061 if (vcmd_idx < 0) { 18062 err = -EOPNOTSUPP; 18063 goto out; 18064 } 18065 18066 if (attrbuf[NL80211_ATTR_VENDOR_DATA]) { 18067 data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]); 18068 data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]); 18069 18070 err = nl80211_vendor_check_policy( 18071 &(*rdev)->wiphy.vendor_commands[vcmd_idx], 18072 attrbuf[NL80211_ATTR_VENDOR_DATA], 18073 cb->extack); 18074 if (err) 18075 goto out; 18076 } 18077 18078 /* 0 is the first index - add 1 to parse only once */ 18079 cb->args[0] = (*rdev)->wiphy_idx + 1; 18080 /* add 1 to know if it was NULL */ 18081 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0; 18082 cb->args[2] = vcmd_idx; 18083 cb->args[3] = (unsigned long)data; 18084 cb->args[4] = data_len; 18085 18086 /* keep rtnl locked in successful case */ 18087 err = 0; 18088 out: 18089 kfree(attrbuf); 18090 return err; 18091 } 18092 18093 static int nl80211_vendor_cmd_dump(struct sk_buff *skb, 18094 struct netlink_callback *cb) 18095 { 18096 struct cfg80211_registered_device *rdev; 18097 struct wireless_dev *wdev; 18098 unsigned int vcmd_idx; 18099 const struct wiphy_vendor_command *vcmd; 18100 void *data; 18101 int data_len; 18102 int err; 18103 struct nlattr *vendor_data; 18104 18105 rtnl_lock(); 18106 err = nl80211_prepare_vendor_dump(skb, cb, &rdev, &wdev); 18107 if (err) 18108 goto out; 18109 18110 vcmd_idx = cb->args[2]; 18111 data = (void *)cb->args[3]; 18112 data_len = cb->args[4]; 18113 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx]; 18114 18115 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | 18116 WIPHY_VENDOR_CMD_NEED_NETDEV)) { 18117 if (!wdev) { 18118 err = -EINVAL; 18119 goto out; 18120 } 18121 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && 18122 !wdev->netdev) { 18123 err = -EINVAL; 18124 goto out; 18125 } 18126 18127 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { 18128 if (!wdev_running(wdev)) { 18129 err = -ENETDOWN; 18130 goto out; 18131 } 18132 } 18133 } 18134 18135 while (1) { 18136 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 18137 cb->nlh->nlmsg_seq, NLM_F_MULTI, 18138 NL80211_CMD_VENDOR); 18139 if (!hdr) 18140 break; 18141 18142 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 18143 (wdev && nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 18144 wdev_id(wdev), 18145 NL80211_ATTR_PAD))) { 18146 genlmsg_cancel(skb, hdr); 18147 break; 18148 } 18149 18150 vendor_data = nla_nest_start_noflag(skb, 18151 NL80211_ATTR_VENDOR_DATA); 18152 if (!vendor_data) { 18153 genlmsg_cancel(skb, hdr); 18154 break; 18155 } 18156 18157 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len, 18158 (unsigned long *)&cb->args[5]); 18159 nla_nest_end(skb, vendor_data); 18160 18161 if (err == -ENOBUFS || err == -ENOENT) { 18162 genlmsg_cancel(skb, hdr); 18163 break; 18164 } else if (err <= 0) { 18165 genlmsg_cancel(skb, hdr); 18166 goto out; 18167 } 18168 18169 genlmsg_end(skb, hdr); 18170 } 18171 18172 err = skb->len; 18173 out: 18174 rtnl_unlock(); 18175 return err; 18176 } 18177 18178 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy, 18179 enum nl80211_commands cmd, 18180 enum nl80211_attrs attr, 18181 int approxlen) 18182 { 18183 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 18184 18185 if (WARN_ON(!rdev->cur_cmd_info)) 18186 return NULL; 18187 18188 return __cfg80211_alloc_vendor_skb(rdev, NULL, approxlen, 18189 rdev->cur_cmd_info->snd_portid, 18190 rdev->cur_cmd_info->snd_seq, 18191 cmd, attr, NULL, GFP_KERNEL); 18192 } 18193 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb); 18194 18195 int cfg80211_vendor_cmd_reply(struct sk_buff *skb) 18196 { 18197 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 18198 void *hdr = ((void **)skb->cb)[1]; 18199 struct nlattr *data = ((void **)skb->cb)[2]; 18200 18201 /* clear CB data for netlink core to own from now on */ 18202 memset(skb->cb, 0, sizeof(skb->cb)); 18203 18204 if (WARN_ON(!rdev->cur_cmd_info)) { 18205 kfree_skb(skb); 18206 return -EINVAL; 18207 } 18208 18209 nla_nest_end(skb, data); 18210 genlmsg_end(skb, hdr); 18211 return genlmsg_reply(skb, rdev->cur_cmd_info); 18212 } 18213 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply); 18214 18215 unsigned int cfg80211_vendor_cmd_get_sender(struct wiphy *wiphy) 18216 { 18217 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 18218 18219 if (WARN_ON(!rdev->cur_cmd_info)) 18220 return 0; 18221 18222 return rdev->cur_cmd_info->snd_portid; 18223 } 18224 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_get_sender); 18225 18226 static int nl80211_set_qos_map(struct sk_buff *skb, 18227 struct genl_info *info) 18228 { 18229 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18230 struct cfg80211_qos_map *qos_map = NULL; 18231 struct net_device *dev = info->user_ptr[1]; 18232 u8 *pos, len, num_des, des_len, des; 18233 int ret; 18234 18235 if (!rdev->ops->set_qos_map) 18236 return -EOPNOTSUPP; 18237 18238 if (info->attrs[NL80211_ATTR_QOS_MAP]) { 18239 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]); 18240 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]); 18241 18242 if (len % 2) 18243 return -EINVAL; 18244 18245 qos_map = kzalloc_obj(struct cfg80211_qos_map); 18246 if (!qos_map) 18247 return -ENOMEM; 18248 18249 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1; 18250 if (num_des) { 18251 des_len = num_des * 18252 sizeof(struct cfg80211_dscp_exception); 18253 memcpy(qos_map->dscp_exception, pos, des_len); 18254 qos_map->num_des = num_des; 18255 for (des = 0; des < num_des; des++) { 18256 if (qos_map->dscp_exception[des].up > 7) { 18257 kfree(qos_map); 18258 return -EINVAL; 18259 } 18260 } 18261 pos += des_len; 18262 } 18263 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN); 18264 } 18265 18266 ret = nl80211_key_allowed(dev->ieee80211_ptr); 18267 if (!ret) 18268 ret = rdev_set_qos_map(rdev, dev, qos_map); 18269 18270 kfree(qos_map); 18271 return ret; 18272 } 18273 18274 static int nl80211_add_tx_ts(struct sk_buff *skb, struct genl_info *info) 18275 { 18276 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18277 struct net_device *dev = info->user_ptr[1]; 18278 struct wireless_dev *wdev = dev->ieee80211_ptr; 18279 const u8 *peer; 18280 u8 tsid, up; 18281 u16 admitted_time = 0; 18282 18283 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)) 18284 return -EOPNOTSUPP; 18285 18286 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] || 18287 !info->attrs[NL80211_ATTR_USER_PRIO]) 18288 return -EINVAL; 18289 18290 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); 18291 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]); 18292 18293 /* WMM uses TIDs 0-7 even for TSPEC */ 18294 if (tsid >= IEEE80211_FIRST_TSPEC_TSID) { 18295 /* TODO: handle 802.11 TSPEC/admission control 18296 * need more attributes for that (e.g. BA session requirement); 18297 * change the WMM admission test above to allow both then 18298 */ 18299 return -EINVAL; 18300 } 18301 18302 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 18303 18304 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) { 18305 admitted_time = 18306 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]); 18307 if (!admitted_time) 18308 return -EINVAL; 18309 } 18310 18311 switch (wdev->iftype) { 18312 case NL80211_IFTYPE_STATION: 18313 case NL80211_IFTYPE_P2P_CLIENT: 18314 if (wdev->connected) 18315 break; 18316 return -ENOTCONN; 18317 default: 18318 return -EOPNOTSUPP; 18319 } 18320 18321 return rdev_add_tx_ts(rdev, dev, tsid, peer, up, admitted_time); 18322 } 18323 18324 static int nl80211_del_tx_ts(struct sk_buff *skb, struct genl_info *info) 18325 { 18326 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18327 struct net_device *dev = info->user_ptr[1]; 18328 const u8 *peer; 18329 u8 tsid; 18330 18331 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC]) 18332 return -EINVAL; 18333 18334 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); 18335 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 18336 18337 return rdev_del_tx_ts(rdev, dev, tsid, peer); 18338 } 18339 18340 static int nl80211_tdls_channel_switch(struct sk_buff *skb, 18341 struct genl_info *info) 18342 { 18343 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18344 struct net_device *dev = info->user_ptr[1]; 18345 struct wireless_dev *wdev = dev->ieee80211_ptr; 18346 struct cfg80211_chan_def chandef = {}; 18347 const u8 *addr; 18348 u8 oper_class; 18349 int err; 18350 18351 if (!rdev->ops->tdls_channel_switch || 18352 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) 18353 return -EOPNOTSUPP; 18354 18355 switch (dev->ieee80211_ptr->iftype) { 18356 case NL80211_IFTYPE_STATION: 18357 case NL80211_IFTYPE_P2P_CLIENT: 18358 break; 18359 default: 18360 return -EOPNOTSUPP; 18361 } 18362 18363 if (!info->attrs[NL80211_ATTR_MAC] || 18364 !info->attrs[NL80211_ATTR_OPER_CLASS]) 18365 return -EINVAL; 18366 18367 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef, 18368 false); 18369 if (err) 18370 return err; 18371 18372 /* 18373 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012 18374 * section 10.22.6.2.1. Disallow 5/10Mhz channels as well for now, the 18375 * specification is not defined for them. 18376 */ 18377 if (chandef.chan->band == NL80211_BAND_2GHZ && 18378 chandef.width != NL80211_CHAN_WIDTH_20_NOHT && 18379 chandef.width != NL80211_CHAN_WIDTH_20) 18380 return -EINVAL; 18381 18382 /* we will be active on the TDLS link */ 18383 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, 18384 wdev->iftype)) 18385 return -EINVAL; 18386 18387 /* don't allow switching to DFS channels */ 18388 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype)) 18389 return -EINVAL; 18390 18391 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 18392 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]); 18393 18394 return rdev_tdls_channel_switch(rdev, dev, addr, oper_class, &chandef); 18395 } 18396 18397 static int nl80211_tdls_cancel_channel_switch(struct sk_buff *skb, 18398 struct genl_info *info) 18399 { 18400 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18401 struct net_device *dev = info->user_ptr[1]; 18402 const u8 *addr; 18403 18404 if (!rdev->ops->tdls_channel_switch || 18405 !rdev->ops->tdls_cancel_channel_switch || 18406 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) 18407 return -EOPNOTSUPP; 18408 18409 switch (dev->ieee80211_ptr->iftype) { 18410 case NL80211_IFTYPE_STATION: 18411 case NL80211_IFTYPE_P2P_CLIENT: 18412 break; 18413 default: 18414 return -EOPNOTSUPP; 18415 } 18416 18417 if (!info->attrs[NL80211_ATTR_MAC]) 18418 return -EINVAL; 18419 18420 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 18421 18422 rdev_tdls_cancel_channel_switch(rdev, dev, addr); 18423 18424 return 0; 18425 } 18426 18427 static int nl80211_set_multicast_to_unicast(struct sk_buff *skb, 18428 struct genl_info *info) 18429 { 18430 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18431 struct net_device *dev = info->user_ptr[1]; 18432 struct wireless_dev *wdev = dev->ieee80211_ptr; 18433 const struct nlattr *nla; 18434 bool enabled; 18435 18436 if (!rdev->ops->set_multicast_to_unicast) 18437 return -EOPNOTSUPP; 18438 18439 if (wdev->iftype != NL80211_IFTYPE_AP && 18440 wdev->iftype != NL80211_IFTYPE_P2P_GO) 18441 return -EOPNOTSUPP; 18442 18443 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED]; 18444 enabled = nla_get_flag(nla); 18445 18446 return rdev_set_multicast_to_unicast(rdev, dev, enabled); 18447 } 18448 18449 static int nl80211_set_pmk(struct sk_buff *skb, struct genl_info *info) 18450 { 18451 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18452 struct net_device *dev = info->user_ptr[1]; 18453 struct wireless_dev *wdev = dev->ieee80211_ptr; 18454 struct cfg80211_pmk_conf pmk_conf = {}; 18455 18456 if (wdev->iftype != NL80211_IFTYPE_STATION && 18457 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 18458 return -EOPNOTSUPP; 18459 18460 if (!wiphy_ext_feature_isset(&rdev->wiphy, 18461 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 18462 return -EOPNOTSUPP; 18463 18464 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK]) 18465 return -EINVAL; 18466 18467 if (!wdev->connected) 18468 return -ENOTCONN; 18469 18470 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]); 18471 if (memcmp(pmk_conf.aa, wdev->u.client.connected_addr, ETH_ALEN)) 18472 return -EINVAL; 18473 18474 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); 18475 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); 18476 if (pmk_conf.pmk_len != WLAN_PMK_LEN && 18477 pmk_conf.pmk_len != WLAN_PMK_LEN_SUITE_B_192) 18478 return -EINVAL; 18479 18480 if (info->attrs[NL80211_ATTR_PMKR0_NAME]) 18481 pmk_conf.pmk_r0_name = 18482 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]); 18483 18484 return rdev_set_pmk(rdev, dev, &pmk_conf); 18485 } 18486 18487 static int nl80211_del_pmk(struct sk_buff *skb, struct genl_info *info) 18488 { 18489 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18490 struct net_device *dev = info->user_ptr[1]; 18491 struct wireless_dev *wdev = dev->ieee80211_ptr; 18492 const u8 *aa; 18493 18494 if (wdev->iftype != NL80211_IFTYPE_STATION && 18495 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 18496 return -EOPNOTSUPP; 18497 18498 if (!wiphy_ext_feature_isset(&rdev->wiphy, 18499 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 18500 return -EOPNOTSUPP; 18501 18502 if (!info->attrs[NL80211_ATTR_MAC]) 18503 return -EINVAL; 18504 18505 aa = nla_data(info->attrs[NL80211_ATTR_MAC]); 18506 return rdev_del_pmk(rdev, dev, aa); 18507 } 18508 18509 static int nl80211_external_auth(struct sk_buff *skb, struct genl_info *info) 18510 { 18511 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18512 struct net_device *dev = info->user_ptr[1]; 18513 struct cfg80211_external_auth_params params; 18514 18515 if (!rdev->ops->external_auth) 18516 return -EOPNOTSUPP; 18517 18518 if (!info->attrs[NL80211_ATTR_SSID] && 18519 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 18520 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 18521 return -EINVAL; 18522 18523 if (!info->attrs[NL80211_ATTR_BSSID]) 18524 return -EINVAL; 18525 18526 if (!info->attrs[NL80211_ATTR_STATUS_CODE]) 18527 return -EINVAL; 18528 18529 memset(¶ms, 0, sizeof(params)); 18530 18531 if (info->attrs[NL80211_ATTR_SSID]) { 18532 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 18533 if (params.ssid.ssid_len == 0) 18534 return -EINVAL; 18535 memcpy(params.ssid.ssid, 18536 nla_data(info->attrs[NL80211_ATTR_SSID]), 18537 params.ssid.ssid_len); 18538 } 18539 18540 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), 18541 ETH_ALEN); 18542 18543 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 18544 18545 if (info->attrs[NL80211_ATTR_PMKID]) 18546 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 18547 18548 return rdev_external_auth(rdev, dev, ¶ms); 18549 } 18550 18551 static int nl80211_tx_control_port(struct sk_buff *skb, struct genl_info *info) 18552 { 18553 bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK]; 18554 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18555 struct net_device *dev = info->user_ptr[1]; 18556 struct wireless_dev *wdev = dev->ieee80211_ptr; 18557 const u8 *buf; 18558 size_t len; 18559 u8 *dest; 18560 u16 proto; 18561 bool noencrypt; 18562 u64 cookie = 0; 18563 int link_id; 18564 int err; 18565 18566 if (!wiphy_ext_feature_isset(&rdev->wiphy, 18567 NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211)) 18568 return -EOPNOTSUPP; 18569 18570 if (!rdev->ops->tx_control_port) 18571 return -EOPNOTSUPP; 18572 18573 if (!info->attrs[NL80211_ATTR_FRAME] || 18574 !info->attrs[NL80211_ATTR_MAC] || 18575 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { 18576 GENL_SET_ERR_MSG(info, "Frame, MAC or ethertype missing"); 18577 return -EINVAL; 18578 } 18579 18580 switch (wdev->iftype) { 18581 case NL80211_IFTYPE_AP: 18582 case NL80211_IFTYPE_P2P_GO: 18583 case NL80211_IFTYPE_MESH_POINT: 18584 break; 18585 case NL80211_IFTYPE_ADHOC: 18586 if (wdev->u.ibss.current_bss) 18587 break; 18588 return -ENOTCONN; 18589 case NL80211_IFTYPE_STATION: 18590 case NL80211_IFTYPE_P2P_CLIENT: 18591 if (wdev->connected) 18592 break; 18593 return -ENOTCONN; 18594 default: 18595 return -EOPNOTSUPP; 18596 } 18597 18598 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 18599 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 18600 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); 18601 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); 18602 noencrypt = 18603 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]); 18604 18605 link_id = nl80211_link_id_or_invalid(info->attrs); 18606 18607 cookie = dont_wait_for_ack ? 0 : cfg80211_assign_cookie(rdev); 18608 err = rdev_tx_control_port(rdev, dev, buf, len, 18609 dest, cpu_to_be16(proto), noencrypt, link_id, 18610 cookie); 18611 if (!err && cookie) 18612 nl_set_extack_cookie_u64(info->extack, cookie); 18613 return err; 18614 } 18615 18616 static int nl80211_get_ftm_responder_stats(struct sk_buff *skb, 18617 struct genl_info *info) 18618 { 18619 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18620 struct net_device *dev = info->user_ptr[1]; 18621 struct wireless_dev *wdev = dev->ieee80211_ptr; 18622 struct cfg80211_ftm_responder_stats ftm_stats = {}; 18623 unsigned int link_id = nl80211_link_id(info->attrs); 18624 struct sk_buff *msg; 18625 void *hdr; 18626 struct nlattr *ftm_stats_attr; 18627 int err; 18628 18629 if (wdev->iftype != NL80211_IFTYPE_AP || 18630 !wdev->links[link_id].ap.beacon_interval) 18631 return -EOPNOTSUPP; 18632 18633 err = rdev_get_ftm_responder_stats(rdev, dev, &ftm_stats); 18634 if (err) 18635 return err; 18636 18637 if (!ftm_stats.filled) 18638 return -ENODATA; 18639 18640 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 18641 if (!msg) 18642 return -ENOMEM; 18643 18644 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 18645 NL80211_CMD_GET_FTM_RESPONDER_STATS); 18646 if (!hdr) 18647 goto nla_put_failure; 18648 18649 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 18650 goto nla_put_failure; 18651 18652 ftm_stats_attr = nla_nest_start_noflag(msg, 18653 NL80211_ATTR_FTM_RESPONDER_STATS); 18654 if (!ftm_stats_attr) 18655 goto nla_put_failure; 18656 18657 #define SET_FTM(field, name, type) \ 18658 do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \ 18659 nla_put_ ## type(msg, NL80211_FTM_STATS_ ## name, \ 18660 ftm_stats.field)) \ 18661 goto nla_put_failure; } while (0) 18662 #define SET_FTM_U64(field, name) \ 18663 do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \ 18664 nla_put_u64_64bit(msg, NL80211_FTM_STATS_ ## name, \ 18665 ftm_stats.field, NL80211_FTM_STATS_PAD)) \ 18666 goto nla_put_failure; } while (0) 18667 18668 SET_FTM(success_num, SUCCESS_NUM, u32); 18669 SET_FTM(partial_num, PARTIAL_NUM, u32); 18670 SET_FTM(failed_num, FAILED_NUM, u32); 18671 SET_FTM(asap_num, ASAP_NUM, u32); 18672 SET_FTM(non_asap_num, NON_ASAP_NUM, u32); 18673 SET_FTM_U64(total_duration_ms, TOTAL_DURATION_MSEC); 18674 SET_FTM(unknown_triggers_num, UNKNOWN_TRIGGERS_NUM, u32); 18675 SET_FTM(reschedule_requests_num, RESCHEDULE_REQUESTS_NUM, u32); 18676 SET_FTM(out_of_window_triggers_num, OUT_OF_WINDOW_TRIGGERS_NUM, u32); 18677 #undef SET_FTM 18678 18679 nla_nest_end(msg, ftm_stats_attr); 18680 18681 genlmsg_end(msg, hdr); 18682 return genlmsg_reply(msg, info); 18683 18684 nla_put_failure: 18685 nlmsg_free(msg); 18686 return -ENOBUFS; 18687 } 18688 18689 static int nl80211_update_owe_info(struct sk_buff *skb, struct genl_info *info) 18690 { 18691 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18692 struct cfg80211_update_owe_info owe_info; 18693 struct net_device *dev = info->user_ptr[1]; 18694 18695 if (!rdev->ops->update_owe_info) 18696 return -EOPNOTSUPP; 18697 18698 if (!info->attrs[NL80211_ATTR_STATUS_CODE] || 18699 !info->attrs[NL80211_ATTR_MAC]) 18700 return -EINVAL; 18701 18702 memset(&owe_info, 0, sizeof(owe_info)); 18703 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 18704 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); 18705 18706 if (info->attrs[NL80211_ATTR_IE]) { 18707 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 18708 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 18709 } 18710 18711 return rdev_update_owe_info(rdev, dev, &owe_info); 18712 } 18713 18714 static int nl80211_probe_mesh_link(struct sk_buff *skb, struct genl_info *info) 18715 { 18716 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18717 struct net_device *dev = info->user_ptr[1]; 18718 struct wireless_dev *wdev = dev->ieee80211_ptr; 18719 struct station_info sinfo = {}; 18720 const u8 *buf; 18721 size_t len; 18722 u8 *dest; 18723 int err; 18724 18725 if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station) 18726 return -EOPNOTSUPP; 18727 18728 if (!info->attrs[NL80211_ATTR_MAC] || 18729 !info->attrs[NL80211_ATTR_FRAME]) { 18730 GENL_SET_ERR_MSG(info, "Frame or MAC missing"); 18731 return -EINVAL; 18732 } 18733 18734 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 18735 return -EOPNOTSUPP; 18736 18737 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); 18738 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 18739 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 18740 18741 if (len < sizeof(struct ethhdr)) 18742 return -EINVAL; 18743 18744 if (!ether_addr_equal(buf, dest) || is_multicast_ether_addr(buf) || 18745 !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr)) 18746 return -EINVAL; 18747 18748 err = rdev_get_station(rdev, wdev, dest, &sinfo); 18749 if (err) 18750 return err; 18751 18752 cfg80211_sinfo_release_content(&sinfo); 18753 18754 return rdev_probe_mesh_link(rdev, dev, dest, buf, len); 18755 } 18756 18757 static int parse_tid_conf(struct cfg80211_registered_device *rdev, 18758 struct nlattr *attrs[], struct net_device *dev, 18759 struct cfg80211_tid_cfg *tid_conf, 18760 struct genl_info *info, const u8 *peer, 18761 unsigned int link_id) 18762 { 18763 struct netlink_ext_ack *extack = info->extack; 18764 u64 mask; 18765 int err; 18766 18767 if (!attrs[NL80211_TID_CONFIG_ATTR_TIDS]) 18768 return -EINVAL; 18769 18770 tid_conf->config_override = 18771 nla_get_flag(attrs[NL80211_TID_CONFIG_ATTR_OVERRIDE]); 18772 tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]); 18773 18774 if (tid_conf->config_override) { 18775 if (rdev->ops->reset_tid_config) { 18776 err = rdev_reset_tid_config(rdev, dev, peer, 18777 tid_conf->tids); 18778 if (err) 18779 return err; 18780 } else { 18781 return -EINVAL; 18782 } 18783 } 18784 18785 if (attrs[NL80211_TID_CONFIG_ATTR_NOACK]) { 18786 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK); 18787 tid_conf->noack = 18788 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_NOACK]); 18789 } 18790 18791 if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]) { 18792 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT); 18793 tid_conf->retry_short = 18794 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]); 18795 18796 if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count) 18797 return -EINVAL; 18798 } 18799 18800 if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]) { 18801 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG); 18802 tid_conf->retry_long = 18803 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]); 18804 18805 if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count) 18806 return -EINVAL; 18807 } 18808 18809 if (attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]) { 18810 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL); 18811 tid_conf->ampdu = 18812 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]); 18813 } 18814 18815 if (attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]) { 18816 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL); 18817 tid_conf->rtscts = 18818 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]); 18819 } 18820 18821 if (attrs[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL]) { 18822 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL); 18823 tid_conf->amsdu = 18824 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL]); 18825 } 18826 18827 if (attrs[NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE]) { 18828 u32 idx = NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE, attr; 18829 18830 tid_conf->txrate_type = nla_get_u8(attrs[idx]); 18831 18832 if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) { 18833 attr = NL80211_TID_CONFIG_ATTR_TX_RATE; 18834 err = nl80211_parse_tx_bitrate_mask(info, attrs, attr, 18835 &tid_conf->txrate_mask, dev, 18836 true, link_id); 18837 if (err) 18838 return err; 18839 18840 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE); 18841 } 18842 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE); 18843 } 18844 18845 if (peer) 18846 mask = rdev->wiphy.tid_config_support.peer; 18847 else 18848 mask = rdev->wiphy.tid_config_support.vif; 18849 18850 if (tid_conf->mask & ~mask) { 18851 NL_SET_ERR_MSG(extack, "unsupported TID configuration"); 18852 return -EOPNOTSUPP; 18853 } 18854 18855 return 0; 18856 } 18857 18858 static int nl80211_set_tid_config(struct sk_buff *skb, 18859 struct genl_info *info) 18860 { 18861 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18862 struct nlattr *attrs[NL80211_TID_CONFIG_ATTR_MAX + 1]; 18863 unsigned int link_id = nl80211_link_id(info->attrs); 18864 struct net_device *dev = info->user_ptr[1]; 18865 struct cfg80211_tid_config *tid_config; 18866 struct nlattr *tid; 18867 int conf_idx = 0, rem_conf; 18868 int ret = -EINVAL; 18869 u32 num_conf = 0; 18870 18871 if (!info->attrs[NL80211_ATTR_TID_CONFIG]) 18872 return -EINVAL; 18873 18874 if (!rdev->ops->set_tid_config) 18875 return -EOPNOTSUPP; 18876 18877 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], 18878 rem_conf) 18879 num_conf++; 18880 18881 tid_config = kzalloc_flex(*tid_config, tid_conf, num_conf); 18882 if (!tid_config) 18883 return -ENOMEM; 18884 18885 tid_config->n_tid_conf = num_conf; 18886 18887 if (info->attrs[NL80211_ATTR_MAC]) 18888 tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 18889 18890 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], 18891 rem_conf) { 18892 ret = nla_parse_nested(attrs, NL80211_TID_CONFIG_ATTR_MAX, 18893 tid, NULL, NULL); 18894 18895 if (ret) 18896 goto bad_tid_conf; 18897 18898 ret = parse_tid_conf(rdev, attrs, dev, 18899 &tid_config->tid_conf[conf_idx], 18900 info, tid_config->peer, link_id); 18901 if (ret) 18902 goto bad_tid_conf; 18903 18904 conf_idx++; 18905 } 18906 18907 ret = rdev_set_tid_config(rdev, dev, tid_config); 18908 18909 bad_tid_conf: 18910 kfree(tid_config); 18911 return ret; 18912 } 18913 18914 static int nl80211_color_change(struct sk_buff *skb, struct genl_info *info) 18915 { 18916 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18917 struct cfg80211_color_change_settings params = {}; 18918 struct net_device *dev = info->user_ptr[1]; 18919 struct wireless_dev *wdev = dev->ieee80211_ptr; 18920 struct nlattr **tb; 18921 u16 offset; 18922 int err; 18923 18924 if (!rdev->ops->color_change) 18925 return -EOPNOTSUPP; 18926 18927 if (!wiphy_ext_feature_isset(&rdev->wiphy, 18928 NL80211_EXT_FEATURE_BSS_COLOR)) 18929 return -EOPNOTSUPP; 18930 18931 if (wdev->iftype != NL80211_IFTYPE_AP) 18932 return -EOPNOTSUPP; 18933 18934 if (!info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT] || 18935 !info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR] || 18936 !info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS]) 18937 return -EINVAL; 18938 18939 params.count = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT]); 18940 params.color = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR]); 18941 18942 params.link_id = nl80211_link_id(info->attrs); 18943 if (!wdev->links[params.link_id].ap.beacon_interval) 18944 return -EINVAL; 18945 18946 tb = kzalloc_objs(*tb, NL80211_ATTR_MAX + 1); 18947 if (!tb) 18948 return -ENOMEM; 18949 18950 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_next, 18951 wdev->links[params.link_id].ap.chandef.chan, 18952 info->extack); 18953 if (err) 18954 goto out; 18955 18956 err = nla_parse_nested(tb, NL80211_ATTR_MAX, 18957 info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS], 18958 nl80211_policy, info->extack); 18959 if (err) 18960 goto out; 18961 18962 err = nl80211_parse_beacon(rdev, tb, ¶ms.beacon_color_change, 18963 wdev->links[params.link_id].ap.chandef.chan, 18964 info->extack); 18965 if (err) 18966 goto out; 18967 18968 if (!tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]) { 18969 err = -EINVAL; 18970 goto out; 18971 } 18972 18973 if (nla_len(tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]) != sizeof(u16)) { 18974 err = -EINVAL; 18975 goto out; 18976 } 18977 18978 offset = nla_get_u16(tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]); 18979 if (offset >= params.beacon_color_change.tail_len) { 18980 err = -EINVAL; 18981 goto out; 18982 } 18983 18984 if (params.beacon_color_change.tail[offset] != params.count) { 18985 err = -EINVAL; 18986 goto out; 18987 } 18988 18989 params.counter_offset_beacon = offset; 18990 18991 if (tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]) { 18992 if (nla_len(tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]) != 18993 sizeof(u16)) { 18994 err = -EINVAL; 18995 goto out; 18996 } 18997 18998 offset = nla_get_u16(tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]); 18999 if (offset >= params.beacon_color_change.probe_resp_len) { 19000 err = -EINVAL; 19001 goto out; 19002 } 19003 19004 if (params.beacon_color_change.probe_resp[offset] != 19005 params.count) { 19006 err = -EINVAL; 19007 goto out; 19008 } 19009 19010 params.counter_offset_presp = offset; 19011 } 19012 19013 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { 19014 err = nl80211_parse_unsol_bcast_probe_resp( 19015 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], 19016 ¶ms.unsol_bcast_probe_resp); 19017 if (err) 19018 goto out; 19019 } 19020 19021 err = rdev_color_change(rdev, dev, ¶ms); 19022 19023 out: 19024 kfree(params.beacon_next.mbssid_ies); 19025 kfree(params.beacon_color_change.mbssid_ies); 19026 kfree(params.beacon_next.rnr_ies); 19027 kfree(params.beacon_color_change.rnr_ies); 19028 kfree(tb); 19029 return err; 19030 } 19031 19032 static int nl80211_set_fils_aad(struct sk_buff *skb, 19033 struct genl_info *info) 19034 { 19035 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19036 struct net_device *dev = info->user_ptr[1]; 19037 struct cfg80211_fils_aad fils_aad = {}; 19038 u8 *nonces; 19039 19040 if (!info->attrs[NL80211_ATTR_MAC] || 19041 !info->attrs[NL80211_ATTR_FILS_KEK] || 19042 !info->attrs[NL80211_ATTR_FILS_NONCES]) 19043 return -EINVAL; 19044 19045 fils_aad.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); 19046 fils_aad.kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); 19047 fils_aad.kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); 19048 nonces = nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); 19049 fils_aad.snonce = nonces; 19050 fils_aad.anonce = nonces + FILS_NONCE_LEN; 19051 19052 return rdev_set_fils_aad(rdev, dev, &fils_aad); 19053 } 19054 19055 static int nl80211_add_link(struct sk_buff *skb, struct genl_info *info) 19056 { 19057 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19058 unsigned int link_id = nl80211_link_id(info->attrs); 19059 struct net_device *dev = info->user_ptr[1]; 19060 struct wireless_dev *wdev = dev->ieee80211_ptr; 19061 int ret; 19062 19063 if (!(wdev->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO)) 19064 return -EINVAL; 19065 19066 switch (wdev->iftype) { 19067 case NL80211_IFTYPE_AP: 19068 break; 19069 default: 19070 return -EINVAL; 19071 } 19072 19073 if (!info->attrs[NL80211_ATTR_MAC] || 19074 !is_valid_ether_addr(nla_data(info->attrs[NL80211_ATTR_MAC]))) 19075 return -EINVAL; 19076 19077 wdev->valid_links |= BIT(link_id); 19078 ether_addr_copy(wdev->links[link_id].addr, 19079 nla_data(info->attrs[NL80211_ATTR_MAC])); 19080 19081 ret = rdev_add_intf_link(rdev, wdev, link_id); 19082 if (ret) { 19083 wdev->valid_links &= ~BIT(link_id); 19084 eth_zero_addr(wdev->links[link_id].addr); 19085 } 19086 19087 return ret; 19088 } 19089 19090 static int nl80211_remove_link(struct sk_buff *skb, struct genl_info *info) 19091 { 19092 unsigned int link_id = nl80211_link_id(info->attrs); 19093 struct net_device *dev = info->user_ptr[1]; 19094 struct wireless_dev *wdev = dev->ieee80211_ptr; 19095 19096 /* cannot remove if there's no link */ 19097 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) 19098 return -EINVAL; 19099 19100 switch (wdev->iftype) { 19101 case NL80211_IFTYPE_AP: 19102 break; 19103 default: 19104 return -EINVAL; 19105 } 19106 19107 cfg80211_remove_link(wdev, link_id); 19108 19109 return 0; 19110 } 19111 19112 static int 19113 nl80211_add_mod_link_station(struct sk_buff *skb, struct genl_info *info, 19114 bool add) 19115 { 19116 struct link_station_parameters params = {}; 19117 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19118 struct net_device *dev = info->user_ptr[1]; 19119 int err; 19120 19121 if ((add && !rdev->ops->add_link_station) || 19122 (!add && !rdev->ops->mod_link_station)) 19123 return -EOPNOTSUPP; 19124 19125 if (add && !info->attrs[NL80211_ATTR_MAC]) 19126 return -EINVAL; 19127 19128 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) 19129 return -EINVAL; 19130 19131 if (add && !info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 19132 return -EINVAL; 19133 19134 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 19135 19136 if (info->attrs[NL80211_ATTR_MAC]) { 19137 params.link_mac = nla_data(info->attrs[NL80211_ATTR_MAC]); 19138 if (!is_valid_ether_addr(params.link_mac)) 19139 return -EINVAL; 19140 } 19141 19142 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) 19143 return -EINVAL; 19144 19145 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); 19146 19147 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 19148 params.supported_rates = 19149 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 19150 params.supported_rates_len = 19151 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 19152 } 19153 19154 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 19155 params.ht_capa = 19156 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 19157 19158 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 19159 params.vht_capa = 19160 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 19161 19162 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 19163 params.he_capa = 19164 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 19165 params.he_capa_len = 19166 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 19167 19168 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { 19169 params.eht_capa = 19170 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 19171 params.eht_capa_len = 19172 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 19173 19174 if (!ieee80211_eht_capa_size_ok((const u8 *)params.he_capa, 19175 (const u8 *)params.eht_capa, 19176 params.eht_capa_len, 19177 false)) 19178 return -EINVAL; 19179 } 19180 } 19181 19182 if (info->attrs[NL80211_ATTR_UHR_CAPABILITY]) { 19183 if (!params.eht_capa) 19184 return -EINVAL; 19185 19186 params.uhr_capa = 19187 nla_data(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 19188 params.uhr_capa_len = 19189 nla_len(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 19190 } 19191 19192 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) 19193 params.he_6ghz_capa = 19194 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); 19195 19196 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 19197 params.opmode_notif_used = true; 19198 params.opmode_notif = 19199 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 19200 } 19201 19202 err = nl80211_parse_sta_txpower_setting(info, ¶ms.txpwr, 19203 ¶ms.txpwr_set); 19204 if (err) 19205 return err; 19206 19207 if (add) 19208 return rdev_add_link_station(rdev, dev, ¶ms); 19209 19210 return rdev_mod_link_station(rdev, dev, ¶ms); 19211 } 19212 19213 static int 19214 nl80211_add_link_station(struct sk_buff *skb, struct genl_info *info) 19215 { 19216 return nl80211_add_mod_link_station(skb, info, true); 19217 } 19218 19219 static int 19220 nl80211_modify_link_station(struct sk_buff *skb, struct genl_info *info) 19221 { 19222 return nl80211_add_mod_link_station(skb, info, false); 19223 } 19224 19225 static int 19226 nl80211_remove_link_station(struct sk_buff *skb, struct genl_info *info) 19227 { 19228 struct link_station_del_parameters params = {}; 19229 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19230 struct net_device *dev = info->user_ptr[1]; 19231 19232 if (!rdev->ops->del_link_station) 19233 return -EOPNOTSUPP; 19234 19235 if (!info->attrs[NL80211_ATTR_MLD_ADDR] || 19236 !info->attrs[NL80211_ATTR_MLO_LINK_ID]) 19237 return -EINVAL; 19238 19239 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 19240 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); 19241 19242 return rdev_del_link_station(rdev, dev, ¶ms); 19243 } 19244 19245 static int nl80211_set_hw_timestamp(struct sk_buff *skb, 19246 struct genl_info *info) 19247 { 19248 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19249 struct net_device *dev = info->user_ptr[1]; 19250 struct cfg80211_set_hw_timestamp hwts = {}; 19251 19252 if (!rdev->wiphy.hw_timestamp_max_peers) 19253 return -EOPNOTSUPP; 19254 19255 if (!info->attrs[NL80211_ATTR_MAC] && 19256 rdev->wiphy.hw_timestamp_max_peers != CFG80211_HW_TIMESTAMP_ALL_PEERS) 19257 return -EOPNOTSUPP; 19258 19259 if (info->attrs[NL80211_ATTR_MAC]) 19260 hwts.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); 19261 19262 hwts.enable = 19263 nla_get_flag(info->attrs[NL80211_ATTR_HW_TIMESTAMP_ENABLED]); 19264 19265 return rdev_set_hw_timestamp(rdev, dev, &hwts); 19266 } 19267 19268 static int 19269 nl80211_set_ttlm(struct sk_buff *skb, struct genl_info *info) 19270 { 19271 struct cfg80211_ttlm_params params = {}; 19272 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19273 struct net_device *dev = info->user_ptr[1]; 19274 struct wireless_dev *wdev = dev->ieee80211_ptr; 19275 19276 if (wdev->iftype != NL80211_IFTYPE_STATION && 19277 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 19278 return -EOPNOTSUPP; 19279 19280 if (!wdev->connected) 19281 return -ENOLINK; 19282 19283 if (!info->attrs[NL80211_ATTR_MLO_TTLM_DLINK] || 19284 !info->attrs[NL80211_ATTR_MLO_TTLM_ULINK]) 19285 return -EINVAL; 19286 19287 nla_memcpy(params.dlink, 19288 info->attrs[NL80211_ATTR_MLO_TTLM_DLINK], 19289 sizeof(params.dlink)); 19290 nla_memcpy(params.ulink, 19291 info->attrs[NL80211_ATTR_MLO_TTLM_ULINK], 19292 sizeof(params.ulink)); 19293 19294 return rdev_set_ttlm(rdev, dev, ¶ms); 19295 } 19296 19297 static int nl80211_assoc_ml_reconf(struct sk_buff *skb, struct genl_info *info) 19298 { 19299 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19300 struct net_device *dev = info->user_ptr[1]; 19301 struct wireless_dev *wdev = dev->ieee80211_ptr; 19302 struct cfg80211_ml_reconf_req req = {}; 19303 unsigned int link_id; 19304 u16 add_links; 19305 int err; 19306 19307 if (!wdev->valid_links) 19308 return -EINVAL; 19309 19310 if (dev->ieee80211_ptr->conn_owner_nlportid && 19311 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 19312 return -EPERM; 19313 19314 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 19315 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 19316 return -EOPNOTSUPP; 19317 19318 add_links = 0; 19319 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { 19320 err = nl80211_process_links(rdev, req.add_links, 19321 /* mark as MLO, but not assoc */ 19322 IEEE80211_MLD_MAX_NUM_LINKS, 19323 NULL, 0, info); 19324 if (err) 19325 return err; 19326 19327 for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS; 19328 link_id++) { 19329 if (!req.add_links[link_id].bss) 19330 continue; 19331 add_links |= BIT(link_id); 19332 } 19333 } 19334 19335 if (info->attrs[NL80211_ATTR_MLO_RECONF_REM_LINKS]) 19336 req.rem_links = 19337 nla_get_u16(info->attrs[NL80211_ATTR_MLO_RECONF_REM_LINKS]); 19338 19339 /* Validate that existing links are not added, removed links are valid 19340 * and don't allow adding and removing the same links 19341 */ 19342 if ((add_links & req.rem_links) || !(add_links | req.rem_links) || 19343 (wdev->valid_links & add_links) || 19344 ((wdev->valid_links & req.rem_links) != req.rem_links)) { 19345 err = -EINVAL; 19346 goto out; 19347 } 19348 19349 if (info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]) 19350 req.ext_mld_capa_ops = 19351 nla_get_u16(info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]); 19352 19353 err = cfg80211_assoc_ml_reconf(rdev, dev, &req); 19354 19355 out: 19356 for (link_id = 0; link_id < ARRAY_SIZE(req.add_links); link_id++) 19357 cfg80211_put_bss(&rdev->wiphy, req.add_links[link_id].bss); 19358 19359 return err; 19360 } 19361 19362 static int 19363 nl80211_epcs_cfg(struct sk_buff *skb, struct genl_info *info) 19364 { 19365 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19366 struct net_device *dev = info->user_ptr[1]; 19367 struct wireless_dev *wdev = dev->ieee80211_ptr; 19368 bool val; 19369 19370 if (wdev->iftype != NL80211_IFTYPE_STATION && 19371 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 19372 return -EOPNOTSUPP; 19373 19374 if (!wdev->connected) 19375 return -ENOLINK; 19376 19377 val = nla_get_flag(info->attrs[NL80211_ATTR_EPCS]); 19378 19379 return rdev_set_epcs(rdev, dev, val); 19380 } 19381 19382 #define NL80211_FLAG_NEED_WIPHY 0x01 19383 #define NL80211_FLAG_NEED_NETDEV 0x02 19384 #define NL80211_FLAG_NEED_RTNL 0x04 19385 #define NL80211_FLAG_CHECK_NETDEV_UP 0x08 19386 #define NL80211_FLAG_NEED_NETDEV_UP (NL80211_FLAG_NEED_NETDEV |\ 19387 NL80211_FLAG_CHECK_NETDEV_UP) 19388 #define NL80211_FLAG_NEED_WDEV 0x10 19389 /* If a netdev is associated, it must be UP, P2P must be started */ 19390 #define NL80211_FLAG_NEED_WDEV_UP (NL80211_FLAG_NEED_WDEV |\ 19391 NL80211_FLAG_CHECK_NETDEV_UP) 19392 #define NL80211_FLAG_CLEAR_SKB 0x20 19393 #define NL80211_FLAG_NO_WIPHY_MTX 0x40 19394 #define NL80211_FLAG_MLO_VALID_LINK_ID 0x80 19395 #define NL80211_FLAG_MLO_UNSUPPORTED 0x100 19396 19397 #define INTERNAL_FLAG_SELECTORS(__sel) \ 19398 SELECTOR(__sel, NONE, 0) /* must be first */ \ 19399 SELECTOR(__sel, WIPHY, \ 19400 NL80211_FLAG_NEED_WIPHY) \ 19401 SELECTOR(__sel, WDEV, \ 19402 NL80211_FLAG_NEED_WDEV) \ 19403 SELECTOR(__sel, NETDEV, \ 19404 NL80211_FLAG_NEED_NETDEV) \ 19405 SELECTOR(__sel, NETDEV_LINK, \ 19406 NL80211_FLAG_NEED_NETDEV | \ 19407 NL80211_FLAG_MLO_VALID_LINK_ID) \ 19408 SELECTOR(__sel, NETDEV_NO_MLO, \ 19409 NL80211_FLAG_NEED_NETDEV | \ 19410 NL80211_FLAG_MLO_UNSUPPORTED) \ 19411 SELECTOR(__sel, WIPHY_RTNL, \ 19412 NL80211_FLAG_NEED_WIPHY | \ 19413 NL80211_FLAG_NEED_RTNL) \ 19414 SELECTOR(__sel, WIPHY_RTNL_NOMTX, \ 19415 NL80211_FLAG_NEED_WIPHY | \ 19416 NL80211_FLAG_NEED_RTNL | \ 19417 NL80211_FLAG_NO_WIPHY_MTX) \ 19418 SELECTOR(__sel, WDEV_RTNL, \ 19419 NL80211_FLAG_NEED_WDEV | \ 19420 NL80211_FLAG_NEED_RTNL) \ 19421 SELECTOR(__sel, NETDEV_RTNL, \ 19422 NL80211_FLAG_NEED_NETDEV | \ 19423 NL80211_FLAG_NEED_RTNL) \ 19424 SELECTOR(__sel, NETDEV_UP, \ 19425 NL80211_FLAG_NEED_NETDEV_UP) \ 19426 SELECTOR(__sel, NETDEV_UP_LINK, \ 19427 NL80211_FLAG_NEED_NETDEV_UP | \ 19428 NL80211_FLAG_MLO_VALID_LINK_ID) \ 19429 SELECTOR(__sel, NETDEV_UP_NO_MLO, \ 19430 NL80211_FLAG_NEED_NETDEV_UP | \ 19431 NL80211_FLAG_MLO_UNSUPPORTED) \ 19432 SELECTOR(__sel, NETDEV_UP_NO_MLO_CLEAR, \ 19433 NL80211_FLAG_NEED_NETDEV_UP | \ 19434 NL80211_FLAG_CLEAR_SKB | \ 19435 NL80211_FLAG_MLO_UNSUPPORTED) \ 19436 SELECTOR(__sel, NETDEV_UP_NOTMX, \ 19437 NL80211_FLAG_NEED_NETDEV_UP | \ 19438 NL80211_FLAG_NO_WIPHY_MTX) \ 19439 SELECTOR(__sel, NETDEV_UP_NOTMX_MLO, \ 19440 NL80211_FLAG_NEED_NETDEV_UP | \ 19441 NL80211_FLAG_NO_WIPHY_MTX | \ 19442 NL80211_FLAG_MLO_VALID_LINK_ID) \ 19443 SELECTOR(__sel, NETDEV_UP_CLEAR, \ 19444 NL80211_FLAG_NEED_NETDEV_UP | \ 19445 NL80211_FLAG_CLEAR_SKB) \ 19446 SELECTOR(__sel, WDEV_UP, \ 19447 NL80211_FLAG_NEED_WDEV_UP) \ 19448 SELECTOR(__sel, WDEV_UP_CLEAR, \ 19449 NL80211_FLAG_NEED_WDEV_UP | \ 19450 NL80211_FLAG_CLEAR_SKB) \ 19451 SELECTOR(__sel, WDEV_UP_LINK, \ 19452 NL80211_FLAG_NEED_WDEV_UP | \ 19453 NL80211_FLAG_MLO_VALID_LINK_ID) \ 19454 SELECTOR(__sel, WDEV_UP_RTNL, \ 19455 NL80211_FLAG_NEED_WDEV_UP | \ 19456 NL80211_FLAG_NEED_RTNL) \ 19457 SELECTOR(__sel, WIPHY_CLEAR, \ 19458 NL80211_FLAG_NEED_WIPHY | \ 19459 NL80211_FLAG_CLEAR_SKB) \ 19460 SELECTOR(__sel, WDEV_UP_RTNL_NOMTX, \ 19461 NL80211_FLAG_NEED_WDEV_UP | \ 19462 NL80211_FLAG_NO_WIPHY_MTX | \ 19463 NL80211_FLAG_NEED_RTNL) 19464 19465 enum nl80211_internal_flags_selector { 19466 #define SELECTOR(_, name, value) NL80211_IFL_SEL_##name, 19467 INTERNAL_FLAG_SELECTORS(_) 19468 #undef SELECTOR 19469 }; 19470 19471 static u32 nl80211_internal_flags[] = { 19472 #define SELECTOR(_, name, value) [NL80211_IFL_SEL_##name] = value, 19473 INTERNAL_FLAG_SELECTORS(_) 19474 #undef SELECTOR 19475 }; 19476 19477 static int nl80211_pre_doit(const struct genl_split_ops *ops, 19478 struct sk_buff *skb, 19479 struct genl_info *info) 19480 { 19481 struct cfg80211_registered_device *rdev = NULL; 19482 struct wireless_dev *wdev = NULL; 19483 struct net_device *dev = NULL; 19484 u32 internal_flags; 19485 int err; 19486 19487 if (WARN_ON(ops->internal_flags >= ARRAY_SIZE(nl80211_internal_flags))) 19488 return -EINVAL; 19489 19490 internal_flags = nl80211_internal_flags[ops->internal_flags]; 19491 19492 rtnl_lock(); 19493 if (internal_flags & NL80211_FLAG_NEED_WIPHY) { 19494 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 19495 if (IS_ERR(rdev)) { 19496 err = PTR_ERR(rdev); 19497 goto out_unlock; 19498 } 19499 info->user_ptr[0] = rdev; 19500 } else if (internal_flags & NL80211_FLAG_NEED_NETDEV || 19501 internal_flags & NL80211_FLAG_NEED_WDEV) { 19502 wdev = __cfg80211_wdev_from_attrs(NULL, genl_info_net(info), 19503 info->attrs); 19504 if (IS_ERR(wdev)) { 19505 err = PTR_ERR(wdev); 19506 goto out_unlock; 19507 } 19508 19509 dev = wdev->netdev; 19510 dev_hold(dev); 19511 rdev = wiphy_to_rdev(wdev->wiphy); 19512 19513 if (internal_flags & NL80211_FLAG_NEED_NETDEV) { 19514 if (!dev) { 19515 err = -EINVAL; 19516 goto out_unlock; 19517 } 19518 19519 info->user_ptr[1] = dev; 19520 } else { 19521 info->user_ptr[1] = wdev; 19522 } 19523 19524 if (internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && 19525 !wdev_running(wdev)) { 19526 err = -ENETDOWN; 19527 goto out_unlock; 19528 } 19529 19530 info->user_ptr[0] = rdev; 19531 } 19532 19533 if (internal_flags & NL80211_FLAG_MLO_VALID_LINK_ID) { 19534 struct nlattr *link_id = info->attrs[NL80211_ATTR_MLO_LINK_ID]; 19535 19536 if (!wdev) { 19537 err = -EINVAL; 19538 goto out_unlock; 19539 } 19540 19541 /* MLO -> require valid link ID */ 19542 if (wdev->valid_links && 19543 (!link_id || 19544 !(wdev->valid_links & BIT(nla_get_u8(link_id))))) { 19545 err = -EINVAL; 19546 goto out_unlock; 19547 } 19548 19549 /* non-MLO -> no link ID attribute accepted */ 19550 if (!wdev->valid_links && link_id) { 19551 err = -EINVAL; 19552 goto out_unlock; 19553 } 19554 } 19555 19556 if (internal_flags & NL80211_FLAG_MLO_UNSUPPORTED) { 19557 if (info->attrs[NL80211_ATTR_MLO_LINK_ID] || 19558 (wdev && wdev->valid_links)) { 19559 err = -EINVAL; 19560 goto out_unlock; 19561 } 19562 } 19563 19564 if (rdev && !(internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) { 19565 wiphy_lock(&rdev->wiphy); 19566 /* we keep the mutex locked until post_doit */ 19567 __release(&rdev->wiphy.mtx); 19568 } 19569 if (!(internal_flags & NL80211_FLAG_NEED_RTNL)) 19570 rtnl_unlock(); 19571 19572 return 0; 19573 out_unlock: 19574 rtnl_unlock(); 19575 dev_put(dev); 19576 return err; 19577 } 19578 19579 static void nl80211_post_doit(const struct genl_split_ops *ops, 19580 struct sk_buff *skb, 19581 struct genl_info *info) 19582 { 19583 u32 internal_flags = nl80211_internal_flags[ops->internal_flags]; 19584 19585 if (info->user_ptr[1]) { 19586 if (internal_flags & NL80211_FLAG_NEED_WDEV) { 19587 struct wireless_dev *wdev = info->user_ptr[1]; 19588 19589 dev_put(wdev->netdev); 19590 } else { 19591 dev_put(info->user_ptr[1]); 19592 } 19593 } 19594 19595 if (info->user_ptr[0] && 19596 !(internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) { 19597 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19598 19599 /* we kept the mutex locked since pre_doit */ 19600 __acquire(&rdev->wiphy.mtx); 19601 wiphy_unlock(&rdev->wiphy); 19602 } 19603 19604 if (internal_flags & NL80211_FLAG_NEED_RTNL) 19605 rtnl_unlock(); 19606 19607 /* If needed, clear the netlink message payload from the SKB 19608 * as it might contain key data that shouldn't stick around on 19609 * the heap after the SKB is freed. The netlink message header 19610 * is still needed for further processing, so leave it intact. 19611 */ 19612 if (internal_flags & NL80211_FLAG_CLEAR_SKB) { 19613 struct nlmsghdr *nlh = nlmsg_hdr(skb); 19614 19615 memset(nlmsg_data(nlh), 0, nlmsg_len(nlh)); 19616 } 19617 } 19618 19619 static int nl80211_set_sar_sub_specs(struct cfg80211_registered_device *rdev, 19620 struct cfg80211_sar_specs *sar_specs, 19621 struct nlattr *spec[], int index) 19622 { 19623 u32 range_index, i; 19624 19625 if (!sar_specs || !spec) 19626 return -EINVAL; 19627 19628 if (!spec[NL80211_SAR_ATTR_SPECS_POWER] || 19629 !spec[NL80211_SAR_ATTR_SPECS_RANGE_INDEX]) 19630 return -EINVAL; 19631 19632 range_index = nla_get_u32(spec[NL80211_SAR_ATTR_SPECS_RANGE_INDEX]); 19633 19634 /* check if range_index exceeds num_freq_ranges */ 19635 if (range_index >= rdev->wiphy.sar_capa->num_freq_ranges) 19636 return -EINVAL; 19637 19638 /* check if range_index duplicates */ 19639 for (i = 0; i < index; i++) { 19640 if (sar_specs->sub_specs[i].freq_range_index == range_index) 19641 return -EINVAL; 19642 } 19643 19644 sar_specs->sub_specs[index].power = 19645 nla_get_s32(spec[NL80211_SAR_ATTR_SPECS_POWER]); 19646 19647 sar_specs->sub_specs[index].freq_range_index = range_index; 19648 19649 return 0; 19650 } 19651 19652 static int nl80211_set_sar_specs(struct sk_buff *skb, struct genl_info *info) 19653 { 19654 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19655 struct nlattr *spec[NL80211_SAR_ATTR_SPECS_MAX + 1]; 19656 struct nlattr *tb[NL80211_SAR_ATTR_MAX + 1]; 19657 struct cfg80211_sar_specs *sar_spec; 19658 enum nl80211_sar_type type; 19659 struct nlattr *spec_list; 19660 u32 specs; 19661 int rem, err; 19662 19663 if (!rdev->wiphy.sar_capa || !rdev->ops->set_sar_specs) 19664 return -EOPNOTSUPP; 19665 19666 if (!info->attrs[NL80211_ATTR_SAR_SPEC]) 19667 return -EINVAL; 19668 19669 nla_parse_nested(tb, NL80211_SAR_ATTR_MAX, 19670 info->attrs[NL80211_ATTR_SAR_SPEC], 19671 NULL, NULL); 19672 19673 if (!tb[NL80211_SAR_ATTR_TYPE] || !tb[NL80211_SAR_ATTR_SPECS]) 19674 return -EINVAL; 19675 19676 type = nla_get_u32(tb[NL80211_SAR_ATTR_TYPE]); 19677 if (type != rdev->wiphy.sar_capa->type) 19678 return -EINVAL; 19679 19680 specs = 0; 19681 nla_for_each_nested(spec_list, tb[NL80211_SAR_ATTR_SPECS], rem) 19682 specs++; 19683 19684 if (specs > rdev->wiphy.sar_capa->num_freq_ranges) 19685 return -EINVAL; 19686 19687 sar_spec = kzalloc_flex(*sar_spec, sub_specs, specs); 19688 if (!sar_spec) 19689 return -ENOMEM; 19690 19691 sar_spec->num_sub_specs = specs; 19692 sar_spec->type = type; 19693 specs = 0; 19694 nla_for_each_nested(spec_list, tb[NL80211_SAR_ATTR_SPECS], rem) { 19695 nla_parse_nested(spec, NL80211_SAR_ATTR_SPECS_MAX, 19696 spec_list, NULL, NULL); 19697 19698 switch (type) { 19699 case NL80211_SAR_TYPE_POWER: 19700 if (nl80211_set_sar_sub_specs(rdev, sar_spec, 19701 spec, specs)) { 19702 err = -EINVAL; 19703 goto error; 19704 } 19705 break; 19706 default: 19707 err = -EINVAL; 19708 goto error; 19709 } 19710 specs++; 19711 } 19712 19713 sar_spec->num_sub_specs = specs; 19714 19715 rdev->cur_cmd_info = info; 19716 err = rdev_set_sar_specs(rdev, sar_spec); 19717 rdev->cur_cmd_info = NULL; 19718 error: 19719 kfree(sar_spec); 19720 return err; 19721 } 19722 19723 #define SELECTOR(__sel, name, value) \ 19724 ((__sel) == (value)) ? NL80211_IFL_SEL_##name : 19725 int __missing_selector(void); 19726 #define IFLAGS(__val) INTERNAL_FLAG_SELECTORS(__val) __missing_selector() 19727 19728 static const struct genl_ops nl80211_ops[] = { 19729 { 19730 .cmd = NL80211_CMD_GET_WIPHY, 19731 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19732 .doit = nl80211_get_wiphy, 19733 .dumpit = nl80211_dump_wiphy, 19734 .done = nl80211_dump_wiphy_done, 19735 /* can be retrieved by unprivileged users */ 19736 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 19737 }, 19738 { 19739 .cmd = NL80211_CMD_GET_STATION, 19740 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19741 .doit = nl80211_get_station, 19742 .dumpit = nl80211_dump_station, 19743 .done = nl80211_dump_station_done, 19744 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV), 19745 }, 19746 }; 19747 19748 static const struct genl_small_ops nl80211_small_ops[] = { 19749 { 19750 .cmd = NL80211_CMD_SET_WIPHY, 19751 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19752 .doit = nl80211_set_wiphy, 19753 .flags = GENL_UNS_ADMIN_PERM, 19754 }, 19755 { 19756 .cmd = NL80211_CMD_GET_INTERFACE, 19757 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19758 .doit = nl80211_get_interface, 19759 .dumpit = nl80211_dump_interface, 19760 /* can be retrieved by unprivileged users */ 19761 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV), 19762 }, 19763 { 19764 .cmd = NL80211_CMD_SET_INTERFACE, 19765 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19766 .doit = nl80211_set_interface, 19767 .flags = GENL_UNS_ADMIN_PERM, 19768 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 19769 NL80211_FLAG_NEED_RTNL), 19770 }, 19771 { 19772 .cmd = NL80211_CMD_NEW_INTERFACE, 19773 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19774 .doit = nl80211_new_interface, 19775 .flags = GENL_UNS_ADMIN_PERM, 19776 .internal_flags = 19777 IFLAGS(NL80211_FLAG_NEED_WIPHY | 19778 NL80211_FLAG_NEED_RTNL | 19779 /* we take the wiphy mutex later ourselves */ 19780 NL80211_FLAG_NO_WIPHY_MTX), 19781 }, 19782 { 19783 .cmd = NL80211_CMD_DEL_INTERFACE, 19784 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19785 .doit = nl80211_del_interface, 19786 .flags = GENL_UNS_ADMIN_PERM, 19787 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 19788 NL80211_FLAG_NEED_RTNL), 19789 }, 19790 { 19791 .cmd = NL80211_CMD_GET_KEY, 19792 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19793 .doit = nl80211_get_key, 19794 .flags = GENL_UNS_ADMIN_PERM, 19795 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19796 }, 19797 { 19798 .cmd = NL80211_CMD_SET_KEY, 19799 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19800 .doit = nl80211_set_key, 19801 .flags = GENL_UNS_ADMIN_PERM, 19802 /* cannot use NL80211_FLAG_MLO_VALID_LINK_ID, depends on key */ 19803 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 19804 NL80211_FLAG_CLEAR_SKB), 19805 }, 19806 { 19807 .cmd = NL80211_CMD_NEW_KEY, 19808 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19809 .doit = nl80211_new_key, 19810 .flags = GENL_UNS_ADMIN_PERM, 19811 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 19812 NL80211_FLAG_CLEAR_SKB), 19813 }, 19814 { 19815 .cmd = NL80211_CMD_DEL_KEY, 19816 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19817 .doit = nl80211_del_key, 19818 .flags = GENL_UNS_ADMIN_PERM, 19819 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19820 }, 19821 { 19822 .cmd = NL80211_CMD_SET_BEACON, 19823 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19824 .flags = GENL_UNS_ADMIN_PERM, 19825 .doit = nl80211_set_beacon, 19826 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19827 NL80211_FLAG_MLO_VALID_LINK_ID), 19828 }, 19829 { 19830 .cmd = NL80211_CMD_START_AP, 19831 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19832 .flags = GENL_UNS_ADMIN_PERM, 19833 .doit = nl80211_start_ap, 19834 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19835 NL80211_FLAG_MLO_VALID_LINK_ID), 19836 }, 19837 { 19838 .cmd = NL80211_CMD_STOP_AP, 19839 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19840 .flags = GENL_UNS_ADMIN_PERM, 19841 .doit = nl80211_stop_ap, 19842 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19843 NL80211_FLAG_MLO_VALID_LINK_ID), 19844 }, 19845 { 19846 .cmd = NL80211_CMD_SET_STATION, 19847 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19848 .doit = nl80211_set_station, 19849 .flags = GENL_UNS_ADMIN_PERM, 19850 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19851 }, 19852 { 19853 .cmd = NL80211_CMD_NEW_STATION, 19854 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19855 .doit = nl80211_new_station, 19856 .flags = GENL_UNS_ADMIN_PERM, 19857 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19858 }, 19859 { 19860 .cmd = NL80211_CMD_DEL_STATION, 19861 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19862 .doit = nl80211_del_station, 19863 .flags = GENL_UNS_ADMIN_PERM, 19864 /* cannot use NL80211_FLAG_MLO_VALID_LINK_ID, depends on 19865 * whether MAC address is passed or not. If MAC address is 19866 * passed, then even during MLO, link ID is not required. 19867 */ 19868 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19869 }, 19870 { 19871 .cmd = NL80211_CMD_GET_MPATH, 19872 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19873 .doit = nl80211_get_mpath, 19874 .dumpit = nl80211_dump_mpath, 19875 .flags = GENL_UNS_ADMIN_PERM, 19876 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19877 }, 19878 { 19879 .cmd = NL80211_CMD_GET_MPP, 19880 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19881 .doit = nl80211_get_mpp, 19882 .dumpit = nl80211_dump_mpp, 19883 .flags = GENL_UNS_ADMIN_PERM, 19884 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19885 }, 19886 { 19887 .cmd = NL80211_CMD_SET_MPATH, 19888 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19889 .doit = nl80211_set_mpath, 19890 .flags = GENL_UNS_ADMIN_PERM, 19891 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19892 }, 19893 { 19894 .cmd = NL80211_CMD_NEW_MPATH, 19895 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19896 .doit = nl80211_new_mpath, 19897 .flags = GENL_UNS_ADMIN_PERM, 19898 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19899 }, 19900 { 19901 .cmd = NL80211_CMD_DEL_MPATH, 19902 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19903 .doit = nl80211_del_mpath, 19904 .flags = GENL_UNS_ADMIN_PERM, 19905 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19906 }, 19907 { 19908 .cmd = NL80211_CMD_SET_BSS, 19909 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19910 .doit = nl80211_set_bss, 19911 .flags = GENL_UNS_ADMIN_PERM, 19912 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19913 NL80211_FLAG_MLO_VALID_LINK_ID), 19914 }, 19915 { 19916 .cmd = NL80211_CMD_GET_REG, 19917 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19918 .doit = nl80211_get_reg_do, 19919 .dumpit = nl80211_get_reg_dump, 19920 /* can be retrieved by unprivileged users */ 19921 }, 19922 #ifdef CONFIG_CFG80211_CRDA_SUPPORT 19923 { 19924 .cmd = NL80211_CMD_SET_REG, 19925 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19926 .doit = nl80211_set_reg, 19927 .flags = GENL_ADMIN_PERM, 19928 }, 19929 #endif 19930 { 19931 .cmd = NL80211_CMD_REQ_SET_REG, 19932 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19933 .doit = nl80211_req_set_reg, 19934 .flags = GENL_ADMIN_PERM, 19935 }, 19936 { 19937 .cmd = NL80211_CMD_RELOAD_REGDB, 19938 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19939 .doit = nl80211_reload_regdb, 19940 .flags = GENL_ADMIN_PERM, 19941 }, 19942 { 19943 .cmd = NL80211_CMD_GET_MESH_CONFIG, 19944 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19945 .doit = nl80211_get_mesh_config, 19946 /* can be retrieved by unprivileged users */ 19947 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19948 }, 19949 { 19950 .cmd = NL80211_CMD_SET_MESH_CONFIG, 19951 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19952 .doit = nl80211_update_mesh_config, 19953 .flags = GENL_UNS_ADMIN_PERM, 19954 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19955 }, 19956 { 19957 .cmd = NL80211_CMD_TRIGGER_SCAN, 19958 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19959 .doit = nl80211_trigger_scan, 19960 .flags = GENL_UNS_ADMIN_PERM, 19961 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19962 }, 19963 { 19964 .cmd = NL80211_CMD_ABORT_SCAN, 19965 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19966 .doit = nl80211_abort_scan, 19967 .flags = GENL_UNS_ADMIN_PERM, 19968 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19969 }, 19970 { 19971 .cmd = NL80211_CMD_GET_SCAN, 19972 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19973 .dumpit = nl80211_dump_scan, 19974 }, 19975 { 19976 .cmd = NL80211_CMD_START_SCHED_SCAN, 19977 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19978 .doit = nl80211_start_sched_scan, 19979 .flags = GENL_UNS_ADMIN_PERM, 19980 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19981 }, 19982 { 19983 .cmd = NL80211_CMD_STOP_SCHED_SCAN, 19984 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19985 .doit = nl80211_stop_sched_scan, 19986 .flags = GENL_UNS_ADMIN_PERM, 19987 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19988 }, 19989 { 19990 .cmd = NL80211_CMD_AUTHENTICATE, 19991 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19992 .doit = nl80211_authenticate, 19993 .flags = GENL_UNS_ADMIN_PERM, 19994 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19995 NL80211_FLAG_CLEAR_SKB), 19996 }, 19997 { 19998 .cmd = NL80211_CMD_ASSOCIATE, 19999 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20000 .doit = nl80211_associate, 20001 .flags = GENL_UNS_ADMIN_PERM, 20002 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20003 NL80211_FLAG_CLEAR_SKB), 20004 }, 20005 { 20006 .cmd = NL80211_CMD_DEAUTHENTICATE, 20007 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20008 .doit = nl80211_deauthenticate, 20009 .flags = GENL_UNS_ADMIN_PERM, 20010 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20011 }, 20012 { 20013 .cmd = NL80211_CMD_DISASSOCIATE, 20014 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20015 .doit = nl80211_disassociate, 20016 .flags = GENL_UNS_ADMIN_PERM, 20017 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20018 }, 20019 { 20020 .cmd = NL80211_CMD_JOIN_IBSS, 20021 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20022 .doit = nl80211_join_ibss, 20023 .flags = GENL_UNS_ADMIN_PERM, 20024 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20025 }, 20026 { 20027 .cmd = NL80211_CMD_LEAVE_IBSS, 20028 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20029 .doit = nl80211_leave_ibss, 20030 .flags = GENL_UNS_ADMIN_PERM, 20031 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20032 }, 20033 #ifdef CONFIG_NL80211_TESTMODE 20034 { 20035 .cmd = NL80211_CMD_TESTMODE, 20036 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20037 .doit = nl80211_testmode_do, 20038 .dumpit = nl80211_testmode_dump, 20039 .flags = GENL_UNS_ADMIN_PERM, 20040 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20041 }, 20042 #endif 20043 { 20044 .cmd = NL80211_CMD_CONNECT, 20045 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20046 .doit = nl80211_connect, 20047 .flags = GENL_UNS_ADMIN_PERM, 20048 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20049 NL80211_FLAG_CLEAR_SKB), 20050 }, 20051 { 20052 .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS, 20053 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20054 .doit = nl80211_update_connect_params, 20055 .flags = GENL_ADMIN_PERM, 20056 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20057 NL80211_FLAG_CLEAR_SKB), 20058 }, 20059 { 20060 .cmd = NL80211_CMD_DISCONNECT, 20061 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20062 .doit = nl80211_disconnect, 20063 .flags = GENL_UNS_ADMIN_PERM, 20064 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20065 }, 20066 { 20067 .cmd = NL80211_CMD_SET_WIPHY_NETNS, 20068 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20069 .doit = nl80211_wiphy_netns, 20070 .flags = GENL_UNS_ADMIN_PERM, 20071 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY | 20072 NL80211_FLAG_NEED_RTNL | 20073 NL80211_FLAG_NO_WIPHY_MTX), 20074 }, 20075 { 20076 .cmd = NL80211_CMD_GET_SURVEY, 20077 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20078 .dumpit = nl80211_dump_survey, 20079 }, 20080 { 20081 .cmd = NL80211_CMD_SET_PMKSA, 20082 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20083 .doit = nl80211_set_pmksa, 20084 .flags = GENL_UNS_ADMIN_PERM, 20085 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20086 NL80211_FLAG_CLEAR_SKB), 20087 }, 20088 { 20089 .cmd = NL80211_CMD_DEL_PMKSA, 20090 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20091 .doit = nl80211_del_pmksa, 20092 .flags = GENL_UNS_ADMIN_PERM, 20093 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20094 }, 20095 { 20096 .cmd = NL80211_CMD_FLUSH_PMKSA, 20097 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20098 .doit = nl80211_flush_pmksa, 20099 .flags = GENL_UNS_ADMIN_PERM, 20100 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20101 }, 20102 { 20103 .cmd = NL80211_CMD_REMAIN_ON_CHANNEL, 20104 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20105 .doit = nl80211_remain_on_channel, 20106 .flags = GENL_UNS_ADMIN_PERM, 20107 /* FIXME: requiring a link ID here is probably not good */ 20108 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 20109 NL80211_FLAG_MLO_VALID_LINK_ID), 20110 }, 20111 { 20112 .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 20113 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20114 .doit = nl80211_cancel_remain_on_channel, 20115 .flags = GENL_UNS_ADMIN_PERM, 20116 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20117 }, 20118 { 20119 .cmd = NL80211_CMD_SET_TX_BITRATE_MASK, 20120 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20121 .doit = nl80211_set_tx_bitrate_mask, 20122 .flags = GENL_UNS_ADMIN_PERM, 20123 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 20124 NL80211_FLAG_MLO_VALID_LINK_ID), 20125 }, 20126 { 20127 .cmd = NL80211_CMD_REGISTER_FRAME, 20128 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20129 .doit = nl80211_register_mgmt, 20130 .flags = GENL_UNS_ADMIN_PERM, 20131 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV), 20132 }, 20133 { 20134 .cmd = NL80211_CMD_FRAME, 20135 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20136 .doit = nl80211_tx_mgmt, 20137 .flags = GENL_UNS_ADMIN_PERM, 20138 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20139 }, 20140 { 20141 .cmd = NL80211_CMD_FRAME_WAIT_CANCEL, 20142 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20143 .doit = nl80211_tx_mgmt_cancel_wait, 20144 .flags = GENL_UNS_ADMIN_PERM, 20145 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20146 }, 20147 { 20148 .cmd = NL80211_CMD_SET_POWER_SAVE, 20149 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20150 .doit = nl80211_set_power_save, 20151 .flags = GENL_UNS_ADMIN_PERM, 20152 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20153 }, 20154 { 20155 .cmd = NL80211_CMD_GET_POWER_SAVE, 20156 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20157 .doit = nl80211_get_power_save, 20158 /* can be retrieved by unprivileged users */ 20159 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20160 }, 20161 { 20162 .cmd = NL80211_CMD_SET_CQM, 20163 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20164 .doit = nl80211_set_cqm, 20165 .flags = GENL_UNS_ADMIN_PERM, 20166 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20167 }, 20168 { 20169 .cmd = NL80211_CMD_SET_CHANNEL, 20170 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20171 .doit = nl80211_set_channel, 20172 .flags = GENL_UNS_ADMIN_PERM, 20173 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 20174 NL80211_FLAG_MLO_VALID_LINK_ID), 20175 }, 20176 { 20177 .cmd = NL80211_CMD_JOIN_MESH, 20178 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20179 .doit = nl80211_join_mesh, 20180 .flags = GENL_UNS_ADMIN_PERM, 20181 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20182 }, 20183 { 20184 .cmd = NL80211_CMD_LEAVE_MESH, 20185 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20186 .doit = nl80211_leave_mesh, 20187 .flags = GENL_UNS_ADMIN_PERM, 20188 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20189 }, 20190 { 20191 .cmd = NL80211_CMD_JOIN_OCB, 20192 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20193 .doit = nl80211_join_ocb, 20194 .flags = GENL_UNS_ADMIN_PERM, 20195 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20196 }, 20197 { 20198 .cmd = NL80211_CMD_LEAVE_OCB, 20199 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20200 .doit = nl80211_leave_ocb, 20201 .flags = GENL_UNS_ADMIN_PERM, 20202 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20203 }, 20204 #ifdef CONFIG_PM 20205 { 20206 .cmd = NL80211_CMD_GET_WOWLAN, 20207 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20208 .doit = nl80211_get_wowlan, 20209 /* can be retrieved by unprivileged users */ 20210 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20211 }, 20212 { 20213 .cmd = NL80211_CMD_SET_WOWLAN, 20214 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20215 .doit = nl80211_set_wowlan, 20216 .flags = GENL_UNS_ADMIN_PERM, 20217 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20218 }, 20219 #endif 20220 { 20221 .cmd = NL80211_CMD_SET_REKEY_OFFLOAD, 20222 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20223 .doit = nl80211_set_rekey_data, 20224 .flags = GENL_UNS_ADMIN_PERM, 20225 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20226 NL80211_FLAG_CLEAR_SKB), 20227 }, 20228 { 20229 .cmd = NL80211_CMD_TDLS_MGMT, 20230 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20231 .doit = nl80211_tdls_mgmt, 20232 .flags = GENL_UNS_ADMIN_PERM, 20233 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20234 NL80211_FLAG_MLO_VALID_LINK_ID), 20235 }, 20236 { 20237 .cmd = NL80211_CMD_TDLS_OPER, 20238 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20239 .doit = nl80211_tdls_oper, 20240 .flags = GENL_UNS_ADMIN_PERM, 20241 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20242 }, 20243 { 20244 .cmd = NL80211_CMD_UNEXPECTED_FRAME, 20245 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20246 .doit = nl80211_register_unexpected_frame, 20247 .flags = GENL_UNS_ADMIN_PERM, 20248 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20249 }, 20250 { 20251 .cmd = NL80211_CMD_PROBE_PEER, 20252 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20253 .doit = nl80211_probe_peer, 20254 .flags = GENL_UNS_ADMIN_PERM, 20255 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20256 }, 20257 { 20258 .cmd = NL80211_CMD_REGISTER_BEACONS, 20259 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20260 .doit = nl80211_register_beacons, 20261 .flags = GENL_UNS_ADMIN_PERM, 20262 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20263 }, 20264 { 20265 .cmd = NL80211_CMD_SET_NOACK_MAP, 20266 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20267 .doit = nl80211_set_noack_map, 20268 .flags = GENL_UNS_ADMIN_PERM, 20269 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20270 }, 20271 { 20272 .cmd = NL80211_CMD_START_P2P_DEVICE, 20273 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20274 .doit = nl80211_start_p2p_device, 20275 .flags = GENL_UNS_ADMIN_PERM, 20276 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 20277 NL80211_FLAG_NEED_RTNL), 20278 }, 20279 { 20280 .cmd = NL80211_CMD_STOP_P2P_DEVICE, 20281 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20282 .doit = nl80211_stop_p2p_device, 20283 .flags = GENL_UNS_ADMIN_PERM, 20284 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 20285 NL80211_FLAG_NEED_RTNL), 20286 }, 20287 { 20288 .cmd = NL80211_CMD_START_NAN, 20289 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20290 .doit = nl80211_start_nan, 20291 .flags = GENL_ADMIN_PERM, 20292 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 20293 NL80211_FLAG_NEED_RTNL), 20294 }, 20295 { 20296 .cmd = NL80211_CMD_STOP_NAN, 20297 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20298 .doit = nl80211_stop_nan, 20299 .flags = GENL_ADMIN_PERM, 20300 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 20301 NL80211_FLAG_NO_WIPHY_MTX | 20302 NL80211_FLAG_NEED_RTNL), 20303 }, 20304 { 20305 .cmd = NL80211_CMD_ADD_NAN_FUNCTION, 20306 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20307 .doit = nl80211_nan_add_func, 20308 .flags = GENL_ADMIN_PERM, 20309 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20310 }, 20311 { 20312 .cmd = NL80211_CMD_DEL_NAN_FUNCTION, 20313 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20314 .doit = nl80211_nan_del_func, 20315 .flags = GENL_ADMIN_PERM, 20316 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20317 }, 20318 { 20319 .cmd = NL80211_CMD_CHANGE_NAN_CONFIG, 20320 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20321 .doit = nl80211_nan_change_config, 20322 .flags = GENL_ADMIN_PERM, 20323 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20324 }, 20325 { 20326 .cmd = NL80211_CMD_START_PD, 20327 .doit = nl80211_start_pd, 20328 .flags = GENL_ADMIN_PERM, 20329 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 20330 NL80211_FLAG_NEED_RTNL), 20331 }, 20332 { 20333 .cmd = NL80211_CMD_STOP_PD, 20334 .doit = nl80211_stop_pd, 20335 .flags = GENL_ADMIN_PERM, 20336 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 20337 NL80211_FLAG_NEED_RTNL), 20338 }, 20339 { 20340 .cmd = NL80211_CMD_SET_MCAST_RATE, 20341 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20342 .doit = nl80211_set_mcast_rate, 20343 .flags = GENL_UNS_ADMIN_PERM, 20344 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20345 }, 20346 { 20347 .cmd = NL80211_CMD_SET_MAC_ACL, 20348 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20349 .doit = nl80211_set_mac_acl, 20350 .flags = GENL_UNS_ADMIN_PERM, 20351 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 20352 NL80211_FLAG_MLO_UNSUPPORTED), 20353 }, 20354 { 20355 .cmd = NL80211_CMD_RADAR_DETECT, 20356 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20357 .doit = nl80211_start_radar_detection, 20358 .flags = GENL_UNS_ADMIN_PERM, 20359 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20360 NL80211_FLAG_NO_WIPHY_MTX | 20361 NL80211_FLAG_MLO_VALID_LINK_ID), 20362 }, 20363 { 20364 .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES, 20365 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20366 .doit = nl80211_get_protocol_features, 20367 }, 20368 { 20369 .cmd = NL80211_CMD_UPDATE_FT_IES, 20370 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20371 .doit = nl80211_update_ft_ies, 20372 .flags = GENL_UNS_ADMIN_PERM, 20373 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20374 }, 20375 { 20376 .cmd = NL80211_CMD_CRIT_PROTOCOL_START, 20377 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20378 .doit = nl80211_crit_protocol_start, 20379 .flags = GENL_UNS_ADMIN_PERM, 20380 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20381 }, 20382 { 20383 .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP, 20384 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20385 .doit = nl80211_crit_protocol_stop, 20386 .flags = GENL_UNS_ADMIN_PERM, 20387 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20388 }, 20389 { 20390 .cmd = NL80211_CMD_GET_COALESCE, 20391 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20392 .doit = nl80211_get_coalesce, 20393 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20394 }, 20395 { 20396 .cmd = NL80211_CMD_SET_COALESCE, 20397 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20398 .doit = nl80211_set_coalesce, 20399 .flags = GENL_UNS_ADMIN_PERM, 20400 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20401 }, 20402 { 20403 .cmd = NL80211_CMD_CHANNEL_SWITCH, 20404 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20405 .doit = nl80211_channel_switch, 20406 .flags = GENL_UNS_ADMIN_PERM, 20407 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20408 NL80211_FLAG_MLO_VALID_LINK_ID), 20409 }, 20410 { 20411 .cmd = NL80211_CMD_VENDOR, 20412 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20413 .doit = nl80211_vendor_cmd, 20414 .dumpit = nl80211_vendor_cmd_dump, 20415 .flags = GENL_UNS_ADMIN_PERM, 20416 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY | 20417 NL80211_FLAG_CLEAR_SKB), 20418 }, 20419 { 20420 .cmd = NL80211_CMD_SET_QOS_MAP, 20421 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20422 .doit = nl80211_set_qos_map, 20423 .flags = GENL_UNS_ADMIN_PERM, 20424 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20425 }, 20426 { 20427 .cmd = NL80211_CMD_ADD_TX_TS, 20428 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20429 .doit = nl80211_add_tx_ts, 20430 .flags = GENL_UNS_ADMIN_PERM, 20431 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20432 NL80211_FLAG_MLO_UNSUPPORTED), 20433 }, 20434 { 20435 .cmd = NL80211_CMD_DEL_TX_TS, 20436 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20437 .doit = nl80211_del_tx_ts, 20438 .flags = GENL_UNS_ADMIN_PERM, 20439 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20440 }, 20441 { 20442 .cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH, 20443 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20444 .doit = nl80211_tdls_channel_switch, 20445 .flags = GENL_UNS_ADMIN_PERM, 20446 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20447 }, 20448 { 20449 .cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, 20450 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20451 .doit = nl80211_tdls_cancel_channel_switch, 20452 .flags = GENL_UNS_ADMIN_PERM, 20453 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20454 }, 20455 { 20456 .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST, 20457 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20458 .doit = nl80211_set_multicast_to_unicast, 20459 .flags = GENL_UNS_ADMIN_PERM, 20460 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20461 }, 20462 { 20463 .cmd = NL80211_CMD_SET_PMK, 20464 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20465 .doit = nl80211_set_pmk, 20466 .flags = GENL_UNS_ADMIN_PERM, 20467 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20468 NL80211_FLAG_CLEAR_SKB), 20469 }, 20470 { 20471 .cmd = NL80211_CMD_DEL_PMK, 20472 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20473 .doit = nl80211_del_pmk, 20474 .flags = GENL_UNS_ADMIN_PERM, 20475 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20476 }, 20477 { 20478 .cmd = NL80211_CMD_EXTERNAL_AUTH, 20479 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20480 .doit = nl80211_external_auth, 20481 .flags = GENL_ADMIN_PERM, 20482 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20483 }, 20484 { 20485 .cmd = NL80211_CMD_CONTROL_PORT_FRAME, 20486 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20487 .doit = nl80211_tx_control_port, 20488 .flags = GENL_UNS_ADMIN_PERM, 20489 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20490 }, 20491 { 20492 .cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS, 20493 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20494 .doit = nl80211_get_ftm_responder_stats, 20495 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 20496 NL80211_FLAG_MLO_VALID_LINK_ID), 20497 }, 20498 { 20499 .cmd = NL80211_CMD_PEER_MEASUREMENT_START, 20500 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20501 .doit = nl80211_pmsr_start, 20502 .flags = GENL_UNS_ADMIN_PERM, 20503 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20504 }, 20505 { 20506 .cmd = NL80211_CMD_NOTIFY_RADAR, 20507 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20508 .doit = nl80211_notify_radar_detection, 20509 .flags = GENL_UNS_ADMIN_PERM, 20510 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20511 }, 20512 { 20513 .cmd = NL80211_CMD_UPDATE_OWE_INFO, 20514 .doit = nl80211_update_owe_info, 20515 .flags = GENL_ADMIN_PERM, 20516 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20517 }, 20518 { 20519 .cmd = NL80211_CMD_PROBE_MESH_LINK, 20520 .doit = nl80211_probe_mesh_link, 20521 .flags = GENL_UNS_ADMIN_PERM, 20522 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20523 }, 20524 { 20525 .cmd = NL80211_CMD_SET_TID_CONFIG, 20526 .doit = nl80211_set_tid_config, 20527 .flags = GENL_UNS_ADMIN_PERM, 20528 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 20529 NL80211_FLAG_MLO_VALID_LINK_ID), 20530 }, 20531 { 20532 .cmd = NL80211_CMD_SET_SAR_SPECS, 20533 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20534 .doit = nl80211_set_sar_specs, 20535 .flags = GENL_UNS_ADMIN_PERM, 20536 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY | 20537 NL80211_FLAG_NEED_RTNL), 20538 }, 20539 { 20540 .cmd = NL80211_CMD_COLOR_CHANGE_REQUEST, 20541 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20542 .doit = nl80211_color_change, 20543 .flags = GENL_UNS_ADMIN_PERM, 20544 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20545 NL80211_FLAG_MLO_VALID_LINK_ID), 20546 }, 20547 { 20548 .cmd = NL80211_CMD_SET_FILS_AAD, 20549 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20550 .doit = nl80211_set_fils_aad, 20551 .flags = GENL_UNS_ADMIN_PERM, 20552 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20553 }, 20554 { 20555 .cmd = NL80211_CMD_ADD_LINK, 20556 .doit = nl80211_add_link, 20557 .flags = GENL_UNS_ADMIN_PERM, 20558 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20559 }, 20560 { 20561 .cmd = NL80211_CMD_REMOVE_LINK, 20562 .doit = nl80211_remove_link, 20563 .flags = GENL_UNS_ADMIN_PERM, 20564 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20565 NL80211_FLAG_MLO_VALID_LINK_ID), 20566 }, 20567 { 20568 .cmd = NL80211_CMD_ADD_LINK_STA, 20569 .doit = nl80211_add_link_station, 20570 .flags = GENL_UNS_ADMIN_PERM, 20571 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20572 NL80211_FLAG_MLO_VALID_LINK_ID), 20573 }, 20574 { 20575 .cmd = NL80211_CMD_MODIFY_LINK_STA, 20576 .doit = nl80211_modify_link_station, 20577 .flags = GENL_UNS_ADMIN_PERM, 20578 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20579 NL80211_FLAG_MLO_VALID_LINK_ID), 20580 }, 20581 { 20582 .cmd = NL80211_CMD_REMOVE_LINK_STA, 20583 .doit = nl80211_remove_link_station, 20584 .flags = GENL_UNS_ADMIN_PERM, 20585 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20586 NL80211_FLAG_MLO_VALID_LINK_ID), 20587 }, 20588 { 20589 .cmd = NL80211_CMD_SET_HW_TIMESTAMP, 20590 .doit = nl80211_set_hw_timestamp, 20591 .flags = GENL_UNS_ADMIN_PERM, 20592 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20593 }, 20594 { 20595 .cmd = NL80211_CMD_SET_TID_TO_LINK_MAPPING, 20596 .doit = nl80211_set_ttlm, 20597 .flags = GENL_UNS_ADMIN_PERM, 20598 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20599 }, 20600 { 20601 .cmd = NL80211_CMD_ASSOC_MLO_RECONF, 20602 .doit = nl80211_assoc_ml_reconf, 20603 .flags = GENL_UNS_ADMIN_PERM, 20604 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20605 }, 20606 { 20607 .cmd = NL80211_CMD_EPCS_CFG, 20608 .doit = nl80211_epcs_cfg, 20609 .flags = GENL_UNS_ADMIN_PERM, 20610 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20611 }, 20612 { 20613 .cmd = NL80211_CMD_NAN_SET_LOCAL_SCHED, 20614 .doit = nl80211_nan_set_local_sched, 20615 .flags = GENL_ADMIN_PERM, 20616 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20617 }, 20618 { 20619 .cmd = NL80211_CMD_NAN_SET_PEER_SCHED, 20620 .doit = nl80211_nan_set_peer_sched, 20621 .flags = GENL_ADMIN_PERM, 20622 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20623 }, 20624 }; 20625 20626 static struct genl_family nl80211_fam __ro_after_init = { 20627 .name = NL80211_GENL_NAME, /* have users key off the name instead */ 20628 .hdrsize = 0, /* no private header */ 20629 .version = 1, /* no particular meaning now */ 20630 .maxattr = NL80211_ATTR_MAX, 20631 .policy = nl80211_policy, 20632 .netnsok = true, 20633 .pre_doit = nl80211_pre_doit, 20634 .post_doit = nl80211_post_doit, 20635 .module = THIS_MODULE, 20636 .ops = nl80211_ops, 20637 .n_ops = ARRAY_SIZE(nl80211_ops), 20638 .small_ops = nl80211_small_ops, 20639 .n_small_ops = ARRAY_SIZE(nl80211_small_ops), 20640 .resv_start_op = NL80211_CMD_REMOVE_LINK_STA + 1, 20641 .mcgrps = nl80211_mcgrps, 20642 .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps), 20643 .parallel_ops = true, 20644 }; 20645 20646 /* notification functions */ 20647 20648 void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev, 20649 enum nl80211_commands cmd) 20650 { 20651 struct sk_buff *msg; 20652 struct nl80211_dump_wiphy_state state = {}; 20653 20654 WARN_ON(cmd != NL80211_CMD_NEW_WIPHY && 20655 cmd != NL80211_CMD_DEL_WIPHY); 20656 20657 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20658 if (!msg) 20659 return; 20660 20661 if (nl80211_send_wiphy(rdev, cmd, msg, 0, 0, 0, &state) < 0) { 20662 nlmsg_free(msg); 20663 return; 20664 } 20665 20666 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20667 NL80211_MCGRP_CONFIG, GFP_KERNEL); 20668 } 20669 20670 void nl80211_notify_iface(struct cfg80211_registered_device *rdev, 20671 struct wireless_dev *wdev, 20672 enum nl80211_commands cmd) 20673 { 20674 struct sk_buff *msg; 20675 20676 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20677 if (!msg) 20678 return; 20679 20680 if (nl80211_send_iface(msg, 0, 0, 0, rdev, wdev, cmd) < 0) { 20681 nlmsg_free(msg); 20682 return; 20683 } 20684 20685 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20686 NL80211_MCGRP_CONFIG, GFP_KERNEL); 20687 } 20688 20689 static int nl80211_add_scan_req(struct sk_buff *msg, 20690 struct cfg80211_registered_device *rdev) 20691 { 20692 struct cfg80211_scan_request_int *req = rdev->scan_req; 20693 struct nlattr *nest; 20694 int i; 20695 struct cfg80211_scan_info *info; 20696 20697 if (WARN_ON(!req)) 20698 return 0; 20699 20700 nest = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_SSIDS); 20701 if (!nest) 20702 goto nla_put_failure; 20703 for (i = 0; i < req->req.n_ssids; i++) { 20704 if (nla_put(msg, i, req->req.ssids[i].ssid_len, 20705 req->req.ssids[i].ssid)) 20706 goto nla_put_failure; 20707 } 20708 nla_nest_end(msg, nest); 20709 20710 if (req->req.flags & NL80211_SCAN_FLAG_FREQ_KHZ) { 20711 nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQ_KHZ); 20712 if (!nest) 20713 goto nla_put_failure; 20714 for (i = 0; i < req->req.n_channels; i++) { 20715 if (nla_put_u32(msg, i, 20716 ieee80211_channel_to_khz(req->req.channels[i]))) 20717 goto nla_put_failure; 20718 } 20719 nla_nest_end(msg, nest); 20720 } else { 20721 nest = nla_nest_start_noflag(msg, 20722 NL80211_ATTR_SCAN_FREQUENCIES); 20723 if (!nest) 20724 goto nla_put_failure; 20725 for (i = 0; i < req->req.n_channels; i++) { 20726 if (nla_put_u32(msg, i, 20727 req->req.channels[i]->center_freq)) 20728 goto nla_put_failure; 20729 } 20730 nla_nest_end(msg, nest); 20731 } 20732 20733 if (req->req.ie && 20734 nla_put(msg, NL80211_ATTR_IE, req->req.ie_len, req->req.ie)) 20735 goto nla_put_failure; 20736 20737 if (req->req.flags && 20738 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->req.flags)) 20739 goto nla_put_failure; 20740 20741 info = rdev->int_scan_req ? &rdev->int_scan_req->info : 20742 &rdev->scan_req->info; 20743 if (info->scan_start_tsf && 20744 (nla_put_u64_64bit(msg, NL80211_ATTR_SCAN_START_TIME_TSF, 20745 info->scan_start_tsf, NL80211_BSS_PAD) || 20746 nla_put(msg, NL80211_ATTR_SCAN_START_TIME_TSF_BSSID, ETH_ALEN, 20747 info->tsf_bssid))) 20748 goto nla_put_failure; 20749 20750 return 0; 20751 nla_put_failure: 20752 return -ENOBUFS; 20753 } 20754 20755 static int nl80211_prep_scan_msg(struct sk_buff *msg, 20756 struct cfg80211_registered_device *rdev, 20757 struct wireless_dev *wdev, 20758 u32 portid, u32 seq, int flags, 20759 u32 cmd) 20760 { 20761 void *hdr; 20762 20763 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 20764 if (!hdr) 20765 return -1; 20766 20767 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20768 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 20769 wdev->netdev->ifindex)) || 20770 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 20771 NL80211_ATTR_PAD)) 20772 goto nla_put_failure; 20773 20774 /* ignore errors and send incomplete event anyway */ 20775 nl80211_add_scan_req(msg, rdev); 20776 20777 genlmsg_end(msg, hdr); 20778 return 0; 20779 20780 nla_put_failure: 20781 genlmsg_cancel(msg, hdr); 20782 return -EMSGSIZE; 20783 } 20784 20785 static int 20786 nl80211_prep_sched_scan_msg(struct sk_buff *msg, 20787 struct cfg80211_sched_scan_request *req, u32 cmd) 20788 { 20789 void *hdr; 20790 20791 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 20792 if (!hdr) 20793 return -1; 20794 20795 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, 20796 wiphy_to_rdev(req->wiphy)->wiphy_idx) || 20797 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) || 20798 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid, 20799 NL80211_ATTR_PAD)) 20800 goto nla_put_failure; 20801 20802 genlmsg_end(msg, hdr); 20803 return 0; 20804 20805 nla_put_failure: 20806 genlmsg_cancel(msg, hdr); 20807 return -EMSGSIZE; 20808 } 20809 20810 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev, 20811 struct wireless_dev *wdev) 20812 { 20813 struct sk_buff *msg; 20814 20815 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20816 if (!msg) 20817 return; 20818 20819 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0, 20820 NL80211_CMD_TRIGGER_SCAN) < 0) { 20821 nlmsg_free(msg); 20822 return; 20823 } 20824 20825 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20826 NL80211_MCGRP_SCAN, GFP_KERNEL); 20827 } 20828 20829 struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev, 20830 struct wireless_dev *wdev, bool aborted) 20831 { 20832 struct sk_buff *msg; 20833 20834 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20835 if (!msg) 20836 return NULL; 20837 20838 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0, 20839 aborted ? NL80211_CMD_SCAN_ABORTED : 20840 NL80211_CMD_NEW_SCAN_RESULTS) < 0) { 20841 nlmsg_free(msg); 20842 return NULL; 20843 } 20844 20845 return msg; 20846 } 20847 20848 /* send message created by nl80211_build_scan_msg() */ 20849 void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev, 20850 struct sk_buff *msg) 20851 { 20852 if (!msg) 20853 return; 20854 20855 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20856 NL80211_MCGRP_SCAN, GFP_KERNEL); 20857 } 20858 20859 void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd) 20860 { 20861 struct sk_buff *msg; 20862 20863 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20864 if (!msg) 20865 return; 20866 20867 if (nl80211_prep_sched_scan_msg(msg, req, cmd) < 0) { 20868 nlmsg_free(msg); 20869 return; 20870 } 20871 20872 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0, 20873 NL80211_MCGRP_SCAN, GFP_KERNEL); 20874 } 20875 20876 static bool nl80211_reg_change_event_fill(struct sk_buff *msg, 20877 struct regulatory_request *request) 20878 { 20879 /* Userspace can always count this one always being set */ 20880 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) 20881 goto nla_put_failure; 20882 20883 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { 20884 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 20885 NL80211_REGDOM_TYPE_WORLD)) 20886 goto nla_put_failure; 20887 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { 20888 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 20889 NL80211_REGDOM_TYPE_CUSTOM_WORLD)) 20890 goto nla_put_failure; 20891 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || 20892 request->intersect) { 20893 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 20894 NL80211_REGDOM_TYPE_INTERSECTION)) 20895 goto nla_put_failure; 20896 } else { 20897 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 20898 NL80211_REGDOM_TYPE_COUNTRY) || 20899 nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, 20900 request->alpha2)) 20901 goto nla_put_failure; 20902 } 20903 20904 if (request->wiphy_idx != WIPHY_IDX_INVALID) { 20905 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx); 20906 20907 if (wiphy && 20908 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) 20909 goto nla_put_failure; 20910 20911 if (wiphy && 20912 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 20913 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 20914 goto nla_put_failure; 20915 } 20916 20917 return true; 20918 20919 nla_put_failure: 20920 return false; 20921 } 20922 20923 /* 20924 * This can happen on global regulatory changes or device specific settings 20925 * based on custom regulatory domains. 20926 */ 20927 void nl80211_common_reg_change_event(enum nl80211_commands cmd_id, 20928 struct regulatory_request *request) 20929 { 20930 struct sk_buff *msg; 20931 void *hdr; 20932 20933 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20934 if (!msg) 20935 return; 20936 20937 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd_id); 20938 if (!hdr) 20939 goto nla_put_failure; 20940 20941 if (!nl80211_reg_change_event_fill(msg, request)) 20942 goto nla_put_failure; 20943 20944 genlmsg_end(msg, hdr); 20945 20946 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 20947 NL80211_MCGRP_REGULATORY); 20948 20949 return; 20950 20951 nla_put_failure: 20952 nlmsg_free(msg); 20953 } 20954 20955 struct nl80211_mlme_event { 20956 enum nl80211_commands cmd; 20957 const u8 *buf; 20958 size_t buf_len; 20959 int uapsd_queues; 20960 const u8 *req_ies; 20961 size_t req_ies_len; 20962 bool reconnect; 20963 }; 20964 20965 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev, 20966 struct net_device *netdev, 20967 const struct nl80211_mlme_event *event, 20968 gfp_t gfp) 20969 { 20970 struct sk_buff *msg; 20971 void *hdr; 20972 20973 msg = nlmsg_new(100 + event->buf_len + event->req_ies_len, gfp); 20974 if (!msg) 20975 return; 20976 20977 hdr = nl80211hdr_put(msg, 0, 0, 0, event->cmd); 20978 if (!hdr) { 20979 nlmsg_free(msg); 20980 return; 20981 } 20982 20983 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20984 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 20985 nla_put(msg, NL80211_ATTR_FRAME, event->buf_len, event->buf) || 20986 (event->req_ies && 20987 nla_put(msg, NL80211_ATTR_REQ_IE, event->req_ies_len, 20988 event->req_ies))) 20989 goto nla_put_failure; 20990 20991 if (event->reconnect && 20992 nla_put_flag(msg, NL80211_ATTR_RECONNECT_REQUESTED)) 20993 goto nla_put_failure; 20994 20995 if (event->uapsd_queues >= 0) { 20996 struct nlattr *nla_wmm = 20997 nla_nest_start_noflag(msg, NL80211_ATTR_STA_WME); 20998 if (!nla_wmm) 20999 goto nla_put_failure; 21000 21001 if (nla_put_u8(msg, NL80211_STA_WME_UAPSD_QUEUES, 21002 event->uapsd_queues)) 21003 goto nla_put_failure; 21004 21005 nla_nest_end(msg, nla_wmm); 21006 } 21007 21008 genlmsg_end(msg, hdr); 21009 21010 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21011 NL80211_MCGRP_MLME, gfp); 21012 return; 21013 21014 nla_put_failure: 21015 nlmsg_free(msg); 21016 } 21017 21018 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev, 21019 struct net_device *netdev, const u8 *buf, 21020 size_t len, gfp_t gfp) 21021 { 21022 struct nl80211_mlme_event event = { 21023 .cmd = NL80211_CMD_AUTHENTICATE, 21024 .buf = buf, 21025 .buf_len = len, 21026 .uapsd_queues = -1, 21027 }; 21028 21029 nl80211_send_mlme_event(rdev, netdev, &event, gfp); 21030 } 21031 21032 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev, 21033 struct net_device *netdev, 21034 const struct cfg80211_rx_assoc_resp_data *data) 21035 { 21036 struct nl80211_mlme_event event = { 21037 .cmd = NL80211_CMD_ASSOCIATE, 21038 .buf = data->buf, 21039 .buf_len = data->len, 21040 .uapsd_queues = data->uapsd_queues, 21041 .req_ies = data->req_ies, 21042 .req_ies_len = data->req_ies_len, 21043 }; 21044 21045 nl80211_send_mlme_event(rdev, netdev, &event, GFP_KERNEL); 21046 } 21047 21048 void nl80211_send_deauth(struct cfg80211_registered_device *rdev, 21049 struct net_device *netdev, const u8 *buf, 21050 size_t len, bool reconnect, gfp_t gfp) 21051 { 21052 struct nl80211_mlme_event event = { 21053 .cmd = NL80211_CMD_DEAUTHENTICATE, 21054 .buf = buf, 21055 .buf_len = len, 21056 .reconnect = reconnect, 21057 .uapsd_queues = -1, 21058 }; 21059 21060 nl80211_send_mlme_event(rdev, netdev, &event, gfp); 21061 } 21062 21063 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev, 21064 struct net_device *netdev, const u8 *buf, 21065 size_t len, bool reconnect, gfp_t gfp) 21066 { 21067 struct nl80211_mlme_event event = { 21068 .cmd = NL80211_CMD_DISASSOCIATE, 21069 .buf = buf, 21070 .buf_len = len, 21071 .reconnect = reconnect, 21072 .uapsd_queues = -1, 21073 }; 21074 21075 nl80211_send_mlme_event(rdev, netdev, &event, gfp); 21076 } 21077 21078 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf, 21079 size_t len) 21080 { 21081 struct wireless_dev *wdev = dev->ieee80211_ptr; 21082 struct wiphy *wiphy = wdev->wiphy; 21083 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21084 const struct ieee80211_mgmt *mgmt = (void *)buf; 21085 struct nl80211_mlme_event event = { 21086 .buf = buf, 21087 .buf_len = len, 21088 .uapsd_queues = -1, 21089 }; 21090 21091 if (WARN_ON(len < 2)) 21092 return; 21093 21094 if (ieee80211_is_deauth(mgmt->frame_control)) { 21095 event.cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE; 21096 } else if (ieee80211_is_disassoc(mgmt->frame_control)) { 21097 event.cmd = NL80211_CMD_UNPROT_DISASSOCIATE; 21098 } else if (ieee80211_is_beacon(mgmt->frame_control)) { 21099 if (wdev->iftype == NL80211_IFTYPE_AP || 21100 wdev->iftype == NL80211_IFTYPE_P2P_GO) 21101 return; 21102 if (wdev->unprot_beacon_reported && 21103 elapsed_jiffies_msecs(wdev->unprot_beacon_reported) < 10000) 21104 return; 21105 event.cmd = NL80211_CMD_UNPROT_BEACON; 21106 wdev->unprot_beacon_reported = jiffies; 21107 } else { 21108 return; 21109 } 21110 21111 trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len); 21112 nl80211_send_mlme_event(rdev, dev, &event, GFP_ATOMIC); 21113 } 21114 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt); 21115 21116 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev, 21117 struct net_device *netdev, int cmd, 21118 const u8 *addr, gfp_t gfp) 21119 { 21120 struct sk_buff *msg; 21121 void *hdr; 21122 21123 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21124 if (!msg) 21125 return; 21126 21127 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 21128 if (!hdr) { 21129 nlmsg_free(msg); 21130 return; 21131 } 21132 21133 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21134 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21135 nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 21136 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) 21137 goto nla_put_failure; 21138 21139 genlmsg_end(msg, hdr); 21140 21141 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21142 NL80211_MCGRP_MLME, gfp); 21143 return; 21144 21145 nla_put_failure: 21146 nlmsg_free(msg); 21147 } 21148 21149 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev, 21150 struct net_device *netdev, const u8 *addr, 21151 gfp_t gfp) 21152 { 21153 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE, 21154 addr, gfp); 21155 } 21156 21157 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev, 21158 struct net_device *netdev, const u8 *addr, 21159 gfp_t gfp) 21160 { 21161 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE, 21162 addr, gfp); 21163 } 21164 21165 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev, 21166 struct net_device *netdev, 21167 struct cfg80211_connect_resp_params *cr, 21168 gfp_t gfp) 21169 { 21170 struct sk_buff *msg; 21171 void *hdr; 21172 unsigned int link; 21173 size_t link_info_size = 0; 21174 const u8 *connected_addr = cr->valid_links ? 21175 cr->ap_mld_addr : cr->links[0].bssid; 21176 21177 if (cr->valid_links) { 21178 for_each_valid_link(cr, link) { 21179 /* Nested attribute header */ 21180 link_info_size += NLA_HDRLEN; 21181 /* Link ID */ 21182 link_info_size += nla_total_size(sizeof(u8)); 21183 link_info_size += cr->links[link].addr ? 21184 nla_total_size(ETH_ALEN) : 0; 21185 link_info_size += (cr->links[link].bssid || 21186 cr->links[link].bss) ? 21187 nla_total_size(ETH_ALEN) : 0; 21188 link_info_size += nla_total_size(sizeof(u16)); 21189 } 21190 } 21191 21192 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len + 21193 cr->fils.kek_len + cr->fils.pmk_len + 21194 (cr->fils.pmkid ? WLAN_PMKID_LEN : 0) + link_info_size, 21195 gfp); 21196 if (!msg) 21197 return; 21198 21199 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT); 21200 if (!hdr) { 21201 nlmsg_free(msg); 21202 return; 21203 } 21204 21205 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21206 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21207 (connected_addr && 21208 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, connected_addr)) || 21209 nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, 21210 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE : 21211 cr->status) || 21212 (cr->status < 0 && 21213 (nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 21214 nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON, 21215 cr->timeout_reason))) || 21216 (cr->req_ie && 21217 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) || 21218 (cr->resp_ie && 21219 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len, 21220 cr->resp_ie)) || 21221 (cr->fils.update_erp_next_seq_num && 21222 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM, 21223 cr->fils.erp_next_seq_num)) || 21224 (cr->status == WLAN_STATUS_SUCCESS && 21225 ((cr->fils.kek && 21226 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len, 21227 cr->fils.kek)) || 21228 (cr->fils.pmk && 21229 nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) || 21230 (cr->fils.pmkid && 21231 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid)))) || 21232 (cr->assoc_encrypted && 21233 nla_put_flag(msg, NL80211_ATTR_ASSOC_ENCRYPTED))) 21234 goto nla_put_failure; 21235 21236 if (cr->valid_links) { 21237 int i = 1; 21238 struct nlattr *nested; 21239 21240 nested = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 21241 if (!nested) 21242 goto nla_put_failure; 21243 21244 for_each_valid_link(cr, link) { 21245 struct nlattr *nested_mlo_links; 21246 const u8 *bssid = cr->links[link].bss ? 21247 cr->links[link].bss->bssid : 21248 cr->links[link].bssid; 21249 21250 nested_mlo_links = nla_nest_start(msg, i); 21251 if (!nested_mlo_links) 21252 goto nla_put_failure; 21253 21254 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link) || 21255 (bssid && 21256 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, bssid)) || 21257 (cr->links[link].addr && 21258 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 21259 cr->links[link].addr)) || 21260 nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, 21261 cr->links[link].status)) 21262 goto nla_put_failure; 21263 21264 nla_nest_end(msg, nested_mlo_links); 21265 i++; 21266 } 21267 nla_nest_end(msg, nested); 21268 } 21269 21270 genlmsg_end(msg, hdr); 21271 21272 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21273 NL80211_MCGRP_MLME, gfp); 21274 return; 21275 21276 nla_put_failure: 21277 nlmsg_free(msg); 21278 } 21279 21280 void nl80211_send_roamed(struct cfg80211_registered_device *rdev, 21281 struct net_device *netdev, 21282 struct cfg80211_roam_info *info, gfp_t gfp) 21283 { 21284 struct sk_buff *msg; 21285 void *hdr; 21286 size_t link_info_size = 0; 21287 unsigned int link; 21288 const u8 *connected_addr = info->ap_mld_addr ? 21289 info->ap_mld_addr : 21290 (info->links[0].bss ? 21291 info->links[0].bss->bssid : 21292 info->links[0].bssid); 21293 21294 if (info->valid_links) { 21295 for_each_valid_link(info, link) { 21296 /* Nested attribute header */ 21297 link_info_size += NLA_HDRLEN; 21298 /* Link ID */ 21299 link_info_size += nla_total_size(sizeof(u8)); 21300 link_info_size += info->links[link].addr ? 21301 nla_total_size(ETH_ALEN) : 0; 21302 link_info_size += (info->links[link].bssid || 21303 info->links[link].bss) ? 21304 nla_total_size(ETH_ALEN) : 0; 21305 } 21306 } 21307 21308 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len + 21309 info->fils.kek_len + info->fils.pmk_len + 21310 (info->fils.pmkid ? WLAN_PMKID_LEN : 0) + 21311 link_info_size, gfp); 21312 if (!msg) 21313 return; 21314 21315 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM); 21316 if (!hdr) { 21317 nlmsg_free(msg); 21318 return; 21319 } 21320 21321 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21322 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21323 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, connected_addr) || 21324 (info->req_ie && 21325 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len, 21326 info->req_ie)) || 21327 (info->resp_ie && 21328 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len, 21329 info->resp_ie)) || 21330 (info->fils.update_erp_next_seq_num && 21331 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM, 21332 info->fils.erp_next_seq_num)) || 21333 (info->fils.kek && 21334 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len, 21335 info->fils.kek)) || 21336 (info->fils.pmk && 21337 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) || 21338 (info->fils.pmkid && 21339 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid))) 21340 goto nla_put_failure; 21341 21342 if (info->valid_links) { 21343 int i = 1; 21344 struct nlattr *nested; 21345 21346 nested = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 21347 if (!nested) 21348 goto nla_put_failure; 21349 21350 for_each_valid_link(info, link) { 21351 struct nlattr *nested_mlo_links; 21352 const u8 *bssid = info->links[link].bss ? 21353 info->links[link].bss->bssid : 21354 info->links[link].bssid; 21355 21356 nested_mlo_links = nla_nest_start(msg, i); 21357 if (!nested_mlo_links) 21358 goto nla_put_failure; 21359 21360 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link) || 21361 (bssid && 21362 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, bssid)) || 21363 (info->links[link].addr && 21364 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 21365 info->links[link].addr))) 21366 goto nla_put_failure; 21367 21368 nla_nest_end(msg, nested_mlo_links); 21369 i++; 21370 } 21371 nla_nest_end(msg, nested); 21372 } 21373 21374 genlmsg_end(msg, hdr); 21375 21376 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21377 NL80211_MCGRP_MLME, gfp); 21378 return; 21379 21380 nla_put_failure: 21381 nlmsg_free(msg); 21382 } 21383 21384 void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev, 21385 struct net_device *netdev, const u8 *peer_addr, 21386 const u8 *td_bitmap, u8 td_bitmap_len) 21387 { 21388 struct sk_buff *msg; 21389 void *hdr; 21390 21391 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 21392 if (!msg) 21393 return; 21394 21395 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PORT_AUTHORIZED); 21396 if (!hdr) { 21397 nlmsg_free(msg); 21398 return; 21399 } 21400 21401 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21402 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21403 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer_addr)) 21404 goto nla_put_failure; 21405 21406 if (td_bitmap_len > 0 && td_bitmap && 21407 nla_put(msg, NL80211_ATTR_TD_BITMAP, td_bitmap_len, td_bitmap)) 21408 goto nla_put_failure; 21409 21410 genlmsg_end(msg, hdr); 21411 21412 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21413 NL80211_MCGRP_MLME, GFP_KERNEL); 21414 return; 21415 21416 nla_put_failure: 21417 nlmsg_free(msg); 21418 } 21419 21420 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev, 21421 struct net_device *netdev, u16 reason, 21422 const u8 *ie, size_t ie_len, bool from_ap) 21423 { 21424 struct sk_buff *msg; 21425 void *hdr; 21426 21427 msg = nlmsg_new(100 + ie_len, GFP_KERNEL); 21428 if (!msg) 21429 return; 21430 21431 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT); 21432 if (!hdr) { 21433 nlmsg_free(msg); 21434 return; 21435 } 21436 21437 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21438 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21439 (reason && 21440 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) || 21441 (from_ap && 21442 nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) || 21443 (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie))) 21444 goto nla_put_failure; 21445 21446 genlmsg_end(msg, hdr); 21447 21448 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21449 NL80211_MCGRP_MLME, GFP_KERNEL); 21450 return; 21451 21452 nla_put_failure: 21453 nlmsg_free(msg); 21454 } 21455 21456 void cfg80211_links_removed(struct net_device *dev, u16 link_mask) 21457 { 21458 struct wireless_dev *wdev = dev->ieee80211_ptr; 21459 struct wiphy *wiphy = wdev->wiphy; 21460 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21461 struct sk_buff *msg; 21462 struct nlattr *links; 21463 void *hdr; 21464 21465 lockdep_assert_wiphy(wdev->wiphy); 21466 trace_cfg80211_links_removed(dev, link_mask); 21467 21468 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION && 21469 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)) 21470 return; 21471 21472 if (WARN_ON(!wdev->valid_links || !link_mask || 21473 (wdev->valid_links & link_mask) != link_mask || 21474 wdev->valid_links == link_mask)) 21475 return; 21476 21477 cfg80211_wdev_release_link_bsses(wdev, link_mask); 21478 wdev->valid_links &= ~link_mask; 21479 21480 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 21481 if (!msg) 21482 return; 21483 21484 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_LINKS_REMOVED); 21485 if (!hdr) { 21486 nlmsg_free(msg); 21487 return; 21488 } 21489 21490 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21491 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 21492 goto nla_put_failure; 21493 21494 links = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 21495 if (!links) 21496 goto nla_put_failure; 21497 21498 while (link_mask) { 21499 struct nlattr *link; 21500 int link_id = __ffs(link_mask); 21501 21502 link = nla_nest_start(msg, link_id + 1); 21503 if (!link) 21504 goto nla_put_failure; 21505 21506 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 21507 goto nla_put_failure; 21508 21509 nla_nest_end(msg, link); 21510 link_mask &= ~(1 << link_id); 21511 } 21512 21513 nla_nest_end(msg, links); 21514 21515 genlmsg_end(msg, hdr); 21516 21517 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21518 NL80211_MCGRP_MLME, GFP_KERNEL); 21519 return; 21520 21521 nla_put_failure: 21522 nlmsg_free(msg); 21523 } 21524 EXPORT_SYMBOL(cfg80211_links_removed); 21525 21526 void nl80211_mlo_reconf_add_done(struct net_device *dev, 21527 struct cfg80211_mlo_reconf_done_data *data) 21528 { 21529 struct wireless_dev *wdev = dev->ieee80211_ptr; 21530 struct wiphy *wiphy = wdev->wiphy; 21531 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21532 struct nl80211_mlme_event event = { 21533 .cmd = NL80211_CMD_ASSOC_MLO_RECONF, 21534 .buf = data->buf, 21535 .buf_len = data->len, 21536 .uapsd_queues = -1, 21537 }; 21538 21539 nl80211_send_mlme_event(rdev, dev, &event, GFP_KERNEL); 21540 } 21541 EXPORT_SYMBOL(nl80211_mlo_reconf_add_done); 21542 21543 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev, 21544 struct net_device *netdev, const u8 *bssid, 21545 gfp_t gfp) 21546 { 21547 struct sk_buff *msg; 21548 void *hdr; 21549 21550 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21551 if (!msg) 21552 return; 21553 21554 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS); 21555 if (!hdr) { 21556 nlmsg_free(msg); 21557 return; 21558 } 21559 21560 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21561 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21562 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 21563 goto nla_put_failure; 21564 21565 genlmsg_end(msg, hdr); 21566 21567 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21568 NL80211_MCGRP_MLME, gfp); 21569 return; 21570 21571 nla_put_failure: 21572 nlmsg_free(msg); 21573 } 21574 21575 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr, 21576 const u8 *ie, size_t ie_len, 21577 int sig_dbm, gfp_t gfp) 21578 { 21579 struct wireless_dev *wdev = dev->ieee80211_ptr; 21580 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 21581 struct sk_buff *msg; 21582 void *hdr; 21583 21584 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) 21585 return; 21586 21587 trace_cfg80211_notify_new_peer_candidate(dev, addr); 21588 21589 msg = nlmsg_new(100 + ie_len, gfp); 21590 if (!msg) 21591 return; 21592 21593 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE); 21594 if (!hdr) { 21595 nlmsg_free(msg); 21596 return; 21597 } 21598 21599 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21600 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 21601 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 21602 (ie_len && ie && 21603 nla_put(msg, NL80211_ATTR_IE, ie_len, ie)) || 21604 (sig_dbm && 21605 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm))) 21606 goto nla_put_failure; 21607 21608 genlmsg_end(msg, hdr); 21609 21610 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21611 NL80211_MCGRP_MLME, gfp); 21612 return; 21613 21614 nla_put_failure: 21615 nlmsg_free(msg); 21616 } 21617 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate); 21618 21619 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev, 21620 struct net_device *netdev, const u8 *addr, 21621 enum nl80211_key_type key_type, int key_id, 21622 const u8 *tsc, gfp_t gfp) 21623 { 21624 struct sk_buff *msg; 21625 void *hdr; 21626 21627 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21628 if (!msg) 21629 return; 21630 21631 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE); 21632 if (!hdr) { 21633 nlmsg_free(msg); 21634 return; 21635 } 21636 21637 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21638 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21639 (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) || 21640 nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) || 21641 (key_id != -1 && 21642 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) || 21643 (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc))) 21644 goto nla_put_failure; 21645 21646 genlmsg_end(msg, hdr); 21647 21648 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21649 NL80211_MCGRP_MLME, gfp); 21650 return; 21651 21652 nla_put_failure: 21653 nlmsg_free(msg); 21654 } 21655 21656 void nl80211_send_beacon_hint_event(struct wiphy *wiphy, 21657 struct ieee80211_channel *channel_before, 21658 struct ieee80211_channel *channel_after) 21659 { 21660 struct sk_buff *msg; 21661 void *hdr; 21662 struct nlattr *nl_freq; 21663 21664 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); 21665 if (!msg) 21666 return; 21667 21668 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT); 21669 if (!hdr) { 21670 nlmsg_free(msg); 21671 return; 21672 } 21673 21674 /* 21675 * Since we are applying the beacon hint to a wiphy we know its 21676 * wiphy_idx is valid 21677 */ 21678 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 21679 goto nla_put_failure; 21680 21681 /* Before */ 21682 nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_BEFORE); 21683 if (!nl_freq) 21684 goto nla_put_failure; 21685 21686 if (nl80211_msg_put_channel(msg, wiphy, channel_before, false)) 21687 goto nla_put_failure; 21688 nla_nest_end(msg, nl_freq); 21689 21690 /* After */ 21691 nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_AFTER); 21692 if (!nl_freq) 21693 goto nla_put_failure; 21694 21695 if (nl80211_msg_put_channel(msg, wiphy, channel_after, false)) 21696 goto nla_put_failure; 21697 nla_nest_end(msg, nl_freq); 21698 21699 genlmsg_end(msg, hdr); 21700 21701 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 21702 NL80211_MCGRP_REGULATORY); 21703 21704 return; 21705 21706 nla_put_failure: 21707 nlmsg_free(msg); 21708 } 21709 21710 static void nl80211_send_remain_on_chan_event( 21711 int cmd, struct cfg80211_registered_device *rdev, 21712 struct wireless_dev *wdev, u64 cookie, 21713 struct ieee80211_channel *chan, 21714 unsigned int duration, gfp_t gfp) 21715 { 21716 struct sk_buff *msg; 21717 void *hdr; 21718 21719 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21720 if (!msg) 21721 return; 21722 21723 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 21724 if (!hdr) { 21725 nlmsg_free(msg); 21726 return; 21727 } 21728 21729 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21730 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 21731 wdev->netdev->ifindex)) || 21732 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 21733 NL80211_ATTR_PAD) || 21734 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || 21735 nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 21736 NL80211_CHAN_NO_HT) || 21737 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 21738 NL80211_ATTR_PAD)) 21739 goto nla_put_failure; 21740 21741 if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL && 21742 nla_put_u32(msg, NL80211_ATTR_DURATION, duration)) 21743 goto nla_put_failure; 21744 21745 genlmsg_end(msg, hdr); 21746 21747 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21748 NL80211_MCGRP_MLME, gfp); 21749 return; 21750 21751 nla_put_failure: 21752 nlmsg_free(msg); 21753 } 21754 21755 void cfg80211_assoc_comeback(struct net_device *netdev, 21756 const u8 *ap_addr, u32 timeout) 21757 { 21758 struct wireless_dev *wdev = netdev->ieee80211_ptr; 21759 struct wiphy *wiphy = wdev->wiphy; 21760 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21761 struct sk_buff *msg; 21762 void *hdr; 21763 21764 trace_cfg80211_assoc_comeback(wdev, ap_addr, timeout); 21765 21766 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 21767 if (!msg) 21768 return; 21769 21770 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ASSOC_COMEBACK); 21771 if (!hdr) { 21772 nlmsg_free(msg); 21773 return; 21774 } 21775 21776 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21777 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21778 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ap_addr) || 21779 nla_put_u32(msg, NL80211_ATTR_TIMEOUT, timeout)) 21780 goto nla_put_failure; 21781 21782 genlmsg_end(msg, hdr); 21783 21784 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21785 NL80211_MCGRP_MLME, GFP_KERNEL); 21786 return; 21787 21788 nla_put_failure: 21789 nlmsg_free(msg); 21790 } 21791 EXPORT_SYMBOL(cfg80211_assoc_comeback); 21792 21793 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie, 21794 struct ieee80211_channel *chan, 21795 unsigned int duration, gfp_t gfp) 21796 { 21797 struct wiphy *wiphy = wdev->wiphy; 21798 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21799 21800 trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration); 21801 nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL, 21802 rdev, wdev, cookie, chan, 21803 duration, gfp); 21804 } 21805 EXPORT_SYMBOL(cfg80211_ready_on_channel); 21806 21807 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie, 21808 struct ieee80211_channel *chan, 21809 gfp_t gfp) 21810 { 21811 struct wiphy *wiphy = wdev->wiphy; 21812 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21813 21814 trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan); 21815 nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 21816 rdev, wdev, cookie, chan, 0, gfp); 21817 } 21818 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired); 21819 21820 void cfg80211_tx_mgmt_expired(struct wireless_dev *wdev, u64 cookie, 21821 struct ieee80211_channel *chan, 21822 gfp_t gfp) 21823 { 21824 struct wiphy *wiphy = wdev->wiphy; 21825 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21826 21827 trace_cfg80211_tx_mgmt_expired(wdev, cookie, chan); 21828 nl80211_send_remain_on_chan_event(NL80211_CMD_FRAME_WAIT_CANCEL, 21829 rdev, wdev, cookie, chan, 0, gfp); 21830 } 21831 EXPORT_SYMBOL(cfg80211_tx_mgmt_expired); 21832 21833 void cfg80211_new_sta(struct wireless_dev *wdev, const u8 *mac_addr, 21834 struct station_info *sinfo, gfp_t gfp) 21835 { 21836 struct wiphy *wiphy = wdev->wiphy; 21837 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21838 struct sk_buff *msg; 21839 21840 trace_cfg80211_new_sta(wdev, mac_addr, sinfo); 21841 21842 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21843 if (!msg) 21844 return; 21845 21846 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 0, 0, 0, 21847 rdev, wdev, mac_addr, sinfo) < 0) { 21848 nlmsg_free(msg); 21849 return; 21850 } 21851 21852 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21853 NL80211_MCGRP_MLME, gfp); 21854 } 21855 EXPORT_SYMBOL(cfg80211_new_sta); 21856 21857 void cfg80211_del_sta_sinfo(struct wireless_dev *wdev, const u8 *mac_addr, 21858 struct station_info *sinfo, gfp_t gfp) 21859 { 21860 struct wiphy *wiphy = wdev->wiphy; 21861 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21862 struct sk_buff *msg; 21863 struct station_info empty_sinfo = {}; 21864 21865 if (!sinfo) 21866 sinfo = &empty_sinfo; 21867 21868 trace_cfg80211_del_sta(wdev, mac_addr); 21869 21870 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21871 if (!msg) { 21872 cfg80211_sinfo_release_content(sinfo); 21873 return; 21874 } 21875 21876 if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0, 21877 rdev, wdev, mac_addr, sinfo) < 0) { 21878 nlmsg_free(msg); 21879 return; 21880 } 21881 21882 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21883 NL80211_MCGRP_MLME, gfp); 21884 } 21885 EXPORT_SYMBOL(cfg80211_del_sta_sinfo); 21886 21887 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr, 21888 enum nl80211_connect_failed_reason reason, 21889 gfp_t gfp) 21890 { 21891 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 21892 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21893 struct sk_buff *msg; 21894 void *hdr; 21895 21896 msg = nlmsg_new(NLMSG_GOODSIZE, gfp); 21897 if (!msg) 21898 return; 21899 21900 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED); 21901 if (!hdr) { 21902 nlmsg_free(msg); 21903 return; 21904 } 21905 21906 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 21907 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 21908 nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason)) 21909 goto nla_put_failure; 21910 21911 genlmsg_end(msg, hdr); 21912 21913 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21914 NL80211_MCGRP_MLME, gfp); 21915 return; 21916 21917 nla_put_failure: 21918 nlmsg_free(msg); 21919 } 21920 EXPORT_SYMBOL(cfg80211_conn_failed); 21921 21922 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd, 21923 const u8 *addr, int link_id, gfp_t gfp) 21924 { 21925 struct wireless_dev *wdev = dev->ieee80211_ptr; 21926 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 21927 struct sk_buff *msg; 21928 void *hdr; 21929 u32 nlportid = READ_ONCE(wdev->unexpected_nlportid); 21930 21931 if (!nlportid) 21932 return false; 21933 21934 msg = nlmsg_new(100, gfp); 21935 if (!msg) 21936 return true; 21937 21938 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 21939 if (!hdr) { 21940 nlmsg_free(msg); 21941 return true; 21942 } 21943 21944 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21945 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 21946 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 21947 (link_id >= 0 && 21948 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))) 21949 goto nla_put_failure; 21950 21951 genlmsg_end(msg, hdr); 21952 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 21953 return true; 21954 21955 nla_put_failure: 21956 nlmsg_free(msg); 21957 return true; 21958 } 21959 21960 bool cfg80211_rx_spurious_frame(struct net_device *dev, const u8 *addr, 21961 int link_id, gfp_t gfp) 21962 { 21963 struct wireless_dev *wdev = dev->ieee80211_ptr; 21964 bool ret; 21965 21966 trace_cfg80211_rx_spurious_frame(dev, addr, link_id); 21967 21968 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 21969 wdev->iftype != NL80211_IFTYPE_P2P_GO && 21970 wdev->iftype != NL80211_IFTYPE_NAN_DATA)) { 21971 trace_cfg80211_return_bool(false); 21972 return false; 21973 } 21974 ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME, 21975 addr, link_id, gfp); 21976 trace_cfg80211_return_bool(ret); 21977 return ret; 21978 } 21979 EXPORT_SYMBOL(cfg80211_rx_spurious_frame); 21980 21981 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev, const u8 *addr, 21982 int link_id, gfp_t gfp) 21983 { 21984 struct wireless_dev *wdev = dev->ieee80211_ptr; 21985 bool ret; 21986 21987 trace_cfg80211_rx_unexpected_4addr_frame(dev, addr, link_id); 21988 21989 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 21990 wdev->iftype != NL80211_IFTYPE_P2P_GO && 21991 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { 21992 trace_cfg80211_return_bool(false); 21993 return false; 21994 } 21995 ret = __nl80211_unexpected_frame(dev, 21996 NL80211_CMD_UNEXPECTED_4ADDR_FRAME, 21997 addr, link_id, gfp); 21998 trace_cfg80211_return_bool(ret); 21999 return ret; 22000 } 22001 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame); 22002 22003 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, 22004 struct wireless_dev *wdev, u32 nlportid, 22005 struct cfg80211_rx_info *info, gfp_t gfp) 22006 { 22007 struct net_device *netdev = wdev->netdev; 22008 struct sk_buff *msg; 22009 void *hdr; 22010 22011 msg = nlmsg_new(100 + info->len, gfp); 22012 if (!msg) 22013 return -ENOMEM; 22014 22015 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 22016 if (!hdr) { 22017 nlmsg_free(msg); 22018 return -ENOMEM; 22019 } 22020 22021 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22022 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 22023 netdev->ifindex)) || 22024 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22025 NL80211_ATTR_PAD) || 22026 (info->have_link_id && 22027 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, info->link_id)) || 22028 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, KHZ_TO_MHZ(info->freq)) || 22029 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, info->freq % 1000) || 22030 (info->sig_dbm && 22031 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, info->sig_dbm)) || 22032 nla_put(msg, NL80211_ATTR_FRAME, info->len, info->buf) || 22033 (info->flags && 22034 nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, info->flags)) || 22035 (info->rx_tstamp && nla_put_u64_64bit(msg, 22036 NL80211_ATTR_RX_HW_TIMESTAMP, 22037 info->rx_tstamp, 22038 NL80211_ATTR_PAD)) || 22039 (info->ack_tstamp && nla_put_u64_64bit(msg, 22040 NL80211_ATTR_TX_HW_TIMESTAMP, 22041 info->ack_tstamp, 22042 NL80211_ATTR_PAD))) 22043 goto nla_put_failure; 22044 22045 genlmsg_end(msg, hdr); 22046 22047 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 22048 22049 nla_put_failure: 22050 nlmsg_free(msg); 22051 return -ENOBUFS; 22052 } 22053 22054 static void nl80211_frame_tx_status(struct wireless_dev *wdev, 22055 struct cfg80211_tx_status *status, 22056 gfp_t gfp, enum nl80211_commands command) 22057 { 22058 struct wiphy *wiphy = wdev->wiphy; 22059 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22060 struct net_device *netdev = wdev->netdev; 22061 struct sk_buff *msg; 22062 void *hdr; 22063 22064 /* userspace not interested in zero-cookie status */ 22065 if (!status->cookie) 22066 return; 22067 22068 if (command == NL80211_CMD_FRAME_TX_STATUS) 22069 trace_cfg80211_mgmt_tx_status(wdev, status->cookie, 22070 status->ack); 22071 else 22072 trace_cfg80211_control_port_tx_status(wdev, status->cookie, 22073 status->ack); 22074 22075 msg = nlmsg_new(100 + status->len, gfp); 22076 if (!msg) 22077 return; 22078 22079 hdr = nl80211hdr_put(msg, 0, 0, 0, command); 22080 if (!hdr) { 22081 nlmsg_free(msg); 22082 return; 22083 } 22084 22085 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22086 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 22087 netdev->ifindex)) || 22088 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22089 NL80211_ATTR_PAD) || 22090 nla_put(msg, NL80211_ATTR_FRAME, status->len, status->buf) || 22091 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, status->cookie, 22092 NL80211_ATTR_PAD) || 22093 (status->ack && nla_put_flag(msg, NL80211_ATTR_ACK)) || 22094 (status->tx_tstamp && 22095 nla_put_u64_64bit(msg, NL80211_ATTR_TX_HW_TIMESTAMP, 22096 status->tx_tstamp, NL80211_ATTR_PAD)) || 22097 (status->ack_tstamp && 22098 nla_put_u64_64bit(msg, NL80211_ATTR_RX_HW_TIMESTAMP, 22099 status->ack_tstamp, NL80211_ATTR_PAD))) 22100 goto nla_put_failure; 22101 22102 genlmsg_end(msg, hdr); 22103 22104 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22105 NL80211_MCGRP_MLME, gfp); 22106 return; 22107 22108 nla_put_failure: 22109 nlmsg_free(msg); 22110 } 22111 22112 void cfg80211_control_port_tx_status(struct wireless_dev *wdev, u64 cookie, 22113 const u8 *buf, size_t len, bool ack, 22114 gfp_t gfp) 22115 { 22116 struct cfg80211_tx_status status = { 22117 .cookie = cookie, 22118 .buf = buf, 22119 .len = len, 22120 .ack = ack 22121 }; 22122 22123 nl80211_frame_tx_status(wdev, &status, gfp, 22124 NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS); 22125 } 22126 EXPORT_SYMBOL(cfg80211_control_port_tx_status); 22127 22128 void cfg80211_mgmt_tx_status_ext(struct wireless_dev *wdev, 22129 struct cfg80211_tx_status *status, gfp_t gfp) 22130 { 22131 nl80211_frame_tx_status(wdev, status, gfp, NL80211_CMD_FRAME_TX_STATUS); 22132 } 22133 EXPORT_SYMBOL(cfg80211_mgmt_tx_status_ext); 22134 22135 static int __nl80211_rx_control_port(struct net_device *dev, 22136 struct sk_buff *skb, 22137 bool unencrypted, 22138 int link_id, 22139 gfp_t gfp) 22140 { 22141 struct wireless_dev *wdev = dev->ieee80211_ptr; 22142 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22143 struct ethhdr *ehdr = eth_hdr(skb); 22144 const u8 *addr = ehdr->h_source; 22145 u16 proto = be16_to_cpu(skb->protocol); 22146 struct sk_buff *msg; 22147 void *hdr; 22148 struct nlattr *frame; 22149 22150 u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); 22151 22152 if (!nlportid) 22153 return -ENOENT; 22154 22155 msg = nlmsg_new(100 + skb->len, gfp); 22156 if (!msg) 22157 return -ENOMEM; 22158 22159 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONTROL_PORT_FRAME); 22160 if (!hdr) { 22161 nlmsg_free(msg); 22162 return -ENOBUFS; 22163 } 22164 22165 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22166 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 22167 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22168 NL80211_ATTR_PAD) || 22169 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 22170 nla_put_u16(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE, proto) || 22171 (link_id >= 0 && 22172 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) || 22173 (unencrypted && nla_put_flag(msg, 22174 NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT))) 22175 goto nla_put_failure; 22176 22177 frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len); 22178 if (!frame) 22179 goto nla_put_failure; 22180 22181 skb_copy_bits(skb, 0, nla_data(frame), skb->len); 22182 genlmsg_end(msg, hdr); 22183 22184 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 22185 22186 nla_put_failure: 22187 nlmsg_free(msg); 22188 return -ENOBUFS; 22189 } 22190 22191 bool cfg80211_rx_control_port(struct net_device *dev, struct sk_buff *skb, 22192 bool unencrypted, int link_id) 22193 { 22194 int ret; 22195 22196 trace_cfg80211_rx_control_port(dev, skb, unencrypted, link_id); 22197 ret = __nl80211_rx_control_port(dev, skb, unencrypted, link_id, 22198 GFP_ATOMIC); 22199 trace_cfg80211_return_bool(ret == 0); 22200 return ret == 0; 22201 } 22202 EXPORT_SYMBOL(cfg80211_rx_control_port); 22203 22204 static struct sk_buff *cfg80211_prepare_cqm(struct net_device *dev, 22205 const char *mac, gfp_t gfp) 22206 { 22207 struct wireless_dev *wdev = dev->ieee80211_ptr; 22208 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22209 struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22210 void **cb; 22211 22212 if (!msg) 22213 return NULL; 22214 22215 cb = (void **)msg->cb; 22216 22217 cb[0] = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM); 22218 if (!cb[0]) { 22219 nlmsg_free(msg); 22220 return NULL; 22221 } 22222 22223 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22224 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 22225 goto nla_put_failure; 22226 22227 if (mac && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac)) 22228 goto nla_put_failure; 22229 22230 cb[1] = nla_nest_start_noflag(msg, NL80211_ATTR_CQM); 22231 if (!cb[1]) 22232 goto nla_put_failure; 22233 22234 cb[2] = rdev; 22235 22236 return msg; 22237 nla_put_failure: 22238 nlmsg_free(msg); 22239 return NULL; 22240 } 22241 22242 static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp) 22243 { 22244 void **cb = (void **)msg->cb; 22245 struct cfg80211_registered_device *rdev = cb[2]; 22246 22247 nla_nest_end(msg, cb[1]); 22248 genlmsg_end(msg, cb[0]); 22249 22250 memset(msg->cb, 0, sizeof(msg->cb)); 22251 22252 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22253 NL80211_MCGRP_MLME, gfp); 22254 } 22255 22256 void cfg80211_cqm_rssi_notify(struct net_device *dev, 22257 enum nl80211_cqm_rssi_threshold_event rssi_event, 22258 s32 rssi_level, gfp_t gfp) 22259 { 22260 struct wireless_dev *wdev = dev->ieee80211_ptr; 22261 struct cfg80211_cqm_config *cqm_config; 22262 22263 trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level); 22264 22265 if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW && 22266 rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH)) 22267 return; 22268 22269 rcu_read_lock(); 22270 cqm_config = rcu_dereference(wdev->cqm_config); 22271 if (cqm_config) { 22272 cqm_config->last_rssi_event_value = rssi_level; 22273 cqm_config->last_rssi_event_type = rssi_event; 22274 wiphy_work_queue(wdev->wiphy, &wdev->cqm_rssi_work); 22275 } 22276 rcu_read_unlock(); 22277 } 22278 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify); 22279 22280 void cfg80211_cqm_rssi_notify_work(struct wiphy *wiphy, struct wiphy_work *work) 22281 { 22282 struct wireless_dev *wdev = container_of(work, struct wireless_dev, 22283 cqm_rssi_work); 22284 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22285 enum nl80211_cqm_rssi_threshold_event rssi_event; 22286 struct cfg80211_cqm_config *cqm_config; 22287 struct sk_buff *msg; 22288 s32 rssi_level; 22289 22290 cqm_config = wiphy_dereference(wdev->wiphy, wdev->cqm_config); 22291 if (!cqm_config) 22292 return; 22293 22294 if (cqm_config->use_range_api) 22295 cfg80211_cqm_rssi_update(rdev, wdev->netdev, cqm_config); 22296 22297 rssi_level = cqm_config->last_rssi_event_value; 22298 rssi_event = cqm_config->last_rssi_event_type; 22299 22300 msg = cfg80211_prepare_cqm(wdev->netdev, NULL, GFP_KERNEL); 22301 if (!msg) 22302 return; 22303 22304 if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT, 22305 rssi_event)) 22306 goto nla_put_failure; 22307 22308 if (rssi_level && nla_put_s32(msg, NL80211_ATTR_CQM_RSSI_LEVEL, 22309 rssi_level)) 22310 goto nla_put_failure; 22311 22312 cfg80211_send_cqm(msg, GFP_KERNEL); 22313 22314 return; 22315 22316 nla_put_failure: 22317 nlmsg_free(msg); 22318 } 22319 22320 void cfg80211_cqm_txe_notify(struct net_device *dev, 22321 const u8 *peer, u32 num_packets, 22322 u32 rate, u32 intvl, gfp_t gfp) 22323 { 22324 struct sk_buff *msg; 22325 22326 msg = cfg80211_prepare_cqm(dev, peer, gfp); 22327 if (!msg) 22328 return; 22329 22330 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets)) 22331 goto nla_put_failure; 22332 22333 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate)) 22334 goto nla_put_failure; 22335 22336 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl)) 22337 goto nla_put_failure; 22338 22339 cfg80211_send_cqm(msg, gfp); 22340 return; 22341 22342 nla_put_failure: 22343 nlmsg_free(msg); 22344 } 22345 EXPORT_SYMBOL(cfg80211_cqm_txe_notify); 22346 22347 void cfg80211_cqm_pktloss_notify(struct net_device *dev, 22348 const u8 *peer, u32 num_packets, gfp_t gfp) 22349 { 22350 struct sk_buff *msg; 22351 22352 trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets); 22353 22354 msg = cfg80211_prepare_cqm(dev, peer, gfp); 22355 if (!msg) 22356 return; 22357 22358 if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets)) 22359 goto nla_put_failure; 22360 22361 cfg80211_send_cqm(msg, gfp); 22362 return; 22363 22364 nla_put_failure: 22365 nlmsg_free(msg); 22366 } 22367 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify); 22368 22369 void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp) 22370 { 22371 struct sk_buff *msg; 22372 22373 msg = cfg80211_prepare_cqm(dev, NULL, gfp); 22374 if (!msg) 22375 return; 22376 22377 if (nla_put_flag(msg, NL80211_ATTR_CQM_BEACON_LOSS_EVENT)) 22378 goto nla_put_failure; 22379 22380 cfg80211_send_cqm(msg, gfp); 22381 return; 22382 22383 nla_put_failure: 22384 nlmsg_free(msg); 22385 } 22386 EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify); 22387 22388 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev, 22389 struct net_device *netdev, const u8 *bssid, 22390 const u8 *replay_ctr, gfp_t gfp) 22391 { 22392 struct sk_buff *msg; 22393 struct nlattr *rekey_attr; 22394 void *hdr; 22395 22396 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22397 if (!msg) 22398 return; 22399 22400 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD); 22401 if (!hdr) { 22402 nlmsg_free(msg); 22403 return; 22404 } 22405 22406 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22407 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 22408 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 22409 goto nla_put_failure; 22410 22411 rekey_attr = nla_nest_start_noflag(msg, NL80211_ATTR_REKEY_DATA); 22412 if (!rekey_attr) 22413 goto nla_put_failure; 22414 22415 if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR, 22416 NL80211_REPLAY_CTR_LEN, replay_ctr)) 22417 goto nla_put_failure; 22418 22419 nla_nest_end(msg, rekey_attr); 22420 22421 genlmsg_end(msg, hdr); 22422 22423 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22424 NL80211_MCGRP_MLME, gfp); 22425 return; 22426 22427 nla_put_failure: 22428 nlmsg_free(msg); 22429 } 22430 22431 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid, 22432 const u8 *replay_ctr, gfp_t gfp) 22433 { 22434 struct wireless_dev *wdev = dev->ieee80211_ptr; 22435 struct wiphy *wiphy = wdev->wiphy; 22436 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22437 22438 trace_cfg80211_gtk_rekey_notify(dev, bssid); 22439 nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp); 22440 } 22441 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify); 22442 22443 static void 22444 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev, 22445 struct net_device *netdev, int index, 22446 const u8 *bssid, bool preauth, gfp_t gfp) 22447 { 22448 struct sk_buff *msg; 22449 struct nlattr *attr; 22450 void *hdr; 22451 22452 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22453 if (!msg) 22454 return; 22455 22456 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE); 22457 if (!hdr) { 22458 nlmsg_free(msg); 22459 return; 22460 } 22461 22462 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22463 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 22464 goto nla_put_failure; 22465 22466 attr = nla_nest_start_noflag(msg, NL80211_ATTR_PMKSA_CANDIDATE); 22467 if (!attr) 22468 goto nla_put_failure; 22469 22470 if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) || 22471 nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) || 22472 (preauth && 22473 nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH))) 22474 goto nla_put_failure; 22475 22476 nla_nest_end(msg, attr); 22477 22478 genlmsg_end(msg, hdr); 22479 22480 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22481 NL80211_MCGRP_MLME, gfp); 22482 return; 22483 22484 nla_put_failure: 22485 nlmsg_free(msg); 22486 } 22487 22488 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index, 22489 const u8 *bssid, bool preauth, gfp_t gfp) 22490 { 22491 struct wireless_dev *wdev = dev->ieee80211_ptr; 22492 struct wiphy *wiphy = wdev->wiphy; 22493 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22494 22495 trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth); 22496 nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp); 22497 } 22498 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify); 22499 22500 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev, 22501 struct net_device *netdev, 22502 unsigned int link_id, 22503 struct cfg80211_chan_def *chandef, 22504 gfp_t gfp, 22505 enum nl80211_commands notif, 22506 u8 count, bool quiet) 22507 { 22508 struct wireless_dev *wdev = netdev->ieee80211_ptr; 22509 struct sk_buff *msg; 22510 void *hdr; 22511 22512 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22513 if (!msg) 22514 return; 22515 22516 hdr = nl80211hdr_put(msg, 0, 0, 0, notif); 22517 if (!hdr) { 22518 nlmsg_free(msg); 22519 return; 22520 } 22521 22522 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 22523 goto nla_put_failure; 22524 22525 if (wdev->valid_links && 22526 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 22527 goto nla_put_failure; 22528 22529 if (nl80211_send_chandef(msg, chandef)) 22530 goto nla_put_failure; 22531 22532 if (notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) { 22533 if (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count)) 22534 goto nla_put_failure; 22535 if (quiet && 22536 nla_put_flag(msg, NL80211_ATTR_CH_SWITCH_BLOCK_TX)) 22537 goto nla_put_failure; 22538 } 22539 22540 genlmsg_end(msg, hdr); 22541 22542 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22543 NL80211_MCGRP_MLME, gfp); 22544 return; 22545 22546 nla_put_failure: 22547 nlmsg_free(msg); 22548 } 22549 22550 void cfg80211_ch_switch_notify(struct net_device *dev, 22551 struct cfg80211_chan_def *chandef, 22552 unsigned int link_id) 22553 { 22554 struct wireless_dev *wdev = dev->ieee80211_ptr; 22555 struct wiphy *wiphy = wdev->wiphy; 22556 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22557 22558 lockdep_assert_wiphy(wdev->wiphy); 22559 WARN_INVALID_LINK_ID(wdev, link_id); 22560 22561 trace_cfg80211_ch_switch_notify(dev, chandef, link_id); 22562 22563 switch (wdev->iftype) { 22564 case NL80211_IFTYPE_STATION: 22565 case NL80211_IFTYPE_P2P_CLIENT: 22566 if (!WARN_ON(!wdev->links[link_id].client.current_bss)) 22567 cfg80211_update_assoc_bss_entry(wdev, link_id, 22568 chandef->chan); 22569 break; 22570 case NL80211_IFTYPE_MESH_POINT: 22571 wdev->u.mesh.chandef = *chandef; 22572 wdev->u.mesh.preset_chandef = *chandef; 22573 break; 22574 case NL80211_IFTYPE_AP: 22575 case NL80211_IFTYPE_P2P_GO: 22576 wdev->links[link_id].ap.chandef = *chandef; 22577 break; 22578 case NL80211_IFTYPE_ADHOC: 22579 wdev->u.ibss.chandef = *chandef; 22580 break; 22581 default: 22582 WARN_ON(1); 22583 break; 22584 } 22585 22586 cfg80211_schedule_channels_check(wdev); 22587 cfg80211_sched_dfs_chan_update(rdev); 22588 22589 nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL, 22590 NL80211_CMD_CH_SWITCH_NOTIFY, 0, false); 22591 } 22592 EXPORT_SYMBOL(cfg80211_ch_switch_notify); 22593 22594 void cfg80211_incumbent_signal_notify(struct wiphy *wiphy, 22595 const struct cfg80211_chan_def *chandef, 22596 u32 signal_interference_bitmap, 22597 gfp_t gfp) 22598 { 22599 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22600 struct sk_buff *msg; 22601 void *hdr; 22602 22603 trace_cfg80211_incumbent_signal_notify(wiphy, chandef, signal_interference_bitmap); 22604 22605 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22606 if (!msg) 22607 return; 22608 22609 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_INCUMBENT_SIGNAL_DETECT); 22610 if (!hdr) 22611 goto nla_put_failure; 22612 22613 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 22614 goto nla_put_failure; 22615 22616 if (nl80211_send_chandef(msg, chandef)) 22617 goto nla_put_failure; 22618 22619 if (nla_put_u32(msg, NL80211_ATTR_INCUMBENT_SIGNAL_INTERFERENCE_BITMAP, 22620 signal_interference_bitmap)) 22621 goto nla_put_failure; 22622 22623 genlmsg_end(msg, hdr); 22624 22625 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22626 NL80211_MCGRP_MLME, gfp); 22627 return; 22628 22629 nla_put_failure: 22630 nlmsg_free(msg); 22631 } 22632 EXPORT_SYMBOL(cfg80211_incumbent_signal_notify); 22633 22634 void cfg80211_ch_switch_started_notify(struct net_device *dev, 22635 struct cfg80211_chan_def *chandef, 22636 unsigned int link_id, u8 count, 22637 bool quiet) 22638 { 22639 struct wireless_dev *wdev = dev->ieee80211_ptr; 22640 struct wiphy *wiphy = wdev->wiphy; 22641 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22642 22643 lockdep_assert_wiphy(wdev->wiphy); 22644 WARN_INVALID_LINK_ID(wdev, link_id); 22645 22646 trace_cfg80211_ch_switch_started_notify(dev, chandef, link_id); 22647 22648 22649 nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL, 22650 NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, 22651 count, quiet); 22652 } 22653 EXPORT_SYMBOL(cfg80211_ch_switch_started_notify); 22654 22655 int cfg80211_bss_color_notify(struct net_device *dev, 22656 enum nl80211_commands cmd, u8 count, 22657 u64 color_bitmap, u8 link_id) 22658 { 22659 struct wireless_dev *wdev = dev->ieee80211_ptr; 22660 struct wiphy *wiphy = wdev->wiphy; 22661 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22662 struct sk_buff *msg; 22663 void *hdr; 22664 22665 lockdep_assert_wiphy(wdev->wiphy); 22666 22667 trace_cfg80211_bss_color_notify(dev, cmd, count, color_bitmap); 22668 22669 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 22670 if (!msg) 22671 return -ENOMEM; 22672 22673 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 22674 if (!hdr) 22675 goto nla_put_failure; 22676 22677 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 22678 goto nla_put_failure; 22679 22680 if (wdev->valid_links && 22681 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 22682 goto nla_put_failure; 22683 22684 if (cmd == NL80211_CMD_COLOR_CHANGE_STARTED && 22685 nla_put_u32(msg, NL80211_ATTR_COLOR_CHANGE_COUNT, count)) 22686 goto nla_put_failure; 22687 22688 if (cmd == NL80211_CMD_OBSS_COLOR_COLLISION && 22689 nla_put_u64_64bit(msg, NL80211_ATTR_OBSS_COLOR_BITMAP, 22690 color_bitmap, NL80211_ATTR_PAD)) 22691 goto nla_put_failure; 22692 22693 genlmsg_end(msg, hdr); 22694 22695 return genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 22696 msg, 0, NL80211_MCGRP_MLME, GFP_KERNEL); 22697 22698 nla_put_failure: 22699 nlmsg_free(msg); 22700 return -EINVAL; 22701 } 22702 EXPORT_SYMBOL(cfg80211_bss_color_notify); 22703 22704 void 22705 nl80211_radar_notify(struct cfg80211_registered_device *rdev, 22706 const struct cfg80211_chan_def *chandef, 22707 enum nl80211_radar_event event, 22708 struct net_device *netdev, gfp_t gfp) 22709 { 22710 struct sk_buff *msg; 22711 void *hdr; 22712 22713 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22714 if (!msg) 22715 return; 22716 22717 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT); 22718 if (!hdr) { 22719 nlmsg_free(msg); 22720 return; 22721 } 22722 22723 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 22724 goto nla_put_failure; 22725 22726 /* NOP and radar events don't need a netdev parameter */ 22727 if (netdev) { 22728 struct wireless_dev *wdev = netdev->ieee80211_ptr; 22729 22730 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 22731 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22732 NL80211_ATTR_PAD)) 22733 goto nla_put_failure; 22734 } 22735 22736 if (rdev->background_radar_wdev && 22737 cfg80211_chandef_identical(&rdev->background_radar_chandef, 22738 chandef)) { 22739 if (nla_put_flag(msg, NL80211_ATTR_RADAR_BACKGROUND)) 22740 goto nla_put_failure; 22741 } 22742 22743 if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event)) 22744 goto nla_put_failure; 22745 22746 if (nl80211_send_chandef(msg, chandef)) 22747 goto nla_put_failure; 22748 22749 genlmsg_end(msg, hdr); 22750 22751 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22752 NL80211_MCGRP_MLME, gfp); 22753 return; 22754 22755 nla_put_failure: 22756 nlmsg_free(msg); 22757 } 22758 22759 void cfg80211_sta_opmode_change_notify(struct net_device *dev, const u8 *mac, 22760 struct sta_opmode_info *sta_opmode, 22761 gfp_t gfp) 22762 { 22763 struct sk_buff *msg; 22764 struct wireless_dev *wdev = dev->ieee80211_ptr; 22765 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22766 void *hdr; 22767 22768 if (WARN_ON(!mac)) 22769 return; 22770 22771 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22772 if (!msg) 22773 return; 22774 22775 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STA_OPMODE_CHANGED); 22776 if (!hdr) { 22777 nlmsg_free(msg); 22778 return; 22779 } 22780 22781 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 22782 goto nla_put_failure; 22783 22784 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 22785 goto nla_put_failure; 22786 22787 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac)) 22788 goto nla_put_failure; 22789 22790 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) && 22791 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode)) 22792 goto nla_put_failure; 22793 22794 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && 22795 nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) 22796 goto nla_put_failure; 22797 22798 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && 22799 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss)) 22800 goto nla_put_failure; 22801 22802 genlmsg_end(msg, hdr); 22803 22804 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22805 NL80211_MCGRP_MLME, gfp); 22806 22807 return; 22808 22809 nla_put_failure: 22810 nlmsg_free(msg); 22811 } 22812 EXPORT_SYMBOL(cfg80211_sta_opmode_change_notify); 22813 22814 void cfg80211_probe_status(struct net_device *dev, const u8 *peer, u64 cookie, 22815 int link_id, bool acked, s32 ack_signal, 22816 bool is_valid_ack_signal, gfp_t gfp) 22817 { 22818 struct wireless_dev *wdev = dev->ieee80211_ptr; 22819 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22820 struct sk_buff *msg; 22821 void *hdr; 22822 22823 trace_cfg80211_probe_status(dev, peer, cookie, acked); 22824 22825 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22826 22827 if (!msg) 22828 return; 22829 22830 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_PEER); 22831 if (!hdr) { 22832 nlmsg_free(msg); 22833 return; 22834 } 22835 22836 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22837 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 22838 (peer && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer)) || 22839 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 22840 NL80211_ATTR_PAD)) 22841 goto nla_put_failure; 22842 22843 if (link_id >= 0 && 22844 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 22845 goto nla_put_failure; 22846 22847 if ((acked && nla_put_flag(msg, NL80211_ATTR_ACK)) || 22848 (is_valid_ack_signal && 22849 nla_put_s32(msg, NL80211_ATTR_ACK_SIGNAL, ack_signal))) 22850 goto nla_put_failure; 22851 22852 genlmsg_end(msg, hdr); 22853 22854 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22855 NL80211_MCGRP_MLME, gfp); 22856 return; 22857 22858 nla_put_failure: 22859 nlmsg_free(msg); 22860 } 22861 EXPORT_SYMBOL(cfg80211_probe_status); 22862 22863 void cfg80211_report_obss_beacon_khz(struct wiphy *wiphy, const u8 *frame, 22864 size_t len, int freq, int sig_dbm) 22865 { 22866 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22867 struct sk_buff *msg; 22868 void *hdr; 22869 struct cfg80211_beacon_registration *reg; 22870 22871 trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm); 22872 22873 spin_lock_bh(&rdev->beacon_registrations_lock); 22874 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 22875 msg = nlmsg_new(len + 100, GFP_ATOMIC); 22876 if (!msg) { 22877 spin_unlock_bh(&rdev->beacon_registrations_lock); 22878 return; 22879 } 22880 22881 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 22882 if (!hdr) 22883 goto nla_put_failure; 22884 22885 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22886 (freq && 22887 (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, 22888 KHZ_TO_MHZ(freq)) || 22889 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, 22890 freq % 1000))) || 22891 (sig_dbm && 22892 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) || 22893 nla_put(msg, NL80211_ATTR_FRAME, len, frame)) 22894 goto nla_put_failure; 22895 22896 genlmsg_end(msg, hdr); 22897 22898 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); 22899 } 22900 spin_unlock_bh(&rdev->beacon_registrations_lock); 22901 return; 22902 22903 nla_put_failure: 22904 spin_unlock_bh(&rdev->beacon_registrations_lock); 22905 nlmsg_free(msg); 22906 } 22907 EXPORT_SYMBOL(cfg80211_report_obss_beacon_khz); 22908 22909 #ifdef CONFIG_PM 22910 static int cfg80211_net_detect_results(struct sk_buff *msg, 22911 struct cfg80211_wowlan_wakeup *wakeup) 22912 { 22913 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect; 22914 struct nlattr *nl_results, *nl_match, *nl_freqs; 22915 int i, j; 22916 22917 nl_results = nla_nest_start_noflag(msg, 22918 NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS); 22919 if (!nl_results) 22920 return -EMSGSIZE; 22921 22922 for (i = 0; i < nd->n_matches; i++) { 22923 struct cfg80211_wowlan_nd_match *match = nd->matches[i]; 22924 22925 nl_match = nla_nest_start_noflag(msg, i); 22926 if (!nl_match) 22927 break; 22928 22929 /* The SSID attribute is optional in nl80211, but for 22930 * simplicity reasons it's always present in the 22931 * cfg80211 structure. If a driver can't pass the 22932 * SSID, that needs to be changed. A zero length SSID 22933 * is still a valid SSID (wildcard), so it cannot be 22934 * used for this purpose. 22935 */ 22936 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len, 22937 match->ssid.ssid)) { 22938 nla_nest_cancel(msg, nl_match); 22939 goto out; 22940 } 22941 22942 if (match->n_channels) { 22943 nl_freqs = nla_nest_start_noflag(msg, 22944 NL80211_ATTR_SCAN_FREQUENCIES); 22945 if (!nl_freqs) { 22946 nla_nest_cancel(msg, nl_match); 22947 goto out; 22948 } 22949 22950 for (j = 0; j < match->n_channels; j++) { 22951 if (nla_put_u32(msg, j, match->channels[j])) { 22952 nla_nest_cancel(msg, nl_freqs); 22953 nla_nest_cancel(msg, nl_match); 22954 goto out; 22955 } 22956 } 22957 22958 nla_nest_end(msg, nl_freqs); 22959 } 22960 22961 nla_nest_end(msg, nl_match); 22962 } 22963 22964 out: 22965 nla_nest_end(msg, nl_results); 22966 return 0; 22967 } 22968 22969 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev, 22970 struct cfg80211_wowlan_wakeup *wakeup, 22971 gfp_t gfp) 22972 { 22973 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22974 struct sk_buff *msg; 22975 void *hdr; 22976 int size = 200; 22977 22978 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); 22979 22980 if (wakeup) 22981 size += wakeup->packet_present_len; 22982 22983 msg = nlmsg_new(size, gfp); 22984 if (!msg) 22985 return; 22986 22987 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN); 22988 if (!hdr) 22989 goto free_msg; 22990 22991 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22992 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22993 NL80211_ATTR_PAD)) 22994 goto free_msg; 22995 22996 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 22997 wdev->netdev->ifindex)) 22998 goto free_msg; 22999 23000 if (wakeup) { 23001 struct nlattr *reasons; 23002 23003 reasons = nla_nest_start_noflag(msg, 23004 NL80211_ATTR_WOWLAN_TRIGGERS); 23005 if (!reasons) 23006 goto free_msg; 23007 23008 if (wakeup->disconnect && 23009 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) 23010 goto free_msg; 23011 if (wakeup->magic_pkt && 23012 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) 23013 goto free_msg; 23014 if (wakeup->gtk_rekey_failure && 23015 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) 23016 goto free_msg; 23017 if (wakeup->eap_identity_req && 23018 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) 23019 goto free_msg; 23020 if (wakeup->four_way_handshake && 23021 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) 23022 goto free_msg; 23023 if (wakeup->rfkill_release && 23024 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)) 23025 goto free_msg; 23026 23027 if (wakeup->pattern_idx >= 0 && 23028 nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN, 23029 wakeup->pattern_idx)) 23030 goto free_msg; 23031 23032 if (wakeup->tcp_match && 23033 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH)) 23034 goto free_msg; 23035 23036 if (wakeup->tcp_connlost && 23037 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST)) 23038 goto free_msg; 23039 23040 if (wakeup->tcp_nomoretokens && 23041 nla_put_flag(msg, 23042 NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS)) 23043 goto free_msg; 23044 23045 if (wakeup->unprot_deauth_disassoc && 23046 nla_put_flag(msg, 23047 NL80211_WOWLAN_TRIG_UNPROTECTED_DEAUTH_DISASSOC)) 23048 goto free_msg; 23049 23050 if (wakeup->packet) { 23051 u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211; 23052 u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN; 23053 23054 if (!wakeup->packet_80211) { 23055 pkt_attr = 23056 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023; 23057 len_attr = 23058 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN; 23059 } 23060 23061 if (wakeup->packet_len && 23062 nla_put_u32(msg, len_attr, wakeup->packet_len)) 23063 goto free_msg; 23064 23065 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, 23066 wakeup->packet)) 23067 goto free_msg; 23068 } 23069 23070 if (wakeup->net_detect && 23071 cfg80211_net_detect_results(msg, wakeup)) 23072 goto free_msg; 23073 23074 nla_nest_end(msg, reasons); 23075 } 23076 23077 genlmsg_end(msg, hdr); 23078 23079 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 23080 NL80211_MCGRP_MLME, gfp); 23081 return; 23082 23083 free_msg: 23084 nlmsg_free(msg); 23085 } 23086 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup); 23087 #endif 23088 23089 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer, 23090 enum nl80211_tdls_operation oper, 23091 u16 reason_code, gfp_t gfp) 23092 { 23093 struct wireless_dev *wdev = dev->ieee80211_ptr; 23094 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 23095 struct sk_buff *msg; 23096 void *hdr; 23097 23098 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, 23099 reason_code); 23100 23101 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23102 if (!msg) 23103 return; 23104 23105 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER); 23106 if (!hdr) { 23107 nlmsg_free(msg); 23108 return; 23109 } 23110 23111 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23112 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 23113 nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) || 23114 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) || 23115 (reason_code > 0 && 23116 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code))) 23117 goto nla_put_failure; 23118 23119 genlmsg_end(msg, hdr); 23120 23121 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 23122 NL80211_MCGRP_MLME, gfp); 23123 return; 23124 23125 nla_put_failure: 23126 nlmsg_free(msg); 23127 } 23128 EXPORT_SYMBOL(cfg80211_tdls_oper_request); 23129 23130 static int nl80211_netlink_notify(struct notifier_block * nb, 23131 unsigned long state, 23132 void *_notify) 23133 { 23134 struct netlink_notify *notify = _notify; 23135 struct cfg80211_registered_device *rdev; 23136 struct wireless_dev *wdev; 23137 struct cfg80211_beacon_registration *reg, *tmp; 23138 23139 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC) 23140 return NOTIFY_DONE; 23141 23142 rcu_read_lock(); 23143 23144 list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) { 23145 struct cfg80211_sched_scan_request *sched_scan_req; 23146 23147 list_for_each_entry_rcu(sched_scan_req, 23148 &rdev->sched_scan_req_list, 23149 list) { 23150 if (sched_scan_req->owner_nlportid == notify->portid) { 23151 sched_scan_req->nl_owner_dead = true; 23152 wiphy_work_queue(&rdev->wiphy, 23153 &rdev->sched_scan_stop_wk); 23154 } 23155 } 23156 23157 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) { 23158 cfg80211_mlme_unregister_socket(wdev, notify->portid); 23159 23160 if (wdev->owner_nlportid == notify->portid) { 23161 wdev->nl_owner_dead = true; 23162 schedule_work(&rdev->destroy_work); 23163 } else if (wdev->conn_owner_nlportid == notify->portid) { 23164 wiphy_work_queue(wdev->wiphy, 23165 &wdev->disconnect_wk); 23166 } 23167 23168 cfg80211_release_pmsr(wdev, notify->portid); 23169 } 23170 23171 spin_lock_bh(&rdev->beacon_registrations_lock); 23172 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, 23173 list) { 23174 if (reg->nlportid == notify->portid) { 23175 list_del(®->list); 23176 kfree(reg); 23177 break; 23178 } 23179 } 23180 spin_unlock_bh(&rdev->beacon_registrations_lock); 23181 } 23182 23183 rcu_read_unlock(); 23184 23185 /* 23186 * It is possible that the user space process that is controlling the 23187 * indoor setting disappeared, so notify the regulatory core. 23188 */ 23189 regulatory_netlink_notify(notify->portid); 23190 return NOTIFY_OK; 23191 } 23192 23193 static struct notifier_block nl80211_netlink_notifier = { 23194 .notifier_call = nl80211_netlink_notify, 23195 }; 23196 23197 void cfg80211_ft_event(struct net_device *netdev, 23198 struct cfg80211_ft_event_params *ft_event) 23199 { 23200 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; 23201 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23202 struct sk_buff *msg; 23203 void *hdr; 23204 23205 trace_cfg80211_ft_event(wiphy, netdev, ft_event); 23206 23207 if (!ft_event->target_ap) 23208 return; 23209 23210 msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len, 23211 GFP_KERNEL); 23212 if (!msg) 23213 return; 23214 23215 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT); 23216 if (!hdr) 23217 goto out; 23218 23219 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23220 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 23221 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) 23222 goto out; 23223 23224 if (ft_event->ies && 23225 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) 23226 goto out; 23227 if (ft_event->ric_ies && 23228 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, 23229 ft_event->ric_ies)) 23230 goto out; 23231 23232 genlmsg_end(msg, hdr); 23233 23234 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 23235 NL80211_MCGRP_MLME, GFP_KERNEL); 23236 return; 23237 out: 23238 nlmsg_free(msg); 23239 } 23240 EXPORT_SYMBOL(cfg80211_ft_event); 23241 23242 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp) 23243 { 23244 struct cfg80211_registered_device *rdev; 23245 struct sk_buff *msg; 23246 void *hdr; 23247 u32 nlportid; 23248 23249 rdev = wiphy_to_rdev(wdev->wiphy); 23250 if (!rdev->crit_proto_nlportid) 23251 return; 23252 23253 nlportid = rdev->crit_proto_nlportid; 23254 rdev->crit_proto_nlportid = 0; 23255 23256 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23257 if (!msg) 23258 return; 23259 23260 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP); 23261 if (!hdr) 23262 goto nla_put_failure; 23263 23264 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23265 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23266 NL80211_ATTR_PAD)) 23267 goto nla_put_failure; 23268 23269 genlmsg_end(msg, hdr); 23270 23271 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 23272 return; 23273 23274 nla_put_failure: 23275 nlmsg_free(msg); 23276 } 23277 EXPORT_SYMBOL(cfg80211_crit_proto_stopped); 23278 23279 void nl80211_send_ap_stopped(struct wireless_dev *wdev, unsigned int link_id) 23280 { 23281 struct wiphy *wiphy = wdev->wiphy; 23282 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23283 struct sk_buff *msg; 23284 void *hdr; 23285 23286 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 23287 if (!msg) 23288 return; 23289 23290 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP); 23291 if (!hdr) 23292 goto out; 23293 23294 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23295 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || 23296 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23297 NL80211_ATTR_PAD) || 23298 (wdev->valid_links && 23299 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))) 23300 goto out; 23301 23302 genlmsg_end(msg, hdr); 23303 23304 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0, 23305 NL80211_MCGRP_MLME, GFP_KERNEL); 23306 return; 23307 out: 23308 nlmsg_free(msg); 23309 } 23310 23311 int cfg80211_external_auth_request(struct net_device *dev, 23312 struct cfg80211_external_auth_params *params, 23313 gfp_t gfp) 23314 { 23315 struct wireless_dev *wdev = dev->ieee80211_ptr; 23316 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 23317 struct sk_buff *msg; 23318 void *hdr; 23319 23320 if (!wdev->conn_owner_nlportid) 23321 return -EINVAL; 23322 23323 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23324 if (!msg) 23325 return -ENOMEM; 23326 23327 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EXTERNAL_AUTH); 23328 if (!hdr) 23329 goto nla_put_failure; 23330 23331 /* Some historical mistakes in drivers <-> userspace interface (notably 23332 * between drivers and wpa_supplicant) led to a big-endian conversion 23333 * being needed on NL80211_ATTR_AKM_SUITES _only_ when its value is 23334 * WLAN_AKM_SUITE_SAE. This is now fixed on userspace side, but for the 23335 * benefit of older wpa_supplicant versions, send this particular value 23336 * in big-endian. Note that newer wpa_supplicant will also detect this 23337 * particular value in big endian still, so it all continues to work. 23338 */ 23339 if (params->key_mgmt_suite == WLAN_AKM_SUITE_SAE) { 23340 if (nla_put_be32(msg, NL80211_ATTR_AKM_SUITES, 23341 cpu_to_be32(WLAN_AKM_SUITE_SAE))) 23342 goto nla_put_failure; 23343 } else { 23344 if (nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, 23345 params->key_mgmt_suite)) 23346 goto nla_put_failure; 23347 } 23348 23349 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23350 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 23351 nla_put_u32(msg, NL80211_ATTR_EXTERNAL_AUTH_ACTION, 23352 params->action) || 23353 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) || 23354 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len, 23355 params->ssid.ssid) || 23356 (!is_zero_ether_addr(params->mld_addr) && 23357 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, params->mld_addr))) 23358 goto nla_put_failure; 23359 23360 genlmsg_end(msg, hdr); 23361 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 23362 wdev->conn_owner_nlportid); 23363 return 0; 23364 23365 nla_put_failure: 23366 nlmsg_free(msg); 23367 return -ENOBUFS; 23368 } 23369 EXPORT_SYMBOL(cfg80211_external_auth_request); 23370 23371 void cfg80211_update_owe_info_event(struct net_device *netdev, 23372 struct cfg80211_update_owe_info *owe_info, 23373 gfp_t gfp) 23374 { 23375 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; 23376 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23377 struct sk_buff *msg; 23378 void *hdr; 23379 23380 trace_cfg80211_update_owe_info_event(wiphy, netdev, owe_info); 23381 23382 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23383 if (!msg) 23384 return; 23385 23386 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_UPDATE_OWE_INFO); 23387 if (!hdr) 23388 goto nla_put_failure; 23389 23390 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23391 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 23392 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer)) 23393 goto nla_put_failure; 23394 23395 if (!owe_info->ie_len || 23396 nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie)) 23397 goto nla_put_failure; 23398 23399 if (owe_info->assoc_link_id != -1) { 23400 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, 23401 owe_info->assoc_link_id)) 23402 goto nla_put_failure; 23403 23404 if (!is_zero_ether_addr(owe_info->peer_mld_addr) && 23405 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, 23406 owe_info->peer_mld_addr)) 23407 goto nla_put_failure; 23408 } 23409 23410 genlmsg_end(msg, hdr); 23411 23412 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 23413 NL80211_MCGRP_MLME, gfp); 23414 return; 23415 23416 nla_put_failure: 23417 genlmsg_cancel(msg, hdr); 23418 nlmsg_free(msg); 23419 } 23420 EXPORT_SYMBOL(cfg80211_update_owe_info_event); 23421 23422 void cfg80211_schedule_channels_check(struct wireless_dev *wdev) 23423 { 23424 struct wiphy *wiphy = wdev->wiphy; 23425 23426 /* Schedule channels check if NO_IR or DFS relaxations are supported */ 23427 if (wdev->iftype == NL80211_IFTYPE_STATION && 23428 (wiphy_ext_feature_isset(wiphy, 23429 NL80211_EXT_FEATURE_DFS_CONCURRENT) || 23430 (IS_ENABLED(CONFIG_CFG80211_REG_RELAX_NO_IR) && 23431 wiphy->regulatory_flags & REGULATORY_ENABLE_RELAX_NO_IR))) 23432 reg_check_channels(); 23433 } 23434 EXPORT_SYMBOL(cfg80211_schedule_channels_check); 23435 23436 void cfg80211_epcs_changed(struct net_device *netdev, bool enabled) 23437 { 23438 struct wireless_dev *wdev = netdev->ieee80211_ptr; 23439 struct wiphy *wiphy = wdev->wiphy; 23440 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23441 struct sk_buff *msg; 23442 void *hdr; 23443 23444 trace_cfg80211_epcs_changed(wdev, enabled); 23445 23446 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 23447 if (!msg) 23448 return; 23449 23450 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EPCS_CFG); 23451 if (!hdr) { 23452 nlmsg_free(msg); 23453 return; 23454 } 23455 23456 if (enabled && nla_put_flag(msg, NL80211_ATTR_EPCS)) 23457 goto nla_put_failure; 23458 23459 genlmsg_end(msg, hdr); 23460 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 23461 NL80211_MCGRP_MLME, GFP_KERNEL); 23462 return; 23463 23464 nla_put_failure: 23465 nlmsg_free(msg); 23466 } 23467 EXPORT_SYMBOL(cfg80211_epcs_changed); 23468 23469 void cfg80211_next_nan_dw_notif(struct wireless_dev *wdev, 23470 struct ieee80211_channel *chan, gfp_t gfp) 23471 { 23472 struct wiphy *wiphy = wdev->wiphy; 23473 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23474 struct sk_buff *msg; 23475 void *hdr; 23476 23477 trace_cfg80211_next_nan_dw_notif(wdev, chan); 23478 23479 if (!wdev->owner_nlportid) 23480 return; 23481 23482 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23483 if (!msg) 23484 return; 23485 23486 hdr = nl80211hdr_put(msg, 0, 0, 0, 23487 NL80211_CMD_NAN_NEXT_DW_NOTIFICATION); 23488 if (!hdr) 23489 goto nla_put_failure; 23490 23491 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23492 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23493 NL80211_ATTR_PAD) || 23494 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq)) 23495 goto nla_put_failure; 23496 23497 genlmsg_end(msg, hdr); 23498 23499 genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid); 23500 23501 return; 23502 23503 nla_put_failure: 23504 nlmsg_free(msg); 23505 } 23506 EXPORT_SYMBOL(cfg80211_next_nan_dw_notif); 23507 23508 void cfg80211_nan_cluster_joined(struct wireless_dev *wdev, 23509 const u8 *cluster_id, bool new_cluster, 23510 gfp_t gfp) 23511 { 23512 struct wiphy *wiphy = wdev->wiphy; 23513 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23514 struct sk_buff *msg; 23515 void *hdr; 23516 23517 trace_cfg80211_nan_cluster_joined(wdev, cluster_id, new_cluster); 23518 23519 memcpy(wdev->u.nan.cluster_id, cluster_id, ETH_ALEN); 23520 23521 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23522 if (!msg) 23523 return; 23524 23525 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_CLUSTER_JOINED); 23526 if (!hdr) 23527 goto nla_put_failure; 23528 23529 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23530 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23531 NL80211_ATTR_PAD) || 23532 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cluster_id) || 23533 (new_cluster && nla_put_flag(msg, NL80211_ATTR_NAN_NEW_CLUSTER))) 23534 goto nla_put_failure; 23535 23536 genlmsg_end(msg, hdr); 23537 23538 if (!wdev->owner_nlportid) 23539 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), 23540 msg, 0, NL80211_MCGRP_NAN, gfp); 23541 else 23542 genlmsg_unicast(wiphy_net(wiphy), msg, 23543 wdev->owner_nlportid); 23544 return; 23545 23546 nla_put_failure: 23547 nlmsg_free(msg); 23548 } 23549 EXPORT_SYMBOL(cfg80211_nan_cluster_joined); 23550 23551 void cfg80211_nan_ulw_update(struct wireless_dev *wdev, 23552 const u8 *ulw, size_t ulw_len, gfp_t gfp) 23553 { 23554 struct wiphy *wiphy = wdev->wiphy; 23555 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23556 struct sk_buff *msg; 23557 void *hdr; 23558 23559 trace_cfg80211_nan_ulw_update(wiphy, wdev, ulw, ulw_len); 23560 23561 if (!wdev->owner_nlportid) 23562 return; 23563 23564 /* 32 for the wiphy idx, 64 for the wdev id, 100 for padding */ 23565 msg = nlmsg_new(nla_total_size(sizeof(u32)) + 23566 nla_total_size(ulw_len) + 23567 nla_total_size(sizeof(u64)) + 100, 23568 gfp); 23569 if (!msg) 23570 return; 23571 23572 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_ULW_UPDATE); 23573 if (!hdr) 23574 goto nla_put_failure; 23575 23576 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23577 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23578 NL80211_ATTR_PAD) || 23579 (ulw && ulw_len && 23580 nla_put(msg, NL80211_ATTR_NAN_ULW, ulw_len, ulw))) 23581 goto nla_put_failure; 23582 23583 genlmsg_end(msg, hdr); 23584 23585 genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid); 23586 23587 return; 23588 23589 nla_put_failure: 23590 nlmsg_free(msg); 23591 } 23592 EXPORT_SYMBOL(cfg80211_nan_ulw_update); 23593 23594 void cfg80211_nan_channel_evac(struct wireless_dev *wdev, 23595 const struct cfg80211_chan_def *chandef, 23596 gfp_t gfp) 23597 { 23598 struct wiphy *wiphy = wdev->wiphy; 23599 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23600 struct sk_buff *msg; 23601 struct nlattr *chan_attr; 23602 void *hdr; 23603 23604 trace_cfg80211_nan_channel_evac(wiphy, wdev, chandef); 23605 23606 if (!wdev->owner_nlportid) 23607 return; 23608 23609 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23610 if (!msg) 23611 return; 23612 23613 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_CHANNEL_EVAC); 23614 if (!hdr) 23615 goto nla_put_failure; 23616 23617 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23618 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23619 NL80211_ATTR_PAD)) 23620 goto nla_put_failure; 23621 23622 chan_attr = nla_nest_start(msg, NL80211_ATTR_NAN_CHANNEL); 23623 if (!chan_attr) 23624 goto nla_put_failure; 23625 23626 if (nl80211_send_chandef(msg, chandef)) 23627 goto nla_put_failure; 23628 23629 nla_nest_end(msg, chan_attr); 23630 23631 genlmsg_end(msg, hdr); 23632 23633 genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid); 23634 23635 return; 23636 23637 nla_put_failure: 23638 nlmsg_free(msg); 23639 } 23640 EXPORT_SYMBOL(cfg80211_nan_channel_evac); 23641 23642 /* initialisation/exit functions */ 23643 23644 int __init nl80211_init(void) 23645 { 23646 int err; 23647 23648 err = genl_register_family(&nl80211_fam); 23649 if (err) 23650 return err; 23651 23652 err = netlink_register_notifier(&nl80211_netlink_notifier); 23653 if (err) 23654 goto err_out; 23655 23656 return 0; 23657 err_out: 23658 genl_unregister_family(&nl80211_fam); 23659 return err; 23660 } 23661 23662 void nl80211_exit(void) 23663 { 23664 netlink_unregister_notifier(&nl80211_netlink_notifier); 23665 genl_unregister_family(&nl80211_fam); 23666 } 23667