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 and on the right wiphy. 8970 */ 8971 static struct net_device *get_vlan(struct genl_info *info, 8972 struct cfg80211_registered_device *rdev) 8973 { 8974 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; 8975 struct net_device *v; 8976 int ret; 8977 8978 if (!vlanattr) 8979 return NULL; 8980 8981 v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr)); 8982 if (!v) 8983 return ERR_PTR(-ENODEV); 8984 8985 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { 8986 ret = -EINVAL; 8987 goto error; 8988 } 8989 8990 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && 8991 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 8992 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 8993 ret = -EINVAL; 8994 goto error; 8995 } 8996 8997 if (!netif_running(v)) { 8998 ret = -ENETDOWN; 8999 goto error; 9000 } 9001 9002 return v; 9003 error: 9004 dev_put(v); 9005 return ERR_PTR(ret); 9006 } 9007 9008 static int nl80211_parse_sta_wme(struct genl_info *info, 9009 struct station_parameters *params) 9010 { 9011 struct nlattr *tb[NL80211_STA_WME_MAX + 1]; 9012 struct nlattr *nla; 9013 int err; 9014 9015 /* parse WME attributes if present */ 9016 if (!info->attrs[NL80211_ATTR_STA_WME]) 9017 return 0; 9018 9019 nla = info->attrs[NL80211_ATTR_STA_WME]; 9020 err = nla_parse_nested_deprecated(tb, NL80211_STA_WME_MAX, nla, 9021 nl80211_sta_wme_policy, 9022 info->extack); 9023 if (err) 9024 return err; 9025 9026 if (tb[NL80211_STA_WME_UAPSD_QUEUES]) 9027 params->uapsd_queues = nla_get_u8( 9028 tb[NL80211_STA_WME_UAPSD_QUEUES]); 9029 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) 9030 return -EINVAL; 9031 9032 if (tb[NL80211_STA_WME_MAX_SP]) 9033 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); 9034 9035 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) 9036 return -EINVAL; 9037 9038 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; 9039 9040 return 0; 9041 } 9042 9043 static int nl80211_parse_sta_channel_info(struct genl_info *info, 9044 struct station_parameters *params) 9045 { 9046 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { 9047 params->supported_channels = 9048 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 9049 params->supported_channels_len = 9050 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 9051 /* 9052 * Need to include at least one (first channel, number of 9053 * channels) tuple for each subband (checked in policy), 9054 * and must have proper tuples for the rest of the data as well. 9055 */ 9056 if (params->supported_channels_len % 2) 9057 return -EINVAL; 9058 } 9059 9060 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { 9061 params->supported_oper_classes = 9062 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 9063 params->supported_oper_classes_len = 9064 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 9065 } 9066 return 0; 9067 } 9068 9069 static int nl80211_set_station_tdls(struct genl_info *info, 9070 struct station_parameters *params) 9071 { 9072 int err; 9073 /* Dummy STA entry gets updated once the peer capabilities are known */ 9074 if (info->attrs[NL80211_ATTR_PEER_AID]) 9075 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 9076 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 9077 params->link_sta_params.ht_capa = 9078 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 9079 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 9080 params->link_sta_params.vht_capa = 9081 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 9082 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 9083 params->link_sta_params.he_capa = 9084 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 9085 params->link_sta_params.he_capa_len = 9086 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 9087 9088 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { 9089 params->link_sta_params.eht_capa = 9090 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 9091 params->link_sta_params.eht_capa_len = 9092 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 9093 9094 if (!ieee80211_eht_capa_size_ok((const u8 *)params->link_sta_params.he_capa, 9095 (const u8 *)params->link_sta_params.eht_capa, 9096 params->link_sta_params.eht_capa_len, 9097 false)) 9098 return -EINVAL; 9099 } 9100 } 9101 9102 if (info->attrs[NL80211_ATTR_UHR_CAPABILITY]) { 9103 if (!params->link_sta_params.eht_capa) 9104 return -EINVAL; 9105 9106 params->link_sta_params.uhr_capa = 9107 nla_data(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 9108 params->link_sta_params.uhr_capa_len = 9109 nla_len(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 9110 } 9111 9112 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) 9113 params->link_sta_params.s1g_capa = 9114 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]); 9115 9116 err = nl80211_parse_sta_channel_info(info, params); 9117 if (err) 9118 return err; 9119 9120 return nl80211_parse_sta_wme(info, params); 9121 } 9122 9123 static int nl80211_parse_sta_txpower_setting(struct genl_info *info, 9124 struct sta_txpwr *txpwr, 9125 bool *txpwr_set) 9126 { 9127 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9128 int idx; 9129 9130 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) { 9131 if (!rdev->ops->set_tx_power || 9132 !wiphy_ext_feature_isset(&rdev->wiphy, 9133 NL80211_EXT_FEATURE_STA_TX_PWR)) 9134 return -EOPNOTSUPP; 9135 9136 idx = NL80211_ATTR_STA_TX_POWER_SETTING; 9137 txpwr->type = nla_get_u8(info->attrs[idx]); 9138 9139 if (txpwr->type == NL80211_TX_POWER_LIMITED) { 9140 idx = NL80211_ATTR_STA_TX_POWER; 9141 9142 if (info->attrs[idx]) 9143 txpwr->power = nla_get_s16(info->attrs[idx]); 9144 else 9145 return -EINVAL; 9146 } 9147 9148 *txpwr_set = true; 9149 } else { 9150 *txpwr_set = false; 9151 } 9152 9153 return 0; 9154 } 9155 9156 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) 9157 { 9158 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9159 struct wireless_dev *wdev = info->user_ptr[1]; 9160 struct net_device *dev = wdev->netdev; 9161 struct station_parameters params; 9162 u8 *mac_addr; 9163 int err; 9164 9165 memset(¶ms, 0, sizeof(params)); 9166 9167 if (!dev && wdev->iftype != NL80211_IFTYPE_NAN && 9168 wdev->iftype != NL80211_IFTYPE_NAN_DATA) 9169 return -EINVAL; 9170 9171 if (!rdev->ops->change_station) 9172 return -EOPNOTSUPP; 9173 9174 /* 9175 * AID and listen_interval properties can be set only for unassociated 9176 * station. Include these parameters here and will check them in 9177 * cfg80211_check_station_change(). 9178 */ 9179 if (info->attrs[NL80211_ATTR_STA_AID]) 9180 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 9181 9182 if (info->attrs[NL80211_ATTR_VLAN_ID]) 9183 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 9184 9185 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 9186 params.listen_interval = 9187 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 9188 else 9189 params.listen_interval = -1; 9190 9191 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) 9192 params.support_p2p_ps = 9193 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); 9194 else 9195 params.support_p2p_ps = -1; 9196 9197 if (!info->attrs[NL80211_ATTR_MAC]) 9198 return -EINVAL; 9199 9200 params.link_sta_params.link_id = 9201 nl80211_link_id_or_invalid(info->attrs); 9202 9203 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { 9204 /* If MLD_ADDR attribute is set then this is an MLD station 9205 * and the MLD_ADDR attribute holds the MLD address and the 9206 * MAC attribute holds for the LINK address. 9207 * In that case, the link_id is also expected to be valid. 9208 */ 9209 if (params.link_sta_params.link_id < 0) 9210 return -EINVAL; 9211 9212 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 9213 params.link_sta_params.mld_mac = mac_addr; 9214 params.link_sta_params.link_mac = 9215 nla_data(info->attrs[NL80211_ATTR_MAC]); 9216 if (!is_valid_ether_addr(params.link_sta_params.link_mac)) 9217 return -EINVAL; 9218 } else { 9219 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 9220 } 9221 9222 9223 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 9224 params.link_sta_params.supported_rates = 9225 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 9226 params.link_sta_params.supported_rates_len = 9227 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 9228 } 9229 9230 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 9231 params.capability = 9232 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 9233 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 9234 } 9235 9236 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 9237 params.ext_capab = 9238 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 9239 params.ext_capab_len = 9240 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 9241 } 9242 9243 if (parse_station_flags(info, wdev->iftype, ¶ms)) 9244 return -EINVAL; 9245 9246 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) 9247 params.plink_action = 9248 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 9249 9250 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { 9251 params.plink_state = 9252 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); 9253 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) 9254 params.peer_aid = nla_get_u16( 9255 info->attrs[NL80211_ATTR_MESH_PEER_AID]); 9256 params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE; 9257 } 9258 9259 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) 9260 params.local_pm = nla_get_u32( 9261 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); 9262 9263 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 9264 params.link_sta_params.opmode_notif_used = true; 9265 params.link_sta_params.opmode_notif = 9266 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 9267 } 9268 9269 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) 9270 params.link_sta_params.he_6ghz_capa = 9271 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); 9272 9273 if (info->attrs[NL80211_ATTR_EML_CAPABILITY]) { 9274 params.eml_cap_present = true; 9275 params.eml_cap = 9276 nla_get_u16(info->attrs[NL80211_ATTR_EML_CAPABILITY]); 9277 } 9278 9279 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) 9280 params.airtime_weight = 9281 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); 9282 9283 if (params.airtime_weight && 9284 !wiphy_ext_feature_isset(&rdev->wiphy, 9285 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 9286 return -EOPNOTSUPP; 9287 9288 err = nl80211_parse_sta_txpower_setting(info, 9289 ¶ms.link_sta_params.txpwr, 9290 ¶ms.link_sta_params.txpwr_set); 9291 if (err) 9292 return err; 9293 9294 /* Include parameters for TDLS peer (will check later) */ 9295 err = nl80211_set_station_tdls(info, ¶ms); 9296 if (err) 9297 return err; 9298 9299 params.vlan = get_vlan(info, rdev); 9300 if (IS_ERR(params.vlan)) 9301 return PTR_ERR(params.vlan); 9302 9303 switch (wdev->iftype) { 9304 case NL80211_IFTYPE_AP: 9305 case NL80211_IFTYPE_AP_VLAN: 9306 case NL80211_IFTYPE_P2P_GO: 9307 case NL80211_IFTYPE_P2P_CLIENT: 9308 case NL80211_IFTYPE_STATION: 9309 case NL80211_IFTYPE_ADHOC: 9310 case NL80211_IFTYPE_MESH_POINT: 9311 case NL80211_IFTYPE_NAN: 9312 case NL80211_IFTYPE_NAN_DATA: 9313 break; 9314 default: 9315 err = -EOPNOTSUPP; 9316 goto out_put_vlan; 9317 } 9318 9319 /* driver will call cfg80211_check_station_change() */ 9320 err = rdev_change_station(rdev, wdev, mac_addr, ¶ms); 9321 9322 out_put_vlan: 9323 dev_put(params.vlan); 9324 9325 return err; 9326 } 9327 9328 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info) 9329 { 9330 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9331 int err; 9332 struct wireless_dev *wdev = info->user_ptr[1]; 9333 struct net_device *dev = wdev->netdev; 9334 struct station_parameters params; 9335 u8 *mac_addr = NULL; 9336 u32 auth_assoc = BIT(NL80211_STA_FLAG_AUTHENTICATED) | 9337 BIT(NL80211_STA_FLAG_ASSOCIATED); 9338 9339 memset(¶ms, 0, sizeof(params)); 9340 9341 if (!dev && wdev->iftype != NL80211_IFTYPE_NAN) 9342 return -EINVAL; 9343 9344 if (!rdev->ops->add_station) 9345 return -EOPNOTSUPP; 9346 9347 if (!info->attrs[NL80211_ATTR_MAC]) 9348 return -EINVAL; 9349 9350 if (wdev->iftype == NL80211_IFTYPE_NAN || 9351 wdev->iftype == NL80211_IFTYPE_NAN_DATA) { 9352 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 9353 return -EINVAL; 9354 if (wdev->iftype == NL80211_IFTYPE_NAN_DATA) { 9355 if (!info->attrs[NL80211_ATTR_NAN_NMI_MAC]) 9356 return -EINVAL; 9357 9358 /* Only NMI stations receive the HT/VHT/HE capabilities */ 9359 if (info->attrs[NL80211_ATTR_HT_CAPABILITY] || 9360 info->attrs[NL80211_ATTR_VHT_CAPABILITY] || 9361 info->attrs[NL80211_ATTR_HE_CAPABILITY]) 9362 return -EINVAL; 9363 } 9364 } else { 9365 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 9366 return -EINVAL; 9367 9368 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 9369 return -EINVAL; 9370 9371 if (!info->attrs[NL80211_ATTR_STA_AID] && 9372 !info->attrs[NL80211_ATTR_PEER_AID]) 9373 return -EINVAL; 9374 } 9375 9376 params.link_sta_params.link_id = 9377 nl80211_link_id_or_invalid(info->attrs); 9378 9379 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { 9380 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 9381 params.link_sta_params.mld_mac = mac_addr; 9382 params.link_sta_params.link_mac = 9383 nla_data(info->attrs[NL80211_ATTR_MAC]); 9384 if (!is_valid_ether_addr(params.link_sta_params.link_mac)) 9385 return -EINVAL; 9386 } else { 9387 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 9388 } 9389 9390 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 9391 params.link_sta_params.supported_rates = 9392 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 9393 params.link_sta_params.supported_rates_len = 9394 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 9395 } 9396 9397 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 9398 params.listen_interval = 9399 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 9400 9401 if (info->attrs[NL80211_ATTR_VLAN_ID]) 9402 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 9403 9404 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { 9405 params.support_p2p_ps = 9406 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); 9407 } else { 9408 /* 9409 * if not specified, assume it's supported for P2P GO interface, 9410 * and is NOT supported for AP interface 9411 */ 9412 params.support_p2p_ps = 9413 wdev->iftype == NL80211_IFTYPE_P2P_GO; 9414 } 9415 9416 if (info->attrs[NL80211_ATTR_PEER_AID]) 9417 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 9418 else if (info->attrs[NL80211_ATTR_STA_AID]) 9419 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 9420 9421 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 9422 params.capability = 9423 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 9424 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 9425 } 9426 9427 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 9428 params.ext_capab = 9429 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 9430 params.ext_capab_len = 9431 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 9432 } 9433 9434 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 9435 params.link_sta_params.ht_capa = 9436 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 9437 9438 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 9439 params.link_sta_params.vht_capa = 9440 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 9441 9442 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 9443 params.link_sta_params.he_capa = 9444 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 9445 params.link_sta_params.he_capa_len = 9446 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 9447 9448 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { 9449 params.link_sta_params.eht_capa = 9450 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 9451 params.link_sta_params.eht_capa_len = 9452 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 9453 9454 if (!ieee80211_eht_capa_size_ok((const u8 *)params.link_sta_params.he_capa, 9455 (const u8 *)params.link_sta_params.eht_capa, 9456 params.link_sta_params.eht_capa_len, 9457 false)) 9458 return -EINVAL; 9459 } 9460 } 9461 9462 if (info->attrs[NL80211_ATTR_UHR_CAPABILITY]) { 9463 if (!params.link_sta_params.eht_capa) 9464 return -EINVAL; 9465 9466 params.link_sta_params.uhr_capa = 9467 nla_data(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 9468 params.link_sta_params.uhr_capa_len = 9469 nla_len(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 9470 } 9471 9472 if (info->attrs[NL80211_ATTR_EML_CAPABILITY]) { 9473 params.eml_cap_present = true; 9474 params.eml_cap = 9475 nla_get_u16(info->attrs[NL80211_ATTR_EML_CAPABILITY]); 9476 } 9477 9478 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) 9479 params.link_sta_params.he_6ghz_capa = 9480 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); 9481 9482 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) 9483 params.link_sta_params.s1g_capa = 9484 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]); 9485 9486 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 9487 params.link_sta_params.opmode_notif_used = true; 9488 params.link_sta_params.opmode_notif = 9489 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 9490 } 9491 9492 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) 9493 params.plink_action = 9494 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 9495 9496 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) 9497 params.airtime_weight = 9498 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); 9499 9500 if (params.airtime_weight && 9501 !wiphy_ext_feature_isset(&rdev->wiphy, 9502 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 9503 return -EOPNOTSUPP; 9504 9505 err = nl80211_parse_sta_txpower_setting(info, 9506 ¶ms.link_sta_params.txpwr, 9507 ¶ms.link_sta_params.txpwr_set); 9508 if (err) 9509 return err; 9510 9511 err = nl80211_parse_sta_channel_info(info, ¶ms); 9512 if (err) 9513 return err; 9514 9515 err = nl80211_parse_sta_wme(info, ¶ms); 9516 if (err) 9517 return err; 9518 9519 if (parse_station_flags(info, wdev->iftype, ¶ms)) 9520 return -EINVAL; 9521 9522 /* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT 9523 * as userspace might just pass through the capabilities from the IEs 9524 * directly, rather than enforcing this restriction and returning an 9525 * error in this case. 9526 */ 9527 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) { 9528 params.link_sta_params.ht_capa = NULL; 9529 params.link_sta_params.vht_capa = NULL; 9530 9531 /* HE, EHT and UHR require WME */ 9532 if (params.link_sta_params.he_capa_len || 9533 params.link_sta_params.he_6ghz_capa || 9534 params.link_sta_params.eht_capa_len || 9535 params.link_sta_params.uhr_capa_len) 9536 return -EINVAL; 9537 } 9538 9539 if (wdev->iftype == NL80211_IFTYPE_NAN || 9540 wdev->iftype == NL80211_IFTYPE_NAN_DATA) { 9541 if (params.sta_modify_mask & STATION_PARAM_APPLY_UAPSD) 9542 return -EINVAL; 9543 /* NAN NMI station must be added in associated or authorized state */ 9544 if (!(params.sta_flags_set & (BIT(NL80211_STA_FLAG_ASSOCIATED) | 9545 BIT(NL80211_STA_FLAG_AUTHENTICATED)))) 9546 return -EINVAL; 9547 } 9548 9549 /* Ensure that HT/VHT capabilities are not set for 6 GHz HE STA */ 9550 if (params.link_sta_params.he_6ghz_capa && 9551 (params.link_sta_params.ht_capa || params.link_sta_params.vht_capa)) 9552 return -EINVAL; 9553 9554 /* When you run into this, adjust the code below for the new flag */ 9555 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 8); 9556 9557 switch (wdev->iftype) { 9558 case NL80211_IFTYPE_AP: 9559 case NL80211_IFTYPE_AP_VLAN: 9560 case NL80211_IFTYPE_P2P_GO: 9561 /* ignore WME attributes if iface/sta is not capable */ 9562 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || 9563 !(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) 9564 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 9565 9566 /* TDLS peers cannot be added */ 9567 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 9568 info->attrs[NL80211_ATTR_PEER_AID]) 9569 return -EINVAL; 9570 /* but don't bother the driver with it */ 9571 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 9572 9573 /* allow authenticated/associated only if driver handles it */ 9574 if (!(rdev->wiphy.features & 9575 NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 9576 params.sta_flags_mask & auth_assoc) 9577 return -EINVAL; 9578 9579 if (!wiphy_ext_feature_isset(&rdev->wiphy, 9580 NL80211_EXT_FEATURE_SPP_AMSDU_SUPPORT) && 9581 params.sta_flags_mask & BIT(NL80211_STA_FLAG_SPP_AMSDU)) 9582 return -EINVAL; 9583 9584 /* Older userspace, or userspace wanting to be compatible with 9585 * !NL80211_FEATURE_FULL_AP_CLIENT_STATE, will not set the auth 9586 * and assoc flags in the mask, but assumes the station will be 9587 * added as associated anyway since this was the required driver 9588 * behaviour before NL80211_FEATURE_FULL_AP_CLIENT_STATE was 9589 * introduced. 9590 * In order to not bother drivers with this quirk in the API 9591 * set the flags in both the mask and set for new stations in 9592 * this case. 9593 */ 9594 if (!(params.sta_flags_mask & auth_assoc)) { 9595 params.sta_flags_mask |= auth_assoc; 9596 params.sta_flags_set |= auth_assoc; 9597 } 9598 9599 /* must be last in here for error handling */ 9600 params.vlan = get_vlan(info, rdev); 9601 if (IS_ERR(params.vlan)) 9602 return PTR_ERR(params.vlan); 9603 break; 9604 case NL80211_IFTYPE_MESH_POINT: 9605 /* ignore uAPSD data */ 9606 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 9607 9608 /* associated is disallowed */ 9609 if (params.sta_flags_mask & BIT(NL80211_STA_FLAG_ASSOCIATED)) 9610 return -EINVAL; 9611 /* TDLS peers cannot be added */ 9612 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 9613 info->attrs[NL80211_ATTR_PEER_AID]) 9614 return -EINVAL; 9615 break; 9616 case NL80211_IFTYPE_STATION: 9617 case NL80211_IFTYPE_P2P_CLIENT: 9618 /* ignore uAPSD data */ 9619 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 9620 9621 /* these are disallowed */ 9622 if (params.sta_flags_mask & 9623 (BIT(NL80211_STA_FLAG_ASSOCIATED) | 9624 BIT(NL80211_STA_FLAG_AUTHENTICATED))) 9625 return -EINVAL; 9626 /* Only TDLS peers can be added */ 9627 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 9628 return -EINVAL; 9629 /* Can only add if TDLS ... */ 9630 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) 9631 return -EOPNOTSUPP; 9632 /* ... with external setup is supported */ 9633 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) 9634 return -EOPNOTSUPP; 9635 /* 9636 * Older wpa_supplicant versions always mark the TDLS peer 9637 * as authorized, but it shouldn't yet be. 9638 */ 9639 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_AUTHORIZED); 9640 break; 9641 case NL80211_IFTYPE_NAN: 9642 break; 9643 case NL80211_IFTYPE_NAN_DATA: 9644 params.nmi_mac = nla_data(info->attrs[NL80211_ATTR_NAN_NMI_MAC]); 9645 break; 9646 default: 9647 return -EOPNOTSUPP; 9648 } 9649 9650 /* be aware of params.vlan when changing code here */ 9651 9652 if (wdev->valid_links) { 9653 if (params.link_sta_params.link_id < 0) { 9654 err = -EINVAL; 9655 goto out; 9656 } 9657 if (!(wdev->valid_links & BIT(params.link_sta_params.link_id))) { 9658 err = -ENOLINK; 9659 goto out; 9660 } 9661 } else { 9662 if (params.link_sta_params.link_id >= 0) { 9663 err = -EINVAL; 9664 goto out; 9665 } 9666 } 9667 9668 params.epp_peer = 9669 nla_get_flag(info->attrs[NL80211_ATTR_EPP_PEER]); 9670 9671 err = rdev_add_station(rdev, wdev, mac_addr, ¶ms); 9672 out: 9673 dev_put(params.vlan); 9674 return err; 9675 } 9676 9677 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info) 9678 { 9679 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9680 struct wireless_dev *wdev = info->user_ptr[1]; 9681 struct net_device *dev = wdev->netdev; 9682 struct station_del_parameters params; 9683 int link_id = nl80211_link_id_or_invalid(info->attrs); 9684 9685 memset(¶ms, 0, sizeof(params)); 9686 9687 if (!dev && wdev->iftype != NL80211_IFTYPE_NAN) 9688 return -EINVAL; 9689 9690 if (info->attrs[NL80211_ATTR_MAC]) 9691 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]); 9692 9693 switch (wdev->iftype) { 9694 case NL80211_IFTYPE_AP: 9695 case NL80211_IFTYPE_AP_VLAN: 9696 case NL80211_IFTYPE_MESH_POINT: 9697 case NL80211_IFTYPE_P2P_GO: 9698 case NL80211_IFTYPE_NAN: 9699 case NL80211_IFTYPE_NAN_DATA: 9700 /* always accept these */ 9701 break; 9702 case NL80211_IFTYPE_ADHOC: 9703 /* conditionally accept */ 9704 if (wiphy_ext_feature_isset(&rdev->wiphy, 9705 NL80211_EXT_FEATURE_DEL_IBSS_STA)) 9706 break; 9707 return -EINVAL; 9708 default: 9709 return -EINVAL; 9710 } 9711 9712 if (!rdev->ops->del_station) 9713 return -EOPNOTSUPP; 9714 9715 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) { 9716 params.subtype = 9717 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]); 9718 if (params.subtype != IEEE80211_STYPE_DISASSOC >> 4 && 9719 params.subtype != IEEE80211_STYPE_DEAUTH >> 4) 9720 return -EINVAL; 9721 } else { 9722 /* Default to Deauthentication frame */ 9723 params.subtype = IEEE80211_STYPE_DEAUTH >> 4; 9724 } 9725 9726 if (info->attrs[NL80211_ATTR_REASON_CODE]) { 9727 params.reason_code = 9728 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 9729 if (params.reason_code == 0) 9730 return -EINVAL; /* 0 is reserved */ 9731 } else { 9732 /* Default to reason code 2 */ 9733 params.reason_code = WLAN_REASON_PREV_AUTH_NOT_VALID; 9734 } 9735 9736 /* Link ID not expected in case of non-ML operation */ 9737 if (!wdev->valid_links && link_id != -1) 9738 return -EINVAL; 9739 9740 /* If given, a valid link ID should be passed during MLO */ 9741 if (wdev->valid_links && link_id >= 0 && 9742 !(wdev->valid_links & BIT(link_id))) 9743 return -EINVAL; 9744 9745 params.link_id = link_id; 9746 9747 return rdev_del_station(rdev, wdev, ¶ms); 9748 } 9749 9750 static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq, 9751 int flags, struct net_device *dev, 9752 u8 *dst, u8 *next_hop, 9753 struct mpath_info *pinfo) 9754 { 9755 void *hdr; 9756 struct nlattr *pinfoattr; 9757 9758 hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_MPATH); 9759 if (!hdr) 9760 return -1; 9761 9762 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 9763 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dst) || 9764 nla_put(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop) || 9765 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) 9766 goto nla_put_failure; 9767 9768 pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MPATH_INFO); 9769 if (!pinfoattr) 9770 goto nla_put_failure; 9771 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && 9772 nla_put_u32(msg, NL80211_MPATH_INFO_FRAME_QLEN, 9773 pinfo->frame_qlen)) 9774 goto nla_put_failure; 9775 if (((pinfo->filled & MPATH_INFO_SN) && 9776 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || 9777 ((pinfo->filled & MPATH_INFO_METRIC) && 9778 nla_put_u32(msg, NL80211_MPATH_INFO_METRIC, 9779 pinfo->metric)) || 9780 ((pinfo->filled & MPATH_INFO_EXPTIME) && 9781 nla_put_u32(msg, NL80211_MPATH_INFO_EXPTIME, 9782 pinfo->exptime)) || 9783 ((pinfo->filled & MPATH_INFO_FLAGS) && 9784 nla_put_u8(msg, NL80211_MPATH_INFO_FLAGS, 9785 pinfo->flags)) || 9786 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && 9787 nla_put_u32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT, 9788 pinfo->discovery_timeout)) || 9789 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && 9790 nla_put_u8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES, 9791 pinfo->discovery_retries)) || 9792 ((pinfo->filled & MPATH_INFO_HOP_COUNT) && 9793 nla_put_u8(msg, NL80211_MPATH_INFO_HOP_COUNT, 9794 pinfo->hop_count)) || 9795 ((pinfo->filled & MPATH_INFO_PATH_CHANGE) && 9796 nla_put_u32(msg, NL80211_MPATH_INFO_PATH_CHANGE, 9797 pinfo->path_change_count))) 9798 goto nla_put_failure; 9799 9800 nla_nest_end(msg, pinfoattr); 9801 9802 genlmsg_end(msg, hdr); 9803 return 0; 9804 9805 nla_put_failure: 9806 genlmsg_cancel(msg, hdr); 9807 return -EMSGSIZE; 9808 } 9809 9810 static int nl80211_dump_mpath(struct sk_buff *skb, 9811 struct netlink_callback *cb) 9812 { 9813 struct mpath_info pinfo; 9814 struct cfg80211_registered_device *rdev; 9815 struct wireless_dev *wdev; 9816 u8 dst[ETH_ALEN]; 9817 u8 next_hop[ETH_ALEN]; 9818 int path_idx = cb->args[2]; 9819 int err; 9820 9821 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL); 9822 if (err) 9823 return err; 9824 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 9825 __acquire(&rdev->wiphy.mtx); 9826 9827 if (!rdev->ops->dump_mpath) { 9828 err = -EOPNOTSUPP; 9829 goto out_err; 9830 } 9831 9832 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 9833 err = -EOPNOTSUPP; 9834 goto out_err; 9835 } 9836 9837 while (1) { 9838 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst, 9839 next_hop, &pinfo); 9840 if (err == -ENOENT) 9841 break; 9842 if (err) 9843 goto out_err; 9844 9845 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 9846 cb->nlh->nlmsg_seq, NLM_F_MULTI, 9847 wdev->netdev, dst, next_hop, 9848 &pinfo) < 0) 9849 goto out; 9850 9851 path_idx++; 9852 } 9853 9854 out: 9855 cb->args[2] = path_idx; 9856 err = skb->len; 9857 out_err: 9858 wiphy_unlock(&rdev->wiphy); 9859 return err; 9860 } 9861 9862 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info) 9863 { 9864 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9865 int err; 9866 struct net_device *dev = info->user_ptr[1]; 9867 struct mpath_info pinfo; 9868 struct sk_buff *msg; 9869 u8 *dst = NULL; 9870 u8 next_hop[ETH_ALEN]; 9871 9872 memset(&pinfo, 0, sizeof(pinfo)); 9873 9874 if (!info->attrs[NL80211_ATTR_MAC]) 9875 return -EINVAL; 9876 9877 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9878 9879 if (!rdev->ops->get_mpath) 9880 return -EOPNOTSUPP; 9881 9882 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9883 return -EOPNOTSUPP; 9884 9885 err = rdev_get_mpath(rdev, dev, dst, next_hop, &pinfo); 9886 if (err) 9887 return err; 9888 9889 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9890 if (!msg) 9891 return -ENOMEM; 9892 9893 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 9894 dev, dst, next_hop, &pinfo) < 0) { 9895 nlmsg_free(msg); 9896 return -ENOBUFS; 9897 } 9898 9899 return genlmsg_reply(msg, info); 9900 } 9901 9902 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info) 9903 { 9904 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9905 struct net_device *dev = info->user_ptr[1]; 9906 u8 *dst = NULL; 9907 u8 *next_hop = NULL; 9908 9909 if (!info->attrs[NL80211_ATTR_MAC]) 9910 return -EINVAL; 9911 9912 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 9913 return -EINVAL; 9914 9915 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9916 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 9917 9918 if (!rdev->ops->change_mpath) 9919 return -EOPNOTSUPP; 9920 9921 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9922 return -EOPNOTSUPP; 9923 9924 return rdev_change_mpath(rdev, dev, dst, next_hop); 9925 } 9926 9927 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info) 9928 { 9929 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9930 struct net_device *dev = info->user_ptr[1]; 9931 u8 *dst = NULL; 9932 u8 *next_hop = NULL; 9933 9934 if (!info->attrs[NL80211_ATTR_MAC]) 9935 return -EINVAL; 9936 9937 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 9938 return -EINVAL; 9939 9940 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9941 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 9942 9943 if (!rdev->ops->add_mpath) 9944 return -EOPNOTSUPP; 9945 9946 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9947 return -EOPNOTSUPP; 9948 9949 return rdev_add_mpath(rdev, dev, dst, next_hop); 9950 } 9951 9952 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info) 9953 { 9954 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9955 struct net_device *dev = info->user_ptr[1]; 9956 u8 *dst = NULL; 9957 9958 if (info->attrs[NL80211_ATTR_MAC]) 9959 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9960 9961 if (!rdev->ops->del_mpath) 9962 return -EOPNOTSUPP; 9963 9964 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9965 return -EOPNOTSUPP; 9966 9967 return rdev_del_mpath(rdev, dev, dst); 9968 } 9969 9970 static int nl80211_get_mpp(struct sk_buff *skb, struct genl_info *info) 9971 { 9972 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9973 int err; 9974 struct net_device *dev = info->user_ptr[1]; 9975 struct mpath_info pinfo; 9976 struct sk_buff *msg; 9977 u8 *dst = NULL; 9978 u8 mpp[ETH_ALEN]; 9979 9980 memset(&pinfo, 0, sizeof(pinfo)); 9981 9982 if (!info->attrs[NL80211_ATTR_MAC]) 9983 return -EINVAL; 9984 9985 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9986 9987 if (!rdev->ops->get_mpp) 9988 return -EOPNOTSUPP; 9989 9990 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9991 return -EOPNOTSUPP; 9992 9993 err = rdev_get_mpp(rdev, dev, dst, mpp, &pinfo); 9994 if (err) 9995 return err; 9996 9997 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9998 if (!msg) 9999 return -ENOMEM; 10000 10001 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 10002 dev, dst, mpp, &pinfo) < 0) { 10003 nlmsg_free(msg); 10004 return -ENOBUFS; 10005 } 10006 10007 return genlmsg_reply(msg, info); 10008 } 10009 10010 static int nl80211_dump_mpp(struct sk_buff *skb, 10011 struct netlink_callback *cb) 10012 { 10013 struct mpath_info pinfo; 10014 struct cfg80211_registered_device *rdev; 10015 struct wireless_dev *wdev; 10016 u8 dst[ETH_ALEN]; 10017 u8 mpp[ETH_ALEN]; 10018 int path_idx = cb->args[2]; 10019 int err; 10020 10021 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL); 10022 if (err) 10023 return err; 10024 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 10025 __acquire(&rdev->wiphy.mtx); 10026 10027 if (!rdev->ops->dump_mpp) { 10028 err = -EOPNOTSUPP; 10029 goto out_err; 10030 } 10031 10032 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 10033 err = -EOPNOTSUPP; 10034 goto out_err; 10035 } 10036 10037 while (1) { 10038 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst, 10039 mpp, &pinfo); 10040 if (err == -ENOENT) 10041 break; 10042 if (err) 10043 goto out_err; 10044 10045 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 10046 cb->nlh->nlmsg_seq, NLM_F_MULTI, 10047 wdev->netdev, dst, mpp, 10048 &pinfo) < 0) 10049 goto out; 10050 10051 path_idx++; 10052 } 10053 10054 out: 10055 cb->args[2] = path_idx; 10056 err = skb->len; 10057 out_err: 10058 wiphy_unlock(&rdev->wiphy); 10059 return err; 10060 } 10061 10062 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info) 10063 { 10064 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10065 struct net_device *dev = info->user_ptr[1]; 10066 struct bss_parameters params; 10067 u32 bss_param_support = rdev->wiphy.bss_param_support; 10068 u32 changed = 0; 10069 bool strict; 10070 10071 memset(¶ms, 0, sizeof(params)); 10072 params.link_id = nl80211_link_id_or_invalid(info->attrs); 10073 /* default to not changing parameters */ 10074 params.use_cts_prot = -1; 10075 params.use_short_preamble = -1; 10076 params.use_short_slot_time = -1; 10077 params.ap_isolate = -1; 10078 params.ht_opmode = -1; 10079 params.p2p_ctwindow = -1; 10080 params.p2p_opp_ps = -1; 10081 10082 strict = nla_get_flag(info->attrs[NL80211_ATTR_BSS_PARAM]); 10083 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) { 10084 if (strict && !(bss_param_support & WIPHY_BSS_PARAM_CTS_PROT)) 10085 return -EINVAL; 10086 params.use_cts_prot = 10087 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); 10088 changed |= WIPHY_BSS_PARAM_CTS_PROT; 10089 } 10090 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) { 10091 if (strict && 10092 !(bss_param_support & WIPHY_BSS_PARAM_SHORT_PREAMBLE)) 10093 return -EINVAL; 10094 params.use_short_preamble = 10095 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); 10096 changed |= WIPHY_BSS_PARAM_SHORT_PREAMBLE; 10097 } 10098 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) { 10099 if (strict && 10100 !(bss_param_support & WIPHY_BSS_PARAM_SHORT_SLOT_TIME)) 10101 return -EINVAL; 10102 params.use_short_slot_time = 10103 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); 10104 changed |= WIPHY_BSS_PARAM_SHORT_SLOT_TIME; 10105 } 10106 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 10107 if (strict && 10108 !(bss_param_support & WIPHY_BSS_PARAM_BASIC_RATES)) 10109 return -EINVAL; 10110 params.basic_rates = 10111 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 10112 params.basic_rates_len = 10113 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 10114 changed |= WIPHY_BSS_PARAM_BASIC_RATES; 10115 } 10116 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) { 10117 if (strict && !(bss_param_support & WIPHY_BSS_PARAM_AP_ISOLATE)) 10118 return -EINVAL; 10119 params.ap_isolate = 10120 !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); 10121 changed |= WIPHY_BSS_PARAM_AP_ISOLATE; 10122 } 10123 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) { 10124 if (strict && !(bss_param_support & WIPHY_BSS_PARAM_HT_OPMODE)) 10125 return -EINVAL; 10126 params.ht_opmode = 10127 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); 10128 changed |= WIPHY_BSS_PARAM_HT_OPMODE; 10129 } 10130 10131 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 10132 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 10133 return -EINVAL; 10134 params.p2p_ctwindow = 10135 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 10136 if (params.p2p_ctwindow != 0 && 10137 !(bss_param_support & WIPHY_BSS_PARAM_P2P_CTWINDOW)) 10138 return -EINVAL; 10139 changed |= WIPHY_BSS_PARAM_P2P_CTWINDOW; 10140 } 10141 10142 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 10143 u8 tmp; 10144 10145 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 10146 return -EINVAL; 10147 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 10148 if (tmp && !(bss_param_support & WIPHY_BSS_PARAM_P2P_OPPPS)) 10149 return -EINVAL; 10150 params.p2p_opp_ps = tmp; 10151 if (params.p2p_opp_ps && 10152 !(rdev->wiphy.bss_param_support & WIPHY_BSS_PARAM_P2P_OPPPS)) 10153 return -EINVAL; 10154 } 10155 10156 if (!rdev->ops->change_bss) 10157 return -EOPNOTSUPP; 10158 10159 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 10160 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 10161 return -EOPNOTSUPP; 10162 10163 changed &= rdev->wiphy.bss_param_support; 10164 if (!changed) 10165 return 0; 10166 10167 return rdev_change_bss(rdev, dev, ¶ms); 10168 } 10169 10170 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info) 10171 { 10172 char *data = NULL; 10173 bool is_indoor; 10174 enum nl80211_user_reg_hint_type user_reg_hint_type; 10175 u32 owner_nlportid; 10176 10177 /* 10178 * You should only get this when cfg80211 hasn't yet initialized 10179 * completely when built-in to the kernel right between the time 10180 * window between nl80211_init() and regulatory_init(), if that is 10181 * even possible. 10182 */ 10183 if (unlikely(!rcu_access_pointer(cfg80211_regdomain))) 10184 return -EINPROGRESS; 10185 10186 user_reg_hint_type = 10187 nla_get_u32_default(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE], 10188 NL80211_USER_REG_HINT_USER); 10189 10190 switch (user_reg_hint_type) { 10191 case NL80211_USER_REG_HINT_USER: 10192 case NL80211_USER_REG_HINT_CELL_BASE: 10193 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 10194 return -EINVAL; 10195 10196 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 10197 return regulatory_hint_user(data, user_reg_hint_type); 10198 case NL80211_USER_REG_HINT_INDOOR: 10199 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 10200 owner_nlportid = info->snd_portid; 10201 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR]; 10202 } else { 10203 owner_nlportid = 0; 10204 is_indoor = true; 10205 } 10206 10207 regulatory_hint_indoor(is_indoor, owner_nlportid); 10208 return 0; 10209 default: 10210 return -EINVAL; 10211 } 10212 } 10213 10214 static int nl80211_reload_regdb(struct sk_buff *skb, struct genl_info *info) 10215 { 10216 return reg_reload_regdb(); 10217 } 10218 10219 static int nl80211_get_mesh_config(struct sk_buff *skb, 10220 struct genl_info *info) 10221 { 10222 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10223 struct net_device *dev = info->user_ptr[1]; 10224 struct wireless_dev *wdev = dev->ieee80211_ptr; 10225 struct mesh_config cur_params; 10226 int err = 0; 10227 void *hdr; 10228 struct nlattr *pinfoattr; 10229 struct sk_buff *msg; 10230 10231 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 10232 return -EOPNOTSUPP; 10233 10234 if (!rdev->ops->get_mesh_config) 10235 return -EOPNOTSUPP; 10236 10237 /* If not connected, get default parameters */ 10238 if (!wdev->u.mesh.id_len) 10239 memcpy(&cur_params, &default_mesh_config, sizeof(cur_params)); 10240 else 10241 err = rdev_get_mesh_config(rdev, dev, &cur_params); 10242 10243 if (err) 10244 return err; 10245 10246 /* Draw up a netlink message to send back */ 10247 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 10248 if (!msg) 10249 return -ENOMEM; 10250 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 10251 NL80211_CMD_GET_MESH_CONFIG); 10252 if (!hdr) 10253 goto out; 10254 pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MESH_CONFIG); 10255 if (!pinfoattr) 10256 goto nla_put_failure; 10257 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 10258 nla_put_u16(msg, NL80211_MESHCONF_RETRY_TIMEOUT, 10259 cur_params.dot11MeshRetryTimeout) || 10260 nla_put_u16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT, 10261 cur_params.dot11MeshConfirmTimeout) || 10262 nla_put_u16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT, 10263 cur_params.dot11MeshHoldingTimeout) || 10264 nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS, 10265 cur_params.dot11MeshMaxPeerLinks) || 10266 nla_put_u8(msg, NL80211_MESHCONF_MAX_RETRIES, 10267 cur_params.dot11MeshMaxRetries) || 10268 nla_put_u8(msg, NL80211_MESHCONF_TTL, 10269 cur_params.dot11MeshTTL) || 10270 nla_put_u8(msg, NL80211_MESHCONF_ELEMENT_TTL, 10271 cur_params.element_ttl) || 10272 nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS, 10273 cur_params.auto_open_plinks) || 10274 nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 10275 cur_params.dot11MeshNbrOffsetMaxNeighbor) || 10276 nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 10277 cur_params.dot11MeshHWMPmaxPREQretries) || 10278 nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME, 10279 cur_params.path_refresh_time) || 10280 nla_put_u16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 10281 cur_params.min_discovery_timeout) || 10282 nla_put_u32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 10283 cur_params.dot11MeshHWMPactivePathTimeout) || 10284 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 10285 cur_params.dot11MeshHWMPpreqMinInterval) || 10286 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 10287 cur_params.dot11MeshHWMPperrMinInterval) || 10288 nla_put_u16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 10289 cur_params.dot11MeshHWMPnetDiameterTraversalTime) || 10290 nla_put_u8(msg, NL80211_MESHCONF_HWMP_ROOTMODE, 10291 cur_params.dot11MeshHWMPRootMode) || 10292 nla_put_u16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL, 10293 cur_params.dot11MeshHWMPRannInterval) || 10294 nla_put_u8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 10295 cur_params.dot11MeshGateAnnouncementProtocol) || 10296 nla_put_u8(msg, NL80211_MESHCONF_FORWARDING, 10297 cur_params.dot11MeshForwarding) || 10298 nla_put_s32(msg, NL80211_MESHCONF_RSSI_THRESHOLD, 10299 cur_params.rssi_threshold) || 10300 nla_put_u32(msg, NL80211_MESHCONF_HT_OPMODE, 10301 cur_params.ht_opmode) || 10302 nla_put_u32(msg, NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 10303 cur_params.dot11MeshHWMPactivePathToRootTimeout) || 10304 nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 10305 cur_params.dot11MeshHWMProotInterval) || 10306 nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 10307 cur_params.dot11MeshHWMPconfirmationInterval) || 10308 nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE, 10309 cur_params.power_mode) || 10310 nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW, 10311 cur_params.dot11MeshAwakeWindowDuration) || 10312 nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT, 10313 cur_params.plink_timeout) || 10314 nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_GATE, 10315 cur_params.dot11MeshConnectedToMeshGate) || 10316 nla_put_u8(msg, NL80211_MESHCONF_NOLEARN, 10317 cur_params.dot11MeshNolearn) || 10318 nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_AS, 10319 cur_params.dot11MeshConnectedToAuthServer)) 10320 goto nla_put_failure; 10321 nla_nest_end(msg, pinfoattr); 10322 genlmsg_end(msg, hdr); 10323 return genlmsg_reply(msg, info); 10324 10325 nla_put_failure: 10326 out: 10327 nlmsg_free(msg); 10328 return -ENOBUFS; 10329 } 10330 10331 static const struct nla_policy 10332 nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = { 10333 [NL80211_MESHCONF_RETRY_TIMEOUT] = 10334 NLA_POLICY_RANGE(NLA_U16, 1, 255), 10335 [NL80211_MESHCONF_CONFIRM_TIMEOUT] = 10336 NLA_POLICY_RANGE(NLA_U16, 1, 255), 10337 [NL80211_MESHCONF_HOLDING_TIMEOUT] = 10338 NLA_POLICY_RANGE(NLA_U16, 1, 255), 10339 [NL80211_MESHCONF_MAX_PEER_LINKS] = 10340 NLA_POLICY_RANGE(NLA_U16, 0, 255), 10341 [NL80211_MESHCONF_MAX_RETRIES] = NLA_POLICY_MAX(NLA_U8, 16), 10342 [NL80211_MESHCONF_TTL] = NLA_POLICY_MIN(NLA_U8, 1), 10343 [NL80211_MESHCONF_ELEMENT_TTL] = NLA_POLICY_MIN(NLA_U8, 1), 10344 [NL80211_MESHCONF_AUTO_OPEN_PLINKS] = NLA_POLICY_MAX(NLA_U8, 1), 10345 [NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] = 10346 NLA_POLICY_RANGE(NLA_U32, 1, 255), 10347 [NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 }, 10348 [NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 }, 10349 [NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = NLA_POLICY_MIN(NLA_U16, 1), 10350 [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 }, 10351 [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = 10352 NLA_POLICY_MIN(NLA_U16, 1), 10353 [NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] = 10354 NLA_POLICY_MIN(NLA_U16, 1), 10355 [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = 10356 NLA_POLICY_MIN(NLA_U16, 1), 10357 [NL80211_MESHCONF_HWMP_ROOTMODE] = NLA_POLICY_MAX(NLA_U8, 4), 10358 [NL80211_MESHCONF_HWMP_RANN_INTERVAL] = 10359 NLA_POLICY_MIN(NLA_U16, 1), 10360 [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = NLA_POLICY_MAX(NLA_U8, 1), 10361 [NL80211_MESHCONF_FORWARDING] = NLA_POLICY_MAX(NLA_U8, 1), 10362 [NL80211_MESHCONF_RSSI_THRESHOLD] = 10363 NLA_POLICY_RANGE(NLA_S32, -255, 0), 10364 [NL80211_MESHCONF_HT_OPMODE] = { .type = NLA_U16 }, 10365 [NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 }, 10366 [NL80211_MESHCONF_HWMP_ROOT_INTERVAL] = 10367 NLA_POLICY_MIN(NLA_U16, 1), 10368 [NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] = 10369 NLA_POLICY_MIN(NLA_U16, 1), 10370 [NL80211_MESHCONF_POWER_MODE] = 10371 NLA_POLICY_RANGE(NLA_U32, 10372 NL80211_MESH_POWER_ACTIVE, 10373 NL80211_MESH_POWER_MAX), 10374 [NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 }, 10375 [NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 }, 10376 [NL80211_MESHCONF_CONNECTED_TO_GATE] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 10377 [NL80211_MESHCONF_NOLEARN] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 10378 [NL80211_MESHCONF_CONNECTED_TO_AS] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 10379 }; 10380 10381 static const struct nla_policy 10382 nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = { 10383 [NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 }, 10384 [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 }, 10385 [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 }, 10386 [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG }, 10387 [NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 }, 10388 [NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG }, 10389 [NL80211_MESH_SETUP_IE] = 10390 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 10391 IEEE80211_MAX_DATA_LEN), 10392 [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG }, 10393 }; 10394 10395 static int nl80211_parse_mesh_config(struct genl_info *info, 10396 struct mesh_config *cfg, 10397 u32 *mask_out) 10398 { 10399 struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1]; 10400 u32 mask = 0; 10401 u16 ht_opmode; 10402 10403 #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, mask, attr, fn) \ 10404 do { \ 10405 if (tb[attr]) { \ 10406 cfg->param = fn(tb[attr]); \ 10407 mask |= BIT((attr) - 1); \ 10408 } \ 10409 } while (0) 10410 10411 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) 10412 return -EINVAL; 10413 if (nla_parse_nested_deprecated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params_policy, info->extack)) 10414 return -EINVAL; 10415 10416 /* This makes sure that there aren't more than 32 mesh config 10417 * parameters (otherwise our bitfield scheme would not work.) */ 10418 BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32); 10419 10420 /* Fill in the params struct */ 10421 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout, mask, 10422 NL80211_MESHCONF_RETRY_TIMEOUT, nla_get_u16); 10423 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout, mask, 10424 NL80211_MESHCONF_CONFIRM_TIMEOUT, 10425 nla_get_u16); 10426 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout, mask, 10427 NL80211_MESHCONF_HOLDING_TIMEOUT, 10428 nla_get_u16); 10429 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks, mask, 10430 NL80211_MESHCONF_MAX_PEER_LINKS, 10431 nla_get_u16); 10432 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries, mask, 10433 NL80211_MESHCONF_MAX_RETRIES, nla_get_u8); 10434 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL, mask, 10435 NL80211_MESHCONF_TTL, nla_get_u8); 10436 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl, mask, 10437 NL80211_MESHCONF_ELEMENT_TTL, nla_get_u8); 10438 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks, mask, 10439 NL80211_MESHCONF_AUTO_OPEN_PLINKS, 10440 nla_get_u8); 10441 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor, 10442 mask, 10443 NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 10444 nla_get_u32); 10445 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries, mask, 10446 NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 10447 nla_get_u8); 10448 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time, mask, 10449 NL80211_MESHCONF_PATH_REFRESH_TIME, 10450 nla_get_u32); 10451 if (mask & BIT(NL80211_MESHCONF_PATH_REFRESH_TIME) && 10452 (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535)) 10453 return -EINVAL; 10454 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout, mask, 10455 NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 10456 nla_get_u16); 10457 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout, 10458 mask, 10459 NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 10460 nla_get_u32); 10461 if (mask & BIT(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT) && 10462 (cfg->dot11MeshHWMPactivePathTimeout < 1 || 10463 cfg->dot11MeshHWMPactivePathTimeout > 65535)) 10464 return -EINVAL; 10465 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval, mask, 10466 NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 10467 nla_get_u16); 10468 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPperrMinInterval, mask, 10469 NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 10470 nla_get_u16); 10471 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 10472 dot11MeshHWMPnetDiameterTraversalTime, mask, 10473 NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 10474 nla_get_u16); 10475 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRootMode, mask, 10476 NL80211_MESHCONF_HWMP_ROOTMODE, nla_get_u8); 10477 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRannInterval, mask, 10478 NL80211_MESHCONF_HWMP_RANN_INTERVAL, 10479 nla_get_u16); 10480 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshGateAnnouncementProtocol, 10481 mask, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 10482 nla_get_u8); 10483 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, mask, 10484 NL80211_MESHCONF_FORWARDING, nla_get_u8); 10485 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, mask, 10486 NL80211_MESHCONF_RSSI_THRESHOLD, 10487 nla_get_s32); 10488 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToMeshGate, mask, 10489 NL80211_MESHCONF_CONNECTED_TO_GATE, 10490 nla_get_u8); 10491 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToAuthServer, mask, 10492 NL80211_MESHCONF_CONNECTED_TO_AS, 10493 nla_get_u8); 10494 /* 10495 * Check HT operation mode based on 10496 * IEEE 802.11-2016 9.4.2.57 HT Operation element. 10497 */ 10498 if (tb[NL80211_MESHCONF_HT_OPMODE]) { 10499 ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]); 10500 10501 if (ht_opmode & ~(IEEE80211_HT_OP_MODE_PROTECTION | 10502 IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT | 10503 IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)) 10504 return -EINVAL; 10505 10506 /* NON_HT_STA bit is reserved, but some programs set it */ 10507 ht_opmode &= ~IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT; 10508 10509 cfg->ht_opmode = ht_opmode; 10510 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); 10511 } 10512 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 10513 dot11MeshHWMPactivePathToRootTimeout, mask, 10514 NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 10515 nla_get_u32); 10516 if (mask & BIT(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT) && 10517 (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 || 10518 cfg->dot11MeshHWMPactivePathToRootTimeout > 65535)) 10519 return -EINVAL; 10520 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMProotInterval, mask, 10521 NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 10522 nla_get_u16); 10523 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPconfirmationInterval, 10524 mask, 10525 NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 10526 nla_get_u16); 10527 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode, mask, 10528 NL80211_MESHCONF_POWER_MODE, nla_get_u32); 10529 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration, mask, 10530 NL80211_MESHCONF_AWAKE_WINDOW, nla_get_u16); 10531 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, plink_timeout, mask, 10532 NL80211_MESHCONF_PLINK_TIMEOUT, nla_get_u32); 10533 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNolearn, mask, 10534 NL80211_MESHCONF_NOLEARN, nla_get_u8); 10535 if (mask_out) 10536 *mask_out = mask; 10537 10538 return 0; 10539 10540 #undef FILL_IN_MESH_PARAM_IF_SET 10541 } 10542 10543 static int nl80211_parse_mesh_setup(struct genl_info *info, 10544 struct mesh_setup *setup) 10545 { 10546 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10547 struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1]; 10548 10549 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) 10550 return -EINVAL; 10551 if (nla_parse_nested_deprecated(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_params_policy, info->extack)) 10552 return -EINVAL; 10553 10554 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC]) 10555 setup->sync_method = 10556 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ? 10557 IEEE80211_SYNC_METHOD_VENDOR : 10558 IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET; 10559 10560 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL]) 10561 setup->path_sel_proto = 10562 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ? 10563 IEEE80211_PATH_PROTOCOL_VENDOR : 10564 IEEE80211_PATH_PROTOCOL_HWMP; 10565 10566 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC]) 10567 setup->path_metric = 10568 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ? 10569 IEEE80211_PATH_METRIC_VENDOR : 10570 IEEE80211_PATH_METRIC_AIRTIME; 10571 10572 if (tb[NL80211_MESH_SETUP_IE]) { 10573 struct nlattr *ieattr = 10574 tb[NL80211_MESH_SETUP_IE]; 10575 setup->ie = nla_data(ieattr); 10576 setup->ie_len = nla_len(ieattr); 10577 } 10578 if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] && 10579 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) 10580 return -EINVAL; 10581 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); 10582 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); 10583 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); 10584 if (setup->is_secure) 10585 setup->user_mpm = true; 10586 10587 if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) { 10588 if (!setup->user_mpm) 10589 return -EINVAL; 10590 setup->auth_id = 10591 nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]); 10592 } 10593 10594 return 0; 10595 } 10596 10597 static int nl80211_update_mesh_config(struct sk_buff *skb, 10598 struct genl_info *info) 10599 { 10600 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10601 struct net_device *dev = info->user_ptr[1]; 10602 struct wireless_dev *wdev = dev->ieee80211_ptr; 10603 struct mesh_config cfg = {}; 10604 u32 mask; 10605 int err; 10606 10607 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 10608 return -EOPNOTSUPP; 10609 10610 if (!rdev->ops->update_mesh_config) 10611 return -EOPNOTSUPP; 10612 10613 err = nl80211_parse_mesh_config(info, &cfg, &mask); 10614 if (err) 10615 return err; 10616 10617 if (!wdev->u.mesh.id_len) 10618 err = -ENOLINK; 10619 10620 if (!err) 10621 err = rdev_update_mesh_config(rdev, dev, mask, &cfg); 10622 10623 return err; 10624 } 10625 10626 static int nl80211_put_regdom(const struct ieee80211_regdomain *regdom, 10627 struct sk_buff *msg) 10628 { 10629 struct nlattr *nl_reg_rules; 10630 unsigned int i; 10631 10632 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || 10633 (regdom->dfs_region && 10634 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) 10635 goto nla_put_failure; 10636 10637 nl_reg_rules = nla_nest_start_noflag(msg, NL80211_ATTR_REG_RULES); 10638 if (!nl_reg_rules) 10639 goto nla_put_failure; 10640 10641 for (i = 0; i < regdom->n_reg_rules; i++) { 10642 struct nlattr *nl_reg_rule; 10643 const struct ieee80211_reg_rule *reg_rule; 10644 const struct ieee80211_freq_range *freq_range; 10645 const struct ieee80211_power_rule *power_rule; 10646 unsigned int max_bandwidth_khz; 10647 10648 reg_rule = ®dom->reg_rules[i]; 10649 freq_range = ®_rule->freq_range; 10650 power_rule = ®_rule->power_rule; 10651 10652 nl_reg_rule = nla_nest_start_noflag(msg, i); 10653 if (!nl_reg_rule) 10654 goto nla_put_failure; 10655 10656 max_bandwidth_khz = freq_range->max_bandwidth_khz; 10657 if (!max_bandwidth_khz) 10658 max_bandwidth_khz = reg_get_max_bandwidth(regdom, 10659 reg_rule); 10660 10661 if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS, 10662 reg_rule->flags) || 10663 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START, 10664 freq_range->start_freq_khz) || 10665 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END, 10666 freq_range->end_freq_khz) || 10667 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW, 10668 max_bandwidth_khz) || 10669 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN, 10670 power_rule->max_antenna_gain) || 10671 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP, 10672 power_rule->max_eirp) || 10673 nla_put_u32(msg, NL80211_ATTR_DFS_CAC_TIME, 10674 reg_rule->dfs_cac_ms)) 10675 goto nla_put_failure; 10676 10677 if ((reg_rule->flags & NL80211_RRF_PSD) && 10678 nla_put_s8(msg, NL80211_ATTR_POWER_RULE_PSD, 10679 reg_rule->psd)) 10680 goto nla_put_failure; 10681 10682 nla_nest_end(msg, nl_reg_rule); 10683 } 10684 10685 nla_nest_end(msg, nl_reg_rules); 10686 return 0; 10687 10688 nla_put_failure: 10689 return -EMSGSIZE; 10690 } 10691 10692 static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info) 10693 { 10694 const struct ieee80211_regdomain *regdom = NULL; 10695 struct cfg80211_registered_device *rdev; 10696 struct wiphy *wiphy = NULL; 10697 struct sk_buff *msg; 10698 int err = -EMSGSIZE; 10699 void *hdr; 10700 10701 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 10702 if (!msg) 10703 return -ENOBUFS; 10704 10705 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 10706 NL80211_CMD_GET_REG); 10707 if (!hdr) 10708 goto put_failure; 10709 10710 rtnl_lock(); 10711 10712 if (info->attrs[NL80211_ATTR_WIPHY]) { 10713 bool self_managed; 10714 10715 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 10716 if (IS_ERR(rdev)) { 10717 err = PTR_ERR(rdev); 10718 goto nla_put_failure; 10719 } 10720 10721 wiphy = &rdev->wiphy; 10722 self_managed = wiphy->regulatory_flags & 10723 REGULATORY_WIPHY_SELF_MANAGED; 10724 10725 rcu_read_lock(); 10726 10727 regdom = get_wiphy_regdom(wiphy); 10728 10729 /* a self-managed-reg device must have a private regdom */ 10730 if (WARN_ON(!regdom && self_managed)) { 10731 err = -EINVAL; 10732 goto nla_put_failure_rcu; 10733 } 10734 10735 if (regdom && 10736 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 10737 goto nla_put_failure_rcu; 10738 } else { 10739 rcu_read_lock(); 10740 } 10741 10742 if (!wiphy && reg_last_request_cell_base() && 10743 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 10744 NL80211_USER_REG_HINT_CELL_BASE)) 10745 goto nla_put_failure_rcu; 10746 10747 if (!regdom) 10748 regdom = rcu_dereference(cfg80211_regdomain); 10749 10750 if (nl80211_put_regdom(regdom, msg)) 10751 goto nla_put_failure_rcu; 10752 10753 rcu_read_unlock(); 10754 10755 genlmsg_end(msg, hdr); 10756 rtnl_unlock(); 10757 return genlmsg_reply(msg, info); 10758 10759 nla_put_failure_rcu: 10760 rcu_read_unlock(); 10761 nla_put_failure: 10762 rtnl_unlock(); 10763 put_failure: 10764 nlmsg_free(msg); 10765 return err; 10766 } 10767 10768 static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb, 10769 u32 seq, int flags, struct wiphy *wiphy, 10770 const struct ieee80211_regdomain *regdom) 10771 { 10772 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 10773 NL80211_CMD_GET_REG); 10774 10775 if (!hdr) 10776 return -1; 10777 10778 genl_dump_check_consistent(cb, hdr); 10779 10780 if (nl80211_put_regdom(regdom, msg)) 10781 goto nla_put_failure; 10782 10783 if (!wiphy && reg_last_request_cell_base() && 10784 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 10785 NL80211_USER_REG_HINT_CELL_BASE)) 10786 goto nla_put_failure; 10787 10788 if (wiphy && 10789 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 10790 goto nla_put_failure; 10791 10792 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 10793 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 10794 goto nla_put_failure; 10795 10796 genlmsg_end(msg, hdr); 10797 return 0; 10798 10799 nla_put_failure: 10800 genlmsg_cancel(msg, hdr); 10801 return -EMSGSIZE; 10802 } 10803 10804 static int nl80211_get_reg_dump(struct sk_buff *skb, 10805 struct netlink_callback *cb) 10806 { 10807 const struct ieee80211_regdomain *regdom = NULL; 10808 struct cfg80211_registered_device *rdev; 10809 int err, reg_idx, start = cb->args[2]; 10810 10811 rcu_read_lock(); 10812 10813 if (cfg80211_regdomain && start == 0) { 10814 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, 10815 NLM_F_MULTI, NULL, 10816 rcu_dereference(cfg80211_regdomain)); 10817 if (err < 0) 10818 goto out_err; 10819 } 10820 10821 /* the global regdom is idx 0 */ 10822 reg_idx = 1; 10823 list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) { 10824 regdom = get_wiphy_regdom(&rdev->wiphy); 10825 if (!regdom) 10826 continue; 10827 10828 if (++reg_idx <= start) 10829 continue; 10830 10831 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, 10832 NLM_F_MULTI, &rdev->wiphy, regdom); 10833 if (err < 0) { 10834 reg_idx--; 10835 break; 10836 } 10837 } 10838 10839 cb->args[2] = reg_idx; 10840 err = skb->len; 10841 out_err: 10842 rcu_read_unlock(); 10843 return err; 10844 } 10845 10846 #ifdef CONFIG_CFG80211_CRDA_SUPPORT 10847 static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = { 10848 [NL80211_ATTR_REG_RULE_FLAGS] = { .type = NLA_U32 }, 10849 [NL80211_ATTR_FREQ_RANGE_START] = { .type = NLA_U32 }, 10850 [NL80211_ATTR_FREQ_RANGE_END] = { .type = NLA_U32 }, 10851 [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 }, 10852 [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 }, 10853 [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 }, 10854 [NL80211_ATTR_DFS_CAC_TIME] = { .type = NLA_U32 }, 10855 }; 10856 10857 static int parse_reg_rule(struct nlattr *tb[], 10858 struct ieee80211_reg_rule *reg_rule) 10859 { 10860 struct ieee80211_freq_range *freq_range = ®_rule->freq_range; 10861 struct ieee80211_power_rule *power_rule = ®_rule->power_rule; 10862 10863 if (!tb[NL80211_ATTR_REG_RULE_FLAGS]) 10864 return -EINVAL; 10865 if (!tb[NL80211_ATTR_FREQ_RANGE_START]) 10866 return -EINVAL; 10867 if (!tb[NL80211_ATTR_FREQ_RANGE_END]) 10868 return -EINVAL; 10869 if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]) 10870 return -EINVAL; 10871 if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]) 10872 return -EINVAL; 10873 10874 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); 10875 10876 freq_range->start_freq_khz = 10877 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]); 10878 freq_range->end_freq_khz = 10879 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]); 10880 freq_range->max_bandwidth_khz = 10881 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]); 10882 10883 power_rule->max_eirp = 10884 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]); 10885 10886 if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]) 10887 power_rule->max_antenna_gain = 10888 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]); 10889 10890 if (tb[NL80211_ATTR_DFS_CAC_TIME]) 10891 reg_rule->dfs_cac_ms = 10892 nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]); 10893 10894 return 0; 10895 } 10896 10897 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info) 10898 { 10899 struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1]; 10900 struct nlattr *nl_reg_rule; 10901 char *alpha2; 10902 int rem_reg_rules, r; 10903 u32 num_rules = 0, rule_idx = 0; 10904 enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET; 10905 struct ieee80211_regdomain *rd; 10906 10907 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 10908 return -EINVAL; 10909 10910 if (!info->attrs[NL80211_ATTR_REG_RULES]) 10911 return -EINVAL; 10912 10913 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 10914 10915 if (info->attrs[NL80211_ATTR_DFS_REGION]) 10916 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); 10917 10918 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 10919 rem_reg_rules) { 10920 num_rules++; 10921 if (num_rules > NL80211_MAX_SUPP_REG_RULES) 10922 return -EINVAL; 10923 } 10924 10925 rtnl_lock(); 10926 if (!reg_is_valid_request(alpha2)) { 10927 r = -EINVAL; 10928 goto out; 10929 } 10930 10931 rd = kzalloc_flex(*rd, reg_rules, num_rules); 10932 if (!rd) { 10933 r = -ENOMEM; 10934 goto out; 10935 } 10936 10937 rd->n_reg_rules = num_rules; 10938 rd->alpha2[0] = alpha2[0]; 10939 rd->alpha2[1] = alpha2[1]; 10940 10941 /* 10942 * Disable DFS master mode if the DFS region was 10943 * not supported or known on this kernel. 10944 */ 10945 if (reg_supported_dfs_region(dfs_region)) 10946 rd->dfs_region = dfs_region; 10947 10948 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 10949 rem_reg_rules) { 10950 r = nla_parse_nested_deprecated(tb, NL80211_REG_RULE_ATTR_MAX, 10951 nl_reg_rule, reg_rule_policy, 10952 info->extack); 10953 if (r) 10954 goto bad_reg; 10955 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); 10956 if (r) 10957 goto bad_reg; 10958 10959 rule_idx++; 10960 10961 if (rule_idx > NL80211_MAX_SUPP_REG_RULES) { 10962 r = -EINVAL; 10963 goto bad_reg; 10964 } 10965 } 10966 10967 r = set_regdom(rd, REGD_SOURCE_CRDA); 10968 /* set_regdom takes ownership of rd */ 10969 rd = NULL; 10970 bad_reg: 10971 kfree(rd); 10972 out: 10973 rtnl_unlock(); 10974 return r; 10975 } 10976 #endif /* CONFIG_CFG80211_CRDA_SUPPORT */ 10977 10978 static int validate_scan_freqs(struct nlattr *freqs) 10979 { 10980 struct nlattr *attr1, *attr2; 10981 int n_channels = 0, tmp1, tmp2; 10982 10983 nla_for_each_nested(attr1, freqs, tmp1) 10984 if (nla_len(attr1) != sizeof(u32)) 10985 return 0; 10986 10987 nla_for_each_nested(attr1, freqs, tmp1) { 10988 n_channels++; 10989 /* 10990 * Some hardware has a limited channel list for 10991 * scanning, and it is pretty much nonsensical 10992 * to scan for a channel twice, so disallow that 10993 * and don't require drivers to check that the 10994 * channel list they get isn't longer than what 10995 * they can scan, as long as they can scan all 10996 * the channels they registered at once. 10997 */ 10998 nla_for_each_nested(attr2, freqs, tmp2) 10999 if (attr1 != attr2 && 11000 nla_get_u32(attr1) == nla_get_u32(attr2)) 11001 return 0; 11002 } 11003 11004 return n_channels; 11005 } 11006 11007 static bool is_band_valid(struct wiphy *wiphy, enum nl80211_band b) 11008 { 11009 return b < NUM_NL80211_BANDS && wiphy->bands[b]; 11010 } 11011 11012 static int parse_bss_select(struct nlattr *nla, struct wiphy *wiphy, 11013 struct cfg80211_bss_selection *bss_select) 11014 { 11015 struct nlattr *attr[NL80211_BSS_SELECT_ATTR_MAX + 1]; 11016 struct nlattr *nest; 11017 int err; 11018 bool found = false; 11019 int i; 11020 11021 /* only process one nested attribute */ 11022 nest = nla_data(nla); 11023 if (!nla_ok(nest, nla_len(nest))) 11024 return -EINVAL; 11025 11026 err = nla_parse_nested_deprecated(attr, NL80211_BSS_SELECT_ATTR_MAX, 11027 nest, nl80211_bss_select_policy, 11028 NULL); 11029 if (err) 11030 return err; 11031 11032 /* only one attribute may be given */ 11033 for (i = 0; i <= NL80211_BSS_SELECT_ATTR_MAX; i++) { 11034 if (attr[i]) { 11035 if (found) 11036 return -EINVAL; 11037 found = true; 11038 } 11039 } 11040 11041 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID; 11042 11043 if (attr[NL80211_BSS_SELECT_ATTR_RSSI]) 11044 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI; 11045 11046 if (attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]) { 11047 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF; 11048 bss_select->param.band_pref = 11049 nla_get_u32(attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]); 11050 if (!is_band_valid(wiphy, bss_select->param.band_pref)) 11051 return -EINVAL; 11052 } 11053 11054 if (attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]) { 11055 struct nl80211_bss_select_rssi_adjust *adj_param; 11056 11057 adj_param = nla_data(attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]); 11058 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST; 11059 bss_select->param.adjust.band = adj_param->band; 11060 bss_select->param.adjust.delta = adj_param->delta; 11061 if (!is_band_valid(wiphy, bss_select->param.adjust.band)) 11062 return -EINVAL; 11063 } 11064 11065 /* user-space did not provide behaviour attribute */ 11066 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID) 11067 return -EINVAL; 11068 11069 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour))) 11070 return -EINVAL; 11071 11072 return 0; 11073 } 11074 11075 int nl80211_parse_random_mac(struct nlattr **attrs, 11076 u8 *mac_addr, u8 *mac_addr_mask) 11077 { 11078 int i; 11079 11080 if (!attrs[NL80211_ATTR_MAC] && !attrs[NL80211_ATTR_MAC_MASK]) { 11081 eth_zero_addr(mac_addr); 11082 eth_zero_addr(mac_addr_mask); 11083 mac_addr[0] = 0x2; 11084 mac_addr_mask[0] = 0x3; 11085 11086 return 0; 11087 } 11088 11089 /* need both or none */ 11090 if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_MAC_MASK]) 11091 return -EINVAL; 11092 11093 memcpy(mac_addr, nla_data(attrs[NL80211_ATTR_MAC]), ETH_ALEN); 11094 memcpy(mac_addr_mask, nla_data(attrs[NL80211_ATTR_MAC_MASK]), ETH_ALEN); 11095 11096 /* don't allow or configure an mcast address */ 11097 if (!is_multicast_ether_addr(mac_addr_mask) || 11098 is_multicast_ether_addr(mac_addr)) 11099 return -EINVAL; 11100 11101 /* 11102 * allow users to pass a MAC address that has bits set outside 11103 * of the mask, but don't bother drivers with having to deal 11104 * with such bits 11105 */ 11106 for (i = 0; i < ETH_ALEN; i++) 11107 mac_addr[i] &= mac_addr_mask[i]; 11108 11109 return 0; 11110 } 11111 11112 static bool cfg80211_off_channel_oper_allowed(struct wireless_dev *wdev, 11113 struct ieee80211_channel *chan) 11114 { 11115 unsigned int link_id; 11116 bool all_ok = true; 11117 int radio_idx; 11118 11119 lockdep_assert_wiphy(wdev->wiphy); 11120 11121 if (!cfg80211_wdev_channel_allowed(wdev, chan)) 11122 return false; 11123 11124 if (!cfg80211_beaconing_iface_active(wdev)) 11125 return true; 11126 11127 radio_idx = cfg80211_get_radio_idx_by_chan(wdev->wiphy, chan); 11128 11129 /* 11130 * FIXME: check if we have a free radio/link for chan 11131 * 11132 * This, as well as the FIXME below, requires knowing the link 11133 * capabilities of the hardware. 11134 */ 11135 11136 /* we cannot leave radar channels */ 11137 for_each_valid_link(wdev, link_id) { 11138 struct cfg80211_chan_def *chandef; 11139 int link_radio_idx; 11140 11141 chandef = wdev_chandef(wdev, link_id); 11142 if (!chandef || !chandef->chan) 11143 continue; 11144 11145 if (!(chandef->chan->flags & IEEE80211_CHAN_RADAR)) 11146 continue; 11147 11148 /* 11149 * chandef->chan is a radar channel. If the radio/link onto 11150 * which this radar channel falls is the same radio/link onto 11151 * which the input 'chan' falls, off-channel operation should 11152 * not be allowed. Hence, set 'all_ok' to false. 11153 */ 11154 11155 link_radio_idx = cfg80211_get_radio_idx_by_chan(wdev->wiphy, 11156 chandef->chan); 11157 if (link_radio_idx == radio_idx) { 11158 all_ok = false; 11159 break; 11160 } 11161 } 11162 11163 if (all_ok) 11164 return true; 11165 11166 return regulatory_pre_cac_allowed(wdev->wiphy); 11167 } 11168 11169 static bool nl80211_check_scan_feat(struct wiphy *wiphy, u32 flags, u32 flag, 11170 enum nl80211_ext_feature_index feat) 11171 { 11172 if (!(flags & flag)) 11173 return true; 11174 if (wiphy_ext_feature_isset(wiphy, feat)) 11175 return true; 11176 return false; 11177 } 11178 11179 static int 11180 nl80211_check_scan_flags(struct wiphy *wiphy, struct wireless_dev *wdev, 11181 struct nlattr **attrs, u8 *mac_addr, u8 *mac_addr_mask, 11182 u32 *flags, enum nl80211_feature_flags randomness_flag) 11183 { 11184 if (!attrs[NL80211_ATTR_SCAN_FLAGS]) 11185 return 0; 11186 11187 *flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]); 11188 11189 if (((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) && 11190 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) || 11191 !nl80211_check_scan_feat(wiphy, *flags, 11192 NL80211_SCAN_FLAG_LOW_SPAN, 11193 NL80211_EXT_FEATURE_LOW_SPAN_SCAN) || 11194 !nl80211_check_scan_feat(wiphy, *flags, 11195 NL80211_SCAN_FLAG_LOW_POWER, 11196 NL80211_EXT_FEATURE_LOW_POWER_SCAN) || 11197 !nl80211_check_scan_feat(wiphy, *flags, 11198 NL80211_SCAN_FLAG_HIGH_ACCURACY, 11199 NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN) || 11200 !nl80211_check_scan_feat(wiphy, *flags, 11201 NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME, 11202 NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME) || 11203 !nl80211_check_scan_feat(wiphy, *flags, 11204 NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP, 11205 NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP) || 11206 !nl80211_check_scan_feat(wiphy, *flags, 11207 NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION, 11208 NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION) || 11209 !nl80211_check_scan_feat(wiphy, *flags, 11210 NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE, 11211 NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE) || 11212 !nl80211_check_scan_feat(wiphy, *flags, 11213 NL80211_SCAN_FLAG_RANDOM_SN, 11214 NL80211_EXT_FEATURE_SCAN_RANDOM_SN) || 11215 !nl80211_check_scan_feat(wiphy, *flags, 11216 NL80211_SCAN_FLAG_MIN_PREQ_CONTENT, 11217 NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT)) 11218 return -EOPNOTSUPP; 11219 11220 if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { 11221 int err; 11222 11223 if (!(wiphy->features & randomness_flag) || 11224 (wdev && wdev->connected)) 11225 return -EOPNOTSUPP; 11226 11227 err = nl80211_parse_random_mac(attrs, mac_addr, mac_addr_mask); 11228 if (err) 11229 return err; 11230 } 11231 11232 return 0; 11233 } 11234 11235 static int 11236 nl80211_check_scan_flags_sched(struct wiphy *wiphy, struct wireless_dev *wdev, 11237 struct nlattr **attrs, 11238 struct cfg80211_sched_scan_request *req) 11239 { 11240 return nl80211_check_scan_flags(wiphy, wdev, attrs, 11241 req->mac_addr, req->mac_addr_mask, 11242 &req->flags, 11243 wdev ? NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR : 11244 NL80211_FEATURE_ND_RANDOM_MAC_ADDR); 11245 } 11246 11247 static int 11248 nl80211_check_scan_flags_reg(struct wiphy *wiphy, struct wireless_dev *wdev, 11249 struct nlattr **attrs, 11250 struct cfg80211_scan_request_int *req) 11251 { 11252 return nl80211_check_scan_flags(wiphy, wdev, attrs, 11253 req->req.mac_addr, 11254 req->req.mac_addr_mask, 11255 &req->req.flags, 11256 NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR); 11257 } 11258 11259 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) 11260 { 11261 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11262 struct wireless_dev *wdev = info->user_ptr[1]; 11263 struct cfg80211_scan_request_int *request; 11264 struct nlattr *scan_freqs = NULL; 11265 bool scan_freqs_khz = false; 11266 struct nlattr *attr; 11267 struct wiphy *wiphy; 11268 int err, tmp, n_ssids = 0, n_channels, i; 11269 size_t ie_len, size; 11270 size_t ssids_offset, ie_offset; 11271 11272 wiphy = &rdev->wiphy; 11273 11274 if (wdev->iftype == NL80211_IFTYPE_NAN || 11275 wdev->iftype == NL80211_IFTYPE_PD) 11276 return -EOPNOTSUPP; 11277 11278 if (!rdev->ops->scan) 11279 return -EOPNOTSUPP; 11280 11281 if (rdev->scan_req || rdev->scan_msg) 11282 return -EBUSY; 11283 11284 if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) { 11285 if (!wiphy_ext_feature_isset(wiphy, 11286 NL80211_EXT_FEATURE_SCAN_FREQ_KHZ)) 11287 return -EOPNOTSUPP; 11288 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]; 11289 scan_freqs_khz = true; 11290 } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) 11291 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]; 11292 11293 if (scan_freqs) { 11294 n_channels = validate_scan_freqs(scan_freqs); 11295 if (!n_channels) 11296 return -EINVAL; 11297 } else { 11298 n_channels = ieee80211_get_num_supported_channels(wiphy); 11299 } 11300 11301 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) 11302 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) 11303 n_ssids++; 11304 11305 if (n_ssids > wiphy->max_scan_ssids) 11306 return -EINVAL; 11307 11308 if (info->attrs[NL80211_ATTR_IE]) 11309 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 11310 else 11311 ie_len = 0; 11312 11313 if (ie_len > wiphy->max_scan_ie_len) 11314 return -EINVAL; 11315 11316 size = struct_size(request, req.channels, n_channels); 11317 ssids_offset = size; 11318 size = size_add(size, array_size(sizeof(*request->req.ssids), n_ssids)); 11319 ie_offset = size; 11320 size = size_add(size, ie_len); 11321 request = kzalloc(size, GFP_KERNEL); 11322 if (!request) 11323 return -ENOMEM; 11324 11325 if (n_ssids) 11326 request->req.ssids = (void *)request + ssids_offset; 11327 request->req.n_ssids = n_ssids; 11328 if (ie_len) 11329 request->req.ie = (void *)request + ie_offset; 11330 11331 i = 0; 11332 if (scan_freqs) { 11333 /* user specified, bail out if channel not found */ 11334 nla_for_each_nested(attr, scan_freqs, tmp) { 11335 struct ieee80211_channel *chan; 11336 int freq = nla_get_u32(attr); 11337 11338 if (!scan_freqs_khz) 11339 freq = MHZ_TO_KHZ(freq); 11340 11341 chan = ieee80211_get_channel_khz(wiphy, freq); 11342 if (!chan) { 11343 err = -EINVAL; 11344 goto out_free; 11345 } 11346 11347 /* Ignore disabled / no primary channels */ 11348 if (chan->flags & IEEE80211_CHAN_DISABLED || 11349 chan->flags & IEEE80211_CHAN_S1G_NO_PRIMARY || 11350 !cfg80211_wdev_channel_allowed(wdev, chan)) 11351 continue; 11352 11353 request->req.channels[i] = chan; 11354 i++; 11355 } 11356 } else { 11357 enum nl80211_band band; 11358 11359 /* all channels */ 11360 for (band = 0; band < NUM_NL80211_BANDS; band++) { 11361 int j; 11362 11363 if (!wiphy->bands[band]) 11364 continue; 11365 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 11366 struct ieee80211_channel *chan; 11367 11368 chan = &wiphy->bands[band]->channels[j]; 11369 11370 if (chan->flags & IEEE80211_CHAN_DISABLED || 11371 chan->flags & 11372 IEEE80211_CHAN_S1G_NO_PRIMARY || 11373 !cfg80211_wdev_channel_allowed(wdev, chan)) 11374 continue; 11375 11376 request->req.channels[i] = chan; 11377 i++; 11378 } 11379 } 11380 } 11381 11382 if (!i) { 11383 err = -EINVAL; 11384 goto out_free; 11385 } 11386 11387 request->req.n_channels = i; 11388 11389 for (i = 0; i < request->req.n_channels; i++) { 11390 struct ieee80211_channel *chan = request->req.channels[i]; 11391 11392 /* if we can go off-channel to the target channel we're good */ 11393 if (cfg80211_off_channel_oper_allowed(wdev, chan)) 11394 continue; 11395 11396 if (!cfg80211_wdev_on_sub_chan(wdev, chan, true)) { 11397 err = -EBUSY; 11398 goto out_free; 11399 } 11400 } 11401 11402 i = 0; 11403 if (n_ssids) { 11404 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { 11405 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 11406 err = -EINVAL; 11407 goto out_free; 11408 } 11409 request->req.ssids[i].ssid_len = nla_len(attr); 11410 memcpy(request->req.ssids[i].ssid, 11411 nla_data(attr), nla_len(attr)); 11412 i++; 11413 } 11414 } 11415 11416 if (info->attrs[NL80211_ATTR_IE]) { 11417 request->req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 11418 memcpy((void *)request->req.ie, 11419 nla_data(info->attrs[NL80211_ATTR_IE]), 11420 request->req.ie_len); 11421 } 11422 11423 for (i = 0; i < NUM_NL80211_BANDS; i++) 11424 if (wiphy->bands[i]) 11425 request->req.rates[i] = 11426 (1 << wiphy->bands[i]->n_bitrates) - 1; 11427 11428 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { 11429 nla_for_each_nested(attr, 11430 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], 11431 tmp) { 11432 int band = nla_type(attr); 11433 11434 if (band < 0 || band >= NUM_NL80211_BANDS) { 11435 err = -EINVAL; 11436 goto out_free; 11437 } 11438 11439 if (!wiphy->bands[band]) 11440 continue; 11441 11442 err = ieee80211_get_ratemask(wiphy->bands[band], 11443 nla_data(attr), 11444 nla_len(attr), 11445 &request->req.rates[band]); 11446 if (err) 11447 goto out_free; 11448 } 11449 } 11450 11451 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { 11452 request->req.duration = 11453 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); 11454 request->req.duration_mandatory = 11455 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); 11456 } 11457 11458 err = nl80211_check_scan_flags_reg(wiphy, wdev, info->attrs, request); 11459 if (err) 11460 goto out_free; 11461 11462 request->req.no_cck = 11463 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 11464 11465 /* Initial implementation used NL80211_ATTR_MAC to set the specific 11466 * BSSID to scan for. This was problematic because that same attribute 11467 * was already used for another purpose (local random MAC address). The 11468 * NL80211_ATTR_BSSID attribute was added to fix this. For backwards 11469 * compatibility with older userspace components, also use the 11470 * NL80211_ATTR_MAC value here if it can be determined to be used for 11471 * the specific BSSID use case instead of the random MAC address 11472 * (NL80211_ATTR_SCAN_FLAGS is used to enable random MAC address use). 11473 */ 11474 if (info->attrs[NL80211_ATTR_BSSID]) 11475 memcpy(request->req.bssid, 11476 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); 11477 else if (!(request->req.flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && 11478 info->attrs[NL80211_ATTR_MAC]) 11479 memcpy(request->req.bssid, 11480 nla_data(info->attrs[NL80211_ATTR_MAC]), 11481 ETH_ALEN); 11482 else 11483 eth_broadcast_addr(request->req.bssid); 11484 11485 request->req.tsf_report_link_id = 11486 nl80211_link_id_or_invalid(info->attrs); 11487 request->req.wdev = wdev; 11488 request->req.wiphy = &rdev->wiphy; 11489 request->req.scan_start = jiffies; 11490 11491 rdev->scan_req = request; 11492 err = cfg80211_scan(rdev); 11493 11494 if (err) 11495 goto out_free; 11496 11497 nl80211_send_scan_start(rdev, wdev); 11498 dev_hold(wdev->netdev); 11499 11500 return 0; 11501 11502 out_free: 11503 rdev->scan_req = NULL; 11504 kfree(request); 11505 11506 return err; 11507 } 11508 11509 static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info) 11510 { 11511 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11512 struct wireless_dev *wdev = info->user_ptr[1]; 11513 11514 if (!rdev->ops->abort_scan) 11515 return -EOPNOTSUPP; 11516 11517 if (rdev->scan_msg) 11518 return 0; 11519 11520 if (!rdev->scan_req) 11521 return -ENOENT; 11522 11523 rdev_abort_scan(rdev, wdev); 11524 return 0; 11525 } 11526 11527 static int 11528 nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans, 11529 struct cfg80211_sched_scan_request *request, 11530 struct nlattr **attrs) 11531 { 11532 int tmp, err, i = 0; 11533 struct nlattr *attr; 11534 11535 if (!attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) { 11536 u32 interval; 11537 11538 /* 11539 * If scan plans are not specified, 11540 * %NL80211_ATTR_SCHED_SCAN_INTERVAL will be specified. In this 11541 * case one scan plan will be set with the specified scan 11542 * interval and infinite number of iterations. 11543 */ 11544 interval = nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]); 11545 if (!interval) 11546 return -EINVAL; 11547 11548 request->scan_plans[0].interval = 11549 DIV_ROUND_UP(interval, MSEC_PER_SEC); 11550 if (!request->scan_plans[0].interval) 11551 return -EINVAL; 11552 11553 if (request->scan_plans[0].interval > 11554 wiphy->max_sched_scan_plan_interval) 11555 request->scan_plans[0].interval = 11556 wiphy->max_sched_scan_plan_interval; 11557 11558 return 0; 11559 } 11560 11561 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) { 11562 struct nlattr *plan[NL80211_SCHED_SCAN_PLAN_MAX + 1]; 11563 11564 if (WARN_ON(i >= n_plans)) 11565 return -EINVAL; 11566 11567 err = nla_parse_nested_deprecated(plan, 11568 NL80211_SCHED_SCAN_PLAN_MAX, 11569 attr, nl80211_plan_policy, 11570 NULL); 11571 if (err) 11572 return err; 11573 11574 if (!plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]) 11575 return -EINVAL; 11576 11577 request->scan_plans[i].interval = 11578 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]); 11579 if (!request->scan_plans[i].interval || 11580 request->scan_plans[i].interval > 11581 wiphy->max_sched_scan_plan_interval) 11582 return -EINVAL; 11583 11584 if (plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]) { 11585 request->scan_plans[i].iterations = 11586 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]); 11587 if (!request->scan_plans[i].iterations || 11588 (request->scan_plans[i].iterations > 11589 wiphy->max_sched_scan_plan_iterations)) 11590 return -EINVAL; 11591 } else if (i < n_plans - 1) { 11592 /* 11593 * All scan plans but the last one must specify 11594 * a finite number of iterations 11595 */ 11596 return -EINVAL; 11597 } 11598 11599 i++; 11600 } 11601 11602 /* 11603 * The last scan plan must not specify the number of 11604 * iterations, it is supposed to run infinitely 11605 */ 11606 if (request->scan_plans[n_plans - 1].iterations) 11607 return -EINVAL; 11608 11609 return 0; 11610 } 11611 11612 static struct cfg80211_sched_scan_request * 11613 nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev, 11614 struct nlattr **attrs, int max_match_sets) 11615 { 11616 struct cfg80211_sched_scan_request *request; 11617 struct nlattr *attr; 11618 int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i, n_plans = 0; 11619 enum nl80211_band band; 11620 size_t ie_len, size; 11621 struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1]; 11622 s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF; 11623 11624 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 11625 n_channels = validate_scan_freqs( 11626 attrs[NL80211_ATTR_SCAN_FREQUENCIES]); 11627 if (!n_channels) 11628 return ERR_PTR(-EINVAL); 11629 } else { 11630 n_channels = ieee80211_get_num_supported_channels(wiphy); 11631 } 11632 11633 if (attrs[NL80211_ATTR_SCAN_SSIDS]) 11634 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS], 11635 tmp) 11636 n_ssids++; 11637 11638 if (n_ssids > wiphy->max_sched_scan_ssids) 11639 return ERR_PTR(-EINVAL); 11640 11641 /* 11642 * First, count the number of 'real' matchsets. Due to an issue with 11643 * the old implementation, matchsets containing only the RSSI attribute 11644 * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default' 11645 * RSSI for all matchsets, rather than their own matchset for reporting 11646 * all APs with a strong RSSI. This is needed to be compatible with 11647 * older userspace that treated a matchset with only the RSSI as the 11648 * global RSSI for all other matchsets - if there are other matchsets. 11649 */ 11650 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 11651 nla_for_each_nested(attr, 11652 attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 11653 tmp) { 11654 struct nlattr *rssi; 11655 11656 err = nla_parse_nested_deprecated(tb, 11657 NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 11658 attr, 11659 nl80211_match_policy, 11660 NULL); 11661 if (err) 11662 return ERR_PTR(err); 11663 11664 /* SSID and BSSID are mutually exclusive */ 11665 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] && 11666 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) 11667 return ERR_PTR(-EINVAL); 11668 11669 /* add other standalone attributes here */ 11670 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] || 11671 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) { 11672 n_match_sets++; 11673 continue; 11674 } 11675 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 11676 if (rssi) 11677 default_match_rssi = nla_get_s32(rssi); 11678 } 11679 } 11680 11681 /* However, if there's no other matchset, add the RSSI one */ 11682 if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF) 11683 n_match_sets = 1; 11684 11685 if (n_match_sets > max_match_sets) 11686 return ERR_PTR(-EINVAL); 11687 11688 if (attrs[NL80211_ATTR_IE]) 11689 ie_len = nla_len(attrs[NL80211_ATTR_IE]); 11690 else 11691 ie_len = 0; 11692 11693 if (ie_len > wiphy->max_sched_scan_ie_len) 11694 return ERR_PTR(-EINVAL); 11695 11696 if (attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) { 11697 /* 11698 * NL80211_ATTR_SCHED_SCAN_INTERVAL must not be specified since 11699 * each scan plan already specifies its own interval 11700 */ 11701 if (attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 11702 return ERR_PTR(-EINVAL); 11703 11704 nla_for_each_nested(attr, 11705 attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) 11706 n_plans++; 11707 } else { 11708 /* 11709 * The scan interval attribute is kept for backward 11710 * compatibility. If no scan plans are specified and sched scan 11711 * interval is specified, one scan plan will be set with this 11712 * scan interval and infinite number of iterations. 11713 */ 11714 if (!attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 11715 return ERR_PTR(-EINVAL); 11716 11717 n_plans = 1; 11718 } 11719 11720 if (!n_plans || n_plans > wiphy->max_sched_scan_plans) 11721 return ERR_PTR(-EINVAL); 11722 11723 if (!wiphy_ext_feature_isset( 11724 wiphy, NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI) && 11725 (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] || 11726 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST])) 11727 return ERR_PTR(-EINVAL); 11728 11729 size = struct_size(request, channels, n_channels); 11730 size = size_add(size, array_size(sizeof(*request->ssids), n_ssids)); 11731 size = size_add(size, array_size(sizeof(*request->match_sets), 11732 n_match_sets)); 11733 size = size_add(size, array_size(sizeof(*request->scan_plans), 11734 n_plans)); 11735 size = size_add(size, ie_len); 11736 request = kzalloc(size, GFP_KERNEL); 11737 if (!request) 11738 return ERR_PTR(-ENOMEM); 11739 request->n_channels = n_channels; 11740 11741 if (n_ssids) 11742 request->ssids = (void *)request + 11743 struct_size(request, channels, n_channels); 11744 request->n_ssids = n_ssids; 11745 if (ie_len) { 11746 if (n_ssids) 11747 request->ie = (void *)(request->ssids + n_ssids); 11748 else 11749 request->ie = (void *)(request->channels + n_channels); 11750 } 11751 11752 if (n_match_sets) { 11753 if (request->ie) 11754 request->match_sets = (void *)(request->ie + ie_len); 11755 else if (n_ssids) 11756 request->match_sets = 11757 (void *)(request->ssids + n_ssids); 11758 else 11759 request->match_sets = 11760 (void *)(request->channels + n_channels); 11761 } 11762 request->n_match_sets = n_match_sets; 11763 11764 if (n_match_sets) 11765 request->scan_plans = (void *)(request->match_sets + 11766 n_match_sets); 11767 else if (request->ie) 11768 request->scan_plans = (void *)(request->ie + ie_len); 11769 else if (n_ssids) 11770 request->scan_plans = (void *)(request->ssids + n_ssids); 11771 else 11772 request->scan_plans = (void *)(request->channels + n_channels); 11773 11774 request->n_scan_plans = n_plans; 11775 11776 i = 0; 11777 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 11778 /* user specified, bail out if channel not found */ 11779 nla_for_each_nested(attr, 11780 attrs[NL80211_ATTR_SCAN_FREQUENCIES], 11781 tmp) { 11782 struct ieee80211_channel *chan; 11783 11784 chan = ieee80211_get_channel(wiphy, nla_get_u32(attr)); 11785 11786 if (!chan) { 11787 err = -EINVAL; 11788 goto out_free; 11789 } 11790 11791 /* ignore disabled channels */ 11792 if (chan->flags & IEEE80211_CHAN_DISABLED) 11793 continue; 11794 11795 request->channels[i] = chan; 11796 i++; 11797 } 11798 } else { 11799 /* all channels */ 11800 for (band = 0; band < NUM_NL80211_BANDS; band++) { 11801 int j; 11802 11803 if (!wiphy->bands[band]) 11804 continue; 11805 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 11806 struct ieee80211_channel *chan; 11807 11808 chan = &wiphy->bands[band]->channels[j]; 11809 11810 if (chan->flags & IEEE80211_CHAN_DISABLED) 11811 continue; 11812 11813 request->channels[i] = chan; 11814 i++; 11815 } 11816 } 11817 } 11818 11819 if (!i) { 11820 err = -EINVAL; 11821 goto out_free; 11822 } 11823 11824 request->n_channels = i; 11825 11826 i = 0; 11827 if (n_ssids) { 11828 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS], 11829 tmp) { 11830 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 11831 err = -EINVAL; 11832 goto out_free; 11833 } 11834 request->ssids[i].ssid_len = nla_len(attr); 11835 memcpy(request->ssids[i].ssid, nla_data(attr), 11836 nla_len(attr)); 11837 i++; 11838 } 11839 } 11840 11841 i = 0; 11842 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 11843 nla_for_each_nested(attr, 11844 attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 11845 tmp) { 11846 struct nlattr *ssid, *bssid, *rssi; 11847 11848 err = nla_parse_nested_deprecated(tb, 11849 NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 11850 attr, 11851 nl80211_match_policy, 11852 NULL); 11853 if (err) 11854 goto out_free; 11855 ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID]; 11856 bssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]; 11857 11858 if (!ssid && !bssid) { 11859 i++; 11860 continue; 11861 } 11862 11863 if (WARN_ON(i >= n_match_sets)) { 11864 /* this indicates a programming error, 11865 * the loop above should have verified 11866 * things properly 11867 */ 11868 err = -EINVAL; 11869 goto out_free; 11870 } 11871 11872 if (ssid) { 11873 memcpy(request->match_sets[i].ssid.ssid, 11874 nla_data(ssid), nla_len(ssid)); 11875 request->match_sets[i].ssid.ssid_len = 11876 nla_len(ssid); 11877 } 11878 if (bssid) 11879 memcpy(request->match_sets[i].bssid, 11880 nla_data(bssid), ETH_ALEN); 11881 11882 /* special attribute - old implementation w/a */ 11883 request->match_sets[i].rssi_thold = default_match_rssi; 11884 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 11885 if (rssi) 11886 request->match_sets[i].rssi_thold = 11887 nla_get_s32(rssi); 11888 i++; 11889 } 11890 11891 /* there was no other matchset, so the RSSI one is alone */ 11892 if (i == 0 && n_match_sets) 11893 request->match_sets[0].rssi_thold = default_match_rssi; 11894 11895 request->min_rssi_thold = INT_MAX; 11896 for (i = 0; i < n_match_sets; i++) 11897 request->min_rssi_thold = 11898 min(request->match_sets[i].rssi_thold, 11899 request->min_rssi_thold); 11900 } else { 11901 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF; 11902 } 11903 11904 if (ie_len) { 11905 request->ie_len = ie_len; 11906 memcpy((void *)request->ie, 11907 nla_data(attrs[NL80211_ATTR_IE]), 11908 request->ie_len); 11909 } 11910 11911 err = nl80211_check_scan_flags_sched(wiphy, wdev, attrs, request); 11912 if (err) 11913 goto out_free; 11914 11915 if (attrs[NL80211_ATTR_SCHED_SCAN_DELAY]) 11916 request->delay = 11917 nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_DELAY]); 11918 11919 if (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]) { 11920 request->relative_rssi = nla_get_s8( 11921 attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]); 11922 request->relative_rssi_set = true; 11923 } 11924 11925 if (request->relative_rssi_set && 11926 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]) { 11927 struct nl80211_bss_select_rssi_adjust *rssi_adjust; 11928 11929 rssi_adjust = nla_data( 11930 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]); 11931 request->rssi_adjust.band = rssi_adjust->band; 11932 request->rssi_adjust.delta = rssi_adjust->delta; 11933 if (!is_band_valid(wiphy, request->rssi_adjust.band)) { 11934 err = -EINVAL; 11935 goto out_free; 11936 } 11937 } 11938 11939 err = nl80211_parse_sched_scan_plans(wiphy, n_plans, request, attrs); 11940 if (err) 11941 goto out_free; 11942 11943 request->scan_start = jiffies; 11944 11945 return request; 11946 11947 out_free: 11948 kfree(request); 11949 return ERR_PTR(err); 11950 } 11951 11952 static int nl80211_start_sched_scan(struct sk_buff *skb, 11953 struct genl_info *info) 11954 { 11955 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11956 struct net_device *dev = info->user_ptr[1]; 11957 struct wireless_dev *wdev = dev->ieee80211_ptr; 11958 struct cfg80211_sched_scan_request *sched_scan_req; 11959 bool want_multi; 11960 int err; 11961 11962 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start) 11963 return -EOPNOTSUPP; 11964 11965 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI]; 11966 err = cfg80211_sched_scan_req_possible(rdev, want_multi); 11967 if (err) 11968 return err; 11969 11970 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev, 11971 info->attrs, 11972 rdev->wiphy.max_match_sets); 11973 11974 err = PTR_ERR_OR_ZERO(sched_scan_req); 11975 if (err) 11976 goto out_err; 11977 11978 /* leave request id zero for legacy request 11979 * or if driver does not support multi-scheduled scan 11980 */ 11981 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) 11982 sched_scan_req->reqid = cfg80211_assign_cookie(rdev); 11983 11984 err = rdev_sched_scan_start(rdev, dev, sched_scan_req); 11985 if (err) 11986 goto out_free; 11987 11988 sched_scan_req->dev = dev; 11989 sched_scan_req->wiphy = &rdev->wiphy; 11990 11991 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 11992 sched_scan_req->owner_nlportid = info->snd_portid; 11993 11994 cfg80211_add_sched_scan_req(rdev, sched_scan_req); 11995 11996 nl80211_send_sched_scan(sched_scan_req, NL80211_CMD_START_SCHED_SCAN); 11997 return 0; 11998 11999 out_free: 12000 kfree(sched_scan_req); 12001 out_err: 12002 return err; 12003 } 12004 12005 static int nl80211_stop_sched_scan(struct sk_buff *skb, 12006 struct genl_info *info) 12007 { 12008 struct cfg80211_sched_scan_request *req; 12009 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12010 u64 cookie; 12011 12012 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop) 12013 return -EOPNOTSUPP; 12014 12015 if (info->attrs[NL80211_ATTR_COOKIE]) { 12016 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 12017 return __cfg80211_stop_sched_scan(rdev, cookie, false); 12018 } 12019 12020 req = list_first_or_null_rcu(&rdev->sched_scan_req_list, 12021 struct cfg80211_sched_scan_request, 12022 list); 12023 if (!req || req->reqid || 12024 (req->owner_nlportid && 12025 req->owner_nlportid != info->snd_portid)) 12026 return -ENOENT; 12027 12028 return cfg80211_stop_sched_scan_req(rdev, req, false); 12029 } 12030 12031 static int nl80211_start_radar_detection(struct sk_buff *skb, 12032 struct genl_info *info) 12033 { 12034 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12035 struct net_device *dev = info->user_ptr[1]; 12036 struct wireless_dev *wdev = dev->ieee80211_ptr; 12037 int link_id = nl80211_link_id(info->attrs); 12038 struct wiphy *wiphy = wdev->wiphy; 12039 struct cfg80211_chan_def chandef; 12040 enum nl80211_dfs_regions dfs_region; 12041 unsigned int cac_time_ms; 12042 int err; 12043 12044 flush_delayed_work(&rdev->dfs_update_channels_wk); 12045 12046 switch (wdev->iftype) { 12047 case NL80211_IFTYPE_AP: 12048 case NL80211_IFTYPE_P2P_GO: 12049 case NL80211_IFTYPE_MESH_POINT: 12050 case NL80211_IFTYPE_ADHOC: 12051 break; 12052 default: 12053 /* caution - see cfg80211_beaconing_iface_active() below */ 12054 return -EINVAL; 12055 } 12056 12057 guard(wiphy)(wiphy); 12058 12059 dfs_region = reg_get_dfs_region(wiphy); 12060 if (dfs_region == NL80211_DFS_UNSET) 12061 return -EINVAL; 12062 12063 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef, 12064 false); 12065 if (err) 12066 return err; 12067 12068 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); 12069 if (err < 0) 12070 return err; 12071 12072 if (err == 0) 12073 return -EINVAL; 12074 12075 if (!cfg80211_chandef_dfs_usable(wiphy, &chandef)) 12076 return -EINVAL; 12077 12078 if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_BACKGROUND])) 12079 return cfg80211_start_background_radar_detection(rdev, wdev, 12080 &chandef); 12081 12082 if (cfg80211_beaconing_iface_active(wdev)) { 12083 /* During MLO other link(s) can beacon, only the current link 12084 * can not already beacon 12085 */ 12086 if (wdev->valid_links && 12087 !wdev->links[link_id].ap.beacon_interval) { 12088 /* nothing */ 12089 } else { 12090 return -EBUSY; 12091 } 12092 } 12093 12094 if (wdev->links[link_id].cac_started) 12095 return -EBUSY; 12096 12097 /* CAC start is offloaded to HW and can't be started manually */ 12098 if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD)) 12099 return -EOPNOTSUPP; 12100 12101 if (!rdev->ops->start_radar_detection) 12102 return -EOPNOTSUPP; 12103 12104 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); 12105 if (WARN_ON(!cac_time_ms)) 12106 cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS; 12107 12108 err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms, 12109 link_id); 12110 if (err) 12111 return err; 12112 12113 switch (wdev->iftype) { 12114 case NL80211_IFTYPE_AP: 12115 case NL80211_IFTYPE_P2P_GO: 12116 wdev->links[link_id].ap.chandef = chandef; 12117 break; 12118 case NL80211_IFTYPE_ADHOC: 12119 wdev->u.ibss.chandef = chandef; 12120 break; 12121 case NL80211_IFTYPE_MESH_POINT: 12122 wdev->u.mesh.chandef = chandef; 12123 break; 12124 default: 12125 break; 12126 } 12127 wdev->links[link_id].cac_started = true; 12128 wdev->links[link_id].cac_start_time = jiffies; 12129 wdev->links[link_id].cac_time_ms = cac_time_ms; 12130 cfg80211_set_cac_state(wiphy, &chandef, true); 12131 12132 return 0; 12133 } 12134 12135 static int nl80211_notify_radar_detection(struct sk_buff *skb, 12136 struct genl_info *info) 12137 { 12138 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12139 struct net_device *dev = info->user_ptr[1]; 12140 struct wireless_dev *wdev = dev->ieee80211_ptr; 12141 struct wiphy *wiphy = wdev->wiphy; 12142 struct cfg80211_chan_def chandef; 12143 enum nl80211_dfs_regions dfs_region; 12144 int err; 12145 12146 dfs_region = reg_get_dfs_region(wiphy); 12147 if (dfs_region == NL80211_DFS_UNSET) { 12148 GENL_SET_ERR_MSG(info, 12149 "DFS Region is not set. Unexpected Radar indication"); 12150 return -EINVAL; 12151 } 12152 12153 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef, 12154 false); 12155 if (err) { 12156 GENL_SET_ERR_MSG(info, "Unable to extract chandef info"); 12157 return err; 12158 } 12159 12160 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); 12161 if (err < 0) { 12162 GENL_SET_ERR_MSG(info, "chandef is invalid"); 12163 return err; 12164 } 12165 12166 if (err == 0) { 12167 GENL_SET_ERR_MSG(info, 12168 "Unexpected Radar indication for chandef/iftype"); 12169 return -EINVAL; 12170 } 12171 12172 /* Do not process this notification if radar is already detected 12173 * by kernel on this channel, and return success. 12174 */ 12175 if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE) 12176 return 0; 12177 12178 cfg80211_set_dfs_state(wiphy, &chandef, NL80211_DFS_UNAVAILABLE); 12179 12180 cfg80211_sched_dfs_chan_update(rdev); 12181 12182 rdev->radar_chandef = chandef; 12183 12184 /* Propagate this notification to other radios as well */ 12185 queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); 12186 12187 return 0; 12188 } 12189 12190 static int nl80211_parse_counter_offsets(struct cfg80211_registered_device *rdev, 12191 const u8 *data, size_t datalen, 12192 int first_count, struct nlattr *attr, 12193 const u16 **offsets, unsigned int *n_offsets) 12194 { 12195 int i; 12196 12197 *n_offsets = 0; 12198 12199 if (!attr) 12200 return 0; 12201 12202 if (!nla_len(attr) || (nla_len(attr) % sizeof(u16))) 12203 return -EINVAL; 12204 12205 *n_offsets = nla_len(attr) / sizeof(u16); 12206 if (rdev->wiphy.max_num_csa_counters && 12207 (*n_offsets > rdev->wiphy.max_num_csa_counters)) 12208 return -EINVAL; 12209 12210 *offsets = nla_data(attr); 12211 12212 /* sanity checks - counters should fit and be the same */ 12213 for (i = 0; i < *n_offsets; i++) { 12214 u16 offset = (*offsets)[i]; 12215 12216 if (offset >= datalen) 12217 return -EINVAL; 12218 12219 if (first_count != -1 && data[offset] != first_count) 12220 return -EINVAL; 12221 } 12222 12223 return 0; 12224 } 12225 12226 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info) 12227 { 12228 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12229 unsigned int link_id = nl80211_link_id(info->attrs); 12230 struct net_device *dev = info->user_ptr[1]; 12231 struct wireless_dev *wdev = dev->ieee80211_ptr; 12232 struct cfg80211_csa_settings params; 12233 struct nlattr **csa_attrs = NULL; 12234 int err; 12235 bool need_new_beacon = false; 12236 bool need_handle_dfs_flag = true; 12237 bool permit_npca = false; 12238 u32 cs_count; 12239 12240 if (!rdev->ops->channel_switch || 12241 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) 12242 return -EOPNOTSUPP; 12243 12244 switch (dev->ieee80211_ptr->iftype) { 12245 case NL80211_IFTYPE_AP: 12246 case NL80211_IFTYPE_P2P_GO: 12247 need_new_beacon = true; 12248 /* For all modes except AP the handle_dfs flag needs to be 12249 * supplied to tell the kernel that userspace will handle radar 12250 * events when they happen. Otherwise a switch to a channel 12251 * requiring DFS will be rejected. 12252 */ 12253 need_handle_dfs_flag = false; 12254 12255 permit_npca = true; 12256 12257 /* useless if AP is not running */ 12258 if (!wdev->links[link_id].ap.beacon_interval) 12259 return -ENOTCONN; 12260 break; 12261 case NL80211_IFTYPE_ADHOC: 12262 if (!wdev->u.ibss.ssid_len) 12263 return -ENOTCONN; 12264 break; 12265 case NL80211_IFTYPE_MESH_POINT: 12266 if (!wdev->u.mesh.id_len) 12267 return -ENOTCONN; 12268 break; 12269 default: 12270 return -EOPNOTSUPP; 12271 } 12272 12273 memset(¶ms, 0, sizeof(params)); 12274 params.beacon_csa.ftm_responder = -1; 12275 12276 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 12277 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) 12278 return -EINVAL; 12279 12280 /* only important for AP, IBSS and mesh create IEs internally */ 12281 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) 12282 return -EINVAL; 12283 12284 /* Even though the attribute is u32, the specification says 12285 * u8, so let's make sure we don't overflow. 12286 */ 12287 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); 12288 if (cs_count > 255) 12289 return -EINVAL; 12290 12291 params.count = cs_count; 12292 12293 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 12294 ¶ms.chandef, permit_npca); 12295 if (err) 12296 goto free; 12297 12298 err = nl80211_check_npca(rdev, ¶ms.chandef, wdev->iftype, 12299 info->extack); 12300 if (err) 12301 goto free; 12302 12303 if (!need_new_beacon) 12304 goto skip_beacons; 12305 12306 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_after, 12307 params.chandef.chan, info->extack); 12308 if (err) 12309 goto free; 12310 12311 csa_attrs = kzalloc_objs(*csa_attrs, NL80211_ATTR_MAX + 1); 12312 if (!csa_attrs) { 12313 err = -ENOMEM; 12314 goto free; 12315 } 12316 12317 err = nla_parse_nested_deprecated(csa_attrs, NL80211_ATTR_MAX, 12318 info->attrs[NL80211_ATTR_CSA_IES], 12319 nl80211_policy, info->extack); 12320 if (err) 12321 goto free; 12322 12323 err = nl80211_parse_beacon(rdev, csa_attrs, ¶ms.beacon_csa, 12324 wdev->links[link_id].ap.chandef.chan, 12325 info->extack); 12326 if (err) 12327 goto free; 12328 12329 if (!csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON]) { 12330 err = -EINVAL; 12331 goto free; 12332 } 12333 12334 err = nl80211_parse_counter_offsets(rdev, params.beacon_csa.tail, 12335 params.beacon_csa.tail_len, 12336 params.count, 12337 csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON], 12338 ¶ms.counter_offsets_beacon, 12339 ¶ms.n_counter_offsets_beacon); 12340 if (err) 12341 goto free; 12342 12343 err = nl80211_parse_counter_offsets(rdev, params.beacon_csa.probe_resp, 12344 params.beacon_csa.probe_resp_len, 12345 params.count, 12346 csa_attrs[NL80211_ATTR_CNTDWN_OFFS_PRESP], 12347 ¶ms.counter_offsets_presp, 12348 ¶ms.n_counter_offsets_presp); 12349 if (err) 12350 goto free; 12351 12352 skip_beacons: 12353 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, 12354 wdev->iftype)) { 12355 err = -EINVAL; 12356 goto free; 12357 } 12358 12359 err = cfg80211_chandef_dfs_required(wdev->wiphy, 12360 ¶ms.chandef, 12361 wdev->iftype); 12362 if (err < 0) 12363 goto free; 12364 12365 if (err > 0) { 12366 params.radar_required = true; 12367 if (need_handle_dfs_flag && 12368 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) { 12369 err = -EINVAL; 12370 goto free; 12371 } 12372 } 12373 12374 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) 12375 params.block_tx = true; 12376 12377 if ((wdev->iftype == NL80211_IFTYPE_AP || 12378 wdev->iftype == NL80211_IFTYPE_P2P_GO) && 12379 info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { 12380 err = nl80211_parse_unsol_bcast_probe_resp( 12381 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], 12382 ¶ms.unsol_bcast_probe_resp); 12383 if (err) 12384 goto free; 12385 } 12386 12387 params.link_id = link_id; 12388 err = rdev_channel_switch(rdev, dev, ¶ms); 12389 12390 free: 12391 kfree(params.beacon_after.mbssid_ies); 12392 kfree(params.beacon_csa.mbssid_ies); 12393 kfree(params.beacon_after.rnr_ies); 12394 kfree(params.beacon_csa.rnr_ies); 12395 kfree(csa_attrs); 12396 return err; 12397 } 12398 12399 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb, 12400 u32 seq, int flags, 12401 struct cfg80211_registered_device *rdev, 12402 struct wireless_dev *wdev, 12403 struct cfg80211_internal_bss *intbss) 12404 { 12405 struct cfg80211_bss *res = &intbss->pub; 12406 const struct cfg80211_bss_ies *ies; 12407 unsigned int link_id; 12408 void *hdr; 12409 struct nlattr *bss; 12410 12411 lockdep_assert_wiphy(wdev->wiphy); 12412 12413 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 12414 NL80211_CMD_NEW_SCAN_RESULTS); 12415 if (!hdr) 12416 return -1; 12417 12418 genl_dump_check_consistent(cb, hdr); 12419 12420 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) 12421 goto nla_put_failure; 12422 if (wdev->netdev && 12423 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) 12424 goto nla_put_failure; 12425 if (nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 12426 NL80211_ATTR_PAD)) 12427 goto nla_put_failure; 12428 12429 bss = nla_nest_start_noflag(msg, NL80211_ATTR_BSS); 12430 if (!bss) 12431 goto nla_put_failure; 12432 if ((!is_zero_ether_addr(res->bssid) && 12433 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) 12434 goto nla_put_failure; 12435 12436 rcu_read_lock(); 12437 /* indicate whether we have probe response data or not */ 12438 if (rcu_access_pointer(res->proberesp_ies) && 12439 nla_put_flag(msg, NL80211_BSS_PRESP_DATA)) 12440 goto fail_unlock_rcu; 12441 12442 /* this pointer prefers to be pointed to probe response data 12443 * but is always valid 12444 */ 12445 ies = rcu_dereference(res->ies); 12446 if (ies) { 12447 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf, 12448 NL80211_BSS_PAD)) 12449 goto fail_unlock_rcu; 12450 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, 12451 ies->len, ies->data)) 12452 goto fail_unlock_rcu; 12453 } 12454 12455 /* and this pointer is always (unless driver didn't know) beacon data */ 12456 ies = rcu_dereference(res->beacon_ies); 12457 if (ies && ies->from_beacon) { 12458 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf, 12459 NL80211_BSS_PAD)) 12460 goto fail_unlock_rcu; 12461 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, 12462 ies->len, ies->data)) 12463 goto fail_unlock_rcu; 12464 } 12465 rcu_read_unlock(); 12466 12467 if (res->beacon_interval && 12468 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) 12469 goto nla_put_failure; 12470 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || 12471 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || 12472 nla_put_u32(msg, NL80211_BSS_FREQUENCY_OFFSET, 12473 res->channel->freq_offset) || 12474 nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO, 12475 jiffies_to_msecs(jiffies - intbss->ts))) 12476 goto nla_put_failure; 12477 12478 if (intbss->parent_tsf && 12479 (nla_put_u64_64bit(msg, NL80211_BSS_PARENT_TSF, 12480 intbss->parent_tsf, NL80211_BSS_PAD) || 12481 nla_put(msg, NL80211_BSS_PARENT_BSSID, ETH_ALEN, 12482 intbss->parent_bssid))) 12483 goto nla_put_failure; 12484 12485 if (res->ts_boottime && 12486 nla_put_u64_64bit(msg, NL80211_BSS_LAST_SEEN_BOOTTIME, 12487 res->ts_boottime, NL80211_BSS_PAD)) 12488 goto nla_put_failure; 12489 12490 if (!nl80211_put_signal(msg, intbss->pub.chains, 12491 intbss->pub.chain_signal, 12492 NL80211_BSS_CHAIN_SIGNAL)) 12493 goto nla_put_failure; 12494 12495 if (intbss->bss_source != BSS_SOURCE_STA_PROFILE) { 12496 switch (rdev->wiphy.signal_type) { 12497 case CFG80211_SIGNAL_TYPE_MBM: 12498 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, 12499 res->signal)) 12500 goto nla_put_failure; 12501 break; 12502 case CFG80211_SIGNAL_TYPE_UNSPEC: 12503 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, 12504 res->signal)) 12505 goto nla_put_failure; 12506 break; 12507 default: 12508 break; 12509 } 12510 } 12511 12512 switch (wdev->iftype) { 12513 case NL80211_IFTYPE_P2P_CLIENT: 12514 case NL80211_IFTYPE_STATION: 12515 for_each_valid_link(wdev, link_id) { 12516 if (intbss == wdev->links[link_id].client.current_bss && 12517 (nla_put_u32(msg, NL80211_BSS_STATUS, 12518 NL80211_BSS_STATUS_ASSOCIATED) || 12519 (wdev->valid_links && 12520 (nla_put_u8(msg, NL80211_BSS_MLO_LINK_ID, 12521 link_id) || 12522 nla_put(msg, NL80211_BSS_MLD_ADDR, ETH_ALEN, 12523 wdev->u.client.connected_addr))))) 12524 goto nla_put_failure; 12525 } 12526 break; 12527 case NL80211_IFTYPE_ADHOC: 12528 if (intbss == wdev->u.ibss.current_bss && 12529 nla_put_u32(msg, NL80211_BSS_STATUS, 12530 NL80211_BSS_STATUS_IBSS_JOINED)) 12531 goto nla_put_failure; 12532 break; 12533 default: 12534 break; 12535 } 12536 12537 if (nla_put_u32(msg, NL80211_BSS_USE_FOR, res->use_for)) 12538 goto nla_put_failure; 12539 12540 if (res->cannot_use_reasons && 12541 nla_put_u64_64bit(msg, NL80211_BSS_CANNOT_USE_REASONS, 12542 res->cannot_use_reasons, 12543 NL80211_BSS_PAD)) 12544 goto nla_put_failure; 12545 12546 nla_nest_end(msg, bss); 12547 12548 genlmsg_end(msg, hdr); 12549 return 0; 12550 12551 fail_unlock_rcu: 12552 rcu_read_unlock(); 12553 nla_put_failure: 12554 genlmsg_cancel(msg, hdr); 12555 return -EMSGSIZE; 12556 } 12557 12558 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb) 12559 { 12560 struct cfg80211_registered_device *rdev; 12561 struct cfg80211_internal_bss *scan; 12562 struct wireless_dev *wdev; 12563 struct nlattr **attrbuf; 12564 int start = cb->args[2], idx = 0; 12565 bool dump_include_use_data; 12566 int err; 12567 12568 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 12569 if (!attrbuf) 12570 return -ENOMEM; 12571 12572 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, attrbuf); 12573 if (err) { 12574 kfree(attrbuf); 12575 return err; 12576 } 12577 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 12578 __acquire(&rdev->wiphy.mtx); 12579 12580 dump_include_use_data = 12581 attrbuf[NL80211_ATTR_BSS_DUMP_INCLUDE_USE_DATA]; 12582 kfree(attrbuf); 12583 12584 spin_lock_bh(&rdev->bss_lock); 12585 12586 /* 12587 * dump_scan will be called multiple times to break up the scan results 12588 * into multiple messages. It is unlikely that any more bss-es will be 12589 * expired after the first call, so only call only call this on the 12590 * first dump_scan invocation. 12591 */ 12592 if (start == 0) 12593 cfg80211_bss_expire(rdev); 12594 12595 cb->seq = rdev->bss_generation; 12596 12597 list_for_each_entry(scan, &rdev->bss_list, list) { 12598 if (++idx <= start) 12599 continue; 12600 if (!dump_include_use_data && 12601 !(scan->pub.use_for & NL80211_BSS_USE_FOR_NORMAL)) 12602 continue; 12603 if (nl80211_send_bss(skb, cb, 12604 cb->nlh->nlmsg_seq, NLM_F_MULTI, 12605 rdev, wdev, scan) < 0) { 12606 idx--; 12607 break; 12608 } 12609 } 12610 12611 spin_unlock_bh(&rdev->bss_lock); 12612 12613 cb->args[2] = idx; 12614 wiphy_unlock(&rdev->wiphy); 12615 12616 return skb->len; 12617 } 12618 12619 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq, 12620 int flags, struct net_device *dev, 12621 bool allow_radio_stats, 12622 struct survey_info *survey) 12623 { 12624 void *hdr; 12625 struct nlattr *infoattr; 12626 12627 /* skip radio stats if userspace didn't request them */ 12628 if (!survey->channel && !allow_radio_stats) 12629 return 0; 12630 12631 hdr = nl80211hdr_put(msg, portid, seq, flags, 12632 NL80211_CMD_NEW_SURVEY_RESULTS); 12633 if (!hdr) 12634 return -ENOMEM; 12635 12636 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 12637 goto nla_put_failure; 12638 12639 infoattr = nla_nest_start_noflag(msg, NL80211_ATTR_SURVEY_INFO); 12640 if (!infoattr) 12641 goto nla_put_failure; 12642 12643 if (survey->channel && 12644 nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY, 12645 survey->channel->center_freq)) 12646 goto nla_put_failure; 12647 12648 if (survey->channel && survey->channel->freq_offset && 12649 nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY_OFFSET, 12650 survey->channel->freq_offset)) 12651 goto nla_put_failure; 12652 12653 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && 12654 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) 12655 goto nla_put_failure; 12656 if ((survey->filled & SURVEY_INFO_IN_USE) && 12657 nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE)) 12658 goto nla_put_failure; 12659 if ((survey->filled & SURVEY_INFO_TIME) && 12660 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME, 12661 survey->time, NL80211_SURVEY_INFO_PAD)) 12662 goto nla_put_failure; 12663 if ((survey->filled & SURVEY_INFO_TIME_BUSY) && 12664 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BUSY, 12665 survey->time_busy, NL80211_SURVEY_INFO_PAD)) 12666 goto nla_put_failure; 12667 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) && 12668 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_EXT_BUSY, 12669 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD)) 12670 goto nla_put_failure; 12671 if ((survey->filled & SURVEY_INFO_TIME_RX) && 12672 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_RX, 12673 survey->time_rx, NL80211_SURVEY_INFO_PAD)) 12674 goto nla_put_failure; 12675 if ((survey->filled & SURVEY_INFO_TIME_TX) && 12676 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_TX, 12677 survey->time_tx, NL80211_SURVEY_INFO_PAD)) 12678 goto nla_put_failure; 12679 if ((survey->filled & SURVEY_INFO_TIME_SCAN) && 12680 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_SCAN, 12681 survey->time_scan, NL80211_SURVEY_INFO_PAD)) 12682 goto nla_put_failure; 12683 if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) && 12684 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BSS_RX, 12685 survey->time_bss_rx, NL80211_SURVEY_INFO_PAD)) 12686 goto nla_put_failure; 12687 12688 nla_nest_end(msg, infoattr); 12689 12690 genlmsg_end(msg, hdr); 12691 return 0; 12692 12693 nla_put_failure: 12694 genlmsg_cancel(msg, hdr); 12695 return -EMSGSIZE; 12696 } 12697 12698 static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb) 12699 { 12700 struct nlattr **attrbuf; 12701 struct survey_info survey; 12702 struct cfg80211_registered_device *rdev; 12703 struct wireless_dev *wdev; 12704 int survey_idx = cb->args[2]; 12705 int res; 12706 bool radio_stats; 12707 12708 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 12709 if (!attrbuf) 12710 return -ENOMEM; 12711 12712 res = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, attrbuf); 12713 if (res) { 12714 kfree(attrbuf); 12715 return res; 12716 } 12717 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 12718 __acquire(&rdev->wiphy.mtx); 12719 12720 /* prepare_wdev_dump parsed the attributes */ 12721 radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS]; 12722 12723 if (!wdev->netdev) { 12724 res = -EINVAL; 12725 goto out_err; 12726 } 12727 12728 if (!rdev->ops->dump_survey) { 12729 res = -EOPNOTSUPP; 12730 goto out_err; 12731 } 12732 12733 while (1) { 12734 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey); 12735 if (res == -ENOENT) 12736 break; 12737 if (res) 12738 goto out_err; 12739 12740 /* don't send disabled channels, but do send non-channel data */ 12741 if (survey.channel && 12742 survey.channel->flags & IEEE80211_CHAN_DISABLED) { 12743 survey_idx++; 12744 continue; 12745 } 12746 12747 if (nl80211_send_survey(skb, 12748 NETLINK_CB(cb->skb).portid, 12749 cb->nlh->nlmsg_seq, NLM_F_MULTI, 12750 wdev->netdev, radio_stats, &survey) < 0) 12751 goto out; 12752 survey_idx++; 12753 } 12754 12755 out: 12756 cb->args[2] = survey_idx; 12757 res = skb->len; 12758 out_err: 12759 kfree(attrbuf); 12760 wiphy_unlock(&rdev->wiphy); 12761 return res; 12762 } 12763 12764 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info) 12765 { 12766 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12767 struct net_device *dev = info->user_ptr[1]; 12768 struct ieee80211_channel *chan; 12769 const u8 *bssid, *ssid; 12770 int err, ssid_len; 12771 enum nl80211_auth_type auth_type; 12772 struct key_parse key; 12773 bool local_state_change; 12774 struct cfg80211_auth_request req = {}; 12775 u32 freq; 12776 12777 if (!info->attrs[NL80211_ATTR_MAC]) 12778 return -EINVAL; 12779 12780 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) 12781 return -EINVAL; 12782 12783 if (!info->attrs[NL80211_ATTR_SSID]) 12784 return -EINVAL; 12785 12786 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 12787 return -EINVAL; 12788 12789 err = nl80211_parse_key(info, &key); 12790 if (err) 12791 return err; 12792 12793 if (key.idx >= 0) { 12794 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) 12795 return -EINVAL; 12796 if (!key.p.key || !key.p.key_len) 12797 return -EINVAL; 12798 if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 || 12799 key.p.key_len != WLAN_KEY_LEN_WEP40) && 12800 (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 || 12801 key.p.key_len != WLAN_KEY_LEN_WEP104)) 12802 return -EINVAL; 12803 if (key.idx > 3) 12804 return -EINVAL; 12805 } else { 12806 key.p.key_len = 0; 12807 key.p.key = NULL; 12808 } 12809 12810 if (key.idx >= 0) { 12811 int i; 12812 bool ok = false; 12813 12814 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { 12815 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { 12816 ok = true; 12817 break; 12818 } 12819 } 12820 if (!ok) 12821 return -EINVAL; 12822 } 12823 12824 if (!rdev->ops->auth) 12825 return -EOPNOTSUPP; 12826 12827 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 12828 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 12829 return -EOPNOTSUPP; 12830 12831 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 12832 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); 12833 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 12834 freq += 12835 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 12836 12837 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); 12838 if (!chan) 12839 return -EINVAL; 12840 12841 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 12842 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 12843 12844 if (info->attrs[NL80211_ATTR_IE]) { 12845 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 12846 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 12847 } 12848 12849 if (info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]) { 12850 req.supported_selectors = 12851 nla_data(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 12852 req.supported_selectors_len = 12853 nla_len(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 12854 } 12855 12856 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 12857 if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE)) 12858 return -EINVAL; 12859 12860 if ((auth_type == NL80211_AUTHTYPE_SAE || 12861 auth_type == NL80211_AUTHTYPE_FILS_SK || 12862 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 12863 auth_type == NL80211_AUTHTYPE_FILS_PK || 12864 auth_type == NL80211_AUTHTYPE_EPPKE || 12865 auth_type == NL80211_AUTHTYPE_IEEE8021X) && 12866 !info->attrs[NL80211_ATTR_AUTH_DATA]) 12867 return -EINVAL; 12868 12869 if (info->attrs[NL80211_ATTR_AUTH_DATA]) { 12870 if (auth_type != NL80211_AUTHTYPE_SAE && 12871 auth_type != NL80211_AUTHTYPE_FILS_SK && 12872 auth_type != NL80211_AUTHTYPE_FILS_SK_PFS && 12873 auth_type != NL80211_AUTHTYPE_FILS_PK && 12874 auth_type != NL80211_AUTHTYPE_EPPKE && 12875 auth_type != NL80211_AUTHTYPE_IEEE8021X) 12876 return -EINVAL; 12877 req.auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]); 12878 req.auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]); 12879 } 12880 12881 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 12882 12883 /* 12884 * Since we no longer track auth state, ignore 12885 * requests to only change local state. 12886 */ 12887 if (local_state_change) 12888 return 0; 12889 12890 req.auth_type = auth_type; 12891 req.key = key.p.key; 12892 req.key_len = key.p.key_len; 12893 req.key_idx = key.idx; 12894 req.link_id = nl80211_link_id_or_invalid(info->attrs); 12895 if (req.link_id >= 0) { 12896 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) 12897 return -EINVAL; 12898 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) 12899 return -EINVAL; 12900 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 12901 if (!is_valid_ether_addr(req.ap_mld_addr)) 12902 return -EINVAL; 12903 } 12904 12905 req.bss = __cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len, 12906 IEEE80211_BSS_TYPE_ESS, 12907 IEEE80211_PRIVACY_ANY, 12908 NL80211_BSS_USE_FOR_NORMAL, 12909 info->extack); 12910 if (!req.bss) 12911 return -ENOENT; 12912 12913 err = cfg80211_mlme_auth(rdev, dev, &req); 12914 12915 cfg80211_put_bss(&rdev->wiphy, req.bss); 12916 12917 return err; 12918 } 12919 12920 static int validate_pae_over_nl80211(struct cfg80211_registered_device *rdev, 12921 struct genl_info *info) 12922 { 12923 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 12924 GENL_SET_ERR_MSG(info, "SOCKET_OWNER not set"); 12925 return -EINVAL; 12926 } 12927 12928 if (!rdev->ops->tx_control_port || 12929 !wiphy_ext_feature_isset(&rdev->wiphy, 12930 NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211)) 12931 return -EOPNOTSUPP; 12932 12933 return 0; 12934 } 12935 12936 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, 12937 struct genl_info *info, 12938 struct cfg80211_crypto_settings *settings, 12939 int cipher_limit) 12940 { 12941 memset(settings, 0, sizeof(*settings)); 12942 12943 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; 12944 12945 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { 12946 u16 proto; 12947 12948 proto = nla_get_u16( 12949 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); 12950 settings->control_port_ethertype = cpu_to_be16(proto); 12951 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && 12952 proto != ETH_P_PAE) 12953 return -EINVAL; 12954 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) 12955 settings->control_port_no_encrypt = true; 12956 } else 12957 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); 12958 12959 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 12960 int r = validate_pae_over_nl80211(rdev, info); 12961 12962 if (r < 0) 12963 return r; 12964 12965 settings->control_port_over_nl80211 = true; 12966 12967 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH]) 12968 settings->control_port_no_preauth = true; 12969 } 12970 12971 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { 12972 void *data; 12973 int len, i; 12974 12975 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 12976 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 12977 settings->n_ciphers_pairwise = len / sizeof(u32); 12978 12979 if (len % sizeof(u32)) 12980 return -EINVAL; 12981 12982 if (settings->n_ciphers_pairwise > cipher_limit) 12983 return -EINVAL; 12984 12985 memcpy(settings->ciphers_pairwise, data, len); 12986 12987 for (i = 0; i < settings->n_ciphers_pairwise; i++) 12988 if (!cfg80211_supported_cipher_suite( 12989 &rdev->wiphy, 12990 settings->ciphers_pairwise[i])) 12991 return -EINVAL; 12992 } 12993 12994 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { 12995 settings->cipher_group = 12996 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); 12997 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, 12998 settings->cipher_group)) 12999 return -EINVAL; 13000 } 13001 13002 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) 13003 settings->wpa_versions = 13004 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); 13005 13006 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { 13007 void *data; 13008 int len; 13009 13010 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); 13011 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); 13012 settings->n_akm_suites = len / sizeof(u32); 13013 13014 if (len % sizeof(u32)) 13015 return -EINVAL; 13016 13017 if (settings->n_akm_suites > rdev->wiphy.max_num_akm_suites) 13018 return -EINVAL; 13019 13020 memcpy(settings->akm_suites, data, len); 13021 } 13022 13023 if (info->attrs[NL80211_ATTR_PMK]) { 13024 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN) 13025 return -EINVAL; 13026 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13027 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK) && 13028 !wiphy_ext_feature_isset(&rdev->wiphy, 13029 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK)) 13030 return -EINVAL; 13031 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]); 13032 } 13033 13034 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) { 13035 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13036 NL80211_EXT_FEATURE_SAE_OFFLOAD) && 13037 !wiphy_ext_feature_isset(&rdev->wiphy, 13038 NL80211_EXT_FEATURE_SAE_OFFLOAD_AP)) 13039 return -EINVAL; 13040 settings->sae_pwd = 13041 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]); 13042 settings->sae_pwd_len = 13043 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); 13044 } 13045 13046 settings->sae_pwe = 13047 nla_get_u8_default(info->attrs[NL80211_ATTR_SAE_PWE], 13048 NL80211_SAE_PWE_UNSPECIFIED); 13049 13050 return 0; 13051 } 13052 13053 static struct cfg80211_bss *nl80211_assoc_bss(struct cfg80211_registered_device *rdev, 13054 struct genl_info *info, 13055 const u8 *ssid, int ssid_len, 13056 struct nlattr **attrs, 13057 int assoc_link_id, int link_id) 13058 { 13059 struct ieee80211_channel *chan; 13060 struct cfg80211_bss *bss; 13061 const u8 *bssid; 13062 u32 freq, use_for = 0; 13063 13064 if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_WIPHY_FREQ]) { 13065 GENL_SET_ERR_MSG(info, "BSSID or frequency missing"); 13066 return ERR_PTR(-EINVAL); 13067 } 13068 13069 bssid = nla_data(attrs[NL80211_ATTR_MAC]); 13070 13071 freq = MHZ_TO_KHZ(nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ])); 13072 if (attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 13073 freq += nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 13074 13075 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); 13076 if (!chan) { 13077 GENL_SET_ERR_MSG(info, "invalid or disabled channel"); 13078 return ERR_PTR(-EINVAL); 13079 } 13080 13081 if (assoc_link_id >= 0) 13082 use_for = NL80211_BSS_USE_FOR_MLD_LINK; 13083 if (assoc_link_id == link_id) 13084 use_for |= NL80211_BSS_USE_FOR_NORMAL; 13085 13086 bss = __cfg80211_get_bss(&rdev->wiphy, chan, bssid, 13087 ssid, ssid_len, 13088 IEEE80211_BSS_TYPE_ESS, 13089 IEEE80211_PRIVACY_ANY, 13090 use_for, info->extack); 13091 if (!bss) 13092 return ERR_PTR(-ENOENT); 13093 13094 return bss; 13095 } 13096 13097 static int nl80211_process_links(struct cfg80211_registered_device *rdev, 13098 struct cfg80211_assoc_link *links, 13099 int assoc_link_id, 13100 const u8 *ssid, int ssid_len, 13101 struct genl_info *info) 13102 { 13103 unsigned int attrsize = NUM_NL80211_ATTR * sizeof(struct nlattr *); 13104 struct nlattr **attrs __free(kfree) = kzalloc(attrsize, GFP_KERNEL); 13105 struct nlattr *link; 13106 unsigned int link_id; 13107 int rem, err; 13108 13109 if (!attrs) 13110 return -ENOMEM; 13111 13112 nla_for_each_nested(link, info->attrs[NL80211_ATTR_MLO_LINKS], rem) { 13113 memset(attrs, 0, attrsize); 13114 13115 nla_parse_nested(attrs, NL80211_ATTR_MAX, link, NULL, NULL); 13116 13117 if (!attrs[NL80211_ATTR_MLO_LINK_ID]) { 13118 NL_SET_BAD_ATTR(info->extack, link); 13119 return -EINVAL; 13120 } 13121 13122 link_id = nla_get_u8(attrs[NL80211_ATTR_MLO_LINK_ID]); 13123 /* cannot use the same link ID again */ 13124 if (links[link_id].bss) { 13125 NL_SET_BAD_ATTR(info->extack, link); 13126 return -EINVAL; 13127 } 13128 links[link_id].bss = 13129 nl80211_assoc_bss(rdev, info, ssid, ssid_len, attrs, 13130 assoc_link_id, link_id); 13131 if (IS_ERR(links[link_id].bss)) { 13132 err = PTR_ERR(links[link_id].bss); 13133 links[link_id].bss = NULL; 13134 /* the BSS lookup set the specific message already */ 13135 NL_SET_BAD_ATTR(info->extack, link); 13136 return err; 13137 } 13138 13139 if (attrs[NL80211_ATTR_IE]) { 13140 links[link_id].elems = nla_data(attrs[NL80211_ATTR_IE]); 13141 links[link_id].elems_len = 13142 nla_len(attrs[NL80211_ATTR_IE]); 13143 13144 if (cfg80211_find_elem(WLAN_EID_FRAGMENT, 13145 links[link_id].elems, 13146 links[link_id].elems_len)) { 13147 NL_SET_ERR_MSG_ATTR(info->extack, 13148 attrs[NL80211_ATTR_IE], 13149 "cannot deal with fragmentation"); 13150 return -EINVAL; 13151 } 13152 13153 if (cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE, 13154 links[link_id].elems, 13155 links[link_id].elems_len)) { 13156 NL_SET_ERR_MSG_ATTR(info->extack, 13157 attrs[NL80211_ATTR_IE], 13158 "cannot deal with non-inheritance"); 13159 return -EINVAL; 13160 } 13161 } 13162 } 13163 13164 return 0; 13165 } 13166 13167 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info) 13168 { 13169 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13170 struct net_device *dev = info->user_ptr[1]; 13171 struct cfg80211_assoc_request req = {}; 13172 const u8 *ap_addr, *ssid; 13173 unsigned int link_id; 13174 int err, ssid_len; 13175 13176 if (dev->ieee80211_ptr->conn_owner_nlportid && 13177 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 13178 return -EPERM; 13179 13180 if (!info->attrs[NL80211_ATTR_SSID]) 13181 return -EINVAL; 13182 13183 if (!rdev->ops->assoc) 13184 return -EOPNOTSUPP; 13185 13186 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 13187 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 13188 return -EOPNOTSUPP; 13189 13190 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 13191 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 13192 13193 if (info->attrs[NL80211_ATTR_IE]) { 13194 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13195 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13196 13197 if (cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE, 13198 req.ie, req.ie_len)) { 13199 NL_SET_ERR_MSG_ATTR(info->extack, 13200 info->attrs[NL80211_ATTR_IE], 13201 "non-inheritance makes no sense"); 13202 return -EINVAL; 13203 } 13204 } 13205 13206 if (info->attrs[NL80211_ATTR_USE_MFP]) { 13207 enum nl80211_mfp mfp = 13208 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 13209 if (mfp == NL80211_MFP_REQUIRED) 13210 req.use_mfp = true; 13211 else if (mfp != NL80211_MFP_NO) 13212 return -EINVAL; 13213 } 13214 13215 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 13216 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 13217 13218 if (info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]) { 13219 req.supported_selectors = 13220 nla_data(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 13221 req.supported_selectors_len = 13222 nla_len(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 13223 } 13224 13225 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 13226 req.flags |= ASSOC_REQ_DISABLE_HT; 13227 13228 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 13229 memcpy(&req.ht_capa_mask, 13230 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 13231 sizeof(req.ht_capa_mask)); 13232 13233 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 13234 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 13235 return -EINVAL; 13236 memcpy(&req.ht_capa, 13237 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 13238 sizeof(req.ht_capa)); 13239 } 13240 13241 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 13242 req.flags |= ASSOC_REQ_DISABLE_VHT; 13243 13244 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) 13245 req.flags |= ASSOC_REQ_DISABLE_HE; 13246 13247 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) 13248 req.flags |= ASSOC_REQ_DISABLE_EHT; 13249 13250 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_UHR])) 13251 req.flags |= ASSOC_REQ_DISABLE_UHR; 13252 13253 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 13254 memcpy(&req.vht_capa_mask, 13255 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 13256 sizeof(req.vht_capa_mask)); 13257 13258 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 13259 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 13260 return -EINVAL; 13261 memcpy(&req.vht_capa, 13262 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 13263 sizeof(req.vht_capa)); 13264 } 13265 13266 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { 13267 if (!((rdev->wiphy.features & 13268 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) && 13269 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && 13270 !wiphy_ext_feature_isset(&rdev->wiphy, 13271 NL80211_EXT_FEATURE_RRM)) 13272 return -EINVAL; 13273 req.flags |= ASSOC_REQ_USE_RRM; 13274 } 13275 13276 if (info->attrs[NL80211_ATTR_FILS_KEK]) { 13277 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); 13278 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); 13279 if (!info->attrs[NL80211_ATTR_FILS_NONCES]) 13280 return -EINVAL; 13281 req.fils_nonces = 13282 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); 13283 } 13284 13285 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) { 13286 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY]) 13287 return -EINVAL; 13288 memcpy(&req.s1g_capa_mask, 13289 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]), 13290 sizeof(req.s1g_capa_mask)); 13291 } 13292 13293 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) { 13294 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) 13295 return -EINVAL; 13296 memcpy(&req.s1g_capa, 13297 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]), 13298 sizeof(req.s1g_capa)); 13299 } 13300 13301 if (nla_get_flag(info->attrs[NL80211_ATTR_ASSOC_SPP_AMSDU])) { 13302 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13303 NL80211_EXT_FEATURE_SPP_AMSDU_SUPPORT)) { 13304 GENL_SET_ERR_MSG(info, "SPP A-MSDUs not supported"); 13305 return -EINVAL; 13306 } 13307 req.flags |= ASSOC_REQ_SPP_AMSDU; 13308 } 13309 13310 req.link_id = nl80211_link_id_or_invalid(info->attrs); 13311 13312 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { 13313 if (req.link_id < 0) 13314 return -EINVAL; 13315 13316 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) 13317 return -EINVAL; 13318 13319 if (info->attrs[NL80211_ATTR_MAC] || 13320 info->attrs[NL80211_ATTR_WIPHY_FREQ] || 13321 !info->attrs[NL80211_ATTR_MLD_ADDR]) 13322 return -EINVAL; 13323 13324 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 13325 ap_addr = req.ap_mld_addr; 13326 13327 err = nl80211_process_links(rdev, req.links, req.link_id, 13328 ssid, ssid_len, info); 13329 if (err) 13330 goto free; 13331 13332 if (!req.links[req.link_id].bss) { 13333 err = -EINVAL; 13334 goto free; 13335 } 13336 13337 if (req.links[req.link_id].elems_len) { 13338 GENL_SET_ERR_MSG(info, 13339 "cannot have per-link elems on assoc link"); 13340 err = -EINVAL; 13341 goto free; 13342 } 13343 13344 if (info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]) 13345 req.ext_mld_capa_ops = 13346 nla_get_u16(info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]); 13347 } else { 13348 if (req.link_id >= 0) 13349 return -EINVAL; 13350 13351 req.bss = nl80211_assoc_bss(rdev, info, ssid, ssid_len, info->attrs, 13352 -1, -1); 13353 if (IS_ERR(req.bss)) 13354 return PTR_ERR(req.bss); 13355 ap_addr = req.bss->bssid; 13356 13357 if (info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]) 13358 return -EINVAL; 13359 } 13360 13361 err = nl80211_crypto_settings(rdev, info, &req.crypto, 1); 13362 if (!err) { 13363 struct nlattr *link; 13364 int rem = 0; 13365 13366 err = cfg80211_mlme_assoc(rdev, dev, &req, 13367 info->extack); 13368 13369 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 13370 dev->ieee80211_ptr->conn_owner_nlportid = 13371 info->snd_portid; 13372 memcpy(dev->ieee80211_ptr->disconnect_bssid, 13373 ap_addr, ETH_ALEN); 13374 } 13375 13376 /* Report error from first problematic link */ 13377 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { 13378 nla_for_each_nested(link, 13379 info->attrs[NL80211_ATTR_MLO_LINKS], 13380 rem) { 13381 struct nlattr *link_id_attr = 13382 nla_find_nested(link, NL80211_ATTR_MLO_LINK_ID); 13383 13384 if (!link_id_attr) 13385 continue; 13386 13387 link_id = nla_get_u8(link_id_attr); 13388 13389 if (link_id == req.link_id) 13390 continue; 13391 13392 if (!req.links[link_id].error || 13393 WARN_ON(req.links[link_id].error > 0)) 13394 continue; 13395 13396 WARN_ON(err >= 0); 13397 13398 NL_SET_BAD_ATTR(info->extack, link); 13399 err = req.links[link_id].error; 13400 break; 13401 } 13402 } 13403 } 13404 13405 free: 13406 for (link_id = 0; link_id < ARRAY_SIZE(req.links); link_id++) 13407 cfg80211_put_bss(&rdev->wiphy, req.links[link_id].bss); 13408 cfg80211_put_bss(&rdev->wiphy, req.bss); 13409 13410 return err; 13411 } 13412 13413 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info) 13414 { 13415 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13416 struct net_device *dev = info->user_ptr[1]; 13417 const u8 *ie = NULL, *bssid; 13418 int ie_len = 0; 13419 u16 reason_code; 13420 bool local_state_change; 13421 13422 if (dev->ieee80211_ptr->conn_owner_nlportid && 13423 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 13424 return -EPERM; 13425 13426 if (!info->attrs[NL80211_ATTR_MAC]) 13427 return -EINVAL; 13428 13429 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 13430 return -EINVAL; 13431 13432 if (!rdev->ops->deauth) 13433 return -EOPNOTSUPP; 13434 13435 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 13436 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 13437 return -EOPNOTSUPP; 13438 13439 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 13440 13441 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 13442 if (reason_code == 0) { 13443 /* Reason Code 0 is reserved */ 13444 return -EINVAL; 13445 } 13446 13447 if (info->attrs[NL80211_ATTR_IE]) { 13448 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13449 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13450 } 13451 13452 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 13453 13454 return cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code, 13455 local_state_change); 13456 } 13457 13458 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) 13459 { 13460 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13461 struct net_device *dev = info->user_ptr[1]; 13462 const u8 *ie = NULL, *bssid; 13463 int ie_len = 0; 13464 u16 reason_code; 13465 bool local_state_change; 13466 13467 if (dev->ieee80211_ptr->conn_owner_nlportid && 13468 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 13469 return -EPERM; 13470 13471 if (!info->attrs[NL80211_ATTR_MAC]) 13472 return -EINVAL; 13473 13474 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 13475 return -EINVAL; 13476 13477 if (!rdev->ops->disassoc) 13478 return -EOPNOTSUPP; 13479 13480 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 13481 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 13482 return -EOPNOTSUPP; 13483 13484 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 13485 13486 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 13487 if (reason_code == 0) { 13488 /* Reason Code 0 is reserved */ 13489 return -EINVAL; 13490 } 13491 13492 if (info->attrs[NL80211_ATTR_IE]) { 13493 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13494 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13495 } 13496 13497 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 13498 13499 return cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code, 13500 local_state_change); 13501 } 13502 13503 static bool 13504 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev, 13505 int mcast_rate[NUM_NL80211_BANDS], 13506 int rateval) 13507 { 13508 struct wiphy *wiphy = &rdev->wiphy; 13509 bool found = false; 13510 int band, i; 13511 13512 for (band = 0; band < NUM_NL80211_BANDS; band++) { 13513 struct ieee80211_supported_band *sband; 13514 13515 sband = wiphy->bands[band]; 13516 if (!sband) 13517 continue; 13518 13519 for (i = 0; i < sband->n_bitrates; i++) { 13520 if (sband->bitrates[i].bitrate == rateval) { 13521 mcast_rate[band] = i + 1; 13522 found = true; 13523 break; 13524 } 13525 } 13526 } 13527 13528 return found; 13529 } 13530 13531 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info) 13532 { 13533 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13534 struct net_device *dev = info->user_ptr[1]; 13535 struct cfg80211_ibss_params ibss; 13536 struct wiphy *wiphy; 13537 struct cfg80211_cached_keys *connkeys = NULL; 13538 int err; 13539 13540 memset(&ibss, 0, sizeof(ibss)); 13541 13542 if (!info->attrs[NL80211_ATTR_SSID] || 13543 !nla_len(info->attrs[NL80211_ATTR_SSID])) 13544 return -EINVAL; 13545 13546 ibss.beacon_interval = 100; 13547 13548 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) 13549 ibss.beacon_interval = 13550 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 13551 13552 err = cfg80211_validate_beacon_int(rdev, NL80211_IFTYPE_ADHOC, 13553 ibss.beacon_interval); 13554 if (err) 13555 return err; 13556 13557 if (!rdev->ops->join_ibss) 13558 return -EOPNOTSUPP; 13559 13560 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 13561 return -EOPNOTSUPP; 13562 13563 wiphy = &rdev->wiphy; 13564 13565 if (info->attrs[NL80211_ATTR_MAC]) { 13566 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 13567 13568 if (!is_valid_ether_addr(ibss.bssid)) 13569 return -EINVAL; 13570 } 13571 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 13572 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 13573 13574 if (info->attrs[NL80211_ATTR_IE]) { 13575 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13576 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13577 } 13578 13579 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 13580 &ibss.chandef, false); 13581 if (err) 13582 return err; 13583 13584 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef, 13585 NL80211_IFTYPE_ADHOC)) 13586 return -EINVAL; 13587 13588 switch (ibss.chandef.width) { 13589 case NL80211_CHAN_WIDTH_20_NOHT: 13590 break; 13591 case NL80211_CHAN_WIDTH_20: 13592 case NL80211_CHAN_WIDTH_40: 13593 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) 13594 return -EINVAL; 13595 break; 13596 case NL80211_CHAN_WIDTH_80: 13597 case NL80211_CHAN_WIDTH_80P80: 13598 case NL80211_CHAN_WIDTH_160: 13599 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) 13600 return -EINVAL; 13601 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13602 NL80211_EXT_FEATURE_VHT_IBSS)) 13603 return -EINVAL; 13604 break; 13605 case NL80211_CHAN_WIDTH_320: 13606 return -EINVAL; 13607 default: 13608 return -EINVAL; 13609 } 13610 13611 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; 13612 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 13613 13614 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 13615 u8 *rates = 13616 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 13617 int n_rates = 13618 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 13619 struct ieee80211_supported_band *sband = 13620 wiphy->bands[ibss.chandef.chan->band]; 13621 13622 err = ieee80211_get_ratemask(sband, rates, n_rates, 13623 &ibss.basic_rates); 13624 if (err) 13625 return err; 13626 } 13627 13628 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 13629 memcpy(&ibss.ht_capa_mask, 13630 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 13631 sizeof(ibss.ht_capa_mask)); 13632 13633 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 13634 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 13635 return -EINVAL; 13636 memcpy(&ibss.ht_capa, 13637 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 13638 sizeof(ibss.ht_capa)); 13639 } 13640 13641 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 13642 !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate, 13643 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 13644 return -EINVAL; 13645 13646 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { 13647 bool no_ht = false; 13648 13649 connkeys = nl80211_parse_connkeys(rdev, dev->ieee80211_ptr, 13650 info, &no_ht); 13651 if (IS_ERR(connkeys)) 13652 return PTR_ERR(connkeys); 13653 13654 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) && 13655 no_ht) { 13656 kfree_sensitive(connkeys); 13657 return -EINVAL; 13658 } 13659 } 13660 13661 ibss.control_port = 13662 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); 13663 13664 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 13665 int r = validate_pae_over_nl80211(rdev, info); 13666 13667 if (r < 0) { 13668 kfree_sensitive(connkeys); 13669 return r; 13670 } 13671 13672 ibss.control_port_over_nl80211 = true; 13673 } 13674 13675 ibss.userspace_handles_dfs = 13676 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 13677 13678 err = __cfg80211_join_ibss(rdev, dev, &ibss, connkeys); 13679 if (err) 13680 kfree_sensitive(connkeys); 13681 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 13682 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 13683 13684 return err; 13685 } 13686 13687 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info) 13688 { 13689 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13690 struct net_device *dev = info->user_ptr[1]; 13691 13692 if (!rdev->ops->leave_ibss) 13693 return -EOPNOTSUPP; 13694 13695 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 13696 return -EOPNOTSUPP; 13697 13698 return cfg80211_leave_ibss(rdev, dev, false); 13699 } 13700 13701 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info) 13702 { 13703 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13704 struct net_device *dev = info->user_ptr[1]; 13705 int mcast_rate[NUM_NL80211_BANDS]; 13706 u32 nla_rate; 13707 13708 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && 13709 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && 13710 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) 13711 return -EOPNOTSUPP; 13712 13713 if (!rdev->ops->set_mcast_rate) 13714 return -EOPNOTSUPP; 13715 13716 memset(mcast_rate, 0, sizeof(mcast_rate)); 13717 13718 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) 13719 return -EINVAL; 13720 13721 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); 13722 if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate)) 13723 return -EINVAL; 13724 13725 return rdev_set_mcast_rate(rdev, dev, mcast_rate); 13726 } 13727 13728 static struct sk_buff * 13729 __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev, 13730 struct wireless_dev *wdev, int approxlen, 13731 u32 portid, u32 seq, enum nl80211_commands cmd, 13732 enum nl80211_attrs attr, 13733 const struct nl80211_vendor_cmd_info *info, 13734 gfp_t gfp) 13735 { 13736 struct sk_buff *skb; 13737 void *hdr; 13738 struct nlattr *data; 13739 13740 skb = nlmsg_new(approxlen + 100, gfp); 13741 if (!skb) 13742 return NULL; 13743 13744 hdr = nl80211hdr_put(skb, portid, seq, 0, cmd); 13745 if (!hdr) { 13746 kfree_skb(skb); 13747 return NULL; 13748 } 13749 13750 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 13751 goto nla_put_failure; 13752 13753 if (info) { 13754 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID, 13755 info->vendor_id)) 13756 goto nla_put_failure; 13757 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD, 13758 info->subcmd)) 13759 goto nla_put_failure; 13760 } 13761 13762 if (wdev) { 13763 if (nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 13764 wdev_id(wdev), NL80211_ATTR_PAD)) 13765 goto nla_put_failure; 13766 if (wdev->netdev && 13767 nla_put_u32(skb, NL80211_ATTR_IFINDEX, 13768 wdev->netdev->ifindex)) 13769 goto nla_put_failure; 13770 } 13771 13772 data = nla_nest_start_noflag(skb, attr); 13773 if (!data) 13774 goto nla_put_failure; 13775 13776 ((void **)skb->cb)[0] = rdev; 13777 ((void **)skb->cb)[1] = hdr; 13778 ((void **)skb->cb)[2] = data; 13779 13780 return skb; 13781 13782 nla_put_failure: 13783 kfree_skb(skb); 13784 return NULL; 13785 } 13786 13787 struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy, 13788 struct wireless_dev *wdev, 13789 enum nl80211_commands cmd, 13790 enum nl80211_attrs attr, 13791 unsigned int portid, 13792 int vendor_event_idx, 13793 int approxlen, gfp_t gfp) 13794 { 13795 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 13796 const struct nl80211_vendor_cmd_info *info; 13797 13798 switch (cmd) { 13799 case NL80211_CMD_TESTMODE: 13800 if (WARN_ON(vendor_event_idx != -1)) 13801 return NULL; 13802 info = NULL; 13803 break; 13804 case NL80211_CMD_VENDOR: 13805 if (WARN_ON(vendor_event_idx < 0 || 13806 vendor_event_idx >= wiphy->n_vendor_events)) 13807 return NULL; 13808 info = &wiphy->vendor_events[vendor_event_idx]; 13809 break; 13810 default: 13811 WARN_ON(1); 13812 return NULL; 13813 } 13814 13815 return __cfg80211_alloc_vendor_skb(rdev, wdev, approxlen, portid, 0, 13816 cmd, attr, info, gfp); 13817 } 13818 EXPORT_SYMBOL(__cfg80211_alloc_event_skb); 13819 13820 void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp) 13821 { 13822 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 13823 void *hdr = ((void **)skb->cb)[1]; 13824 struct nlmsghdr *nlhdr = nlmsg_hdr(skb); 13825 struct nlattr *data = ((void **)skb->cb)[2]; 13826 enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE; 13827 13828 /* clear CB data for netlink core to own from now on */ 13829 memset(skb->cb, 0, sizeof(skb->cb)); 13830 13831 nla_nest_end(skb, data); 13832 genlmsg_end(skb, hdr); 13833 13834 if (nlhdr->nlmsg_pid) { 13835 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb, 13836 nlhdr->nlmsg_pid); 13837 } else { 13838 if (data->nla_type == NL80211_ATTR_VENDOR_DATA) 13839 mcgrp = NL80211_MCGRP_VENDOR; 13840 13841 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 13842 skb, 0, mcgrp, gfp); 13843 } 13844 } 13845 EXPORT_SYMBOL(__cfg80211_send_event_skb); 13846 13847 #ifdef CONFIG_NL80211_TESTMODE 13848 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) 13849 { 13850 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13851 struct wireless_dev *wdev; 13852 int err; 13853 13854 lockdep_assert_held(&rdev->wiphy.mtx); 13855 13856 wdev = __cfg80211_wdev_from_attrs(rdev, genl_info_net(info), 13857 info->attrs); 13858 13859 if (!rdev->ops->testmode_cmd) 13860 return -EOPNOTSUPP; 13861 13862 if (IS_ERR(wdev)) { 13863 err = PTR_ERR(wdev); 13864 if (err != -EINVAL) 13865 return err; 13866 wdev = NULL; 13867 } else if (wdev->wiphy != &rdev->wiphy) { 13868 return -EINVAL; 13869 } 13870 13871 if (!info->attrs[NL80211_ATTR_TESTDATA]) 13872 return -EINVAL; 13873 13874 rdev->cur_cmd_info = info; 13875 err = rdev_testmode_cmd(rdev, wdev, 13876 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), 13877 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); 13878 rdev->cur_cmd_info = NULL; 13879 13880 return err; 13881 } 13882 13883 static int nl80211_testmode_dump(struct sk_buff *skb, 13884 struct netlink_callback *cb) 13885 { 13886 struct cfg80211_registered_device *rdev; 13887 struct nlattr **attrbuf = NULL; 13888 int err; 13889 long phy_idx; 13890 void *data = NULL; 13891 int data_len = 0; 13892 13893 rtnl_lock(); 13894 13895 if (cb->args[0]) { 13896 /* 13897 * 0 is a valid index, but not valid for args[0], 13898 * so we need to offset by 1. 13899 */ 13900 phy_idx = cb->args[0] - 1; 13901 13902 rdev = cfg80211_rdev_by_wiphy_idx(phy_idx); 13903 if (!rdev) { 13904 err = -ENOENT; 13905 goto out_err; 13906 } 13907 13908 /* 13909 * The wiphy may have moved netns between dumpit 13910 * invocations (via NL80211_CMD_SET_WIPHY_NETNS), so 13911 * re-check that it still matches the caller's netns. 13912 */ 13913 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) { 13914 err = -ENODEV; 13915 goto out_err; 13916 } 13917 } else { 13918 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 13919 if (!attrbuf) { 13920 err = -ENOMEM; 13921 goto out_err; 13922 } 13923 13924 err = nlmsg_parse_deprecated(cb->nlh, 13925 GENL_HDRLEN + nl80211_fam.hdrsize, 13926 attrbuf, nl80211_fam.maxattr, 13927 nl80211_policy, NULL); 13928 if (err) 13929 goto out_err; 13930 13931 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); 13932 if (IS_ERR(rdev)) { 13933 err = PTR_ERR(rdev); 13934 goto out_err; 13935 } 13936 phy_idx = rdev->wiphy_idx; 13937 13938 if (attrbuf[NL80211_ATTR_TESTDATA]) 13939 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; 13940 } 13941 13942 if (cb->args[1]) { 13943 data = nla_data((void *)cb->args[1]); 13944 data_len = nla_len((void *)cb->args[1]); 13945 } 13946 13947 if (!rdev->ops->testmode_dump) { 13948 err = -EOPNOTSUPP; 13949 goto out_err; 13950 } 13951 13952 while (1) { 13953 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 13954 cb->nlh->nlmsg_seq, NLM_F_MULTI, 13955 NL80211_CMD_TESTMODE); 13956 struct nlattr *tmdata; 13957 13958 if (!hdr) 13959 break; 13960 13961 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) { 13962 genlmsg_cancel(skb, hdr); 13963 break; 13964 } 13965 13966 tmdata = nla_nest_start_noflag(skb, NL80211_ATTR_TESTDATA); 13967 if (!tmdata) { 13968 genlmsg_cancel(skb, hdr); 13969 break; 13970 } 13971 err = rdev_testmode_dump(rdev, skb, cb, data, data_len); 13972 nla_nest_end(skb, tmdata); 13973 13974 if (err == -ENOBUFS || err == -ENOENT) { 13975 genlmsg_cancel(skb, hdr); 13976 break; 13977 } else if (err) { 13978 genlmsg_cancel(skb, hdr); 13979 goto out_err; 13980 } 13981 13982 genlmsg_end(skb, hdr); 13983 } 13984 13985 err = skb->len; 13986 /* see above */ 13987 cb->args[0] = phy_idx + 1; 13988 out_err: 13989 kfree(attrbuf); 13990 rtnl_unlock(); 13991 return err; 13992 } 13993 #endif 13994 13995 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info) 13996 { 13997 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13998 struct net_device *dev = info->user_ptr[1]; 13999 struct cfg80211_connect_params connect; 14000 struct wiphy *wiphy; 14001 struct cfg80211_cached_keys *connkeys = NULL; 14002 u32 freq = 0; 14003 int err; 14004 14005 memset(&connect, 0, sizeof(connect)); 14006 14007 if (!info->attrs[NL80211_ATTR_SSID] || 14008 !nla_len(info->attrs[NL80211_ATTR_SSID])) 14009 return -EINVAL; 14010 14011 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 14012 connect.auth_type = 14013 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 14014 if (!nl80211_valid_auth_type(rdev, connect.auth_type, 14015 NL80211_CMD_CONNECT)) 14016 return -EINVAL; 14017 } else 14018 connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC; 14019 14020 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; 14021 14022 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] && 14023 !wiphy_ext_feature_isset(&rdev->wiphy, 14024 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 14025 return -EINVAL; 14026 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS]; 14027 14028 err = nl80211_crypto_settings(rdev, info, &connect.crypto, 14029 NL80211_MAX_NR_CIPHER_SUITES); 14030 if (err) 14031 return err; 14032 14033 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14034 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 14035 return -EOPNOTSUPP; 14036 14037 wiphy = &rdev->wiphy; 14038 14039 connect.bg_scan_period = -1; 14040 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && 14041 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { 14042 connect.bg_scan_period = 14043 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); 14044 } 14045 14046 if (info->attrs[NL80211_ATTR_MAC]) 14047 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 14048 else if (info->attrs[NL80211_ATTR_MAC_HINT]) 14049 connect.bssid_hint = 14050 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]); 14051 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 14052 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 14053 14054 if (info->attrs[NL80211_ATTR_IE]) { 14055 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 14056 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 14057 } 14058 14059 if (info->attrs[NL80211_ATTR_USE_MFP]) { 14060 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 14061 if (connect.mfp == NL80211_MFP_OPTIONAL && 14062 !wiphy_ext_feature_isset(&rdev->wiphy, 14063 NL80211_EXT_FEATURE_MFP_OPTIONAL)) 14064 return -EOPNOTSUPP; 14065 } else { 14066 connect.mfp = NL80211_MFP_NO; 14067 } 14068 14069 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 14070 connect.prev_bssid = 14071 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 14072 14073 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) 14074 freq = MHZ_TO_KHZ(nla_get_u32( 14075 info->attrs[NL80211_ATTR_WIPHY_FREQ])); 14076 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 14077 freq += 14078 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 14079 14080 if (freq) { 14081 connect.channel = nl80211_get_valid_chan(wiphy, freq); 14082 if (!connect.channel) 14083 return -EINVAL; 14084 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) { 14085 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]); 14086 freq = MHZ_TO_KHZ(freq); 14087 connect.channel_hint = nl80211_get_valid_chan(wiphy, freq); 14088 if (!connect.channel_hint) 14089 return -EINVAL; 14090 } 14091 14092 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { 14093 connect.edmg.channels = 14094 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); 14095 14096 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) 14097 connect.edmg.bw_config = 14098 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); 14099 } 14100 14101 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { 14102 connkeys = nl80211_parse_connkeys(rdev, dev->ieee80211_ptr, 14103 info, NULL); 14104 if (IS_ERR(connkeys)) 14105 return PTR_ERR(connkeys); 14106 } 14107 14108 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 14109 connect.flags |= ASSOC_REQ_DISABLE_HT; 14110 14111 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 14112 memcpy(&connect.ht_capa_mask, 14113 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 14114 sizeof(connect.ht_capa_mask)); 14115 14116 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 14117 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { 14118 kfree_sensitive(connkeys); 14119 return -EINVAL; 14120 } 14121 memcpy(&connect.ht_capa, 14122 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 14123 sizeof(connect.ht_capa)); 14124 } 14125 14126 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 14127 connect.flags |= ASSOC_REQ_DISABLE_VHT; 14128 14129 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) 14130 connect.flags |= ASSOC_REQ_DISABLE_HE; 14131 14132 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) 14133 connect.flags |= ASSOC_REQ_DISABLE_EHT; 14134 14135 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_UHR])) 14136 connect.flags |= ASSOC_REQ_DISABLE_UHR; 14137 14138 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 14139 memcpy(&connect.vht_capa_mask, 14140 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 14141 sizeof(connect.vht_capa_mask)); 14142 14143 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 14144 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { 14145 kfree_sensitive(connkeys); 14146 return -EINVAL; 14147 } 14148 memcpy(&connect.vht_capa, 14149 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 14150 sizeof(connect.vht_capa)); 14151 } 14152 14153 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { 14154 if (!((rdev->wiphy.features & 14155 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) && 14156 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && 14157 !wiphy_ext_feature_isset(&rdev->wiphy, 14158 NL80211_EXT_FEATURE_RRM)) { 14159 kfree_sensitive(connkeys); 14160 return -EINVAL; 14161 } 14162 connect.flags |= ASSOC_REQ_USE_RRM; 14163 } 14164 14165 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); 14166 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { 14167 kfree_sensitive(connkeys); 14168 return -EOPNOTSUPP; 14169 } 14170 14171 if (info->attrs[NL80211_ATTR_BSS_SELECT]) { 14172 /* bss selection makes no sense if bssid is set */ 14173 if (connect.bssid) { 14174 kfree_sensitive(connkeys); 14175 return -EINVAL; 14176 } 14177 14178 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT], 14179 wiphy, &connect.bss_select); 14180 if (err) { 14181 kfree_sensitive(connkeys); 14182 return err; 14183 } 14184 } 14185 14186 if (wiphy_ext_feature_isset(&rdev->wiphy, 14187 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) && 14188 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && 14189 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && 14190 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && 14191 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 14192 connect.fils_erp_username = 14193 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 14194 connect.fils_erp_username_len = 14195 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 14196 connect.fils_erp_realm = 14197 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 14198 connect.fils_erp_realm_len = 14199 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 14200 connect.fils_erp_next_seq_num = 14201 nla_get_u16( 14202 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); 14203 connect.fils_erp_rrk = 14204 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 14205 connect.fils_erp_rrk_len = 14206 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 14207 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || 14208 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || 14209 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || 14210 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 14211 kfree_sensitive(connkeys); 14212 return -EINVAL; 14213 } 14214 14215 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) { 14216 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 14217 kfree_sensitive(connkeys); 14218 GENL_SET_ERR_MSG(info, 14219 "external auth requires connection ownership"); 14220 return -EINVAL; 14221 } 14222 connect.flags |= CONNECT_REQ_EXTERNAL_AUTH_SUPPORT; 14223 } 14224 14225 if (nla_get_flag(info->attrs[NL80211_ATTR_MLO_SUPPORT])) 14226 connect.flags |= CONNECT_REQ_MLO_SUPPORT; 14227 14228 err = cfg80211_connect(rdev, dev, &connect, connkeys, 14229 connect.prev_bssid); 14230 if (err) 14231 kfree_sensitive(connkeys); 14232 14233 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 14234 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 14235 if (connect.bssid) 14236 memcpy(dev->ieee80211_ptr->disconnect_bssid, 14237 connect.bssid, ETH_ALEN); 14238 else 14239 eth_zero_addr(dev->ieee80211_ptr->disconnect_bssid); 14240 } 14241 14242 return err; 14243 } 14244 14245 static int nl80211_update_connect_params(struct sk_buff *skb, 14246 struct genl_info *info) 14247 { 14248 struct cfg80211_connect_params connect = {}; 14249 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14250 struct net_device *dev = info->user_ptr[1]; 14251 struct wireless_dev *wdev = dev->ieee80211_ptr; 14252 bool fils_sk_offload; 14253 u32 auth_type; 14254 u32 changed = 0; 14255 14256 if (!rdev->ops->update_connect_params) 14257 return -EOPNOTSUPP; 14258 14259 if (info->attrs[NL80211_ATTR_IE]) { 14260 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 14261 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 14262 changed |= UPDATE_ASSOC_IES; 14263 } 14264 14265 fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy, 14266 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD); 14267 14268 /* 14269 * when driver supports fils-sk offload all attributes must be 14270 * provided. So the else covers "fils-sk-not-all" and 14271 * "no-fils-sk-any". 14272 */ 14273 if (fils_sk_offload && 14274 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && 14275 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && 14276 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && 14277 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 14278 connect.fils_erp_username = 14279 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 14280 connect.fils_erp_username_len = 14281 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 14282 connect.fils_erp_realm = 14283 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 14284 connect.fils_erp_realm_len = 14285 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 14286 connect.fils_erp_next_seq_num = 14287 nla_get_u16( 14288 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); 14289 connect.fils_erp_rrk = 14290 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 14291 connect.fils_erp_rrk_len = 14292 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 14293 changed |= UPDATE_FILS_ERP_INFO; 14294 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || 14295 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || 14296 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || 14297 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 14298 return -EINVAL; 14299 } 14300 14301 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 14302 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 14303 if (!nl80211_valid_auth_type(rdev, auth_type, 14304 NL80211_CMD_CONNECT)) 14305 return -EINVAL; 14306 14307 if (auth_type == NL80211_AUTHTYPE_FILS_SK && 14308 fils_sk_offload && !(changed & UPDATE_FILS_ERP_INFO)) 14309 return -EINVAL; 14310 14311 connect.auth_type = auth_type; 14312 changed |= UPDATE_AUTH_TYPE; 14313 } 14314 14315 if (!wdev->connected) 14316 return -ENOLINK; 14317 14318 return rdev_update_connect_params(rdev, dev, &connect, changed); 14319 } 14320 14321 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info) 14322 { 14323 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14324 struct net_device *dev = info->user_ptr[1]; 14325 u16 reason; 14326 14327 if (dev->ieee80211_ptr->conn_owner_nlportid && 14328 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 14329 return -EPERM; 14330 14331 reason = nla_get_u16_default(info->attrs[NL80211_ATTR_REASON_CODE], 14332 WLAN_REASON_DEAUTH_LEAVING); 14333 14334 if (reason == 0) 14335 return -EINVAL; 14336 14337 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14338 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 14339 return -EOPNOTSUPP; 14340 14341 return cfg80211_disconnect(rdev, dev, reason, true); 14342 } 14343 14344 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info) 14345 { 14346 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14347 struct net *net; 14348 int err; 14349 14350 if (info->attrs[NL80211_ATTR_PID]) { 14351 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); 14352 14353 net = get_net_ns_by_pid(pid); 14354 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) { 14355 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]); 14356 14357 net = get_net_ns_by_fd(fd); 14358 } else { 14359 return -EINVAL; 14360 } 14361 14362 if (IS_ERR(net)) 14363 return PTR_ERR(net); 14364 14365 /* 14366 * The caller already has CAP_NET_ADMIN over the source netns 14367 * (enforced by GENL_UNS_ADMIN_PERM on the genl op). Mirror the 14368 * convention used by net/core/rtnetlink.c::rtnl_get_net_ns_capable() 14369 * and require CAP_NET_ADMIN over the target netns as well, so that 14370 * a caller that is privileged in their own user namespace cannot 14371 * push a wiphy into a netns where they have no privilege. 14372 */ 14373 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) { 14374 put_net(net); 14375 return -EPERM; 14376 } 14377 14378 err = 0; 14379 14380 /* check if anything to do */ 14381 if (!net_eq(wiphy_net(&rdev->wiphy), net)) 14382 err = cfg80211_switch_netns(rdev, net); 14383 14384 put_net(net); 14385 return err; 14386 } 14387 14388 static int nl80211_set_pmksa(struct sk_buff *skb, struct genl_info *info) 14389 { 14390 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14391 struct net_device *dev = info->user_ptr[1]; 14392 struct cfg80211_pmksa pmksa; 14393 bool ap_pmksa_caching_support = false; 14394 14395 memset(&pmksa, 0, sizeof(struct cfg80211_pmksa)); 14396 14397 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, 14398 NL80211_EXT_FEATURE_AP_PMKSA_CACHING); 14399 14400 if (!info->attrs[NL80211_ATTR_PMKID]) 14401 return -EINVAL; 14402 14403 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 14404 14405 if (info->attrs[NL80211_ATTR_MAC]) { 14406 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 14407 } else if (info->attrs[NL80211_ATTR_SSID] && 14408 info->attrs[NL80211_ATTR_FILS_CACHE_ID] && 14409 info->attrs[NL80211_ATTR_PMK]) { 14410 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 14411 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 14412 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); 14413 } else { 14414 return -EINVAL; 14415 } 14416 14417 if (info->attrs[NL80211_ATTR_PMK]) { 14418 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); 14419 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); 14420 } 14421 14422 if (info->attrs[NL80211_ATTR_PMK_LIFETIME]) 14423 pmksa.pmk_lifetime = 14424 nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]); 14425 14426 if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]) 14427 pmksa.pmk_reauth_threshold = 14428 nla_get_u8(info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]); 14429 14430 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14431 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && 14432 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || 14433 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && 14434 ap_pmksa_caching_support)) 14435 return -EOPNOTSUPP; 14436 14437 if (!rdev->ops->set_pmksa) 14438 return -EOPNOTSUPP; 14439 14440 return rdev_set_pmksa(rdev, dev, &pmksa); 14441 } 14442 14443 static int nl80211_del_pmksa(struct sk_buff *skb, struct genl_info *info) 14444 { 14445 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14446 struct net_device *dev = info->user_ptr[1]; 14447 struct cfg80211_pmksa pmksa; 14448 bool sae_offload_support = false; 14449 bool owe_offload_support = false; 14450 bool ap_pmksa_caching_support = false; 14451 14452 memset(&pmksa, 0, sizeof(struct cfg80211_pmksa)); 14453 14454 sae_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, 14455 NL80211_EXT_FEATURE_SAE_OFFLOAD); 14456 owe_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, 14457 NL80211_EXT_FEATURE_OWE_OFFLOAD); 14458 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, 14459 NL80211_EXT_FEATURE_AP_PMKSA_CACHING); 14460 14461 if (info->attrs[NL80211_ATTR_PMKID]) 14462 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 14463 14464 if (info->attrs[NL80211_ATTR_MAC]) { 14465 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 14466 } else if (info->attrs[NL80211_ATTR_SSID]) { 14467 /* SSID based pmksa flush supported only for FILS, 14468 * OWE/SAE OFFLOAD cases 14469 */ 14470 if (info->attrs[NL80211_ATTR_FILS_CACHE_ID] && 14471 info->attrs[NL80211_ATTR_PMK]) { 14472 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); 14473 } else if (!sae_offload_support && !owe_offload_support) { 14474 return -EINVAL; 14475 } 14476 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 14477 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 14478 } else { 14479 return -EINVAL; 14480 } 14481 14482 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14483 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && 14484 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || 14485 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && 14486 ap_pmksa_caching_support)) 14487 return -EOPNOTSUPP; 14488 14489 if (!rdev->ops->del_pmksa) 14490 return -EOPNOTSUPP; 14491 14492 return rdev_del_pmksa(rdev, dev, &pmksa); 14493 } 14494 14495 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info) 14496 { 14497 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14498 struct net_device *dev = info->user_ptr[1]; 14499 14500 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14501 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 14502 return -EOPNOTSUPP; 14503 14504 if (!rdev->ops->flush_pmksa) 14505 return -EOPNOTSUPP; 14506 14507 return rdev_flush_pmksa(rdev, dev); 14508 } 14509 14510 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info) 14511 { 14512 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14513 struct net_device *dev = info->user_ptr[1]; 14514 u8 action_code, dialog_token; 14515 u32 peer_capability = 0; 14516 u16 status_code; 14517 u8 *peer; 14518 int link_id; 14519 bool initiator; 14520 14521 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 14522 !rdev->ops->tdls_mgmt) 14523 return -EOPNOTSUPP; 14524 14525 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || 14526 !info->attrs[NL80211_ATTR_STATUS_CODE] || 14527 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || 14528 !info->attrs[NL80211_ATTR_IE] || 14529 !info->attrs[NL80211_ATTR_MAC]) 14530 return -EINVAL; 14531 14532 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 14533 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); 14534 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 14535 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); 14536 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]); 14537 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]) 14538 peer_capability = 14539 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]); 14540 link_id = nl80211_link_id_or_invalid(info->attrs); 14541 14542 return rdev_tdls_mgmt(rdev, dev, peer, link_id, action_code, 14543 dialog_token, status_code, peer_capability, 14544 initiator, 14545 nla_data(info->attrs[NL80211_ATTR_IE]), 14546 nla_len(info->attrs[NL80211_ATTR_IE])); 14547 } 14548 14549 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info) 14550 { 14551 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14552 struct net_device *dev = info->user_ptr[1]; 14553 enum nl80211_tdls_operation operation; 14554 u8 *peer; 14555 14556 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 14557 !rdev->ops->tdls_oper) 14558 return -EOPNOTSUPP; 14559 14560 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || 14561 !info->attrs[NL80211_ATTR_MAC]) 14562 return -EINVAL; 14563 14564 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); 14565 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 14566 14567 return rdev_tdls_oper(rdev, dev, peer, operation); 14568 } 14569 14570 static int nl80211_remain_on_channel(struct sk_buff *skb, 14571 struct genl_info *info) 14572 { 14573 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14574 unsigned int link_id = nl80211_link_id(info->attrs); 14575 struct wireless_dev *wdev = info->user_ptr[1]; 14576 struct cfg80211_chan_def chandef; 14577 const u8 *rx_addr = NULL; 14578 struct sk_buff *msg; 14579 void *hdr; 14580 u64 cookie; 14581 u32 duration; 14582 int err; 14583 14584 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 14585 !info->attrs[NL80211_ATTR_DURATION]) 14586 return -EINVAL; 14587 14588 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 14589 14590 if (info->attrs[NL80211_ATTR_MAC]) 14591 rx_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 14592 14593 if (rx_addr && 14594 !wiphy_ext_feature_isset(wdev->wiphy, 14595 NL80211_EXT_FEATURE_ROC_ADDR_FILTER)) 14596 return -EOPNOTSUPP; 14597 14598 if (!rdev->ops->remain_on_channel || 14599 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) 14600 return -EOPNOTSUPP; 14601 14602 /* 14603 * We should be on that channel for at least a minimum amount of 14604 * time (10ms) but no longer than the driver supports. 14605 */ 14606 if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 14607 duration > rdev->wiphy.max_remain_on_channel_duration) 14608 return -EINVAL; 14609 14610 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef, 14611 false); 14612 if (err) 14613 return err; 14614 14615 if (!cfg80211_off_channel_oper_allowed(wdev, chandef.chan)) { 14616 const struct cfg80211_chan_def *oper_chandef, *compat_chandef; 14617 14618 oper_chandef = wdev_chandef(wdev, link_id); 14619 14620 if (WARN_ON(!oper_chandef)) { 14621 /* cannot happen since we must beacon to get here */ 14622 WARN_ON(1); 14623 return -EBUSY; 14624 } 14625 14626 /* note: returns first one if identical chandefs */ 14627 compat_chandef = cfg80211_chandef_compatible(&chandef, 14628 oper_chandef); 14629 14630 if (compat_chandef != &chandef) 14631 return -EBUSY; 14632 } 14633 14634 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14635 if (!msg) 14636 return -ENOMEM; 14637 14638 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 14639 NL80211_CMD_REMAIN_ON_CHANNEL); 14640 if (!hdr) { 14641 err = -ENOBUFS; 14642 goto free_msg; 14643 } 14644 14645 cookie = cfg80211_assign_cookie(rdev); 14646 err = rdev_remain_on_channel(rdev, wdev, chandef.chan, 14647 duration, cookie, rx_addr); 14648 14649 if (err) 14650 goto free_msg; 14651 14652 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 14653 NL80211_ATTR_PAD)) 14654 goto nla_put_failure; 14655 14656 genlmsg_end(msg, hdr); 14657 14658 return genlmsg_reply(msg, info); 14659 14660 nla_put_failure: 14661 err = -ENOBUFS; 14662 free_msg: 14663 nlmsg_free(msg); 14664 return err; 14665 } 14666 14667 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb, 14668 struct genl_info *info) 14669 { 14670 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14671 struct wireless_dev *wdev = info->user_ptr[1]; 14672 u64 cookie; 14673 14674 if (!info->attrs[NL80211_ATTR_COOKIE]) 14675 return -EINVAL; 14676 14677 if (!rdev->ops->cancel_remain_on_channel) 14678 return -EOPNOTSUPP; 14679 14680 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 14681 14682 return rdev_cancel_remain_on_channel(rdev, wdev, cookie); 14683 } 14684 14685 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb, 14686 struct genl_info *info) 14687 { 14688 struct cfg80211_bitrate_mask mask; 14689 unsigned int link_id = nl80211_link_id(info->attrs); 14690 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14691 struct net_device *dev = info->user_ptr[1]; 14692 int err; 14693 14694 if (!rdev->ops->set_bitrate_mask) 14695 return -EOPNOTSUPP; 14696 14697 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, 14698 NL80211_ATTR_TX_RATES, &mask, 14699 dev, true, link_id); 14700 if (err) 14701 return err; 14702 14703 return rdev_set_bitrate_mask(rdev, dev, link_id, NULL, &mask); 14704 } 14705 14706 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info) 14707 { 14708 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14709 struct wireless_dev *wdev = info->user_ptr[1]; 14710 u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION; 14711 14712 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) 14713 return -EINVAL; 14714 14715 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) 14716 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); 14717 14718 switch (wdev->iftype) { 14719 case NL80211_IFTYPE_STATION: 14720 case NL80211_IFTYPE_ADHOC: 14721 case NL80211_IFTYPE_P2P_CLIENT: 14722 case NL80211_IFTYPE_AP: 14723 case NL80211_IFTYPE_AP_VLAN: 14724 case NL80211_IFTYPE_MESH_POINT: 14725 case NL80211_IFTYPE_P2P_GO: 14726 case NL80211_IFTYPE_P2P_DEVICE: 14727 break; 14728 case NL80211_IFTYPE_NAN: 14729 case NL80211_IFTYPE_NAN_DATA: 14730 if (!wiphy_ext_feature_isset(wdev->wiphy, 14731 NL80211_EXT_FEATURE_SECURE_NAN) && 14732 !(wdev->wiphy->nan_capa.flags & 14733 WIPHY_NAN_FLAGS_USERSPACE_DE)) 14734 return -EOPNOTSUPP; 14735 break; 14736 case NL80211_IFTYPE_PD: 14737 if (!wiphy_ext_feature_isset(wdev->wiphy, 14738 NL80211_EXT_FEATURE_SECURE_RTT)) 14739 return -EOPNOTSUPP; 14740 break; 14741 default: 14742 return -EOPNOTSUPP; 14743 } 14744 14745 /* not much point in registering if we can't reply */ 14746 if (!rdev->ops->mgmt_tx) 14747 return -EOPNOTSUPP; 14748 14749 if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] && 14750 !wiphy_ext_feature_isset(&rdev->wiphy, 14751 NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS)) { 14752 GENL_SET_ERR_MSG(info, 14753 "multicast RX registrations are not supported"); 14754 return -EOPNOTSUPP; 14755 } 14756 14757 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, 14758 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), 14759 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]), 14760 info->attrs[NL80211_ATTR_RECEIVE_MULTICAST], 14761 info->extack); 14762 } 14763 14764 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info) 14765 { 14766 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14767 struct wireless_dev *wdev = info->user_ptr[1]; 14768 struct cfg80211_chan_def chandef; 14769 int err; 14770 void *hdr = NULL; 14771 u64 cookie; 14772 struct sk_buff *msg = NULL; 14773 struct cfg80211_mgmt_tx_params params = { 14774 .dont_wait_for_ack = 14775 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], 14776 }; 14777 14778 if (!info->attrs[NL80211_ATTR_FRAME]) 14779 return -EINVAL; 14780 14781 if (!rdev->ops->mgmt_tx) 14782 return -EOPNOTSUPP; 14783 14784 switch (wdev->iftype) { 14785 case NL80211_IFTYPE_P2P_DEVICE: 14786 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 14787 return -EINVAL; 14788 break; 14789 case NL80211_IFTYPE_STATION: 14790 case NL80211_IFTYPE_ADHOC: 14791 case NL80211_IFTYPE_P2P_CLIENT: 14792 case NL80211_IFTYPE_AP: 14793 case NL80211_IFTYPE_AP_VLAN: 14794 case NL80211_IFTYPE_MESH_POINT: 14795 case NL80211_IFTYPE_P2P_GO: 14796 break; 14797 case NL80211_IFTYPE_NAN: 14798 case NL80211_IFTYPE_NAN_DATA: 14799 if (!wiphy_ext_feature_isset(wdev->wiphy, 14800 NL80211_EXT_FEATURE_SECURE_NAN) && 14801 !(wdev->wiphy->nan_capa.flags & 14802 WIPHY_NAN_FLAGS_USERSPACE_DE)) 14803 return -EOPNOTSUPP; 14804 break; 14805 case NL80211_IFTYPE_PD: 14806 if (!wiphy_ext_feature_isset(wdev->wiphy, 14807 NL80211_EXT_FEATURE_SECURE_RTT)) 14808 return -EOPNOTSUPP; 14809 break; 14810 default: 14811 return -EOPNOTSUPP; 14812 } 14813 14814 if (info->attrs[NL80211_ATTR_DURATION]) { 14815 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 14816 return -EINVAL; 14817 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 14818 14819 /* 14820 * We should wait on the channel for at least a minimum amount 14821 * of time (10ms) but no longer than the driver supports. 14822 */ 14823 if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 14824 params.wait > rdev->wiphy.max_remain_on_channel_duration) 14825 return -EINVAL; 14826 } 14827 14828 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; 14829 14830 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 14831 return -EINVAL; 14832 14833 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 14834 14835 /* get the channel if any has been specified, otherwise pass NULL to 14836 * the driver. The latter will use the current one 14837 */ 14838 chandef.chan = NULL; 14839 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 14840 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 14841 &chandef, false); 14842 if (err) 14843 return err; 14844 } 14845 14846 if (!chandef.chan && params.offchan) 14847 return -EINVAL; 14848 14849 if (params.offchan && 14850 !cfg80211_off_channel_oper_allowed(wdev, chandef.chan)) 14851 return -EBUSY; 14852 14853 params.link_id = nl80211_link_id_or_invalid(info->attrs); 14854 /* 14855 * This now races due to the unlock, but we cannot check 14856 * the valid links for the _station_ anyway, so that's up 14857 * to the driver. 14858 */ 14859 if (params.link_id >= 0 && 14860 !(wdev->valid_links & BIT(params.link_id))) 14861 return -EINVAL; 14862 14863 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 14864 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 14865 14866 err = nl80211_parse_counter_offsets(rdev, NULL, params.len, -1, 14867 info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX], 14868 ¶ms.csa_offsets, 14869 ¶ms.n_csa_offsets); 14870 if (err) 14871 return err; 14872 14873 if (!params.dont_wait_for_ack) { 14874 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14875 if (!msg) 14876 return -ENOMEM; 14877 14878 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 14879 NL80211_CMD_FRAME); 14880 if (!hdr) { 14881 err = -ENOBUFS; 14882 goto free_msg; 14883 } 14884 } 14885 14886 params.chan = chandef.chan; 14887 cookie = cfg80211_assign_cookie(rdev); 14888 err = cfg80211_mlme_mgmt_tx(rdev, wdev, ¶ms, cookie); 14889 if (err) 14890 goto free_msg; 14891 14892 if (msg) { 14893 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 14894 NL80211_ATTR_PAD)) 14895 goto nla_put_failure; 14896 14897 genlmsg_end(msg, hdr); 14898 return genlmsg_reply(msg, info); 14899 } 14900 14901 return 0; 14902 14903 nla_put_failure: 14904 err = -ENOBUFS; 14905 free_msg: 14906 nlmsg_free(msg); 14907 return err; 14908 } 14909 14910 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info) 14911 { 14912 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14913 struct wireless_dev *wdev = info->user_ptr[1]; 14914 u64 cookie; 14915 14916 if (!info->attrs[NL80211_ATTR_COOKIE]) 14917 return -EINVAL; 14918 14919 if (!rdev->ops->mgmt_tx_cancel_wait) 14920 return -EOPNOTSUPP; 14921 14922 switch (wdev->iftype) { 14923 case NL80211_IFTYPE_STATION: 14924 case NL80211_IFTYPE_ADHOC: 14925 case NL80211_IFTYPE_P2P_CLIENT: 14926 case NL80211_IFTYPE_AP: 14927 case NL80211_IFTYPE_AP_VLAN: 14928 case NL80211_IFTYPE_P2P_GO: 14929 case NL80211_IFTYPE_P2P_DEVICE: 14930 break; 14931 case NL80211_IFTYPE_NAN: 14932 if (!wiphy_ext_feature_isset(wdev->wiphy, 14933 NL80211_EXT_FEATURE_SECURE_NAN)) 14934 return -EOPNOTSUPP; 14935 break; 14936 case NL80211_IFTYPE_PD: 14937 if (!wiphy_ext_feature_isset(wdev->wiphy, 14938 NL80211_EXT_FEATURE_SECURE_RTT)) 14939 return -EOPNOTSUPP; 14940 break; 14941 default: 14942 return -EOPNOTSUPP; 14943 } 14944 14945 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 14946 14947 return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie); 14948 } 14949 14950 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info) 14951 { 14952 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14953 struct wireless_dev *wdev; 14954 struct net_device *dev = info->user_ptr[1]; 14955 u8 ps_state; 14956 bool state; 14957 int err; 14958 14959 if (!info->attrs[NL80211_ATTR_PS_STATE]) 14960 return -EINVAL; 14961 14962 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); 14963 14964 wdev = dev->ieee80211_ptr; 14965 14966 if (!rdev->ops->set_power_mgmt) 14967 return -EOPNOTSUPP; 14968 14969 state = (ps_state == NL80211_PS_ENABLED) ? true : false; 14970 14971 if (state == wdev->ps) 14972 return 0; 14973 14974 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); 14975 if (!err) 14976 wdev->ps = state; 14977 return err; 14978 } 14979 14980 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info) 14981 { 14982 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14983 enum nl80211_ps_state ps_state; 14984 struct wireless_dev *wdev; 14985 struct net_device *dev = info->user_ptr[1]; 14986 struct sk_buff *msg; 14987 void *hdr; 14988 int err; 14989 14990 wdev = dev->ieee80211_ptr; 14991 14992 if (!rdev->ops->set_power_mgmt) 14993 return -EOPNOTSUPP; 14994 14995 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14996 if (!msg) 14997 return -ENOMEM; 14998 14999 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 15000 NL80211_CMD_GET_POWER_SAVE); 15001 if (!hdr) { 15002 err = -ENOBUFS; 15003 goto free_msg; 15004 } 15005 15006 if (wdev->ps) 15007 ps_state = NL80211_PS_ENABLED; 15008 else 15009 ps_state = NL80211_PS_DISABLED; 15010 15011 if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state)) 15012 goto nla_put_failure; 15013 15014 genlmsg_end(msg, hdr); 15015 return genlmsg_reply(msg, info); 15016 15017 nla_put_failure: 15018 err = -ENOBUFS; 15019 free_msg: 15020 nlmsg_free(msg); 15021 return err; 15022 } 15023 15024 static const struct nla_policy 15025 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = { 15026 [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_BINARY }, 15027 [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 }, 15028 [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 }, 15029 [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 }, 15030 [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 }, 15031 [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 }, 15032 [NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_S32 }, 15033 }; 15034 15035 static int nl80211_set_cqm_txe(struct genl_info *info, 15036 u32 rate, u32 pkts, u32 intvl) 15037 { 15038 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15039 struct net_device *dev = info->user_ptr[1]; 15040 struct wireless_dev *wdev = dev->ieee80211_ptr; 15041 15042 if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL) 15043 return -EINVAL; 15044 15045 if (!rdev->ops->set_cqm_txe_config) 15046 return -EOPNOTSUPP; 15047 15048 if (wdev->iftype != NL80211_IFTYPE_STATION && 15049 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 15050 return -EOPNOTSUPP; 15051 15052 return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl); 15053 } 15054 15055 static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev, 15056 struct net_device *dev, 15057 struct cfg80211_cqm_config *cqm_config) 15058 { 15059 struct wireless_dev *wdev = dev->ieee80211_ptr; 15060 s32 last, low, high; 15061 u32 hyst; 15062 int i, n, low_index; 15063 int err; 15064 15065 /* 15066 * Obtain current RSSI value if possible, if not and no RSSI threshold 15067 * event has been received yet, we should receive an event after a 15068 * connection is established and enough beacons received to calculate 15069 * the average. 15070 */ 15071 if (!cqm_config->last_rssi_event_value && 15072 wdev->links[0].client.current_bss && 15073 rdev->ops->get_station) { 15074 struct station_info sinfo = {}; 15075 u8 *mac_addr; 15076 15077 mac_addr = wdev->links[0].client.current_bss->pub.bssid; 15078 15079 err = rdev_get_station(rdev, wdev, mac_addr, &sinfo); 15080 if (err) 15081 return err; 15082 15083 cfg80211_sinfo_release_content(&sinfo); 15084 if (sinfo.filled & BIT_ULL(NL80211_STA_INFO_BEACON_SIGNAL_AVG)) 15085 cqm_config->last_rssi_event_value = 15086 (s8) sinfo.rx_beacon_signal_avg; 15087 } 15088 15089 last = cqm_config->last_rssi_event_value; 15090 hyst = cqm_config->rssi_hyst; 15091 n = cqm_config->n_rssi_thresholds; 15092 15093 for (i = 0; i < n; i++) { 15094 i = array_index_nospec(i, n); 15095 if (last < cqm_config->rssi_thresholds[i]) 15096 break; 15097 } 15098 15099 low_index = i - 1; 15100 if (low_index >= 0) { 15101 low_index = array_index_nospec(low_index, n); 15102 low = cqm_config->rssi_thresholds[low_index] - hyst; 15103 } else { 15104 low = S32_MIN; 15105 } 15106 if (i < n) { 15107 i = array_index_nospec(i, n); 15108 high = cqm_config->rssi_thresholds[i] + hyst - 1; 15109 } else { 15110 high = S32_MAX; 15111 } 15112 15113 return rdev_set_cqm_rssi_range_config(rdev, dev, low, high); 15114 } 15115 15116 static int nl80211_set_cqm_rssi(struct genl_info *info, 15117 const s32 *thresholds, int n_thresholds, 15118 u32 hysteresis) 15119 { 15120 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15121 struct cfg80211_cqm_config *cqm_config = NULL, *old; 15122 struct net_device *dev = info->user_ptr[1]; 15123 struct wireless_dev *wdev = dev->ieee80211_ptr; 15124 s32 prev = S32_MIN; 15125 int i, err; 15126 15127 /* Check all values negative and sorted */ 15128 for (i = 0; i < n_thresholds; i++) { 15129 if (thresholds[i] > 0 || thresholds[i] <= prev) 15130 return -EINVAL; 15131 15132 prev = thresholds[i]; 15133 } 15134 15135 if (wdev->iftype != NL80211_IFTYPE_STATION && 15136 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 15137 return -EOPNOTSUPP; 15138 15139 if (n_thresholds == 1 && thresholds[0] == 0) /* Disabling */ 15140 n_thresholds = 0; 15141 15142 old = wiphy_dereference(wdev->wiphy, wdev->cqm_config); 15143 15144 /* if already disabled just succeed */ 15145 if (!n_thresholds && !old) 15146 return 0; 15147 15148 if (n_thresholds > 1) { 15149 if (!wiphy_ext_feature_isset(&rdev->wiphy, 15150 NL80211_EXT_FEATURE_CQM_RSSI_LIST) || 15151 !rdev->ops->set_cqm_rssi_range_config) 15152 return -EOPNOTSUPP; 15153 } else { 15154 if (!rdev->ops->set_cqm_rssi_config) 15155 return -EOPNOTSUPP; 15156 } 15157 15158 if (n_thresholds) { 15159 cqm_config = kzalloc_flex(*cqm_config, rssi_thresholds, 15160 n_thresholds); 15161 if (!cqm_config) 15162 return -ENOMEM; 15163 15164 cqm_config->rssi_hyst = hysteresis; 15165 cqm_config->n_rssi_thresholds = n_thresholds; 15166 memcpy(cqm_config->rssi_thresholds, thresholds, 15167 flex_array_size(cqm_config, rssi_thresholds, 15168 n_thresholds)); 15169 cqm_config->use_range_api = n_thresholds > 1 || 15170 !rdev->ops->set_cqm_rssi_config; 15171 15172 rcu_assign_pointer(wdev->cqm_config, cqm_config); 15173 15174 if (cqm_config->use_range_api) 15175 err = cfg80211_cqm_rssi_update(rdev, dev, cqm_config); 15176 else 15177 err = rdev_set_cqm_rssi_config(rdev, dev, 15178 thresholds[0], 15179 hysteresis); 15180 } else { 15181 RCU_INIT_POINTER(wdev->cqm_config, NULL); 15182 /* if enabled as range also disable via range */ 15183 if (old->use_range_api) 15184 err = rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0); 15185 else 15186 err = rdev_set_cqm_rssi_config(rdev, dev, 0, 0); 15187 } 15188 15189 if (err) { 15190 rcu_assign_pointer(wdev->cqm_config, old); 15191 kfree_rcu(cqm_config, rcu_head); 15192 } else { 15193 kfree_rcu(old, rcu_head); 15194 } 15195 15196 return err; 15197 } 15198 15199 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info) 15200 { 15201 struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1]; 15202 struct nlattr *cqm; 15203 int err; 15204 15205 cqm = info->attrs[NL80211_ATTR_CQM]; 15206 if (!cqm) 15207 return -EINVAL; 15208 15209 err = nla_parse_nested_deprecated(attrs, NL80211_ATTR_CQM_MAX, cqm, 15210 nl80211_attr_cqm_policy, 15211 info->extack); 15212 if (err) 15213 return err; 15214 15215 if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] && 15216 attrs[NL80211_ATTR_CQM_RSSI_HYST]) { 15217 const s32 *thresholds = 15218 nla_data(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 15219 int len = nla_len(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 15220 u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]); 15221 15222 if (len % 4) 15223 return -EINVAL; 15224 15225 return nl80211_set_cqm_rssi(info, thresholds, len / 4, 15226 hysteresis); 15227 } 15228 15229 if (attrs[NL80211_ATTR_CQM_TXE_RATE] && 15230 attrs[NL80211_ATTR_CQM_TXE_PKTS] && 15231 attrs[NL80211_ATTR_CQM_TXE_INTVL]) { 15232 u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]); 15233 u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]); 15234 u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]); 15235 15236 return nl80211_set_cqm_txe(info, rate, pkts, intvl); 15237 } 15238 15239 return -EINVAL; 15240 } 15241 15242 static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info) 15243 { 15244 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15245 struct net_device *dev = info->user_ptr[1]; 15246 struct ocb_setup setup = {}; 15247 int err; 15248 15249 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 15250 &setup.chandef, false); 15251 if (err) 15252 return err; 15253 15254 return cfg80211_join_ocb(rdev, dev, &setup); 15255 } 15256 15257 static int nl80211_leave_ocb(struct sk_buff *skb, struct genl_info *info) 15258 { 15259 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15260 struct net_device *dev = info->user_ptr[1]; 15261 15262 return cfg80211_leave_ocb(rdev, dev); 15263 } 15264 15265 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info) 15266 { 15267 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15268 struct net_device *dev = info->user_ptr[1]; 15269 struct mesh_config cfg; 15270 struct mesh_setup setup; 15271 int err; 15272 15273 /* start with default */ 15274 memcpy(&cfg, &default_mesh_config, sizeof(cfg)); 15275 memcpy(&setup, &default_mesh_setup, sizeof(setup)); 15276 15277 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { 15278 /* and parse parameters if given */ 15279 err = nl80211_parse_mesh_config(info, &cfg, NULL); 15280 if (err) 15281 return err; 15282 } 15283 15284 if (!info->attrs[NL80211_ATTR_MESH_ID] || 15285 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) 15286 return -EINVAL; 15287 15288 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); 15289 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 15290 15291 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 15292 !nl80211_parse_mcast_rate(rdev, setup.mcast_rate, 15293 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 15294 return -EINVAL; 15295 15296 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { 15297 setup.beacon_interval = 15298 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 15299 15300 err = cfg80211_validate_beacon_int(rdev, 15301 NL80211_IFTYPE_MESH_POINT, 15302 setup.beacon_interval); 15303 if (err) 15304 return err; 15305 } 15306 15307 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { 15308 setup.dtim_period = 15309 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 15310 if (setup.dtim_period < 1 || setup.dtim_period > 100) 15311 return -EINVAL; 15312 } 15313 15314 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { 15315 /* parse additional setup parameters if given */ 15316 err = nl80211_parse_mesh_setup(info, &setup); 15317 if (err) 15318 return err; 15319 } 15320 15321 if (setup.user_mpm) 15322 cfg.auto_open_plinks = false; 15323 15324 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 15325 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 15326 &setup.chandef, false); 15327 if (err) 15328 return err; 15329 } else { 15330 /* __cfg80211_join_mesh() will sort it out */ 15331 setup.chandef.chan = NULL; 15332 } 15333 15334 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 15335 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 15336 int n_rates = 15337 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 15338 struct ieee80211_supported_band *sband; 15339 15340 if (!setup.chandef.chan) 15341 return -EINVAL; 15342 15343 sband = rdev->wiphy.bands[setup.chandef.chan->band]; 15344 15345 err = ieee80211_get_ratemask(sband, rates, n_rates, 15346 &setup.basic_rates); 15347 if (err) 15348 return err; 15349 } 15350 15351 if (info->attrs[NL80211_ATTR_TX_RATES]) { 15352 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, 15353 NL80211_ATTR_TX_RATES, 15354 &setup.beacon_rate, 15355 dev, false, 0); 15356 if (err) 15357 return err; 15358 15359 if (!setup.chandef.chan) 15360 return -EINVAL; 15361 15362 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band, 15363 &setup.beacon_rate); 15364 if (err) 15365 return err; 15366 } 15367 15368 setup.userspace_handles_dfs = 15369 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 15370 15371 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 15372 int r = validate_pae_over_nl80211(rdev, info); 15373 15374 if (r < 0) 15375 return r; 15376 15377 setup.control_port_over_nl80211 = true; 15378 } 15379 15380 err = __cfg80211_join_mesh(rdev, dev, &setup, &cfg); 15381 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) 15382 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 15383 15384 return err; 15385 } 15386 15387 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info) 15388 { 15389 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15390 struct net_device *dev = info->user_ptr[1]; 15391 15392 return cfg80211_leave_mesh(rdev, dev); 15393 } 15394 15395 #ifdef CONFIG_PM 15396 static int nl80211_send_wowlan_patterns(struct sk_buff *msg, 15397 struct cfg80211_registered_device *rdev) 15398 { 15399 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; 15400 struct nlattr *nl_pats, *nl_pat; 15401 int i, pat_len; 15402 15403 if (!wowlan->n_patterns) 15404 return 0; 15405 15406 nl_pats = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN); 15407 if (!nl_pats) 15408 return -ENOBUFS; 15409 15410 for (i = 0; i < wowlan->n_patterns; i++) { 15411 nl_pat = nla_nest_start_noflag(msg, i + 1); 15412 if (!nl_pat) 15413 return -ENOBUFS; 15414 pat_len = wowlan->patterns[i].pattern_len; 15415 if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8), 15416 wowlan->patterns[i].mask) || 15417 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 15418 wowlan->patterns[i].pattern) || 15419 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 15420 wowlan->patterns[i].pkt_offset)) 15421 return -ENOBUFS; 15422 nla_nest_end(msg, nl_pat); 15423 } 15424 nla_nest_end(msg, nl_pats); 15425 15426 return 0; 15427 } 15428 15429 static int nl80211_send_wowlan_tcp(struct sk_buff *msg, 15430 struct cfg80211_wowlan_tcp *tcp) 15431 { 15432 struct nlattr *nl_tcp; 15433 15434 if (!tcp) 15435 return 0; 15436 15437 nl_tcp = nla_nest_start_noflag(msg, 15438 NL80211_WOWLAN_TRIG_TCP_CONNECTION); 15439 if (!nl_tcp) 15440 return -ENOBUFS; 15441 15442 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || 15443 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || 15444 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || 15445 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || 15446 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || 15447 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 15448 tcp->payload_len, tcp->payload) || 15449 nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 15450 tcp->data_interval) || 15451 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 15452 tcp->wake_len, tcp->wake_data) || 15453 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK, 15454 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) 15455 return -ENOBUFS; 15456 15457 if (tcp->payload_seq.len && 15458 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ, 15459 sizeof(tcp->payload_seq), &tcp->payload_seq)) 15460 return -ENOBUFS; 15461 15462 if (tcp->payload_tok.len && 15463 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 15464 sizeof(tcp->payload_tok) + tcp->tokens_size, 15465 &tcp->payload_tok)) 15466 return -ENOBUFS; 15467 15468 nla_nest_end(msg, nl_tcp); 15469 15470 return 0; 15471 } 15472 15473 static int nl80211_send_wowlan_nd(struct sk_buff *msg, 15474 struct cfg80211_sched_scan_request *req) 15475 { 15476 struct nlattr *nd, *freqs, *matches, *match, *scan_plans, *scan_plan; 15477 int i; 15478 15479 if (!req) 15480 return 0; 15481 15482 nd = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_NET_DETECT); 15483 if (!nd) 15484 return -ENOBUFS; 15485 15486 if (req->n_scan_plans == 1 && 15487 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_INTERVAL, 15488 req->scan_plans[0].interval * 1000)) 15489 return -ENOBUFS; 15490 15491 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay)) 15492 return -ENOBUFS; 15493 15494 if (req->relative_rssi_set) { 15495 struct nl80211_bss_select_rssi_adjust rssi_adjust; 15496 15497 if (nla_put_s8(msg, NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI, 15498 req->relative_rssi)) 15499 return -ENOBUFS; 15500 15501 rssi_adjust.band = req->rssi_adjust.band; 15502 rssi_adjust.delta = req->rssi_adjust.delta; 15503 if (nla_put(msg, NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST, 15504 sizeof(rssi_adjust), &rssi_adjust)) 15505 return -ENOBUFS; 15506 } 15507 15508 freqs = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_FREQUENCIES); 15509 if (!freqs) 15510 return -ENOBUFS; 15511 15512 for (i = 0; i < req->n_channels; i++) { 15513 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) 15514 return -ENOBUFS; 15515 } 15516 15517 nla_nest_end(msg, freqs); 15518 15519 if (req->n_match_sets) { 15520 matches = nla_nest_start_noflag(msg, 15521 NL80211_ATTR_SCHED_SCAN_MATCH); 15522 if (!matches) 15523 return -ENOBUFS; 15524 15525 for (i = 0; i < req->n_match_sets; i++) { 15526 match = nla_nest_start_noflag(msg, i); 15527 if (!match) 15528 return -ENOBUFS; 15529 15530 if (nla_put(msg, NL80211_SCHED_SCAN_MATCH_ATTR_SSID, 15531 req->match_sets[i].ssid.ssid_len, 15532 req->match_sets[i].ssid.ssid)) 15533 return -ENOBUFS; 15534 nla_nest_end(msg, match); 15535 } 15536 nla_nest_end(msg, matches); 15537 } 15538 15539 scan_plans = nla_nest_start_noflag(msg, NL80211_ATTR_SCHED_SCAN_PLANS); 15540 if (!scan_plans) 15541 return -ENOBUFS; 15542 15543 for (i = 0; i < req->n_scan_plans; i++) { 15544 scan_plan = nla_nest_start_noflag(msg, i + 1); 15545 if (!scan_plan) 15546 return -ENOBUFS; 15547 15548 if (nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_INTERVAL, 15549 req->scan_plans[i].interval) || 15550 (req->scan_plans[i].iterations && 15551 nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_ITERATIONS, 15552 req->scan_plans[i].iterations))) 15553 return -ENOBUFS; 15554 nla_nest_end(msg, scan_plan); 15555 } 15556 nla_nest_end(msg, scan_plans); 15557 15558 nla_nest_end(msg, nd); 15559 15560 return 0; 15561 } 15562 15563 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info) 15564 { 15565 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15566 struct sk_buff *msg; 15567 void *hdr; 15568 u32 size = NLMSG_DEFAULT_SIZE; 15569 15570 if (!rdev->wiphy.wowlan) 15571 return -EOPNOTSUPP; 15572 15573 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { 15574 /* adjust size to have room for all the data */ 15575 size += rdev->wiphy.wowlan_config->tcp->tokens_size + 15576 rdev->wiphy.wowlan_config->tcp->payload_len + 15577 rdev->wiphy.wowlan_config->tcp->wake_len + 15578 rdev->wiphy.wowlan_config->tcp->wake_len / 8; 15579 } 15580 15581 msg = nlmsg_new(size, GFP_KERNEL); 15582 if (!msg) 15583 return -ENOMEM; 15584 15585 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 15586 NL80211_CMD_GET_WOWLAN); 15587 if (!hdr) 15588 goto nla_put_failure; 15589 15590 if (rdev->wiphy.wowlan_config) { 15591 struct nlattr *nl_wowlan; 15592 15593 nl_wowlan = nla_nest_start_noflag(msg, 15594 NL80211_ATTR_WOWLAN_TRIGGERS); 15595 if (!nl_wowlan) 15596 goto nla_put_failure; 15597 15598 if ((rdev->wiphy.wowlan_config->any && 15599 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 15600 (rdev->wiphy.wowlan_config->disconnect && 15601 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 15602 (rdev->wiphy.wowlan_config->magic_pkt && 15603 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 15604 (rdev->wiphy.wowlan_config->gtk_rekey_failure && 15605 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 15606 (rdev->wiphy.wowlan_config->eap_identity_req && 15607 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 15608 (rdev->wiphy.wowlan_config->four_way_handshake && 15609 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 15610 (rdev->wiphy.wowlan_config->rfkill_release && 15611 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 15612 goto nla_put_failure; 15613 15614 if (nl80211_send_wowlan_patterns(msg, rdev)) 15615 goto nla_put_failure; 15616 15617 if (nl80211_send_wowlan_tcp(msg, 15618 rdev->wiphy.wowlan_config->tcp)) 15619 goto nla_put_failure; 15620 15621 if (nl80211_send_wowlan_nd( 15622 msg, 15623 rdev->wiphy.wowlan_config->nd_config)) 15624 goto nla_put_failure; 15625 15626 nla_nest_end(msg, nl_wowlan); 15627 } 15628 15629 genlmsg_end(msg, hdr); 15630 return genlmsg_reply(msg, info); 15631 15632 nla_put_failure: 15633 nlmsg_free(msg); 15634 return -ENOBUFS; 15635 } 15636 15637 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev, 15638 struct nlattr *attr, 15639 struct cfg80211_wowlan *trig) 15640 { 15641 struct nlattr *tb[NUM_NL80211_WOWLAN_TCP]; 15642 struct cfg80211_wowlan_tcp *cfg; 15643 struct nl80211_wowlan_tcp_data_token *tok = NULL; 15644 struct nl80211_wowlan_tcp_data_seq *seq = NULL; 15645 u32 size; 15646 u32 data_size, wake_size, tokens_size = 0, wake_mask_size; 15647 int err, port; 15648 15649 if (!rdev->wiphy.wowlan->tcp) 15650 return -EINVAL; 15651 15652 err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TCP, attr, 15653 nl80211_wowlan_tcp_policy, NULL); 15654 if (err) 15655 return err; 15656 15657 if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] || 15658 !tb[NL80211_WOWLAN_TCP_DST_IPV4] || 15659 !tb[NL80211_WOWLAN_TCP_DST_MAC] || 15660 !tb[NL80211_WOWLAN_TCP_DST_PORT] || 15661 !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] || 15662 !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] || 15663 !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] || 15664 !tb[NL80211_WOWLAN_TCP_WAKE_MASK]) 15665 return -EINVAL; 15666 15667 data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]); 15668 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) 15669 return -EINVAL; 15670 15671 if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) > 15672 rdev->wiphy.wowlan->tcp->data_interval_max || 15673 nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0) 15674 return -EINVAL; 15675 15676 wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]); 15677 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) 15678 return -EINVAL; 15679 15680 wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]); 15681 if (wake_mask_size != DIV_ROUND_UP(wake_size, 8)) 15682 return -EINVAL; 15683 15684 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) { 15685 u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 15686 15687 tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 15688 tokens_size = tokln - sizeof(*tok); 15689 15690 if (!tok->len || tokens_size % tok->len) 15691 return -EINVAL; 15692 if (!rdev->wiphy.wowlan->tcp->tok) 15693 return -EINVAL; 15694 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) 15695 return -EINVAL; 15696 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) 15697 return -EINVAL; 15698 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) 15699 return -EINVAL; 15700 if (tok->offset + tok->len > data_size) 15701 return -EINVAL; 15702 } 15703 15704 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) { 15705 seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]); 15706 if (!rdev->wiphy.wowlan->tcp->seq) 15707 return -EINVAL; 15708 if (seq->len == 0 || seq->len > 4) 15709 return -EINVAL; 15710 if (seq->len + seq->offset > data_size) 15711 return -EINVAL; 15712 } 15713 15714 size = sizeof(*cfg); 15715 size += data_size; 15716 size += wake_size + wake_mask_size; 15717 size += tokens_size; 15718 15719 cfg = kzalloc(size, GFP_KERNEL); 15720 if (!cfg) 15721 return -ENOMEM; 15722 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); 15723 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]); 15724 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), 15725 ETH_ALEN); 15726 port = nla_get_u16_default(tb[NL80211_WOWLAN_TCP_SRC_PORT], 0); 15727 #ifdef CONFIG_INET 15728 /* allocate a socket and port for it and use it */ 15729 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, 15730 IPPROTO_TCP, &cfg->sock, 1); 15731 if (err) { 15732 kfree(cfg); 15733 return err; 15734 } 15735 if (inet_csk_get_port(cfg->sock->sk, port)) { 15736 sock_release(cfg->sock); 15737 kfree(cfg); 15738 return -EADDRINUSE; 15739 } 15740 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; 15741 #else 15742 if (!port) { 15743 kfree(cfg); 15744 return -EINVAL; 15745 } 15746 cfg->src_port = port; 15747 #endif 15748 15749 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); 15750 cfg->payload_len = data_size; 15751 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; 15752 memcpy((void *)cfg->payload, 15753 nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]), 15754 data_size); 15755 if (seq) 15756 cfg->payload_seq = *seq; 15757 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); 15758 cfg->wake_len = wake_size; 15759 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; 15760 memcpy((void *)cfg->wake_data, 15761 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]), 15762 wake_size); 15763 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + 15764 data_size + wake_size; 15765 memcpy((void *)cfg->wake_mask, 15766 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]), 15767 wake_mask_size); 15768 if (tok) { 15769 cfg->tokens_size = tokens_size; 15770 cfg->payload_tok = *tok; 15771 memcpy(cfg->payload_tok.token_stream, tok->token_stream, 15772 tokens_size); 15773 } 15774 15775 trig->tcp = cfg; 15776 15777 return 0; 15778 } 15779 15780 static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev, 15781 const struct wiphy_wowlan_support *wowlan, 15782 struct nlattr *attr, 15783 struct cfg80211_wowlan *trig) 15784 { 15785 struct nlattr **tb; 15786 int err; 15787 15788 tb = kzalloc_objs(*tb, NUM_NL80211_ATTR); 15789 if (!tb) 15790 return -ENOMEM; 15791 15792 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) { 15793 err = -EOPNOTSUPP; 15794 goto out; 15795 } 15796 15797 err = nla_parse_nested_deprecated(tb, NL80211_ATTR_MAX, attr, 15798 nl80211_policy, NULL); 15799 if (err) 15800 goto out; 15801 15802 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb, 15803 wowlan->max_nd_match_sets); 15804 err = PTR_ERR_OR_ZERO(trig->nd_config); 15805 if (err) 15806 trig->nd_config = NULL; 15807 15808 out: 15809 kfree(tb); 15810 return err; 15811 } 15812 15813 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info) 15814 { 15815 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15816 struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG]; 15817 struct cfg80211_wowlan new_triggers = {}; 15818 struct cfg80211_wowlan *ntrig; 15819 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; 15820 int err, i; 15821 bool prev_enabled = rdev->wiphy.wowlan_config; 15822 bool regular = false; 15823 15824 if (!wowlan) 15825 return -EOPNOTSUPP; 15826 15827 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { 15828 cfg80211_rdev_free_wowlan(rdev); 15829 rdev->wiphy.wowlan_config = NULL; 15830 goto set_wakeup; 15831 } 15832 15833 err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TRIG, 15834 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS], 15835 nl80211_wowlan_policy, info->extack); 15836 if (err) 15837 return err; 15838 15839 if (tb[NL80211_WOWLAN_TRIG_ANY]) { 15840 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) 15841 return -EINVAL; 15842 new_triggers.any = true; 15843 } 15844 15845 if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) { 15846 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) 15847 return -EINVAL; 15848 new_triggers.disconnect = true; 15849 regular = true; 15850 } 15851 15852 if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) { 15853 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) 15854 return -EINVAL; 15855 new_triggers.magic_pkt = true; 15856 regular = true; 15857 } 15858 15859 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED]) 15860 return -EINVAL; 15861 15862 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) { 15863 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) 15864 return -EINVAL; 15865 new_triggers.gtk_rekey_failure = true; 15866 regular = true; 15867 } 15868 15869 if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) { 15870 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) 15871 return -EINVAL; 15872 new_triggers.eap_identity_req = true; 15873 regular = true; 15874 } 15875 15876 if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) { 15877 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) 15878 return -EINVAL; 15879 new_triggers.four_way_handshake = true; 15880 regular = true; 15881 } 15882 15883 if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) { 15884 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) 15885 return -EINVAL; 15886 new_triggers.rfkill_release = true; 15887 regular = true; 15888 } 15889 15890 if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) { 15891 struct nlattr *pat; 15892 int n_patterns = 0; 15893 int rem, pat_len, mask_len, pkt_offset; 15894 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 15895 15896 regular = true; 15897 15898 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 15899 rem) 15900 n_patterns++; 15901 if (n_patterns > wowlan->n_patterns) 15902 return -EINVAL; 15903 15904 new_triggers.patterns = kzalloc_objs(new_triggers.patterns[0], 15905 n_patterns); 15906 if (!new_triggers.patterns) 15907 return -ENOMEM; 15908 15909 new_triggers.n_patterns = n_patterns; 15910 i = 0; 15911 15912 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 15913 rem) { 15914 u8 *mask_pat; 15915 15916 err = nla_parse_nested_deprecated(pat_tb, 15917 MAX_NL80211_PKTPAT, 15918 pat, 15919 nl80211_packet_pattern_policy, 15920 info->extack); 15921 if (err) 15922 goto error; 15923 15924 err = -EINVAL; 15925 if (!pat_tb[NL80211_PKTPAT_MASK] || 15926 !pat_tb[NL80211_PKTPAT_PATTERN]) 15927 goto error; 15928 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 15929 mask_len = DIV_ROUND_UP(pat_len, 8); 15930 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 15931 goto error; 15932 if (pat_len > wowlan->pattern_max_len || 15933 pat_len < wowlan->pattern_min_len) 15934 goto error; 15935 15936 pkt_offset = 15937 nla_get_u32_default(pat_tb[NL80211_PKTPAT_OFFSET], 15938 0); 15939 if (pkt_offset > wowlan->max_pkt_offset) 15940 goto error; 15941 new_triggers.patterns[i].pkt_offset = pkt_offset; 15942 15943 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL); 15944 if (!mask_pat) { 15945 err = -ENOMEM; 15946 goto error; 15947 } 15948 new_triggers.patterns[i].mask = mask_pat; 15949 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]), 15950 mask_len); 15951 mask_pat += mask_len; 15952 new_triggers.patterns[i].pattern = mask_pat; 15953 new_triggers.patterns[i].pattern_len = pat_len; 15954 memcpy(mask_pat, 15955 nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 15956 pat_len); 15957 i++; 15958 } 15959 } 15960 15961 if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) { 15962 regular = true; 15963 err = nl80211_parse_wowlan_tcp( 15964 rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION], 15965 &new_triggers); 15966 if (err) 15967 goto error; 15968 } 15969 15970 if (tb[NL80211_WOWLAN_TRIG_NET_DETECT]) { 15971 regular = true; 15972 err = nl80211_parse_wowlan_nd( 15973 rdev, wowlan, tb[NL80211_WOWLAN_TRIG_NET_DETECT], 15974 &new_triggers); 15975 if (err) 15976 goto error; 15977 } 15978 15979 /* The 'any' trigger means the device continues operating more or less 15980 * as in its normal operation mode and wakes up the host on most of the 15981 * normal interrupts (like packet RX, ...) 15982 * It therefore makes little sense to combine with the more constrained 15983 * wakeup trigger modes. 15984 */ 15985 if (new_triggers.any && regular) { 15986 err = -EINVAL; 15987 goto error; 15988 } 15989 15990 ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL); 15991 if (!ntrig) { 15992 err = -ENOMEM; 15993 goto error; 15994 } 15995 cfg80211_rdev_free_wowlan(rdev); 15996 rdev->wiphy.wowlan_config = ntrig; 15997 15998 set_wakeup: 15999 if (rdev->ops->set_wakeup && 16000 prev_enabled != !!rdev->wiphy.wowlan_config) 16001 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); 16002 16003 return 0; 16004 error: 16005 for (i = 0; i < new_triggers.n_patterns; i++) 16006 kfree(new_triggers.patterns[i].mask); 16007 kfree(new_triggers.patterns); 16008 if (new_triggers.tcp && new_triggers.tcp->sock) 16009 sock_release(new_triggers.tcp->sock); 16010 kfree(new_triggers.tcp); 16011 kfree(new_triggers.nd_config); 16012 return err; 16013 } 16014 #endif 16015 16016 static int nl80211_send_coalesce_rules(struct sk_buff *msg, 16017 struct cfg80211_registered_device *rdev) 16018 { 16019 struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules; 16020 int i, j, pat_len; 16021 struct cfg80211_coalesce_rules *rule; 16022 16023 if (!rdev->coalesce->n_rules) 16024 return 0; 16025 16026 nl_rules = nla_nest_start_noflag(msg, NL80211_ATTR_COALESCE_RULE); 16027 if (!nl_rules) 16028 return -ENOBUFS; 16029 16030 for (i = 0; i < rdev->coalesce->n_rules; i++) { 16031 nl_rule = nla_nest_start_noflag(msg, i + 1); 16032 if (!nl_rule) 16033 return -ENOBUFS; 16034 16035 rule = &rdev->coalesce->rules[i]; 16036 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY, 16037 rule->delay)) 16038 return -ENOBUFS; 16039 16040 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION, 16041 rule->condition)) 16042 return -ENOBUFS; 16043 16044 nl_pats = nla_nest_start_noflag(msg, 16045 NL80211_ATTR_COALESCE_RULE_PKT_PATTERN); 16046 if (!nl_pats) 16047 return -ENOBUFS; 16048 16049 for (j = 0; j < rule->n_patterns; j++) { 16050 nl_pat = nla_nest_start_noflag(msg, j + 1); 16051 if (!nl_pat) 16052 return -ENOBUFS; 16053 pat_len = rule->patterns[j].pattern_len; 16054 if (nla_put(msg, NL80211_PKTPAT_MASK, 16055 DIV_ROUND_UP(pat_len, 8), 16056 rule->patterns[j].mask) || 16057 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 16058 rule->patterns[j].pattern) || 16059 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 16060 rule->patterns[j].pkt_offset)) 16061 return -ENOBUFS; 16062 nla_nest_end(msg, nl_pat); 16063 } 16064 nla_nest_end(msg, nl_pats); 16065 nla_nest_end(msg, nl_rule); 16066 } 16067 nla_nest_end(msg, nl_rules); 16068 16069 return 0; 16070 } 16071 16072 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info) 16073 { 16074 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16075 struct sk_buff *msg; 16076 void *hdr; 16077 16078 if (!rdev->wiphy.coalesce) 16079 return -EOPNOTSUPP; 16080 16081 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 16082 if (!msg) 16083 return -ENOMEM; 16084 16085 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 16086 NL80211_CMD_GET_COALESCE); 16087 if (!hdr) 16088 goto nla_put_failure; 16089 16090 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) 16091 goto nla_put_failure; 16092 16093 genlmsg_end(msg, hdr); 16094 return genlmsg_reply(msg, info); 16095 16096 nla_put_failure: 16097 nlmsg_free(msg); 16098 return -ENOBUFS; 16099 } 16100 16101 void cfg80211_free_coalesce(struct cfg80211_coalesce *coalesce) 16102 { 16103 int i, j; 16104 struct cfg80211_coalesce_rules *rule; 16105 16106 if (!coalesce) 16107 return; 16108 16109 for (i = 0; i < coalesce->n_rules; i++) { 16110 rule = &coalesce->rules[i]; 16111 for (j = 0; j < rule->n_patterns; j++) 16112 kfree(rule->patterns[j].mask); 16113 kfree(rule->patterns); 16114 } 16115 kfree(coalesce); 16116 } 16117 16118 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev, 16119 struct nlattr *rule, 16120 struct cfg80211_coalesce_rules *new_rule) 16121 { 16122 int err, i; 16123 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 16124 struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat; 16125 int rem, pat_len, mask_len, pkt_offset, n_patterns = 0; 16126 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 16127 16128 err = nla_parse_nested_deprecated(tb, NL80211_ATTR_COALESCE_RULE_MAX, 16129 rule, nl80211_coalesce_policy, NULL); 16130 if (err) 16131 return err; 16132 16133 if (tb[NL80211_ATTR_COALESCE_RULE_DELAY]) 16134 new_rule->delay = 16135 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]); 16136 if (new_rule->delay > coalesce->max_delay) 16137 return -EINVAL; 16138 16139 if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION]) 16140 new_rule->condition = 16141 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]); 16142 16143 if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN]) 16144 return -EINVAL; 16145 16146 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 16147 rem) 16148 n_patterns++; 16149 if (n_patterns > coalesce->n_patterns) 16150 return -EINVAL; 16151 16152 new_rule->patterns = kzalloc_objs(new_rule->patterns[0], n_patterns); 16153 if (!new_rule->patterns) 16154 return -ENOMEM; 16155 16156 new_rule->n_patterns = n_patterns; 16157 i = 0; 16158 16159 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 16160 rem) { 16161 u8 *mask_pat; 16162 16163 err = nla_parse_nested_deprecated(pat_tb, MAX_NL80211_PKTPAT, 16164 pat, 16165 nl80211_packet_pattern_policy, 16166 NULL); 16167 if (err) 16168 return err; 16169 16170 if (!pat_tb[NL80211_PKTPAT_MASK] || 16171 !pat_tb[NL80211_PKTPAT_PATTERN]) 16172 return -EINVAL; 16173 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 16174 mask_len = DIV_ROUND_UP(pat_len, 8); 16175 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 16176 return -EINVAL; 16177 if (pat_len > coalesce->pattern_max_len || 16178 pat_len < coalesce->pattern_min_len) 16179 return -EINVAL; 16180 16181 pkt_offset = nla_get_u32_default(pat_tb[NL80211_PKTPAT_OFFSET], 16182 0); 16183 if (pkt_offset > coalesce->max_pkt_offset) 16184 return -EINVAL; 16185 new_rule->patterns[i].pkt_offset = pkt_offset; 16186 16187 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL); 16188 if (!mask_pat) 16189 return -ENOMEM; 16190 16191 new_rule->patterns[i].mask = mask_pat; 16192 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]), 16193 mask_len); 16194 16195 mask_pat += mask_len; 16196 new_rule->patterns[i].pattern = mask_pat; 16197 new_rule->patterns[i].pattern_len = pat_len; 16198 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 16199 pat_len); 16200 i++; 16201 } 16202 16203 return 0; 16204 } 16205 16206 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info) 16207 { 16208 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16209 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 16210 struct cfg80211_coalesce *new_coalesce; 16211 int err, rem_rule, n_rules = 0, i; 16212 struct nlattr *rule; 16213 16214 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) 16215 return -EOPNOTSUPP; 16216 16217 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { 16218 cfg80211_free_coalesce(rdev->coalesce); 16219 rdev->coalesce = NULL; 16220 rdev_set_coalesce(rdev, NULL); 16221 return 0; 16222 } 16223 16224 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 16225 rem_rule) 16226 n_rules++; 16227 if (n_rules > coalesce->n_rules) 16228 return -EINVAL; 16229 16230 new_coalesce = kzalloc_flex(*new_coalesce, rules, n_rules); 16231 if (!new_coalesce) 16232 return -ENOMEM; 16233 16234 new_coalesce->n_rules = n_rules; 16235 i = 0; 16236 16237 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 16238 rem_rule) { 16239 err = nl80211_parse_coalesce_rule(rdev, rule, 16240 &new_coalesce->rules[i]); 16241 if (err) 16242 goto error; 16243 16244 i++; 16245 } 16246 16247 err = rdev_set_coalesce(rdev, new_coalesce); 16248 if (err) 16249 goto error; 16250 16251 cfg80211_free_coalesce(rdev->coalesce); 16252 rdev->coalesce = new_coalesce; 16253 16254 return 0; 16255 error: 16256 cfg80211_free_coalesce(new_coalesce); 16257 16258 return err; 16259 } 16260 16261 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info) 16262 { 16263 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16264 struct net_device *dev = info->user_ptr[1]; 16265 struct wireless_dev *wdev = dev->ieee80211_ptr; 16266 struct nlattr *tb[NUM_NL80211_REKEY_DATA]; 16267 struct cfg80211_gtk_rekey_data rekey_data = {}; 16268 int err; 16269 16270 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) 16271 return -EINVAL; 16272 16273 err = nla_parse_nested_deprecated(tb, MAX_NL80211_REKEY_DATA, 16274 info->attrs[NL80211_ATTR_REKEY_DATA], 16275 nl80211_rekey_policy, info->extack); 16276 if (err) 16277 return err; 16278 16279 if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] || 16280 !tb[NL80211_REKEY_DATA_KCK]) 16281 return -EINVAL; 16282 if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN && 16283 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && 16284 nla_len(tb[NL80211_REKEY_DATA_KEK]) == NL80211_KEK_EXT_LEN)) 16285 return -ERANGE; 16286 if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN && 16287 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && 16288 nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN) && 16289 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KCK_32 && 16290 nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN_32)) 16291 return -ERANGE; 16292 16293 rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]); 16294 rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]); 16295 rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]); 16296 rekey_data.kek_len = nla_len(tb[NL80211_REKEY_DATA_KEK]); 16297 rekey_data.kck_len = nla_len(tb[NL80211_REKEY_DATA_KCK]); 16298 if (tb[NL80211_REKEY_DATA_AKM]) 16299 rekey_data.akm = nla_get_u32(tb[NL80211_REKEY_DATA_AKM]); 16300 16301 if (!wdev->connected) 16302 return -ENOTCONN; 16303 16304 if (!rdev->ops->set_rekey_data) 16305 return -EOPNOTSUPP; 16306 16307 return rdev_set_rekey_data(rdev, dev, &rekey_data); 16308 } 16309 16310 static int nl80211_register_unexpected_frame(struct sk_buff *skb, 16311 struct genl_info *info) 16312 { 16313 struct net_device *dev = info->user_ptr[1]; 16314 struct wireless_dev *wdev = dev->ieee80211_ptr; 16315 16316 if (wdev->iftype != NL80211_IFTYPE_AP && 16317 wdev->iftype != NL80211_IFTYPE_P2P_GO && 16318 wdev->iftype != NL80211_IFTYPE_NAN_DATA) 16319 return -EINVAL; 16320 16321 if (wdev->unexpected_nlportid) 16322 return -EBUSY; 16323 16324 wdev->unexpected_nlportid = info->snd_portid; 16325 return 0; 16326 } 16327 16328 static int nl80211_probe_peer(struct sk_buff *skb, struct genl_info *info) 16329 { 16330 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16331 struct net_device *dev = info->user_ptr[1]; 16332 struct wireless_dev *wdev = dev->ieee80211_ptr; 16333 struct sk_buff *msg; 16334 void *hdr; 16335 const u8 *addr = NULL; 16336 u64 cookie; 16337 int err; 16338 16339 /* Allow in AP, STA, and their P2P counterparts */ 16340 switch (wdev->iftype) { 16341 case NL80211_IFTYPE_AP: 16342 case NL80211_IFTYPE_P2P_GO: 16343 if (!info->attrs[NL80211_ATTR_MAC]) 16344 return -EINVAL; 16345 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 16346 break; 16347 case NL80211_IFTYPE_STATION: 16348 case NL80211_IFTYPE_P2P_CLIENT: 16349 if (!wiphy_ext_feature_isset(&rdev->wiphy, 16350 NL80211_EXT_FEATURE_PROBE_AP)) 16351 return -EOPNOTSUPP; 16352 if (!wdev->connected) 16353 return -ENOLINK; 16354 /* STA/P2P-client probes the currently associated AP/GO. */ 16355 if (info->attrs[NL80211_ATTR_MAC]) 16356 return -EINVAL; 16357 break; 16358 default: 16359 return -EOPNOTSUPP; 16360 } 16361 16362 if (!rdev->ops->probe_peer) 16363 return -EOPNOTSUPP; 16364 16365 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 16366 if (!msg) 16367 return -ENOMEM; 16368 16369 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 16370 NL80211_CMD_PROBE_PEER); 16371 if (!hdr) { 16372 err = -ENOBUFS; 16373 goto free_msg; 16374 } 16375 16376 cookie = cfg80211_assign_cookie(rdev); 16377 err = rdev_probe_peer(rdev, dev, addr, cookie); 16378 if (err) 16379 goto free_msg; 16380 16381 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 16382 NL80211_ATTR_PAD)) 16383 goto nla_put_failure; 16384 16385 genlmsg_end(msg, hdr); 16386 16387 return genlmsg_reply(msg, info); 16388 16389 nla_put_failure: 16390 err = -ENOBUFS; 16391 free_msg: 16392 nlmsg_free(msg); 16393 return err; 16394 } 16395 16396 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info) 16397 { 16398 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16399 struct cfg80211_beacon_registration *reg, *nreg; 16400 int rv; 16401 16402 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) 16403 return -EOPNOTSUPP; 16404 16405 nreg = kzalloc_obj(*nreg); 16406 if (!nreg) 16407 return -ENOMEM; 16408 16409 /* First, check if already registered. */ 16410 spin_lock_bh(&rdev->beacon_registrations_lock); 16411 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 16412 if (reg->nlportid == info->snd_portid) { 16413 rv = -EALREADY; 16414 goto out_err; 16415 } 16416 } 16417 /* Add it to the list */ 16418 nreg->nlportid = info->snd_portid; 16419 list_add(&nreg->list, &rdev->beacon_registrations); 16420 16421 spin_unlock_bh(&rdev->beacon_registrations_lock); 16422 16423 return 0; 16424 out_err: 16425 spin_unlock_bh(&rdev->beacon_registrations_lock); 16426 kfree(nreg); 16427 return rv; 16428 } 16429 16430 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info) 16431 { 16432 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16433 struct wireless_dev *wdev = info->user_ptr[1]; 16434 int err; 16435 16436 if (!rdev->ops->start_p2p_device) 16437 return -EOPNOTSUPP; 16438 16439 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 16440 return -EOPNOTSUPP; 16441 16442 if (wdev_running(wdev)) 16443 return 0; 16444 16445 if (rfkill_blocked(rdev->wiphy.rfkill)) 16446 return -ERFKILL; 16447 16448 err = rdev_start_p2p_device(rdev, wdev); 16449 if (err) 16450 return err; 16451 16452 wdev->is_running = true; 16453 rdev->opencount++; 16454 16455 return 0; 16456 } 16457 16458 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info) 16459 { 16460 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16461 struct wireless_dev *wdev = info->user_ptr[1]; 16462 16463 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 16464 return -EOPNOTSUPP; 16465 16466 if (!rdev->ops->stop_p2p_device) 16467 return -EOPNOTSUPP; 16468 16469 cfg80211_stop_p2p_device(rdev, wdev); 16470 16471 return 0; 16472 } 16473 16474 static struct ieee80211_channel *nl80211_get_nan_channel(struct wiphy *wiphy, 16475 int freq) 16476 { 16477 struct ieee80211_channel *chan; 16478 struct cfg80211_chan_def def; 16479 16480 /* Check if the frequency is valid for NAN */ 16481 if (freq != 5220 && freq != 5745 && freq != 2437) 16482 return NULL; 16483 16484 chan = ieee80211_get_channel(wiphy, freq); 16485 if (!chan) 16486 return NULL; 16487 16488 cfg80211_chandef_create(&def, chan, NL80211_CHAN_NO_HT); 16489 16490 /* Check if the channel is allowed */ 16491 if (cfg80211_reg_can_beacon(wiphy, &def, NL80211_IFTYPE_NAN)) 16492 return chan; 16493 16494 return NULL; 16495 } 16496 16497 static int nl80211_parse_nan_band_config(struct wiphy *wiphy, 16498 struct nlattr **tb, 16499 struct cfg80211_nan_band_config *cfg, 16500 enum nl80211_band band) 16501 { 16502 if (BIT(band) & ~(u32)wiphy->nan_supported_bands) 16503 return -EINVAL; 16504 16505 if (tb[NL80211_NAN_BAND_CONF_FREQ]) { 16506 u16 freq = nla_get_u16(tb[NL80211_NAN_BAND_CONF_FREQ]); 16507 16508 if (band != NL80211_BAND_5GHZ) 16509 return -EINVAL; 16510 16511 cfg->chan = nl80211_get_nan_channel(wiphy, freq); 16512 if (!cfg->chan) 16513 return -EINVAL; 16514 } 16515 16516 if (tb[NL80211_NAN_BAND_CONF_RSSI_CLOSE]) { 16517 cfg->rssi_close = 16518 nla_get_s8(tb[NL80211_NAN_BAND_CONF_RSSI_CLOSE]); 16519 if (!tb[NL80211_NAN_BAND_CONF_RSSI_MIDDLE]) 16520 return -EINVAL; 16521 } 16522 16523 if (tb[NL80211_NAN_BAND_CONF_RSSI_MIDDLE]) { 16524 cfg->rssi_middle = 16525 nla_get_s8(tb[NL80211_NAN_BAND_CONF_RSSI_MIDDLE]); 16526 if (!cfg->rssi_close || cfg->rssi_middle >= cfg->rssi_close) 16527 return -EINVAL; 16528 } 16529 16530 if (tb[NL80211_NAN_BAND_CONF_WAKE_DW]) { 16531 cfg->awake_dw_interval = 16532 nla_get_u8(tb[NL80211_NAN_BAND_CONF_WAKE_DW]); 16533 16534 if (band == NL80211_BAND_2GHZ && cfg->awake_dw_interval == 0) 16535 return -EINVAL; 16536 } 16537 16538 cfg->disable_scan = 16539 nla_get_flag(tb[NL80211_NAN_BAND_CONF_DISABLE_SCAN]); 16540 return 0; 16541 } 16542 16543 static int nl80211_parse_nan_conf(struct wiphy *wiphy, 16544 struct genl_info *info, 16545 struct cfg80211_nan_conf *conf, 16546 u32 *changed_flags, 16547 bool start) 16548 { 16549 struct nlattr *attrs[NL80211_NAN_CONF_ATTR_MAX + 1]; 16550 int err, rem; 16551 u32 changed = 0; 16552 struct nlattr *band_config; 16553 16554 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { 16555 conf->master_pref = 16556 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); 16557 16558 changed |= CFG80211_NAN_CONF_CHANGED_PREF; 16559 } 16560 16561 if (info->attrs[NL80211_ATTR_BANDS]) { 16562 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); 16563 16564 if (bands & ~(u32)wiphy->nan_supported_bands) 16565 return -EOPNOTSUPP; 16566 16567 if (bands && !(bands & BIT(NL80211_BAND_2GHZ))) 16568 return -EINVAL; 16569 16570 conf->bands = bands; 16571 changed |= CFG80211_NAN_CONF_CHANGED_BANDS; 16572 } 16573 16574 conf->band_cfgs[NL80211_BAND_2GHZ].awake_dw_interval = 1; 16575 if (conf->bands & BIT(NL80211_BAND_5GHZ) || !conf->bands) 16576 conf->band_cfgs[NL80211_BAND_5GHZ].awake_dw_interval = 1; 16577 16578 /* On 2.4 GHz band use channel 6 */ 16579 conf->band_cfgs[NL80211_BAND_2GHZ].chan = 16580 nl80211_get_nan_channel(wiphy, 2437); 16581 if (!conf->band_cfgs[NL80211_BAND_2GHZ].chan) 16582 return -EINVAL; 16583 16584 if (!info->attrs[NL80211_ATTR_NAN_CONFIG]) 16585 goto out; 16586 16587 err = nla_parse_nested(attrs, NL80211_NAN_CONF_ATTR_MAX, 16588 info->attrs[NL80211_ATTR_NAN_CONFIG], NULL, 16589 info->extack); 16590 if (err) 16591 return err; 16592 16593 changed |= CFG80211_NAN_CONF_CHANGED_CONFIG; 16594 if (attrs[NL80211_NAN_CONF_CLUSTER_ID] && start) { 16595 ether_addr_copy(conf->cluster_id, 16596 nla_data(attrs[NL80211_NAN_CONF_CLUSTER_ID])); 16597 } else if (start) { 16598 conf->cluster_id[0] = 0x50; 16599 conf->cluster_id[1] = 0x6f; 16600 conf->cluster_id[2] = 0x9a; 16601 conf->cluster_id[3] = 0x01; 16602 get_random_bytes(&conf->cluster_id[4], 2); 16603 } 16604 16605 if (attrs[NL80211_NAN_CONF_EXTRA_ATTRS]) { 16606 conf->extra_nan_attrs = 16607 nla_data(attrs[NL80211_NAN_CONF_EXTRA_ATTRS]); 16608 conf->extra_nan_attrs_len = 16609 nla_len(attrs[NL80211_NAN_CONF_EXTRA_ATTRS]); 16610 } 16611 16612 if (attrs[NL80211_NAN_CONF_VENDOR_ELEMS]) { 16613 conf->vendor_elems = 16614 nla_data(attrs[NL80211_NAN_CONF_VENDOR_ELEMS]); 16615 conf->vendor_elems_len = 16616 nla_len(attrs[NL80211_NAN_CONF_VENDOR_ELEMS]); 16617 } 16618 16619 if (attrs[NL80211_NAN_CONF_BAND_CONFIGS]) { 16620 nla_for_each_nested(band_config, 16621 attrs[NL80211_NAN_CONF_BAND_CONFIGS], 16622 rem) { 16623 enum nl80211_band band; 16624 struct cfg80211_nan_band_config *cfg; 16625 struct nlattr *tb[NL80211_NAN_BAND_CONF_ATTR_MAX + 1]; 16626 16627 err = nla_parse_nested(tb, 16628 NL80211_NAN_BAND_CONF_ATTR_MAX, 16629 band_config, NULL, 16630 info->extack); 16631 if (err) 16632 return err; 16633 16634 if (!tb[NL80211_NAN_BAND_CONF_BAND]) 16635 return -EINVAL; 16636 16637 band = nla_get_u8(tb[NL80211_NAN_BAND_CONF_BAND]); 16638 if (conf->bands && !(conf->bands & BIT(band))) 16639 return -EINVAL; 16640 16641 cfg = &conf->band_cfgs[band]; 16642 16643 err = nl80211_parse_nan_band_config(wiphy, tb, cfg, 16644 band); 16645 if (err) 16646 return err; 16647 } 16648 } 16649 16650 if (attrs[NL80211_NAN_CONF_SCAN_PERIOD]) 16651 conf->scan_period = 16652 nla_get_u16(attrs[NL80211_NAN_CONF_SCAN_PERIOD]); 16653 16654 if (attrs[NL80211_NAN_CONF_SCAN_DWELL_TIME]) 16655 conf->scan_dwell_time = 16656 nla_get_u16(attrs[NL80211_NAN_CONF_SCAN_DWELL_TIME]); 16657 16658 if (attrs[NL80211_NAN_CONF_DISCOVERY_BEACON_INTERVAL]) 16659 conf->discovery_beacon_interval = 16660 nla_get_u8(attrs[NL80211_NAN_CONF_DISCOVERY_BEACON_INTERVAL]); 16661 16662 if (attrs[NL80211_NAN_CONF_NOTIFY_DW]) 16663 conf->enable_dw_notification = 16664 nla_get_flag(attrs[NL80211_NAN_CONF_NOTIFY_DW]); 16665 16666 out: 16667 if (!conf->band_cfgs[NL80211_BAND_5GHZ].chan && 16668 (!conf->bands || conf->bands & BIT(NL80211_BAND_5GHZ))) { 16669 /* If no 5GHz channel is specified use default, if possible */ 16670 conf->band_cfgs[NL80211_BAND_5GHZ].chan = 16671 nl80211_get_nan_channel(wiphy, 5745); 16672 if (!conf->band_cfgs[NL80211_BAND_5GHZ].chan) 16673 conf->band_cfgs[NL80211_BAND_5GHZ].chan = 16674 nl80211_get_nan_channel(wiphy, 5220); 16675 16676 /* Return error if user space asked explicitly for 5 GHz */ 16677 if (!conf->band_cfgs[NL80211_BAND_5GHZ].chan && 16678 conf->bands & BIT(NL80211_BAND_5GHZ)) { 16679 NL_SET_ERR_MSG_ATTR(info->extack, 16680 info->attrs[NL80211_ATTR_BANDS], 16681 "5 GHz band operation is not allowed"); 16682 return -EINVAL; 16683 } 16684 } 16685 16686 if (changed_flags) 16687 *changed_flags = changed; 16688 16689 return 0; 16690 } 16691 16692 static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info) 16693 { 16694 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16695 struct wireless_dev *wdev = info->user_ptr[1]; 16696 struct cfg80211_nan_conf conf = {}; 16697 int err; 16698 16699 if (wdev->iftype != NL80211_IFTYPE_NAN) 16700 return -EOPNOTSUPP; 16701 16702 if (wdev_running(wdev)) 16703 return -EEXIST; 16704 16705 if (rfkill_blocked(rdev->wiphy.rfkill)) 16706 return -ERFKILL; 16707 16708 /* Master preference is mandatory for START_NAN */ 16709 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) 16710 return -EINVAL; 16711 16712 err = nl80211_parse_nan_conf(&rdev->wiphy, info, &conf, NULL, true); 16713 if (err) 16714 return err; 16715 16716 err = rdev_start_nan(rdev, wdev, &conf); 16717 if (err) 16718 return err; 16719 16720 wdev->is_running = true; 16721 rdev->opencount++; 16722 16723 return 0; 16724 } 16725 16726 static int nl80211_stop_nan(struct sk_buff *skb, struct genl_info *info) 16727 { 16728 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16729 struct wireless_dev *wdev = info->user_ptr[1]; 16730 16731 if (wdev->iftype != NL80211_IFTYPE_NAN) 16732 return -EOPNOTSUPP; 16733 16734 cfg80211_close_dependents(rdev, wdev); 16735 16736 guard(wiphy)(&rdev->wiphy); 16737 16738 cfg80211_stop_nan(rdev, wdev); 16739 16740 return 0; 16741 } 16742 16743 static int validate_nan_filter(struct nlattr *filter_attr) 16744 { 16745 struct nlattr *attr; 16746 int len = 0, n_entries = 0, rem; 16747 16748 nla_for_each_nested(attr, filter_attr, rem) { 16749 len += nla_len(attr); 16750 n_entries++; 16751 } 16752 16753 if (len >= U8_MAX) 16754 return -EINVAL; 16755 16756 return n_entries; 16757 } 16758 16759 static int handle_nan_filter(struct nlattr *attr_filter, 16760 struct cfg80211_nan_func *func, 16761 bool tx) 16762 { 16763 struct nlattr *attr; 16764 int n_entries, rem, i; 16765 struct cfg80211_nan_func_filter *filter; 16766 16767 n_entries = validate_nan_filter(attr_filter); 16768 if (n_entries < 0) 16769 return n_entries; 16770 16771 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters)); 16772 16773 filter = kzalloc_objs(*func->rx_filters, n_entries); 16774 if (!filter) 16775 return -ENOMEM; 16776 16777 i = 0; 16778 nla_for_each_nested(attr, attr_filter, rem) { 16779 filter[i].filter = nla_memdup(attr, GFP_KERNEL); 16780 if (!filter[i].filter) 16781 goto err; 16782 16783 filter[i].len = nla_len(attr); 16784 i++; 16785 } 16786 if (tx) { 16787 func->num_tx_filters = n_entries; 16788 func->tx_filters = filter; 16789 } else { 16790 func->num_rx_filters = n_entries; 16791 func->rx_filters = filter; 16792 } 16793 16794 return 0; 16795 16796 err: 16797 i = 0; 16798 nla_for_each_nested(attr, attr_filter, rem) { 16799 kfree(filter[i].filter); 16800 i++; 16801 } 16802 kfree(filter); 16803 return -ENOMEM; 16804 } 16805 16806 static int nl80211_nan_add_func(struct sk_buff *skb, 16807 struct genl_info *info) 16808 { 16809 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16810 struct wireless_dev *wdev = info->user_ptr[1]; 16811 struct nlattr *tb[NUM_NL80211_NAN_FUNC_ATTR], *func_attr; 16812 struct cfg80211_nan_func *func; 16813 struct sk_buff *msg = NULL; 16814 void *hdr = NULL; 16815 int err = 0; 16816 16817 if (wdev->iftype != NL80211_IFTYPE_NAN) 16818 return -EOPNOTSUPP; 16819 16820 if (!wdev_running(wdev)) 16821 return -ENOTCONN; 16822 16823 if (!info->attrs[NL80211_ATTR_NAN_FUNC]) 16824 return -EINVAL; 16825 16826 err = nla_parse_nested_deprecated(tb, NL80211_NAN_FUNC_ATTR_MAX, 16827 info->attrs[NL80211_ATTR_NAN_FUNC], 16828 nl80211_nan_func_policy, 16829 info->extack); 16830 if (err) 16831 return err; 16832 16833 func = kzalloc_obj(*func); 16834 if (!func) 16835 return -ENOMEM; 16836 16837 func->cookie = cfg80211_assign_cookie(rdev); 16838 16839 if (!tb[NL80211_NAN_FUNC_TYPE]) { 16840 err = -EINVAL; 16841 goto out; 16842 } 16843 16844 16845 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]); 16846 16847 if (!tb[NL80211_NAN_FUNC_SERVICE_ID]) { 16848 err = -EINVAL; 16849 goto out; 16850 } 16851 16852 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]), 16853 sizeof(func->service_id)); 16854 16855 func->close_range = 16856 nla_get_flag(tb[NL80211_NAN_FUNC_CLOSE_RANGE]); 16857 16858 if (tb[NL80211_NAN_FUNC_SERVICE_INFO]) { 16859 func->serv_spec_info_len = 16860 nla_len(tb[NL80211_NAN_FUNC_SERVICE_INFO]); 16861 func->serv_spec_info = 16862 kmemdup(nla_data(tb[NL80211_NAN_FUNC_SERVICE_INFO]), 16863 func->serv_spec_info_len, 16864 GFP_KERNEL); 16865 if (!func->serv_spec_info) { 16866 err = -ENOMEM; 16867 goto out; 16868 } 16869 } 16870 16871 if (tb[NL80211_NAN_FUNC_TTL]) 16872 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]); 16873 16874 switch (func->type) { 16875 case NL80211_NAN_FUNC_PUBLISH: 16876 if (!tb[NL80211_NAN_FUNC_PUBLISH_TYPE]) { 16877 err = -EINVAL; 16878 goto out; 16879 } 16880 16881 func->publish_type = 16882 nla_get_u8(tb[NL80211_NAN_FUNC_PUBLISH_TYPE]); 16883 func->publish_bcast = 16884 nla_get_flag(tb[NL80211_NAN_FUNC_PUBLISH_BCAST]); 16885 16886 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) && 16887 func->publish_bcast) { 16888 err = -EINVAL; 16889 goto out; 16890 } 16891 break; 16892 case NL80211_NAN_FUNC_SUBSCRIBE: 16893 func->subscribe_active = 16894 nla_get_flag(tb[NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE]); 16895 break; 16896 case NL80211_NAN_FUNC_FOLLOW_UP: 16897 if (!tb[NL80211_NAN_FUNC_FOLLOW_UP_ID] || 16898 !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] || 16899 !tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]) { 16900 err = -EINVAL; 16901 goto out; 16902 } 16903 16904 func->followup_id = 16905 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_ID]); 16906 func->followup_reqid = 16907 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]); 16908 memcpy(func->followup_dest.addr, 16909 nla_data(tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]), 16910 sizeof(func->followup_dest.addr)); 16911 if (func->ttl) { 16912 err = -EINVAL; 16913 goto out; 16914 } 16915 break; 16916 default: 16917 err = -EINVAL; 16918 goto out; 16919 } 16920 16921 if (tb[NL80211_NAN_FUNC_SRF]) { 16922 struct nlattr *srf_tb[NUM_NL80211_NAN_SRF_ATTR]; 16923 16924 err = nla_parse_nested_deprecated(srf_tb, 16925 NL80211_NAN_SRF_ATTR_MAX, 16926 tb[NL80211_NAN_FUNC_SRF], 16927 nl80211_nan_srf_policy, 16928 info->extack); 16929 if (err) 16930 goto out; 16931 16932 func->srf_include = 16933 nla_get_flag(srf_tb[NL80211_NAN_SRF_INCLUDE]); 16934 16935 if (srf_tb[NL80211_NAN_SRF_BF]) { 16936 if (srf_tb[NL80211_NAN_SRF_MAC_ADDRS] || 16937 !srf_tb[NL80211_NAN_SRF_BF_IDX]) { 16938 err = -EINVAL; 16939 goto out; 16940 } 16941 16942 func->srf_bf_len = 16943 nla_len(srf_tb[NL80211_NAN_SRF_BF]); 16944 func->srf_bf = 16945 kmemdup(nla_data(srf_tb[NL80211_NAN_SRF_BF]), 16946 func->srf_bf_len, GFP_KERNEL); 16947 if (!func->srf_bf) { 16948 err = -ENOMEM; 16949 goto out; 16950 } 16951 16952 func->srf_bf_idx = 16953 nla_get_u8(srf_tb[NL80211_NAN_SRF_BF_IDX]); 16954 } else { 16955 struct nlattr *attr, *mac_attr = 16956 srf_tb[NL80211_NAN_SRF_MAC_ADDRS]; 16957 int n_entries, rem, i = 0; 16958 16959 if (!mac_attr) { 16960 err = -EINVAL; 16961 goto out; 16962 } 16963 16964 n_entries = validate_acl_mac_addrs(mac_attr); 16965 if (n_entries <= 0) { 16966 err = -EINVAL; 16967 goto out; 16968 } 16969 16970 func->srf_num_macs = n_entries; 16971 func->srf_macs = 16972 kzalloc_objs(*func->srf_macs, n_entries); 16973 if (!func->srf_macs) { 16974 err = -ENOMEM; 16975 goto out; 16976 } 16977 16978 nla_for_each_nested(attr, mac_attr, rem) 16979 memcpy(func->srf_macs[i++].addr, nla_data(attr), 16980 sizeof(*func->srf_macs)); 16981 } 16982 } 16983 16984 if (tb[NL80211_NAN_FUNC_TX_MATCH_FILTER]) { 16985 err = handle_nan_filter(tb[NL80211_NAN_FUNC_TX_MATCH_FILTER], 16986 func, true); 16987 if (err) 16988 goto out; 16989 } 16990 16991 if (tb[NL80211_NAN_FUNC_RX_MATCH_FILTER]) { 16992 err = handle_nan_filter(tb[NL80211_NAN_FUNC_RX_MATCH_FILTER], 16993 func, false); 16994 if (err) 16995 goto out; 16996 } 16997 16998 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 16999 if (!msg) { 17000 err = -ENOMEM; 17001 goto out; 17002 } 17003 17004 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 17005 NL80211_CMD_ADD_NAN_FUNCTION); 17006 /* This can't really happen - we just allocated 4KB */ 17007 if (WARN_ON(!hdr)) { 17008 err = -ENOMEM; 17009 goto out; 17010 } 17011 17012 err = rdev_add_nan_func(rdev, wdev, func); 17013 out: 17014 if (err < 0) { 17015 cfg80211_free_nan_func(func); 17016 nlmsg_free(msg); 17017 return err; 17018 } 17019 17020 /* propagate the instance id and cookie to userspace */ 17021 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie, 17022 NL80211_ATTR_PAD)) 17023 goto nla_put_failure; 17024 17025 func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC); 17026 if (!func_attr) 17027 goto nla_put_failure; 17028 17029 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, 17030 func->instance_id)) 17031 goto nla_put_failure; 17032 17033 nla_nest_end(msg, func_attr); 17034 17035 genlmsg_end(msg, hdr); 17036 return genlmsg_reply(msg, info); 17037 17038 nla_put_failure: 17039 nlmsg_free(msg); 17040 return -ENOBUFS; 17041 } 17042 17043 static int nl80211_nan_del_func(struct sk_buff *skb, 17044 struct genl_info *info) 17045 { 17046 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17047 struct wireless_dev *wdev = info->user_ptr[1]; 17048 u64 cookie; 17049 17050 if (wdev->iftype != NL80211_IFTYPE_NAN) 17051 return -EOPNOTSUPP; 17052 17053 if (!wdev_running(wdev)) 17054 return -ENOTCONN; 17055 17056 if (!info->attrs[NL80211_ATTR_COOKIE]) 17057 return -EINVAL; 17058 17059 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 17060 17061 rdev_del_nan_func(rdev, wdev, cookie); 17062 17063 return 0; 17064 } 17065 17066 static int nl80211_nan_change_config(struct sk_buff *skb, 17067 struct genl_info *info) 17068 { 17069 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17070 struct wireless_dev *wdev = info->user_ptr[1]; 17071 struct cfg80211_nan_conf conf = {}; 17072 u32 changed = 0; 17073 int err; 17074 17075 if (wdev->iftype != NL80211_IFTYPE_NAN) 17076 return -EOPNOTSUPP; 17077 17078 if (!wdev_running(wdev)) 17079 return -ENOTCONN; 17080 17081 err = nl80211_parse_nan_conf(&rdev->wiphy, info, &conf, &changed, false); 17082 if (err) 17083 return err; 17084 17085 if (!changed) 17086 return -EINVAL; 17087 17088 return rdev_nan_change_conf(rdev, wdev, &conf, changed); 17089 } 17090 17091 static int nl80211_start_pd(struct sk_buff *skb, struct genl_info *info) 17092 { 17093 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17094 struct wireless_dev *wdev = info->user_ptr[1]; 17095 int err; 17096 17097 if (wdev->iftype != NL80211_IFTYPE_PD) 17098 return -EOPNOTSUPP; 17099 17100 if (wdev_running(wdev)) 17101 return -EEXIST; 17102 17103 if (rfkill_blocked(rdev->wiphy.rfkill)) 17104 return -ERFKILL; 17105 17106 if (!rdev->ops->start_pd) 17107 return -EOPNOTSUPP; 17108 17109 err = rdev_start_pd(rdev, wdev); 17110 if (err) 17111 return err; 17112 wdev->is_running = true; 17113 rdev->opencount++; 17114 17115 return 0; 17116 } 17117 17118 static int nl80211_stop_pd(struct sk_buff *skb, struct genl_info *info) 17119 { 17120 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17121 struct wireless_dev *wdev = info->user_ptr[1]; 17122 17123 if (wdev->iftype != NL80211_IFTYPE_PD) 17124 return -EOPNOTSUPP; 17125 17126 cfg80211_stop_pd(rdev, wdev); 17127 17128 return 0; 17129 } 17130 17131 void cfg80211_nan_match(struct wireless_dev *wdev, 17132 struct cfg80211_nan_match_params *match, gfp_t gfp) 17133 { 17134 struct wiphy *wiphy = wdev->wiphy; 17135 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 17136 struct nlattr *match_attr, *local_func_attr, *peer_func_attr; 17137 struct sk_buff *msg; 17138 void *hdr; 17139 17140 if (WARN_ON(wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_USERSPACE_DE)) 17141 return; 17142 17143 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr)) 17144 return; 17145 17146 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 17147 if (!msg) 17148 return; 17149 17150 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_MATCH); 17151 if (!hdr) { 17152 nlmsg_free(msg); 17153 return; 17154 } 17155 17156 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17157 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 17158 wdev->netdev->ifindex)) || 17159 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 17160 NL80211_ATTR_PAD)) 17161 goto nla_put_failure; 17162 17163 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie, 17164 NL80211_ATTR_PAD) || 17165 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr)) 17166 goto nla_put_failure; 17167 17168 match_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_MATCH); 17169 if (!match_attr) 17170 goto nla_put_failure; 17171 17172 local_func_attr = nla_nest_start_noflag(msg, 17173 NL80211_NAN_MATCH_FUNC_LOCAL); 17174 if (!local_func_attr) 17175 goto nla_put_failure; 17176 17177 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id)) 17178 goto nla_put_failure; 17179 17180 nla_nest_end(msg, local_func_attr); 17181 17182 peer_func_attr = nla_nest_start_noflag(msg, 17183 NL80211_NAN_MATCH_FUNC_PEER); 17184 if (!peer_func_attr) 17185 goto nla_put_failure; 17186 17187 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) || 17188 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id)) 17189 goto nla_put_failure; 17190 17191 if (match->info && match->info_len && 17192 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len, 17193 match->info)) 17194 goto nla_put_failure; 17195 17196 nla_nest_end(msg, peer_func_attr); 17197 nla_nest_end(msg, match_attr); 17198 genlmsg_end(msg, hdr); 17199 17200 if (!wdev->owner_nlportid) 17201 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 17202 msg, 0, NL80211_MCGRP_NAN, gfp); 17203 else 17204 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 17205 wdev->owner_nlportid); 17206 17207 return; 17208 17209 nla_put_failure: 17210 nlmsg_free(msg); 17211 } 17212 EXPORT_SYMBOL(cfg80211_nan_match); 17213 17214 void cfg80211_nan_func_terminated(struct wireless_dev *wdev, 17215 u8 inst_id, 17216 enum nl80211_nan_func_term_reason reason, 17217 u64 cookie, gfp_t gfp) 17218 { 17219 struct wiphy *wiphy = wdev->wiphy; 17220 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 17221 struct sk_buff *msg; 17222 struct nlattr *func_attr; 17223 void *hdr; 17224 17225 if (WARN_ON(wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_USERSPACE_DE)) 17226 return; 17227 17228 if (WARN_ON(!inst_id)) 17229 return; 17230 17231 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 17232 if (!msg) 17233 return; 17234 17235 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_NAN_FUNCTION); 17236 if (!hdr) { 17237 nlmsg_free(msg); 17238 return; 17239 } 17240 17241 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17242 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 17243 wdev->netdev->ifindex)) || 17244 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 17245 NL80211_ATTR_PAD)) 17246 goto nla_put_failure; 17247 17248 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 17249 NL80211_ATTR_PAD)) 17250 goto nla_put_failure; 17251 17252 func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC); 17253 if (!func_attr) 17254 goto nla_put_failure; 17255 17256 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, inst_id) || 17257 nla_put_u8(msg, NL80211_NAN_FUNC_TERM_REASON, reason)) 17258 goto nla_put_failure; 17259 17260 nla_nest_end(msg, func_attr); 17261 genlmsg_end(msg, hdr); 17262 17263 if (!wdev->owner_nlportid) 17264 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 17265 msg, 0, NL80211_MCGRP_NAN, gfp); 17266 else 17267 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 17268 wdev->owner_nlportid); 17269 17270 return; 17271 17272 nla_put_failure: 17273 nlmsg_free(msg); 17274 } 17275 EXPORT_SYMBOL(cfg80211_nan_func_terminated); 17276 17277 void cfg80211_nan_sched_update_done(struct wireless_dev *wdev, bool success, 17278 gfp_t gfp) 17279 { 17280 struct wiphy *wiphy = wdev->wiphy; 17281 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 17282 struct sk_buff *msg; 17283 void *hdr; 17284 17285 trace_cfg80211_nan_sched_update_done(wiphy, wdev, success); 17286 17287 /* Can happen if we stopped NAN */ 17288 if (!wdev->u.nan.sched_update_pending) 17289 return; 17290 17291 wdev->u.nan.sched_update_pending = false; 17292 17293 if (!wdev->owner_nlportid) 17294 return; 17295 17296 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 17297 if (!msg) 17298 return; 17299 17300 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_SCHED_UPDATE_DONE); 17301 if (!hdr) 17302 goto nla_put_failure; 17303 17304 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17305 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 17306 NL80211_ATTR_PAD) || 17307 (success && 17308 nla_put_flag(msg, NL80211_ATTR_NAN_SCHED_UPDATE_SUCCESS))) 17309 goto nla_put_failure; 17310 17311 genlmsg_end(msg, hdr); 17312 17313 genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid); 17314 17315 return; 17316 17317 nla_put_failure: 17318 nlmsg_free(msg); 17319 } 17320 EXPORT_SYMBOL(cfg80211_nan_sched_update_done); 17321 17322 static int nl80211_parse_nan_channel(struct cfg80211_registered_device *rdev, 17323 struct nlattr *channel, 17324 struct genl_info *info, 17325 struct cfg80211_nan_channel *nan_channels, 17326 u8 index, bool local) 17327 { 17328 struct nlattr **channel_parsed __free(kfree) = NULL; 17329 struct cfg80211_chan_def chandef; 17330 u8 n_rx_nss; 17331 int ret; 17332 17333 channel_parsed = kzalloc_objs(*channel_parsed, NL80211_ATTR_MAX + 1); 17334 if (!channel_parsed) 17335 return -ENOMEM; 17336 17337 ret = nla_parse_nested(channel_parsed, NL80211_ATTR_MAX, channel, NULL, 17338 info->extack); 17339 if (ret) 17340 return ret; 17341 17342 ret = nl80211_parse_chandef(rdev, info->extack, channel_parsed, 17343 &chandef, false); 17344 if (ret) 17345 return ret; 17346 17347 if (chandef.chan->band == NL80211_BAND_6GHZ) { 17348 NL_SET_ERR_MSG(info->extack, 17349 "6 GHz band is not supported"); 17350 return -EOPNOTSUPP; 17351 } 17352 17353 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &chandef, 17354 NL80211_IFTYPE_NAN)) { 17355 NL_SET_ERR_MSG_ATTR(info->extack, channel, 17356 "Channel in NAN schedule is not allowed for NAN operation"); 17357 return -EINVAL; 17358 } 17359 17360 if (local) { 17361 for (int i = 0; i < index; i++) { 17362 if (cfg80211_chandef_compatible(&nan_channels[i].chandef, 17363 &chandef)) { 17364 NL_SET_ERR_MSG_ATTR(info->extack, channel, 17365 "Channels in NAN schedule must be mutually incompatible"); 17366 return -EINVAL; 17367 } 17368 } 17369 } 17370 17371 if (!channel_parsed[NL80211_ATTR_NAN_CHANNEL_ENTRY]) { 17372 NL_SET_ERR_MSG(info->extack, 17373 "Missing NAN channel entry attribute"); 17374 return -EINVAL; 17375 } 17376 17377 nan_channels[index].channel_entry = 17378 nla_data(channel_parsed[NL80211_ATTR_NAN_CHANNEL_ENTRY]); 17379 17380 if (!channel_parsed[NL80211_ATTR_NAN_RX_NSS]) { 17381 NL_SET_ERR_MSG(info->extack, 17382 "Missing NAN RX NSS attribute"); 17383 return -EINVAL; 17384 } 17385 17386 nan_channels[index].rx_nss = 17387 nla_get_u8(channel_parsed[NL80211_ATTR_NAN_RX_NSS]); 17388 17389 n_rx_nss = u8_get_bits(rdev->wiphy.nan_capa.n_antennas, 0x03); 17390 if ((local && nan_channels[index].rx_nss > n_rx_nss) || 17391 !nan_channels[index].rx_nss) { 17392 NL_SET_ERR_MSG_ATTR(info->extack, channel, 17393 "Invalid RX NSS in NAN channel definition"); 17394 return -EINVAL; 17395 } 17396 17397 nan_channels[index].chandef = chandef; 17398 17399 return 0; 17400 } 17401 17402 static int 17403 nl80211_parse_nan_schedule(struct genl_info *info, struct nlattr *slots_attr, 17404 u8 schedule[CFG80211_NAN_SCHED_NUM_TIME_SLOTS], 17405 u8 n_channels) 17406 { 17407 if (WARN_ON(nla_len(slots_attr) != CFG80211_NAN_SCHED_NUM_TIME_SLOTS)) 17408 return -EINVAL; 17409 17410 memcpy(schedule, nla_data(slots_attr), nla_len(slots_attr)); 17411 17412 for (int slot = 0; slot < CFG80211_NAN_SCHED_NUM_TIME_SLOTS; slot++) { 17413 if (schedule[slot] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT && 17414 schedule[slot] >= n_channels) { 17415 NL_SET_ERR_MSG_FMT(info->extack, 17416 "Invalid time slot: slot %d refers to channel index %d, n_channels=%d", 17417 slot, schedule[slot], n_channels); 17418 return -EINVAL; 17419 } 17420 } 17421 17422 return 0; 17423 } 17424 17425 static int 17426 nl80211_parse_nan_peer_map(struct genl_info *info, struct nlattr *map_attr, 17427 struct cfg80211_nan_peer_map *map, u8 n_channels) 17428 { 17429 struct nlattr *tb[NL80211_NAN_PEER_MAP_ATTR_MAX + 1]; 17430 int ret; 17431 17432 ret = nla_parse_nested(tb, NL80211_NAN_PEER_MAP_ATTR_MAX, map_attr, 17433 nl80211_nan_peer_map_policy, info->extack); 17434 if (ret) 17435 return ret; 17436 17437 if (!tb[NL80211_NAN_PEER_MAP_ATTR_MAP_ID] || 17438 !tb[NL80211_NAN_PEER_MAP_ATTR_TIME_SLOTS]) { 17439 NL_SET_ERR_MSG(info->extack, 17440 "Missing required peer map attributes"); 17441 return -EINVAL; 17442 } 17443 17444 map->map_id = nla_get_u8(tb[NL80211_NAN_PEER_MAP_ATTR_MAP_ID]); 17445 17446 /* Parse schedule */ 17447 return nl80211_parse_nan_schedule(info, 17448 tb[NL80211_NAN_PEER_MAP_ATTR_TIME_SLOTS], 17449 map->schedule, n_channels); 17450 } 17451 17452 static int nl80211_nan_validate_map_pair(struct wiphy *wiphy, 17453 struct genl_info *info, 17454 const struct cfg80211_nan_peer_map *map1, 17455 const struct cfg80211_nan_peer_map *map2, 17456 struct cfg80211_nan_channel *nan_channels) 17457 { 17458 /* Check for duplicate map_id */ 17459 if (map1->map_id == map2->map_id) { 17460 NL_SET_ERR_MSG_FMT(info->extack, "Duplicate map_id %u", 17461 map1->map_id); 17462 return -EINVAL; 17463 } 17464 17465 /* Check for compatible channels between maps */ 17466 for (int i = 0; i < ARRAY_SIZE(map1->schedule); i++) { 17467 if (map1->schedule[i] == NL80211_NAN_SCHED_NOT_AVAIL_SLOT) 17468 continue; 17469 17470 for (int j = 0; j < ARRAY_SIZE(map2->schedule); j++) { 17471 u8 ch1 = map1->schedule[i]; 17472 u8 ch2 = map2->schedule[j]; 17473 17474 if (ch2 == NL80211_NAN_SCHED_NOT_AVAIL_SLOT) 17475 continue; 17476 17477 if (cfg80211_chandef_compatible(&nan_channels[ch1].chandef, 17478 &nan_channels[ch2].chandef)) { 17479 NL_SET_ERR_MSG_FMT(info->extack, 17480 "Maps %u and %u have compatible channels %d and %d", 17481 map1->map_id, map2->map_id, 17482 ch1, ch2); 17483 return -EINVAL; 17484 } 17485 } 17486 } 17487 17488 /* 17489 * Check for conflicting time slots between maps. 17490 * Only check for single-radio devices (n_radio <= 1) which cannot 17491 * operate on multiple channels simultaneously. 17492 */ 17493 if (wiphy->n_radio > 1) 17494 return 0; 17495 17496 for (int i = 0; i < ARRAY_SIZE(map1->schedule); i++) { 17497 if (map1->schedule[i] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT && 17498 map2->schedule[i] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT) { 17499 NL_SET_ERR_MSG_FMT(info->extack, 17500 "Maps %u and %u both schedule slot %d", 17501 map1->map_id, map2->map_id, i); 17502 return -EINVAL; 17503 } 17504 } 17505 17506 return 0; 17507 } 17508 17509 static int nl80211_nan_set_peer_sched(struct sk_buff *skb, 17510 struct genl_info *info) 17511 { 17512 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17513 struct cfg80211_nan_channel *nan_channels __free(kfree) = NULL; 17514 struct cfg80211_nan_peer_sched sched = {}; 17515 struct wireless_dev *wdev = info->user_ptr[1]; 17516 struct nlattr *map_attr, *channel; 17517 int ret, n_maps = 0, n_channels = 0, i = 0, rem; 17518 17519 if (wdev->iftype != NL80211_IFTYPE_NAN) 17520 return -EOPNOTSUPP; 17521 17522 if (!info->attrs[NL80211_ATTR_MAC] || 17523 !info->attrs[NL80211_ATTR_NAN_COMMITTED_DW]) { 17524 NL_SET_ERR_MSG(info->extack, 17525 "Required NAN peer schedule attributes are missing"); 17526 return -EINVAL; 17527 } 17528 17529 /* First count how many channel attributes we got */ 17530 nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL, 17531 info->nlhdr, GENL_HDRLEN, rem) 17532 n_channels++; 17533 17534 if (!((info->attrs[NL80211_ATTR_NAN_SEQ_ID] && 17535 info->attrs[NL80211_ATTR_NAN_PEER_MAPS] && n_channels) || 17536 ((!info->attrs[NL80211_ATTR_NAN_SEQ_ID] && 17537 !info->attrs[NL80211_ATTR_NAN_PEER_MAPS] && !n_channels)))) { 17538 NL_SET_ERR_MSG(info->extack, 17539 "Either provide all of: seq id, channels and maps, or none"); 17540 return -EINVAL; 17541 } 17542 17543 /* 17544 * Limit the number of peer channels to: 17545 * local_channels * 4 (possible BWs) * 2 (possible NSS values) 17546 */ 17547 if (n_channels && n_channels > wdev->u.nan.n_channels * 4 * 2) { 17548 NL_SET_ERR_MSG_FMT(info->extack, 17549 "Too many peer channels: %d (max %d)", 17550 n_channels, 17551 wdev->u.nan.n_channels * 4 * 2); 17552 return -EINVAL; 17553 } 17554 17555 if (n_channels) { 17556 nan_channels = kzalloc_objs(*nan_channels, n_channels); 17557 if (!nan_channels) 17558 return -ENOMEM; 17559 } 17560 17561 /* Parse peer channels */ 17562 nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL, 17563 info->nlhdr, GENL_HDRLEN, rem) { 17564 bool compatible = false; 17565 17566 ret = nl80211_parse_nan_channel(rdev, channel, info, 17567 nan_channels, i, false); 17568 if (ret) 17569 return ret; 17570 17571 /* Verify channel is compatible with at least one local channel */ 17572 for (int j = 0; j < wdev->u.nan.n_channels; j++) { 17573 if (cfg80211_chandef_compatible(&nan_channels[i].chandef, 17574 &wdev->u.nan.chandefs[j])) { 17575 compatible = true; 17576 break; 17577 } 17578 } 17579 if (!compatible) { 17580 NL_SET_ERR_MSG_FMT(info->extack, 17581 "Channel %d not compatible with any local channel", 17582 i); 17583 return -EINVAL; 17584 } 17585 i++; 17586 } 17587 17588 sched.n_channels = n_channels; 17589 sched.nan_channels = nan_channels; 17590 sched.peer_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 17591 sched.seq_id = nla_get_u8_default(info->attrs[NL80211_ATTR_NAN_SEQ_ID], 0); 17592 sched.committed_dw = nla_get_u16(info->attrs[NL80211_ATTR_NAN_COMMITTED_DW]); 17593 sched.max_chan_switch = 17594 nla_get_u16_default(info->attrs[NL80211_ATTR_NAN_MAX_CHAN_SWITCH_TIME], 0); 17595 17596 if (info->attrs[NL80211_ATTR_NAN_ULW]) { 17597 sched.ulw_size = nla_len(info->attrs[NL80211_ATTR_NAN_ULW]); 17598 sched.init_ulw = nla_data(info->attrs[NL80211_ATTR_NAN_ULW]); 17599 } 17600 17601 /* Initialize all maps as invalid */ 17602 for (int j = 0; j < ARRAY_SIZE(sched.maps); j++) 17603 sched.maps[j].map_id = CFG80211_NAN_INVALID_MAP_ID; 17604 17605 if (info->attrs[NL80211_ATTR_NAN_PEER_MAPS]) { 17606 /* Parse each map */ 17607 nla_for_each_nested(map_attr, info->attrs[NL80211_ATTR_NAN_PEER_MAPS], 17608 rem) { 17609 if (n_maps >= ARRAY_SIZE(sched.maps)) { 17610 NL_SET_ERR_MSG(info->extack, "Too many peer maps"); 17611 return -EINVAL; 17612 } 17613 17614 ret = nl80211_parse_nan_peer_map(info, map_attr, 17615 &sched.maps[n_maps], 17616 n_channels); 17617 if (ret) 17618 return ret; 17619 17620 /* Validate against previous maps */ 17621 for (int j = 0; j < n_maps; j++) { 17622 ret = nl80211_nan_validate_map_pair(&rdev->wiphy, info, 17623 &sched.maps[j], 17624 &sched.maps[n_maps], 17625 nan_channels); 17626 if (ret) 17627 return ret; 17628 } 17629 17630 n_maps++; 17631 } 17632 } 17633 17634 /* Verify each channel is scheduled at least once */ 17635 for (int ch = 0; ch < n_channels; ch++) { 17636 bool scheduled = false; 17637 17638 for (int m = 0; m < n_maps && !scheduled; m++) { 17639 for (int s = 0; s < ARRAY_SIZE(sched.maps[m].schedule); s++) { 17640 if (sched.maps[m].schedule[s] == ch) { 17641 scheduled = true; 17642 break; 17643 } 17644 } 17645 } 17646 if (!scheduled) { 17647 NL_SET_ERR_MSG_FMT(info->extack, 17648 "Channel %d is not scheduled in any map", 17649 ch); 17650 return -EINVAL; 17651 } 17652 } 17653 17654 return rdev_nan_set_peer_sched(rdev, wdev, &sched); 17655 } 17656 17657 static bool nl80211_nan_is_sched_empty(struct cfg80211_nan_local_sched *sched) 17658 { 17659 if (!sched->n_channels) 17660 return true; 17661 17662 for (int i = 0; i < ARRAY_SIZE(sched->schedule); i++) { 17663 if (sched->schedule[i] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT) 17664 return false; 17665 } 17666 17667 return true; 17668 } 17669 17670 static int nl80211_nan_set_local_sched(struct sk_buff *skb, 17671 struct genl_info *info) 17672 { 17673 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17674 struct cfg80211_nan_local_sched *sched __free(kfree) = NULL; 17675 struct wireless_dev *wdev = info->user_ptr[1]; 17676 int rem, i = 0, n_channels = 0, ret; 17677 struct nlattr *channel; 17678 bool sched_empty; 17679 17680 if (wdev->iftype != NL80211_IFTYPE_NAN) 17681 return -EOPNOTSUPP; 17682 17683 if (!wdev_running(wdev)) 17684 return -ENOTCONN; 17685 17686 if (!info->attrs[NL80211_ATTR_NAN_TIME_SLOTS]) 17687 return -EINVAL; 17688 17689 /* First count how many channel attributes we got */ 17690 nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL, 17691 info->nlhdr, GENL_HDRLEN, rem) 17692 n_channels++; 17693 17694 sched = kzalloc_flex(*sched, nan_channels, n_channels); 17695 if (!sched) 17696 return -ENOMEM; 17697 17698 sched->n_channels = n_channels; 17699 17700 nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL, 17701 info->nlhdr, GENL_HDRLEN, rem) { 17702 ret = nl80211_parse_nan_channel(rdev, channel, info, 17703 sched->nan_channels, i, true); 17704 17705 if (ret) 17706 return ret; 17707 i++; 17708 } 17709 17710 /* Parse and validate schedule */ 17711 ret = nl80211_parse_nan_schedule(info, 17712 info->attrs[NL80211_ATTR_NAN_TIME_SLOTS], 17713 sched->schedule, sched->n_channels); 17714 if (ret) 17715 return ret; 17716 17717 sched_empty = nl80211_nan_is_sched_empty(sched); 17718 17719 sched->deferred = 17720 nla_get_flag(info->attrs[NL80211_ATTR_NAN_SCHED_DEFERRED]); 17721 17722 if (sched_empty) { 17723 if (sched->deferred) { 17724 NL_SET_ERR_MSG(info->extack, 17725 "Schedule cannot be deferred if all time slots are unavailable"); 17726 return -EINVAL; 17727 } 17728 17729 if (info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]) { 17730 NL_SET_ERR_MSG(info->extack, 17731 "NAN Availability blob must be empty if all time slots are unavailable"); 17732 return -EINVAL; 17733 } 17734 } else { 17735 if (!info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]) { 17736 NL_SET_ERR_MSG(info->extack, 17737 "NAN Availability blob attribute is required"); 17738 return -EINVAL; 17739 } 17740 17741 sched->nan_avail_blob = 17742 nla_data(info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]); 17743 sched->nan_avail_blob_len = 17744 nla_len(info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]); 17745 } 17746 17747 return cfg80211_nan_set_local_schedule(rdev, wdev, sched); 17748 } 17749 17750 static int nl80211_get_protocol_features(struct sk_buff *skb, 17751 struct genl_info *info) 17752 { 17753 void *hdr; 17754 struct sk_buff *msg; 17755 17756 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 17757 if (!msg) 17758 return -ENOMEM; 17759 17760 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 17761 NL80211_CMD_GET_PROTOCOL_FEATURES); 17762 if (!hdr) 17763 goto nla_put_failure; 17764 17765 if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES, 17766 NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP)) 17767 goto nla_put_failure; 17768 17769 genlmsg_end(msg, hdr); 17770 return genlmsg_reply(msg, info); 17771 17772 nla_put_failure: 17773 kfree_skb(msg); 17774 return -ENOBUFS; 17775 } 17776 17777 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info) 17778 { 17779 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17780 struct cfg80211_update_ft_ies_params ft_params; 17781 struct net_device *dev = info->user_ptr[1]; 17782 17783 if (!rdev->ops->update_ft_ies) 17784 return -EOPNOTSUPP; 17785 17786 if (!info->attrs[NL80211_ATTR_MDID] || 17787 !info->attrs[NL80211_ATTR_IE]) 17788 return -EINVAL; 17789 17790 memset(&ft_params, 0, sizeof(ft_params)); 17791 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); 17792 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 17793 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 17794 17795 return rdev_update_ft_ies(rdev, dev, &ft_params); 17796 } 17797 17798 static int nl80211_crit_protocol_start(struct sk_buff *skb, 17799 struct genl_info *info) 17800 { 17801 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17802 struct wireless_dev *wdev = info->user_ptr[1]; 17803 enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC; 17804 u16 duration; 17805 int ret; 17806 17807 if (!rdev->ops->crit_proto_start) 17808 return -EOPNOTSUPP; 17809 17810 if (WARN_ON(!rdev->ops->crit_proto_stop)) 17811 return -EINVAL; 17812 17813 if (rdev->crit_proto_nlportid) 17814 return -EBUSY; 17815 17816 /* determine protocol if provided */ 17817 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) 17818 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); 17819 17820 if (proto >= NUM_NL80211_CRIT_PROTO) 17821 return -EINVAL; 17822 17823 /* timeout must be provided */ 17824 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) 17825 return -EINVAL; 17826 17827 duration = 17828 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); 17829 17830 ret = rdev_crit_proto_start(rdev, wdev, proto, duration); 17831 if (!ret) 17832 rdev->crit_proto_nlportid = info->snd_portid; 17833 17834 return ret; 17835 } 17836 17837 static int nl80211_crit_protocol_stop(struct sk_buff *skb, 17838 struct genl_info *info) 17839 { 17840 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17841 struct wireless_dev *wdev = info->user_ptr[1]; 17842 17843 if (!rdev->ops->crit_proto_stop) 17844 return -EOPNOTSUPP; 17845 17846 if (rdev->crit_proto_nlportid) { 17847 rdev->crit_proto_nlportid = 0; 17848 rdev_crit_proto_stop(rdev, wdev); 17849 } 17850 return 0; 17851 } 17852 17853 static int nl80211_vendor_check_policy(const struct wiphy_vendor_command *vcmd, 17854 struct nlattr *attr, 17855 struct netlink_ext_ack *extack) 17856 { 17857 if (vcmd->policy == VENDOR_CMD_RAW_DATA) { 17858 if (attr->nla_type & NLA_F_NESTED) { 17859 NL_SET_ERR_MSG_ATTR(extack, attr, 17860 "unexpected nested data"); 17861 return -EINVAL; 17862 } 17863 17864 return 0; 17865 } 17866 17867 if (!(attr->nla_type & NLA_F_NESTED)) { 17868 NL_SET_ERR_MSG_ATTR(extack, attr, "expected nested data"); 17869 return -EINVAL; 17870 } 17871 17872 return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack); 17873 } 17874 17875 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info) 17876 { 17877 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17878 struct wireless_dev *wdev = 17879 __cfg80211_wdev_from_attrs(rdev, genl_info_net(info), 17880 info->attrs); 17881 int i, err; 17882 u32 vid, subcmd; 17883 17884 if (!rdev->wiphy.vendor_commands) 17885 return -EOPNOTSUPP; 17886 17887 if (IS_ERR(wdev)) { 17888 err = PTR_ERR(wdev); 17889 if (err != -EINVAL) 17890 return err; 17891 wdev = NULL; 17892 } else if (wdev->wiphy != &rdev->wiphy) { 17893 return -EINVAL; 17894 } 17895 17896 if (!info->attrs[NL80211_ATTR_VENDOR_ID] || 17897 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD]) 17898 return -EINVAL; 17899 17900 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]); 17901 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]); 17902 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { 17903 const struct wiphy_vendor_command *vcmd; 17904 void *data = NULL; 17905 int len = 0; 17906 17907 vcmd = &rdev->wiphy.vendor_commands[i]; 17908 17909 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) 17910 continue; 17911 17912 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | 17913 WIPHY_VENDOR_CMD_NEED_NETDEV)) { 17914 if (!wdev) 17915 return -EINVAL; 17916 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && 17917 !wdev->netdev) 17918 return -EINVAL; 17919 17920 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { 17921 if (!wdev_running(wdev)) 17922 return -ENETDOWN; 17923 } 17924 } else { 17925 wdev = NULL; 17926 } 17927 17928 if (!vcmd->doit) 17929 return -EOPNOTSUPP; 17930 17931 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { 17932 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); 17933 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); 17934 17935 err = nl80211_vendor_check_policy(vcmd, 17936 info->attrs[NL80211_ATTR_VENDOR_DATA], 17937 info->extack); 17938 if (err) 17939 return err; 17940 } 17941 17942 rdev->cur_cmd_info = info; 17943 err = vcmd->doit(&rdev->wiphy, wdev, data, len); 17944 rdev->cur_cmd_info = NULL; 17945 return err; 17946 } 17947 17948 return -EOPNOTSUPP; 17949 } 17950 17951 static int nl80211_prepare_vendor_dump(struct sk_buff *skb, 17952 struct netlink_callback *cb, 17953 struct cfg80211_registered_device **rdev, 17954 struct wireless_dev **wdev) 17955 { 17956 struct nlattr **attrbuf; 17957 u32 vid, subcmd; 17958 unsigned int i; 17959 int vcmd_idx = -1; 17960 int err; 17961 void *data = NULL; 17962 unsigned int data_len = 0; 17963 17964 if (cb->args[0]) { 17965 /* subtract the 1 again here */ 17966 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); 17967 struct wireless_dev *tmp; 17968 17969 if (!wiphy) 17970 return -ENODEV; 17971 17972 /* 17973 * The wiphy may have moved netns between dumpit 17974 * invocations (via NL80211_CMD_SET_WIPHY_NETNS), so 17975 * re-check that it still matches the caller's netns. 17976 */ 17977 if (!net_eq(wiphy_net(wiphy), sock_net(skb->sk))) 17978 return -ENODEV; 17979 17980 *rdev = wiphy_to_rdev(wiphy); 17981 *wdev = NULL; 17982 17983 if (cb->args[1]) { 17984 list_for_each_entry(tmp, &wiphy->wdev_list, list) { 17985 if (tmp->identifier == cb->args[1] - 1) { 17986 *wdev = tmp; 17987 break; 17988 } 17989 } 17990 } 17991 17992 /* keep rtnl locked in successful case */ 17993 return 0; 17994 } 17995 17996 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 17997 if (!attrbuf) 17998 return -ENOMEM; 17999 18000 err = nlmsg_parse_deprecated(cb->nlh, 18001 GENL_HDRLEN + nl80211_fam.hdrsize, 18002 attrbuf, nl80211_fam.maxattr, 18003 nl80211_policy, NULL); 18004 if (err) 18005 goto out; 18006 18007 if (!attrbuf[NL80211_ATTR_VENDOR_ID] || 18008 !attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) { 18009 err = -EINVAL; 18010 goto out; 18011 } 18012 18013 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(skb->sk), attrbuf); 18014 if (IS_ERR(*wdev)) 18015 *wdev = NULL; 18016 18017 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); 18018 if (IS_ERR(*rdev)) { 18019 err = PTR_ERR(*rdev); 18020 goto out; 18021 } 18022 18023 vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]); 18024 subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]); 18025 18026 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { 18027 const struct wiphy_vendor_command *vcmd; 18028 18029 vcmd = &(*rdev)->wiphy.vendor_commands[i]; 18030 18031 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) 18032 continue; 18033 18034 if (!vcmd->dumpit) { 18035 err = -EOPNOTSUPP; 18036 goto out; 18037 } 18038 18039 vcmd_idx = i; 18040 break; 18041 } 18042 18043 if (vcmd_idx < 0) { 18044 err = -EOPNOTSUPP; 18045 goto out; 18046 } 18047 18048 if (attrbuf[NL80211_ATTR_VENDOR_DATA]) { 18049 data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]); 18050 data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]); 18051 18052 err = nl80211_vendor_check_policy( 18053 &(*rdev)->wiphy.vendor_commands[vcmd_idx], 18054 attrbuf[NL80211_ATTR_VENDOR_DATA], 18055 cb->extack); 18056 if (err) 18057 goto out; 18058 } 18059 18060 /* 0 is the first index - add 1 to parse only once */ 18061 cb->args[0] = (*rdev)->wiphy_idx + 1; 18062 /* add 1 to know if it was NULL */ 18063 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0; 18064 cb->args[2] = vcmd_idx; 18065 cb->args[3] = (unsigned long)data; 18066 cb->args[4] = data_len; 18067 18068 /* keep rtnl locked in successful case */ 18069 err = 0; 18070 out: 18071 kfree(attrbuf); 18072 return err; 18073 } 18074 18075 static int nl80211_vendor_cmd_dump(struct sk_buff *skb, 18076 struct netlink_callback *cb) 18077 { 18078 struct cfg80211_registered_device *rdev; 18079 struct wireless_dev *wdev; 18080 unsigned int vcmd_idx; 18081 const struct wiphy_vendor_command *vcmd; 18082 void *data; 18083 int data_len; 18084 int err; 18085 struct nlattr *vendor_data; 18086 18087 rtnl_lock(); 18088 err = nl80211_prepare_vendor_dump(skb, cb, &rdev, &wdev); 18089 if (err) 18090 goto out; 18091 18092 vcmd_idx = cb->args[2]; 18093 data = (void *)cb->args[3]; 18094 data_len = cb->args[4]; 18095 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx]; 18096 18097 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | 18098 WIPHY_VENDOR_CMD_NEED_NETDEV)) { 18099 if (!wdev) { 18100 err = -EINVAL; 18101 goto out; 18102 } 18103 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && 18104 !wdev->netdev) { 18105 err = -EINVAL; 18106 goto out; 18107 } 18108 18109 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { 18110 if (!wdev_running(wdev)) { 18111 err = -ENETDOWN; 18112 goto out; 18113 } 18114 } 18115 } 18116 18117 while (1) { 18118 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 18119 cb->nlh->nlmsg_seq, NLM_F_MULTI, 18120 NL80211_CMD_VENDOR); 18121 if (!hdr) 18122 break; 18123 18124 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 18125 (wdev && nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 18126 wdev_id(wdev), 18127 NL80211_ATTR_PAD))) { 18128 genlmsg_cancel(skb, hdr); 18129 break; 18130 } 18131 18132 vendor_data = nla_nest_start_noflag(skb, 18133 NL80211_ATTR_VENDOR_DATA); 18134 if (!vendor_data) { 18135 genlmsg_cancel(skb, hdr); 18136 break; 18137 } 18138 18139 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len, 18140 (unsigned long *)&cb->args[5]); 18141 nla_nest_end(skb, vendor_data); 18142 18143 if (err == -ENOBUFS || err == -ENOENT) { 18144 genlmsg_cancel(skb, hdr); 18145 break; 18146 } else if (err <= 0) { 18147 genlmsg_cancel(skb, hdr); 18148 goto out; 18149 } 18150 18151 genlmsg_end(skb, hdr); 18152 } 18153 18154 err = skb->len; 18155 out: 18156 rtnl_unlock(); 18157 return err; 18158 } 18159 18160 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy, 18161 enum nl80211_commands cmd, 18162 enum nl80211_attrs attr, 18163 int approxlen) 18164 { 18165 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 18166 18167 if (WARN_ON(!rdev->cur_cmd_info)) 18168 return NULL; 18169 18170 return __cfg80211_alloc_vendor_skb(rdev, NULL, approxlen, 18171 rdev->cur_cmd_info->snd_portid, 18172 rdev->cur_cmd_info->snd_seq, 18173 cmd, attr, NULL, GFP_KERNEL); 18174 } 18175 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb); 18176 18177 int cfg80211_vendor_cmd_reply(struct sk_buff *skb) 18178 { 18179 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 18180 void *hdr = ((void **)skb->cb)[1]; 18181 struct nlattr *data = ((void **)skb->cb)[2]; 18182 18183 /* clear CB data for netlink core to own from now on */ 18184 memset(skb->cb, 0, sizeof(skb->cb)); 18185 18186 if (WARN_ON(!rdev->cur_cmd_info)) { 18187 kfree_skb(skb); 18188 return -EINVAL; 18189 } 18190 18191 nla_nest_end(skb, data); 18192 genlmsg_end(skb, hdr); 18193 return genlmsg_reply(skb, rdev->cur_cmd_info); 18194 } 18195 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply); 18196 18197 unsigned int cfg80211_vendor_cmd_get_sender(struct wiphy *wiphy) 18198 { 18199 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 18200 18201 if (WARN_ON(!rdev->cur_cmd_info)) 18202 return 0; 18203 18204 return rdev->cur_cmd_info->snd_portid; 18205 } 18206 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_get_sender); 18207 18208 static int nl80211_set_qos_map(struct sk_buff *skb, 18209 struct genl_info *info) 18210 { 18211 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18212 struct cfg80211_qos_map *qos_map = NULL; 18213 struct net_device *dev = info->user_ptr[1]; 18214 u8 *pos, len, num_des, des_len, des; 18215 int ret; 18216 18217 if (!rdev->ops->set_qos_map) 18218 return -EOPNOTSUPP; 18219 18220 if (info->attrs[NL80211_ATTR_QOS_MAP]) { 18221 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]); 18222 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]); 18223 18224 if (len % 2) 18225 return -EINVAL; 18226 18227 qos_map = kzalloc_obj(struct cfg80211_qos_map); 18228 if (!qos_map) 18229 return -ENOMEM; 18230 18231 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1; 18232 if (num_des) { 18233 des_len = num_des * 18234 sizeof(struct cfg80211_dscp_exception); 18235 memcpy(qos_map->dscp_exception, pos, des_len); 18236 qos_map->num_des = num_des; 18237 for (des = 0; des < num_des; des++) { 18238 if (qos_map->dscp_exception[des].up > 7) { 18239 kfree(qos_map); 18240 return -EINVAL; 18241 } 18242 } 18243 pos += des_len; 18244 } 18245 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN); 18246 } 18247 18248 ret = nl80211_key_allowed(dev->ieee80211_ptr); 18249 if (!ret) 18250 ret = rdev_set_qos_map(rdev, dev, qos_map); 18251 18252 kfree(qos_map); 18253 return ret; 18254 } 18255 18256 static int nl80211_add_tx_ts(struct sk_buff *skb, struct genl_info *info) 18257 { 18258 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18259 struct net_device *dev = info->user_ptr[1]; 18260 struct wireless_dev *wdev = dev->ieee80211_ptr; 18261 const u8 *peer; 18262 u8 tsid, up; 18263 u16 admitted_time = 0; 18264 18265 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)) 18266 return -EOPNOTSUPP; 18267 18268 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] || 18269 !info->attrs[NL80211_ATTR_USER_PRIO]) 18270 return -EINVAL; 18271 18272 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); 18273 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]); 18274 18275 /* WMM uses TIDs 0-7 even for TSPEC */ 18276 if (tsid >= IEEE80211_FIRST_TSPEC_TSID) { 18277 /* TODO: handle 802.11 TSPEC/admission control 18278 * need more attributes for that (e.g. BA session requirement); 18279 * change the WMM admission test above to allow both then 18280 */ 18281 return -EINVAL; 18282 } 18283 18284 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 18285 18286 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) { 18287 admitted_time = 18288 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]); 18289 if (!admitted_time) 18290 return -EINVAL; 18291 } 18292 18293 switch (wdev->iftype) { 18294 case NL80211_IFTYPE_STATION: 18295 case NL80211_IFTYPE_P2P_CLIENT: 18296 if (wdev->connected) 18297 break; 18298 return -ENOTCONN; 18299 default: 18300 return -EOPNOTSUPP; 18301 } 18302 18303 return rdev_add_tx_ts(rdev, dev, tsid, peer, up, admitted_time); 18304 } 18305 18306 static int nl80211_del_tx_ts(struct sk_buff *skb, struct genl_info *info) 18307 { 18308 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18309 struct net_device *dev = info->user_ptr[1]; 18310 const u8 *peer; 18311 u8 tsid; 18312 18313 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC]) 18314 return -EINVAL; 18315 18316 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); 18317 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 18318 18319 return rdev_del_tx_ts(rdev, dev, tsid, peer); 18320 } 18321 18322 static int nl80211_tdls_channel_switch(struct sk_buff *skb, 18323 struct genl_info *info) 18324 { 18325 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18326 struct net_device *dev = info->user_ptr[1]; 18327 struct wireless_dev *wdev = dev->ieee80211_ptr; 18328 struct cfg80211_chan_def chandef = {}; 18329 const u8 *addr; 18330 u8 oper_class; 18331 int err; 18332 18333 if (!rdev->ops->tdls_channel_switch || 18334 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) 18335 return -EOPNOTSUPP; 18336 18337 switch (dev->ieee80211_ptr->iftype) { 18338 case NL80211_IFTYPE_STATION: 18339 case NL80211_IFTYPE_P2P_CLIENT: 18340 break; 18341 default: 18342 return -EOPNOTSUPP; 18343 } 18344 18345 if (!info->attrs[NL80211_ATTR_MAC] || 18346 !info->attrs[NL80211_ATTR_OPER_CLASS]) 18347 return -EINVAL; 18348 18349 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef, 18350 false); 18351 if (err) 18352 return err; 18353 18354 /* 18355 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012 18356 * section 10.22.6.2.1. Disallow 5/10Mhz channels as well for now, the 18357 * specification is not defined for them. 18358 */ 18359 if (chandef.chan->band == NL80211_BAND_2GHZ && 18360 chandef.width != NL80211_CHAN_WIDTH_20_NOHT && 18361 chandef.width != NL80211_CHAN_WIDTH_20) 18362 return -EINVAL; 18363 18364 /* we will be active on the TDLS link */ 18365 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, 18366 wdev->iftype)) 18367 return -EINVAL; 18368 18369 /* don't allow switching to DFS channels */ 18370 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype)) 18371 return -EINVAL; 18372 18373 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 18374 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]); 18375 18376 return rdev_tdls_channel_switch(rdev, dev, addr, oper_class, &chandef); 18377 } 18378 18379 static int nl80211_tdls_cancel_channel_switch(struct sk_buff *skb, 18380 struct genl_info *info) 18381 { 18382 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18383 struct net_device *dev = info->user_ptr[1]; 18384 const u8 *addr; 18385 18386 if (!rdev->ops->tdls_channel_switch || 18387 !rdev->ops->tdls_cancel_channel_switch || 18388 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) 18389 return -EOPNOTSUPP; 18390 18391 switch (dev->ieee80211_ptr->iftype) { 18392 case NL80211_IFTYPE_STATION: 18393 case NL80211_IFTYPE_P2P_CLIENT: 18394 break; 18395 default: 18396 return -EOPNOTSUPP; 18397 } 18398 18399 if (!info->attrs[NL80211_ATTR_MAC]) 18400 return -EINVAL; 18401 18402 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 18403 18404 rdev_tdls_cancel_channel_switch(rdev, dev, addr); 18405 18406 return 0; 18407 } 18408 18409 static int nl80211_set_multicast_to_unicast(struct sk_buff *skb, 18410 struct genl_info *info) 18411 { 18412 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18413 struct net_device *dev = info->user_ptr[1]; 18414 struct wireless_dev *wdev = dev->ieee80211_ptr; 18415 const struct nlattr *nla; 18416 bool enabled; 18417 18418 if (!rdev->ops->set_multicast_to_unicast) 18419 return -EOPNOTSUPP; 18420 18421 if (wdev->iftype != NL80211_IFTYPE_AP && 18422 wdev->iftype != NL80211_IFTYPE_P2P_GO) 18423 return -EOPNOTSUPP; 18424 18425 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED]; 18426 enabled = nla_get_flag(nla); 18427 18428 return rdev_set_multicast_to_unicast(rdev, dev, enabled); 18429 } 18430 18431 static int nl80211_set_pmk(struct sk_buff *skb, struct genl_info *info) 18432 { 18433 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18434 struct net_device *dev = info->user_ptr[1]; 18435 struct wireless_dev *wdev = dev->ieee80211_ptr; 18436 struct cfg80211_pmk_conf pmk_conf = {}; 18437 18438 if (wdev->iftype != NL80211_IFTYPE_STATION && 18439 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 18440 return -EOPNOTSUPP; 18441 18442 if (!wiphy_ext_feature_isset(&rdev->wiphy, 18443 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 18444 return -EOPNOTSUPP; 18445 18446 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK]) 18447 return -EINVAL; 18448 18449 if (!wdev->connected) 18450 return -ENOTCONN; 18451 18452 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]); 18453 if (memcmp(pmk_conf.aa, wdev->u.client.connected_addr, ETH_ALEN)) 18454 return -EINVAL; 18455 18456 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); 18457 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); 18458 if (pmk_conf.pmk_len != WLAN_PMK_LEN && 18459 pmk_conf.pmk_len != WLAN_PMK_LEN_SUITE_B_192) 18460 return -EINVAL; 18461 18462 if (info->attrs[NL80211_ATTR_PMKR0_NAME]) 18463 pmk_conf.pmk_r0_name = 18464 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]); 18465 18466 return rdev_set_pmk(rdev, dev, &pmk_conf); 18467 } 18468 18469 static int nl80211_del_pmk(struct sk_buff *skb, struct genl_info *info) 18470 { 18471 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18472 struct net_device *dev = info->user_ptr[1]; 18473 struct wireless_dev *wdev = dev->ieee80211_ptr; 18474 const u8 *aa; 18475 18476 if (wdev->iftype != NL80211_IFTYPE_STATION && 18477 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 18478 return -EOPNOTSUPP; 18479 18480 if (!wiphy_ext_feature_isset(&rdev->wiphy, 18481 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 18482 return -EOPNOTSUPP; 18483 18484 if (!info->attrs[NL80211_ATTR_MAC]) 18485 return -EINVAL; 18486 18487 aa = nla_data(info->attrs[NL80211_ATTR_MAC]); 18488 return rdev_del_pmk(rdev, dev, aa); 18489 } 18490 18491 static int nl80211_external_auth(struct sk_buff *skb, struct genl_info *info) 18492 { 18493 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18494 struct net_device *dev = info->user_ptr[1]; 18495 struct cfg80211_external_auth_params params; 18496 18497 if (!rdev->ops->external_auth) 18498 return -EOPNOTSUPP; 18499 18500 if (!info->attrs[NL80211_ATTR_SSID] && 18501 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 18502 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 18503 return -EINVAL; 18504 18505 if (!info->attrs[NL80211_ATTR_BSSID]) 18506 return -EINVAL; 18507 18508 if (!info->attrs[NL80211_ATTR_STATUS_CODE]) 18509 return -EINVAL; 18510 18511 memset(¶ms, 0, sizeof(params)); 18512 18513 if (info->attrs[NL80211_ATTR_SSID]) { 18514 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 18515 if (params.ssid.ssid_len == 0) 18516 return -EINVAL; 18517 memcpy(params.ssid.ssid, 18518 nla_data(info->attrs[NL80211_ATTR_SSID]), 18519 params.ssid.ssid_len); 18520 } 18521 18522 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), 18523 ETH_ALEN); 18524 18525 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 18526 18527 if (info->attrs[NL80211_ATTR_PMKID]) 18528 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 18529 18530 return rdev_external_auth(rdev, dev, ¶ms); 18531 } 18532 18533 static int nl80211_tx_control_port(struct sk_buff *skb, struct genl_info *info) 18534 { 18535 bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK]; 18536 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18537 struct net_device *dev = info->user_ptr[1]; 18538 struct wireless_dev *wdev = dev->ieee80211_ptr; 18539 const u8 *buf; 18540 size_t len; 18541 u8 *dest; 18542 u16 proto; 18543 bool noencrypt; 18544 u64 cookie = 0; 18545 int link_id; 18546 int err; 18547 18548 if (!wiphy_ext_feature_isset(&rdev->wiphy, 18549 NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211)) 18550 return -EOPNOTSUPP; 18551 18552 if (!rdev->ops->tx_control_port) 18553 return -EOPNOTSUPP; 18554 18555 if (!info->attrs[NL80211_ATTR_FRAME] || 18556 !info->attrs[NL80211_ATTR_MAC] || 18557 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { 18558 GENL_SET_ERR_MSG(info, "Frame, MAC or ethertype missing"); 18559 return -EINVAL; 18560 } 18561 18562 switch (wdev->iftype) { 18563 case NL80211_IFTYPE_AP: 18564 case NL80211_IFTYPE_P2P_GO: 18565 case NL80211_IFTYPE_MESH_POINT: 18566 break; 18567 case NL80211_IFTYPE_ADHOC: 18568 if (wdev->u.ibss.current_bss) 18569 break; 18570 return -ENOTCONN; 18571 case NL80211_IFTYPE_STATION: 18572 case NL80211_IFTYPE_P2P_CLIENT: 18573 if (wdev->connected) 18574 break; 18575 return -ENOTCONN; 18576 default: 18577 return -EOPNOTSUPP; 18578 } 18579 18580 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 18581 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 18582 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); 18583 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); 18584 noencrypt = 18585 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]); 18586 18587 link_id = nl80211_link_id_or_invalid(info->attrs); 18588 18589 cookie = dont_wait_for_ack ? 0 : cfg80211_assign_cookie(rdev); 18590 err = rdev_tx_control_port(rdev, dev, buf, len, 18591 dest, cpu_to_be16(proto), noencrypt, link_id, 18592 cookie); 18593 if (!err && cookie) 18594 nl_set_extack_cookie_u64(info->extack, cookie); 18595 return err; 18596 } 18597 18598 static int nl80211_get_ftm_responder_stats(struct sk_buff *skb, 18599 struct genl_info *info) 18600 { 18601 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18602 struct net_device *dev = info->user_ptr[1]; 18603 struct wireless_dev *wdev = dev->ieee80211_ptr; 18604 struct cfg80211_ftm_responder_stats ftm_stats = {}; 18605 unsigned int link_id = nl80211_link_id(info->attrs); 18606 struct sk_buff *msg; 18607 void *hdr; 18608 struct nlattr *ftm_stats_attr; 18609 int err; 18610 18611 if (wdev->iftype != NL80211_IFTYPE_AP || 18612 !wdev->links[link_id].ap.beacon_interval) 18613 return -EOPNOTSUPP; 18614 18615 err = rdev_get_ftm_responder_stats(rdev, dev, &ftm_stats); 18616 if (err) 18617 return err; 18618 18619 if (!ftm_stats.filled) 18620 return -ENODATA; 18621 18622 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 18623 if (!msg) 18624 return -ENOMEM; 18625 18626 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 18627 NL80211_CMD_GET_FTM_RESPONDER_STATS); 18628 if (!hdr) 18629 goto nla_put_failure; 18630 18631 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 18632 goto nla_put_failure; 18633 18634 ftm_stats_attr = nla_nest_start_noflag(msg, 18635 NL80211_ATTR_FTM_RESPONDER_STATS); 18636 if (!ftm_stats_attr) 18637 goto nla_put_failure; 18638 18639 #define SET_FTM(field, name, type) \ 18640 do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \ 18641 nla_put_ ## type(msg, NL80211_FTM_STATS_ ## name, \ 18642 ftm_stats.field)) \ 18643 goto nla_put_failure; } while (0) 18644 #define SET_FTM_U64(field, name) \ 18645 do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \ 18646 nla_put_u64_64bit(msg, NL80211_FTM_STATS_ ## name, \ 18647 ftm_stats.field, NL80211_FTM_STATS_PAD)) \ 18648 goto nla_put_failure; } while (0) 18649 18650 SET_FTM(success_num, SUCCESS_NUM, u32); 18651 SET_FTM(partial_num, PARTIAL_NUM, u32); 18652 SET_FTM(failed_num, FAILED_NUM, u32); 18653 SET_FTM(asap_num, ASAP_NUM, u32); 18654 SET_FTM(non_asap_num, NON_ASAP_NUM, u32); 18655 SET_FTM_U64(total_duration_ms, TOTAL_DURATION_MSEC); 18656 SET_FTM(unknown_triggers_num, UNKNOWN_TRIGGERS_NUM, u32); 18657 SET_FTM(reschedule_requests_num, RESCHEDULE_REQUESTS_NUM, u32); 18658 SET_FTM(out_of_window_triggers_num, OUT_OF_WINDOW_TRIGGERS_NUM, u32); 18659 #undef SET_FTM 18660 18661 nla_nest_end(msg, ftm_stats_attr); 18662 18663 genlmsg_end(msg, hdr); 18664 return genlmsg_reply(msg, info); 18665 18666 nla_put_failure: 18667 nlmsg_free(msg); 18668 return -ENOBUFS; 18669 } 18670 18671 static int nl80211_update_owe_info(struct sk_buff *skb, struct genl_info *info) 18672 { 18673 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18674 struct cfg80211_update_owe_info owe_info; 18675 struct net_device *dev = info->user_ptr[1]; 18676 18677 if (!rdev->ops->update_owe_info) 18678 return -EOPNOTSUPP; 18679 18680 if (!info->attrs[NL80211_ATTR_STATUS_CODE] || 18681 !info->attrs[NL80211_ATTR_MAC]) 18682 return -EINVAL; 18683 18684 memset(&owe_info, 0, sizeof(owe_info)); 18685 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 18686 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); 18687 18688 if (info->attrs[NL80211_ATTR_IE]) { 18689 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 18690 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 18691 } 18692 18693 return rdev_update_owe_info(rdev, dev, &owe_info); 18694 } 18695 18696 static int nl80211_probe_mesh_link(struct sk_buff *skb, struct genl_info *info) 18697 { 18698 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18699 struct net_device *dev = info->user_ptr[1]; 18700 struct wireless_dev *wdev = dev->ieee80211_ptr; 18701 struct station_info sinfo = {}; 18702 const u8 *buf; 18703 size_t len; 18704 u8 *dest; 18705 int err; 18706 18707 if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station) 18708 return -EOPNOTSUPP; 18709 18710 if (!info->attrs[NL80211_ATTR_MAC] || 18711 !info->attrs[NL80211_ATTR_FRAME]) { 18712 GENL_SET_ERR_MSG(info, "Frame or MAC missing"); 18713 return -EINVAL; 18714 } 18715 18716 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 18717 return -EOPNOTSUPP; 18718 18719 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); 18720 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 18721 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 18722 18723 if (len < sizeof(struct ethhdr)) 18724 return -EINVAL; 18725 18726 if (!ether_addr_equal(buf, dest) || is_multicast_ether_addr(buf) || 18727 !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr)) 18728 return -EINVAL; 18729 18730 err = rdev_get_station(rdev, wdev, dest, &sinfo); 18731 if (err) 18732 return err; 18733 18734 cfg80211_sinfo_release_content(&sinfo); 18735 18736 return rdev_probe_mesh_link(rdev, dev, dest, buf, len); 18737 } 18738 18739 static int parse_tid_conf(struct cfg80211_registered_device *rdev, 18740 struct nlattr *attrs[], struct net_device *dev, 18741 struct cfg80211_tid_cfg *tid_conf, 18742 struct genl_info *info, const u8 *peer, 18743 unsigned int link_id) 18744 { 18745 struct netlink_ext_ack *extack = info->extack; 18746 u64 mask; 18747 int err; 18748 18749 if (!attrs[NL80211_TID_CONFIG_ATTR_TIDS]) 18750 return -EINVAL; 18751 18752 tid_conf->config_override = 18753 nla_get_flag(attrs[NL80211_TID_CONFIG_ATTR_OVERRIDE]); 18754 tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]); 18755 18756 if (tid_conf->config_override) { 18757 if (rdev->ops->reset_tid_config) { 18758 err = rdev_reset_tid_config(rdev, dev, peer, 18759 tid_conf->tids); 18760 if (err) 18761 return err; 18762 } else { 18763 return -EINVAL; 18764 } 18765 } 18766 18767 if (attrs[NL80211_TID_CONFIG_ATTR_NOACK]) { 18768 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK); 18769 tid_conf->noack = 18770 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_NOACK]); 18771 } 18772 18773 if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]) { 18774 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT); 18775 tid_conf->retry_short = 18776 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]); 18777 18778 if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count) 18779 return -EINVAL; 18780 } 18781 18782 if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]) { 18783 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG); 18784 tid_conf->retry_long = 18785 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]); 18786 18787 if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count) 18788 return -EINVAL; 18789 } 18790 18791 if (attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]) { 18792 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL); 18793 tid_conf->ampdu = 18794 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]); 18795 } 18796 18797 if (attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]) { 18798 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL); 18799 tid_conf->rtscts = 18800 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]); 18801 } 18802 18803 if (attrs[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL]) { 18804 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL); 18805 tid_conf->amsdu = 18806 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL]); 18807 } 18808 18809 if (attrs[NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE]) { 18810 u32 idx = NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE, attr; 18811 18812 tid_conf->txrate_type = nla_get_u8(attrs[idx]); 18813 18814 if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) { 18815 attr = NL80211_TID_CONFIG_ATTR_TX_RATE; 18816 err = nl80211_parse_tx_bitrate_mask(info, attrs, attr, 18817 &tid_conf->txrate_mask, dev, 18818 true, link_id); 18819 if (err) 18820 return err; 18821 18822 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE); 18823 } 18824 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE); 18825 } 18826 18827 if (peer) 18828 mask = rdev->wiphy.tid_config_support.peer; 18829 else 18830 mask = rdev->wiphy.tid_config_support.vif; 18831 18832 if (tid_conf->mask & ~mask) { 18833 NL_SET_ERR_MSG(extack, "unsupported TID configuration"); 18834 return -EOPNOTSUPP; 18835 } 18836 18837 return 0; 18838 } 18839 18840 static int nl80211_set_tid_config(struct sk_buff *skb, 18841 struct genl_info *info) 18842 { 18843 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18844 struct nlattr *attrs[NL80211_TID_CONFIG_ATTR_MAX + 1]; 18845 unsigned int link_id = nl80211_link_id(info->attrs); 18846 struct net_device *dev = info->user_ptr[1]; 18847 struct cfg80211_tid_config *tid_config; 18848 struct nlattr *tid; 18849 int conf_idx = 0, rem_conf; 18850 int ret = -EINVAL; 18851 u32 num_conf = 0; 18852 18853 if (!info->attrs[NL80211_ATTR_TID_CONFIG]) 18854 return -EINVAL; 18855 18856 if (!rdev->ops->set_tid_config) 18857 return -EOPNOTSUPP; 18858 18859 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], 18860 rem_conf) 18861 num_conf++; 18862 18863 tid_config = kzalloc_flex(*tid_config, tid_conf, num_conf); 18864 if (!tid_config) 18865 return -ENOMEM; 18866 18867 tid_config->n_tid_conf = num_conf; 18868 18869 if (info->attrs[NL80211_ATTR_MAC]) 18870 tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 18871 18872 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], 18873 rem_conf) { 18874 ret = nla_parse_nested(attrs, NL80211_TID_CONFIG_ATTR_MAX, 18875 tid, NULL, NULL); 18876 18877 if (ret) 18878 goto bad_tid_conf; 18879 18880 ret = parse_tid_conf(rdev, attrs, dev, 18881 &tid_config->tid_conf[conf_idx], 18882 info, tid_config->peer, link_id); 18883 if (ret) 18884 goto bad_tid_conf; 18885 18886 conf_idx++; 18887 } 18888 18889 ret = rdev_set_tid_config(rdev, dev, tid_config); 18890 18891 bad_tid_conf: 18892 kfree(tid_config); 18893 return ret; 18894 } 18895 18896 static int nl80211_color_change(struct sk_buff *skb, struct genl_info *info) 18897 { 18898 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18899 struct cfg80211_color_change_settings params = {}; 18900 struct net_device *dev = info->user_ptr[1]; 18901 struct wireless_dev *wdev = dev->ieee80211_ptr; 18902 struct nlattr **tb; 18903 u16 offset; 18904 int err; 18905 18906 if (!rdev->ops->color_change) 18907 return -EOPNOTSUPP; 18908 18909 if (!wiphy_ext_feature_isset(&rdev->wiphy, 18910 NL80211_EXT_FEATURE_BSS_COLOR)) 18911 return -EOPNOTSUPP; 18912 18913 if (wdev->iftype != NL80211_IFTYPE_AP) 18914 return -EOPNOTSUPP; 18915 18916 if (!info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT] || 18917 !info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR] || 18918 !info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS]) 18919 return -EINVAL; 18920 18921 params.count = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT]); 18922 params.color = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR]); 18923 18924 params.link_id = nl80211_link_id(info->attrs); 18925 if (!wdev->links[params.link_id].ap.beacon_interval) 18926 return -EINVAL; 18927 18928 tb = kzalloc_objs(*tb, NL80211_ATTR_MAX + 1); 18929 if (!tb) 18930 return -ENOMEM; 18931 18932 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_next, 18933 wdev->links[params.link_id].ap.chandef.chan, 18934 info->extack); 18935 if (err) 18936 goto out; 18937 18938 err = nla_parse_nested(tb, NL80211_ATTR_MAX, 18939 info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS], 18940 nl80211_policy, info->extack); 18941 if (err) 18942 goto out; 18943 18944 err = nl80211_parse_beacon(rdev, tb, ¶ms.beacon_color_change, 18945 wdev->links[params.link_id].ap.chandef.chan, 18946 info->extack); 18947 if (err) 18948 goto out; 18949 18950 if (!tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]) { 18951 err = -EINVAL; 18952 goto out; 18953 } 18954 18955 if (nla_len(tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]) != sizeof(u16)) { 18956 err = -EINVAL; 18957 goto out; 18958 } 18959 18960 offset = nla_get_u16(tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]); 18961 if (offset >= params.beacon_color_change.tail_len) { 18962 err = -EINVAL; 18963 goto out; 18964 } 18965 18966 if (params.beacon_color_change.tail[offset] != params.count) { 18967 err = -EINVAL; 18968 goto out; 18969 } 18970 18971 params.counter_offset_beacon = offset; 18972 18973 if (tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]) { 18974 if (nla_len(tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]) != 18975 sizeof(u16)) { 18976 err = -EINVAL; 18977 goto out; 18978 } 18979 18980 offset = nla_get_u16(tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]); 18981 if (offset >= params.beacon_color_change.probe_resp_len) { 18982 err = -EINVAL; 18983 goto out; 18984 } 18985 18986 if (params.beacon_color_change.probe_resp[offset] != 18987 params.count) { 18988 err = -EINVAL; 18989 goto out; 18990 } 18991 18992 params.counter_offset_presp = offset; 18993 } 18994 18995 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { 18996 err = nl80211_parse_unsol_bcast_probe_resp( 18997 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], 18998 ¶ms.unsol_bcast_probe_resp); 18999 if (err) 19000 goto out; 19001 } 19002 19003 err = rdev_color_change(rdev, dev, ¶ms); 19004 19005 out: 19006 kfree(params.beacon_next.mbssid_ies); 19007 kfree(params.beacon_color_change.mbssid_ies); 19008 kfree(params.beacon_next.rnr_ies); 19009 kfree(params.beacon_color_change.rnr_ies); 19010 kfree(tb); 19011 return err; 19012 } 19013 19014 static int nl80211_set_fils_aad(struct sk_buff *skb, 19015 struct genl_info *info) 19016 { 19017 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19018 struct net_device *dev = info->user_ptr[1]; 19019 struct cfg80211_fils_aad fils_aad = {}; 19020 u8 *nonces; 19021 19022 if (!info->attrs[NL80211_ATTR_MAC] || 19023 !info->attrs[NL80211_ATTR_FILS_KEK] || 19024 !info->attrs[NL80211_ATTR_FILS_NONCES]) 19025 return -EINVAL; 19026 19027 fils_aad.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); 19028 fils_aad.kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); 19029 fils_aad.kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); 19030 nonces = nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); 19031 fils_aad.snonce = nonces; 19032 fils_aad.anonce = nonces + FILS_NONCE_LEN; 19033 19034 return rdev_set_fils_aad(rdev, dev, &fils_aad); 19035 } 19036 19037 static int nl80211_add_link(struct sk_buff *skb, struct genl_info *info) 19038 { 19039 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19040 unsigned int link_id = nl80211_link_id(info->attrs); 19041 struct net_device *dev = info->user_ptr[1]; 19042 struct wireless_dev *wdev = dev->ieee80211_ptr; 19043 int ret; 19044 19045 if (!(wdev->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO)) 19046 return -EINVAL; 19047 19048 switch (wdev->iftype) { 19049 case NL80211_IFTYPE_AP: 19050 break; 19051 default: 19052 return -EINVAL; 19053 } 19054 19055 if (!info->attrs[NL80211_ATTR_MAC] || 19056 !is_valid_ether_addr(nla_data(info->attrs[NL80211_ATTR_MAC]))) 19057 return -EINVAL; 19058 19059 wdev->valid_links |= BIT(link_id); 19060 ether_addr_copy(wdev->links[link_id].addr, 19061 nla_data(info->attrs[NL80211_ATTR_MAC])); 19062 19063 ret = rdev_add_intf_link(rdev, wdev, link_id); 19064 if (ret) { 19065 wdev->valid_links &= ~BIT(link_id); 19066 eth_zero_addr(wdev->links[link_id].addr); 19067 } 19068 19069 return ret; 19070 } 19071 19072 static int nl80211_remove_link(struct sk_buff *skb, struct genl_info *info) 19073 { 19074 unsigned int link_id = nl80211_link_id(info->attrs); 19075 struct net_device *dev = info->user_ptr[1]; 19076 struct wireless_dev *wdev = dev->ieee80211_ptr; 19077 19078 /* cannot remove if there's no link */ 19079 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) 19080 return -EINVAL; 19081 19082 switch (wdev->iftype) { 19083 case NL80211_IFTYPE_AP: 19084 break; 19085 default: 19086 return -EINVAL; 19087 } 19088 19089 cfg80211_remove_link(wdev, link_id); 19090 19091 return 0; 19092 } 19093 19094 static int 19095 nl80211_add_mod_link_station(struct sk_buff *skb, struct genl_info *info, 19096 bool add) 19097 { 19098 struct link_station_parameters params = {}; 19099 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19100 struct net_device *dev = info->user_ptr[1]; 19101 int err; 19102 19103 if ((add && !rdev->ops->add_link_station) || 19104 (!add && !rdev->ops->mod_link_station)) 19105 return -EOPNOTSUPP; 19106 19107 if (add && !info->attrs[NL80211_ATTR_MAC]) 19108 return -EINVAL; 19109 19110 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) 19111 return -EINVAL; 19112 19113 if (add && !info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 19114 return -EINVAL; 19115 19116 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 19117 19118 if (info->attrs[NL80211_ATTR_MAC]) { 19119 params.link_mac = nla_data(info->attrs[NL80211_ATTR_MAC]); 19120 if (!is_valid_ether_addr(params.link_mac)) 19121 return -EINVAL; 19122 } 19123 19124 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) 19125 return -EINVAL; 19126 19127 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); 19128 19129 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 19130 params.supported_rates = 19131 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 19132 params.supported_rates_len = 19133 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 19134 } 19135 19136 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 19137 params.ht_capa = 19138 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 19139 19140 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 19141 params.vht_capa = 19142 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 19143 19144 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 19145 params.he_capa = 19146 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 19147 params.he_capa_len = 19148 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 19149 19150 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { 19151 params.eht_capa = 19152 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 19153 params.eht_capa_len = 19154 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 19155 19156 if (!ieee80211_eht_capa_size_ok((const u8 *)params.he_capa, 19157 (const u8 *)params.eht_capa, 19158 params.eht_capa_len, 19159 false)) 19160 return -EINVAL; 19161 } 19162 } 19163 19164 if (info->attrs[NL80211_ATTR_UHR_CAPABILITY]) { 19165 if (!params.eht_capa) 19166 return -EINVAL; 19167 19168 params.uhr_capa = 19169 nla_data(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 19170 params.uhr_capa_len = 19171 nla_len(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 19172 } 19173 19174 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) 19175 params.he_6ghz_capa = 19176 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); 19177 19178 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 19179 params.opmode_notif_used = true; 19180 params.opmode_notif = 19181 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 19182 } 19183 19184 err = nl80211_parse_sta_txpower_setting(info, ¶ms.txpwr, 19185 ¶ms.txpwr_set); 19186 if (err) 19187 return err; 19188 19189 if (add) 19190 return rdev_add_link_station(rdev, dev, ¶ms); 19191 19192 return rdev_mod_link_station(rdev, dev, ¶ms); 19193 } 19194 19195 static int 19196 nl80211_add_link_station(struct sk_buff *skb, struct genl_info *info) 19197 { 19198 return nl80211_add_mod_link_station(skb, info, true); 19199 } 19200 19201 static int 19202 nl80211_modify_link_station(struct sk_buff *skb, struct genl_info *info) 19203 { 19204 return nl80211_add_mod_link_station(skb, info, false); 19205 } 19206 19207 static int 19208 nl80211_remove_link_station(struct sk_buff *skb, struct genl_info *info) 19209 { 19210 struct link_station_del_parameters params = {}; 19211 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19212 struct net_device *dev = info->user_ptr[1]; 19213 19214 if (!rdev->ops->del_link_station) 19215 return -EOPNOTSUPP; 19216 19217 if (!info->attrs[NL80211_ATTR_MLD_ADDR] || 19218 !info->attrs[NL80211_ATTR_MLO_LINK_ID]) 19219 return -EINVAL; 19220 19221 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 19222 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); 19223 19224 return rdev_del_link_station(rdev, dev, ¶ms); 19225 } 19226 19227 static int nl80211_set_hw_timestamp(struct sk_buff *skb, 19228 struct genl_info *info) 19229 { 19230 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19231 struct net_device *dev = info->user_ptr[1]; 19232 struct cfg80211_set_hw_timestamp hwts = {}; 19233 19234 if (!rdev->wiphy.hw_timestamp_max_peers) 19235 return -EOPNOTSUPP; 19236 19237 if (!info->attrs[NL80211_ATTR_MAC] && 19238 rdev->wiphy.hw_timestamp_max_peers != CFG80211_HW_TIMESTAMP_ALL_PEERS) 19239 return -EOPNOTSUPP; 19240 19241 if (info->attrs[NL80211_ATTR_MAC]) 19242 hwts.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); 19243 19244 hwts.enable = 19245 nla_get_flag(info->attrs[NL80211_ATTR_HW_TIMESTAMP_ENABLED]); 19246 19247 return rdev_set_hw_timestamp(rdev, dev, &hwts); 19248 } 19249 19250 static int 19251 nl80211_set_ttlm(struct sk_buff *skb, struct genl_info *info) 19252 { 19253 struct cfg80211_ttlm_params params = {}; 19254 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19255 struct net_device *dev = info->user_ptr[1]; 19256 struct wireless_dev *wdev = dev->ieee80211_ptr; 19257 19258 if (wdev->iftype != NL80211_IFTYPE_STATION && 19259 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 19260 return -EOPNOTSUPP; 19261 19262 if (!wdev->connected) 19263 return -ENOLINK; 19264 19265 if (!info->attrs[NL80211_ATTR_MLO_TTLM_DLINK] || 19266 !info->attrs[NL80211_ATTR_MLO_TTLM_ULINK]) 19267 return -EINVAL; 19268 19269 nla_memcpy(params.dlink, 19270 info->attrs[NL80211_ATTR_MLO_TTLM_DLINK], 19271 sizeof(params.dlink)); 19272 nla_memcpy(params.ulink, 19273 info->attrs[NL80211_ATTR_MLO_TTLM_ULINK], 19274 sizeof(params.ulink)); 19275 19276 return rdev_set_ttlm(rdev, dev, ¶ms); 19277 } 19278 19279 static int nl80211_assoc_ml_reconf(struct sk_buff *skb, struct genl_info *info) 19280 { 19281 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19282 struct net_device *dev = info->user_ptr[1]; 19283 struct wireless_dev *wdev = dev->ieee80211_ptr; 19284 struct cfg80211_ml_reconf_req req = {}; 19285 unsigned int link_id; 19286 u16 add_links; 19287 int err; 19288 19289 if (!wdev->valid_links) 19290 return -EINVAL; 19291 19292 if (dev->ieee80211_ptr->conn_owner_nlportid && 19293 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 19294 return -EPERM; 19295 19296 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 19297 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 19298 return -EOPNOTSUPP; 19299 19300 add_links = 0; 19301 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { 19302 err = nl80211_process_links(rdev, req.add_links, 19303 /* mark as MLO, but not assoc */ 19304 IEEE80211_MLD_MAX_NUM_LINKS, 19305 NULL, 0, info); 19306 if (err) 19307 return err; 19308 19309 for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS; 19310 link_id++) { 19311 if (!req.add_links[link_id].bss) 19312 continue; 19313 add_links |= BIT(link_id); 19314 } 19315 } 19316 19317 if (info->attrs[NL80211_ATTR_MLO_RECONF_REM_LINKS]) 19318 req.rem_links = 19319 nla_get_u16(info->attrs[NL80211_ATTR_MLO_RECONF_REM_LINKS]); 19320 19321 /* Validate that existing links are not added, removed links are valid 19322 * and don't allow adding and removing the same links 19323 */ 19324 if ((add_links & req.rem_links) || !(add_links | req.rem_links) || 19325 (wdev->valid_links & add_links) || 19326 ((wdev->valid_links & req.rem_links) != req.rem_links)) { 19327 err = -EINVAL; 19328 goto out; 19329 } 19330 19331 if (info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]) 19332 req.ext_mld_capa_ops = 19333 nla_get_u16(info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]); 19334 19335 err = cfg80211_assoc_ml_reconf(rdev, dev, &req); 19336 19337 out: 19338 for (link_id = 0; link_id < ARRAY_SIZE(req.add_links); link_id++) 19339 cfg80211_put_bss(&rdev->wiphy, req.add_links[link_id].bss); 19340 19341 return err; 19342 } 19343 19344 static int 19345 nl80211_epcs_cfg(struct sk_buff *skb, struct genl_info *info) 19346 { 19347 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19348 struct net_device *dev = info->user_ptr[1]; 19349 struct wireless_dev *wdev = dev->ieee80211_ptr; 19350 bool val; 19351 19352 if (wdev->iftype != NL80211_IFTYPE_STATION && 19353 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 19354 return -EOPNOTSUPP; 19355 19356 if (!wdev->connected) 19357 return -ENOLINK; 19358 19359 val = nla_get_flag(info->attrs[NL80211_ATTR_EPCS]); 19360 19361 return rdev_set_epcs(rdev, dev, val); 19362 } 19363 19364 #define NL80211_FLAG_NEED_WIPHY 0x01 19365 #define NL80211_FLAG_NEED_NETDEV 0x02 19366 #define NL80211_FLAG_NEED_RTNL 0x04 19367 #define NL80211_FLAG_CHECK_NETDEV_UP 0x08 19368 #define NL80211_FLAG_NEED_NETDEV_UP (NL80211_FLAG_NEED_NETDEV |\ 19369 NL80211_FLAG_CHECK_NETDEV_UP) 19370 #define NL80211_FLAG_NEED_WDEV 0x10 19371 /* If a netdev is associated, it must be UP, P2P must be started */ 19372 #define NL80211_FLAG_NEED_WDEV_UP (NL80211_FLAG_NEED_WDEV |\ 19373 NL80211_FLAG_CHECK_NETDEV_UP) 19374 #define NL80211_FLAG_CLEAR_SKB 0x20 19375 #define NL80211_FLAG_NO_WIPHY_MTX 0x40 19376 #define NL80211_FLAG_MLO_VALID_LINK_ID 0x80 19377 #define NL80211_FLAG_MLO_UNSUPPORTED 0x100 19378 19379 #define INTERNAL_FLAG_SELECTORS(__sel) \ 19380 SELECTOR(__sel, NONE, 0) /* must be first */ \ 19381 SELECTOR(__sel, WIPHY, \ 19382 NL80211_FLAG_NEED_WIPHY) \ 19383 SELECTOR(__sel, WDEV, \ 19384 NL80211_FLAG_NEED_WDEV) \ 19385 SELECTOR(__sel, NETDEV, \ 19386 NL80211_FLAG_NEED_NETDEV) \ 19387 SELECTOR(__sel, NETDEV_LINK, \ 19388 NL80211_FLAG_NEED_NETDEV | \ 19389 NL80211_FLAG_MLO_VALID_LINK_ID) \ 19390 SELECTOR(__sel, NETDEV_NO_MLO, \ 19391 NL80211_FLAG_NEED_NETDEV | \ 19392 NL80211_FLAG_MLO_UNSUPPORTED) \ 19393 SELECTOR(__sel, WIPHY_RTNL, \ 19394 NL80211_FLAG_NEED_WIPHY | \ 19395 NL80211_FLAG_NEED_RTNL) \ 19396 SELECTOR(__sel, WIPHY_RTNL_NOMTX, \ 19397 NL80211_FLAG_NEED_WIPHY | \ 19398 NL80211_FLAG_NEED_RTNL | \ 19399 NL80211_FLAG_NO_WIPHY_MTX) \ 19400 SELECTOR(__sel, WDEV_RTNL, \ 19401 NL80211_FLAG_NEED_WDEV | \ 19402 NL80211_FLAG_NEED_RTNL) \ 19403 SELECTOR(__sel, NETDEV_RTNL, \ 19404 NL80211_FLAG_NEED_NETDEV | \ 19405 NL80211_FLAG_NEED_RTNL) \ 19406 SELECTOR(__sel, NETDEV_UP, \ 19407 NL80211_FLAG_NEED_NETDEV_UP) \ 19408 SELECTOR(__sel, NETDEV_UP_LINK, \ 19409 NL80211_FLAG_NEED_NETDEV_UP | \ 19410 NL80211_FLAG_MLO_VALID_LINK_ID) \ 19411 SELECTOR(__sel, NETDEV_UP_NO_MLO, \ 19412 NL80211_FLAG_NEED_NETDEV_UP | \ 19413 NL80211_FLAG_MLO_UNSUPPORTED) \ 19414 SELECTOR(__sel, NETDEV_UP_NO_MLO_CLEAR, \ 19415 NL80211_FLAG_NEED_NETDEV_UP | \ 19416 NL80211_FLAG_CLEAR_SKB | \ 19417 NL80211_FLAG_MLO_UNSUPPORTED) \ 19418 SELECTOR(__sel, NETDEV_UP_NOTMX, \ 19419 NL80211_FLAG_NEED_NETDEV_UP | \ 19420 NL80211_FLAG_NO_WIPHY_MTX) \ 19421 SELECTOR(__sel, NETDEV_UP_NOTMX_MLO, \ 19422 NL80211_FLAG_NEED_NETDEV_UP | \ 19423 NL80211_FLAG_NO_WIPHY_MTX | \ 19424 NL80211_FLAG_MLO_VALID_LINK_ID) \ 19425 SELECTOR(__sel, NETDEV_UP_CLEAR, \ 19426 NL80211_FLAG_NEED_NETDEV_UP | \ 19427 NL80211_FLAG_CLEAR_SKB) \ 19428 SELECTOR(__sel, WDEV_UP, \ 19429 NL80211_FLAG_NEED_WDEV_UP) \ 19430 SELECTOR(__sel, WDEV_UP_CLEAR, \ 19431 NL80211_FLAG_NEED_WDEV_UP | \ 19432 NL80211_FLAG_CLEAR_SKB) \ 19433 SELECTOR(__sel, WDEV_UP_LINK, \ 19434 NL80211_FLAG_NEED_WDEV_UP | \ 19435 NL80211_FLAG_MLO_VALID_LINK_ID) \ 19436 SELECTOR(__sel, WDEV_UP_RTNL, \ 19437 NL80211_FLAG_NEED_WDEV_UP | \ 19438 NL80211_FLAG_NEED_RTNL) \ 19439 SELECTOR(__sel, WIPHY_CLEAR, \ 19440 NL80211_FLAG_NEED_WIPHY | \ 19441 NL80211_FLAG_CLEAR_SKB) \ 19442 SELECTOR(__sel, WDEV_UP_RTNL_NOMTX, \ 19443 NL80211_FLAG_NEED_WDEV_UP | \ 19444 NL80211_FLAG_NO_WIPHY_MTX | \ 19445 NL80211_FLAG_NEED_RTNL) 19446 19447 enum nl80211_internal_flags_selector { 19448 #define SELECTOR(_, name, value) NL80211_IFL_SEL_##name, 19449 INTERNAL_FLAG_SELECTORS(_) 19450 #undef SELECTOR 19451 }; 19452 19453 static u32 nl80211_internal_flags[] = { 19454 #define SELECTOR(_, name, value) [NL80211_IFL_SEL_##name] = value, 19455 INTERNAL_FLAG_SELECTORS(_) 19456 #undef SELECTOR 19457 }; 19458 19459 static int nl80211_pre_doit(const struct genl_split_ops *ops, 19460 struct sk_buff *skb, 19461 struct genl_info *info) 19462 { 19463 struct cfg80211_registered_device *rdev = NULL; 19464 struct wireless_dev *wdev = NULL; 19465 struct net_device *dev = NULL; 19466 u32 internal_flags; 19467 int err; 19468 19469 if (WARN_ON(ops->internal_flags >= ARRAY_SIZE(nl80211_internal_flags))) 19470 return -EINVAL; 19471 19472 internal_flags = nl80211_internal_flags[ops->internal_flags]; 19473 19474 rtnl_lock(); 19475 if (internal_flags & NL80211_FLAG_NEED_WIPHY) { 19476 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 19477 if (IS_ERR(rdev)) { 19478 err = PTR_ERR(rdev); 19479 goto out_unlock; 19480 } 19481 info->user_ptr[0] = rdev; 19482 } else if (internal_flags & NL80211_FLAG_NEED_NETDEV || 19483 internal_flags & NL80211_FLAG_NEED_WDEV) { 19484 wdev = __cfg80211_wdev_from_attrs(NULL, genl_info_net(info), 19485 info->attrs); 19486 if (IS_ERR(wdev)) { 19487 err = PTR_ERR(wdev); 19488 goto out_unlock; 19489 } 19490 19491 dev = wdev->netdev; 19492 dev_hold(dev); 19493 rdev = wiphy_to_rdev(wdev->wiphy); 19494 19495 if (internal_flags & NL80211_FLAG_NEED_NETDEV) { 19496 if (!dev) { 19497 err = -EINVAL; 19498 goto out_unlock; 19499 } 19500 19501 info->user_ptr[1] = dev; 19502 } else { 19503 info->user_ptr[1] = wdev; 19504 } 19505 19506 if (internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && 19507 !wdev_running(wdev)) { 19508 err = -ENETDOWN; 19509 goto out_unlock; 19510 } 19511 19512 info->user_ptr[0] = rdev; 19513 } 19514 19515 if (internal_flags & NL80211_FLAG_MLO_VALID_LINK_ID) { 19516 struct nlattr *link_id = info->attrs[NL80211_ATTR_MLO_LINK_ID]; 19517 19518 if (!wdev) { 19519 err = -EINVAL; 19520 goto out_unlock; 19521 } 19522 19523 /* MLO -> require valid link ID */ 19524 if (wdev->valid_links && 19525 (!link_id || 19526 !(wdev->valid_links & BIT(nla_get_u8(link_id))))) { 19527 err = -EINVAL; 19528 goto out_unlock; 19529 } 19530 19531 /* non-MLO -> no link ID attribute accepted */ 19532 if (!wdev->valid_links && link_id) { 19533 err = -EINVAL; 19534 goto out_unlock; 19535 } 19536 } 19537 19538 if (internal_flags & NL80211_FLAG_MLO_UNSUPPORTED) { 19539 if (info->attrs[NL80211_ATTR_MLO_LINK_ID] || 19540 (wdev && wdev->valid_links)) { 19541 err = -EINVAL; 19542 goto out_unlock; 19543 } 19544 } 19545 19546 if (rdev && !(internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) { 19547 wiphy_lock(&rdev->wiphy); 19548 /* we keep the mutex locked until post_doit */ 19549 __release(&rdev->wiphy.mtx); 19550 } 19551 if (!(internal_flags & NL80211_FLAG_NEED_RTNL)) 19552 rtnl_unlock(); 19553 19554 return 0; 19555 out_unlock: 19556 rtnl_unlock(); 19557 dev_put(dev); 19558 return err; 19559 } 19560 19561 static void nl80211_post_doit(const struct genl_split_ops *ops, 19562 struct sk_buff *skb, 19563 struct genl_info *info) 19564 { 19565 u32 internal_flags = nl80211_internal_flags[ops->internal_flags]; 19566 19567 if (info->user_ptr[1]) { 19568 if (internal_flags & NL80211_FLAG_NEED_WDEV) { 19569 struct wireless_dev *wdev = info->user_ptr[1]; 19570 19571 dev_put(wdev->netdev); 19572 } else { 19573 dev_put(info->user_ptr[1]); 19574 } 19575 } 19576 19577 if (info->user_ptr[0] && 19578 !(internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) { 19579 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19580 19581 /* we kept the mutex locked since pre_doit */ 19582 __acquire(&rdev->wiphy.mtx); 19583 wiphy_unlock(&rdev->wiphy); 19584 } 19585 19586 if (internal_flags & NL80211_FLAG_NEED_RTNL) 19587 rtnl_unlock(); 19588 19589 /* If needed, clear the netlink message payload from the SKB 19590 * as it might contain key data that shouldn't stick around on 19591 * the heap after the SKB is freed. The netlink message header 19592 * is still needed for further processing, so leave it intact. 19593 */ 19594 if (internal_flags & NL80211_FLAG_CLEAR_SKB) { 19595 struct nlmsghdr *nlh = nlmsg_hdr(skb); 19596 19597 memset(nlmsg_data(nlh), 0, nlmsg_len(nlh)); 19598 } 19599 } 19600 19601 static int nl80211_set_sar_sub_specs(struct cfg80211_registered_device *rdev, 19602 struct cfg80211_sar_specs *sar_specs, 19603 struct nlattr *spec[], int index) 19604 { 19605 u32 range_index, i; 19606 19607 if (!sar_specs || !spec) 19608 return -EINVAL; 19609 19610 if (!spec[NL80211_SAR_ATTR_SPECS_POWER] || 19611 !spec[NL80211_SAR_ATTR_SPECS_RANGE_INDEX]) 19612 return -EINVAL; 19613 19614 range_index = nla_get_u32(spec[NL80211_SAR_ATTR_SPECS_RANGE_INDEX]); 19615 19616 /* check if range_index exceeds num_freq_ranges */ 19617 if (range_index >= rdev->wiphy.sar_capa->num_freq_ranges) 19618 return -EINVAL; 19619 19620 /* check if range_index duplicates */ 19621 for (i = 0; i < index; i++) { 19622 if (sar_specs->sub_specs[i].freq_range_index == range_index) 19623 return -EINVAL; 19624 } 19625 19626 sar_specs->sub_specs[index].power = 19627 nla_get_s32(spec[NL80211_SAR_ATTR_SPECS_POWER]); 19628 19629 sar_specs->sub_specs[index].freq_range_index = range_index; 19630 19631 return 0; 19632 } 19633 19634 static int nl80211_set_sar_specs(struct sk_buff *skb, struct genl_info *info) 19635 { 19636 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19637 struct nlattr *spec[NL80211_SAR_ATTR_SPECS_MAX + 1]; 19638 struct nlattr *tb[NL80211_SAR_ATTR_MAX + 1]; 19639 struct cfg80211_sar_specs *sar_spec; 19640 enum nl80211_sar_type type; 19641 struct nlattr *spec_list; 19642 u32 specs; 19643 int rem, err; 19644 19645 if (!rdev->wiphy.sar_capa || !rdev->ops->set_sar_specs) 19646 return -EOPNOTSUPP; 19647 19648 if (!info->attrs[NL80211_ATTR_SAR_SPEC]) 19649 return -EINVAL; 19650 19651 nla_parse_nested(tb, NL80211_SAR_ATTR_MAX, 19652 info->attrs[NL80211_ATTR_SAR_SPEC], 19653 NULL, NULL); 19654 19655 if (!tb[NL80211_SAR_ATTR_TYPE] || !tb[NL80211_SAR_ATTR_SPECS]) 19656 return -EINVAL; 19657 19658 type = nla_get_u32(tb[NL80211_SAR_ATTR_TYPE]); 19659 if (type != rdev->wiphy.sar_capa->type) 19660 return -EINVAL; 19661 19662 specs = 0; 19663 nla_for_each_nested(spec_list, tb[NL80211_SAR_ATTR_SPECS], rem) 19664 specs++; 19665 19666 if (specs > rdev->wiphy.sar_capa->num_freq_ranges) 19667 return -EINVAL; 19668 19669 sar_spec = kzalloc_flex(*sar_spec, sub_specs, specs); 19670 if (!sar_spec) 19671 return -ENOMEM; 19672 19673 sar_spec->num_sub_specs = specs; 19674 sar_spec->type = type; 19675 specs = 0; 19676 nla_for_each_nested(spec_list, tb[NL80211_SAR_ATTR_SPECS], rem) { 19677 nla_parse_nested(spec, NL80211_SAR_ATTR_SPECS_MAX, 19678 spec_list, NULL, NULL); 19679 19680 switch (type) { 19681 case NL80211_SAR_TYPE_POWER: 19682 if (nl80211_set_sar_sub_specs(rdev, sar_spec, 19683 spec, specs)) { 19684 err = -EINVAL; 19685 goto error; 19686 } 19687 break; 19688 default: 19689 err = -EINVAL; 19690 goto error; 19691 } 19692 specs++; 19693 } 19694 19695 sar_spec->num_sub_specs = specs; 19696 19697 rdev->cur_cmd_info = info; 19698 err = rdev_set_sar_specs(rdev, sar_spec); 19699 rdev->cur_cmd_info = NULL; 19700 error: 19701 kfree(sar_spec); 19702 return err; 19703 } 19704 19705 #define SELECTOR(__sel, name, value) \ 19706 ((__sel) == (value)) ? NL80211_IFL_SEL_##name : 19707 int __missing_selector(void); 19708 #define IFLAGS(__val) INTERNAL_FLAG_SELECTORS(__val) __missing_selector() 19709 19710 static const struct genl_ops nl80211_ops[] = { 19711 { 19712 .cmd = NL80211_CMD_GET_WIPHY, 19713 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19714 .doit = nl80211_get_wiphy, 19715 .dumpit = nl80211_dump_wiphy, 19716 .done = nl80211_dump_wiphy_done, 19717 /* can be retrieved by unprivileged users */ 19718 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 19719 }, 19720 { 19721 .cmd = NL80211_CMD_GET_STATION, 19722 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19723 .doit = nl80211_get_station, 19724 .dumpit = nl80211_dump_station, 19725 .done = nl80211_dump_station_done, 19726 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV), 19727 }, 19728 }; 19729 19730 static const struct genl_small_ops nl80211_small_ops[] = { 19731 { 19732 .cmd = NL80211_CMD_SET_WIPHY, 19733 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19734 .doit = nl80211_set_wiphy, 19735 .flags = GENL_UNS_ADMIN_PERM, 19736 }, 19737 { 19738 .cmd = NL80211_CMD_GET_INTERFACE, 19739 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19740 .doit = nl80211_get_interface, 19741 .dumpit = nl80211_dump_interface, 19742 /* can be retrieved by unprivileged users */ 19743 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV), 19744 }, 19745 { 19746 .cmd = NL80211_CMD_SET_INTERFACE, 19747 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19748 .doit = nl80211_set_interface, 19749 .flags = GENL_UNS_ADMIN_PERM, 19750 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 19751 NL80211_FLAG_NEED_RTNL), 19752 }, 19753 { 19754 .cmd = NL80211_CMD_NEW_INTERFACE, 19755 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19756 .doit = nl80211_new_interface, 19757 .flags = GENL_UNS_ADMIN_PERM, 19758 .internal_flags = 19759 IFLAGS(NL80211_FLAG_NEED_WIPHY | 19760 NL80211_FLAG_NEED_RTNL | 19761 /* we take the wiphy mutex later ourselves */ 19762 NL80211_FLAG_NO_WIPHY_MTX), 19763 }, 19764 { 19765 .cmd = NL80211_CMD_DEL_INTERFACE, 19766 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19767 .doit = nl80211_del_interface, 19768 .flags = GENL_UNS_ADMIN_PERM, 19769 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 19770 NL80211_FLAG_NEED_RTNL), 19771 }, 19772 { 19773 .cmd = NL80211_CMD_GET_KEY, 19774 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19775 .doit = nl80211_get_key, 19776 .flags = GENL_UNS_ADMIN_PERM, 19777 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19778 }, 19779 { 19780 .cmd = NL80211_CMD_SET_KEY, 19781 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19782 .doit = nl80211_set_key, 19783 .flags = GENL_UNS_ADMIN_PERM, 19784 /* cannot use NL80211_FLAG_MLO_VALID_LINK_ID, depends on key */ 19785 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 19786 NL80211_FLAG_CLEAR_SKB), 19787 }, 19788 { 19789 .cmd = NL80211_CMD_NEW_KEY, 19790 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19791 .doit = nl80211_new_key, 19792 .flags = GENL_UNS_ADMIN_PERM, 19793 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 19794 NL80211_FLAG_CLEAR_SKB), 19795 }, 19796 { 19797 .cmd = NL80211_CMD_DEL_KEY, 19798 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19799 .doit = nl80211_del_key, 19800 .flags = GENL_UNS_ADMIN_PERM, 19801 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19802 }, 19803 { 19804 .cmd = NL80211_CMD_SET_BEACON, 19805 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19806 .flags = GENL_UNS_ADMIN_PERM, 19807 .doit = nl80211_set_beacon, 19808 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19809 NL80211_FLAG_MLO_VALID_LINK_ID), 19810 }, 19811 { 19812 .cmd = NL80211_CMD_START_AP, 19813 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19814 .flags = GENL_UNS_ADMIN_PERM, 19815 .doit = nl80211_start_ap, 19816 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19817 NL80211_FLAG_MLO_VALID_LINK_ID), 19818 }, 19819 { 19820 .cmd = NL80211_CMD_STOP_AP, 19821 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19822 .flags = GENL_UNS_ADMIN_PERM, 19823 .doit = nl80211_stop_ap, 19824 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19825 NL80211_FLAG_MLO_VALID_LINK_ID), 19826 }, 19827 { 19828 .cmd = NL80211_CMD_SET_STATION, 19829 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19830 .doit = nl80211_set_station, 19831 .flags = GENL_UNS_ADMIN_PERM, 19832 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19833 }, 19834 { 19835 .cmd = NL80211_CMD_NEW_STATION, 19836 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19837 .doit = nl80211_new_station, 19838 .flags = GENL_UNS_ADMIN_PERM, 19839 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19840 }, 19841 { 19842 .cmd = NL80211_CMD_DEL_STATION, 19843 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19844 .doit = nl80211_del_station, 19845 .flags = GENL_UNS_ADMIN_PERM, 19846 /* cannot use NL80211_FLAG_MLO_VALID_LINK_ID, depends on 19847 * whether MAC address is passed or not. If MAC address is 19848 * passed, then even during MLO, link ID is not required. 19849 */ 19850 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19851 }, 19852 { 19853 .cmd = NL80211_CMD_GET_MPATH, 19854 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19855 .doit = nl80211_get_mpath, 19856 .dumpit = nl80211_dump_mpath, 19857 .flags = GENL_UNS_ADMIN_PERM, 19858 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19859 }, 19860 { 19861 .cmd = NL80211_CMD_GET_MPP, 19862 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19863 .doit = nl80211_get_mpp, 19864 .dumpit = nl80211_dump_mpp, 19865 .flags = GENL_UNS_ADMIN_PERM, 19866 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19867 }, 19868 { 19869 .cmd = NL80211_CMD_SET_MPATH, 19870 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19871 .doit = nl80211_set_mpath, 19872 .flags = GENL_UNS_ADMIN_PERM, 19873 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19874 }, 19875 { 19876 .cmd = NL80211_CMD_NEW_MPATH, 19877 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19878 .doit = nl80211_new_mpath, 19879 .flags = GENL_UNS_ADMIN_PERM, 19880 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19881 }, 19882 { 19883 .cmd = NL80211_CMD_DEL_MPATH, 19884 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19885 .doit = nl80211_del_mpath, 19886 .flags = GENL_UNS_ADMIN_PERM, 19887 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19888 }, 19889 { 19890 .cmd = NL80211_CMD_SET_BSS, 19891 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19892 .doit = nl80211_set_bss, 19893 .flags = GENL_UNS_ADMIN_PERM, 19894 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19895 NL80211_FLAG_MLO_VALID_LINK_ID), 19896 }, 19897 { 19898 .cmd = NL80211_CMD_GET_REG, 19899 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19900 .doit = nl80211_get_reg_do, 19901 .dumpit = nl80211_get_reg_dump, 19902 /* can be retrieved by unprivileged users */ 19903 }, 19904 #ifdef CONFIG_CFG80211_CRDA_SUPPORT 19905 { 19906 .cmd = NL80211_CMD_SET_REG, 19907 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19908 .doit = nl80211_set_reg, 19909 .flags = GENL_ADMIN_PERM, 19910 }, 19911 #endif 19912 { 19913 .cmd = NL80211_CMD_REQ_SET_REG, 19914 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19915 .doit = nl80211_req_set_reg, 19916 .flags = GENL_ADMIN_PERM, 19917 }, 19918 { 19919 .cmd = NL80211_CMD_RELOAD_REGDB, 19920 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19921 .doit = nl80211_reload_regdb, 19922 .flags = GENL_ADMIN_PERM, 19923 }, 19924 { 19925 .cmd = NL80211_CMD_GET_MESH_CONFIG, 19926 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19927 .doit = nl80211_get_mesh_config, 19928 /* can be retrieved by unprivileged users */ 19929 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19930 }, 19931 { 19932 .cmd = NL80211_CMD_SET_MESH_CONFIG, 19933 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19934 .doit = nl80211_update_mesh_config, 19935 .flags = GENL_UNS_ADMIN_PERM, 19936 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19937 }, 19938 { 19939 .cmd = NL80211_CMD_TRIGGER_SCAN, 19940 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19941 .doit = nl80211_trigger_scan, 19942 .flags = GENL_UNS_ADMIN_PERM, 19943 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19944 }, 19945 { 19946 .cmd = NL80211_CMD_ABORT_SCAN, 19947 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19948 .doit = nl80211_abort_scan, 19949 .flags = GENL_UNS_ADMIN_PERM, 19950 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19951 }, 19952 { 19953 .cmd = NL80211_CMD_GET_SCAN, 19954 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19955 .dumpit = nl80211_dump_scan, 19956 }, 19957 { 19958 .cmd = NL80211_CMD_START_SCHED_SCAN, 19959 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19960 .doit = nl80211_start_sched_scan, 19961 .flags = GENL_UNS_ADMIN_PERM, 19962 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19963 }, 19964 { 19965 .cmd = NL80211_CMD_STOP_SCHED_SCAN, 19966 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19967 .doit = nl80211_stop_sched_scan, 19968 .flags = GENL_UNS_ADMIN_PERM, 19969 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19970 }, 19971 { 19972 .cmd = NL80211_CMD_AUTHENTICATE, 19973 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19974 .doit = nl80211_authenticate, 19975 .flags = GENL_UNS_ADMIN_PERM, 19976 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19977 NL80211_FLAG_CLEAR_SKB), 19978 }, 19979 { 19980 .cmd = NL80211_CMD_ASSOCIATE, 19981 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19982 .doit = nl80211_associate, 19983 .flags = GENL_UNS_ADMIN_PERM, 19984 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19985 NL80211_FLAG_CLEAR_SKB), 19986 }, 19987 { 19988 .cmd = NL80211_CMD_DEAUTHENTICATE, 19989 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19990 .doit = nl80211_deauthenticate, 19991 .flags = GENL_UNS_ADMIN_PERM, 19992 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19993 }, 19994 { 19995 .cmd = NL80211_CMD_DISASSOCIATE, 19996 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19997 .doit = nl80211_disassociate, 19998 .flags = GENL_UNS_ADMIN_PERM, 19999 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20000 }, 20001 { 20002 .cmd = NL80211_CMD_JOIN_IBSS, 20003 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20004 .doit = nl80211_join_ibss, 20005 .flags = GENL_UNS_ADMIN_PERM, 20006 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20007 }, 20008 { 20009 .cmd = NL80211_CMD_LEAVE_IBSS, 20010 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20011 .doit = nl80211_leave_ibss, 20012 .flags = GENL_UNS_ADMIN_PERM, 20013 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20014 }, 20015 #ifdef CONFIG_NL80211_TESTMODE 20016 { 20017 .cmd = NL80211_CMD_TESTMODE, 20018 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20019 .doit = nl80211_testmode_do, 20020 .dumpit = nl80211_testmode_dump, 20021 .flags = GENL_UNS_ADMIN_PERM, 20022 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20023 }, 20024 #endif 20025 { 20026 .cmd = NL80211_CMD_CONNECT, 20027 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20028 .doit = nl80211_connect, 20029 .flags = GENL_UNS_ADMIN_PERM, 20030 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20031 NL80211_FLAG_CLEAR_SKB), 20032 }, 20033 { 20034 .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS, 20035 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20036 .doit = nl80211_update_connect_params, 20037 .flags = GENL_ADMIN_PERM, 20038 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20039 NL80211_FLAG_CLEAR_SKB), 20040 }, 20041 { 20042 .cmd = NL80211_CMD_DISCONNECT, 20043 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20044 .doit = nl80211_disconnect, 20045 .flags = GENL_UNS_ADMIN_PERM, 20046 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20047 }, 20048 { 20049 .cmd = NL80211_CMD_SET_WIPHY_NETNS, 20050 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20051 .doit = nl80211_wiphy_netns, 20052 .flags = GENL_UNS_ADMIN_PERM, 20053 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY | 20054 NL80211_FLAG_NEED_RTNL | 20055 NL80211_FLAG_NO_WIPHY_MTX), 20056 }, 20057 { 20058 .cmd = NL80211_CMD_GET_SURVEY, 20059 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20060 .dumpit = nl80211_dump_survey, 20061 }, 20062 { 20063 .cmd = NL80211_CMD_SET_PMKSA, 20064 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20065 .doit = nl80211_set_pmksa, 20066 .flags = GENL_UNS_ADMIN_PERM, 20067 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20068 NL80211_FLAG_CLEAR_SKB), 20069 }, 20070 { 20071 .cmd = NL80211_CMD_DEL_PMKSA, 20072 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20073 .doit = nl80211_del_pmksa, 20074 .flags = GENL_UNS_ADMIN_PERM, 20075 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20076 }, 20077 { 20078 .cmd = NL80211_CMD_FLUSH_PMKSA, 20079 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20080 .doit = nl80211_flush_pmksa, 20081 .flags = GENL_UNS_ADMIN_PERM, 20082 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20083 }, 20084 { 20085 .cmd = NL80211_CMD_REMAIN_ON_CHANNEL, 20086 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20087 .doit = nl80211_remain_on_channel, 20088 .flags = GENL_UNS_ADMIN_PERM, 20089 /* FIXME: requiring a link ID here is probably not good */ 20090 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 20091 NL80211_FLAG_MLO_VALID_LINK_ID), 20092 }, 20093 { 20094 .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 20095 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20096 .doit = nl80211_cancel_remain_on_channel, 20097 .flags = GENL_UNS_ADMIN_PERM, 20098 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20099 }, 20100 { 20101 .cmd = NL80211_CMD_SET_TX_BITRATE_MASK, 20102 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20103 .doit = nl80211_set_tx_bitrate_mask, 20104 .flags = GENL_UNS_ADMIN_PERM, 20105 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 20106 NL80211_FLAG_MLO_VALID_LINK_ID), 20107 }, 20108 { 20109 .cmd = NL80211_CMD_REGISTER_FRAME, 20110 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20111 .doit = nl80211_register_mgmt, 20112 .flags = GENL_UNS_ADMIN_PERM, 20113 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV), 20114 }, 20115 { 20116 .cmd = NL80211_CMD_FRAME, 20117 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20118 .doit = nl80211_tx_mgmt, 20119 .flags = GENL_UNS_ADMIN_PERM, 20120 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20121 }, 20122 { 20123 .cmd = NL80211_CMD_FRAME_WAIT_CANCEL, 20124 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20125 .doit = nl80211_tx_mgmt_cancel_wait, 20126 .flags = GENL_UNS_ADMIN_PERM, 20127 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20128 }, 20129 { 20130 .cmd = NL80211_CMD_SET_POWER_SAVE, 20131 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20132 .doit = nl80211_set_power_save, 20133 .flags = GENL_UNS_ADMIN_PERM, 20134 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20135 }, 20136 { 20137 .cmd = NL80211_CMD_GET_POWER_SAVE, 20138 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20139 .doit = nl80211_get_power_save, 20140 /* can be retrieved by unprivileged users */ 20141 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20142 }, 20143 { 20144 .cmd = NL80211_CMD_SET_CQM, 20145 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20146 .doit = nl80211_set_cqm, 20147 .flags = GENL_UNS_ADMIN_PERM, 20148 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20149 }, 20150 { 20151 .cmd = NL80211_CMD_SET_CHANNEL, 20152 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20153 .doit = nl80211_set_channel, 20154 .flags = GENL_UNS_ADMIN_PERM, 20155 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 20156 NL80211_FLAG_MLO_VALID_LINK_ID), 20157 }, 20158 { 20159 .cmd = NL80211_CMD_JOIN_MESH, 20160 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20161 .doit = nl80211_join_mesh, 20162 .flags = GENL_UNS_ADMIN_PERM, 20163 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20164 }, 20165 { 20166 .cmd = NL80211_CMD_LEAVE_MESH, 20167 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20168 .doit = nl80211_leave_mesh, 20169 .flags = GENL_UNS_ADMIN_PERM, 20170 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20171 }, 20172 { 20173 .cmd = NL80211_CMD_JOIN_OCB, 20174 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20175 .doit = nl80211_join_ocb, 20176 .flags = GENL_UNS_ADMIN_PERM, 20177 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20178 }, 20179 { 20180 .cmd = NL80211_CMD_LEAVE_OCB, 20181 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20182 .doit = nl80211_leave_ocb, 20183 .flags = GENL_UNS_ADMIN_PERM, 20184 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20185 }, 20186 #ifdef CONFIG_PM 20187 { 20188 .cmd = NL80211_CMD_GET_WOWLAN, 20189 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20190 .doit = nl80211_get_wowlan, 20191 /* can be retrieved by unprivileged users */ 20192 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20193 }, 20194 { 20195 .cmd = NL80211_CMD_SET_WOWLAN, 20196 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20197 .doit = nl80211_set_wowlan, 20198 .flags = GENL_UNS_ADMIN_PERM, 20199 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20200 }, 20201 #endif 20202 { 20203 .cmd = NL80211_CMD_SET_REKEY_OFFLOAD, 20204 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20205 .doit = nl80211_set_rekey_data, 20206 .flags = GENL_UNS_ADMIN_PERM, 20207 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20208 NL80211_FLAG_CLEAR_SKB), 20209 }, 20210 { 20211 .cmd = NL80211_CMD_TDLS_MGMT, 20212 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20213 .doit = nl80211_tdls_mgmt, 20214 .flags = GENL_UNS_ADMIN_PERM, 20215 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20216 NL80211_FLAG_MLO_VALID_LINK_ID), 20217 }, 20218 { 20219 .cmd = NL80211_CMD_TDLS_OPER, 20220 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20221 .doit = nl80211_tdls_oper, 20222 .flags = GENL_UNS_ADMIN_PERM, 20223 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20224 }, 20225 { 20226 .cmd = NL80211_CMD_UNEXPECTED_FRAME, 20227 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20228 .doit = nl80211_register_unexpected_frame, 20229 .flags = GENL_UNS_ADMIN_PERM, 20230 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20231 }, 20232 { 20233 .cmd = NL80211_CMD_PROBE_PEER, 20234 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20235 .doit = nl80211_probe_peer, 20236 .flags = GENL_UNS_ADMIN_PERM, 20237 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20238 }, 20239 { 20240 .cmd = NL80211_CMD_REGISTER_BEACONS, 20241 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20242 .doit = nl80211_register_beacons, 20243 .flags = GENL_UNS_ADMIN_PERM, 20244 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20245 }, 20246 { 20247 .cmd = NL80211_CMD_SET_NOACK_MAP, 20248 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20249 .doit = nl80211_set_noack_map, 20250 .flags = GENL_UNS_ADMIN_PERM, 20251 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20252 }, 20253 { 20254 .cmd = NL80211_CMD_START_P2P_DEVICE, 20255 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20256 .doit = nl80211_start_p2p_device, 20257 .flags = GENL_UNS_ADMIN_PERM, 20258 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 20259 NL80211_FLAG_NEED_RTNL), 20260 }, 20261 { 20262 .cmd = NL80211_CMD_STOP_P2P_DEVICE, 20263 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20264 .doit = nl80211_stop_p2p_device, 20265 .flags = GENL_UNS_ADMIN_PERM, 20266 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 20267 NL80211_FLAG_NEED_RTNL), 20268 }, 20269 { 20270 .cmd = NL80211_CMD_START_NAN, 20271 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20272 .doit = nl80211_start_nan, 20273 .flags = GENL_ADMIN_PERM, 20274 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 20275 NL80211_FLAG_NEED_RTNL), 20276 }, 20277 { 20278 .cmd = NL80211_CMD_STOP_NAN, 20279 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20280 .doit = nl80211_stop_nan, 20281 .flags = GENL_ADMIN_PERM, 20282 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 20283 NL80211_FLAG_NO_WIPHY_MTX | 20284 NL80211_FLAG_NEED_RTNL), 20285 }, 20286 { 20287 .cmd = NL80211_CMD_ADD_NAN_FUNCTION, 20288 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20289 .doit = nl80211_nan_add_func, 20290 .flags = GENL_ADMIN_PERM, 20291 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20292 }, 20293 { 20294 .cmd = NL80211_CMD_DEL_NAN_FUNCTION, 20295 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20296 .doit = nl80211_nan_del_func, 20297 .flags = GENL_ADMIN_PERM, 20298 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20299 }, 20300 { 20301 .cmd = NL80211_CMD_CHANGE_NAN_CONFIG, 20302 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20303 .doit = nl80211_nan_change_config, 20304 .flags = GENL_ADMIN_PERM, 20305 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20306 }, 20307 { 20308 .cmd = NL80211_CMD_START_PD, 20309 .doit = nl80211_start_pd, 20310 .flags = GENL_ADMIN_PERM, 20311 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 20312 NL80211_FLAG_NEED_RTNL), 20313 }, 20314 { 20315 .cmd = NL80211_CMD_STOP_PD, 20316 .doit = nl80211_stop_pd, 20317 .flags = GENL_ADMIN_PERM, 20318 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 20319 NL80211_FLAG_NEED_RTNL), 20320 }, 20321 { 20322 .cmd = NL80211_CMD_SET_MCAST_RATE, 20323 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20324 .doit = nl80211_set_mcast_rate, 20325 .flags = GENL_UNS_ADMIN_PERM, 20326 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20327 }, 20328 { 20329 .cmd = NL80211_CMD_SET_MAC_ACL, 20330 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20331 .doit = nl80211_set_mac_acl, 20332 .flags = GENL_UNS_ADMIN_PERM, 20333 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 20334 NL80211_FLAG_MLO_UNSUPPORTED), 20335 }, 20336 { 20337 .cmd = NL80211_CMD_RADAR_DETECT, 20338 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20339 .doit = nl80211_start_radar_detection, 20340 .flags = GENL_UNS_ADMIN_PERM, 20341 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20342 NL80211_FLAG_NO_WIPHY_MTX | 20343 NL80211_FLAG_MLO_VALID_LINK_ID), 20344 }, 20345 { 20346 .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES, 20347 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20348 .doit = nl80211_get_protocol_features, 20349 }, 20350 { 20351 .cmd = NL80211_CMD_UPDATE_FT_IES, 20352 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20353 .doit = nl80211_update_ft_ies, 20354 .flags = GENL_UNS_ADMIN_PERM, 20355 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20356 }, 20357 { 20358 .cmd = NL80211_CMD_CRIT_PROTOCOL_START, 20359 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20360 .doit = nl80211_crit_protocol_start, 20361 .flags = GENL_UNS_ADMIN_PERM, 20362 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20363 }, 20364 { 20365 .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP, 20366 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20367 .doit = nl80211_crit_protocol_stop, 20368 .flags = GENL_UNS_ADMIN_PERM, 20369 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20370 }, 20371 { 20372 .cmd = NL80211_CMD_GET_COALESCE, 20373 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20374 .doit = nl80211_get_coalesce, 20375 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20376 }, 20377 { 20378 .cmd = NL80211_CMD_SET_COALESCE, 20379 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20380 .doit = nl80211_set_coalesce, 20381 .flags = GENL_UNS_ADMIN_PERM, 20382 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20383 }, 20384 { 20385 .cmd = NL80211_CMD_CHANNEL_SWITCH, 20386 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20387 .doit = nl80211_channel_switch, 20388 .flags = GENL_UNS_ADMIN_PERM, 20389 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20390 NL80211_FLAG_MLO_VALID_LINK_ID), 20391 }, 20392 { 20393 .cmd = NL80211_CMD_VENDOR, 20394 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20395 .doit = nl80211_vendor_cmd, 20396 .dumpit = nl80211_vendor_cmd_dump, 20397 .flags = GENL_UNS_ADMIN_PERM, 20398 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY | 20399 NL80211_FLAG_CLEAR_SKB), 20400 }, 20401 { 20402 .cmd = NL80211_CMD_SET_QOS_MAP, 20403 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20404 .doit = nl80211_set_qos_map, 20405 .flags = GENL_UNS_ADMIN_PERM, 20406 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20407 }, 20408 { 20409 .cmd = NL80211_CMD_ADD_TX_TS, 20410 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20411 .doit = nl80211_add_tx_ts, 20412 .flags = GENL_UNS_ADMIN_PERM, 20413 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20414 NL80211_FLAG_MLO_UNSUPPORTED), 20415 }, 20416 { 20417 .cmd = NL80211_CMD_DEL_TX_TS, 20418 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20419 .doit = nl80211_del_tx_ts, 20420 .flags = GENL_UNS_ADMIN_PERM, 20421 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20422 }, 20423 { 20424 .cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH, 20425 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20426 .doit = nl80211_tdls_channel_switch, 20427 .flags = GENL_UNS_ADMIN_PERM, 20428 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20429 }, 20430 { 20431 .cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, 20432 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20433 .doit = nl80211_tdls_cancel_channel_switch, 20434 .flags = GENL_UNS_ADMIN_PERM, 20435 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20436 }, 20437 { 20438 .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST, 20439 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20440 .doit = nl80211_set_multicast_to_unicast, 20441 .flags = GENL_UNS_ADMIN_PERM, 20442 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20443 }, 20444 { 20445 .cmd = NL80211_CMD_SET_PMK, 20446 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20447 .doit = nl80211_set_pmk, 20448 .flags = GENL_UNS_ADMIN_PERM, 20449 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20450 NL80211_FLAG_CLEAR_SKB), 20451 }, 20452 { 20453 .cmd = NL80211_CMD_DEL_PMK, 20454 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20455 .doit = nl80211_del_pmk, 20456 .flags = GENL_UNS_ADMIN_PERM, 20457 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20458 }, 20459 { 20460 .cmd = NL80211_CMD_EXTERNAL_AUTH, 20461 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20462 .doit = nl80211_external_auth, 20463 .flags = GENL_ADMIN_PERM, 20464 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20465 }, 20466 { 20467 .cmd = NL80211_CMD_CONTROL_PORT_FRAME, 20468 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20469 .doit = nl80211_tx_control_port, 20470 .flags = GENL_UNS_ADMIN_PERM, 20471 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20472 }, 20473 { 20474 .cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS, 20475 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20476 .doit = nl80211_get_ftm_responder_stats, 20477 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 20478 NL80211_FLAG_MLO_VALID_LINK_ID), 20479 }, 20480 { 20481 .cmd = NL80211_CMD_PEER_MEASUREMENT_START, 20482 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20483 .doit = nl80211_pmsr_start, 20484 .flags = GENL_UNS_ADMIN_PERM, 20485 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20486 }, 20487 { 20488 .cmd = NL80211_CMD_NOTIFY_RADAR, 20489 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20490 .doit = nl80211_notify_radar_detection, 20491 .flags = GENL_UNS_ADMIN_PERM, 20492 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20493 }, 20494 { 20495 .cmd = NL80211_CMD_UPDATE_OWE_INFO, 20496 .doit = nl80211_update_owe_info, 20497 .flags = GENL_ADMIN_PERM, 20498 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20499 }, 20500 { 20501 .cmd = NL80211_CMD_PROBE_MESH_LINK, 20502 .doit = nl80211_probe_mesh_link, 20503 .flags = GENL_UNS_ADMIN_PERM, 20504 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20505 }, 20506 { 20507 .cmd = NL80211_CMD_SET_TID_CONFIG, 20508 .doit = nl80211_set_tid_config, 20509 .flags = GENL_UNS_ADMIN_PERM, 20510 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 20511 NL80211_FLAG_MLO_VALID_LINK_ID), 20512 }, 20513 { 20514 .cmd = NL80211_CMD_SET_SAR_SPECS, 20515 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20516 .doit = nl80211_set_sar_specs, 20517 .flags = GENL_UNS_ADMIN_PERM, 20518 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY | 20519 NL80211_FLAG_NEED_RTNL), 20520 }, 20521 { 20522 .cmd = NL80211_CMD_COLOR_CHANGE_REQUEST, 20523 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20524 .doit = nl80211_color_change, 20525 .flags = GENL_UNS_ADMIN_PERM, 20526 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20527 NL80211_FLAG_MLO_VALID_LINK_ID), 20528 }, 20529 { 20530 .cmd = NL80211_CMD_SET_FILS_AAD, 20531 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20532 .doit = nl80211_set_fils_aad, 20533 .flags = GENL_UNS_ADMIN_PERM, 20534 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20535 }, 20536 { 20537 .cmd = NL80211_CMD_ADD_LINK, 20538 .doit = nl80211_add_link, 20539 .flags = GENL_UNS_ADMIN_PERM, 20540 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20541 }, 20542 { 20543 .cmd = NL80211_CMD_REMOVE_LINK, 20544 .doit = nl80211_remove_link, 20545 .flags = GENL_UNS_ADMIN_PERM, 20546 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20547 NL80211_FLAG_MLO_VALID_LINK_ID), 20548 }, 20549 { 20550 .cmd = NL80211_CMD_ADD_LINK_STA, 20551 .doit = nl80211_add_link_station, 20552 .flags = GENL_UNS_ADMIN_PERM, 20553 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20554 NL80211_FLAG_MLO_VALID_LINK_ID), 20555 }, 20556 { 20557 .cmd = NL80211_CMD_MODIFY_LINK_STA, 20558 .doit = nl80211_modify_link_station, 20559 .flags = GENL_UNS_ADMIN_PERM, 20560 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20561 NL80211_FLAG_MLO_VALID_LINK_ID), 20562 }, 20563 { 20564 .cmd = NL80211_CMD_REMOVE_LINK_STA, 20565 .doit = nl80211_remove_link_station, 20566 .flags = GENL_UNS_ADMIN_PERM, 20567 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20568 NL80211_FLAG_MLO_VALID_LINK_ID), 20569 }, 20570 { 20571 .cmd = NL80211_CMD_SET_HW_TIMESTAMP, 20572 .doit = nl80211_set_hw_timestamp, 20573 .flags = GENL_UNS_ADMIN_PERM, 20574 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20575 }, 20576 { 20577 .cmd = NL80211_CMD_SET_TID_TO_LINK_MAPPING, 20578 .doit = nl80211_set_ttlm, 20579 .flags = GENL_UNS_ADMIN_PERM, 20580 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20581 }, 20582 { 20583 .cmd = NL80211_CMD_ASSOC_MLO_RECONF, 20584 .doit = nl80211_assoc_ml_reconf, 20585 .flags = GENL_UNS_ADMIN_PERM, 20586 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20587 }, 20588 { 20589 .cmd = NL80211_CMD_EPCS_CFG, 20590 .doit = nl80211_epcs_cfg, 20591 .flags = GENL_UNS_ADMIN_PERM, 20592 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20593 }, 20594 { 20595 .cmd = NL80211_CMD_NAN_SET_LOCAL_SCHED, 20596 .doit = nl80211_nan_set_local_sched, 20597 .flags = GENL_ADMIN_PERM, 20598 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20599 }, 20600 { 20601 .cmd = NL80211_CMD_NAN_SET_PEER_SCHED, 20602 .doit = nl80211_nan_set_peer_sched, 20603 .flags = GENL_ADMIN_PERM, 20604 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20605 }, 20606 }; 20607 20608 static struct genl_family nl80211_fam __ro_after_init = { 20609 .name = NL80211_GENL_NAME, /* have users key off the name instead */ 20610 .hdrsize = 0, /* no private header */ 20611 .version = 1, /* no particular meaning now */ 20612 .maxattr = NL80211_ATTR_MAX, 20613 .policy = nl80211_policy, 20614 .netnsok = true, 20615 .pre_doit = nl80211_pre_doit, 20616 .post_doit = nl80211_post_doit, 20617 .module = THIS_MODULE, 20618 .ops = nl80211_ops, 20619 .n_ops = ARRAY_SIZE(nl80211_ops), 20620 .small_ops = nl80211_small_ops, 20621 .n_small_ops = ARRAY_SIZE(nl80211_small_ops), 20622 .resv_start_op = NL80211_CMD_REMOVE_LINK_STA + 1, 20623 .mcgrps = nl80211_mcgrps, 20624 .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps), 20625 .parallel_ops = true, 20626 }; 20627 20628 /* notification functions */ 20629 20630 void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev, 20631 enum nl80211_commands cmd) 20632 { 20633 struct sk_buff *msg; 20634 struct nl80211_dump_wiphy_state state = {}; 20635 20636 WARN_ON(cmd != NL80211_CMD_NEW_WIPHY && 20637 cmd != NL80211_CMD_DEL_WIPHY); 20638 20639 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20640 if (!msg) 20641 return; 20642 20643 if (nl80211_send_wiphy(rdev, cmd, msg, 0, 0, 0, &state) < 0) { 20644 nlmsg_free(msg); 20645 return; 20646 } 20647 20648 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20649 NL80211_MCGRP_CONFIG, GFP_KERNEL); 20650 } 20651 20652 void nl80211_notify_iface(struct cfg80211_registered_device *rdev, 20653 struct wireless_dev *wdev, 20654 enum nl80211_commands cmd) 20655 { 20656 struct sk_buff *msg; 20657 20658 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20659 if (!msg) 20660 return; 20661 20662 if (nl80211_send_iface(msg, 0, 0, 0, rdev, wdev, cmd) < 0) { 20663 nlmsg_free(msg); 20664 return; 20665 } 20666 20667 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20668 NL80211_MCGRP_CONFIG, GFP_KERNEL); 20669 } 20670 20671 static int nl80211_add_scan_req(struct sk_buff *msg, 20672 struct cfg80211_registered_device *rdev) 20673 { 20674 struct cfg80211_scan_request_int *req = rdev->scan_req; 20675 struct nlattr *nest; 20676 int i; 20677 struct cfg80211_scan_info *info; 20678 20679 if (WARN_ON(!req)) 20680 return 0; 20681 20682 nest = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_SSIDS); 20683 if (!nest) 20684 goto nla_put_failure; 20685 for (i = 0; i < req->req.n_ssids; i++) { 20686 if (nla_put(msg, i, req->req.ssids[i].ssid_len, 20687 req->req.ssids[i].ssid)) 20688 goto nla_put_failure; 20689 } 20690 nla_nest_end(msg, nest); 20691 20692 if (req->req.flags & NL80211_SCAN_FLAG_FREQ_KHZ) { 20693 nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQ_KHZ); 20694 if (!nest) 20695 goto nla_put_failure; 20696 for (i = 0; i < req->req.n_channels; i++) { 20697 if (nla_put_u32(msg, i, 20698 ieee80211_channel_to_khz(req->req.channels[i]))) 20699 goto nla_put_failure; 20700 } 20701 nla_nest_end(msg, nest); 20702 } else { 20703 nest = nla_nest_start_noflag(msg, 20704 NL80211_ATTR_SCAN_FREQUENCIES); 20705 if (!nest) 20706 goto nla_put_failure; 20707 for (i = 0; i < req->req.n_channels; i++) { 20708 if (nla_put_u32(msg, i, 20709 req->req.channels[i]->center_freq)) 20710 goto nla_put_failure; 20711 } 20712 nla_nest_end(msg, nest); 20713 } 20714 20715 if (req->req.ie && 20716 nla_put(msg, NL80211_ATTR_IE, req->req.ie_len, req->req.ie)) 20717 goto nla_put_failure; 20718 20719 if (req->req.flags && 20720 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->req.flags)) 20721 goto nla_put_failure; 20722 20723 info = rdev->int_scan_req ? &rdev->int_scan_req->info : 20724 &rdev->scan_req->info; 20725 if (info->scan_start_tsf && 20726 (nla_put_u64_64bit(msg, NL80211_ATTR_SCAN_START_TIME_TSF, 20727 info->scan_start_tsf, NL80211_BSS_PAD) || 20728 nla_put(msg, NL80211_ATTR_SCAN_START_TIME_TSF_BSSID, ETH_ALEN, 20729 info->tsf_bssid))) 20730 goto nla_put_failure; 20731 20732 return 0; 20733 nla_put_failure: 20734 return -ENOBUFS; 20735 } 20736 20737 static int nl80211_prep_scan_msg(struct sk_buff *msg, 20738 struct cfg80211_registered_device *rdev, 20739 struct wireless_dev *wdev, 20740 u32 portid, u32 seq, int flags, 20741 u32 cmd) 20742 { 20743 void *hdr; 20744 20745 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 20746 if (!hdr) 20747 return -1; 20748 20749 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20750 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 20751 wdev->netdev->ifindex)) || 20752 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 20753 NL80211_ATTR_PAD)) 20754 goto nla_put_failure; 20755 20756 /* ignore errors and send incomplete event anyway */ 20757 nl80211_add_scan_req(msg, rdev); 20758 20759 genlmsg_end(msg, hdr); 20760 return 0; 20761 20762 nla_put_failure: 20763 genlmsg_cancel(msg, hdr); 20764 return -EMSGSIZE; 20765 } 20766 20767 static int 20768 nl80211_prep_sched_scan_msg(struct sk_buff *msg, 20769 struct cfg80211_sched_scan_request *req, u32 cmd) 20770 { 20771 void *hdr; 20772 20773 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 20774 if (!hdr) 20775 return -1; 20776 20777 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, 20778 wiphy_to_rdev(req->wiphy)->wiphy_idx) || 20779 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) || 20780 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid, 20781 NL80211_ATTR_PAD)) 20782 goto nla_put_failure; 20783 20784 genlmsg_end(msg, hdr); 20785 return 0; 20786 20787 nla_put_failure: 20788 genlmsg_cancel(msg, hdr); 20789 return -EMSGSIZE; 20790 } 20791 20792 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev, 20793 struct wireless_dev *wdev) 20794 { 20795 struct sk_buff *msg; 20796 20797 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20798 if (!msg) 20799 return; 20800 20801 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0, 20802 NL80211_CMD_TRIGGER_SCAN) < 0) { 20803 nlmsg_free(msg); 20804 return; 20805 } 20806 20807 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20808 NL80211_MCGRP_SCAN, GFP_KERNEL); 20809 } 20810 20811 struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev, 20812 struct wireless_dev *wdev, bool aborted) 20813 { 20814 struct sk_buff *msg; 20815 20816 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20817 if (!msg) 20818 return NULL; 20819 20820 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0, 20821 aborted ? NL80211_CMD_SCAN_ABORTED : 20822 NL80211_CMD_NEW_SCAN_RESULTS) < 0) { 20823 nlmsg_free(msg); 20824 return NULL; 20825 } 20826 20827 return msg; 20828 } 20829 20830 /* send message created by nl80211_build_scan_msg() */ 20831 void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev, 20832 struct sk_buff *msg) 20833 { 20834 if (!msg) 20835 return; 20836 20837 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20838 NL80211_MCGRP_SCAN, GFP_KERNEL); 20839 } 20840 20841 void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd) 20842 { 20843 struct sk_buff *msg; 20844 20845 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20846 if (!msg) 20847 return; 20848 20849 if (nl80211_prep_sched_scan_msg(msg, req, cmd) < 0) { 20850 nlmsg_free(msg); 20851 return; 20852 } 20853 20854 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0, 20855 NL80211_MCGRP_SCAN, GFP_KERNEL); 20856 } 20857 20858 static bool nl80211_reg_change_event_fill(struct sk_buff *msg, 20859 struct regulatory_request *request) 20860 { 20861 /* Userspace can always count this one always being set */ 20862 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) 20863 goto nla_put_failure; 20864 20865 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { 20866 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 20867 NL80211_REGDOM_TYPE_WORLD)) 20868 goto nla_put_failure; 20869 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { 20870 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 20871 NL80211_REGDOM_TYPE_CUSTOM_WORLD)) 20872 goto nla_put_failure; 20873 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || 20874 request->intersect) { 20875 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 20876 NL80211_REGDOM_TYPE_INTERSECTION)) 20877 goto nla_put_failure; 20878 } else { 20879 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 20880 NL80211_REGDOM_TYPE_COUNTRY) || 20881 nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, 20882 request->alpha2)) 20883 goto nla_put_failure; 20884 } 20885 20886 if (request->wiphy_idx != WIPHY_IDX_INVALID) { 20887 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx); 20888 20889 if (wiphy && 20890 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) 20891 goto nla_put_failure; 20892 20893 if (wiphy && 20894 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 20895 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 20896 goto nla_put_failure; 20897 } 20898 20899 return true; 20900 20901 nla_put_failure: 20902 return false; 20903 } 20904 20905 /* 20906 * This can happen on global regulatory changes or device specific settings 20907 * based on custom regulatory domains. 20908 */ 20909 void nl80211_common_reg_change_event(enum nl80211_commands cmd_id, 20910 struct regulatory_request *request) 20911 { 20912 struct sk_buff *msg; 20913 void *hdr; 20914 20915 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20916 if (!msg) 20917 return; 20918 20919 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd_id); 20920 if (!hdr) 20921 goto nla_put_failure; 20922 20923 if (!nl80211_reg_change_event_fill(msg, request)) 20924 goto nla_put_failure; 20925 20926 genlmsg_end(msg, hdr); 20927 20928 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 20929 NL80211_MCGRP_REGULATORY); 20930 20931 return; 20932 20933 nla_put_failure: 20934 nlmsg_free(msg); 20935 } 20936 20937 struct nl80211_mlme_event { 20938 enum nl80211_commands cmd; 20939 const u8 *buf; 20940 size_t buf_len; 20941 int uapsd_queues; 20942 const u8 *req_ies; 20943 size_t req_ies_len; 20944 bool reconnect; 20945 }; 20946 20947 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev, 20948 struct net_device *netdev, 20949 const struct nl80211_mlme_event *event, 20950 gfp_t gfp) 20951 { 20952 struct sk_buff *msg; 20953 void *hdr; 20954 20955 msg = nlmsg_new(100 + event->buf_len + event->req_ies_len, gfp); 20956 if (!msg) 20957 return; 20958 20959 hdr = nl80211hdr_put(msg, 0, 0, 0, event->cmd); 20960 if (!hdr) { 20961 nlmsg_free(msg); 20962 return; 20963 } 20964 20965 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20966 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 20967 nla_put(msg, NL80211_ATTR_FRAME, event->buf_len, event->buf) || 20968 (event->req_ies && 20969 nla_put(msg, NL80211_ATTR_REQ_IE, event->req_ies_len, 20970 event->req_ies))) 20971 goto nla_put_failure; 20972 20973 if (event->reconnect && 20974 nla_put_flag(msg, NL80211_ATTR_RECONNECT_REQUESTED)) 20975 goto nla_put_failure; 20976 20977 if (event->uapsd_queues >= 0) { 20978 struct nlattr *nla_wmm = 20979 nla_nest_start_noflag(msg, NL80211_ATTR_STA_WME); 20980 if (!nla_wmm) 20981 goto nla_put_failure; 20982 20983 if (nla_put_u8(msg, NL80211_STA_WME_UAPSD_QUEUES, 20984 event->uapsd_queues)) 20985 goto nla_put_failure; 20986 20987 nla_nest_end(msg, nla_wmm); 20988 } 20989 20990 genlmsg_end(msg, hdr); 20991 20992 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20993 NL80211_MCGRP_MLME, gfp); 20994 return; 20995 20996 nla_put_failure: 20997 nlmsg_free(msg); 20998 } 20999 21000 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev, 21001 struct net_device *netdev, const u8 *buf, 21002 size_t len, gfp_t gfp) 21003 { 21004 struct nl80211_mlme_event event = { 21005 .cmd = NL80211_CMD_AUTHENTICATE, 21006 .buf = buf, 21007 .buf_len = len, 21008 .uapsd_queues = -1, 21009 }; 21010 21011 nl80211_send_mlme_event(rdev, netdev, &event, gfp); 21012 } 21013 21014 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev, 21015 struct net_device *netdev, 21016 const struct cfg80211_rx_assoc_resp_data *data) 21017 { 21018 struct nl80211_mlme_event event = { 21019 .cmd = NL80211_CMD_ASSOCIATE, 21020 .buf = data->buf, 21021 .buf_len = data->len, 21022 .uapsd_queues = data->uapsd_queues, 21023 .req_ies = data->req_ies, 21024 .req_ies_len = data->req_ies_len, 21025 }; 21026 21027 nl80211_send_mlme_event(rdev, netdev, &event, GFP_KERNEL); 21028 } 21029 21030 void nl80211_send_deauth(struct cfg80211_registered_device *rdev, 21031 struct net_device *netdev, const u8 *buf, 21032 size_t len, bool reconnect, gfp_t gfp) 21033 { 21034 struct nl80211_mlme_event event = { 21035 .cmd = NL80211_CMD_DEAUTHENTICATE, 21036 .buf = buf, 21037 .buf_len = len, 21038 .reconnect = reconnect, 21039 .uapsd_queues = -1, 21040 }; 21041 21042 nl80211_send_mlme_event(rdev, netdev, &event, gfp); 21043 } 21044 21045 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev, 21046 struct net_device *netdev, const u8 *buf, 21047 size_t len, bool reconnect, gfp_t gfp) 21048 { 21049 struct nl80211_mlme_event event = { 21050 .cmd = NL80211_CMD_DISASSOCIATE, 21051 .buf = buf, 21052 .buf_len = len, 21053 .reconnect = reconnect, 21054 .uapsd_queues = -1, 21055 }; 21056 21057 nl80211_send_mlme_event(rdev, netdev, &event, gfp); 21058 } 21059 21060 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf, 21061 size_t len) 21062 { 21063 struct wireless_dev *wdev = dev->ieee80211_ptr; 21064 struct wiphy *wiphy = wdev->wiphy; 21065 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21066 const struct ieee80211_mgmt *mgmt = (void *)buf; 21067 struct nl80211_mlme_event event = { 21068 .buf = buf, 21069 .buf_len = len, 21070 .uapsd_queues = -1, 21071 }; 21072 21073 if (WARN_ON(len < 2)) 21074 return; 21075 21076 if (ieee80211_is_deauth(mgmt->frame_control)) { 21077 event.cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE; 21078 } else if (ieee80211_is_disassoc(mgmt->frame_control)) { 21079 event.cmd = NL80211_CMD_UNPROT_DISASSOCIATE; 21080 } else if (ieee80211_is_beacon(mgmt->frame_control)) { 21081 if (wdev->iftype == NL80211_IFTYPE_AP || 21082 wdev->iftype == NL80211_IFTYPE_P2P_GO) 21083 return; 21084 if (wdev->unprot_beacon_reported && 21085 elapsed_jiffies_msecs(wdev->unprot_beacon_reported) < 10000) 21086 return; 21087 event.cmd = NL80211_CMD_UNPROT_BEACON; 21088 wdev->unprot_beacon_reported = jiffies; 21089 } else { 21090 return; 21091 } 21092 21093 trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len); 21094 nl80211_send_mlme_event(rdev, dev, &event, GFP_ATOMIC); 21095 } 21096 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt); 21097 21098 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev, 21099 struct net_device *netdev, int cmd, 21100 const u8 *addr, gfp_t gfp) 21101 { 21102 struct sk_buff *msg; 21103 void *hdr; 21104 21105 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21106 if (!msg) 21107 return; 21108 21109 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 21110 if (!hdr) { 21111 nlmsg_free(msg); 21112 return; 21113 } 21114 21115 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21116 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21117 nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 21118 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) 21119 goto nla_put_failure; 21120 21121 genlmsg_end(msg, hdr); 21122 21123 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21124 NL80211_MCGRP_MLME, gfp); 21125 return; 21126 21127 nla_put_failure: 21128 nlmsg_free(msg); 21129 } 21130 21131 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev, 21132 struct net_device *netdev, const u8 *addr, 21133 gfp_t gfp) 21134 { 21135 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE, 21136 addr, gfp); 21137 } 21138 21139 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev, 21140 struct net_device *netdev, const u8 *addr, 21141 gfp_t gfp) 21142 { 21143 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE, 21144 addr, gfp); 21145 } 21146 21147 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev, 21148 struct net_device *netdev, 21149 struct cfg80211_connect_resp_params *cr, 21150 gfp_t gfp) 21151 { 21152 struct sk_buff *msg; 21153 void *hdr; 21154 unsigned int link; 21155 size_t link_info_size = 0; 21156 const u8 *connected_addr = cr->valid_links ? 21157 cr->ap_mld_addr : cr->links[0].bssid; 21158 21159 if (cr->valid_links) { 21160 for_each_valid_link(cr, link) { 21161 /* Nested attribute header */ 21162 link_info_size += NLA_HDRLEN; 21163 /* Link ID */ 21164 link_info_size += nla_total_size(sizeof(u8)); 21165 link_info_size += cr->links[link].addr ? 21166 nla_total_size(ETH_ALEN) : 0; 21167 link_info_size += (cr->links[link].bssid || 21168 cr->links[link].bss) ? 21169 nla_total_size(ETH_ALEN) : 0; 21170 link_info_size += nla_total_size(sizeof(u16)); 21171 } 21172 } 21173 21174 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len + 21175 cr->fils.kek_len + cr->fils.pmk_len + 21176 (cr->fils.pmkid ? WLAN_PMKID_LEN : 0) + link_info_size, 21177 gfp); 21178 if (!msg) 21179 return; 21180 21181 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT); 21182 if (!hdr) { 21183 nlmsg_free(msg); 21184 return; 21185 } 21186 21187 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21188 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21189 (connected_addr && 21190 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, connected_addr)) || 21191 nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, 21192 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE : 21193 cr->status) || 21194 (cr->status < 0 && 21195 (nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 21196 nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON, 21197 cr->timeout_reason))) || 21198 (cr->req_ie && 21199 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) || 21200 (cr->resp_ie && 21201 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len, 21202 cr->resp_ie)) || 21203 (cr->fils.update_erp_next_seq_num && 21204 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM, 21205 cr->fils.erp_next_seq_num)) || 21206 (cr->status == WLAN_STATUS_SUCCESS && 21207 ((cr->fils.kek && 21208 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len, 21209 cr->fils.kek)) || 21210 (cr->fils.pmk && 21211 nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) || 21212 (cr->fils.pmkid && 21213 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid)))) || 21214 (cr->assoc_encrypted && 21215 nla_put_flag(msg, NL80211_ATTR_ASSOC_ENCRYPTED))) 21216 goto nla_put_failure; 21217 21218 if (cr->valid_links) { 21219 int i = 1; 21220 struct nlattr *nested; 21221 21222 nested = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 21223 if (!nested) 21224 goto nla_put_failure; 21225 21226 for_each_valid_link(cr, link) { 21227 struct nlattr *nested_mlo_links; 21228 const u8 *bssid = cr->links[link].bss ? 21229 cr->links[link].bss->bssid : 21230 cr->links[link].bssid; 21231 21232 nested_mlo_links = nla_nest_start(msg, i); 21233 if (!nested_mlo_links) 21234 goto nla_put_failure; 21235 21236 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link) || 21237 (bssid && 21238 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, bssid)) || 21239 (cr->links[link].addr && 21240 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 21241 cr->links[link].addr)) || 21242 nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, 21243 cr->links[link].status)) 21244 goto nla_put_failure; 21245 21246 nla_nest_end(msg, nested_mlo_links); 21247 i++; 21248 } 21249 nla_nest_end(msg, nested); 21250 } 21251 21252 genlmsg_end(msg, hdr); 21253 21254 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21255 NL80211_MCGRP_MLME, gfp); 21256 return; 21257 21258 nla_put_failure: 21259 nlmsg_free(msg); 21260 } 21261 21262 void nl80211_send_roamed(struct cfg80211_registered_device *rdev, 21263 struct net_device *netdev, 21264 struct cfg80211_roam_info *info, gfp_t gfp) 21265 { 21266 struct sk_buff *msg; 21267 void *hdr; 21268 size_t link_info_size = 0; 21269 unsigned int link; 21270 const u8 *connected_addr = info->ap_mld_addr ? 21271 info->ap_mld_addr : 21272 (info->links[0].bss ? 21273 info->links[0].bss->bssid : 21274 info->links[0].bssid); 21275 21276 if (info->valid_links) { 21277 for_each_valid_link(info, link) { 21278 /* Nested attribute header */ 21279 link_info_size += NLA_HDRLEN; 21280 /* Link ID */ 21281 link_info_size += nla_total_size(sizeof(u8)); 21282 link_info_size += info->links[link].addr ? 21283 nla_total_size(ETH_ALEN) : 0; 21284 link_info_size += (info->links[link].bssid || 21285 info->links[link].bss) ? 21286 nla_total_size(ETH_ALEN) : 0; 21287 } 21288 } 21289 21290 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len + 21291 info->fils.kek_len + info->fils.pmk_len + 21292 (info->fils.pmkid ? WLAN_PMKID_LEN : 0) + 21293 link_info_size, gfp); 21294 if (!msg) 21295 return; 21296 21297 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM); 21298 if (!hdr) { 21299 nlmsg_free(msg); 21300 return; 21301 } 21302 21303 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21304 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21305 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, connected_addr) || 21306 (info->req_ie && 21307 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len, 21308 info->req_ie)) || 21309 (info->resp_ie && 21310 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len, 21311 info->resp_ie)) || 21312 (info->fils.update_erp_next_seq_num && 21313 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM, 21314 info->fils.erp_next_seq_num)) || 21315 (info->fils.kek && 21316 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len, 21317 info->fils.kek)) || 21318 (info->fils.pmk && 21319 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) || 21320 (info->fils.pmkid && 21321 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid))) 21322 goto nla_put_failure; 21323 21324 if (info->valid_links) { 21325 int i = 1; 21326 struct nlattr *nested; 21327 21328 nested = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 21329 if (!nested) 21330 goto nla_put_failure; 21331 21332 for_each_valid_link(info, link) { 21333 struct nlattr *nested_mlo_links; 21334 const u8 *bssid = info->links[link].bss ? 21335 info->links[link].bss->bssid : 21336 info->links[link].bssid; 21337 21338 nested_mlo_links = nla_nest_start(msg, i); 21339 if (!nested_mlo_links) 21340 goto nla_put_failure; 21341 21342 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link) || 21343 (bssid && 21344 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, bssid)) || 21345 (info->links[link].addr && 21346 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 21347 info->links[link].addr))) 21348 goto nla_put_failure; 21349 21350 nla_nest_end(msg, nested_mlo_links); 21351 i++; 21352 } 21353 nla_nest_end(msg, nested); 21354 } 21355 21356 genlmsg_end(msg, hdr); 21357 21358 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21359 NL80211_MCGRP_MLME, gfp); 21360 return; 21361 21362 nla_put_failure: 21363 nlmsg_free(msg); 21364 } 21365 21366 void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev, 21367 struct net_device *netdev, const u8 *peer_addr, 21368 const u8 *td_bitmap, u8 td_bitmap_len) 21369 { 21370 struct sk_buff *msg; 21371 void *hdr; 21372 21373 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 21374 if (!msg) 21375 return; 21376 21377 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PORT_AUTHORIZED); 21378 if (!hdr) { 21379 nlmsg_free(msg); 21380 return; 21381 } 21382 21383 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21384 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21385 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer_addr)) 21386 goto nla_put_failure; 21387 21388 if (td_bitmap_len > 0 && td_bitmap && 21389 nla_put(msg, NL80211_ATTR_TD_BITMAP, td_bitmap_len, td_bitmap)) 21390 goto nla_put_failure; 21391 21392 genlmsg_end(msg, hdr); 21393 21394 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21395 NL80211_MCGRP_MLME, GFP_KERNEL); 21396 return; 21397 21398 nla_put_failure: 21399 nlmsg_free(msg); 21400 } 21401 21402 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev, 21403 struct net_device *netdev, u16 reason, 21404 const u8 *ie, size_t ie_len, bool from_ap) 21405 { 21406 struct sk_buff *msg; 21407 void *hdr; 21408 21409 msg = nlmsg_new(100 + ie_len, GFP_KERNEL); 21410 if (!msg) 21411 return; 21412 21413 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT); 21414 if (!hdr) { 21415 nlmsg_free(msg); 21416 return; 21417 } 21418 21419 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21420 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21421 (reason && 21422 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) || 21423 (from_ap && 21424 nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) || 21425 (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie))) 21426 goto nla_put_failure; 21427 21428 genlmsg_end(msg, hdr); 21429 21430 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21431 NL80211_MCGRP_MLME, GFP_KERNEL); 21432 return; 21433 21434 nla_put_failure: 21435 nlmsg_free(msg); 21436 } 21437 21438 void cfg80211_links_removed(struct net_device *dev, u16 link_mask) 21439 { 21440 struct wireless_dev *wdev = dev->ieee80211_ptr; 21441 struct wiphy *wiphy = wdev->wiphy; 21442 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21443 struct sk_buff *msg; 21444 struct nlattr *links; 21445 void *hdr; 21446 21447 lockdep_assert_wiphy(wdev->wiphy); 21448 trace_cfg80211_links_removed(dev, link_mask); 21449 21450 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION && 21451 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)) 21452 return; 21453 21454 if (WARN_ON(!wdev->valid_links || !link_mask || 21455 (wdev->valid_links & link_mask) != link_mask || 21456 wdev->valid_links == link_mask)) 21457 return; 21458 21459 cfg80211_wdev_release_link_bsses(wdev, link_mask); 21460 wdev->valid_links &= ~link_mask; 21461 21462 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 21463 if (!msg) 21464 return; 21465 21466 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_LINKS_REMOVED); 21467 if (!hdr) { 21468 nlmsg_free(msg); 21469 return; 21470 } 21471 21472 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21473 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 21474 goto nla_put_failure; 21475 21476 links = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 21477 if (!links) 21478 goto nla_put_failure; 21479 21480 while (link_mask) { 21481 struct nlattr *link; 21482 int link_id = __ffs(link_mask); 21483 21484 link = nla_nest_start(msg, link_id + 1); 21485 if (!link) 21486 goto nla_put_failure; 21487 21488 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 21489 goto nla_put_failure; 21490 21491 nla_nest_end(msg, link); 21492 link_mask &= ~(1 << link_id); 21493 } 21494 21495 nla_nest_end(msg, links); 21496 21497 genlmsg_end(msg, hdr); 21498 21499 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21500 NL80211_MCGRP_MLME, GFP_KERNEL); 21501 return; 21502 21503 nla_put_failure: 21504 nlmsg_free(msg); 21505 } 21506 EXPORT_SYMBOL(cfg80211_links_removed); 21507 21508 void nl80211_mlo_reconf_add_done(struct net_device *dev, 21509 struct cfg80211_mlo_reconf_done_data *data) 21510 { 21511 struct wireless_dev *wdev = dev->ieee80211_ptr; 21512 struct wiphy *wiphy = wdev->wiphy; 21513 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21514 struct nl80211_mlme_event event = { 21515 .cmd = NL80211_CMD_ASSOC_MLO_RECONF, 21516 .buf = data->buf, 21517 .buf_len = data->len, 21518 .uapsd_queues = -1, 21519 }; 21520 21521 nl80211_send_mlme_event(rdev, dev, &event, GFP_KERNEL); 21522 } 21523 EXPORT_SYMBOL(nl80211_mlo_reconf_add_done); 21524 21525 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev, 21526 struct net_device *netdev, const u8 *bssid, 21527 gfp_t gfp) 21528 { 21529 struct sk_buff *msg; 21530 void *hdr; 21531 21532 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21533 if (!msg) 21534 return; 21535 21536 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS); 21537 if (!hdr) { 21538 nlmsg_free(msg); 21539 return; 21540 } 21541 21542 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21543 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21544 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 21545 goto nla_put_failure; 21546 21547 genlmsg_end(msg, hdr); 21548 21549 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21550 NL80211_MCGRP_MLME, gfp); 21551 return; 21552 21553 nla_put_failure: 21554 nlmsg_free(msg); 21555 } 21556 21557 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr, 21558 const u8 *ie, size_t ie_len, 21559 int sig_dbm, gfp_t gfp) 21560 { 21561 struct wireless_dev *wdev = dev->ieee80211_ptr; 21562 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 21563 struct sk_buff *msg; 21564 void *hdr; 21565 21566 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) 21567 return; 21568 21569 trace_cfg80211_notify_new_peer_candidate(dev, addr); 21570 21571 msg = nlmsg_new(100 + ie_len, gfp); 21572 if (!msg) 21573 return; 21574 21575 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE); 21576 if (!hdr) { 21577 nlmsg_free(msg); 21578 return; 21579 } 21580 21581 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21582 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 21583 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 21584 (ie_len && ie && 21585 nla_put(msg, NL80211_ATTR_IE, ie_len, ie)) || 21586 (sig_dbm && 21587 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm))) 21588 goto nla_put_failure; 21589 21590 genlmsg_end(msg, hdr); 21591 21592 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21593 NL80211_MCGRP_MLME, gfp); 21594 return; 21595 21596 nla_put_failure: 21597 nlmsg_free(msg); 21598 } 21599 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate); 21600 21601 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev, 21602 struct net_device *netdev, const u8 *addr, 21603 enum nl80211_key_type key_type, int key_id, 21604 const u8 *tsc, gfp_t gfp) 21605 { 21606 struct sk_buff *msg; 21607 void *hdr; 21608 21609 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21610 if (!msg) 21611 return; 21612 21613 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE); 21614 if (!hdr) { 21615 nlmsg_free(msg); 21616 return; 21617 } 21618 21619 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21620 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21621 (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) || 21622 nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) || 21623 (key_id != -1 && 21624 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) || 21625 (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc))) 21626 goto nla_put_failure; 21627 21628 genlmsg_end(msg, hdr); 21629 21630 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21631 NL80211_MCGRP_MLME, gfp); 21632 return; 21633 21634 nla_put_failure: 21635 nlmsg_free(msg); 21636 } 21637 21638 void nl80211_send_beacon_hint_event(struct wiphy *wiphy, 21639 struct ieee80211_channel *channel_before, 21640 struct ieee80211_channel *channel_after) 21641 { 21642 struct sk_buff *msg; 21643 void *hdr; 21644 struct nlattr *nl_freq; 21645 21646 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); 21647 if (!msg) 21648 return; 21649 21650 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT); 21651 if (!hdr) { 21652 nlmsg_free(msg); 21653 return; 21654 } 21655 21656 /* 21657 * Since we are applying the beacon hint to a wiphy we know its 21658 * wiphy_idx is valid 21659 */ 21660 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 21661 goto nla_put_failure; 21662 21663 /* Before */ 21664 nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_BEFORE); 21665 if (!nl_freq) 21666 goto nla_put_failure; 21667 21668 if (nl80211_msg_put_channel(msg, wiphy, channel_before, false)) 21669 goto nla_put_failure; 21670 nla_nest_end(msg, nl_freq); 21671 21672 /* After */ 21673 nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_AFTER); 21674 if (!nl_freq) 21675 goto nla_put_failure; 21676 21677 if (nl80211_msg_put_channel(msg, wiphy, channel_after, false)) 21678 goto nla_put_failure; 21679 nla_nest_end(msg, nl_freq); 21680 21681 genlmsg_end(msg, hdr); 21682 21683 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 21684 NL80211_MCGRP_REGULATORY); 21685 21686 return; 21687 21688 nla_put_failure: 21689 nlmsg_free(msg); 21690 } 21691 21692 static void nl80211_send_remain_on_chan_event( 21693 int cmd, struct cfg80211_registered_device *rdev, 21694 struct wireless_dev *wdev, u64 cookie, 21695 struct ieee80211_channel *chan, 21696 unsigned int duration, gfp_t gfp) 21697 { 21698 struct sk_buff *msg; 21699 void *hdr; 21700 21701 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21702 if (!msg) 21703 return; 21704 21705 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 21706 if (!hdr) { 21707 nlmsg_free(msg); 21708 return; 21709 } 21710 21711 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21712 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 21713 wdev->netdev->ifindex)) || 21714 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 21715 NL80211_ATTR_PAD) || 21716 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || 21717 nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 21718 NL80211_CHAN_NO_HT) || 21719 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 21720 NL80211_ATTR_PAD)) 21721 goto nla_put_failure; 21722 21723 if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL && 21724 nla_put_u32(msg, NL80211_ATTR_DURATION, duration)) 21725 goto nla_put_failure; 21726 21727 genlmsg_end(msg, hdr); 21728 21729 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21730 NL80211_MCGRP_MLME, gfp); 21731 return; 21732 21733 nla_put_failure: 21734 nlmsg_free(msg); 21735 } 21736 21737 void cfg80211_assoc_comeback(struct net_device *netdev, 21738 const u8 *ap_addr, u32 timeout) 21739 { 21740 struct wireless_dev *wdev = netdev->ieee80211_ptr; 21741 struct wiphy *wiphy = wdev->wiphy; 21742 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21743 struct sk_buff *msg; 21744 void *hdr; 21745 21746 trace_cfg80211_assoc_comeback(wdev, ap_addr, timeout); 21747 21748 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 21749 if (!msg) 21750 return; 21751 21752 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ASSOC_COMEBACK); 21753 if (!hdr) { 21754 nlmsg_free(msg); 21755 return; 21756 } 21757 21758 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21759 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21760 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ap_addr) || 21761 nla_put_u32(msg, NL80211_ATTR_TIMEOUT, timeout)) 21762 goto nla_put_failure; 21763 21764 genlmsg_end(msg, hdr); 21765 21766 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21767 NL80211_MCGRP_MLME, GFP_KERNEL); 21768 return; 21769 21770 nla_put_failure: 21771 nlmsg_free(msg); 21772 } 21773 EXPORT_SYMBOL(cfg80211_assoc_comeback); 21774 21775 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie, 21776 struct ieee80211_channel *chan, 21777 unsigned int duration, gfp_t gfp) 21778 { 21779 struct wiphy *wiphy = wdev->wiphy; 21780 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21781 21782 trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration); 21783 nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL, 21784 rdev, wdev, cookie, chan, 21785 duration, gfp); 21786 } 21787 EXPORT_SYMBOL(cfg80211_ready_on_channel); 21788 21789 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie, 21790 struct ieee80211_channel *chan, 21791 gfp_t gfp) 21792 { 21793 struct wiphy *wiphy = wdev->wiphy; 21794 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21795 21796 trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan); 21797 nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 21798 rdev, wdev, cookie, chan, 0, gfp); 21799 } 21800 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired); 21801 21802 void cfg80211_tx_mgmt_expired(struct wireless_dev *wdev, u64 cookie, 21803 struct ieee80211_channel *chan, 21804 gfp_t gfp) 21805 { 21806 struct wiphy *wiphy = wdev->wiphy; 21807 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21808 21809 trace_cfg80211_tx_mgmt_expired(wdev, cookie, chan); 21810 nl80211_send_remain_on_chan_event(NL80211_CMD_FRAME_WAIT_CANCEL, 21811 rdev, wdev, cookie, chan, 0, gfp); 21812 } 21813 EXPORT_SYMBOL(cfg80211_tx_mgmt_expired); 21814 21815 void cfg80211_new_sta(struct wireless_dev *wdev, const u8 *mac_addr, 21816 struct station_info *sinfo, gfp_t gfp) 21817 { 21818 struct wiphy *wiphy = wdev->wiphy; 21819 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21820 struct sk_buff *msg; 21821 21822 trace_cfg80211_new_sta(wdev, mac_addr, sinfo); 21823 21824 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21825 if (!msg) 21826 return; 21827 21828 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 0, 0, 0, 21829 rdev, wdev, mac_addr, sinfo) < 0) { 21830 nlmsg_free(msg); 21831 return; 21832 } 21833 21834 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21835 NL80211_MCGRP_MLME, gfp); 21836 } 21837 EXPORT_SYMBOL(cfg80211_new_sta); 21838 21839 void cfg80211_del_sta_sinfo(struct wireless_dev *wdev, const u8 *mac_addr, 21840 struct station_info *sinfo, gfp_t gfp) 21841 { 21842 struct wiphy *wiphy = wdev->wiphy; 21843 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21844 struct sk_buff *msg; 21845 struct station_info empty_sinfo = {}; 21846 21847 if (!sinfo) 21848 sinfo = &empty_sinfo; 21849 21850 trace_cfg80211_del_sta(wdev, mac_addr); 21851 21852 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21853 if (!msg) { 21854 cfg80211_sinfo_release_content(sinfo); 21855 return; 21856 } 21857 21858 if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0, 21859 rdev, wdev, mac_addr, sinfo) < 0) { 21860 nlmsg_free(msg); 21861 return; 21862 } 21863 21864 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21865 NL80211_MCGRP_MLME, gfp); 21866 } 21867 EXPORT_SYMBOL(cfg80211_del_sta_sinfo); 21868 21869 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr, 21870 enum nl80211_connect_failed_reason reason, 21871 gfp_t gfp) 21872 { 21873 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 21874 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21875 struct sk_buff *msg; 21876 void *hdr; 21877 21878 msg = nlmsg_new(NLMSG_GOODSIZE, gfp); 21879 if (!msg) 21880 return; 21881 21882 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED); 21883 if (!hdr) { 21884 nlmsg_free(msg); 21885 return; 21886 } 21887 21888 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 21889 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 21890 nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason)) 21891 goto nla_put_failure; 21892 21893 genlmsg_end(msg, hdr); 21894 21895 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21896 NL80211_MCGRP_MLME, gfp); 21897 return; 21898 21899 nla_put_failure: 21900 nlmsg_free(msg); 21901 } 21902 EXPORT_SYMBOL(cfg80211_conn_failed); 21903 21904 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd, 21905 const u8 *addr, int link_id, gfp_t gfp) 21906 { 21907 struct wireless_dev *wdev = dev->ieee80211_ptr; 21908 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 21909 struct sk_buff *msg; 21910 void *hdr; 21911 u32 nlportid = READ_ONCE(wdev->unexpected_nlportid); 21912 21913 if (!nlportid) 21914 return false; 21915 21916 msg = nlmsg_new(100, gfp); 21917 if (!msg) 21918 return true; 21919 21920 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 21921 if (!hdr) { 21922 nlmsg_free(msg); 21923 return true; 21924 } 21925 21926 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21927 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 21928 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 21929 (link_id >= 0 && 21930 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))) 21931 goto nla_put_failure; 21932 21933 genlmsg_end(msg, hdr); 21934 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 21935 return true; 21936 21937 nla_put_failure: 21938 nlmsg_free(msg); 21939 return true; 21940 } 21941 21942 bool cfg80211_rx_spurious_frame(struct net_device *dev, const u8 *addr, 21943 int link_id, gfp_t gfp) 21944 { 21945 struct wireless_dev *wdev = dev->ieee80211_ptr; 21946 bool ret; 21947 21948 trace_cfg80211_rx_spurious_frame(dev, addr, link_id); 21949 21950 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 21951 wdev->iftype != NL80211_IFTYPE_P2P_GO && 21952 wdev->iftype != NL80211_IFTYPE_NAN_DATA)) { 21953 trace_cfg80211_return_bool(false); 21954 return false; 21955 } 21956 ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME, 21957 addr, link_id, gfp); 21958 trace_cfg80211_return_bool(ret); 21959 return ret; 21960 } 21961 EXPORT_SYMBOL(cfg80211_rx_spurious_frame); 21962 21963 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev, const u8 *addr, 21964 int link_id, gfp_t gfp) 21965 { 21966 struct wireless_dev *wdev = dev->ieee80211_ptr; 21967 bool ret; 21968 21969 trace_cfg80211_rx_unexpected_4addr_frame(dev, addr, link_id); 21970 21971 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 21972 wdev->iftype != NL80211_IFTYPE_P2P_GO && 21973 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { 21974 trace_cfg80211_return_bool(false); 21975 return false; 21976 } 21977 ret = __nl80211_unexpected_frame(dev, 21978 NL80211_CMD_UNEXPECTED_4ADDR_FRAME, 21979 addr, link_id, gfp); 21980 trace_cfg80211_return_bool(ret); 21981 return ret; 21982 } 21983 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame); 21984 21985 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, 21986 struct wireless_dev *wdev, u32 nlportid, 21987 struct cfg80211_rx_info *info, gfp_t gfp) 21988 { 21989 struct net_device *netdev = wdev->netdev; 21990 struct sk_buff *msg; 21991 void *hdr; 21992 21993 msg = nlmsg_new(100 + info->len, gfp); 21994 if (!msg) 21995 return -ENOMEM; 21996 21997 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 21998 if (!hdr) { 21999 nlmsg_free(msg); 22000 return -ENOMEM; 22001 } 22002 22003 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22004 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 22005 netdev->ifindex)) || 22006 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22007 NL80211_ATTR_PAD) || 22008 (info->have_link_id && 22009 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, info->link_id)) || 22010 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, KHZ_TO_MHZ(info->freq)) || 22011 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, info->freq % 1000) || 22012 (info->sig_dbm && 22013 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, info->sig_dbm)) || 22014 nla_put(msg, NL80211_ATTR_FRAME, info->len, info->buf) || 22015 (info->flags && 22016 nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, info->flags)) || 22017 (info->rx_tstamp && nla_put_u64_64bit(msg, 22018 NL80211_ATTR_RX_HW_TIMESTAMP, 22019 info->rx_tstamp, 22020 NL80211_ATTR_PAD)) || 22021 (info->ack_tstamp && nla_put_u64_64bit(msg, 22022 NL80211_ATTR_TX_HW_TIMESTAMP, 22023 info->ack_tstamp, 22024 NL80211_ATTR_PAD))) 22025 goto nla_put_failure; 22026 22027 genlmsg_end(msg, hdr); 22028 22029 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 22030 22031 nla_put_failure: 22032 nlmsg_free(msg); 22033 return -ENOBUFS; 22034 } 22035 22036 static void nl80211_frame_tx_status(struct wireless_dev *wdev, 22037 struct cfg80211_tx_status *status, 22038 gfp_t gfp, enum nl80211_commands command) 22039 { 22040 struct wiphy *wiphy = wdev->wiphy; 22041 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22042 struct net_device *netdev = wdev->netdev; 22043 struct sk_buff *msg; 22044 void *hdr; 22045 22046 /* userspace not interested in zero-cookie status */ 22047 if (!status->cookie) 22048 return; 22049 22050 if (command == NL80211_CMD_FRAME_TX_STATUS) 22051 trace_cfg80211_mgmt_tx_status(wdev, status->cookie, 22052 status->ack); 22053 else 22054 trace_cfg80211_control_port_tx_status(wdev, status->cookie, 22055 status->ack); 22056 22057 msg = nlmsg_new(100 + status->len, gfp); 22058 if (!msg) 22059 return; 22060 22061 hdr = nl80211hdr_put(msg, 0, 0, 0, command); 22062 if (!hdr) { 22063 nlmsg_free(msg); 22064 return; 22065 } 22066 22067 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22068 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 22069 netdev->ifindex)) || 22070 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22071 NL80211_ATTR_PAD) || 22072 nla_put(msg, NL80211_ATTR_FRAME, status->len, status->buf) || 22073 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, status->cookie, 22074 NL80211_ATTR_PAD) || 22075 (status->ack && nla_put_flag(msg, NL80211_ATTR_ACK)) || 22076 (status->tx_tstamp && 22077 nla_put_u64_64bit(msg, NL80211_ATTR_TX_HW_TIMESTAMP, 22078 status->tx_tstamp, NL80211_ATTR_PAD)) || 22079 (status->ack_tstamp && 22080 nla_put_u64_64bit(msg, NL80211_ATTR_RX_HW_TIMESTAMP, 22081 status->ack_tstamp, NL80211_ATTR_PAD))) 22082 goto nla_put_failure; 22083 22084 genlmsg_end(msg, hdr); 22085 22086 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22087 NL80211_MCGRP_MLME, gfp); 22088 return; 22089 22090 nla_put_failure: 22091 nlmsg_free(msg); 22092 } 22093 22094 void cfg80211_control_port_tx_status(struct wireless_dev *wdev, u64 cookie, 22095 const u8 *buf, size_t len, bool ack, 22096 gfp_t gfp) 22097 { 22098 struct cfg80211_tx_status status = { 22099 .cookie = cookie, 22100 .buf = buf, 22101 .len = len, 22102 .ack = ack 22103 }; 22104 22105 nl80211_frame_tx_status(wdev, &status, gfp, 22106 NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS); 22107 } 22108 EXPORT_SYMBOL(cfg80211_control_port_tx_status); 22109 22110 void cfg80211_mgmt_tx_status_ext(struct wireless_dev *wdev, 22111 struct cfg80211_tx_status *status, gfp_t gfp) 22112 { 22113 nl80211_frame_tx_status(wdev, status, gfp, NL80211_CMD_FRAME_TX_STATUS); 22114 } 22115 EXPORT_SYMBOL(cfg80211_mgmt_tx_status_ext); 22116 22117 static int __nl80211_rx_control_port(struct net_device *dev, 22118 struct sk_buff *skb, 22119 bool unencrypted, 22120 int link_id, 22121 gfp_t gfp) 22122 { 22123 struct wireless_dev *wdev = dev->ieee80211_ptr; 22124 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22125 struct ethhdr *ehdr = eth_hdr(skb); 22126 const u8 *addr = ehdr->h_source; 22127 u16 proto = be16_to_cpu(skb->protocol); 22128 struct sk_buff *msg; 22129 void *hdr; 22130 struct nlattr *frame; 22131 22132 u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); 22133 22134 if (!nlportid) 22135 return -ENOENT; 22136 22137 msg = nlmsg_new(100 + skb->len, gfp); 22138 if (!msg) 22139 return -ENOMEM; 22140 22141 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONTROL_PORT_FRAME); 22142 if (!hdr) { 22143 nlmsg_free(msg); 22144 return -ENOBUFS; 22145 } 22146 22147 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22148 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 22149 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22150 NL80211_ATTR_PAD) || 22151 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 22152 nla_put_u16(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE, proto) || 22153 (link_id >= 0 && 22154 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) || 22155 (unencrypted && nla_put_flag(msg, 22156 NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT))) 22157 goto nla_put_failure; 22158 22159 frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len); 22160 if (!frame) 22161 goto nla_put_failure; 22162 22163 skb_copy_bits(skb, 0, nla_data(frame), skb->len); 22164 genlmsg_end(msg, hdr); 22165 22166 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 22167 22168 nla_put_failure: 22169 nlmsg_free(msg); 22170 return -ENOBUFS; 22171 } 22172 22173 bool cfg80211_rx_control_port(struct net_device *dev, struct sk_buff *skb, 22174 bool unencrypted, int link_id) 22175 { 22176 int ret; 22177 22178 trace_cfg80211_rx_control_port(dev, skb, unencrypted, link_id); 22179 ret = __nl80211_rx_control_port(dev, skb, unencrypted, link_id, 22180 GFP_ATOMIC); 22181 trace_cfg80211_return_bool(ret == 0); 22182 return ret == 0; 22183 } 22184 EXPORT_SYMBOL(cfg80211_rx_control_port); 22185 22186 static struct sk_buff *cfg80211_prepare_cqm(struct net_device *dev, 22187 const char *mac, gfp_t gfp) 22188 { 22189 struct wireless_dev *wdev = dev->ieee80211_ptr; 22190 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22191 struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22192 void **cb; 22193 22194 if (!msg) 22195 return NULL; 22196 22197 cb = (void **)msg->cb; 22198 22199 cb[0] = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM); 22200 if (!cb[0]) { 22201 nlmsg_free(msg); 22202 return NULL; 22203 } 22204 22205 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22206 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 22207 goto nla_put_failure; 22208 22209 if (mac && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac)) 22210 goto nla_put_failure; 22211 22212 cb[1] = nla_nest_start_noflag(msg, NL80211_ATTR_CQM); 22213 if (!cb[1]) 22214 goto nla_put_failure; 22215 22216 cb[2] = rdev; 22217 22218 return msg; 22219 nla_put_failure: 22220 nlmsg_free(msg); 22221 return NULL; 22222 } 22223 22224 static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp) 22225 { 22226 void **cb = (void **)msg->cb; 22227 struct cfg80211_registered_device *rdev = cb[2]; 22228 22229 nla_nest_end(msg, cb[1]); 22230 genlmsg_end(msg, cb[0]); 22231 22232 memset(msg->cb, 0, sizeof(msg->cb)); 22233 22234 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22235 NL80211_MCGRP_MLME, gfp); 22236 } 22237 22238 void cfg80211_cqm_rssi_notify(struct net_device *dev, 22239 enum nl80211_cqm_rssi_threshold_event rssi_event, 22240 s32 rssi_level, gfp_t gfp) 22241 { 22242 struct wireless_dev *wdev = dev->ieee80211_ptr; 22243 struct cfg80211_cqm_config *cqm_config; 22244 22245 trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level); 22246 22247 if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW && 22248 rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH)) 22249 return; 22250 22251 rcu_read_lock(); 22252 cqm_config = rcu_dereference(wdev->cqm_config); 22253 if (cqm_config) { 22254 cqm_config->last_rssi_event_value = rssi_level; 22255 cqm_config->last_rssi_event_type = rssi_event; 22256 wiphy_work_queue(wdev->wiphy, &wdev->cqm_rssi_work); 22257 } 22258 rcu_read_unlock(); 22259 } 22260 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify); 22261 22262 void cfg80211_cqm_rssi_notify_work(struct wiphy *wiphy, struct wiphy_work *work) 22263 { 22264 struct wireless_dev *wdev = container_of(work, struct wireless_dev, 22265 cqm_rssi_work); 22266 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22267 enum nl80211_cqm_rssi_threshold_event rssi_event; 22268 struct cfg80211_cqm_config *cqm_config; 22269 struct sk_buff *msg; 22270 s32 rssi_level; 22271 22272 cqm_config = wiphy_dereference(wdev->wiphy, wdev->cqm_config); 22273 if (!cqm_config) 22274 return; 22275 22276 if (cqm_config->use_range_api) 22277 cfg80211_cqm_rssi_update(rdev, wdev->netdev, cqm_config); 22278 22279 rssi_level = cqm_config->last_rssi_event_value; 22280 rssi_event = cqm_config->last_rssi_event_type; 22281 22282 msg = cfg80211_prepare_cqm(wdev->netdev, NULL, GFP_KERNEL); 22283 if (!msg) 22284 return; 22285 22286 if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT, 22287 rssi_event)) 22288 goto nla_put_failure; 22289 22290 if (rssi_level && nla_put_s32(msg, NL80211_ATTR_CQM_RSSI_LEVEL, 22291 rssi_level)) 22292 goto nla_put_failure; 22293 22294 cfg80211_send_cqm(msg, GFP_KERNEL); 22295 22296 return; 22297 22298 nla_put_failure: 22299 nlmsg_free(msg); 22300 } 22301 22302 void cfg80211_cqm_txe_notify(struct net_device *dev, 22303 const u8 *peer, u32 num_packets, 22304 u32 rate, u32 intvl, gfp_t gfp) 22305 { 22306 struct sk_buff *msg; 22307 22308 msg = cfg80211_prepare_cqm(dev, peer, gfp); 22309 if (!msg) 22310 return; 22311 22312 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets)) 22313 goto nla_put_failure; 22314 22315 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate)) 22316 goto nla_put_failure; 22317 22318 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl)) 22319 goto nla_put_failure; 22320 22321 cfg80211_send_cqm(msg, gfp); 22322 return; 22323 22324 nla_put_failure: 22325 nlmsg_free(msg); 22326 } 22327 EXPORT_SYMBOL(cfg80211_cqm_txe_notify); 22328 22329 void cfg80211_cqm_pktloss_notify(struct net_device *dev, 22330 const u8 *peer, u32 num_packets, gfp_t gfp) 22331 { 22332 struct sk_buff *msg; 22333 22334 trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets); 22335 22336 msg = cfg80211_prepare_cqm(dev, peer, gfp); 22337 if (!msg) 22338 return; 22339 22340 if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets)) 22341 goto nla_put_failure; 22342 22343 cfg80211_send_cqm(msg, gfp); 22344 return; 22345 22346 nla_put_failure: 22347 nlmsg_free(msg); 22348 } 22349 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify); 22350 22351 void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp) 22352 { 22353 struct sk_buff *msg; 22354 22355 msg = cfg80211_prepare_cqm(dev, NULL, gfp); 22356 if (!msg) 22357 return; 22358 22359 if (nla_put_flag(msg, NL80211_ATTR_CQM_BEACON_LOSS_EVENT)) 22360 goto nla_put_failure; 22361 22362 cfg80211_send_cqm(msg, gfp); 22363 return; 22364 22365 nla_put_failure: 22366 nlmsg_free(msg); 22367 } 22368 EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify); 22369 22370 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev, 22371 struct net_device *netdev, const u8 *bssid, 22372 const u8 *replay_ctr, gfp_t gfp) 22373 { 22374 struct sk_buff *msg; 22375 struct nlattr *rekey_attr; 22376 void *hdr; 22377 22378 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22379 if (!msg) 22380 return; 22381 22382 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD); 22383 if (!hdr) { 22384 nlmsg_free(msg); 22385 return; 22386 } 22387 22388 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22389 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 22390 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 22391 goto nla_put_failure; 22392 22393 rekey_attr = nla_nest_start_noflag(msg, NL80211_ATTR_REKEY_DATA); 22394 if (!rekey_attr) 22395 goto nla_put_failure; 22396 22397 if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR, 22398 NL80211_REPLAY_CTR_LEN, replay_ctr)) 22399 goto nla_put_failure; 22400 22401 nla_nest_end(msg, rekey_attr); 22402 22403 genlmsg_end(msg, hdr); 22404 22405 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22406 NL80211_MCGRP_MLME, gfp); 22407 return; 22408 22409 nla_put_failure: 22410 nlmsg_free(msg); 22411 } 22412 22413 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid, 22414 const u8 *replay_ctr, gfp_t gfp) 22415 { 22416 struct wireless_dev *wdev = dev->ieee80211_ptr; 22417 struct wiphy *wiphy = wdev->wiphy; 22418 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22419 22420 trace_cfg80211_gtk_rekey_notify(dev, bssid); 22421 nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp); 22422 } 22423 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify); 22424 22425 static void 22426 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev, 22427 struct net_device *netdev, int index, 22428 const u8 *bssid, bool preauth, gfp_t gfp) 22429 { 22430 struct sk_buff *msg; 22431 struct nlattr *attr; 22432 void *hdr; 22433 22434 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22435 if (!msg) 22436 return; 22437 22438 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE); 22439 if (!hdr) { 22440 nlmsg_free(msg); 22441 return; 22442 } 22443 22444 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22445 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 22446 goto nla_put_failure; 22447 22448 attr = nla_nest_start_noflag(msg, NL80211_ATTR_PMKSA_CANDIDATE); 22449 if (!attr) 22450 goto nla_put_failure; 22451 22452 if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) || 22453 nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) || 22454 (preauth && 22455 nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH))) 22456 goto nla_put_failure; 22457 22458 nla_nest_end(msg, attr); 22459 22460 genlmsg_end(msg, hdr); 22461 22462 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22463 NL80211_MCGRP_MLME, gfp); 22464 return; 22465 22466 nla_put_failure: 22467 nlmsg_free(msg); 22468 } 22469 22470 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index, 22471 const u8 *bssid, bool preauth, gfp_t gfp) 22472 { 22473 struct wireless_dev *wdev = dev->ieee80211_ptr; 22474 struct wiphy *wiphy = wdev->wiphy; 22475 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22476 22477 trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth); 22478 nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp); 22479 } 22480 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify); 22481 22482 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev, 22483 struct net_device *netdev, 22484 unsigned int link_id, 22485 struct cfg80211_chan_def *chandef, 22486 gfp_t gfp, 22487 enum nl80211_commands notif, 22488 u8 count, bool quiet) 22489 { 22490 struct wireless_dev *wdev = netdev->ieee80211_ptr; 22491 struct sk_buff *msg; 22492 void *hdr; 22493 22494 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22495 if (!msg) 22496 return; 22497 22498 hdr = nl80211hdr_put(msg, 0, 0, 0, notif); 22499 if (!hdr) { 22500 nlmsg_free(msg); 22501 return; 22502 } 22503 22504 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 22505 goto nla_put_failure; 22506 22507 if (wdev->valid_links && 22508 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 22509 goto nla_put_failure; 22510 22511 if (nl80211_send_chandef(msg, chandef)) 22512 goto nla_put_failure; 22513 22514 if (notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) { 22515 if (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count)) 22516 goto nla_put_failure; 22517 if (quiet && 22518 nla_put_flag(msg, NL80211_ATTR_CH_SWITCH_BLOCK_TX)) 22519 goto nla_put_failure; 22520 } 22521 22522 genlmsg_end(msg, hdr); 22523 22524 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22525 NL80211_MCGRP_MLME, gfp); 22526 return; 22527 22528 nla_put_failure: 22529 nlmsg_free(msg); 22530 } 22531 22532 void cfg80211_ch_switch_notify(struct net_device *dev, 22533 struct cfg80211_chan_def *chandef, 22534 unsigned int link_id) 22535 { 22536 struct wireless_dev *wdev = dev->ieee80211_ptr; 22537 struct wiphy *wiphy = wdev->wiphy; 22538 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22539 22540 lockdep_assert_wiphy(wdev->wiphy); 22541 WARN_INVALID_LINK_ID(wdev, link_id); 22542 22543 trace_cfg80211_ch_switch_notify(dev, chandef, link_id); 22544 22545 switch (wdev->iftype) { 22546 case NL80211_IFTYPE_STATION: 22547 case NL80211_IFTYPE_P2P_CLIENT: 22548 if (!WARN_ON(!wdev->links[link_id].client.current_bss)) 22549 cfg80211_update_assoc_bss_entry(wdev, link_id, 22550 chandef->chan); 22551 break; 22552 case NL80211_IFTYPE_MESH_POINT: 22553 wdev->u.mesh.chandef = *chandef; 22554 wdev->u.mesh.preset_chandef = *chandef; 22555 break; 22556 case NL80211_IFTYPE_AP: 22557 case NL80211_IFTYPE_P2P_GO: 22558 wdev->links[link_id].ap.chandef = *chandef; 22559 break; 22560 case NL80211_IFTYPE_ADHOC: 22561 wdev->u.ibss.chandef = *chandef; 22562 break; 22563 default: 22564 WARN_ON(1); 22565 break; 22566 } 22567 22568 cfg80211_schedule_channels_check(wdev); 22569 cfg80211_sched_dfs_chan_update(rdev); 22570 22571 nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL, 22572 NL80211_CMD_CH_SWITCH_NOTIFY, 0, false); 22573 } 22574 EXPORT_SYMBOL(cfg80211_ch_switch_notify); 22575 22576 void cfg80211_incumbent_signal_notify(struct wiphy *wiphy, 22577 const struct cfg80211_chan_def *chandef, 22578 u32 signal_interference_bitmap, 22579 gfp_t gfp) 22580 { 22581 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22582 struct sk_buff *msg; 22583 void *hdr; 22584 22585 trace_cfg80211_incumbent_signal_notify(wiphy, chandef, signal_interference_bitmap); 22586 22587 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22588 if (!msg) 22589 return; 22590 22591 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_INCUMBENT_SIGNAL_DETECT); 22592 if (!hdr) 22593 goto nla_put_failure; 22594 22595 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 22596 goto nla_put_failure; 22597 22598 if (nl80211_send_chandef(msg, chandef)) 22599 goto nla_put_failure; 22600 22601 if (nla_put_u32(msg, NL80211_ATTR_INCUMBENT_SIGNAL_INTERFERENCE_BITMAP, 22602 signal_interference_bitmap)) 22603 goto nla_put_failure; 22604 22605 genlmsg_end(msg, hdr); 22606 22607 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22608 NL80211_MCGRP_MLME, gfp); 22609 return; 22610 22611 nla_put_failure: 22612 nlmsg_free(msg); 22613 } 22614 EXPORT_SYMBOL(cfg80211_incumbent_signal_notify); 22615 22616 void cfg80211_ch_switch_started_notify(struct net_device *dev, 22617 struct cfg80211_chan_def *chandef, 22618 unsigned int link_id, u8 count, 22619 bool quiet) 22620 { 22621 struct wireless_dev *wdev = dev->ieee80211_ptr; 22622 struct wiphy *wiphy = wdev->wiphy; 22623 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22624 22625 lockdep_assert_wiphy(wdev->wiphy); 22626 WARN_INVALID_LINK_ID(wdev, link_id); 22627 22628 trace_cfg80211_ch_switch_started_notify(dev, chandef, link_id); 22629 22630 22631 nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL, 22632 NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, 22633 count, quiet); 22634 } 22635 EXPORT_SYMBOL(cfg80211_ch_switch_started_notify); 22636 22637 int cfg80211_bss_color_notify(struct net_device *dev, 22638 enum nl80211_commands cmd, u8 count, 22639 u64 color_bitmap, u8 link_id) 22640 { 22641 struct wireless_dev *wdev = dev->ieee80211_ptr; 22642 struct wiphy *wiphy = wdev->wiphy; 22643 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22644 struct sk_buff *msg; 22645 void *hdr; 22646 22647 lockdep_assert_wiphy(wdev->wiphy); 22648 22649 trace_cfg80211_bss_color_notify(dev, cmd, count, color_bitmap); 22650 22651 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 22652 if (!msg) 22653 return -ENOMEM; 22654 22655 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 22656 if (!hdr) 22657 goto nla_put_failure; 22658 22659 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 22660 goto nla_put_failure; 22661 22662 if (wdev->valid_links && 22663 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 22664 goto nla_put_failure; 22665 22666 if (cmd == NL80211_CMD_COLOR_CHANGE_STARTED && 22667 nla_put_u32(msg, NL80211_ATTR_COLOR_CHANGE_COUNT, count)) 22668 goto nla_put_failure; 22669 22670 if (cmd == NL80211_CMD_OBSS_COLOR_COLLISION && 22671 nla_put_u64_64bit(msg, NL80211_ATTR_OBSS_COLOR_BITMAP, 22672 color_bitmap, NL80211_ATTR_PAD)) 22673 goto nla_put_failure; 22674 22675 genlmsg_end(msg, hdr); 22676 22677 return genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 22678 msg, 0, NL80211_MCGRP_MLME, GFP_KERNEL); 22679 22680 nla_put_failure: 22681 nlmsg_free(msg); 22682 return -EINVAL; 22683 } 22684 EXPORT_SYMBOL(cfg80211_bss_color_notify); 22685 22686 void 22687 nl80211_radar_notify(struct cfg80211_registered_device *rdev, 22688 const struct cfg80211_chan_def *chandef, 22689 enum nl80211_radar_event event, 22690 struct net_device *netdev, gfp_t gfp) 22691 { 22692 struct sk_buff *msg; 22693 void *hdr; 22694 22695 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22696 if (!msg) 22697 return; 22698 22699 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT); 22700 if (!hdr) { 22701 nlmsg_free(msg); 22702 return; 22703 } 22704 22705 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 22706 goto nla_put_failure; 22707 22708 /* NOP and radar events don't need a netdev parameter */ 22709 if (netdev) { 22710 struct wireless_dev *wdev = netdev->ieee80211_ptr; 22711 22712 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 22713 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22714 NL80211_ATTR_PAD)) 22715 goto nla_put_failure; 22716 } 22717 22718 if (rdev->background_radar_wdev && 22719 cfg80211_chandef_identical(&rdev->background_radar_chandef, 22720 chandef)) { 22721 if (nla_put_flag(msg, NL80211_ATTR_RADAR_BACKGROUND)) 22722 goto nla_put_failure; 22723 } 22724 22725 if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event)) 22726 goto nla_put_failure; 22727 22728 if (nl80211_send_chandef(msg, chandef)) 22729 goto nla_put_failure; 22730 22731 genlmsg_end(msg, hdr); 22732 22733 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22734 NL80211_MCGRP_MLME, gfp); 22735 return; 22736 22737 nla_put_failure: 22738 nlmsg_free(msg); 22739 } 22740 22741 void cfg80211_sta_opmode_change_notify(struct net_device *dev, const u8 *mac, 22742 struct sta_opmode_info *sta_opmode, 22743 gfp_t gfp) 22744 { 22745 struct sk_buff *msg; 22746 struct wireless_dev *wdev = dev->ieee80211_ptr; 22747 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22748 void *hdr; 22749 22750 if (WARN_ON(!mac)) 22751 return; 22752 22753 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22754 if (!msg) 22755 return; 22756 22757 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STA_OPMODE_CHANGED); 22758 if (!hdr) { 22759 nlmsg_free(msg); 22760 return; 22761 } 22762 22763 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 22764 goto nla_put_failure; 22765 22766 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 22767 goto nla_put_failure; 22768 22769 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac)) 22770 goto nla_put_failure; 22771 22772 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) && 22773 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode)) 22774 goto nla_put_failure; 22775 22776 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && 22777 nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) 22778 goto nla_put_failure; 22779 22780 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && 22781 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss)) 22782 goto nla_put_failure; 22783 22784 genlmsg_end(msg, hdr); 22785 22786 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22787 NL80211_MCGRP_MLME, gfp); 22788 22789 return; 22790 22791 nla_put_failure: 22792 nlmsg_free(msg); 22793 } 22794 EXPORT_SYMBOL(cfg80211_sta_opmode_change_notify); 22795 22796 void cfg80211_probe_status(struct net_device *dev, const u8 *peer, u64 cookie, 22797 int link_id, bool acked, s32 ack_signal, 22798 bool is_valid_ack_signal, gfp_t gfp) 22799 { 22800 struct wireless_dev *wdev = dev->ieee80211_ptr; 22801 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22802 struct sk_buff *msg; 22803 void *hdr; 22804 22805 trace_cfg80211_probe_status(dev, peer, cookie, acked); 22806 22807 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22808 22809 if (!msg) 22810 return; 22811 22812 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_PEER); 22813 if (!hdr) { 22814 nlmsg_free(msg); 22815 return; 22816 } 22817 22818 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22819 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 22820 (peer && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer)) || 22821 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 22822 NL80211_ATTR_PAD)) 22823 goto nla_put_failure; 22824 22825 if (link_id >= 0 && 22826 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 22827 goto nla_put_failure; 22828 22829 if ((acked && nla_put_flag(msg, NL80211_ATTR_ACK)) || 22830 (is_valid_ack_signal && 22831 nla_put_s32(msg, NL80211_ATTR_ACK_SIGNAL, ack_signal))) 22832 goto nla_put_failure; 22833 22834 genlmsg_end(msg, hdr); 22835 22836 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22837 NL80211_MCGRP_MLME, gfp); 22838 return; 22839 22840 nla_put_failure: 22841 nlmsg_free(msg); 22842 } 22843 EXPORT_SYMBOL(cfg80211_probe_status); 22844 22845 void cfg80211_report_obss_beacon_khz(struct wiphy *wiphy, const u8 *frame, 22846 size_t len, int freq, int sig_dbm) 22847 { 22848 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22849 struct sk_buff *msg; 22850 void *hdr; 22851 struct cfg80211_beacon_registration *reg; 22852 22853 trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm); 22854 22855 spin_lock_bh(&rdev->beacon_registrations_lock); 22856 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 22857 msg = nlmsg_new(len + 100, GFP_ATOMIC); 22858 if (!msg) { 22859 spin_unlock_bh(&rdev->beacon_registrations_lock); 22860 return; 22861 } 22862 22863 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 22864 if (!hdr) 22865 goto nla_put_failure; 22866 22867 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22868 (freq && 22869 (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, 22870 KHZ_TO_MHZ(freq)) || 22871 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, 22872 freq % 1000))) || 22873 (sig_dbm && 22874 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) || 22875 nla_put(msg, NL80211_ATTR_FRAME, len, frame)) 22876 goto nla_put_failure; 22877 22878 genlmsg_end(msg, hdr); 22879 22880 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); 22881 } 22882 spin_unlock_bh(&rdev->beacon_registrations_lock); 22883 return; 22884 22885 nla_put_failure: 22886 spin_unlock_bh(&rdev->beacon_registrations_lock); 22887 nlmsg_free(msg); 22888 } 22889 EXPORT_SYMBOL(cfg80211_report_obss_beacon_khz); 22890 22891 #ifdef CONFIG_PM 22892 static int cfg80211_net_detect_results(struct sk_buff *msg, 22893 struct cfg80211_wowlan_wakeup *wakeup) 22894 { 22895 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect; 22896 struct nlattr *nl_results, *nl_match, *nl_freqs; 22897 int i, j; 22898 22899 nl_results = nla_nest_start_noflag(msg, 22900 NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS); 22901 if (!nl_results) 22902 return -EMSGSIZE; 22903 22904 for (i = 0; i < nd->n_matches; i++) { 22905 struct cfg80211_wowlan_nd_match *match = nd->matches[i]; 22906 22907 nl_match = nla_nest_start_noflag(msg, i); 22908 if (!nl_match) 22909 break; 22910 22911 /* The SSID attribute is optional in nl80211, but for 22912 * simplicity reasons it's always present in the 22913 * cfg80211 structure. If a driver can't pass the 22914 * SSID, that needs to be changed. A zero length SSID 22915 * is still a valid SSID (wildcard), so it cannot be 22916 * used for this purpose. 22917 */ 22918 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len, 22919 match->ssid.ssid)) { 22920 nla_nest_cancel(msg, nl_match); 22921 goto out; 22922 } 22923 22924 if (match->n_channels) { 22925 nl_freqs = nla_nest_start_noflag(msg, 22926 NL80211_ATTR_SCAN_FREQUENCIES); 22927 if (!nl_freqs) { 22928 nla_nest_cancel(msg, nl_match); 22929 goto out; 22930 } 22931 22932 for (j = 0; j < match->n_channels; j++) { 22933 if (nla_put_u32(msg, j, match->channels[j])) { 22934 nla_nest_cancel(msg, nl_freqs); 22935 nla_nest_cancel(msg, nl_match); 22936 goto out; 22937 } 22938 } 22939 22940 nla_nest_end(msg, nl_freqs); 22941 } 22942 22943 nla_nest_end(msg, nl_match); 22944 } 22945 22946 out: 22947 nla_nest_end(msg, nl_results); 22948 return 0; 22949 } 22950 22951 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev, 22952 struct cfg80211_wowlan_wakeup *wakeup, 22953 gfp_t gfp) 22954 { 22955 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22956 struct sk_buff *msg; 22957 void *hdr; 22958 int size = 200; 22959 22960 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); 22961 22962 if (wakeup) 22963 size += wakeup->packet_present_len; 22964 22965 msg = nlmsg_new(size, gfp); 22966 if (!msg) 22967 return; 22968 22969 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN); 22970 if (!hdr) 22971 goto free_msg; 22972 22973 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22974 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22975 NL80211_ATTR_PAD)) 22976 goto free_msg; 22977 22978 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 22979 wdev->netdev->ifindex)) 22980 goto free_msg; 22981 22982 if (wakeup) { 22983 struct nlattr *reasons; 22984 22985 reasons = nla_nest_start_noflag(msg, 22986 NL80211_ATTR_WOWLAN_TRIGGERS); 22987 if (!reasons) 22988 goto free_msg; 22989 22990 if (wakeup->disconnect && 22991 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) 22992 goto free_msg; 22993 if (wakeup->magic_pkt && 22994 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) 22995 goto free_msg; 22996 if (wakeup->gtk_rekey_failure && 22997 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) 22998 goto free_msg; 22999 if (wakeup->eap_identity_req && 23000 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) 23001 goto free_msg; 23002 if (wakeup->four_way_handshake && 23003 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) 23004 goto free_msg; 23005 if (wakeup->rfkill_release && 23006 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)) 23007 goto free_msg; 23008 23009 if (wakeup->pattern_idx >= 0 && 23010 nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN, 23011 wakeup->pattern_idx)) 23012 goto free_msg; 23013 23014 if (wakeup->tcp_match && 23015 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH)) 23016 goto free_msg; 23017 23018 if (wakeup->tcp_connlost && 23019 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST)) 23020 goto free_msg; 23021 23022 if (wakeup->tcp_nomoretokens && 23023 nla_put_flag(msg, 23024 NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS)) 23025 goto free_msg; 23026 23027 if (wakeup->unprot_deauth_disassoc && 23028 nla_put_flag(msg, 23029 NL80211_WOWLAN_TRIG_UNPROTECTED_DEAUTH_DISASSOC)) 23030 goto free_msg; 23031 23032 if (wakeup->packet) { 23033 u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211; 23034 u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN; 23035 23036 if (!wakeup->packet_80211) { 23037 pkt_attr = 23038 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023; 23039 len_attr = 23040 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN; 23041 } 23042 23043 if (wakeup->packet_len && 23044 nla_put_u32(msg, len_attr, wakeup->packet_len)) 23045 goto free_msg; 23046 23047 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, 23048 wakeup->packet)) 23049 goto free_msg; 23050 } 23051 23052 if (wakeup->net_detect && 23053 cfg80211_net_detect_results(msg, wakeup)) 23054 goto free_msg; 23055 23056 nla_nest_end(msg, reasons); 23057 } 23058 23059 genlmsg_end(msg, hdr); 23060 23061 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 23062 NL80211_MCGRP_MLME, gfp); 23063 return; 23064 23065 free_msg: 23066 nlmsg_free(msg); 23067 } 23068 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup); 23069 #endif 23070 23071 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer, 23072 enum nl80211_tdls_operation oper, 23073 u16 reason_code, gfp_t gfp) 23074 { 23075 struct wireless_dev *wdev = dev->ieee80211_ptr; 23076 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 23077 struct sk_buff *msg; 23078 void *hdr; 23079 23080 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, 23081 reason_code); 23082 23083 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23084 if (!msg) 23085 return; 23086 23087 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER); 23088 if (!hdr) { 23089 nlmsg_free(msg); 23090 return; 23091 } 23092 23093 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23094 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 23095 nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) || 23096 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) || 23097 (reason_code > 0 && 23098 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code))) 23099 goto nla_put_failure; 23100 23101 genlmsg_end(msg, hdr); 23102 23103 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 23104 NL80211_MCGRP_MLME, gfp); 23105 return; 23106 23107 nla_put_failure: 23108 nlmsg_free(msg); 23109 } 23110 EXPORT_SYMBOL(cfg80211_tdls_oper_request); 23111 23112 static int nl80211_netlink_notify(struct notifier_block * nb, 23113 unsigned long state, 23114 void *_notify) 23115 { 23116 struct netlink_notify *notify = _notify; 23117 struct cfg80211_registered_device *rdev; 23118 struct wireless_dev *wdev; 23119 struct cfg80211_beacon_registration *reg, *tmp; 23120 23121 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC) 23122 return NOTIFY_DONE; 23123 23124 rcu_read_lock(); 23125 23126 list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) { 23127 struct cfg80211_sched_scan_request *sched_scan_req; 23128 23129 list_for_each_entry_rcu(sched_scan_req, 23130 &rdev->sched_scan_req_list, 23131 list) { 23132 if (sched_scan_req->owner_nlportid == notify->portid) { 23133 sched_scan_req->nl_owner_dead = true; 23134 wiphy_work_queue(&rdev->wiphy, 23135 &rdev->sched_scan_stop_wk); 23136 } 23137 } 23138 23139 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) { 23140 cfg80211_mlme_unregister_socket(wdev, notify->portid); 23141 23142 if (wdev->owner_nlportid == notify->portid) { 23143 wdev->nl_owner_dead = true; 23144 schedule_work(&rdev->destroy_work); 23145 } else if (wdev->conn_owner_nlportid == notify->portid) { 23146 wiphy_work_queue(wdev->wiphy, 23147 &wdev->disconnect_wk); 23148 } 23149 23150 cfg80211_release_pmsr(wdev, notify->portid); 23151 } 23152 23153 spin_lock_bh(&rdev->beacon_registrations_lock); 23154 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, 23155 list) { 23156 if (reg->nlportid == notify->portid) { 23157 list_del(®->list); 23158 kfree(reg); 23159 break; 23160 } 23161 } 23162 spin_unlock_bh(&rdev->beacon_registrations_lock); 23163 } 23164 23165 rcu_read_unlock(); 23166 23167 /* 23168 * It is possible that the user space process that is controlling the 23169 * indoor setting disappeared, so notify the regulatory core. 23170 */ 23171 regulatory_netlink_notify(notify->portid); 23172 return NOTIFY_OK; 23173 } 23174 23175 static struct notifier_block nl80211_netlink_notifier = { 23176 .notifier_call = nl80211_netlink_notify, 23177 }; 23178 23179 void cfg80211_ft_event(struct net_device *netdev, 23180 struct cfg80211_ft_event_params *ft_event) 23181 { 23182 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; 23183 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23184 struct sk_buff *msg; 23185 void *hdr; 23186 23187 trace_cfg80211_ft_event(wiphy, netdev, ft_event); 23188 23189 if (!ft_event->target_ap) 23190 return; 23191 23192 msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len, 23193 GFP_KERNEL); 23194 if (!msg) 23195 return; 23196 23197 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT); 23198 if (!hdr) 23199 goto out; 23200 23201 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23202 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 23203 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) 23204 goto out; 23205 23206 if (ft_event->ies && 23207 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) 23208 goto out; 23209 if (ft_event->ric_ies && 23210 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, 23211 ft_event->ric_ies)) 23212 goto out; 23213 23214 genlmsg_end(msg, hdr); 23215 23216 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 23217 NL80211_MCGRP_MLME, GFP_KERNEL); 23218 return; 23219 out: 23220 nlmsg_free(msg); 23221 } 23222 EXPORT_SYMBOL(cfg80211_ft_event); 23223 23224 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp) 23225 { 23226 struct cfg80211_registered_device *rdev; 23227 struct sk_buff *msg; 23228 void *hdr; 23229 u32 nlportid; 23230 23231 rdev = wiphy_to_rdev(wdev->wiphy); 23232 if (!rdev->crit_proto_nlportid) 23233 return; 23234 23235 nlportid = rdev->crit_proto_nlportid; 23236 rdev->crit_proto_nlportid = 0; 23237 23238 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23239 if (!msg) 23240 return; 23241 23242 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP); 23243 if (!hdr) 23244 goto nla_put_failure; 23245 23246 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23247 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23248 NL80211_ATTR_PAD)) 23249 goto nla_put_failure; 23250 23251 genlmsg_end(msg, hdr); 23252 23253 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 23254 return; 23255 23256 nla_put_failure: 23257 nlmsg_free(msg); 23258 } 23259 EXPORT_SYMBOL(cfg80211_crit_proto_stopped); 23260 23261 void nl80211_send_ap_stopped(struct wireless_dev *wdev, unsigned int link_id) 23262 { 23263 struct wiphy *wiphy = wdev->wiphy; 23264 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23265 struct sk_buff *msg; 23266 void *hdr; 23267 23268 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 23269 if (!msg) 23270 return; 23271 23272 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP); 23273 if (!hdr) 23274 goto out; 23275 23276 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23277 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || 23278 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23279 NL80211_ATTR_PAD) || 23280 (wdev->valid_links && 23281 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))) 23282 goto out; 23283 23284 genlmsg_end(msg, hdr); 23285 23286 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0, 23287 NL80211_MCGRP_MLME, GFP_KERNEL); 23288 return; 23289 out: 23290 nlmsg_free(msg); 23291 } 23292 23293 int cfg80211_external_auth_request(struct net_device *dev, 23294 struct cfg80211_external_auth_params *params, 23295 gfp_t gfp) 23296 { 23297 struct wireless_dev *wdev = dev->ieee80211_ptr; 23298 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 23299 struct sk_buff *msg; 23300 void *hdr; 23301 23302 if (!wdev->conn_owner_nlportid) 23303 return -EINVAL; 23304 23305 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23306 if (!msg) 23307 return -ENOMEM; 23308 23309 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EXTERNAL_AUTH); 23310 if (!hdr) 23311 goto nla_put_failure; 23312 23313 /* Some historical mistakes in drivers <-> userspace interface (notably 23314 * between drivers and wpa_supplicant) led to a big-endian conversion 23315 * being needed on NL80211_ATTR_AKM_SUITES _only_ when its value is 23316 * WLAN_AKM_SUITE_SAE. This is now fixed on userspace side, but for the 23317 * benefit of older wpa_supplicant versions, send this particular value 23318 * in big-endian. Note that newer wpa_supplicant will also detect this 23319 * particular value in big endian still, so it all continues to work. 23320 */ 23321 if (params->key_mgmt_suite == WLAN_AKM_SUITE_SAE) { 23322 if (nla_put_be32(msg, NL80211_ATTR_AKM_SUITES, 23323 cpu_to_be32(WLAN_AKM_SUITE_SAE))) 23324 goto nla_put_failure; 23325 } else { 23326 if (nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, 23327 params->key_mgmt_suite)) 23328 goto nla_put_failure; 23329 } 23330 23331 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23332 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 23333 nla_put_u32(msg, NL80211_ATTR_EXTERNAL_AUTH_ACTION, 23334 params->action) || 23335 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) || 23336 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len, 23337 params->ssid.ssid) || 23338 (!is_zero_ether_addr(params->mld_addr) && 23339 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, params->mld_addr))) 23340 goto nla_put_failure; 23341 23342 genlmsg_end(msg, hdr); 23343 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 23344 wdev->conn_owner_nlportid); 23345 return 0; 23346 23347 nla_put_failure: 23348 nlmsg_free(msg); 23349 return -ENOBUFS; 23350 } 23351 EXPORT_SYMBOL(cfg80211_external_auth_request); 23352 23353 void cfg80211_update_owe_info_event(struct net_device *netdev, 23354 struct cfg80211_update_owe_info *owe_info, 23355 gfp_t gfp) 23356 { 23357 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; 23358 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23359 struct sk_buff *msg; 23360 void *hdr; 23361 23362 trace_cfg80211_update_owe_info_event(wiphy, netdev, owe_info); 23363 23364 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23365 if (!msg) 23366 return; 23367 23368 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_UPDATE_OWE_INFO); 23369 if (!hdr) 23370 goto nla_put_failure; 23371 23372 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23373 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 23374 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer)) 23375 goto nla_put_failure; 23376 23377 if (!owe_info->ie_len || 23378 nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie)) 23379 goto nla_put_failure; 23380 23381 if (owe_info->assoc_link_id != -1) { 23382 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, 23383 owe_info->assoc_link_id)) 23384 goto nla_put_failure; 23385 23386 if (!is_zero_ether_addr(owe_info->peer_mld_addr) && 23387 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, 23388 owe_info->peer_mld_addr)) 23389 goto nla_put_failure; 23390 } 23391 23392 genlmsg_end(msg, hdr); 23393 23394 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 23395 NL80211_MCGRP_MLME, gfp); 23396 return; 23397 23398 nla_put_failure: 23399 genlmsg_cancel(msg, hdr); 23400 nlmsg_free(msg); 23401 } 23402 EXPORT_SYMBOL(cfg80211_update_owe_info_event); 23403 23404 void cfg80211_schedule_channels_check(struct wireless_dev *wdev) 23405 { 23406 struct wiphy *wiphy = wdev->wiphy; 23407 23408 /* Schedule channels check if NO_IR or DFS relaxations are supported */ 23409 if (wdev->iftype == NL80211_IFTYPE_STATION && 23410 (wiphy_ext_feature_isset(wiphy, 23411 NL80211_EXT_FEATURE_DFS_CONCURRENT) || 23412 (IS_ENABLED(CONFIG_CFG80211_REG_RELAX_NO_IR) && 23413 wiphy->regulatory_flags & REGULATORY_ENABLE_RELAX_NO_IR))) 23414 reg_check_channels(); 23415 } 23416 EXPORT_SYMBOL(cfg80211_schedule_channels_check); 23417 23418 void cfg80211_epcs_changed(struct net_device *netdev, bool enabled) 23419 { 23420 struct wireless_dev *wdev = netdev->ieee80211_ptr; 23421 struct wiphy *wiphy = wdev->wiphy; 23422 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23423 struct sk_buff *msg; 23424 void *hdr; 23425 23426 trace_cfg80211_epcs_changed(wdev, enabled); 23427 23428 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 23429 if (!msg) 23430 return; 23431 23432 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EPCS_CFG); 23433 if (!hdr) { 23434 nlmsg_free(msg); 23435 return; 23436 } 23437 23438 if (enabled && nla_put_flag(msg, NL80211_ATTR_EPCS)) 23439 goto nla_put_failure; 23440 23441 genlmsg_end(msg, hdr); 23442 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 23443 NL80211_MCGRP_MLME, GFP_KERNEL); 23444 return; 23445 23446 nla_put_failure: 23447 nlmsg_free(msg); 23448 } 23449 EXPORT_SYMBOL(cfg80211_epcs_changed); 23450 23451 void cfg80211_next_nan_dw_notif(struct wireless_dev *wdev, 23452 struct ieee80211_channel *chan, gfp_t gfp) 23453 { 23454 struct wiphy *wiphy = wdev->wiphy; 23455 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23456 struct sk_buff *msg; 23457 void *hdr; 23458 23459 trace_cfg80211_next_nan_dw_notif(wdev, chan); 23460 23461 if (!wdev->owner_nlportid) 23462 return; 23463 23464 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23465 if (!msg) 23466 return; 23467 23468 hdr = nl80211hdr_put(msg, 0, 0, 0, 23469 NL80211_CMD_NAN_NEXT_DW_NOTIFICATION); 23470 if (!hdr) 23471 goto nla_put_failure; 23472 23473 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23474 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23475 NL80211_ATTR_PAD) || 23476 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq)) 23477 goto nla_put_failure; 23478 23479 genlmsg_end(msg, hdr); 23480 23481 genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid); 23482 23483 return; 23484 23485 nla_put_failure: 23486 nlmsg_free(msg); 23487 } 23488 EXPORT_SYMBOL(cfg80211_next_nan_dw_notif); 23489 23490 void cfg80211_nan_cluster_joined(struct wireless_dev *wdev, 23491 const u8 *cluster_id, bool new_cluster, 23492 gfp_t gfp) 23493 { 23494 struct wiphy *wiphy = wdev->wiphy; 23495 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23496 struct sk_buff *msg; 23497 void *hdr; 23498 23499 trace_cfg80211_nan_cluster_joined(wdev, cluster_id, new_cluster); 23500 23501 memcpy(wdev->u.nan.cluster_id, cluster_id, ETH_ALEN); 23502 23503 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23504 if (!msg) 23505 return; 23506 23507 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_CLUSTER_JOINED); 23508 if (!hdr) 23509 goto nla_put_failure; 23510 23511 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23512 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23513 NL80211_ATTR_PAD) || 23514 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cluster_id) || 23515 (new_cluster && nla_put_flag(msg, NL80211_ATTR_NAN_NEW_CLUSTER))) 23516 goto nla_put_failure; 23517 23518 genlmsg_end(msg, hdr); 23519 23520 if (!wdev->owner_nlportid) 23521 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), 23522 msg, 0, NL80211_MCGRP_NAN, gfp); 23523 else 23524 genlmsg_unicast(wiphy_net(wiphy), msg, 23525 wdev->owner_nlportid); 23526 return; 23527 23528 nla_put_failure: 23529 nlmsg_free(msg); 23530 } 23531 EXPORT_SYMBOL(cfg80211_nan_cluster_joined); 23532 23533 void cfg80211_nan_ulw_update(struct wireless_dev *wdev, 23534 const u8 *ulw, size_t ulw_len, gfp_t gfp) 23535 { 23536 struct wiphy *wiphy = wdev->wiphy; 23537 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23538 struct sk_buff *msg; 23539 void *hdr; 23540 23541 trace_cfg80211_nan_ulw_update(wiphy, wdev, ulw, ulw_len); 23542 23543 if (!wdev->owner_nlportid) 23544 return; 23545 23546 /* 32 for the wiphy idx, 64 for the wdev id, 100 for padding */ 23547 msg = nlmsg_new(nla_total_size(sizeof(u32)) + 23548 nla_total_size(ulw_len) + 23549 nla_total_size(sizeof(u64)) + 100, 23550 gfp); 23551 if (!msg) 23552 return; 23553 23554 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_ULW_UPDATE); 23555 if (!hdr) 23556 goto nla_put_failure; 23557 23558 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23559 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23560 NL80211_ATTR_PAD) || 23561 (ulw && ulw_len && 23562 nla_put(msg, NL80211_ATTR_NAN_ULW, ulw_len, ulw))) 23563 goto nla_put_failure; 23564 23565 genlmsg_end(msg, hdr); 23566 23567 genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid); 23568 23569 return; 23570 23571 nla_put_failure: 23572 nlmsg_free(msg); 23573 } 23574 EXPORT_SYMBOL(cfg80211_nan_ulw_update); 23575 23576 void cfg80211_nan_channel_evac(struct wireless_dev *wdev, 23577 const struct cfg80211_chan_def *chandef, 23578 gfp_t gfp) 23579 { 23580 struct wiphy *wiphy = wdev->wiphy; 23581 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23582 struct sk_buff *msg; 23583 struct nlattr *chan_attr; 23584 void *hdr; 23585 23586 trace_cfg80211_nan_channel_evac(wiphy, wdev, chandef); 23587 23588 if (!wdev->owner_nlportid) 23589 return; 23590 23591 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23592 if (!msg) 23593 return; 23594 23595 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_CHANNEL_EVAC); 23596 if (!hdr) 23597 goto nla_put_failure; 23598 23599 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23600 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23601 NL80211_ATTR_PAD)) 23602 goto nla_put_failure; 23603 23604 chan_attr = nla_nest_start(msg, NL80211_ATTR_NAN_CHANNEL); 23605 if (!chan_attr) 23606 goto nla_put_failure; 23607 23608 if (nl80211_send_chandef(msg, chandef)) 23609 goto nla_put_failure; 23610 23611 nla_nest_end(msg, chan_attr); 23612 23613 genlmsg_end(msg, hdr); 23614 23615 genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid); 23616 23617 return; 23618 23619 nla_put_failure: 23620 nlmsg_free(msg); 23621 } 23622 EXPORT_SYMBOL(cfg80211_nan_channel_evac); 23623 23624 /* initialisation/exit functions */ 23625 23626 int __init nl80211_init(void) 23627 { 23628 int err; 23629 23630 err = genl_register_family(&nl80211_fam); 23631 if (err) 23632 return err; 23633 23634 err = netlink_register_notifier(&nl80211_netlink_notifier); 23635 if (err) 23636 goto err_out; 23637 23638 return 0; 23639 err_out: 23640 genl_unregister_family(&nl80211_fam); 23641 return err; 23642 } 23643 23644 void nl80211_exit(void) 23645 { 23646 netlink_unregister_notifier(&nl80211_netlink_notifier); 23647 genl_unregister_family(&nl80211_fam); 23648 } 23649