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, false)) 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] = { .type = NLA_U32 }, 465 [NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP] = 466 NLA_POLICY_MAX(NLA_U8, 15), 467 [NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD] = { .type = NLA_U16 }, 468 [NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION] = 469 NLA_POLICY_MAX(NLA_U8, 15), 470 [NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST] = { .type = NLA_U8 }, 471 [NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES] = { .type = NLA_U8 }, 472 [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI] = { .type = NLA_FLAG }, 473 [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC] = { .type = NLA_FLAG }, 474 [NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED] = { .type = NLA_FLAG }, 475 [NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED] = { .type = NLA_FLAG }, 476 [NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK] = { .type = NLA_FLAG }, 477 [NL80211_PMSR_FTM_REQ_ATTR_BSS_COLOR] = { .type = NLA_U8 }, 478 [NL80211_PMSR_FTM_REQ_ATTR_RSTA] = { .type = NLA_FLAG }, 479 [NL80211_PMSR_FTM_REQ_ATTR_MIN_TIME_BETWEEN_MEASUREMENTS] = { 480 .type = NLA_U32 481 }, 482 [NL80211_PMSR_FTM_REQ_ATTR_MAX_TIME_BETWEEN_MEASUREMENTS] = { 483 .type = NLA_U32 484 }, 485 [NL80211_PMSR_FTM_REQ_ATTR_NOMINAL_TIME] = { .type = NLA_U32 }, 486 [NL80211_PMSR_FTM_REQ_ATTR_AW_DURATION] = NLA_POLICY_MAX(NLA_U32, 255), 487 [NL80211_PMSR_FTM_REQ_ATTR_NUM_MEASUREMENTS] = { .type = NLA_U32 }, 488 [NL80211_PMSR_FTM_REQ_ATTR_INGRESS] = { .type = NLA_U64 }, 489 [NL80211_PMSR_FTM_REQ_ATTR_EGRESS] = { .type = NLA_U64 }, 490 [NL80211_PMSR_FTM_REQ_ATTR_PD_SUPPRESS_RESULTS] = { .type = NLA_FLAG }, 491 }; 492 493 static const struct nla_policy 494 nl80211_pmsr_req_data_policy[NL80211_PMSR_TYPE_MAX + 1] = { 495 [NL80211_PMSR_TYPE_FTM] = 496 NLA_POLICY_NESTED(nl80211_pmsr_ftm_req_attr_policy), 497 }; 498 499 static const struct nla_policy 500 nl80211_pmsr_req_attr_policy[NL80211_PMSR_REQ_ATTR_MAX + 1] = { 501 [NL80211_PMSR_REQ_ATTR_DATA] = 502 NLA_POLICY_NESTED(nl80211_pmsr_req_data_policy), 503 [NL80211_PMSR_REQ_ATTR_GET_AP_TSF] = { .type = NLA_FLAG }, 504 }; 505 506 static const struct nla_policy 507 nl80211_pmsr_peer_attr_policy[NL80211_PMSR_PEER_ATTR_MAX + 1] = { 508 [NL80211_PMSR_PEER_ATTR_ADDR] = NLA_POLICY_ETH_ADDR, 509 [NL80211_PMSR_PEER_ATTR_CHAN] = NLA_POLICY_NESTED(nl80211_policy), 510 [NL80211_PMSR_PEER_ATTR_REQ] = 511 NLA_POLICY_NESTED(nl80211_pmsr_req_attr_policy), 512 [NL80211_PMSR_PEER_ATTR_RESP] = { .type = NLA_REJECT }, 513 [NL80211_PMSR_PEER_ATTR_REQ_TYPE] = 514 NLA_POLICY_MAX(NLA_U32, NL80211_PMSR_FTM_REQ_TYPE_MAX), 515 }; 516 517 static const struct nla_policy 518 nl80211_pmsr_attr_policy[NL80211_PMSR_ATTR_MAX + 1] = { 519 [NL80211_PMSR_ATTR_MAX_PEERS] = { .type = NLA_REJECT }, 520 [NL80211_PMSR_ATTR_REPORT_AP_TSF] = { .type = NLA_REJECT }, 521 [NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR] = { .type = NLA_REJECT }, 522 [NL80211_PMSR_ATTR_TYPE_CAPA] = { .type = NLA_REJECT }, 523 [NL80211_PMSR_ATTR_PEERS] = 524 NLA_POLICY_NESTED_ARRAY(nl80211_pmsr_peer_attr_policy), 525 }; 526 527 static const struct nla_policy 528 he_obss_pd_policy[NL80211_HE_OBSS_PD_ATTR_MAX + 1] = { 529 [NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET] = 530 NLA_POLICY_RANGE(NLA_U8, 1, 20), 531 [NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET] = 532 NLA_POLICY_RANGE(NLA_U8, 1, 20), 533 [NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET] = 534 NLA_POLICY_RANGE(NLA_U8, 1, 20), 535 [NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP] = 536 NLA_POLICY_EXACT_LEN(8), 537 [NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP] = 538 NLA_POLICY_EXACT_LEN(8), 539 [NL80211_HE_OBSS_PD_ATTR_SR_CTRL] = { .type = NLA_U8 }, 540 }; 541 542 static const struct nla_policy 543 he_bss_color_policy[NL80211_HE_BSS_COLOR_ATTR_MAX + 1] = { 544 [NL80211_HE_BSS_COLOR_ATTR_COLOR] = NLA_POLICY_RANGE(NLA_U8, 1, 63), 545 [NL80211_HE_BSS_COLOR_ATTR_DISABLED] = { .type = NLA_FLAG }, 546 [NL80211_HE_BSS_COLOR_ATTR_PARTIAL] = { .type = NLA_FLAG }, 547 }; 548 549 static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = { 550 [NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY, 551 .len = NL80211_MAX_SUPP_RATES }, 552 [NL80211_TXRATE_HT] = { .type = NLA_BINARY, 553 .len = NL80211_MAX_SUPP_HT_RATES }, 554 [NL80211_TXRATE_VHT] = NLA_POLICY_EXACT_LEN_WARN(sizeof(struct nl80211_txrate_vht)), 555 [NL80211_TXRATE_GI] = { .type = NLA_U8 }, 556 [NL80211_TXRATE_HE] = NLA_POLICY_EXACT_LEN(sizeof(struct nl80211_txrate_he)), 557 [NL80211_TXRATE_HE_GI] = NLA_POLICY_RANGE(NLA_U8, 558 NL80211_RATE_INFO_HE_GI_0_8, 559 NL80211_RATE_INFO_HE_GI_3_2), 560 [NL80211_TXRATE_HE_LTF] = NLA_POLICY_RANGE(NLA_U8, 561 NL80211_RATE_INFO_HE_1XLTF, 562 NL80211_RATE_INFO_HE_4XLTF), 563 [NL80211_TXRATE_EHT] = NLA_POLICY_EXACT_LEN(sizeof(struct nl80211_txrate_eht)), 564 [NL80211_TXRATE_EHT_GI] = NLA_POLICY_RANGE(NLA_U8, 565 NL80211_RATE_INFO_EHT_GI_0_8, 566 NL80211_RATE_INFO_EHT_GI_3_2), 567 [NL80211_TXRATE_EHT_LTF] = NLA_POLICY_RANGE(NLA_U8, 568 NL80211_RATE_INFO_EHT_1XLTF, 569 NL80211_RATE_INFO_EHT_8XLTF), 570 571 }; 572 573 static const struct nla_policy 574 nl80211_tid_config_attr_policy[NL80211_TID_CONFIG_ATTR_MAX + 1] = { 575 [NL80211_TID_CONFIG_ATTR_VIF_SUPP] = { .type = NLA_U64 }, 576 [NL80211_TID_CONFIG_ATTR_PEER_SUPP] = { .type = NLA_U64 }, 577 [NL80211_TID_CONFIG_ATTR_OVERRIDE] = { .type = NLA_FLAG }, 578 [NL80211_TID_CONFIG_ATTR_TIDS] = NLA_POLICY_RANGE(NLA_U16, 1, 0xff), 579 [NL80211_TID_CONFIG_ATTR_NOACK] = 580 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 581 [NL80211_TID_CONFIG_ATTR_RETRY_SHORT] = NLA_POLICY_MIN(NLA_U8, 1), 582 [NL80211_TID_CONFIG_ATTR_RETRY_LONG] = NLA_POLICY_MIN(NLA_U8, 1), 583 [NL80211_TID_CONFIG_ATTR_AMPDU_CTRL] = 584 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 585 [NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL] = 586 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 587 [NL80211_TID_CONFIG_ATTR_AMSDU_CTRL] = 588 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 589 [NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE] = 590 NLA_POLICY_MAX(NLA_U8, NL80211_TX_RATE_FIXED), 591 [NL80211_TID_CONFIG_ATTR_TX_RATE] = 592 NLA_POLICY_NESTED(nl80211_txattr_policy), 593 }; 594 595 static const struct nla_policy 596 nl80211_fils_discovery_policy[NL80211_FILS_DISCOVERY_ATTR_MAX + 1] = { 597 [NL80211_FILS_DISCOVERY_ATTR_INT_MIN] = NLA_POLICY_MAX(NLA_U32, 10000), 598 [NL80211_FILS_DISCOVERY_ATTR_INT_MAX] = NLA_POLICY_MAX(NLA_U32, 10000), 599 [NL80211_FILS_DISCOVERY_ATTR_TMPL] = 600 NLA_POLICY_RANGE(NLA_BINARY, 601 NL80211_FILS_DISCOVERY_TMPL_MIN_LEN, 602 IEEE80211_MAX_DATA_LEN), 603 }; 604 605 static const struct nla_policy 606 nl80211_unsol_bcast_probe_resp_policy[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX + 1] = { 607 [NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] = NLA_POLICY_MAX(NLA_U32, 20), 608 [NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL] = { .type = NLA_BINARY, 609 .len = IEEE80211_MAX_DATA_LEN } 610 }; 611 612 static const struct nla_policy 613 sar_specs_policy[NL80211_SAR_ATTR_SPECS_MAX + 1] = { 614 [NL80211_SAR_ATTR_SPECS_POWER] = { .type = NLA_S32 }, 615 [NL80211_SAR_ATTR_SPECS_RANGE_INDEX] = {.type = NLA_U32 }, 616 }; 617 618 static const struct nla_policy 619 sar_policy[NL80211_SAR_ATTR_MAX + 1] = { 620 [NL80211_SAR_ATTR_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_SAR_TYPE), 621 [NL80211_SAR_ATTR_SPECS] = NLA_POLICY_NESTED_ARRAY(sar_specs_policy), 622 }; 623 624 static const struct nla_policy 625 nl80211_mbssid_config_policy[NL80211_MBSSID_CONFIG_ATTR_MAX + 1] = { 626 [NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES] = NLA_POLICY_MIN(NLA_U8, 2), 627 [NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY] = 628 NLA_POLICY_MIN(NLA_U8, 1), 629 [NL80211_MBSSID_CONFIG_ATTR_INDEX] = { .type = NLA_U8 }, 630 [NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX] = { .type = NLA_U32 }, 631 [NL80211_MBSSID_CONFIG_ATTR_EMA] = { .type = NLA_FLAG }, 632 [NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID] = 633 NLA_POLICY_MAX(NLA_U8, IEEE80211_MLD_MAX_NUM_LINKS), 634 }; 635 636 static const struct nla_policy 637 nl80211_sta_wme_policy[NL80211_STA_WME_MAX + 1] = { 638 [NL80211_STA_WME_UAPSD_QUEUES] = { .type = NLA_U8 }, 639 [NL80211_STA_WME_MAX_SP] = { .type = NLA_U8 }, 640 }; 641 642 static const struct nla_policy 643 nl80211_s1g_short_beacon[NL80211_S1G_SHORT_BEACON_ATTR_MAX + 1] = { 644 [NL80211_S1G_SHORT_BEACON_ATTR_HEAD] = 645 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_beacon_head, 646 IEEE80211_MAX_DATA_LEN), 647 [NL80211_S1G_SHORT_BEACON_ATTR_TAIL] = 648 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 649 IEEE80211_MAX_DATA_LEN), 650 }; 651 652 static const struct nla_policy 653 nl80211_nan_band_conf_policy[NL80211_NAN_BAND_CONF_ATTR_MAX + 1] = { 654 [NL80211_NAN_BAND_CONF_BAND] = NLA_POLICY_MAX(NLA_U8, 655 NUM_NL80211_BANDS - 1), 656 [NL80211_NAN_BAND_CONF_FREQ] = { .type = NLA_U16 }, 657 [NL80211_NAN_BAND_CONF_RSSI_CLOSE] = NLA_POLICY_MIN(NLA_S8, -59), 658 [NL80211_NAN_BAND_CONF_RSSI_MIDDLE] = NLA_POLICY_MIN(NLA_S8, -74), 659 [NL80211_NAN_BAND_CONF_WAKE_DW] = NLA_POLICY_MAX(NLA_U8, 5), 660 [NL80211_NAN_BAND_CONF_DISABLE_SCAN] = { .type = NLA_FLAG }, 661 }; 662 663 static const struct nla_policy 664 nl80211_nan_peer_map_policy[NL80211_NAN_PEER_MAP_ATTR_MAX + 1] = { 665 [NL80211_NAN_PEER_MAP_ATTR_MAP_ID] = NLA_POLICY_MAX(NLA_U8, 15), 666 [NL80211_NAN_PEER_MAP_ATTR_TIME_SLOTS] = 667 NLA_POLICY_EXACT_LEN(CFG80211_NAN_SCHED_NUM_TIME_SLOTS), 668 }; 669 670 static const struct nla_policy 671 nl80211_nan_conf_policy[NL80211_NAN_CONF_ATTR_MAX + 1] = { 672 [NL80211_NAN_CONF_CLUSTER_ID] = 673 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_nan_cluster_id, 674 ETH_ALEN), 675 [NL80211_NAN_CONF_EXTRA_ATTRS] = { .type = NLA_BINARY, 676 .len = IEEE80211_MAX_DATA_LEN}, 677 [NL80211_NAN_CONF_VENDOR_ELEMS] = 678 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 679 IEEE80211_MAX_DATA_LEN), 680 [NL80211_NAN_CONF_BAND_CONFIGS] = 681 NLA_POLICY_NESTED_ARRAY(nl80211_nan_band_conf_policy), 682 [NL80211_NAN_CONF_SCAN_PERIOD] = { .type = NLA_U16 }, 683 [NL80211_NAN_CONF_SCAN_DWELL_TIME] = NLA_POLICY_RANGE(NLA_U16, 50, 512), 684 [NL80211_NAN_CONF_DISCOVERY_BEACON_INTERVAL] = 685 NLA_POLICY_RANGE(NLA_U8, 50, 200), 686 [NL80211_NAN_CONF_NOTIFY_DW] = { .type = NLA_FLAG }, 687 }; 688 689 static const struct netlink_range_validation nl80211_punct_bitmap_range = { 690 .min = 0, 691 .max = 0xffff, 692 }; 693 694 static const struct netlink_range_validation q_range = { 695 .max = INT_MAX, 696 }; 697 698 static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { 699 [0] = { .strict_start_type = NL80211_ATTR_HE_OBSS_PD }, 700 [NL80211_ATTR_WIPHY] = { .type = NLA_U32 }, 701 [NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING, 702 .len = 20-1 }, 703 [NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED }, 704 705 [NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 }, 706 [NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 }, 707 [NL80211_ATTR_WIPHY_EDMG_CHANNELS] = NLA_POLICY_RANGE(NLA_U8, 708 NL80211_EDMG_CHANNELS_MIN, 709 NL80211_EDMG_CHANNELS_MAX), 710 [NL80211_ATTR_WIPHY_EDMG_BW_CONFIG] = NLA_POLICY_RANGE(NLA_U8, 711 NL80211_EDMG_BW_CONFIG_MIN, 712 NL80211_EDMG_BW_CONFIG_MAX), 713 714 [NL80211_ATTR_CHANNEL_WIDTH] = { .type = NLA_U32 }, 715 [NL80211_ATTR_CENTER_FREQ1] = { .type = NLA_U32 }, 716 [NL80211_ATTR_CENTER_FREQ1_OFFSET] = NLA_POLICY_RANGE(NLA_U32, 0, 999), 717 [NL80211_ATTR_CENTER_FREQ2] = { .type = NLA_U32 }, 718 719 [NL80211_ATTR_WIPHY_RETRY_SHORT] = NLA_POLICY_MIN(NLA_U8, 1), 720 [NL80211_ATTR_WIPHY_RETRY_LONG] = NLA_POLICY_MIN(NLA_U8, 1), 721 [NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 }, 722 [NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 }, 723 [NL80211_ATTR_WIPHY_COVERAGE_CLASS] = { .type = NLA_U8 }, 724 [NL80211_ATTR_WIPHY_DYN_ACK] = { .type = NLA_FLAG }, 725 726 [NL80211_ATTR_IFTYPE] = NLA_POLICY_MAX(NLA_U32, NL80211_IFTYPE_MAX), 727 [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 }, 728 [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 }, 729 730 [NL80211_ATTR_MAC] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 731 [NL80211_ATTR_PREV_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 732 733 [NL80211_ATTR_KEY] = { .type = NLA_NESTED, }, 734 [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY, 735 .len = WLAN_MAX_KEY_LEN }, 736 [NL80211_ATTR_KEY_IDX] = NLA_POLICY_MAX(NLA_U8, 7), 737 [NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 }, 738 [NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG }, 739 [NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 }, 740 [NL80211_ATTR_KEY_TYPE] = 741 NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES), 742 743 [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 }, 744 [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 }, 745 [NL80211_ATTR_BEACON_HEAD] = 746 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_beacon_head, 747 IEEE80211_MAX_DATA_LEN), 748 [NL80211_ATTR_BEACON_TAIL] = 749 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 750 IEEE80211_MAX_DATA_LEN), 751 [NL80211_ATTR_STA_AID] = 752 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), 753 [NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED }, 754 [NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 }, 755 [NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY, 756 .len = NL80211_MAX_SUPP_RATES }, 757 [NL80211_ATTR_STA_PLINK_ACTION] = 758 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_ACTIONS - 1), 759 [NL80211_ATTR_STA_TX_POWER_SETTING] = 760 NLA_POLICY_RANGE(NLA_U8, 761 NL80211_TX_POWER_AUTOMATIC, 762 NL80211_TX_POWER_FIXED), 763 [NL80211_ATTR_STA_TX_POWER] = { .type = NLA_S16 }, 764 [NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 }, 765 [NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ }, 766 [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY, 767 .len = IEEE80211_MAX_MESH_ID_LEN }, 768 [NL80211_ATTR_MPATH_NEXT_HOP] = NLA_POLICY_ETH_ADDR_COMPAT, 769 770 /* allow 3 for NUL-termination, we used to declare this NLA_STRING */ 771 [NL80211_ATTR_REG_ALPHA2] = NLA_POLICY_RANGE(NLA_BINARY, 2, 3), 772 [NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED }, 773 774 [NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 }, 775 [NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 }, 776 [NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 }, 777 [NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY, 778 .len = NL80211_MAX_SUPP_RATES }, 779 [NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 }, 780 781 [NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED }, 782 [NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG }, 783 784 [NL80211_ATTR_HT_CAPABILITY] = NLA_POLICY_EXACT_LEN_WARN(NL80211_HT_CAPABILITY_LEN), 785 786 [NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 }, 787 [NL80211_ATTR_IE] = NLA_POLICY_VALIDATE_FN(NLA_BINARY, 788 validate_ie_attr, 789 IEEE80211_MAX_DATA_LEN), 790 [NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED }, 791 [NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED }, 792 793 [NL80211_ATTR_SSID] = { .type = NLA_BINARY, 794 .len = IEEE80211_MAX_SSID_LEN }, 795 [NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 }, 796 [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 }, 797 [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG }, 798 [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG }, 799 [NL80211_ATTR_USE_MFP] = NLA_POLICY_RANGE(NLA_U32, 800 NL80211_MFP_NO, 801 NL80211_MFP_OPTIONAL), 802 [NL80211_ATTR_STA_FLAGS2] = 803 NLA_POLICY_EXACT_LEN_WARN(sizeof(struct nl80211_sta_flag_update)), 804 [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG }, 805 [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 }, 806 [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG }, 807 [NL80211_ATTR_CONTROL_PORT_OVER_NL80211] = { .type = NLA_FLAG }, 808 [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG }, 809 [NL80211_ATTR_STATUS_CODE] = { .type = NLA_U16 }, 810 [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 }, 811 [NL80211_ATTR_WPA_VERSIONS] = 812 NLA_POLICY_RANGE(NLA_U32, 0, 813 NL80211_WPA_VERSION_1 | 814 NL80211_WPA_VERSION_2 | 815 NL80211_WPA_VERSION_3), 816 [NL80211_ATTR_PID] = { .type = NLA_U32 }, 817 [NL80211_ATTR_4ADDR] = { .type = NLA_U8 }, 818 [NL80211_ATTR_PMKID] = NLA_POLICY_EXACT_LEN_WARN(WLAN_PMKID_LEN), 819 [NL80211_ATTR_DURATION] = { .type = NLA_U32 }, 820 [NL80211_ATTR_COOKIE] = { .type = NLA_U64 }, 821 [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED }, 822 [NL80211_ATTR_FRAME] = { .type = NLA_BINARY, 823 .len = IEEE80211_MAX_DATA_LEN }, 824 [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, }, 825 [NL80211_ATTR_PS_STATE] = NLA_POLICY_RANGE(NLA_U32, 826 NL80211_PS_DISABLED, 827 NL80211_PS_ENABLED), 828 [NL80211_ATTR_CQM] = { .type = NLA_NESTED, }, 829 [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG }, 830 [NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 }, 831 [NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 }, 832 [NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 }, 833 [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 }, 834 [NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 }, 835 [NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 }, 836 [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 }, 837 [NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG }, 838 [NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED }, 839 [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED }, 840 [NL80211_ATTR_STA_PLINK_STATE] = 841 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1), 842 [NL80211_ATTR_MEASUREMENT_DURATION] = { .type = NLA_U16 }, 843 [NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY] = { .type = NLA_FLAG }, 844 [NL80211_ATTR_MESH_PEER_AID] = 845 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), 846 [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 }, 847 [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED }, 848 [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED }, 849 [NL80211_ATTR_HIDDEN_SSID] = 850 NLA_POLICY_RANGE(NLA_U32, 851 NL80211_HIDDEN_SSID_NOT_IN_USE, 852 NL80211_HIDDEN_SSID_ZERO_CONTENTS), 853 [NL80211_ATTR_IE_PROBE_RESP] = 854 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 855 IEEE80211_MAX_DATA_LEN), 856 [NL80211_ATTR_IE_ASSOC_RESP] = 857 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 858 IEEE80211_MAX_DATA_LEN), 859 [NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG }, 860 [NL80211_ATTR_STA_WME] = NLA_POLICY_NESTED(nl80211_sta_wme_policy), 861 [NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED }, 862 [NL80211_ATTR_TX_NO_CCK_RATE] = { .type = NLA_FLAG }, 863 [NL80211_ATTR_TDLS_ACTION] = { .type = NLA_U8 }, 864 [NL80211_ATTR_TDLS_DIALOG_TOKEN] = { .type = NLA_U8 }, 865 [NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 }, 866 [NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG }, 867 [NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG }, 868 [NL80211_ATTR_TDLS_INITIATOR] = { .type = NLA_FLAG }, 869 [NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG }, 870 [NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY, 871 .len = IEEE80211_MAX_DATA_LEN }, 872 [NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 }, 873 [NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG }, 874 [NL80211_ATTR_HT_CAPABILITY_MASK] = { 875 .len = NL80211_HT_CAPABILITY_LEN 876 }, 877 [NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 }, 878 [NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 }, 879 [NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 }, 880 [NL80211_ATTR_WDEV] = { .type = NLA_U64 }, 881 [NL80211_ATTR_USER_REG_HINT_TYPE] = { .type = NLA_U32 }, 882 883 /* need to include at least Auth Transaction and Status Code */ 884 [NL80211_ATTR_AUTH_DATA] = NLA_POLICY_MIN_LEN(4), 885 886 [NL80211_ATTR_VHT_CAPABILITY] = NLA_POLICY_EXACT_LEN_WARN(NL80211_VHT_CAPABILITY_LEN), 887 [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 }, 888 [NL80211_ATTR_P2P_CTWINDOW] = NLA_POLICY_MAX(NLA_U8, 127), 889 [NL80211_ATTR_P2P_OPPPS] = NLA_POLICY_MAX(NLA_U8, 1), 890 [NL80211_ATTR_LOCAL_MESH_POWER_MODE] = 891 NLA_POLICY_RANGE(NLA_U32, 892 NL80211_MESH_POWER_UNKNOWN + 1, 893 NL80211_MESH_POWER_MAX), 894 [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 }, 895 [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED }, 896 [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 }, 897 [NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, }, 898 [NL80211_ATTR_SPLIT_WIPHY_DUMP] = { .type = NLA_FLAG, }, 899 [NL80211_ATTR_DISABLE_VHT] = { .type = NLA_FLAG }, 900 [NL80211_ATTR_VHT_CAPABILITY_MASK] = { 901 .len = NL80211_VHT_CAPABILITY_LEN, 902 }, 903 [NL80211_ATTR_MDID] = { .type = NLA_U16 }, 904 [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY, 905 .len = IEEE80211_MAX_DATA_LEN }, 906 [NL80211_ATTR_CRIT_PROT_ID] = { .type = NLA_U16 }, 907 [NL80211_ATTR_MAX_CRIT_PROT_DURATION] = 908 NLA_POLICY_MAX(NLA_U16, NL80211_CRIT_PROTO_MAX_DURATION), 909 [NL80211_ATTR_PEER_AID] = 910 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), 911 [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 }, 912 [NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG }, 913 [NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED }, 914 [NL80211_ATTR_CNTDWN_OFFS_BEACON] = { .type = NLA_BINARY }, 915 [NL80211_ATTR_CNTDWN_OFFS_PRESP] = { .type = NLA_BINARY }, 916 [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = NLA_POLICY_MIN_LEN(2), 917 /* 918 * The value of the Length field of the Supported Operating 919 * Classes element is between 2 and 253. 920 */ 921 [NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = 922 NLA_POLICY_RANGE(NLA_BINARY, 2, 253), 923 [NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG }, 924 [NL80211_ATTR_OPMODE_NOTIF] = { .type = NLA_U8 }, 925 [NL80211_ATTR_VENDOR_ID] = { .type = NLA_U32 }, 926 [NL80211_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 }, 927 [NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY }, 928 [NL80211_ATTR_QOS_MAP] = NLA_POLICY_RANGE(NLA_BINARY, 929 IEEE80211_QOS_MAP_LEN_MIN, 930 IEEE80211_QOS_MAP_LEN_MAX), 931 [NL80211_ATTR_MAC_HINT] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 932 [NL80211_ATTR_WIPHY_FREQ_HINT] = { .type = NLA_U32 }, 933 [NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 }, 934 [NL80211_ATTR_SOCKET_OWNER] = { .type = NLA_FLAG }, 935 [NL80211_ATTR_CSA_C_OFFSETS_TX] = { .type = NLA_BINARY }, 936 [NL80211_ATTR_USE_RRM] = { .type = NLA_FLAG }, 937 [NL80211_ATTR_TSID] = NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_TIDS - 1), 938 [NL80211_ATTR_USER_PRIO] = 939 NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1), 940 [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 }, 941 [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 }, 942 [NL80211_ATTR_OPER_CLASS] = { .type = NLA_U8 }, 943 [NL80211_ATTR_MAC_MASK] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 944 [NL80211_ATTR_WIPHY_SELF_MANAGED_REG] = { .type = NLA_FLAG }, 945 [NL80211_ATTR_NETNS_FD] = { .type = NLA_U32 }, 946 [NL80211_ATTR_SCHED_SCAN_DELAY] = { .type = NLA_U32 }, 947 [NL80211_ATTR_REG_INDOOR] = { .type = NLA_FLAG }, 948 [NL80211_ATTR_PBSS] = { .type = NLA_FLAG }, 949 [NL80211_ATTR_BSS_SELECT] = { .type = NLA_NESTED }, 950 [NL80211_ATTR_STA_SUPPORT_P2P_PS] = 951 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_P2P_PS_STATUS - 1), 952 [NL80211_ATTR_MU_MIMO_GROUP_DATA] = { 953 .len = VHT_MUMIMO_GROUPS_DATA_LEN 954 }, 955 [NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 956 [NL80211_ATTR_NAN_MASTER_PREF] = NLA_POLICY_MIN(NLA_U8, 1), 957 [NL80211_ATTR_BANDS] = { .type = NLA_U32 }, 958 [NL80211_ATTR_NAN_CONFIG] = NLA_POLICY_NESTED(nl80211_nan_conf_policy), 959 [NL80211_ATTR_NAN_FUNC] = { .type = NLA_NESTED }, 960 [NL80211_ATTR_FILS_KEK] = { .type = NLA_BINARY, 961 .len = FILS_MAX_KEK_LEN }, 962 [NL80211_ATTR_FILS_NONCES] = NLA_POLICY_EXACT_LEN_WARN(2 * FILS_NONCE_LEN), 963 [NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED] = { .type = NLA_FLAG, }, 964 [NL80211_ATTR_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 965 [NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] = { .type = NLA_S8 }, 966 [NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST] = { 967 .len = sizeof(struct nl80211_bss_select_rssi_adjust) 968 }, 969 [NL80211_ATTR_TIMEOUT_REASON] = { .type = NLA_U32 }, 970 [NL80211_ATTR_FILS_ERP_USERNAME] = { .type = NLA_BINARY, 971 .len = FILS_ERP_MAX_USERNAME_LEN }, 972 [NL80211_ATTR_FILS_ERP_REALM] = { .type = NLA_BINARY, 973 .len = FILS_ERP_MAX_REALM_LEN }, 974 [NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] = { .type = NLA_U16 }, 975 [NL80211_ATTR_FILS_ERP_RRK] = { .type = NLA_BINARY, 976 .len = FILS_ERP_MAX_RRK_LEN }, 977 [NL80211_ATTR_FILS_CACHE_ID] = NLA_POLICY_EXACT_LEN_WARN(2), 978 [NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN }, 979 [NL80211_ATTR_PMKR0_NAME] = NLA_POLICY_EXACT_LEN(WLAN_PMK_NAME_LEN), 980 [NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG }, 981 [NL80211_ATTR_EXTERNAL_AUTH_SUPPORT] = { .type = NLA_FLAG }, 982 983 [NL80211_ATTR_TXQ_LIMIT] = { .type = NLA_U32 }, 984 [NL80211_ATTR_TXQ_MEMORY_LIMIT] = { .type = NLA_U32 }, 985 [NL80211_ATTR_TXQ_QUANTUM] = NLA_POLICY_FULL_RANGE(NLA_U32, &q_range), 986 [NL80211_ATTR_HE_CAPABILITY] = 987 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_he_capa, 988 NL80211_HE_MAX_CAPABILITY_LEN), 989 [NL80211_ATTR_FTM_RESPONDER] = 990 NLA_POLICY_NESTED(nl80211_ftm_responder_policy), 991 [NL80211_ATTR_TIMEOUT] = NLA_POLICY_MIN(NLA_U32, 1), 992 [NL80211_ATTR_PEER_MEASUREMENTS] = 993 NLA_POLICY_NESTED(nl80211_pmsr_attr_policy), 994 [NL80211_ATTR_AIRTIME_WEIGHT] = NLA_POLICY_MIN(NLA_U16, 1), 995 [NL80211_ATTR_SAE_PASSWORD] = { .type = NLA_BINARY, 996 .len = SAE_PASSWORD_MAX_LEN }, 997 [NL80211_ATTR_TWT_RESPONDER] = { .type = NLA_FLAG }, 998 [NL80211_ATTR_HE_OBSS_PD] = NLA_POLICY_NESTED(he_obss_pd_policy), 999 [NL80211_ATTR_VLAN_ID] = NLA_POLICY_RANGE(NLA_U16, 1, VLAN_N_VID - 2), 1000 [NL80211_ATTR_HE_BSS_COLOR] = NLA_POLICY_NESTED(he_bss_color_policy), 1001 [NL80211_ATTR_TID_CONFIG] = 1002 NLA_POLICY_NESTED_ARRAY(nl80211_tid_config_attr_policy), 1003 [NL80211_ATTR_CONTROL_PORT_NO_PREAUTH] = { .type = NLA_FLAG }, 1004 [NL80211_ATTR_PMK_LIFETIME] = NLA_POLICY_MIN(NLA_U32, 1), 1005 [NL80211_ATTR_PMK_REAUTH_THRESHOLD] = NLA_POLICY_RANGE(NLA_U8, 1, 100), 1006 [NL80211_ATTR_RECEIVE_MULTICAST] = { .type = NLA_FLAG }, 1007 [NL80211_ATTR_WIPHY_FREQ_OFFSET] = NLA_POLICY_RANGE(NLA_U32, 0, 999), 1008 [NL80211_ATTR_SCAN_FREQ_KHZ] = { .type = NLA_NESTED }, 1009 [NL80211_ATTR_HE_6GHZ_CAPABILITY] = 1010 NLA_POLICY_EXACT_LEN(sizeof(struct ieee80211_he_6ghz_capa)), 1011 [NL80211_ATTR_FILS_DISCOVERY] = 1012 NLA_POLICY_NESTED(nl80211_fils_discovery_policy), 1013 [NL80211_ATTR_UNSOL_BCAST_PROBE_RESP] = 1014 NLA_POLICY_NESTED(nl80211_unsol_bcast_probe_resp_policy), 1015 [NL80211_ATTR_S1G_CAPABILITY] = 1016 NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN), 1017 [NL80211_ATTR_S1G_CAPABILITY_MASK] = 1018 NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN), 1019 [NL80211_ATTR_SAE_PWE] = 1020 NLA_POLICY_RANGE(NLA_U8, NL80211_SAE_PWE_HUNT_AND_PECK, 1021 NL80211_SAE_PWE_BOTH), 1022 [NL80211_ATTR_RECONNECT_REQUESTED] = { .type = NLA_REJECT }, 1023 [NL80211_ATTR_SAR_SPEC] = NLA_POLICY_NESTED(sar_policy), 1024 [NL80211_ATTR_DISABLE_HE] = { .type = NLA_FLAG }, 1025 [NL80211_ATTR_OBSS_COLOR_BITMAP] = { .type = NLA_U64 }, 1026 [NL80211_ATTR_COLOR_CHANGE_COUNT] = { .type = NLA_U8 }, 1027 [NL80211_ATTR_COLOR_CHANGE_COLOR] = { .type = NLA_U8 }, 1028 [NL80211_ATTR_COLOR_CHANGE_ELEMS] = NLA_POLICY_NESTED(nl80211_policy), 1029 [NL80211_ATTR_MBSSID_CONFIG] = 1030 NLA_POLICY_NESTED(nl80211_mbssid_config_policy), 1031 [NL80211_ATTR_MBSSID_ELEMS] = { .type = NLA_NESTED }, 1032 [NL80211_ATTR_RADAR_BACKGROUND] = { .type = NLA_FLAG }, 1033 [NL80211_ATTR_AP_SETTINGS_FLAGS] = { .type = NLA_U32 }, 1034 [NL80211_ATTR_EHT_CAPABILITY] = 1035 NLA_POLICY_RANGE(NLA_BINARY, 1036 NL80211_EHT_MIN_CAPABILITY_LEN, 1037 NL80211_EHT_MAX_CAPABILITY_LEN), 1038 [NL80211_ATTR_DISABLE_EHT] = { .type = NLA_FLAG }, 1039 [NL80211_ATTR_MLO_LINKS] = 1040 NLA_POLICY_NESTED_ARRAY(nl80211_policy), 1041 [NL80211_ATTR_MLO_LINK_ID] = 1042 NLA_POLICY_RANGE(NLA_U8, 0, IEEE80211_MLD_MAX_NUM_LINKS - 1), 1043 [NL80211_ATTR_MLD_ADDR] = NLA_POLICY_EXACT_LEN(ETH_ALEN), 1044 [NL80211_ATTR_MLO_SUPPORT] = { .type = NLA_FLAG }, 1045 [NL80211_ATTR_MAX_NUM_AKM_SUITES] = { .type = NLA_REJECT }, 1046 [NL80211_ATTR_EML_CAPABILITY] = { .type = NLA_U16 }, 1047 [NL80211_ATTR_PUNCT_BITMAP] = 1048 NLA_POLICY_FULL_RANGE(NLA_U32, &nl80211_punct_bitmap_range), 1049 1050 [NL80211_ATTR_MAX_HW_TIMESTAMP_PEERS] = { .type = NLA_U16 }, 1051 [NL80211_ATTR_HW_TIMESTAMP_ENABLED] = { .type = NLA_FLAG }, 1052 [NL80211_ATTR_EMA_RNR_ELEMS] = { .type = NLA_NESTED }, 1053 [NL80211_ATTR_MLO_LINK_DISABLED] = { .type = NLA_FLAG }, 1054 [NL80211_ATTR_BSS_DUMP_INCLUDE_USE_DATA] = { .type = NLA_FLAG }, 1055 [NL80211_ATTR_MLO_TTLM_DLINK] = NLA_POLICY_EXACT_LEN(sizeof(u16) * 8), 1056 [NL80211_ATTR_MLO_TTLM_ULINK] = NLA_POLICY_EXACT_LEN(sizeof(u16) * 8), 1057 [NL80211_ATTR_ASSOC_SPP_AMSDU] = { .type = NLA_FLAG }, 1058 [NL80211_ATTR_VIF_RADIO_MASK] = { .type = NLA_U32 }, 1059 [NL80211_ATTR_SUPPORTED_SELECTORS] = 1060 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_supported_selectors, 1061 NL80211_MAX_SUPP_SELECTORS), 1062 [NL80211_ATTR_MLO_RECONF_REM_LINKS] = { .type = NLA_U16 }, 1063 [NL80211_ATTR_EPCS] = { .type = NLA_FLAG }, 1064 [NL80211_ATTR_EXT_MLD_CAPA_AND_OPS] = { .type = NLA_U16 }, 1065 [NL80211_ATTR_WIPHY_RADIO_INDEX] = { .type = NLA_U8 }, 1066 [NL80211_ATTR_S1G_LONG_BEACON_PERIOD] = NLA_POLICY_MIN(NLA_U8, 2), 1067 [NL80211_ATTR_S1G_SHORT_BEACON] = 1068 NLA_POLICY_NESTED(nl80211_s1g_short_beacon), 1069 [NL80211_ATTR_BSS_PARAM] = { .type = NLA_FLAG }, 1070 [NL80211_ATTR_S1G_PRIMARY_2MHZ] = { .type = NLA_FLAG }, 1071 [NL80211_ATTR_EPP_PEER] = { .type = NLA_FLAG }, 1072 [NL80211_ATTR_UHR_CAPABILITY] = 1073 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_uhr_capa, 255), 1074 [NL80211_ATTR_DISABLE_UHR] = { .type = NLA_FLAG }, 1075 [NL80211_ATTR_UHR_OPERATION] = 1076 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_uhr_operation), 1077 [NL80211_ATTR_NAN_CHANNEL] = NLA_POLICY_NESTED(nl80211_policy), 1078 [NL80211_ATTR_NAN_CHANNEL_ENTRY] = NLA_POLICY_EXACT_LEN(6), 1079 [NL80211_ATTR_NAN_RX_NSS] = { .type = NLA_U8 }, 1080 [NL80211_ATTR_NAN_TIME_SLOTS] = 1081 NLA_POLICY_EXACT_LEN(CFG80211_NAN_SCHED_NUM_TIME_SLOTS), 1082 [NL80211_ATTR_NAN_AVAIL_BLOB] = 1083 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_nan_avail_blob), 1084 [NL80211_ATTR_NAN_SCHED_DEFERRED] = { .type = NLA_FLAG }, 1085 [NL80211_ATTR_NAN_NMI_MAC] = NLA_POLICY_ETH_ADDR, 1086 [NL80211_ATTR_NAN_ULW] = 1087 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_nan_ulw), 1088 [NL80211_ATTR_NAN_COMMITTED_DW] = { .type = NLA_U16 }, 1089 [NL80211_ATTR_NAN_SEQ_ID] = { .type = NLA_U8 }, 1090 [NL80211_ATTR_NAN_MAX_CHAN_SWITCH_TIME] = { .type = NLA_U16 }, 1091 [NL80211_ATTR_NAN_PEER_MAPS] = 1092 NLA_POLICY_NESTED_ARRAY(nl80211_nan_peer_map_policy), 1093 [NL80211_ATTR_NPCA_PRIMARY_FREQ] = { .type = NLA_U32 }, 1094 [NL80211_ATTR_NPCA_PUNCT_BITMAP] = 1095 NLA_POLICY_FULL_RANGE(NLA_U32, &nl80211_punct_bitmap_range), 1096 }; 1097 1098 /* policy for the key attributes */ 1099 static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = { 1100 [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN }, 1101 [NL80211_KEY_IDX] = { .type = NLA_U8 }, 1102 [NL80211_KEY_CIPHER] = { .type = NLA_U32 }, 1103 [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 }, 1104 [NL80211_KEY_DEFAULT] = { .type = NLA_FLAG }, 1105 [NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG }, 1106 [NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1), 1107 [NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED }, 1108 [NL80211_KEY_MODE] = NLA_POLICY_RANGE(NLA_U8, 0, NL80211_KEY_SET_TX), 1109 [NL80211_KEY_LTF_SEED] = { 1110 .type = NLA_BINARY, 1111 .len = WLAN_MAX_SECURE_LTF_KEYSEED_LEN, 1112 }, 1113 }; 1114 1115 /* policy for the key default flags */ 1116 static const struct nla_policy 1117 nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = { 1118 [NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG }, 1119 [NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG }, 1120 }; 1121 1122 #ifdef CONFIG_PM 1123 /* policy for WoWLAN attributes */ 1124 static const struct nla_policy 1125 nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = { 1126 [NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG }, 1127 [NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG }, 1128 [NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG }, 1129 [NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED }, 1130 [NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE] = { .type = NLA_FLAG }, 1131 [NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST] = { .type = NLA_FLAG }, 1132 [NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE] = { .type = NLA_FLAG }, 1133 [NL80211_WOWLAN_TRIG_RFKILL_RELEASE] = { .type = NLA_FLAG }, 1134 [NL80211_WOWLAN_TRIG_TCP_CONNECTION] = { .type = NLA_NESTED }, 1135 [NL80211_WOWLAN_TRIG_NET_DETECT] = { .type = NLA_NESTED }, 1136 }; 1137 1138 static const struct nla_policy 1139 nl80211_wowlan_tcp_policy[NUM_NL80211_WOWLAN_TCP] = { 1140 [NL80211_WOWLAN_TCP_SRC_IPV4] = { .type = NLA_U32 }, 1141 [NL80211_WOWLAN_TCP_DST_IPV4] = { .type = NLA_U32 }, 1142 [NL80211_WOWLAN_TCP_DST_MAC] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 1143 [NL80211_WOWLAN_TCP_SRC_PORT] = { .type = NLA_U16 }, 1144 [NL80211_WOWLAN_TCP_DST_PORT] = { .type = NLA_U16 }, 1145 [NL80211_WOWLAN_TCP_DATA_PAYLOAD] = NLA_POLICY_MIN_LEN(1), 1146 [NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ] = { 1147 .len = sizeof(struct nl80211_wowlan_tcp_data_seq) 1148 }, 1149 [NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN] = { 1150 .len = sizeof(struct nl80211_wowlan_tcp_data_token) 1151 }, 1152 [NL80211_WOWLAN_TCP_DATA_INTERVAL] = { .type = NLA_U32 }, 1153 [NL80211_WOWLAN_TCP_WAKE_PAYLOAD] = NLA_POLICY_MIN_LEN(1), 1154 [NL80211_WOWLAN_TCP_WAKE_MASK] = NLA_POLICY_MIN_LEN(1), 1155 }; 1156 #endif /* CONFIG_PM */ 1157 1158 /* policy for coalesce rule attributes */ 1159 static const struct nla_policy 1160 nl80211_coalesce_policy[NUM_NL80211_ATTR_COALESCE_RULE] = { 1161 [NL80211_ATTR_COALESCE_RULE_DELAY] = { .type = NLA_U32 }, 1162 [NL80211_ATTR_COALESCE_RULE_CONDITION] = 1163 NLA_POLICY_RANGE(NLA_U32, 1164 NL80211_COALESCE_CONDITION_MATCH, 1165 NL80211_COALESCE_CONDITION_NO_MATCH), 1166 [NL80211_ATTR_COALESCE_RULE_PKT_PATTERN] = { .type = NLA_NESTED }, 1167 }; 1168 1169 /* policy for GTK rekey offload attributes */ 1170 static const struct nla_policy 1171 nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = { 1172 [NL80211_REKEY_DATA_KEK] = { 1173 .type = NLA_BINARY, 1174 .len = NL80211_KEK_EXT_LEN 1175 }, 1176 [NL80211_REKEY_DATA_KCK] = { 1177 .type = NLA_BINARY, 1178 .len = NL80211_KCK_EXT_LEN_32 1179 }, 1180 [NL80211_REKEY_DATA_REPLAY_CTR] = NLA_POLICY_EXACT_LEN(NL80211_REPLAY_CTR_LEN), 1181 [NL80211_REKEY_DATA_AKM] = { .type = NLA_U32 }, 1182 }; 1183 1184 static const struct nla_policy 1185 nl80211_match_policy[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1] = { 1186 [NL80211_SCHED_SCAN_MATCH_ATTR_SSID] = { .type = NLA_BINARY, 1187 .len = IEEE80211_MAX_SSID_LEN }, 1188 [NL80211_SCHED_SCAN_MATCH_ATTR_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 1189 [NL80211_SCHED_SCAN_MATCH_ATTR_RSSI] = { .type = NLA_U32 }, 1190 }; 1191 1192 static const struct nla_policy 1193 nl80211_plan_policy[NL80211_SCHED_SCAN_PLAN_MAX + 1] = { 1194 [NL80211_SCHED_SCAN_PLAN_INTERVAL] = { .type = NLA_U32 }, 1195 [NL80211_SCHED_SCAN_PLAN_ITERATIONS] = { .type = NLA_U32 }, 1196 }; 1197 1198 static const struct nla_policy 1199 nl80211_bss_select_policy[NL80211_BSS_SELECT_ATTR_MAX + 1] = { 1200 [NL80211_BSS_SELECT_ATTR_RSSI] = { .type = NLA_FLAG }, 1201 [NL80211_BSS_SELECT_ATTR_BAND_PREF] = { .type = NLA_U32 }, 1202 [NL80211_BSS_SELECT_ATTR_RSSI_ADJUST] = { 1203 .len = sizeof(struct nl80211_bss_select_rssi_adjust) 1204 }, 1205 }; 1206 1207 /* policy for NAN function attributes */ 1208 static const struct nla_policy 1209 nl80211_nan_func_policy[NL80211_NAN_FUNC_ATTR_MAX + 1] = { 1210 [NL80211_NAN_FUNC_TYPE] = 1211 NLA_POLICY_MAX(NLA_U8, NL80211_NAN_FUNC_MAX_TYPE), 1212 [NL80211_NAN_FUNC_SERVICE_ID] = { 1213 .len = NL80211_NAN_FUNC_SERVICE_ID_LEN }, 1214 [NL80211_NAN_FUNC_PUBLISH_TYPE] = { .type = NLA_U8 }, 1215 [NL80211_NAN_FUNC_PUBLISH_BCAST] = { .type = NLA_FLAG }, 1216 [NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE] = { .type = NLA_FLAG }, 1217 [NL80211_NAN_FUNC_FOLLOW_UP_ID] = { .type = NLA_U8 }, 1218 [NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] = { .type = NLA_U8 }, 1219 [NL80211_NAN_FUNC_FOLLOW_UP_DEST] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 1220 [NL80211_NAN_FUNC_CLOSE_RANGE] = { .type = NLA_FLAG }, 1221 [NL80211_NAN_FUNC_TTL] = { .type = NLA_U32 }, 1222 [NL80211_NAN_FUNC_SERVICE_INFO] = { .type = NLA_BINARY, 1223 .len = NL80211_NAN_FUNC_SERVICE_SPEC_INFO_MAX_LEN }, 1224 [NL80211_NAN_FUNC_SRF] = { .type = NLA_NESTED }, 1225 [NL80211_NAN_FUNC_RX_MATCH_FILTER] = { .type = NLA_NESTED }, 1226 [NL80211_NAN_FUNC_TX_MATCH_FILTER] = { .type = NLA_NESTED }, 1227 [NL80211_NAN_FUNC_INSTANCE_ID] = { .type = NLA_U8 }, 1228 [NL80211_NAN_FUNC_TERM_REASON] = { .type = NLA_U8 }, 1229 }; 1230 1231 /* policy for Service Response Filter attributes */ 1232 static const struct nla_policy 1233 nl80211_nan_srf_policy[NL80211_NAN_SRF_ATTR_MAX + 1] = { 1234 [NL80211_NAN_SRF_INCLUDE] = { .type = NLA_FLAG }, 1235 [NL80211_NAN_SRF_BF] = { .type = NLA_BINARY, 1236 .len = NL80211_NAN_FUNC_SRF_MAX_LEN }, 1237 [NL80211_NAN_SRF_BF_IDX] = { .type = NLA_U8 }, 1238 [NL80211_NAN_SRF_MAC_ADDRS] = { .type = NLA_NESTED }, 1239 }; 1240 1241 /* policy for packet pattern attributes */ 1242 static const struct nla_policy 1243 nl80211_packet_pattern_policy[MAX_NL80211_PKTPAT + 1] = { 1244 [NL80211_PKTPAT_MASK] = { .type = NLA_BINARY, }, 1245 [NL80211_PKTPAT_PATTERN] = { .type = NLA_BINARY, }, 1246 [NL80211_PKTPAT_OFFSET] = { .type = NLA_U32 }, 1247 }; 1248 1249 static int nl80211_prepare_wdev_dump(struct netlink_callback *cb, 1250 struct cfg80211_registered_device **rdev, 1251 struct wireless_dev **wdev, 1252 struct nlattr **attrbuf) 1253 { 1254 int err; 1255 1256 if (!cb->args[0]) { 1257 struct nlattr **attrbuf_free = NULL; 1258 1259 if (!attrbuf) { 1260 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 1261 if (!attrbuf) 1262 return -ENOMEM; 1263 attrbuf_free = attrbuf; 1264 } 1265 1266 err = nlmsg_parse_deprecated(cb->nlh, 1267 GENL_HDRLEN + nl80211_fam.hdrsize, 1268 attrbuf, nl80211_fam.maxattr, 1269 nl80211_policy, NULL); 1270 if (err) { 1271 kfree(attrbuf_free); 1272 return err; 1273 } 1274 1275 rtnl_lock(); 1276 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(cb->skb->sk), 1277 attrbuf); 1278 kfree(attrbuf_free); 1279 if (IS_ERR(*wdev)) { 1280 rtnl_unlock(); 1281 return PTR_ERR(*wdev); 1282 } 1283 *rdev = wiphy_to_rdev((*wdev)->wiphy); 1284 mutex_lock(&(*rdev)->wiphy.mtx); 1285 rtnl_unlock(); 1286 /* 0 is the first index - add 1 to parse only once */ 1287 cb->args[0] = (*rdev)->wiphy_idx + 1; 1288 cb->args[1] = (*wdev)->identifier; 1289 } else { 1290 /* subtract the 1 again here */ 1291 struct wiphy *wiphy; 1292 struct wireless_dev *tmp; 1293 1294 rtnl_lock(); 1295 wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); 1296 if (!wiphy) { 1297 rtnl_unlock(); 1298 return -ENODEV; 1299 } 1300 1301 /* 1302 * The first invocation validated the wdev's netns against 1303 * the caller via __cfg80211_wdev_from_attrs(). The wiphy 1304 * may have moved netns between dumpit invocations (via 1305 * NL80211_CMD_SET_WIPHY_NETNS), so re-check here. 1306 */ 1307 if (!net_eq(wiphy_net(wiphy), sock_net(cb->skb->sk))) { 1308 rtnl_unlock(); 1309 return -ENODEV; 1310 } 1311 1312 *rdev = wiphy_to_rdev(wiphy); 1313 *wdev = NULL; 1314 1315 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) { 1316 if (tmp->identifier == cb->args[1]) { 1317 *wdev = tmp; 1318 break; 1319 } 1320 } 1321 1322 if (!*wdev) { 1323 rtnl_unlock(); 1324 return -ENODEV; 1325 } 1326 mutex_lock(&(*rdev)->wiphy.mtx); 1327 rtnl_unlock(); 1328 } 1329 1330 return 0; 1331 } 1332 1333 /* message building helper */ 1334 void *nl80211hdr_put(struct sk_buff *skb, u32 portid, u32 seq, 1335 int flags, u8 cmd) 1336 { 1337 /* since there is no private header just add the generic one */ 1338 return genlmsg_put(skb, portid, seq, &nl80211_fam, flags, cmd); 1339 } 1340 1341 static int nl80211_msg_put_wmm_rules(struct sk_buff *msg, 1342 const struct ieee80211_reg_rule *rule) 1343 { 1344 int j; 1345 struct nlattr *nl_wmm_rules = 1346 nla_nest_start_noflag(msg, NL80211_FREQUENCY_ATTR_WMM); 1347 1348 if (!nl_wmm_rules) 1349 goto nla_put_failure; 1350 1351 for (j = 0; j < IEEE80211_NUM_ACS; j++) { 1352 struct nlattr *nl_wmm_rule = nla_nest_start_noflag(msg, j); 1353 1354 if (!nl_wmm_rule) 1355 goto nla_put_failure; 1356 1357 if (nla_put_u16(msg, NL80211_WMMR_CW_MIN, 1358 rule->wmm_rule.client[j].cw_min) || 1359 nla_put_u16(msg, NL80211_WMMR_CW_MAX, 1360 rule->wmm_rule.client[j].cw_max) || 1361 nla_put_u8(msg, NL80211_WMMR_AIFSN, 1362 rule->wmm_rule.client[j].aifsn) || 1363 nla_put_u16(msg, NL80211_WMMR_TXOP, 1364 rule->wmm_rule.client[j].cot)) 1365 goto nla_put_failure; 1366 1367 nla_nest_end(msg, nl_wmm_rule); 1368 } 1369 nla_nest_end(msg, nl_wmm_rules); 1370 1371 return 0; 1372 1373 nla_put_failure: 1374 return -ENOBUFS; 1375 } 1376 1377 static int nl80211_msg_put_channel(struct sk_buff *msg, struct wiphy *wiphy, 1378 struct ieee80211_channel *chan, 1379 bool large) 1380 { 1381 /* Some channels must be completely excluded from the 1382 * list to protect old user-space tools from breaking 1383 */ 1384 if (!large && chan->flags & 1385 (IEEE80211_CHAN_NO_10MHZ | IEEE80211_CHAN_NO_20MHZ)) 1386 return 0; 1387 if (!large && chan->freq_offset) 1388 return 0; 1389 1390 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ, 1391 chan->center_freq)) 1392 goto nla_put_failure; 1393 1394 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_OFFSET, chan->freq_offset)) 1395 goto nla_put_failure; 1396 1397 if ((chan->flags & IEEE80211_CHAN_PSD) && 1398 nla_put_s8(msg, NL80211_FREQUENCY_ATTR_PSD, chan->psd)) 1399 goto nla_put_failure; 1400 1401 if ((chan->flags & IEEE80211_CHAN_DISABLED) && 1402 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DISABLED)) 1403 goto nla_put_failure; 1404 if (chan->flags & IEEE80211_CHAN_NO_IR) { 1405 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IR)) 1406 goto nla_put_failure; 1407 if (nla_put_flag(msg, __NL80211_FREQUENCY_ATTR_NO_IBSS)) 1408 goto nla_put_failure; 1409 } 1410 if (chan->flags & IEEE80211_CHAN_RADAR) { 1411 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR)) 1412 goto nla_put_failure; 1413 if (large) { 1414 u32 time; 1415 1416 time = elapsed_jiffies_msecs(chan->dfs_state_entered); 1417 1418 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE, 1419 chan->dfs_state)) 1420 goto nla_put_failure; 1421 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME, 1422 time)) 1423 goto nla_put_failure; 1424 if (nla_put_u32(msg, 1425 NL80211_FREQUENCY_ATTR_DFS_CAC_TIME, 1426 chan->dfs_cac_ms)) 1427 goto nla_put_failure; 1428 } 1429 } 1430 1431 if (large) { 1432 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) && 1433 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS)) 1434 goto nla_put_failure; 1435 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) && 1436 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS)) 1437 goto nla_put_failure; 1438 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) && 1439 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ)) 1440 goto nla_put_failure; 1441 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) && 1442 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ)) 1443 goto nla_put_failure; 1444 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) && 1445 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_INDOOR_ONLY)) 1446 goto nla_put_failure; 1447 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) && 1448 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_IR_CONCURRENT)) 1449 goto nla_put_failure; 1450 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) && 1451 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_20MHZ)) 1452 goto nla_put_failure; 1453 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) && 1454 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_10MHZ)) 1455 goto nla_put_failure; 1456 if ((chan->flags & IEEE80211_CHAN_NO_HE) && 1457 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HE)) 1458 goto nla_put_failure; 1459 if ((chan->flags & IEEE80211_CHAN_NO_320MHZ) && 1460 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_320MHZ)) 1461 goto nla_put_failure; 1462 if ((chan->flags & IEEE80211_CHAN_NO_EHT) && 1463 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_EHT)) 1464 goto nla_put_failure; 1465 if ((chan->flags & IEEE80211_CHAN_DFS_CONCURRENT) && 1466 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DFS_CONCURRENT)) 1467 goto nla_put_failure; 1468 if ((chan->flags & IEEE80211_CHAN_NO_6GHZ_VLP_CLIENT) && 1469 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_6GHZ_VLP_CLIENT)) 1470 goto nla_put_failure; 1471 if ((chan->flags & IEEE80211_CHAN_NO_6GHZ_AFC_CLIENT) && 1472 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_6GHZ_AFC_CLIENT)) 1473 goto nla_put_failure; 1474 if ((chan->flags & IEEE80211_CHAN_CAN_MONITOR) && 1475 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_CAN_MONITOR)) 1476 goto nla_put_failure; 1477 if ((chan->flags & IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP) && 1478 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_ALLOW_6GHZ_VLP_AP)) 1479 goto nla_put_failure; 1480 if ((chan->flags & IEEE80211_CHAN_ALLOW_20MHZ_ACTIVITY) && 1481 nla_put_flag(msg, 1482 NL80211_FREQUENCY_ATTR_ALLOW_20MHZ_ACTIVITY)) 1483 goto nla_put_failure; 1484 if ((chan->flags & IEEE80211_CHAN_NO_4MHZ) && 1485 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_4MHZ)) 1486 goto nla_put_failure; 1487 if ((chan->flags & IEEE80211_CHAN_NO_8MHZ) && 1488 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_8MHZ)) 1489 goto nla_put_failure; 1490 if ((chan->flags & IEEE80211_CHAN_NO_16MHZ) && 1491 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_16MHZ)) 1492 goto nla_put_failure; 1493 if ((chan->flags & IEEE80211_CHAN_S1G_NO_PRIMARY) && 1494 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_S1G_NO_PRIMARY)) 1495 goto nla_put_failure; 1496 if ((chan->flags & IEEE80211_CHAN_NO_UHR) && 1497 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_UHR)) 1498 goto nla_put_failure; 1499 if (chan->cac_start_time && 1500 nla_put_u64_64bit(msg, 1501 NL80211_FREQUENCY_ATTR_CAC_START_TIME, 1502 chan->cac_start_time, 1503 NL80211_FREQUENCY_ATTR_PAD)) 1504 goto nla_put_failure; 1505 } 1506 1507 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER, 1508 DBM_TO_MBM(chan->max_power))) 1509 goto nla_put_failure; 1510 1511 if (large) { 1512 const struct ieee80211_reg_rule *rule = 1513 freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq)); 1514 1515 if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) { 1516 if (nl80211_msg_put_wmm_rules(msg, rule)) 1517 goto nla_put_failure; 1518 } 1519 } 1520 1521 return 0; 1522 1523 nla_put_failure: 1524 return -ENOBUFS; 1525 } 1526 1527 static bool nl80211_put_txq_stats(struct sk_buff *msg, 1528 struct cfg80211_txq_stats *txqstats, 1529 int attrtype) 1530 { 1531 struct nlattr *txqattr; 1532 1533 #define PUT_TXQVAL_U32(attr, memb) do { \ 1534 if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) && \ 1535 nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \ 1536 return false; \ 1537 } while (0) 1538 1539 txqattr = nla_nest_start_noflag(msg, attrtype); 1540 if (!txqattr) 1541 return false; 1542 1543 PUT_TXQVAL_U32(BACKLOG_BYTES, backlog_bytes); 1544 PUT_TXQVAL_U32(BACKLOG_PACKETS, backlog_packets); 1545 PUT_TXQVAL_U32(FLOWS, flows); 1546 PUT_TXQVAL_U32(DROPS, drops); 1547 PUT_TXQVAL_U32(ECN_MARKS, ecn_marks); 1548 PUT_TXQVAL_U32(OVERLIMIT, overlimit); 1549 PUT_TXQVAL_U32(OVERMEMORY, overmemory); 1550 PUT_TXQVAL_U32(COLLISIONS, collisions); 1551 PUT_TXQVAL_U32(TX_BYTES, tx_bytes); 1552 PUT_TXQVAL_U32(TX_PACKETS, tx_packets); 1553 PUT_TXQVAL_U32(MAX_FLOWS, max_flows); 1554 nla_nest_end(msg, txqattr); 1555 1556 #undef PUT_TXQVAL_U32 1557 return true; 1558 } 1559 1560 /* netlink command implementations */ 1561 1562 /** 1563 * nl80211_link_id - return link ID 1564 * @attrs: attributes to look at 1565 * 1566 * Returns: the link ID or 0 if not given 1567 * 1568 * Note this function doesn't do any validation of the link 1569 * ID validity wrt. links that were actually added, so it must 1570 * be called only from ops with %NL80211_FLAG_MLO_VALID_LINK_ID 1571 * or if additional validation is done. 1572 */ 1573 static unsigned int nl80211_link_id(struct nlattr **attrs) 1574 { 1575 struct nlattr *linkid = attrs[NL80211_ATTR_MLO_LINK_ID]; 1576 1577 return nla_get_u8_default(linkid, 0); 1578 } 1579 1580 static int nl80211_link_id_or_invalid(struct nlattr **attrs) 1581 { 1582 struct nlattr *linkid = attrs[NL80211_ATTR_MLO_LINK_ID]; 1583 1584 if (!linkid) 1585 return -1; 1586 1587 return nla_get_u8(linkid); 1588 } 1589 1590 struct key_parse { 1591 struct key_params p; 1592 int idx; 1593 int type; 1594 bool def, defmgmt, defbeacon; 1595 bool def_uni, def_multi; 1596 }; 1597 1598 static int nl80211_parse_key_new(struct genl_info *info, struct nlattr *key, 1599 struct key_parse *k) 1600 { 1601 struct nlattr *tb[NL80211_KEY_MAX + 1]; 1602 int err = nla_parse_nested_deprecated(tb, NL80211_KEY_MAX, key, 1603 nl80211_key_policy, 1604 info->extack); 1605 if (err) 1606 return err; 1607 1608 k->def = !!tb[NL80211_KEY_DEFAULT]; 1609 k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT]; 1610 k->defbeacon = !!tb[NL80211_KEY_DEFAULT_BEACON]; 1611 1612 if (k->def) { 1613 k->def_uni = true; 1614 k->def_multi = true; 1615 } 1616 if (k->defmgmt || k->defbeacon) 1617 k->def_multi = true; 1618 1619 if (tb[NL80211_KEY_IDX]) 1620 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]); 1621 1622 if (tb[NL80211_KEY_DATA]) { 1623 k->p.key = nla_data(tb[NL80211_KEY_DATA]); 1624 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]); 1625 } 1626 1627 if (tb[NL80211_KEY_SEQ]) { 1628 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]); 1629 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]); 1630 } 1631 1632 if (tb[NL80211_KEY_CIPHER]) 1633 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]); 1634 1635 if (tb[NL80211_KEY_TYPE]) 1636 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]); 1637 1638 if (tb[NL80211_KEY_DEFAULT_TYPES]) { 1639 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES]; 1640 1641 err = nla_parse_nested_deprecated(kdt, 1642 NUM_NL80211_KEY_DEFAULT_TYPES - 1, 1643 tb[NL80211_KEY_DEFAULT_TYPES], 1644 nl80211_key_default_policy, 1645 info->extack); 1646 if (err) 1647 return err; 1648 1649 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; 1650 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; 1651 } 1652 1653 if (tb[NL80211_KEY_MODE]) 1654 k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]); 1655 1656 if (tb[NL80211_KEY_LTF_SEED]) { 1657 k->p.ltf_keyseed = nla_data(tb[NL80211_KEY_LTF_SEED]); 1658 k->p.ltf_keyseed_len = nla_len(tb[NL80211_KEY_LTF_SEED]); 1659 } 1660 1661 return 0; 1662 } 1663 1664 static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k) 1665 { 1666 if (info->attrs[NL80211_ATTR_KEY_DATA]) { 1667 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]); 1668 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]); 1669 } 1670 1671 if (info->attrs[NL80211_ATTR_KEY_SEQ]) { 1672 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]); 1673 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]); 1674 } 1675 1676 if (info->attrs[NL80211_ATTR_KEY_IDX]) 1677 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); 1678 1679 if (info->attrs[NL80211_ATTR_KEY_CIPHER]) 1680 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]); 1681 1682 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT]; 1683 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT]; 1684 1685 if (k->def) { 1686 k->def_uni = true; 1687 k->def_multi = true; 1688 } 1689 if (k->defmgmt) 1690 k->def_multi = true; 1691 1692 if (info->attrs[NL80211_ATTR_KEY_TYPE]) 1693 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); 1694 1695 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) { 1696 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES]; 1697 int err = nla_parse_nested_deprecated(kdt, 1698 NUM_NL80211_KEY_DEFAULT_TYPES - 1, 1699 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES], 1700 nl80211_key_default_policy, 1701 info->extack); 1702 if (err) 1703 return err; 1704 1705 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; 1706 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; 1707 } 1708 1709 return 0; 1710 } 1711 1712 static int nl80211_parse_key(struct genl_info *info, struct key_parse *k) 1713 { 1714 int err; 1715 1716 memset(k, 0, sizeof(*k)); 1717 k->idx = -1; 1718 k->type = -1; 1719 1720 if (info->attrs[NL80211_ATTR_KEY]) 1721 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k); 1722 else 1723 err = nl80211_parse_key_old(info, k); 1724 1725 if (err) 1726 return err; 1727 1728 if ((k->def ? 1 : 0) + (k->defmgmt ? 1 : 0) + 1729 (k->defbeacon ? 1 : 0) > 1) { 1730 GENL_SET_ERR_MSG(info, 1731 "key with multiple default flags is invalid"); 1732 return -EINVAL; 1733 } 1734 1735 if (k->defmgmt || k->defbeacon) { 1736 if (k->def_uni || !k->def_multi) { 1737 GENL_SET_ERR_MSG(info, 1738 "defmgmt/defbeacon key must be mcast"); 1739 return -EINVAL; 1740 } 1741 } 1742 1743 if (k->idx != -1) { 1744 if (k->defmgmt) { 1745 if (k->idx < 4 || k->idx > 5) { 1746 GENL_SET_ERR_MSG(info, 1747 "defmgmt key idx not 4 or 5"); 1748 return -EINVAL; 1749 } 1750 } else if (k->defbeacon) { 1751 if (k->idx < 6 || k->idx > 7) { 1752 GENL_SET_ERR_MSG(info, 1753 "defbeacon key idx not 6 or 7"); 1754 return -EINVAL; 1755 } 1756 } else if (k->def) { 1757 if (k->idx < 0 || k->idx > 3) { 1758 GENL_SET_ERR_MSG(info, "def key idx not 0-3"); 1759 return -EINVAL; 1760 } 1761 } else { 1762 if (k->idx < 0 || k->idx > 7) { 1763 GENL_SET_ERR_MSG(info, "key idx not 0-7"); 1764 return -EINVAL; 1765 } 1766 } 1767 } 1768 1769 return 0; 1770 } 1771 1772 static struct cfg80211_cached_keys * 1773 nl80211_parse_connkeys(struct cfg80211_registered_device *rdev, 1774 struct wireless_dev *wdev, 1775 struct genl_info *info, bool *no_ht) 1776 { 1777 struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS]; 1778 struct key_parse parse; 1779 struct nlattr *key; 1780 struct cfg80211_cached_keys *result; 1781 int rem, err, def = 0; 1782 bool have_key = false; 1783 1784 nla_for_each_nested(key, keys, rem) { 1785 have_key = true; 1786 break; 1787 } 1788 1789 if (!have_key) 1790 return NULL; 1791 1792 result = kzalloc_obj(*result); 1793 if (!result) 1794 return ERR_PTR(-ENOMEM); 1795 1796 result->def = -1; 1797 1798 nla_for_each_nested(key, keys, rem) { 1799 memset(&parse, 0, sizeof(parse)); 1800 parse.idx = -1; 1801 1802 err = nl80211_parse_key_new(info, key, &parse); 1803 if (err) 1804 goto error; 1805 err = -EINVAL; 1806 if (!parse.p.key) 1807 goto error; 1808 if (parse.idx < 0 || parse.idx > 3) { 1809 GENL_SET_ERR_MSG(info, "key index out of range [0-3]"); 1810 goto error; 1811 } 1812 if (parse.def) { 1813 if (def) { 1814 GENL_SET_ERR_MSG(info, 1815 "only one key can be default"); 1816 goto error; 1817 } 1818 def = 1; 1819 result->def = parse.idx; 1820 if (!parse.def_uni || !parse.def_multi) 1821 goto error; 1822 } else if (parse.defmgmt) 1823 goto error; 1824 err = cfg80211_validate_key_settings(rdev, wdev, &parse.p, 1825 parse.idx, false, NULL); 1826 if (err) 1827 goto error; 1828 if (parse.p.cipher != WLAN_CIPHER_SUITE_WEP40 && 1829 parse.p.cipher != WLAN_CIPHER_SUITE_WEP104) { 1830 GENL_SET_ERR_MSG(info, "connect key must be WEP"); 1831 err = -EINVAL; 1832 goto error; 1833 } 1834 result->params[parse.idx].cipher = parse.p.cipher; 1835 result->params[parse.idx].key_len = parse.p.key_len; 1836 result->params[parse.idx].key = result->data[parse.idx]; 1837 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len); 1838 1839 /* must be WEP key if we got here */ 1840 if (no_ht) 1841 *no_ht = true; 1842 } 1843 1844 if (result->def < 0) { 1845 err = -EINVAL; 1846 GENL_SET_ERR_MSG(info, "need a default/TX key"); 1847 goto error; 1848 } 1849 1850 return result; 1851 error: 1852 kfree_sensitive(result); 1853 return ERR_PTR(err); 1854 } 1855 1856 static int nl80211_key_allowed(struct wireless_dev *wdev) 1857 { 1858 lockdep_assert_wiphy(wdev->wiphy); 1859 1860 switch (wdev->iftype) { 1861 case NL80211_IFTYPE_AP: 1862 case NL80211_IFTYPE_AP_VLAN: 1863 case NL80211_IFTYPE_P2P_GO: 1864 case NL80211_IFTYPE_MESH_POINT: 1865 break; 1866 case NL80211_IFTYPE_ADHOC: 1867 if (wdev->u.ibss.current_bss) 1868 return 0; 1869 return -ENOLINK; 1870 case NL80211_IFTYPE_STATION: 1871 case NL80211_IFTYPE_P2P_CLIENT: 1872 if (wdev->connected || 1873 (wiphy_ext_feature_isset(wdev->wiphy, 1874 NL80211_EXT_FEATURE_ASSOC_FRAME_ENCRYPTION))) 1875 return 0; 1876 return -ENOLINK; 1877 case NL80211_IFTYPE_NAN: 1878 case NL80211_IFTYPE_NAN_DATA: 1879 if (wiphy_ext_feature_isset(wdev->wiphy, 1880 NL80211_EXT_FEATURE_SECURE_NAN)) 1881 return 0; 1882 return -EINVAL; 1883 case NL80211_IFTYPE_PD: 1884 if (wiphy_ext_feature_isset(wdev->wiphy, 1885 NL80211_EXT_FEATURE_SECURE_RTT)) 1886 return 0; 1887 return -EINVAL; 1888 case NL80211_IFTYPE_UNSPECIFIED: 1889 case NL80211_IFTYPE_OCB: 1890 case NL80211_IFTYPE_MONITOR: 1891 case NL80211_IFTYPE_P2P_DEVICE: 1892 case NL80211_IFTYPE_WDS: 1893 case NUM_NL80211_IFTYPES: 1894 return -EINVAL; 1895 } 1896 1897 return 0; 1898 } 1899 1900 static struct ieee80211_channel *nl80211_get_valid_chan(struct wiphy *wiphy, 1901 u32 freq) 1902 { 1903 struct ieee80211_channel *chan; 1904 1905 chan = ieee80211_get_channel_khz(wiphy, freq); 1906 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) 1907 return NULL; 1908 return chan; 1909 } 1910 1911 static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes) 1912 { 1913 struct nlattr *nl_modes = nla_nest_start_noflag(msg, attr); 1914 int i; 1915 1916 if (!nl_modes) 1917 goto nla_put_failure; 1918 1919 i = 0; 1920 while (ifmodes) { 1921 if ((ifmodes & 1) && nla_put_flag(msg, i)) 1922 goto nla_put_failure; 1923 ifmodes >>= 1; 1924 i++; 1925 } 1926 1927 nla_nest_end(msg, nl_modes); 1928 return 0; 1929 1930 nla_put_failure: 1931 return -ENOBUFS; 1932 } 1933 1934 static int nl80211_put_ifcomb_data(struct sk_buff *msg, bool large, int idx, 1935 const struct ieee80211_iface_combination *c, 1936 u16 nested) 1937 { 1938 struct nlattr *nl_combi, *nl_limits; 1939 int i; 1940 1941 nl_combi = nla_nest_start_noflag(msg, idx | nested); 1942 if (!nl_combi) 1943 goto nla_put_failure; 1944 1945 nl_limits = nla_nest_start_noflag(msg, NL80211_IFACE_COMB_LIMITS | 1946 nested); 1947 if (!nl_limits) 1948 goto nla_put_failure; 1949 1950 for (i = 0; i < c->n_limits; i++) { 1951 struct nlattr *nl_limit; 1952 1953 nl_limit = nla_nest_start_noflag(msg, i + 1); 1954 if (!nl_limit) 1955 goto nla_put_failure; 1956 if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX, c->limits[i].max)) 1957 goto nla_put_failure; 1958 if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES, 1959 c->limits[i].types)) 1960 goto nla_put_failure; 1961 nla_nest_end(msg, nl_limit); 1962 } 1963 1964 nla_nest_end(msg, nl_limits); 1965 1966 if (c->beacon_int_infra_match && 1967 nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH)) 1968 goto nla_put_failure; 1969 if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS, 1970 c->num_different_channels) || 1971 nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM, 1972 c->max_interfaces)) 1973 goto nla_put_failure; 1974 if (large && 1975 (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS, 1976 c->radar_detect_widths) || 1977 nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS, 1978 c->radar_detect_regions))) 1979 goto nla_put_failure; 1980 if (c->beacon_int_min_gcd && 1981 nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD, 1982 c->beacon_int_min_gcd)) 1983 goto nla_put_failure; 1984 1985 nla_nest_end(msg, nl_combi); 1986 1987 return 0; 1988 nla_put_failure: 1989 return -ENOBUFS; 1990 } 1991 1992 static int nl80211_put_iface_combinations(struct wiphy *wiphy, 1993 struct sk_buff *msg, 1994 int attr, int radio, 1995 bool large, u16 nested) 1996 { 1997 const struct ieee80211_iface_combination *c; 1998 struct nlattr *nl_combis; 1999 int i, n; 2000 2001 nl_combis = nla_nest_start_noflag(msg, attr | nested); 2002 if (!nl_combis) 2003 goto nla_put_failure; 2004 2005 if (radio >= 0) { 2006 c = wiphy->radio[0].iface_combinations; 2007 n = wiphy->radio[0].n_iface_combinations; 2008 } else { 2009 c = wiphy->iface_combinations; 2010 n = wiphy->n_iface_combinations; 2011 } 2012 for (i = 0; i < n; i++) 2013 if (nl80211_put_ifcomb_data(msg, large, i + 1, &c[i], nested)) 2014 goto nla_put_failure; 2015 2016 nla_nest_end(msg, nl_combis); 2017 2018 return 0; 2019 nla_put_failure: 2020 return -ENOBUFS; 2021 } 2022 2023 #ifdef CONFIG_PM 2024 static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev, 2025 struct sk_buff *msg) 2026 { 2027 const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp; 2028 struct nlattr *nl_tcp; 2029 2030 if (!tcp) 2031 return 0; 2032 2033 nl_tcp = nla_nest_start_noflag(msg, 2034 NL80211_WOWLAN_TRIG_TCP_CONNECTION); 2035 if (!nl_tcp) 2036 return -ENOBUFS; 2037 2038 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 2039 tcp->data_payload_max)) 2040 return -ENOBUFS; 2041 2042 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 2043 tcp->data_payload_max)) 2044 return -ENOBUFS; 2045 2046 if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ)) 2047 return -ENOBUFS; 2048 2049 if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 2050 sizeof(*tcp->tok), tcp->tok)) 2051 return -ENOBUFS; 2052 2053 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 2054 tcp->data_interval_max)) 2055 return -ENOBUFS; 2056 2057 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 2058 tcp->wake_payload_max)) 2059 return -ENOBUFS; 2060 2061 nla_nest_end(msg, nl_tcp); 2062 return 0; 2063 } 2064 2065 static int nl80211_send_wowlan(struct sk_buff *msg, 2066 struct cfg80211_registered_device *rdev, 2067 bool large) 2068 { 2069 struct nlattr *nl_wowlan; 2070 2071 if (!rdev->wiphy.wowlan) 2072 return 0; 2073 2074 nl_wowlan = nla_nest_start_noflag(msg, 2075 NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED); 2076 if (!nl_wowlan) 2077 return -ENOBUFS; 2078 2079 if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) && 2080 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 2081 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) && 2082 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 2083 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) && 2084 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 2085 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) && 2086 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED)) || 2087 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && 2088 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 2089 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) && 2090 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 2091 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) && 2092 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 2093 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) && 2094 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 2095 return -ENOBUFS; 2096 2097 if (rdev->wiphy.wowlan->n_patterns) { 2098 struct nl80211_pattern_support pat = { 2099 .max_patterns = rdev->wiphy.wowlan->n_patterns, 2100 .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len, 2101 .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len, 2102 .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset, 2103 }; 2104 2105 if (nla_put(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN, 2106 sizeof(pat), &pat)) 2107 return -ENOBUFS; 2108 } 2109 2110 if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) && 2111 nla_put_u32(msg, NL80211_WOWLAN_TRIG_NET_DETECT, 2112 rdev->wiphy.wowlan->max_nd_match_sets)) 2113 return -ENOBUFS; 2114 2115 if (large && nl80211_send_wowlan_tcp_caps(rdev, msg)) 2116 return -ENOBUFS; 2117 2118 nla_nest_end(msg, nl_wowlan); 2119 2120 return 0; 2121 } 2122 #endif 2123 2124 static int nl80211_send_coalesce(struct sk_buff *msg, 2125 struct cfg80211_registered_device *rdev) 2126 { 2127 struct nl80211_coalesce_rule_support rule; 2128 2129 if (!rdev->wiphy.coalesce) 2130 return 0; 2131 2132 rule.max_rules = rdev->wiphy.coalesce->n_rules; 2133 rule.max_delay = rdev->wiphy.coalesce->max_delay; 2134 rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns; 2135 rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len; 2136 rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len; 2137 rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset; 2138 2139 if (nla_put(msg, NL80211_ATTR_COALESCE_RULE, sizeof(rule), &rule)) 2140 return -ENOBUFS; 2141 2142 return 0; 2143 } 2144 2145 static int 2146 nl80211_send_iftype_data(struct sk_buff *msg, 2147 const struct ieee80211_supported_band *sband, 2148 const struct ieee80211_sband_iftype_data *iftdata) 2149 { 2150 const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap; 2151 const struct ieee80211_sta_eht_cap *eht_cap = &iftdata->eht_cap; 2152 const struct ieee80211_sta_uhr_cap *uhr_cap = &iftdata->uhr_cap; 2153 2154 if (nl80211_put_iftypes(msg, NL80211_BAND_IFTYPE_ATTR_IFTYPES, 2155 iftdata->types_mask)) 2156 return -ENOBUFS; 2157 2158 if (he_cap->has_he) { 2159 if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC, 2160 sizeof(he_cap->he_cap_elem.mac_cap_info), 2161 he_cap->he_cap_elem.mac_cap_info) || 2162 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY, 2163 sizeof(he_cap->he_cap_elem.phy_cap_info), 2164 he_cap->he_cap_elem.phy_cap_info) || 2165 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET, 2166 sizeof(he_cap->he_mcs_nss_supp), 2167 &he_cap->he_mcs_nss_supp) || 2168 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE, 2169 sizeof(he_cap->ppe_thres), he_cap->ppe_thres)) 2170 return -ENOBUFS; 2171 } 2172 2173 if (eht_cap->has_eht && he_cap->has_he) { 2174 u8 mcs_nss_size, ppe_thresh_size; 2175 u16 ppe_thres_hdr; 2176 bool is_ap; 2177 2178 is_ap = iftdata->types_mask & BIT(NL80211_IFTYPE_AP) || 2179 iftdata->types_mask & BIT(NL80211_IFTYPE_P2P_GO); 2180 2181 mcs_nss_size = 2182 ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem, 2183 &eht_cap->eht_cap_elem, 2184 is_ap); 2185 2186 ppe_thres_hdr = get_unaligned_le16(&eht_cap->eht_ppe_thres[0]); 2187 ppe_thresh_size = 2188 ieee80211_eht_ppe_size(ppe_thres_hdr, 2189 eht_cap->eht_cap_elem.phy_cap_info); 2190 2191 if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MAC, 2192 sizeof(eht_cap->eht_cap_elem.mac_cap_info), 2193 eht_cap->eht_cap_elem.mac_cap_info) || 2194 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PHY, 2195 sizeof(eht_cap->eht_cap_elem.phy_cap_info), 2196 eht_cap->eht_cap_elem.phy_cap_info) || 2197 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MCS_SET, 2198 mcs_nss_size, &eht_cap->eht_mcs_nss_supp) || 2199 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PPE, 2200 ppe_thresh_size, eht_cap->eht_ppe_thres)) 2201 return -ENOBUFS; 2202 } 2203 2204 if (uhr_cap->has_uhr) { 2205 if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_UHR_CAP_MAC, 2206 sizeof(uhr_cap->mac), &uhr_cap->mac) || 2207 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_UHR_CAP_PHY, 2208 sizeof(uhr_cap->phy), &uhr_cap->phy)) 2209 return -ENOBUFS; 2210 } 2211 2212 if (sband->band == NL80211_BAND_6GHZ && 2213 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA, 2214 sizeof(iftdata->he_6ghz_capa), 2215 &iftdata->he_6ghz_capa)) 2216 return -ENOBUFS; 2217 2218 if (iftdata->vendor_elems.data && iftdata->vendor_elems.len && 2219 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_VENDOR_ELEMS, 2220 iftdata->vendor_elems.len, iftdata->vendor_elems.data)) 2221 return -ENOBUFS; 2222 2223 return 0; 2224 } 2225 2226 static int nl80211_send_band_rateinfo(struct sk_buff *msg, 2227 struct ieee80211_supported_band *sband, 2228 bool large) 2229 { 2230 struct nlattr *nl_rates, *nl_rate; 2231 struct ieee80211_rate *rate; 2232 int i; 2233 2234 /* add HT info */ 2235 if (sband->ht_cap.ht_supported && 2236 (nla_put(msg, NL80211_BAND_ATTR_HT_MCS_SET, 2237 sizeof(sband->ht_cap.mcs), 2238 &sband->ht_cap.mcs) || 2239 nla_put_u16(msg, NL80211_BAND_ATTR_HT_CAPA, 2240 sband->ht_cap.cap) || 2241 nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR, 2242 sband->ht_cap.ampdu_factor) || 2243 nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY, 2244 sband->ht_cap.ampdu_density))) 2245 return -ENOBUFS; 2246 2247 /* add VHT info */ 2248 if (sband->vht_cap.vht_supported && 2249 (nla_put(msg, NL80211_BAND_ATTR_VHT_MCS_SET, 2250 sizeof(sband->vht_cap.vht_mcs), 2251 &sband->vht_cap.vht_mcs) || 2252 nla_put_u32(msg, NL80211_BAND_ATTR_VHT_CAPA, 2253 sband->vht_cap.cap))) 2254 return -ENOBUFS; 2255 2256 if (large && sband->n_iftype_data) { 2257 struct nlattr *nl_iftype_data = 2258 nla_nest_start_noflag(msg, 2259 NL80211_BAND_ATTR_IFTYPE_DATA); 2260 const struct ieee80211_sband_iftype_data *iftd; 2261 int err; 2262 2263 if (!nl_iftype_data) 2264 return -ENOBUFS; 2265 2266 for_each_sband_iftype_data(sband, i, iftd) { 2267 struct nlattr *iftdata; 2268 2269 iftdata = nla_nest_start_noflag(msg, i + 1); 2270 if (!iftdata) 2271 return -ENOBUFS; 2272 2273 err = nl80211_send_iftype_data(msg, sband, iftd); 2274 if (err) 2275 return err; 2276 2277 nla_nest_end(msg, iftdata); 2278 } 2279 2280 nla_nest_end(msg, nl_iftype_data); 2281 } 2282 2283 /* add EDMG info */ 2284 if (large && sband->edmg_cap.channels && 2285 (nla_put_u8(msg, NL80211_BAND_ATTR_EDMG_CHANNELS, 2286 sband->edmg_cap.channels) || 2287 nla_put_u8(msg, NL80211_BAND_ATTR_EDMG_BW_CONFIG, 2288 sband->edmg_cap.bw_config))) 2289 2290 return -ENOBUFS; 2291 2292 /* add bitrates */ 2293 nl_rates = nla_nest_start_noflag(msg, NL80211_BAND_ATTR_RATES); 2294 if (!nl_rates) 2295 return -ENOBUFS; 2296 2297 for (i = 0; i < sband->n_bitrates; i++) { 2298 nl_rate = nla_nest_start_noflag(msg, i); 2299 if (!nl_rate) 2300 return -ENOBUFS; 2301 2302 rate = &sband->bitrates[i]; 2303 if (nla_put_u32(msg, NL80211_BITRATE_ATTR_RATE, 2304 rate->bitrate)) 2305 return -ENOBUFS; 2306 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && 2307 nla_put_flag(msg, 2308 NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE)) 2309 return -ENOBUFS; 2310 2311 nla_nest_end(msg, nl_rate); 2312 } 2313 2314 nla_nest_end(msg, nl_rates); 2315 2316 /* S1G capabilities */ 2317 if (sband->band == NL80211_BAND_S1GHZ && sband->s1g_cap.s1g && 2318 (nla_put(msg, NL80211_BAND_ATTR_S1G_CAPA, 2319 sizeof(sband->s1g_cap.cap), 2320 sband->s1g_cap.cap) || 2321 nla_put(msg, NL80211_BAND_ATTR_S1G_MCS_NSS_SET, 2322 sizeof(sband->s1g_cap.nss_mcs), 2323 sband->s1g_cap.nss_mcs))) 2324 return -ENOBUFS; 2325 2326 return 0; 2327 } 2328 2329 static int 2330 nl80211_send_mgmt_stypes(struct sk_buff *msg, 2331 const struct ieee80211_txrx_stypes *mgmt_stypes) 2332 { 2333 u16 stypes; 2334 struct nlattr *nl_ftypes, *nl_ifs; 2335 enum nl80211_iftype ift; 2336 int i; 2337 2338 if (!mgmt_stypes) 2339 return 0; 2340 2341 nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_TX_FRAME_TYPES); 2342 if (!nl_ifs) 2343 return -ENOBUFS; 2344 2345 for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) { 2346 nl_ftypes = nla_nest_start_noflag(msg, ift); 2347 if (!nl_ftypes) 2348 return -ENOBUFS; 2349 i = 0; 2350 stypes = mgmt_stypes[ift].tx; 2351 while (stypes) { 2352 if ((stypes & 1) && 2353 nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE, 2354 (i << 4) | IEEE80211_FTYPE_MGMT)) 2355 return -ENOBUFS; 2356 stypes >>= 1; 2357 i++; 2358 } 2359 nla_nest_end(msg, nl_ftypes); 2360 } 2361 2362 nla_nest_end(msg, nl_ifs); 2363 2364 nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_RX_FRAME_TYPES); 2365 if (!nl_ifs) 2366 return -ENOBUFS; 2367 2368 for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) { 2369 nl_ftypes = nla_nest_start_noflag(msg, ift); 2370 if (!nl_ftypes) 2371 return -ENOBUFS; 2372 i = 0; 2373 stypes = mgmt_stypes[ift].rx; 2374 while (stypes) { 2375 if ((stypes & 1) && 2376 nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE, 2377 (i << 4) | IEEE80211_FTYPE_MGMT)) 2378 return -ENOBUFS; 2379 stypes >>= 1; 2380 i++; 2381 } 2382 nla_nest_end(msg, nl_ftypes); 2383 } 2384 nla_nest_end(msg, nl_ifs); 2385 2386 return 0; 2387 } 2388 2389 #define CMD(op, n) \ 2390 do { \ 2391 if (rdev->ops->op) { \ 2392 i++; \ 2393 if (nla_put_u32(msg, i, NL80211_CMD_ ## n)) \ 2394 goto nla_put_failure; \ 2395 } \ 2396 } while (0) 2397 2398 static int nl80211_add_commands_unsplit(struct cfg80211_registered_device *rdev, 2399 struct sk_buff *msg) 2400 { 2401 int i = 0; 2402 2403 /* 2404 * do *NOT* add anything into this function, new things need to be 2405 * advertised only to new versions of userspace that can deal with 2406 * the split (and they can't possibly care about new features... 2407 */ 2408 CMD(add_virtual_intf, NEW_INTERFACE); 2409 CMD(change_virtual_intf, SET_INTERFACE); 2410 CMD(add_key, NEW_KEY); 2411 CMD(start_ap, START_AP); 2412 CMD(add_station, NEW_STATION); 2413 CMD(add_mpath, NEW_MPATH); 2414 CMD(update_mesh_config, SET_MESH_CONFIG); 2415 CMD(change_bss, SET_BSS); 2416 CMD(auth, AUTHENTICATE); 2417 CMD(assoc, ASSOCIATE); 2418 CMD(deauth, DEAUTHENTICATE); 2419 CMD(disassoc, DISASSOCIATE); 2420 CMD(join_ibss, JOIN_IBSS); 2421 CMD(join_mesh, JOIN_MESH); 2422 CMD(set_pmksa, SET_PMKSA); 2423 CMD(del_pmksa, DEL_PMKSA); 2424 CMD(flush_pmksa, FLUSH_PMKSA); 2425 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) 2426 CMD(remain_on_channel, REMAIN_ON_CHANNEL); 2427 CMD(set_bitrate_mask, SET_TX_BITRATE_MASK); 2428 CMD(mgmt_tx, FRAME); 2429 CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL); 2430 if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) { 2431 i++; 2432 if (nla_put_u32(msg, i, NL80211_CMD_SET_WIPHY_NETNS)) 2433 goto nla_put_failure; 2434 } 2435 if (rdev->ops->set_monitor_channel || rdev->ops->start_ap || 2436 rdev->ops->join_mesh) { 2437 i++; 2438 if (nla_put_u32(msg, i, NL80211_CMD_SET_CHANNEL)) 2439 goto nla_put_failure; 2440 } 2441 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) { 2442 CMD(tdls_mgmt, TDLS_MGMT); 2443 CMD(tdls_oper, TDLS_OPER); 2444 } 2445 if (rdev->wiphy.max_sched_scan_reqs) 2446 CMD(sched_scan_start, START_SCHED_SCAN); 2447 CMD(probe_client, PROBE_CLIENT); 2448 CMD(set_noack_map, SET_NOACK_MAP); 2449 if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) { 2450 i++; 2451 if (nla_put_u32(msg, i, NL80211_CMD_REGISTER_BEACONS)) 2452 goto nla_put_failure; 2453 } 2454 CMD(start_p2p_device, START_P2P_DEVICE); 2455 CMD(set_mcast_rate, SET_MCAST_RATE); 2456 #ifdef CONFIG_NL80211_TESTMODE 2457 CMD(testmode_cmd, TESTMODE); 2458 #endif 2459 2460 if (rdev->ops->connect || rdev->ops->auth) { 2461 i++; 2462 if (nla_put_u32(msg, i, NL80211_CMD_CONNECT)) 2463 goto nla_put_failure; 2464 } 2465 2466 if (rdev->ops->disconnect || rdev->ops->deauth) { 2467 i++; 2468 if (nla_put_u32(msg, i, NL80211_CMD_DISCONNECT)) 2469 goto nla_put_failure; 2470 } 2471 2472 return i; 2473 nla_put_failure: 2474 return -ENOBUFS; 2475 } 2476 2477 static int 2478 nl80211_send_pmsr_ftm_capa(const struct cfg80211_pmsr_capabilities *cap, 2479 struct sk_buff *msg) 2480 { 2481 struct nlattr *ftm; 2482 2483 if (!cap->ftm.supported) 2484 return 0; 2485 2486 ftm = nla_nest_start_noflag(msg, NL80211_PMSR_TYPE_FTM); 2487 if (!ftm) 2488 return -ENOBUFS; 2489 2490 if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP)) 2491 return -ENOBUFS; 2492 if (cap->ftm.non_asap && 2493 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP)) 2494 return -ENOBUFS; 2495 if (cap->ftm.request_lci && 2496 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI)) 2497 return -ENOBUFS; 2498 if (cap->ftm.request_civicloc && 2499 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_CIVICLOC)) 2500 return -ENOBUFS; 2501 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES, 2502 cap->ftm.preambles)) 2503 return -ENOBUFS; 2504 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS, 2505 cap->ftm.bandwidths)) 2506 return -ENOBUFS; 2507 if (cap->ftm.max_bursts_exponent >= 0 && 2508 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT, 2509 cap->ftm.max_bursts_exponent)) 2510 return -ENOBUFS; 2511 if (cap->ftm.max_ftms_per_burst && 2512 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST, 2513 cap->ftm.max_ftms_per_burst)) 2514 return -ENOBUFS; 2515 if (cap->ftm.trigger_based && 2516 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED)) 2517 return -ENOBUFS; 2518 if (cap->ftm.non_trigger_based && 2519 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED)) 2520 return -ENOBUFS; 2521 if (cap->ftm.support_6ghz && 2522 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_6GHZ_SUPPORT)) 2523 return -ENOBUFS; 2524 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_TX_LTF_REP, 2525 cap->ftm.max_tx_ltf_rep)) 2526 return -ENOBUFS; 2527 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_RX_LTF_REP, 2528 cap->ftm.max_rx_ltf_rep)) 2529 return -ENOBUFS; 2530 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_TX_STS, 2531 cap->ftm.max_tx_sts)) 2532 return -ENOBUFS; 2533 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_RX_STS, 2534 cap->ftm.max_rx_sts)) 2535 return -ENOBUFS; 2536 if (cap->ftm.max_total_ltf_tx > 0 && 2537 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_TOTAL_LTF_TX, 2538 cap->ftm.max_total_ltf_tx)) 2539 return -ENOBUFS; 2540 if (cap->ftm.max_total_ltf_rx > 0 && 2541 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_TOTAL_LTF_RX, 2542 cap->ftm.max_total_ltf_rx)) 2543 return -ENOBUFS; 2544 2545 if (cap->ftm.ista.support_ntb || cap->ftm.ista.support_tb || 2546 cap->ftm.ista.support_edca) { 2547 struct nlattr *ista_caps; 2548 2549 ista_caps = nla_nest_start_noflag(msg, 2550 NL80211_PMSR_FTM_CAPA_ATTR_ISTA_CAPS); 2551 if (!ista_caps) 2552 return -ENOBUFS; 2553 if (cap->ftm.ista.support_ntb && 2554 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_SUPPORT_NTB)) 2555 return -ENOBUFS; 2556 if (cap->ftm.ista.support_tb && 2557 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_SUPPORT_TB)) 2558 return -ENOBUFS; 2559 if (cap->ftm.ista.support_edca && 2560 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_SUPPORT_EDCA)) 2561 return -ENOBUFS; 2562 if (cap->ftm.ista.max_peers && 2563 nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEER_ISTA_ROLE, 2564 cap->ftm.ista.max_peers)) 2565 return -ENOBUFS; 2566 nla_nest_end(msg, ista_caps); 2567 } 2568 2569 if (cap->ftm.rsta.support_ntb || cap->ftm.rsta.support_tb || 2570 cap->ftm.rsta.support_edca) { 2571 struct nlattr *rsta_caps; 2572 2573 /* 2574 * Set the generic RSTA_SUPPORT flag if any of the specific 2575 * ranging modes is supported to maintain the backward 2576 * compatibility. 2577 */ 2578 if (nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_RSTA_SUPPORT)) 2579 return -ENOBUFS; 2580 2581 rsta_caps = nla_nest_start_noflag(msg, 2582 NL80211_PMSR_FTM_CAPA_ATTR_RSTA_CAPS); 2583 if (!rsta_caps) 2584 return -ENOBUFS; 2585 if (cap->ftm.rsta.support_ntb && 2586 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_SUPPORT_NTB)) 2587 return -ENOBUFS; 2588 if (cap->ftm.rsta.support_tb && 2589 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_SUPPORT_TB)) 2590 return -ENOBUFS; 2591 if (cap->ftm.rsta.support_edca && 2592 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_SUPPORT_EDCA)) 2593 return -ENOBUFS; 2594 if (cap->ftm.rsta.max_peers && 2595 nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEER_RSTA_ROLE, 2596 cap->ftm.rsta.max_peers)) 2597 return -ENOBUFS; 2598 nla_nest_end(msg, rsta_caps); 2599 } 2600 2601 if (cap->ftm.max_no_of_tx_antennas && 2602 nla_put_u8(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_NUM_TX_ANTENNAS, 2603 cap->ftm.max_no_of_tx_antennas)) 2604 return -ENOBUFS; 2605 2606 if (cap->ftm.max_no_of_rx_antennas && 2607 nla_put_u8(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_NUM_RX_ANTENNAS, 2608 cap->ftm.max_no_of_rx_antennas)) 2609 return -ENOBUFS; 2610 2611 if (cap->ftm.min_allowed_ranging_interval_edca && 2612 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MIN_INTERVAL_EDCA, 2613 cap->ftm.min_allowed_ranging_interval_edca)) 2614 return -ENOBUFS; 2615 2616 if (cap->ftm.min_allowed_ranging_interval_ntb && 2617 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MIN_INTERVAL_NTB, 2618 cap->ftm.min_allowed_ranging_interval_ntb)) 2619 return -ENOBUFS; 2620 2621 if (cap->ftm.type.infra_support || cap->ftm.type.pd_support) { 2622 struct nlattr *pd_caps; 2623 2624 pd_caps = nla_nest_start_noflag(msg, 2625 NL80211_PMSR_FTM_CAPA_ATTR_TYPE_CAPS); 2626 if (!pd_caps) 2627 return -ENOBUFS; 2628 2629 if (cap->ftm.type.infra_support && 2630 nla_put_flag(msg, NL80211_PMSR_FTM_TYPE_CAPA_ATTR_INFRA_SUPPORT)) 2631 return -ENOBUFS; 2632 2633 if (cap->ftm.type.pd_support && 2634 nla_put_flag(msg, NL80211_PMSR_FTM_TYPE_CAPA_ATTR_PD_SUPPORT)) 2635 return -ENOBUFS; 2636 2637 nla_nest_end(msg, pd_caps); 2638 } 2639 2640 if (cap->ftm.concurrent_ista_rsta_support && 2641 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_CONCURRENT_ISTA_RSTA_SUPPORT)) 2642 return -ENOBUFS; 2643 2644 if (cap->ftm.type.pd_support) { 2645 if (cap->ftm.pd_preambles && 2646 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_PD_PREAMBLES, 2647 cap->ftm.pd_preambles)) 2648 return -ENOBUFS; 2649 if (cap->ftm.pd_bandwidths && 2650 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_PD_BANDWIDTHS, 2651 cap->ftm.pd_bandwidths)) 2652 return -ENOBUFS; 2653 } 2654 2655 nla_nest_end(msg, ftm); 2656 return 0; 2657 } 2658 2659 static int nl80211_send_pmsr_capa(struct cfg80211_registered_device *rdev, 2660 struct sk_buff *msg) 2661 { 2662 const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa; 2663 struct nlattr *pmsr, *caps; 2664 2665 if (!cap) 2666 return 0; 2667 2668 /* 2669 * we don't need to clean up anything here since the caller 2670 * will genlmsg_cancel() if we fail 2671 */ 2672 2673 pmsr = nla_nest_start_noflag(msg, NL80211_ATTR_PEER_MEASUREMENTS); 2674 if (!pmsr) 2675 return -ENOBUFS; 2676 2677 if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers)) 2678 return -ENOBUFS; 2679 2680 if (cap->report_ap_tsf && 2681 nla_put_flag(msg, NL80211_PMSR_ATTR_REPORT_AP_TSF)) 2682 return -ENOBUFS; 2683 2684 if (cap->randomize_mac_addr && 2685 nla_put_flag(msg, NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR)) 2686 return -ENOBUFS; 2687 2688 caps = nla_nest_start_noflag(msg, NL80211_PMSR_ATTR_TYPE_CAPA); 2689 if (!caps) 2690 return -ENOBUFS; 2691 2692 if (nl80211_send_pmsr_ftm_capa(cap, msg)) 2693 return -ENOBUFS; 2694 2695 nla_nest_end(msg, caps); 2696 nla_nest_end(msg, pmsr); 2697 2698 return 0; 2699 } 2700 2701 static int 2702 nl80211_put_iftype_akm_suites(struct cfg80211_registered_device *rdev, 2703 struct sk_buff *msg) 2704 { 2705 int i; 2706 struct nlattr *nested, *nested_akms; 2707 const struct wiphy_iftype_akm_suites *iftype_akms; 2708 2709 if (!rdev->wiphy.num_iftype_akm_suites || 2710 !rdev->wiphy.iftype_akm_suites) 2711 return 0; 2712 2713 nested = nla_nest_start(msg, NL80211_ATTR_IFTYPE_AKM_SUITES); 2714 if (!nested) 2715 return -ENOBUFS; 2716 2717 for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) { 2718 nested_akms = nla_nest_start(msg, i + 1); 2719 if (!nested_akms) 2720 return -ENOBUFS; 2721 2722 iftype_akms = &rdev->wiphy.iftype_akm_suites[i]; 2723 2724 if (nl80211_put_iftypes(msg, NL80211_IFTYPE_AKM_ATTR_IFTYPES, 2725 iftype_akms->iftypes_mask)) 2726 return -ENOBUFS; 2727 2728 if (nla_put(msg, NL80211_IFTYPE_AKM_ATTR_SUITES, 2729 sizeof(u32) * iftype_akms->n_akm_suites, 2730 iftype_akms->akm_suites)) { 2731 return -ENOBUFS; 2732 } 2733 nla_nest_end(msg, nested_akms); 2734 } 2735 2736 nla_nest_end(msg, nested); 2737 2738 return 0; 2739 } 2740 2741 static int 2742 nl80211_put_tid_config_support(struct cfg80211_registered_device *rdev, 2743 struct sk_buff *msg) 2744 { 2745 struct nlattr *supp; 2746 2747 if (!rdev->wiphy.tid_config_support.vif && 2748 !rdev->wiphy.tid_config_support.peer) 2749 return 0; 2750 2751 supp = nla_nest_start(msg, NL80211_ATTR_TID_CONFIG); 2752 if (!supp) 2753 return -ENOSPC; 2754 2755 if (rdev->wiphy.tid_config_support.vif && 2756 nla_put_u64_64bit(msg, NL80211_TID_CONFIG_ATTR_VIF_SUPP, 2757 rdev->wiphy.tid_config_support.vif, 2758 NL80211_TID_CONFIG_ATTR_PAD)) 2759 goto fail; 2760 2761 if (rdev->wiphy.tid_config_support.peer && 2762 nla_put_u64_64bit(msg, NL80211_TID_CONFIG_ATTR_PEER_SUPP, 2763 rdev->wiphy.tid_config_support.peer, 2764 NL80211_TID_CONFIG_ATTR_PAD)) 2765 goto fail; 2766 2767 /* for now we just use the same value ... makes more sense */ 2768 if (nla_put_u8(msg, NL80211_TID_CONFIG_ATTR_RETRY_SHORT, 2769 rdev->wiphy.tid_config_support.max_retry)) 2770 goto fail; 2771 if (nla_put_u8(msg, NL80211_TID_CONFIG_ATTR_RETRY_LONG, 2772 rdev->wiphy.tid_config_support.max_retry)) 2773 goto fail; 2774 2775 nla_nest_end(msg, supp); 2776 2777 return 0; 2778 fail: 2779 nla_nest_cancel(msg, supp); 2780 return -ENOBUFS; 2781 } 2782 2783 static int 2784 nl80211_put_sar_specs(struct cfg80211_registered_device *rdev, 2785 struct sk_buff *msg) 2786 { 2787 struct nlattr *sar_capa, *specs, *sub_freq_range; 2788 u8 num_freq_ranges; 2789 int i; 2790 2791 if (!rdev->wiphy.sar_capa) 2792 return 0; 2793 2794 num_freq_ranges = rdev->wiphy.sar_capa->num_freq_ranges; 2795 2796 sar_capa = nla_nest_start(msg, NL80211_ATTR_SAR_SPEC); 2797 if (!sar_capa) 2798 return -ENOSPC; 2799 2800 if (nla_put_u32(msg, NL80211_SAR_ATTR_TYPE, rdev->wiphy.sar_capa->type)) 2801 goto fail; 2802 2803 specs = nla_nest_start(msg, NL80211_SAR_ATTR_SPECS); 2804 if (!specs) 2805 goto fail; 2806 2807 /* report supported freq_ranges */ 2808 for (i = 0; i < num_freq_ranges; i++) { 2809 sub_freq_range = nla_nest_start(msg, i + 1); 2810 if (!sub_freq_range) 2811 goto fail; 2812 2813 if (nla_put_u32(msg, NL80211_SAR_ATTR_SPECS_START_FREQ, 2814 rdev->wiphy.sar_capa->freq_ranges[i].start_freq)) 2815 goto fail; 2816 2817 if (nla_put_u32(msg, NL80211_SAR_ATTR_SPECS_END_FREQ, 2818 rdev->wiphy.sar_capa->freq_ranges[i].end_freq)) 2819 goto fail; 2820 2821 nla_nest_end(msg, sub_freq_range); 2822 } 2823 2824 nla_nest_end(msg, specs); 2825 nla_nest_end(msg, sar_capa); 2826 2827 return 0; 2828 fail: 2829 nla_nest_cancel(msg, sar_capa); 2830 return -ENOBUFS; 2831 } 2832 2833 static int nl80211_put_mbssid_support(struct wiphy *wiphy, struct sk_buff *msg) 2834 { 2835 struct nlattr *config; 2836 2837 if (!wiphy->mbssid_max_interfaces) 2838 return 0; 2839 2840 config = nla_nest_start(msg, NL80211_ATTR_MBSSID_CONFIG); 2841 if (!config) 2842 return -ENOBUFS; 2843 2844 if (nla_put_u8(msg, NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES, 2845 wiphy->mbssid_max_interfaces)) 2846 goto fail; 2847 2848 if (wiphy->ema_max_profile_periodicity && 2849 nla_put_u8(msg, 2850 NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY, 2851 wiphy->ema_max_profile_periodicity)) 2852 goto fail; 2853 2854 nla_nest_end(msg, config); 2855 return 0; 2856 2857 fail: 2858 nla_nest_cancel(msg, config); 2859 return -ENOBUFS; 2860 } 2861 2862 static int nl80211_put_radio(struct wiphy *wiphy, struct sk_buff *msg, int idx) 2863 { 2864 const struct wiphy_radio *r = &wiphy->radio[idx]; 2865 const struct wiphy_radio_cfg *rcfg = &wiphy->radio_cfg[idx]; 2866 struct nlattr *radio, *freq; 2867 int i; 2868 2869 radio = nla_nest_start(msg, idx); 2870 if (!radio) 2871 return -ENOBUFS; 2872 2873 if (nla_put_u32(msg, NL80211_WIPHY_RADIO_ATTR_INDEX, idx)) 2874 goto nla_put_failure; 2875 2876 if (rcfg->rts_threshold && 2877 nla_put_u32(msg, NL80211_WIPHY_RADIO_ATTR_RTS_THRESHOLD, 2878 rcfg->rts_threshold)) 2879 goto nla_put_failure; 2880 2881 if (r->antenna_mask && 2882 nla_put_u32(msg, NL80211_WIPHY_RADIO_ATTR_ANTENNA_MASK, 2883 r->antenna_mask)) 2884 goto nla_put_failure; 2885 2886 for (i = 0; i < r->n_freq_range; i++) { 2887 const struct wiphy_radio_freq_range *range = &r->freq_range[i]; 2888 2889 freq = nla_nest_start(msg, NL80211_WIPHY_RADIO_ATTR_FREQ_RANGE); 2890 if (!freq) 2891 goto nla_put_failure; 2892 2893 if (nla_put_u32(msg, NL80211_WIPHY_RADIO_FREQ_ATTR_START, 2894 range->start_freq) || 2895 nla_put_u32(msg, NL80211_WIPHY_RADIO_FREQ_ATTR_END, 2896 range->end_freq)) 2897 goto nla_put_failure; 2898 2899 nla_nest_end(msg, freq); 2900 } 2901 2902 for (i = 0; i < r->n_iface_combinations; i++) 2903 if (nl80211_put_ifcomb_data(msg, true, 2904 NL80211_WIPHY_RADIO_ATTR_INTERFACE_COMBINATION, 2905 &r->iface_combinations[i], 2906 NLA_F_NESTED)) 2907 goto nla_put_failure; 2908 2909 nla_nest_end(msg, radio); 2910 2911 return 0; 2912 2913 nla_put_failure: 2914 return -ENOBUFS; 2915 } 2916 2917 static int nl80211_put_radios(struct wiphy *wiphy, struct sk_buff *msg) 2918 { 2919 struct nlattr *radios; 2920 int i; 2921 2922 if (!wiphy->n_radio) 2923 return 0; 2924 2925 radios = nla_nest_start(msg, NL80211_ATTR_WIPHY_RADIOS); 2926 if (!radios) 2927 return -ENOBUFS; 2928 2929 for (i = 0; i < wiphy->n_radio; i++) 2930 if (nl80211_put_radio(wiphy, msg, i)) 2931 goto fail; 2932 2933 nla_nest_end(msg, radios); 2934 2935 if (nl80211_put_iface_combinations(wiphy, msg, 2936 NL80211_ATTR_WIPHY_INTERFACE_COMBINATIONS, 2937 -1, true, NLA_F_NESTED)) 2938 return -ENOBUFS; 2939 2940 return 0; 2941 2942 fail: 2943 nla_nest_cancel(msg, radios); 2944 return -ENOBUFS; 2945 } 2946 2947 static int nl80211_put_nan_phy_cap(struct wiphy *wiphy, struct sk_buff *msg) 2948 { 2949 struct nlattr *nl_phy_cap; 2950 const struct ieee80211_sta_ht_cap *ht_cap; 2951 const struct ieee80211_sta_vht_cap *vht_cap; 2952 const struct ieee80211_sta_he_cap *he_cap; 2953 2954 if (!cfg80211_iftype_allowed(wiphy, NL80211_IFTYPE_NAN_DATA, false, 0)) 2955 return 0; 2956 2957 ht_cap = &wiphy->nan_capa.phy.ht; 2958 vht_cap = &wiphy->nan_capa.phy.vht; 2959 he_cap = &wiphy->nan_capa.phy.he; 2960 2961 /* HT is mandatory */ 2962 if (WARN_ON(!ht_cap->ht_supported)) 2963 return 0; 2964 2965 nl_phy_cap = nla_nest_start_noflag(msg, NL80211_NAN_CAPA_PHY); 2966 if (!nl_phy_cap) 2967 return -ENOBUFS; 2968 2969 if (nla_put(msg, NL80211_NAN_PHY_CAP_ATTR_HT_MCS_SET, 2970 sizeof(ht_cap->mcs), &ht_cap->mcs) || 2971 nla_put_u16(msg, NL80211_NAN_PHY_CAP_ATTR_HT_CAPA, ht_cap->cap) || 2972 nla_put_u8(msg, NL80211_NAN_PHY_CAP_ATTR_HT_AMPDU_FACTOR, 2973 ht_cap->ampdu_factor) || 2974 nla_put_u8(msg, NL80211_NAN_PHY_CAP_ATTR_HT_AMPDU_DENSITY, 2975 ht_cap->ampdu_density)) 2976 goto fail; 2977 2978 if (vht_cap->vht_supported) { 2979 if (nla_put(msg, NL80211_NAN_PHY_CAP_ATTR_VHT_MCS_SET, 2980 sizeof(vht_cap->vht_mcs), &vht_cap->vht_mcs) || 2981 nla_put_u32(msg, NL80211_NAN_PHY_CAP_ATTR_VHT_CAPA, 2982 vht_cap->cap)) 2983 goto fail; 2984 } 2985 2986 if (he_cap->has_he) { 2987 if (nla_put(msg, NL80211_NAN_PHY_CAP_ATTR_HE_MAC, 2988 sizeof(he_cap->he_cap_elem.mac_cap_info), 2989 he_cap->he_cap_elem.mac_cap_info) || 2990 nla_put(msg, NL80211_NAN_PHY_CAP_ATTR_HE_PHY, 2991 sizeof(he_cap->he_cap_elem.phy_cap_info), 2992 he_cap->he_cap_elem.phy_cap_info) || 2993 nla_put(msg, NL80211_NAN_PHY_CAP_ATTR_HE_MCS_SET, 2994 sizeof(he_cap->he_mcs_nss_supp), 2995 &he_cap->he_mcs_nss_supp) || 2996 nla_put(msg, NL80211_NAN_PHY_CAP_ATTR_HE_PPE, 2997 sizeof(he_cap->ppe_thres), he_cap->ppe_thres)) 2998 goto fail; 2999 } 3000 3001 nla_nest_end(msg, nl_phy_cap); 3002 return 0; 3003 3004 fail: 3005 nla_nest_cancel(msg, nl_phy_cap); 3006 return -ENOBUFS; 3007 } 3008 3009 static int nl80211_put_nan_capa(struct wiphy *wiphy, struct sk_buff *msg) 3010 { 3011 struct nlattr *nan_caps; 3012 3013 nan_caps = nla_nest_start(msg, NL80211_ATTR_NAN_CAPABILITIES); 3014 if (!nan_caps) 3015 return -ENOBUFS; 3016 3017 if (wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_CONFIGURABLE_SYNC && 3018 nla_put_flag(msg, NL80211_NAN_CAPA_CONFIGURABLE_SYNC)) 3019 goto fail; 3020 3021 if ((wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_USERSPACE_DE) && 3022 nla_put_flag(msg, NL80211_NAN_CAPA_USERSPACE_DE)) 3023 goto fail; 3024 3025 if (nla_put_u8(msg, NL80211_NAN_CAPA_OP_MODE, 3026 wiphy->nan_capa.op_mode) || 3027 nla_put_u8(msg, NL80211_NAN_CAPA_NUM_ANTENNAS, 3028 wiphy->nan_capa.n_antennas) || 3029 nla_put_u16(msg, NL80211_NAN_CAPA_MAX_CHANNEL_SWITCH_TIME, 3030 wiphy->nan_capa.max_channel_switch_time) || 3031 nla_put_u8(msg, NL80211_NAN_CAPA_CAPABILITIES, 3032 wiphy->nan_capa.dev_capabilities)) 3033 goto fail; 3034 3035 if (nl80211_put_nan_phy_cap(wiphy, msg)) 3036 goto fail; 3037 3038 nla_nest_end(msg, nan_caps); 3039 3040 return 0; 3041 3042 fail: 3043 nla_nest_cancel(msg, nan_caps); 3044 return -ENOBUFS; 3045 } 3046 3047 struct nl80211_dump_wiphy_state { 3048 s64 filter_wiphy; 3049 long start; 3050 long split_start, band_start, chan_start, capa_start; 3051 bool split; 3052 }; 3053 3054 static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, 3055 enum nl80211_commands cmd, 3056 struct sk_buff *msg, u32 portid, u32 seq, 3057 int flags, struct nl80211_dump_wiphy_state *state) 3058 { 3059 void *hdr; 3060 struct nlattr *nl_bands, *nl_band; 3061 struct nlattr *nl_freqs, *nl_freq; 3062 struct nlattr *nl_cmds; 3063 enum nl80211_band band; 3064 struct ieee80211_channel *chan; 3065 int i; 3066 const struct ieee80211_txrx_stypes *mgmt_stypes = 3067 rdev->wiphy.mgmt_stypes; 3068 u32 features; 3069 3070 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 3071 if (!hdr) 3072 return -ENOBUFS; 3073 3074 if (WARN_ON(!state)) 3075 return -EINVAL; 3076 3077 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 3078 nla_put_string(msg, NL80211_ATTR_WIPHY_NAME, 3079 wiphy_name(&rdev->wiphy)) || 3080 nla_put_u32(msg, NL80211_ATTR_GENERATION, 3081 cfg80211_rdev_list_generation)) 3082 goto nla_put_failure; 3083 3084 if (cmd != NL80211_CMD_NEW_WIPHY) 3085 goto finish; 3086 3087 switch (state->split_start) { 3088 case 0: 3089 if (nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT, 3090 rdev->wiphy.retry_short) || 3091 nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_LONG, 3092 rdev->wiphy.retry_long) || 3093 nla_put_u32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD, 3094 rdev->wiphy.frag_threshold) || 3095 nla_put_u32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD, 3096 rdev->wiphy.rts_threshold) || 3097 nla_put_u8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS, 3098 rdev->wiphy.coverage_class) || 3099 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS, 3100 rdev->wiphy.max_scan_ssids) || 3101 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS, 3102 rdev->wiphy.max_sched_scan_ssids) || 3103 nla_put_u16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN, 3104 rdev->wiphy.max_scan_ie_len) || 3105 nla_put_u16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN, 3106 rdev->wiphy.max_sched_scan_ie_len) || 3107 nla_put_u8(msg, NL80211_ATTR_MAX_MATCH_SETS, 3108 rdev->wiphy.max_match_sets)) 3109 goto nla_put_failure; 3110 3111 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) && 3112 nla_put_flag(msg, NL80211_ATTR_SUPPORT_IBSS_RSN)) 3113 goto nla_put_failure; 3114 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) && 3115 nla_put_flag(msg, NL80211_ATTR_SUPPORT_MESH_AUTH)) 3116 goto nla_put_failure; 3117 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) && 3118 nla_put_flag(msg, NL80211_ATTR_SUPPORT_AP_UAPSD)) 3119 goto nla_put_failure; 3120 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) && 3121 nla_put_flag(msg, NL80211_ATTR_ROAM_SUPPORT)) 3122 goto nla_put_failure; 3123 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) && 3124 nla_put_flag(msg, NL80211_ATTR_TDLS_SUPPORT)) 3125 goto nla_put_failure; 3126 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) && 3127 nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP)) 3128 goto nla_put_failure; 3129 state->split_start++; 3130 if (state->split) 3131 break; 3132 fallthrough; 3133 case 1: 3134 if (nla_put(msg, NL80211_ATTR_CIPHER_SUITES, 3135 sizeof(u32) * rdev->wiphy.n_cipher_suites, 3136 rdev->wiphy.cipher_suites)) 3137 goto nla_put_failure; 3138 3139 if (nla_put_u8(msg, NL80211_ATTR_MAX_NUM_PMKIDS, 3140 rdev->wiphy.max_num_pmkids)) 3141 goto nla_put_failure; 3142 3143 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && 3144 nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE)) 3145 goto nla_put_failure; 3146 3147 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX, 3148 rdev->wiphy.available_antennas_tx) || 3149 nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX, 3150 rdev->wiphy.available_antennas_rx)) 3151 goto nla_put_failure; 3152 3153 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) && 3154 nla_put_u32(msg, NL80211_ATTR_PROBE_RESP_OFFLOAD, 3155 rdev->wiphy.probe_resp_offload)) 3156 goto nla_put_failure; 3157 3158 if ((rdev->wiphy.available_antennas_tx || 3159 rdev->wiphy.available_antennas_rx) && 3160 rdev->ops->get_antenna) { 3161 u32 tx_ant = 0, rx_ant = 0; 3162 int res; 3163 3164 res = rdev_get_antenna(rdev, -1, &tx_ant, &rx_ant); 3165 if (!res) { 3166 if (nla_put_u32(msg, 3167 NL80211_ATTR_WIPHY_ANTENNA_TX, 3168 tx_ant) || 3169 nla_put_u32(msg, 3170 NL80211_ATTR_WIPHY_ANTENNA_RX, 3171 rx_ant)) 3172 goto nla_put_failure; 3173 } 3174 } 3175 3176 state->split_start++; 3177 if (state->split) 3178 break; 3179 fallthrough; 3180 case 2: 3181 if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES, 3182 rdev->wiphy.interface_modes)) 3183 goto nla_put_failure; 3184 state->split_start++; 3185 if (state->split) 3186 break; 3187 fallthrough; 3188 case 3: 3189 nl_bands = nla_nest_start_noflag(msg, 3190 NL80211_ATTR_WIPHY_BANDS); 3191 if (!nl_bands) 3192 goto nla_put_failure; 3193 3194 for (band = state->band_start; 3195 band < (state->split ? 3196 NUM_NL80211_BANDS : 3197 NL80211_BAND_60GHZ + 1); 3198 band++) { 3199 struct ieee80211_supported_band *sband; 3200 3201 /* omit higher bands for ancient software */ 3202 if (band > NL80211_BAND_5GHZ && !state->split) 3203 break; 3204 3205 sband = rdev->wiphy.bands[band]; 3206 3207 if (!sband) 3208 continue; 3209 3210 nl_band = nla_nest_start_noflag(msg, band); 3211 if (!nl_band) 3212 goto nla_put_failure; 3213 3214 switch (state->chan_start) { 3215 case 0: 3216 if (nl80211_send_band_rateinfo(msg, sband, 3217 state->split)) 3218 goto nla_put_failure; 3219 state->chan_start++; 3220 if (state->split) 3221 break; 3222 fallthrough; 3223 default: 3224 /* add frequencies */ 3225 nl_freqs = nla_nest_start_noflag(msg, 3226 NL80211_BAND_ATTR_FREQS); 3227 if (!nl_freqs) 3228 goto nla_put_failure; 3229 3230 for (i = state->chan_start - 1; 3231 i < sband->n_channels; 3232 i++) { 3233 nl_freq = nla_nest_start_noflag(msg, 3234 i); 3235 if (!nl_freq) 3236 goto nla_put_failure; 3237 3238 chan = &sband->channels[i]; 3239 3240 if (nl80211_msg_put_channel( 3241 msg, &rdev->wiphy, chan, 3242 state->split)) 3243 goto nla_put_failure; 3244 3245 nla_nest_end(msg, nl_freq); 3246 if (state->split) 3247 break; 3248 } 3249 if (i < sband->n_channels) 3250 state->chan_start = i + 2; 3251 else 3252 state->chan_start = 0; 3253 nla_nest_end(msg, nl_freqs); 3254 } 3255 3256 nla_nest_end(msg, nl_band); 3257 3258 if (state->split) { 3259 /* start again here */ 3260 if (state->chan_start) 3261 band--; 3262 break; 3263 } 3264 } 3265 nla_nest_end(msg, nl_bands); 3266 3267 if (band < NUM_NL80211_BANDS) 3268 state->band_start = band + 1; 3269 else 3270 state->band_start = 0; 3271 3272 /* if bands & channels are done, continue outside */ 3273 if (state->band_start == 0 && state->chan_start == 0) 3274 state->split_start++; 3275 if (state->split) 3276 break; 3277 fallthrough; 3278 case 4: 3279 nl_cmds = nla_nest_start_noflag(msg, 3280 NL80211_ATTR_SUPPORTED_COMMANDS); 3281 if (!nl_cmds) 3282 goto nla_put_failure; 3283 3284 i = nl80211_add_commands_unsplit(rdev, msg); 3285 if (i < 0) 3286 goto nla_put_failure; 3287 if (state->split) { 3288 CMD(crit_proto_start, CRIT_PROTOCOL_START); 3289 CMD(crit_proto_stop, CRIT_PROTOCOL_STOP); 3290 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) 3291 CMD(channel_switch, CHANNEL_SWITCH); 3292 CMD(set_qos_map, SET_QOS_MAP); 3293 if (rdev->wiphy.features & 3294 NL80211_FEATURE_SUPPORTS_WMM_ADMISSION) 3295 CMD(add_tx_ts, ADD_TX_TS); 3296 CMD(set_multicast_to_unicast, SET_MULTICAST_TO_UNICAST); 3297 CMD(update_connect_params, UPDATE_CONNECT_PARAMS); 3298 CMD(update_ft_ies, UPDATE_FT_IES); 3299 if (rdev->wiphy.sar_capa) 3300 CMD(set_sar_specs, SET_SAR_SPECS); 3301 CMD(assoc_ml_reconf, ASSOC_MLO_RECONF); 3302 } 3303 #undef CMD 3304 3305 nla_nest_end(msg, nl_cmds); 3306 state->split_start++; 3307 if (state->split) 3308 break; 3309 fallthrough; 3310 case 5: 3311 if (rdev->ops->remain_on_channel && 3312 (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) && 3313 nla_put_u32(msg, 3314 NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION, 3315 rdev->wiphy.max_remain_on_channel_duration)) 3316 goto nla_put_failure; 3317 3318 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) && 3319 nla_put_flag(msg, NL80211_ATTR_OFFCHANNEL_TX_OK)) 3320 goto nla_put_failure; 3321 3322 state->split_start++; 3323 if (state->split) 3324 break; 3325 fallthrough; 3326 case 6: 3327 #ifdef CONFIG_PM 3328 if (nl80211_send_wowlan(msg, rdev, state->split)) 3329 goto nla_put_failure; 3330 state->split_start++; 3331 if (state->split) 3332 break; 3333 #else 3334 state->split_start++; 3335 #endif 3336 fallthrough; 3337 case 7: 3338 if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES, 3339 rdev->wiphy.software_iftypes)) 3340 goto nla_put_failure; 3341 3342 if (nl80211_put_iface_combinations(&rdev->wiphy, msg, 3343 NL80211_ATTR_INTERFACE_COMBINATIONS, 3344 rdev->wiphy.n_radio ? 0 : -1, 3345 state->split, 0)) 3346 goto nla_put_failure; 3347 3348 state->split_start++; 3349 if (state->split) 3350 break; 3351 fallthrough; 3352 case 8: 3353 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) && 3354 nla_put_u32(msg, NL80211_ATTR_DEVICE_AP_SME, 3355 rdev->wiphy.ap_sme_capa)) 3356 goto nla_put_failure; 3357 3358 features = rdev->wiphy.features; 3359 /* 3360 * We can only add the per-channel limit information if the 3361 * dump is split, otherwise it makes it too big. Therefore 3362 * only advertise it in that case. 3363 */ 3364 if (state->split) 3365 features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS; 3366 if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features)) 3367 goto nla_put_failure; 3368 3369 if (rdev->wiphy.ht_capa_mod_mask && 3370 nla_put(msg, NL80211_ATTR_HT_CAPABILITY_MASK, 3371 sizeof(*rdev->wiphy.ht_capa_mod_mask), 3372 rdev->wiphy.ht_capa_mod_mask)) 3373 goto nla_put_failure; 3374 3375 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME && 3376 rdev->wiphy.max_acl_mac_addrs && 3377 nla_put_u32(msg, NL80211_ATTR_MAC_ACL_MAX, 3378 rdev->wiphy.max_acl_mac_addrs)) 3379 goto nla_put_failure; 3380 3381 /* 3382 * Any information below this point is only available to 3383 * applications that can deal with it being split. This 3384 * helps ensure that newly added capabilities don't break 3385 * older tools by overrunning their buffers. 3386 * 3387 * We still increment split_start so that in the split 3388 * case we'll continue with more data in the next round, 3389 * but break unconditionally so unsplit data stops here. 3390 */ 3391 if (state->split) 3392 state->split_start++; 3393 else 3394 state->split_start = 0; 3395 break; 3396 case 9: 3397 if (nl80211_send_mgmt_stypes(msg, mgmt_stypes)) 3398 goto nla_put_failure; 3399 3400 if (nla_put_u32(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS, 3401 rdev->wiphy.max_sched_scan_plans) || 3402 nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL, 3403 rdev->wiphy.max_sched_scan_plan_interval) || 3404 nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS, 3405 rdev->wiphy.max_sched_scan_plan_iterations)) 3406 goto nla_put_failure; 3407 3408 if (rdev->wiphy.extended_capabilities && 3409 (nla_put(msg, NL80211_ATTR_EXT_CAPA, 3410 rdev->wiphy.extended_capabilities_len, 3411 rdev->wiphy.extended_capabilities) || 3412 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK, 3413 rdev->wiphy.extended_capabilities_len, 3414 rdev->wiphy.extended_capabilities_mask))) 3415 goto nla_put_failure; 3416 3417 if (rdev->wiphy.vht_capa_mod_mask && 3418 nla_put(msg, NL80211_ATTR_VHT_CAPABILITY_MASK, 3419 sizeof(*rdev->wiphy.vht_capa_mod_mask), 3420 rdev->wiphy.vht_capa_mod_mask)) 3421 goto nla_put_failure; 3422 3423 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 3424 rdev->wiphy.perm_addr)) 3425 goto nla_put_failure; 3426 3427 if (!is_zero_ether_addr(rdev->wiphy.addr_mask) && 3428 nla_put(msg, NL80211_ATTR_MAC_MASK, ETH_ALEN, 3429 rdev->wiphy.addr_mask)) 3430 goto nla_put_failure; 3431 3432 if (rdev->wiphy.n_addresses > 1) { 3433 void *attr; 3434 3435 attr = nla_nest_start(msg, NL80211_ATTR_MAC_ADDRS); 3436 if (!attr) 3437 goto nla_put_failure; 3438 3439 for (i = 0; i < rdev->wiphy.n_addresses; i++) 3440 if (nla_put(msg, i + 1, ETH_ALEN, 3441 rdev->wiphy.addresses[i].addr)) 3442 goto nla_put_failure; 3443 3444 nla_nest_end(msg, attr); 3445 } 3446 3447 state->split_start++; 3448 break; 3449 case 10: 3450 if (nl80211_send_coalesce(msg, rdev)) 3451 goto nla_put_failure; 3452 3453 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) && 3454 (nla_put_flag(msg, NL80211_ATTR_SUPPORT_5_MHZ) || 3455 nla_put_flag(msg, NL80211_ATTR_SUPPORT_10_MHZ))) 3456 goto nla_put_failure; 3457 3458 if (rdev->wiphy.max_ap_assoc_sta && 3459 nla_put_u32(msg, NL80211_ATTR_MAX_AP_ASSOC_STA, 3460 rdev->wiphy.max_ap_assoc_sta)) 3461 goto nla_put_failure; 3462 3463 state->split_start++; 3464 break; 3465 case 11: 3466 if (rdev->wiphy.n_vendor_commands) { 3467 const struct nl80211_vendor_cmd_info *info; 3468 struct nlattr *nested; 3469 3470 nested = nla_nest_start_noflag(msg, 3471 NL80211_ATTR_VENDOR_DATA); 3472 if (!nested) 3473 goto nla_put_failure; 3474 3475 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { 3476 info = &rdev->wiphy.vendor_commands[i].info; 3477 if (nla_put(msg, i + 1, sizeof(*info), info)) 3478 goto nla_put_failure; 3479 } 3480 nla_nest_end(msg, nested); 3481 } 3482 3483 if (rdev->wiphy.n_vendor_events) { 3484 const struct nl80211_vendor_cmd_info *info; 3485 struct nlattr *nested; 3486 3487 nested = nla_nest_start_noflag(msg, 3488 NL80211_ATTR_VENDOR_EVENTS); 3489 if (!nested) 3490 goto nla_put_failure; 3491 3492 for (i = 0; i < rdev->wiphy.n_vendor_events; i++) { 3493 info = &rdev->wiphy.vendor_events[i]; 3494 if (nla_put(msg, i + 1, sizeof(*info), info)) 3495 goto nla_put_failure; 3496 } 3497 nla_nest_end(msg, nested); 3498 } 3499 state->split_start++; 3500 break; 3501 case 12: 3502 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH && 3503 nla_put_u8(msg, NL80211_ATTR_MAX_CSA_COUNTERS, 3504 rdev->wiphy.max_num_csa_counters)) 3505 goto nla_put_failure; 3506 3507 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 3508 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 3509 goto nla_put_failure; 3510 3511 if (rdev->wiphy.max_sched_scan_reqs && 3512 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_MAX_REQS, 3513 rdev->wiphy.max_sched_scan_reqs)) 3514 goto nla_put_failure; 3515 3516 if (nla_put(msg, NL80211_ATTR_EXT_FEATURES, 3517 sizeof(rdev->wiphy.ext_features), 3518 rdev->wiphy.ext_features)) 3519 goto nla_put_failure; 3520 3521 if (rdev->wiphy.bss_param_support) { 3522 struct nlattr *nested; 3523 u32 parsup = rdev->wiphy.bss_param_support; 3524 3525 nested = nla_nest_start(msg, NL80211_ATTR_BSS_PARAM); 3526 if (!nested) 3527 goto nla_put_failure; 3528 3529 if ((parsup & WIPHY_BSS_PARAM_CTS_PROT) && 3530 nla_put_flag(msg, NL80211_ATTR_BSS_CTS_PROT)) 3531 goto nla_put_failure; 3532 if ((parsup & WIPHY_BSS_PARAM_SHORT_PREAMBLE) && 3533 nla_put_flag(msg, NL80211_ATTR_BSS_SHORT_PREAMBLE)) 3534 goto nla_put_failure; 3535 if ((parsup & WIPHY_BSS_PARAM_SHORT_SLOT_TIME) && 3536 nla_put_flag(msg, NL80211_ATTR_BSS_SHORT_SLOT_TIME)) 3537 goto nla_put_failure; 3538 if ((parsup & WIPHY_BSS_PARAM_BASIC_RATES) && 3539 nla_put_flag(msg, NL80211_ATTR_BSS_BASIC_RATES)) 3540 goto nla_put_failure; 3541 if ((parsup & WIPHY_BSS_PARAM_AP_ISOLATE) && 3542 nla_put_flag(msg, NL80211_ATTR_AP_ISOLATE)) 3543 goto nla_put_failure; 3544 if ((parsup & WIPHY_BSS_PARAM_HT_OPMODE) && 3545 nla_put_flag(msg, NL80211_ATTR_BSS_HT_OPMODE)) 3546 goto nla_put_failure; 3547 if ((parsup & WIPHY_BSS_PARAM_P2P_CTWINDOW) && 3548 nla_put_flag(msg, NL80211_ATTR_P2P_CTWINDOW)) 3549 goto nla_put_failure; 3550 if ((parsup & WIPHY_BSS_PARAM_P2P_OPPPS) && 3551 nla_put_flag(msg, NL80211_ATTR_P2P_OPPPS)) 3552 goto nla_put_failure; 3553 nla_nest_end(msg, nested); 3554 } 3555 if (rdev->wiphy.bss_select_support) { 3556 struct nlattr *nested; 3557 u32 bss_select_support = rdev->wiphy.bss_select_support; 3558 3559 nested = nla_nest_start_noflag(msg, 3560 NL80211_ATTR_BSS_SELECT); 3561 if (!nested) 3562 goto nla_put_failure; 3563 3564 i = 0; 3565 while (bss_select_support) { 3566 if ((bss_select_support & 1) && 3567 nla_put_flag(msg, i)) 3568 goto nla_put_failure; 3569 i++; 3570 bss_select_support >>= 1; 3571 } 3572 nla_nest_end(msg, nested); 3573 } 3574 3575 state->split_start++; 3576 break; 3577 case 13: 3578 if (rdev->wiphy.num_iftype_ext_capab && 3579 rdev->wiphy.iftype_ext_capab) { 3580 struct nlattr *nested_ext_capab, *nested; 3581 3582 nested = nla_nest_start_noflag(msg, 3583 NL80211_ATTR_IFTYPE_EXT_CAPA); 3584 if (!nested) 3585 goto nla_put_failure; 3586 3587 for (i = state->capa_start; 3588 i < rdev->wiphy.num_iftype_ext_capab; i++) { 3589 const struct wiphy_iftype_ext_capab *capab; 3590 3591 capab = &rdev->wiphy.iftype_ext_capab[i]; 3592 3593 nested_ext_capab = nla_nest_start_noflag(msg, 3594 i); 3595 if (!nested_ext_capab || 3596 nla_put_u32(msg, NL80211_ATTR_IFTYPE, 3597 capab->iftype) || 3598 nla_put(msg, NL80211_ATTR_EXT_CAPA, 3599 capab->extended_capabilities_len, 3600 capab->extended_capabilities) || 3601 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK, 3602 capab->extended_capabilities_len, 3603 capab->extended_capabilities_mask)) 3604 goto nla_put_failure; 3605 3606 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO && 3607 (nla_put_u16(msg, 3608 NL80211_ATTR_EML_CAPABILITY, 3609 capab->eml_capabilities) || 3610 nla_put_u16(msg, 3611 NL80211_ATTR_MLD_CAPA_AND_OPS, 3612 capab->mld_capa_and_ops))) 3613 goto nla_put_failure; 3614 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO && 3615 capab->ext_mld_capa_and_ops && 3616 nla_put_u16(msg, 3617 NL80211_ATTR_EXT_MLD_CAPA_AND_OPS, 3618 capab->ext_mld_capa_and_ops)) 3619 goto nla_put_failure; 3620 3621 nla_nest_end(msg, nested_ext_capab); 3622 if (state->split) 3623 break; 3624 } 3625 nla_nest_end(msg, nested); 3626 if (i < rdev->wiphy.num_iftype_ext_capab) { 3627 state->capa_start = i + 1; 3628 break; 3629 } 3630 } 3631 3632 if (nla_put_u32(msg, NL80211_ATTR_BANDS, 3633 rdev->wiphy.nan_supported_bands)) 3634 goto nla_put_failure; 3635 3636 if (wiphy_ext_feature_isset(&rdev->wiphy, 3637 NL80211_EXT_FEATURE_TXQS)) { 3638 struct cfg80211_txq_stats txqstats = {}; 3639 int res; 3640 3641 res = rdev_get_txq_stats(rdev, NULL, &txqstats); 3642 if (!res && 3643 !nl80211_put_txq_stats(msg, &txqstats, 3644 NL80211_ATTR_TXQ_STATS)) 3645 goto nla_put_failure; 3646 3647 if (nla_put_u32(msg, NL80211_ATTR_TXQ_LIMIT, 3648 rdev->wiphy.txq_limit)) 3649 goto nla_put_failure; 3650 if (nla_put_u32(msg, NL80211_ATTR_TXQ_MEMORY_LIMIT, 3651 rdev->wiphy.txq_memory_limit)) 3652 goto nla_put_failure; 3653 if (nla_put_u32(msg, NL80211_ATTR_TXQ_QUANTUM, 3654 rdev->wiphy.txq_quantum)) 3655 goto nla_put_failure; 3656 } 3657 3658 state->split_start++; 3659 break; 3660 case 14: 3661 if (nl80211_send_pmsr_capa(rdev, msg)) 3662 goto nla_put_failure; 3663 3664 state->split_start++; 3665 break; 3666 case 15: 3667 if (rdev->wiphy.akm_suites && 3668 nla_put(msg, NL80211_ATTR_AKM_SUITES, 3669 sizeof(u32) * rdev->wiphy.n_akm_suites, 3670 rdev->wiphy.akm_suites)) 3671 goto nla_put_failure; 3672 3673 if (nl80211_put_iftype_akm_suites(rdev, msg)) 3674 goto nla_put_failure; 3675 3676 if (nl80211_put_tid_config_support(rdev, msg)) 3677 goto nla_put_failure; 3678 state->split_start++; 3679 break; 3680 case 16: 3681 if (nl80211_put_sar_specs(rdev, msg)) 3682 goto nla_put_failure; 3683 3684 if (nl80211_put_mbssid_support(&rdev->wiphy, msg)) 3685 goto nla_put_failure; 3686 3687 if (nla_put_u16(msg, NL80211_ATTR_MAX_NUM_AKM_SUITES, 3688 rdev->wiphy.max_num_akm_suites)) 3689 goto nla_put_failure; 3690 3691 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO) 3692 nla_put_flag(msg, NL80211_ATTR_MLO_SUPPORT); 3693 3694 if (rdev->wiphy.hw_timestamp_max_peers && 3695 nla_put_u16(msg, NL80211_ATTR_MAX_HW_TIMESTAMP_PEERS, 3696 rdev->wiphy.hw_timestamp_max_peers)) 3697 goto nla_put_failure; 3698 3699 state->split_start++; 3700 break; 3701 case 17: 3702 if (nl80211_put_radios(&rdev->wiphy, msg)) 3703 goto nla_put_failure; 3704 3705 state->split_start++; 3706 break; 3707 case 18: 3708 if (nl80211_put_nan_capa(&rdev->wiphy, msg)) 3709 goto nla_put_failure; 3710 3711 /* done */ 3712 state->split_start = 0; 3713 break; 3714 } 3715 finish: 3716 genlmsg_end(msg, hdr); 3717 return 0; 3718 3719 nla_put_failure: 3720 genlmsg_cancel(msg, hdr); 3721 return -EMSGSIZE; 3722 } 3723 3724 static int nl80211_dump_wiphy_parse(struct sk_buff *skb, 3725 struct netlink_callback *cb, 3726 struct nl80211_dump_wiphy_state *state) 3727 { 3728 struct nlattr **tb = kzalloc_objs(*tb, NUM_NL80211_ATTR); 3729 int ret; 3730 3731 if (!tb) 3732 return -ENOMEM; 3733 3734 ret = nlmsg_parse_deprecated(cb->nlh, 3735 GENL_HDRLEN + nl80211_fam.hdrsize, 3736 tb, nl80211_fam.maxattr, 3737 nl80211_policy, NULL); 3738 /* ignore parse errors for backward compatibility */ 3739 if (ret) { 3740 ret = 0; 3741 goto out; 3742 } 3743 3744 state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; 3745 if (tb[NL80211_ATTR_WIPHY]) 3746 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]); 3747 if (tb[NL80211_ATTR_WDEV]) 3748 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32; 3749 if (tb[NL80211_ATTR_IFINDEX]) { 3750 struct net_device *netdev; 3751 struct cfg80211_registered_device *rdev; 3752 int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]); 3753 3754 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx); 3755 if (!netdev) { 3756 ret = -ENODEV; 3757 goto out; 3758 } 3759 if (netdev->ieee80211_ptr) { 3760 rdev = wiphy_to_rdev( 3761 netdev->ieee80211_ptr->wiphy); 3762 state->filter_wiphy = rdev->wiphy_idx; 3763 } 3764 } 3765 3766 ret = 0; 3767 out: 3768 kfree(tb); 3769 return ret; 3770 } 3771 3772 static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb) 3773 { 3774 int idx = 0, ret; 3775 struct nl80211_dump_wiphy_state *state = (void *)cb->args[0]; 3776 struct cfg80211_registered_device *rdev; 3777 3778 rtnl_lock(); 3779 if (!state) { 3780 state = kzalloc_obj(*state); 3781 if (!state) { 3782 rtnl_unlock(); 3783 return -ENOMEM; 3784 } 3785 state->filter_wiphy = -1; 3786 ret = nl80211_dump_wiphy_parse(skb, cb, state); 3787 if (ret) { 3788 kfree(state); 3789 rtnl_unlock(); 3790 return ret; 3791 } 3792 cb->args[0] = (long)state; 3793 } 3794 3795 for_each_rdev(rdev) { 3796 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) 3797 continue; 3798 if (++idx <= state->start) 3799 continue; 3800 if (state->filter_wiphy != -1 && 3801 state->filter_wiphy != rdev->wiphy_idx) 3802 continue; 3803 wiphy_lock(&rdev->wiphy); 3804 /* attempt to fit multiple wiphy data chunks into the skb */ 3805 do { 3806 ret = nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, 3807 skb, 3808 NETLINK_CB(cb->skb).portid, 3809 cb->nlh->nlmsg_seq, 3810 NLM_F_MULTI, state); 3811 if (ret < 0) { 3812 /* 3813 * If sending the wiphy data didn't fit (ENOBUFS 3814 * or EMSGSIZE returned), this SKB is still 3815 * empty (so it's not too big because another 3816 * wiphy dataset is already in the skb) and 3817 * we've not tried to adjust the dump allocation 3818 * yet ... then adjust the alloc size to be 3819 * bigger, and return 1 but with the empty skb. 3820 * This results in an empty message being RX'ed 3821 * in userspace, but that is ignored. 3822 * 3823 * We can then retry with the larger buffer. 3824 */ 3825 if ((ret == -ENOBUFS || ret == -EMSGSIZE) && 3826 !skb->len && !state->split && 3827 cb->min_dump_alloc < 4096) { 3828 cb->min_dump_alloc = 4096; 3829 state->split_start = 0; 3830 wiphy_unlock(&rdev->wiphy); 3831 rtnl_unlock(); 3832 return 1; 3833 } 3834 idx--; 3835 break; 3836 } 3837 } while (state->split_start > 0); 3838 wiphy_unlock(&rdev->wiphy); 3839 break; 3840 } 3841 rtnl_unlock(); 3842 3843 state->start = idx; 3844 3845 return skb->len; 3846 } 3847 3848 static int nl80211_dump_wiphy_done(struct netlink_callback *cb) 3849 { 3850 kfree((void *)cb->args[0]); 3851 return 0; 3852 } 3853 3854 static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info) 3855 { 3856 struct sk_buff *msg; 3857 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3858 struct nl80211_dump_wiphy_state state = {}; 3859 3860 msg = nlmsg_new(4096, GFP_KERNEL); 3861 if (!msg) 3862 return -ENOMEM; 3863 3864 if (nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, msg, 3865 info->snd_portid, info->snd_seq, 0, 3866 &state) < 0) { 3867 nlmsg_free(msg); 3868 return -ENOBUFS; 3869 } 3870 3871 return genlmsg_reply(msg, info); 3872 } 3873 3874 static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = { 3875 [NL80211_TXQ_ATTR_QUEUE] = { .type = NLA_U8 }, 3876 [NL80211_TXQ_ATTR_TXOP] = { .type = NLA_U16 }, 3877 [NL80211_TXQ_ATTR_CWMIN] = { .type = NLA_U16 }, 3878 [NL80211_TXQ_ATTR_CWMAX] = { .type = NLA_U16 }, 3879 [NL80211_TXQ_ATTR_AIFS] = { .type = NLA_U8 }, 3880 }; 3881 3882 static int parse_txq_params(struct nlattr *tb[], 3883 struct ieee80211_txq_params *txq_params) 3884 { 3885 u8 ac; 3886 3887 if (!tb[NL80211_TXQ_ATTR_AC] || !tb[NL80211_TXQ_ATTR_TXOP] || 3888 !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] || 3889 !tb[NL80211_TXQ_ATTR_AIFS]) 3890 return -EINVAL; 3891 3892 ac = nla_get_u8(tb[NL80211_TXQ_ATTR_AC]); 3893 txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]); 3894 txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]); 3895 txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]); 3896 txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]); 3897 3898 if (ac >= NL80211_NUM_ACS) 3899 return -EINVAL; 3900 txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS); 3901 return 0; 3902 } 3903 3904 static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev) 3905 { 3906 /* 3907 * You can only set the channel explicitly for some interfaces, 3908 * most have their channel managed via their respective 3909 * "establish a connection" command (connect, join, ...) 3910 * 3911 * For AP/GO and mesh mode, the channel can be set with the 3912 * channel userspace API, but is only stored and passed to the 3913 * low-level driver when the AP starts or the mesh is joined. 3914 * This is for backward compatibility, userspace can also give 3915 * the channel in the start-ap or join-mesh commands instead. 3916 * 3917 * Monitors are special as they are normally slaved to 3918 * whatever else is going on, so they have their own special 3919 * operation to set the monitor channel if possible. 3920 */ 3921 return !wdev || 3922 wdev->iftype == NL80211_IFTYPE_AP || 3923 wdev->iftype == NL80211_IFTYPE_MESH_POINT || 3924 wdev->iftype == NL80211_IFTYPE_MONITOR || 3925 wdev->iftype == NL80211_IFTYPE_P2P_GO; 3926 } 3927 3928 static int _nl80211_parse_chandef(struct cfg80211_registered_device *rdev, 3929 struct netlink_ext_ack *extack, 3930 struct nlattr **attrs, bool monitor, 3931 struct cfg80211_chan_def *chandef, 3932 bool permit_npca) 3933 { 3934 u32 control_freq; 3935 3936 if (!attrs[NL80211_ATTR_WIPHY_FREQ]) { 3937 NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ], 3938 "Frequency is missing"); 3939 return -EINVAL; 3940 } 3941 3942 control_freq = MHZ_TO_KHZ( 3943 nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ])); 3944 if (attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 3945 control_freq += 3946 nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 3947 3948 memset(chandef, 0, sizeof(*chandef)); 3949 chandef->chan = ieee80211_get_channel_khz(&rdev->wiphy, control_freq); 3950 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; 3951 chandef->center_freq1 = KHZ_TO_MHZ(control_freq); 3952 chandef->freq1_offset = control_freq % 1000; 3953 chandef->center_freq2 = 0; 3954 chandef->s1g_primary_2mhz = false; 3955 3956 if (!chandef->chan) { 3957 NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ], 3958 "Unknown channel"); 3959 return -EINVAL; 3960 } 3961 3962 if (cfg80211_chandef_is_s1g(chandef)) 3963 chandef->width = NL80211_CHAN_WIDTH_1; 3964 3965 if (attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) { 3966 enum nl80211_channel_type chantype; 3967 3968 chantype = nla_get_u32(attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]); 3969 3970 switch (chantype) { 3971 case NL80211_CHAN_NO_HT: 3972 case NL80211_CHAN_HT20: 3973 case NL80211_CHAN_HT40PLUS: 3974 case NL80211_CHAN_HT40MINUS: 3975 if (chandef->chan->band == NL80211_BAND_60GHZ || 3976 chandef->chan->band == NL80211_BAND_S1GHZ) 3977 return -EINVAL; 3978 cfg80211_chandef_create(chandef, chandef->chan, 3979 chantype); 3980 /* user input for center_freq is incorrect */ 3981 if (attrs[NL80211_ATTR_CENTER_FREQ1] && 3982 chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) { 3983 NL_SET_ERR_MSG_ATTR(extack, 3984 attrs[NL80211_ATTR_CENTER_FREQ1], 3985 "bad center frequency 1"); 3986 return -EINVAL; 3987 } 3988 /* center_freq2 must be zero */ 3989 if (attrs[NL80211_ATTR_CENTER_FREQ2] && 3990 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2])) { 3991 NL_SET_ERR_MSG_ATTR(extack, 3992 attrs[NL80211_ATTR_CENTER_FREQ2], 3993 "center frequency 2 can't be used"); 3994 return -EINVAL; 3995 } 3996 break; 3997 default: 3998 NL_SET_ERR_MSG_ATTR(extack, 3999 attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE], 4000 "invalid channel type"); 4001 return -EINVAL; 4002 } 4003 } else if (attrs[NL80211_ATTR_CHANNEL_WIDTH]) { 4004 chandef->width = nla_get_u32(attrs[NL80211_ATTR_CHANNEL_WIDTH]); 4005 if (attrs[NL80211_ATTR_CENTER_FREQ1]) { 4006 chandef->center_freq1 = 4007 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1]); 4008 chandef->freq1_offset = nla_get_u32_default( 4009 attrs[NL80211_ATTR_CENTER_FREQ1_OFFSET], 0); 4010 } 4011 4012 if (attrs[NL80211_ATTR_CENTER_FREQ2]) 4013 chandef->center_freq2 = 4014 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2]); 4015 4016 chandef->s1g_primary_2mhz = nla_get_flag( 4017 attrs[NL80211_ATTR_S1G_PRIMARY_2MHZ]); 4018 } 4019 4020 if (attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { 4021 chandef->edmg.channels = 4022 nla_get_u8(attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); 4023 4024 if (attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) 4025 chandef->edmg.bw_config = 4026 nla_get_u8(attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); 4027 } else { 4028 chandef->edmg.bw_config = 0; 4029 chandef->edmg.channels = 0; 4030 } 4031 4032 if (attrs[NL80211_ATTR_PUNCT_BITMAP]) { 4033 chandef->punctured = 4034 nla_get_u32(attrs[NL80211_ATTR_PUNCT_BITMAP]); 4035 4036 if (chandef->punctured && 4037 !wiphy_ext_feature_isset(&rdev->wiphy, 4038 NL80211_EXT_FEATURE_PUNCT)) { 4039 NL_SET_ERR_MSG_ATTR(extack, 4040 attrs[NL80211_ATTR_WIPHY_FREQ], 4041 "driver doesn't support puncturing"); 4042 return -EINVAL; 4043 } 4044 } 4045 4046 if (attrs[NL80211_ATTR_NPCA_PRIMARY_FREQ]) { 4047 if (!permit_npca) { 4048 NL_SET_ERR_MSG_ATTR(extack, 4049 attrs[NL80211_ATTR_NPCA_PRIMARY_FREQ], 4050 "NPCA not supported"); 4051 return -EINVAL; 4052 } 4053 4054 chandef->npca_chan = 4055 ieee80211_get_channel(&rdev->wiphy, 4056 nla_get_u32(attrs[NL80211_ATTR_NPCA_PRIMARY_FREQ])); 4057 if (!chandef->npca_chan) { 4058 NL_SET_ERR_MSG_ATTR(extack, 4059 attrs[NL80211_ATTR_NPCA_PRIMARY_FREQ], 4060 "invalid NPCA primary channel"); 4061 return -EINVAL; 4062 } 4063 4064 chandef->npca_punctured = 4065 nla_get_u32_default(attrs[NL80211_ATTR_NPCA_PUNCT_BITMAP], 4066 chandef->punctured); 4067 } else if (attrs[NL80211_ATTR_NPCA_PUNCT_BITMAP]) { 4068 NL_SET_ERR_MSG_ATTR(extack, 4069 attrs[NL80211_ATTR_NPCA_PUNCT_BITMAP], 4070 "NPCA puncturing only valid with NPCA"); 4071 return -EINVAL; 4072 } 4073 4074 if (!cfg80211_chandef_valid(chandef)) { 4075 NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ], 4076 "invalid channel definition"); 4077 return -EINVAL; 4078 } 4079 4080 if (!_cfg80211_chandef_usable(&rdev->wiphy, chandef, 4081 IEEE80211_CHAN_DISABLED, 4082 monitor ? IEEE80211_CHAN_CAN_MONITOR : 0)) { 4083 NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ], 4084 "(extension) channel is disabled"); 4085 return -EINVAL; 4086 } 4087 4088 if ((chandef->width == NL80211_CHAN_WIDTH_5 || 4089 chandef->width == NL80211_CHAN_WIDTH_10) && 4090 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) { 4091 NL_SET_ERR_MSG(extack, "5/10 MHz not supported"); 4092 return -EINVAL; 4093 } 4094 4095 return 0; 4096 } 4097 4098 int nl80211_parse_chandef(struct cfg80211_registered_device *rdev, 4099 struct netlink_ext_ack *extack, 4100 struct nlattr **attrs, 4101 struct cfg80211_chan_def *chandef, 4102 bool permit_npca) 4103 { 4104 return _nl80211_parse_chandef(rdev, extack, attrs, false, chandef, 4105 permit_npca); 4106 } 4107 4108 static int __nl80211_set_channel(struct cfg80211_registered_device *rdev, 4109 struct net_device *dev, 4110 struct genl_info *info, 4111 int _link_id) 4112 { 4113 struct cfg80211_chan_def chandef; 4114 int result; 4115 enum nl80211_iftype iftype = NL80211_IFTYPE_MONITOR; 4116 struct wireless_dev *wdev = NULL; 4117 int link_id = _link_id; 4118 bool permit_npca; 4119 4120 if (dev) 4121 wdev = dev->ieee80211_ptr; 4122 if (!nl80211_can_set_dev_channel(wdev)) 4123 return -EOPNOTSUPP; 4124 if (wdev) 4125 iftype = wdev->iftype; 4126 4127 if (link_id < 0) { 4128 if (wdev && wdev->valid_links) 4129 return -EINVAL; 4130 link_id = 0; 4131 } 4132 4133 /* allow parsing it - will check on start_ap or below */ 4134 permit_npca = iftype == NL80211_IFTYPE_AP || 4135 iftype == NL80211_IFTYPE_P2P_GO; 4136 4137 result = _nl80211_parse_chandef(rdev, info->extack, info->attrs, 4138 iftype == NL80211_IFTYPE_MONITOR, 4139 &chandef, permit_npca); 4140 if (result) 4141 return result; 4142 4143 switch (iftype) { 4144 case NL80211_IFTYPE_AP: 4145 case NL80211_IFTYPE_P2P_GO: 4146 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, 4147 iftype)) 4148 return -EINVAL; 4149 if (wdev->links[link_id].ap.beacon_interval) { 4150 struct ieee80211_channel *cur_chan; 4151 4152 if (!dev || !rdev->ops->set_ap_chanwidth || 4153 !(rdev->wiphy.features & 4154 NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE)) 4155 return -EBUSY; 4156 4157 /* Only allow dynamic channel width changes */ 4158 cur_chan = wdev->links[link_id].ap.chandef.npca_chan; 4159 if (chandef.npca_chan != cur_chan) 4160 return -EBUSY; 4161 cur_chan = wdev->links[link_id].ap.chandef.chan; 4162 if (chandef.chan != cur_chan) 4163 return -EBUSY; 4164 4165 /* only allow this for regular channel widths */ 4166 switch (wdev->links[link_id].ap.chandef.width) { 4167 case NL80211_CHAN_WIDTH_20_NOHT: 4168 case NL80211_CHAN_WIDTH_20: 4169 case NL80211_CHAN_WIDTH_40: 4170 case NL80211_CHAN_WIDTH_80: 4171 case NL80211_CHAN_WIDTH_80P80: 4172 case NL80211_CHAN_WIDTH_160: 4173 case NL80211_CHAN_WIDTH_320: 4174 break; 4175 default: 4176 return -EINVAL; 4177 } 4178 4179 switch (chandef.width) { 4180 case NL80211_CHAN_WIDTH_20_NOHT: 4181 case NL80211_CHAN_WIDTH_20: 4182 case NL80211_CHAN_WIDTH_40: 4183 case NL80211_CHAN_WIDTH_80: 4184 case NL80211_CHAN_WIDTH_80P80: 4185 case NL80211_CHAN_WIDTH_160: 4186 case NL80211_CHAN_WIDTH_320: 4187 break; 4188 default: 4189 return -EINVAL; 4190 } 4191 4192 result = rdev_set_ap_chanwidth(rdev, dev, link_id, 4193 &chandef); 4194 if (result) 4195 return result; 4196 wdev->links[link_id].ap.chandef = chandef; 4197 } else { 4198 wdev->u.ap.preset_chandef = chandef; 4199 } 4200 return 0; 4201 case NL80211_IFTYPE_MESH_POINT: 4202 return cfg80211_set_mesh_channel(rdev, wdev, &chandef); 4203 case NL80211_IFTYPE_MONITOR: 4204 return cfg80211_set_monitor_channel(rdev, dev, &chandef); 4205 default: 4206 break; 4207 } 4208 4209 return -EINVAL; 4210 } 4211 4212 static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info) 4213 { 4214 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4215 int link_id = nl80211_link_id_or_invalid(info->attrs); 4216 struct net_device *netdev = info->user_ptr[1]; 4217 4218 return __nl80211_set_channel(rdev, netdev, info, link_id); 4219 } 4220 4221 static int nl80211_set_wiphy_radio(struct genl_info *info, 4222 struct cfg80211_registered_device *rdev, 4223 int radio_idx) 4224 { 4225 u32 rts_threshold = 0, old_rts, changed = 0; 4226 int result; 4227 4228 if (!rdev->ops->set_wiphy_params) 4229 return -EOPNOTSUPP; 4230 4231 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { 4232 rts_threshold = nla_get_u32( 4233 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); 4234 changed |= WIPHY_PARAM_RTS_THRESHOLD; 4235 } 4236 4237 old_rts = rdev->wiphy.radio_cfg[radio_idx].rts_threshold; 4238 4239 rdev->wiphy.radio_cfg[radio_idx].rts_threshold = rts_threshold; 4240 4241 result = rdev_set_wiphy_params(rdev, radio_idx, changed); 4242 if (result) 4243 rdev->wiphy.radio_cfg[radio_idx].rts_threshold = old_rts; 4244 4245 return 0; 4246 } 4247 4248 static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) 4249 { 4250 struct cfg80211_registered_device *rdev = NULL; 4251 struct net_device *netdev = NULL; 4252 struct wireless_dev *wdev; 4253 int result = 0, rem_txq_params = 0; 4254 struct nlattr *nl_txq_params; 4255 u32 changed; 4256 u8 retry_short = 0, retry_long = 0; 4257 u32 frag_threshold = 0, rts_threshold = 0; 4258 u8 coverage_class = 0; 4259 u32 txq_limit = 0, txq_memory_limit = 0, txq_quantum = 0; 4260 int radio_idx = -1; 4261 4262 rtnl_lock(); 4263 /* 4264 * Try to find the wiphy and netdev. Normally this 4265 * function shouldn't need the netdev, but this is 4266 * done for backward compatibility -- previously 4267 * setting the channel was done per wiphy, but now 4268 * it is per netdev. Previous userland like hostapd 4269 * also passed a netdev to set_wiphy, so that it is 4270 * possible to let that go to the right netdev! 4271 */ 4272 4273 if (info->attrs[NL80211_ATTR_IFINDEX]) { 4274 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); 4275 4276 netdev = __dev_get_by_index(genl_info_net(info), ifindex); 4277 if (netdev && netdev->ieee80211_ptr) 4278 rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy); 4279 else 4280 netdev = NULL; 4281 } 4282 4283 if (!netdev) { 4284 rdev = __cfg80211_rdev_from_attrs(genl_info_net(info), 4285 info->attrs); 4286 if (IS_ERR(rdev)) { 4287 rtnl_unlock(); 4288 return PTR_ERR(rdev); 4289 } 4290 wdev = NULL; 4291 netdev = NULL; 4292 result = 0; 4293 } else 4294 wdev = netdev->ieee80211_ptr; 4295 4296 guard(wiphy)(&rdev->wiphy); 4297 4298 /* 4299 * end workaround code, by now the rdev is available 4300 * and locked, and wdev may or may not be NULL. 4301 */ 4302 4303 if (info->attrs[NL80211_ATTR_WIPHY_NAME]) 4304 result = cfg80211_dev_rename( 4305 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME])); 4306 rtnl_unlock(); 4307 4308 if (result) 4309 return result; 4310 4311 if (info->attrs[NL80211_ATTR_WIPHY_RADIO_INDEX]) { 4312 /* Radio idx is not expected for non-multi radio wiphy */ 4313 if (rdev->wiphy.n_radio <= 0) 4314 return -EINVAL; 4315 4316 radio_idx = nla_get_u8( 4317 info->attrs[NL80211_ATTR_WIPHY_RADIO_INDEX]); 4318 if (radio_idx >= rdev->wiphy.n_radio) 4319 return -EINVAL; 4320 4321 return nl80211_set_wiphy_radio(info, rdev, radio_idx); 4322 } 4323 4324 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) { 4325 struct ieee80211_txq_params txq_params; 4326 struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1]; 4327 4328 if (!rdev->ops->set_txq_params) 4329 return -EOPNOTSUPP; 4330 4331 if (!netdev) 4332 return -EINVAL; 4333 4334 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 4335 netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4336 return -EINVAL; 4337 4338 if (!netif_running(netdev)) 4339 return -ENETDOWN; 4340 4341 nla_for_each_nested(nl_txq_params, 4342 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], 4343 rem_txq_params) { 4344 result = nla_parse_nested_deprecated(tb, 4345 NL80211_TXQ_ATTR_MAX, 4346 nl_txq_params, 4347 txq_params_policy, 4348 info->extack); 4349 if (result) 4350 return result; 4351 4352 result = parse_txq_params(tb, &txq_params); 4353 if (result) 4354 return result; 4355 4356 txq_params.link_id = 4357 nl80211_link_id_or_invalid(info->attrs); 4358 4359 if (txq_params.link_id >= 0 && 4360 !(netdev->ieee80211_ptr->valid_links & 4361 BIT(txq_params.link_id))) 4362 result = -ENOLINK; 4363 else if (txq_params.link_id >= 0 && 4364 !netdev->ieee80211_ptr->valid_links) 4365 result = -EINVAL; 4366 else 4367 result = rdev_set_txq_params(rdev, netdev, 4368 &txq_params); 4369 if (result) 4370 return result; 4371 } 4372 } 4373 4374 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 4375 int link_id = nl80211_link_id_or_invalid(info->attrs); 4376 4377 if (wdev) { 4378 result = __nl80211_set_channel( 4379 rdev, 4380 nl80211_can_set_dev_channel(wdev) ? netdev : NULL, 4381 info, link_id); 4382 } else { 4383 result = __nl80211_set_channel(rdev, netdev, info, link_id); 4384 } 4385 4386 if (result) 4387 return result; 4388 } 4389 4390 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) { 4391 struct wireless_dev *txp_wdev = wdev; 4392 enum nl80211_tx_power_setting type; 4393 int idx, mbm = 0; 4394 4395 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER)) 4396 txp_wdev = NULL; 4397 4398 if (!rdev->ops->set_tx_power) 4399 return -EOPNOTSUPP; 4400 4401 idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING; 4402 type = nla_get_u32(info->attrs[idx]); 4403 4404 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] && 4405 (type != NL80211_TX_POWER_AUTOMATIC)) 4406 return -EINVAL; 4407 4408 if (type != NL80211_TX_POWER_AUTOMATIC) { 4409 idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL; 4410 mbm = nla_get_u32(info->attrs[idx]); 4411 } 4412 4413 result = rdev_set_tx_power(rdev, txp_wdev, radio_idx, type, 4414 mbm); 4415 if (result) 4416 return result; 4417 } 4418 4419 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && 4420 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { 4421 u32 tx_ant, rx_ant; 4422 4423 if ((!rdev->wiphy.available_antennas_tx && 4424 !rdev->wiphy.available_antennas_rx) || 4425 !rdev->ops->set_antenna) 4426 return -EOPNOTSUPP; 4427 4428 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]); 4429 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]); 4430 4431 /* reject antenna configurations which don't match the 4432 * available antenna masks, except for the "all" mask */ 4433 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) || 4434 (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) 4435 return -EINVAL; 4436 4437 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx; 4438 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx; 4439 4440 result = rdev_set_antenna(rdev, radio_idx, tx_ant, rx_ant); 4441 if (result) 4442 return result; 4443 } 4444 4445 changed = 0; 4446 4447 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) { 4448 retry_short = nla_get_u8( 4449 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]); 4450 4451 changed |= WIPHY_PARAM_RETRY_SHORT; 4452 } 4453 4454 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) { 4455 retry_long = nla_get_u8( 4456 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]); 4457 4458 changed |= WIPHY_PARAM_RETRY_LONG; 4459 } 4460 4461 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) { 4462 frag_threshold = nla_get_u32( 4463 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]); 4464 if (frag_threshold < 256) 4465 return -EINVAL; 4466 4467 if (frag_threshold != (u32) -1) { 4468 /* 4469 * Fragments (apart from the last one) are required to 4470 * have even length. Make the fragmentation code 4471 * simpler by stripping LSB should someone try to use 4472 * odd threshold value. 4473 */ 4474 frag_threshold &= ~0x1; 4475 } 4476 changed |= WIPHY_PARAM_FRAG_THRESHOLD; 4477 } 4478 4479 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { 4480 rts_threshold = nla_get_u32( 4481 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); 4482 changed |= WIPHY_PARAM_RTS_THRESHOLD; 4483 } 4484 4485 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) { 4486 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) 4487 return -EINVAL; 4488 4489 coverage_class = nla_get_u8( 4490 info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]); 4491 changed |= WIPHY_PARAM_COVERAGE_CLASS; 4492 } 4493 4494 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { 4495 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION)) 4496 return -EOPNOTSUPP; 4497 4498 changed |= WIPHY_PARAM_DYN_ACK; 4499 } 4500 4501 if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) { 4502 if (!wiphy_ext_feature_isset(&rdev->wiphy, 4503 NL80211_EXT_FEATURE_TXQS)) 4504 return -EOPNOTSUPP; 4505 4506 txq_limit = nla_get_u32( 4507 info->attrs[NL80211_ATTR_TXQ_LIMIT]); 4508 changed |= WIPHY_PARAM_TXQ_LIMIT; 4509 } 4510 4511 if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) { 4512 if (!wiphy_ext_feature_isset(&rdev->wiphy, 4513 NL80211_EXT_FEATURE_TXQS)) 4514 return -EOPNOTSUPP; 4515 4516 txq_memory_limit = nla_get_u32( 4517 info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]); 4518 changed |= WIPHY_PARAM_TXQ_MEMORY_LIMIT; 4519 } 4520 4521 if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) { 4522 if (!wiphy_ext_feature_isset(&rdev->wiphy, 4523 NL80211_EXT_FEATURE_TXQS)) 4524 return -EOPNOTSUPP; 4525 4526 txq_quantum = nla_get_u32( 4527 info->attrs[NL80211_ATTR_TXQ_QUANTUM]); 4528 changed |= WIPHY_PARAM_TXQ_QUANTUM; 4529 } 4530 4531 if (changed) { 4532 u8 old_retry_short, old_retry_long; 4533 u32 old_frag_threshold, old_rts_threshold; 4534 u8 old_coverage_class, i; 4535 u32 old_txq_limit, old_txq_memory_limit, old_txq_quantum; 4536 u32 *old_radio_rts_threshold = NULL; 4537 4538 if (!rdev->ops->set_wiphy_params) 4539 return -EOPNOTSUPP; 4540 4541 if (rdev->wiphy.n_radio) { 4542 old_radio_rts_threshold = kcalloc(rdev->wiphy.n_radio, 4543 sizeof(u32), 4544 GFP_KERNEL); 4545 if (!old_radio_rts_threshold) 4546 return -ENOMEM; 4547 } 4548 4549 old_retry_short = rdev->wiphy.retry_short; 4550 old_retry_long = rdev->wiphy.retry_long; 4551 old_frag_threshold = rdev->wiphy.frag_threshold; 4552 old_rts_threshold = rdev->wiphy.rts_threshold; 4553 if (old_radio_rts_threshold) { 4554 for (i = 0 ; i < rdev->wiphy.n_radio; i++) 4555 old_radio_rts_threshold[i] = 4556 rdev->wiphy.radio_cfg[i].rts_threshold; 4557 } 4558 old_coverage_class = rdev->wiphy.coverage_class; 4559 old_txq_limit = rdev->wiphy.txq_limit; 4560 old_txq_memory_limit = rdev->wiphy.txq_memory_limit; 4561 old_txq_quantum = rdev->wiphy.txq_quantum; 4562 4563 if (changed & WIPHY_PARAM_RETRY_SHORT) 4564 rdev->wiphy.retry_short = retry_short; 4565 if (changed & WIPHY_PARAM_RETRY_LONG) 4566 rdev->wiphy.retry_long = retry_long; 4567 if (changed & WIPHY_PARAM_FRAG_THRESHOLD) 4568 rdev->wiphy.frag_threshold = frag_threshold; 4569 if ((changed & WIPHY_PARAM_RTS_THRESHOLD) && 4570 old_radio_rts_threshold) { 4571 rdev->wiphy.rts_threshold = rts_threshold; 4572 for (i = 0 ; i < rdev->wiphy.n_radio; i++) 4573 rdev->wiphy.radio_cfg[i].rts_threshold = 4574 rdev->wiphy.rts_threshold; 4575 } 4576 if (changed & WIPHY_PARAM_COVERAGE_CLASS) 4577 rdev->wiphy.coverage_class = coverage_class; 4578 if (changed & WIPHY_PARAM_TXQ_LIMIT) 4579 rdev->wiphy.txq_limit = txq_limit; 4580 if (changed & WIPHY_PARAM_TXQ_MEMORY_LIMIT) 4581 rdev->wiphy.txq_memory_limit = txq_memory_limit; 4582 if (changed & WIPHY_PARAM_TXQ_QUANTUM) 4583 rdev->wiphy.txq_quantum = txq_quantum; 4584 4585 result = rdev_set_wiphy_params(rdev, radio_idx, changed); 4586 if (result) { 4587 rdev->wiphy.retry_short = old_retry_short; 4588 rdev->wiphy.retry_long = old_retry_long; 4589 rdev->wiphy.frag_threshold = old_frag_threshold; 4590 rdev->wiphy.rts_threshold = old_rts_threshold; 4591 if (old_radio_rts_threshold) { 4592 for (i = 0 ; i < rdev->wiphy.n_radio; i++) 4593 rdev->wiphy.radio_cfg[i].rts_threshold = 4594 old_radio_rts_threshold[i]; 4595 } 4596 rdev->wiphy.coverage_class = old_coverage_class; 4597 rdev->wiphy.txq_limit = old_txq_limit; 4598 rdev->wiphy.txq_memory_limit = old_txq_memory_limit; 4599 rdev->wiphy.txq_quantum = old_txq_quantum; 4600 } 4601 4602 kfree(old_radio_rts_threshold); 4603 return result; 4604 } 4605 4606 return 0; 4607 } 4608 4609 int nl80211_send_chandef(struct sk_buff *msg, const struct cfg80211_chan_def *chandef) 4610 { 4611 if (WARN_ON(!cfg80211_chandef_valid(chandef))) 4612 return -EINVAL; 4613 4614 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, 4615 chandef->chan->center_freq)) 4616 return -ENOBUFS; 4617 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, 4618 chandef->chan->freq_offset)) 4619 return -ENOBUFS; 4620 switch (chandef->width) { 4621 case NL80211_CHAN_WIDTH_20_NOHT: 4622 case NL80211_CHAN_WIDTH_20: 4623 case NL80211_CHAN_WIDTH_40: 4624 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 4625 cfg80211_get_chandef_type(chandef))) 4626 return -ENOBUFS; 4627 break; 4628 default: 4629 break; 4630 } 4631 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width)) 4632 return -ENOBUFS; 4633 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1)) 4634 return -ENOBUFS; 4635 if (chandef->center_freq2 && 4636 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2)) 4637 return -ENOBUFS; 4638 if (chandef->punctured && 4639 nla_put_u32(msg, NL80211_ATTR_PUNCT_BITMAP, chandef->punctured)) 4640 return -ENOBUFS; 4641 if (chandef->s1g_primary_2mhz && 4642 nla_put_flag(msg, NL80211_ATTR_S1G_PRIMARY_2MHZ)) 4643 return -ENOBUFS; 4644 4645 if (chandef->npca_chan && 4646 nla_put_u32(msg, NL80211_ATTR_NPCA_PRIMARY_FREQ, 4647 chandef->npca_chan->center_freq)) 4648 return -ENOBUFS; 4649 if (chandef->npca_punctured && 4650 nla_put_u32(msg, NL80211_ATTR_NPCA_PUNCT_BITMAP, 4651 chandef->npca_punctured)) 4652 return -ENOBUFS; 4653 4654 return 0; 4655 } 4656 EXPORT_SYMBOL(nl80211_send_chandef); 4657 4658 static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags, 4659 struct cfg80211_registered_device *rdev, 4660 struct wireless_dev *wdev, 4661 enum nl80211_commands cmd) 4662 { 4663 struct net_device *dev = wdev->netdev; 4664 void *hdr; 4665 4666 lockdep_assert_wiphy(&rdev->wiphy); 4667 4668 WARN_ON(cmd != NL80211_CMD_NEW_INTERFACE && 4669 cmd != NL80211_CMD_DEL_INTERFACE && 4670 cmd != NL80211_CMD_SET_INTERFACE); 4671 4672 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 4673 if (!hdr) 4674 return -1; 4675 4676 if (dev && 4677 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 4678 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name))) 4679 goto nla_put_failure; 4680 4681 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 4682 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || 4683 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 4684 NL80211_ATTR_PAD) || 4685 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, wdev_address(wdev)) || 4686 nla_put_u32(msg, NL80211_ATTR_GENERATION, 4687 rdev->devlist_generation ^ 4688 (cfg80211_rdev_list_generation << 2)) || 4689 nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr) || 4690 nla_put_u32(msg, NL80211_ATTR_VIF_RADIO_MASK, wdev->radio_mask)) 4691 goto nla_put_failure; 4692 4693 if (rdev->ops->get_channel && !wdev->valid_links) { 4694 struct cfg80211_chan_def chandef = {}; 4695 int ret; 4696 4697 ret = rdev_get_channel(rdev, wdev, 0, &chandef); 4698 if (ret == 0 && nl80211_send_chandef(msg, &chandef)) 4699 goto nla_put_failure; 4700 } 4701 4702 if (rdev->ops->get_tx_power && !wdev->valid_links) { 4703 int dbm, ret; 4704 4705 ret = rdev_get_tx_power(rdev, wdev, -1, 0, &dbm); 4706 if (ret == 0 && 4707 nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL, 4708 DBM_TO_MBM(dbm))) 4709 goto nla_put_failure; 4710 } 4711 4712 switch (wdev->iftype) { 4713 case NL80211_IFTYPE_AP: 4714 case NL80211_IFTYPE_P2P_GO: 4715 if (wdev->u.ap.ssid_len && 4716 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len, 4717 wdev->u.ap.ssid)) 4718 goto nla_put_failure; 4719 break; 4720 case NL80211_IFTYPE_STATION: 4721 case NL80211_IFTYPE_P2P_CLIENT: 4722 if (wdev->u.client.ssid_len && 4723 nla_put(msg, NL80211_ATTR_SSID, wdev->u.client.ssid_len, 4724 wdev->u.client.ssid)) 4725 goto nla_put_failure; 4726 break; 4727 case NL80211_IFTYPE_ADHOC: 4728 if (wdev->u.ibss.ssid_len && 4729 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ibss.ssid_len, 4730 wdev->u.ibss.ssid)) 4731 goto nla_put_failure; 4732 break; 4733 default: 4734 /* nothing */ 4735 break; 4736 } 4737 4738 if (rdev->ops->get_txq_stats) { 4739 struct cfg80211_txq_stats txqstats = {}; 4740 int ret = rdev_get_txq_stats(rdev, wdev, &txqstats); 4741 4742 if (ret == 0 && 4743 !nl80211_put_txq_stats(msg, &txqstats, 4744 NL80211_ATTR_TXQ_STATS)) 4745 goto nla_put_failure; 4746 } 4747 4748 if (wdev->valid_links) { 4749 unsigned int link_id; 4750 struct nlattr *links = nla_nest_start(msg, 4751 NL80211_ATTR_MLO_LINKS); 4752 4753 if (!links) 4754 goto nla_put_failure; 4755 4756 for_each_valid_link(wdev, link_id) { 4757 struct nlattr *link = nla_nest_start(msg, link_id + 1); 4758 struct cfg80211_chan_def chandef = {}; 4759 int ret; 4760 4761 if (!link) 4762 goto nla_put_failure; 4763 4764 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 4765 goto nla_put_failure; 4766 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 4767 wdev->links[link_id].addr)) 4768 goto nla_put_failure; 4769 4770 ret = rdev_get_channel(rdev, wdev, link_id, &chandef); 4771 if (ret == 0 && nl80211_send_chandef(msg, &chandef)) 4772 goto nla_put_failure; 4773 4774 if (rdev->ops->get_tx_power) { 4775 int dbm, ret; 4776 4777 ret = rdev_get_tx_power(rdev, wdev, -1, link_id, &dbm); 4778 if (ret == 0 && 4779 nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL, 4780 DBM_TO_MBM(dbm))) 4781 goto nla_put_failure; 4782 } 4783 nla_nest_end(msg, link); 4784 } 4785 4786 nla_nest_end(msg, links); 4787 } 4788 4789 genlmsg_end(msg, hdr); 4790 return 0; 4791 4792 nla_put_failure: 4793 genlmsg_cancel(msg, hdr); 4794 return -EMSGSIZE; 4795 } 4796 4797 static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb) 4798 { 4799 int wp_idx = 0; 4800 int if_idx = 0; 4801 int wp_start = cb->args[0]; 4802 int if_start = cb->args[1]; 4803 int filter_wiphy = -1; 4804 struct cfg80211_registered_device *rdev; 4805 struct wireless_dev *wdev; 4806 int ret; 4807 4808 rtnl_lock(); 4809 if (!cb->args[2]) { 4810 struct nl80211_dump_wiphy_state state = { 4811 .filter_wiphy = -1, 4812 }; 4813 4814 ret = nl80211_dump_wiphy_parse(skb, cb, &state); 4815 if (ret) 4816 goto out_unlock; 4817 4818 filter_wiphy = state.filter_wiphy; 4819 4820 /* 4821 * if filtering, set cb->args[2] to +1 since 0 is the default 4822 * value needed to determine that parsing is necessary. 4823 */ 4824 if (filter_wiphy >= 0) 4825 cb->args[2] = filter_wiphy + 1; 4826 else 4827 cb->args[2] = -1; 4828 } else if (cb->args[2] > 0) { 4829 filter_wiphy = cb->args[2] - 1; 4830 } 4831 4832 for_each_rdev(rdev) { 4833 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) 4834 continue; 4835 if (wp_idx < wp_start) { 4836 wp_idx++; 4837 continue; 4838 } 4839 4840 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx) 4841 continue; 4842 4843 if_idx = 0; 4844 4845 guard(wiphy)(&rdev->wiphy); 4846 4847 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 4848 if (if_idx < if_start) { 4849 if_idx++; 4850 continue; 4851 } 4852 4853 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, 4854 cb->nlh->nlmsg_seq, NLM_F_MULTI, 4855 rdev, wdev, 4856 NL80211_CMD_NEW_INTERFACE) < 0) 4857 goto out; 4858 4859 if_idx++; 4860 } 4861 4862 if_start = 0; 4863 wp_idx++; 4864 } 4865 out: 4866 cb->args[0] = wp_idx; 4867 cb->args[1] = if_idx; 4868 4869 ret = skb->len; 4870 out_unlock: 4871 rtnl_unlock(); 4872 4873 return ret; 4874 } 4875 4876 static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info) 4877 { 4878 struct sk_buff *msg; 4879 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4880 struct wireless_dev *wdev = info->user_ptr[1]; 4881 4882 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 4883 if (!msg) 4884 return -ENOMEM; 4885 4886 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, 4887 rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) { 4888 nlmsg_free(msg); 4889 return -ENOBUFS; 4890 } 4891 4892 return genlmsg_reply(msg, info); 4893 } 4894 4895 static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = { 4896 [NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG }, 4897 [NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG }, 4898 [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG }, 4899 [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG }, 4900 [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG }, 4901 [NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG }, 4902 [NL80211_MNTR_FLAG_SKIP_TX] = { .type = NLA_FLAG }, 4903 }; 4904 4905 static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags) 4906 { 4907 struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1]; 4908 int flag; 4909 4910 *mntrflags = 0; 4911 4912 if (!nla) 4913 return -EINVAL; 4914 4915 if (nla_parse_nested_deprecated(flags, NL80211_MNTR_FLAG_MAX, nla, mntr_flags_policy, NULL)) 4916 return -EINVAL; 4917 4918 for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++) 4919 if (flags[flag]) 4920 *mntrflags |= (1<<flag); 4921 4922 /* cooked monitor mode is incompatible with other modes */ 4923 if (*mntrflags & MONITOR_FLAG_COOK_FRAMES && 4924 *mntrflags != MONITOR_FLAG_COOK_FRAMES) 4925 return -EOPNOTSUPP; 4926 4927 *mntrflags |= MONITOR_FLAG_CHANGED; 4928 4929 return 0; 4930 } 4931 4932 static int nl80211_parse_mon_options(struct cfg80211_registered_device *rdev, 4933 enum nl80211_iftype type, 4934 struct genl_info *info, 4935 struct vif_params *params) 4936 { 4937 bool change = false; 4938 int err; 4939 4940 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { 4941 if (type != NL80211_IFTYPE_MONITOR) 4942 return -EINVAL; 4943 4944 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], 4945 ¶ms->flags); 4946 if (err) 4947 return err; 4948 4949 change = true; 4950 } 4951 4952 /* MONITOR_FLAG_COOK_FRAMES is deprecated, refuse cooperation */ 4953 if (params->flags & MONITOR_FLAG_COOK_FRAMES) 4954 return -EOPNOTSUPP; 4955 4956 if (params->flags & MONITOR_FLAG_ACTIVE && 4957 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) 4958 return -EOPNOTSUPP; 4959 4960 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) { 4961 const u8 *mumimo_groups; 4962 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER; 4963 4964 if (type != NL80211_IFTYPE_MONITOR) 4965 return -EINVAL; 4966 4967 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) 4968 return -EOPNOTSUPP; 4969 4970 mumimo_groups = 4971 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); 4972 4973 /* bits 0 and 63 are reserved and must be zero */ 4974 if ((mumimo_groups[0] & BIT(0)) || 4975 (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7))) 4976 return -EINVAL; 4977 4978 params->vht_mumimo_groups = mumimo_groups; 4979 change = true; 4980 } 4981 4982 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) { 4983 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER; 4984 4985 if (type != NL80211_IFTYPE_MONITOR) 4986 return -EINVAL; 4987 4988 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) 4989 return -EOPNOTSUPP; 4990 4991 params->vht_mumimo_follow_addr = 4992 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]); 4993 change = true; 4994 } 4995 4996 return change ? 1 : 0; 4997 } 4998 4999 static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev, 5000 struct net_device *netdev, u8 use_4addr, 5001 enum nl80211_iftype iftype) 5002 { 5003 if (!use_4addr) { 5004 if (netdev && netif_is_bridge_port(netdev)) 5005 return -EBUSY; 5006 return 0; 5007 } 5008 5009 switch (iftype) { 5010 case NL80211_IFTYPE_AP_VLAN: 5011 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP) 5012 return 0; 5013 break; 5014 case NL80211_IFTYPE_STATION: 5015 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION) 5016 return 0; 5017 break; 5018 default: 5019 break; 5020 } 5021 5022 return -EOPNOTSUPP; 5023 } 5024 5025 static int nl80211_parse_vif_radio_mask(struct genl_info *info, 5026 u32 *radio_mask) 5027 { 5028 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5029 struct nlattr *attr = info->attrs[NL80211_ATTR_VIF_RADIO_MASK]; 5030 u32 mask, allowed; 5031 5032 if (!attr) { 5033 *radio_mask = 0; 5034 return 0; 5035 } 5036 5037 allowed = BIT(rdev->wiphy.n_radio) - 1; 5038 mask = nla_get_u32(attr); 5039 if (mask & ~allowed) 5040 return -EINVAL; 5041 if (!mask) 5042 mask = allowed; 5043 *radio_mask = mask; 5044 5045 return 1; 5046 } 5047 5048 static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info) 5049 { 5050 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5051 struct vif_params params; 5052 int err; 5053 enum nl80211_iftype otype, ntype; 5054 struct net_device *dev = info->user_ptr[1]; 5055 struct wireless_dev *wdev = dev->ieee80211_ptr; 5056 u32 radio_mask = 0; 5057 bool change = false; 5058 5059 memset(¶ms, 0, sizeof(params)); 5060 5061 otype = ntype = dev->ieee80211_ptr->iftype; 5062 5063 if (info->attrs[NL80211_ATTR_IFTYPE]) { 5064 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); 5065 if (otype != ntype) 5066 change = true; 5067 } 5068 5069 if (info->attrs[NL80211_ATTR_MESH_ID]) { 5070 if (ntype != NL80211_IFTYPE_MESH_POINT) 5071 return -EINVAL; 5072 if (otype != NL80211_IFTYPE_MESH_POINT) 5073 return -EINVAL; 5074 if (netif_running(dev)) 5075 return -EBUSY; 5076 5077 wdev->u.mesh.id_up_len = 5078 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 5079 memcpy(wdev->u.mesh.id, 5080 nla_data(info->attrs[NL80211_ATTR_MESH_ID]), 5081 wdev->u.mesh.id_up_len); 5082 } 5083 5084 if (info->attrs[NL80211_ATTR_4ADDR]) { 5085 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); 5086 change = true; 5087 err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype); 5088 if (err) 5089 return err; 5090 } else { 5091 params.use_4addr = -1; 5092 } 5093 5094 err = nl80211_parse_mon_options(rdev, ntype, info, ¶ms); 5095 if (err < 0) 5096 return err; 5097 if (err > 0) 5098 change = true; 5099 5100 err = nl80211_parse_vif_radio_mask(info, &radio_mask); 5101 if (err < 0) 5102 return err; 5103 if (err && netif_running(dev)) 5104 return -EBUSY; 5105 5106 if (change) 5107 err = cfg80211_change_iface(rdev, dev, ntype, ¶ms); 5108 else 5109 err = 0; 5110 5111 if (!err && params.use_4addr != -1) 5112 dev->ieee80211_ptr->use_4addr = params.use_4addr; 5113 5114 if (radio_mask) 5115 wdev->radio_mask = radio_mask; 5116 5117 if (change && !err) 5118 nl80211_notify_iface(rdev, wdev, NL80211_CMD_SET_INTERFACE); 5119 5120 return err; 5121 } 5122 5123 static int _nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) 5124 { 5125 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5126 struct vif_params params; 5127 struct wireless_dev *wdev; 5128 struct sk_buff *msg; 5129 u32 radio_mask; 5130 int err; 5131 enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED; 5132 5133 memset(¶ms, 0, sizeof(params)); 5134 5135 if (!info->attrs[NL80211_ATTR_IFNAME]) 5136 return -EINVAL; 5137 5138 if (info->attrs[NL80211_ATTR_IFTYPE]) 5139 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); 5140 5141 if (!rdev->ops->add_virtual_intf) 5142 return -EOPNOTSUPP; 5143 5144 if ((type == NL80211_IFTYPE_P2P_DEVICE || type == NL80211_IFTYPE_NAN || 5145 type == NL80211_IFTYPE_PD || 5146 rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) && 5147 info->attrs[NL80211_ATTR_MAC]) { 5148 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], 5149 ETH_ALEN); 5150 if (!is_valid_ether_addr(params.macaddr)) 5151 return -EADDRNOTAVAIL; 5152 } 5153 5154 if (info->attrs[NL80211_ATTR_4ADDR]) { 5155 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); 5156 err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type); 5157 if (err) 5158 return err; 5159 } 5160 5161 if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0)) 5162 return -EOPNOTSUPP; 5163 5164 err = nl80211_parse_mon_options(rdev, type, info, ¶ms); 5165 if (err < 0) 5166 return err; 5167 5168 err = nl80211_parse_vif_radio_mask(info, &radio_mask); 5169 if (err < 0) 5170 return err; 5171 5172 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 5173 if (!msg) 5174 return -ENOMEM; 5175 5176 wdev = rdev_add_virtual_intf(rdev, 5177 nla_data(info->attrs[NL80211_ATTR_IFNAME]), 5178 NET_NAME_USER, type, ¶ms); 5179 if (WARN_ON(!wdev)) { 5180 nlmsg_free(msg); 5181 return -EPROTO; 5182 } else if (IS_ERR(wdev)) { 5183 nlmsg_free(msg); 5184 return PTR_ERR(wdev); 5185 } 5186 5187 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 5188 wdev->owner_nlportid = info->snd_portid; 5189 5190 switch (type) { 5191 case NL80211_IFTYPE_MESH_POINT: 5192 if (!info->attrs[NL80211_ATTR_MESH_ID]) 5193 break; 5194 wdev->u.mesh.id_up_len = 5195 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 5196 memcpy(wdev->u.mesh.id, 5197 nla_data(info->attrs[NL80211_ATTR_MESH_ID]), 5198 wdev->u.mesh.id_up_len); 5199 break; 5200 case NL80211_IFTYPE_NAN: 5201 case NL80211_IFTYPE_P2P_DEVICE: 5202 case NL80211_IFTYPE_PD: 5203 /* 5204 * P2P Device, NAN and PD do not have a netdev, so don't go 5205 * through the netdev notifier and must be added here 5206 */ 5207 cfg80211_init_wdev(wdev); 5208 cfg80211_register_wdev(rdev, wdev); 5209 break; 5210 default: 5211 break; 5212 } 5213 5214 if (radio_mask) 5215 wdev->radio_mask = radio_mask; 5216 5217 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, 5218 rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) { 5219 nlmsg_free(msg); 5220 return -ENOBUFS; 5221 } 5222 5223 return genlmsg_reply(msg, info); 5224 } 5225 5226 static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) 5227 { 5228 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5229 5230 /* to avoid failing a new interface creation due to pending removal */ 5231 cfg80211_destroy_ifaces(rdev); 5232 5233 guard(wiphy)(&rdev->wiphy); 5234 5235 return _nl80211_new_interface(skb, info); 5236 } 5237 5238 static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info) 5239 { 5240 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5241 struct wireless_dev *wdev = info->user_ptr[1]; 5242 5243 if (!rdev->ops->del_virtual_intf) 5244 return -EOPNOTSUPP; 5245 5246 /* 5247 * We hold RTNL, so this is safe, without RTNL opencount cannot 5248 * reach 0, and thus the rdev cannot be deleted. 5249 * 5250 * We need to do it for the dev_close(), since that will call 5251 * the netdev notifiers, and we need to acquire the mutex there 5252 * but don't know if we get there from here or from some other 5253 * place (e.g. "ip link set ... down"). 5254 */ 5255 mutex_unlock(&rdev->wiphy.mtx); 5256 5257 /* 5258 * If we remove a wireless device without a netdev then clear 5259 * user_ptr[1] so that nl80211_post_doit won't dereference it 5260 * to check if it needs to do dev_put(). Otherwise it crashes 5261 * since the wdev has been freed, unlike with a netdev where 5262 * we need the dev_put() for the netdev to really be freed. 5263 */ 5264 if (!wdev->netdev) 5265 info->user_ptr[1] = NULL; 5266 else 5267 dev_close(wdev->netdev); 5268 5269 cfg80211_close_dependents(rdev, wdev); 5270 5271 mutex_lock(&rdev->wiphy.mtx); 5272 5273 return cfg80211_remove_virtual_intf(rdev, wdev); 5274 } 5275 5276 static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info) 5277 { 5278 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5279 struct net_device *dev = info->user_ptr[1]; 5280 u16 noack_map; 5281 5282 if (!info->attrs[NL80211_ATTR_NOACK_MAP]) 5283 return -EINVAL; 5284 5285 if (!rdev->ops->set_noack_map) 5286 return -EOPNOTSUPP; 5287 5288 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]); 5289 5290 return rdev_set_noack_map(rdev, dev, noack_map); 5291 } 5292 5293 static int nl80211_validate_key_link_id(struct genl_info *info, 5294 struct wireless_dev *wdev, 5295 int link_id, bool pairwise) 5296 { 5297 if (pairwise) { 5298 if (link_id != -1) { 5299 GENL_SET_ERR_MSG(info, 5300 "link ID not allowed for pairwise key"); 5301 return -EINVAL; 5302 } 5303 5304 return 0; 5305 } 5306 5307 if (wdev->valid_links) { 5308 if (link_id == -1) { 5309 GENL_SET_ERR_MSG(info, 5310 "link ID must be set for MLO group key"); 5311 return -EINVAL; 5312 } 5313 if (!(wdev->valid_links & BIT(link_id))) { 5314 GENL_SET_ERR_MSG(info, "invalid link ID for MLO group key"); 5315 return -EINVAL; 5316 } 5317 } else if (link_id != -1) { 5318 GENL_SET_ERR_MSG(info, "link ID not allowed for non-MLO group key"); 5319 return -EINVAL; 5320 } 5321 5322 return 0; 5323 } 5324 5325 struct get_key_cookie { 5326 struct sk_buff *msg; 5327 int error; 5328 int idx; 5329 }; 5330 5331 static void get_key_callback(void *c, struct key_params *params) 5332 { 5333 struct nlattr *key; 5334 struct get_key_cookie *cookie = c; 5335 5336 if ((params->seq && 5337 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ, 5338 params->seq_len, params->seq)) || 5339 (params->cipher && 5340 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER, 5341 params->cipher))) 5342 goto nla_put_failure; 5343 5344 key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY); 5345 if (!key) 5346 goto nla_put_failure; 5347 5348 if ((params->seq && 5349 nla_put(cookie->msg, NL80211_KEY_SEQ, 5350 params->seq_len, params->seq)) || 5351 (params->cipher && 5352 nla_put_u32(cookie->msg, NL80211_KEY_CIPHER, 5353 params->cipher))) 5354 goto nla_put_failure; 5355 5356 if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx)) 5357 goto nla_put_failure; 5358 5359 nla_nest_end(cookie->msg, key); 5360 5361 return; 5362 nla_put_failure: 5363 cookie->error = 1; 5364 } 5365 5366 static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) 5367 { 5368 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5369 int err; 5370 struct wireless_dev *wdev = info->user_ptr[1]; 5371 u8 key_idx = 0; 5372 const u8 *mac_addr = NULL; 5373 bool pairwise; 5374 struct get_key_cookie cookie = { 5375 .error = 0, 5376 }; 5377 void *hdr; 5378 struct sk_buff *msg; 5379 bool bigtk_support = false; 5380 int link_id = nl80211_link_id_or_invalid(info->attrs); 5381 5382 if (wiphy_ext_feature_isset(&rdev->wiphy, 5383 NL80211_EXT_FEATURE_BEACON_PROTECTION)) 5384 bigtk_support = true; 5385 5386 if ((wdev->iftype == NL80211_IFTYPE_STATION || 5387 wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) && 5388 wiphy_ext_feature_isset(&rdev->wiphy, 5389 NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT)) 5390 bigtk_support = true; 5391 5392 if (info->attrs[NL80211_ATTR_KEY_IDX]) { 5393 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); 5394 5395 if (key_idx >= 6 && key_idx <= 7 && !bigtk_support) { 5396 GENL_SET_ERR_MSG(info, "BIGTK not supported"); 5397 return -EINVAL; 5398 } 5399 } 5400 5401 if (info->attrs[NL80211_ATTR_MAC]) 5402 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5403 5404 pairwise = !!mac_addr; 5405 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { 5406 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); 5407 5408 if (kt != NL80211_KEYTYPE_GROUP && 5409 kt != NL80211_KEYTYPE_PAIRWISE) 5410 return -EINVAL; 5411 pairwise = kt == NL80211_KEYTYPE_PAIRWISE; 5412 } 5413 5414 if (!rdev->ops->get_key) 5415 return -EOPNOTSUPP; 5416 5417 if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) 5418 return -ENOENT; 5419 5420 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 5421 if (!msg) 5422 return -ENOMEM; 5423 5424 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 5425 NL80211_CMD_NEW_KEY); 5426 if (!hdr) 5427 goto nla_put_failure; 5428 5429 cookie.msg = msg; 5430 cookie.idx = key_idx; 5431 5432 if ((wdev->netdev && 5433 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) || 5434 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 5435 NL80211_ATTR_PAD) || 5436 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_idx)) 5437 goto nla_put_failure; 5438 if (mac_addr && 5439 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr)) 5440 goto nla_put_failure; 5441 5442 err = nl80211_validate_key_link_id(info, wdev, link_id, pairwise); 5443 if (err) 5444 goto free_msg; 5445 5446 err = rdev_get_key(rdev, wdev, link_id, key_idx, pairwise, mac_addr, 5447 &cookie, get_key_callback); 5448 5449 if (err) 5450 goto free_msg; 5451 5452 if (cookie.error) 5453 goto nla_put_failure; 5454 5455 genlmsg_end(msg, hdr); 5456 return genlmsg_reply(msg, info); 5457 5458 nla_put_failure: 5459 err = -ENOBUFS; 5460 free_msg: 5461 nlmsg_free(msg); 5462 return err; 5463 } 5464 5465 static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info) 5466 { 5467 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5468 struct key_parse key; 5469 int err; 5470 struct wireless_dev *wdev = info->user_ptr[1]; 5471 int link_id = nl80211_link_id_or_invalid(info->attrs); 5472 5473 err = nl80211_parse_key(info, &key); 5474 if (err) 5475 return err; 5476 5477 if (key.idx < 0) 5478 return -EINVAL; 5479 5480 /* Only support setting default key and 5481 * Extended Key ID action NL80211_KEY_SET_TX. 5482 */ 5483 if (!key.def && !key.defmgmt && !key.defbeacon && 5484 !(key.p.mode == NL80211_KEY_SET_TX)) 5485 return -EINVAL; 5486 5487 if (key.def) { 5488 if (!rdev->ops->set_default_key) 5489 return -EOPNOTSUPP; 5490 5491 if (!wdev->netdev) 5492 return -EINVAL; 5493 5494 err = nl80211_key_allowed(wdev); 5495 if (err) 5496 return err; 5497 5498 err = nl80211_validate_key_link_id(info, wdev, link_id, false); 5499 if (err) 5500 return err; 5501 5502 err = rdev_set_default_key(rdev, wdev->netdev, link_id, key.idx, 5503 key.def_uni, key.def_multi); 5504 5505 if (err) 5506 return err; 5507 5508 #ifdef CONFIG_CFG80211_WEXT 5509 wdev->wext.default_key = key.idx; 5510 #endif 5511 return 0; 5512 } else if (key.defmgmt) { 5513 if (key.def_uni || !key.def_multi) 5514 return -EINVAL; 5515 5516 if (!rdev->ops->set_default_mgmt_key) 5517 return -EOPNOTSUPP; 5518 5519 err = nl80211_key_allowed(wdev); 5520 if (err) 5521 return err; 5522 5523 err = nl80211_validate_key_link_id(info, wdev, link_id, false); 5524 if (err) 5525 return err; 5526 5527 err = rdev_set_default_mgmt_key(rdev, wdev, link_id, key.idx); 5528 if (err) 5529 return err; 5530 5531 #ifdef CONFIG_CFG80211_WEXT 5532 wdev->wext.default_mgmt_key = key.idx; 5533 #endif 5534 return 0; 5535 } else if (key.defbeacon) { 5536 if (key.def_uni || !key.def_multi) 5537 return -EINVAL; 5538 5539 if (!rdev->ops->set_default_beacon_key) 5540 return -EOPNOTSUPP; 5541 5542 err = nl80211_key_allowed(wdev); 5543 if (err) 5544 return err; 5545 5546 err = nl80211_validate_key_link_id(info, wdev, link_id, false); 5547 if (err) 5548 return err; 5549 5550 return rdev_set_default_beacon_key(rdev, wdev, link_id, 5551 key.idx); 5552 } else if (key.p.mode == NL80211_KEY_SET_TX && 5553 wiphy_ext_feature_isset(&rdev->wiphy, 5554 NL80211_EXT_FEATURE_EXT_KEY_ID)) { 5555 u8 *mac_addr = NULL; 5556 5557 if (info->attrs[NL80211_ATTR_MAC]) 5558 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5559 5560 if (!mac_addr || key.idx < 0 || key.idx > 1) 5561 return -EINVAL; 5562 5563 err = nl80211_validate_key_link_id(info, wdev, link_id, true); 5564 if (err) 5565 return err; 5566 5567 return rdev_add_key(rdev, wdev, link_id, key.idx, 5568 NL80211_KEYTYPE_PAIRWISE, 5569 mac_addr, &key.p); 5570 } 5571 5572 return -EINVAL; 5573 } 5574 5575 static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info) 5576 { 5577 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5578 int err; 5579 struct wireless_dev *wdev = info->user_ptr[1]; 5580 struct key_parse key; 5581 const u8 *mac_addr = NULL; 5582 int link_id = nl80211_link_id_or_invalid(info->attrs); 5583 5584 err = nl80211_parse_key(info, &key); 5585 if (err) 5586 return err; 5587 5588 if (!key.p.key) { 5589 GENL_SET_ERR_MSG(info, "no key"); 5590 return -EINVAL; 5591 } 5592 5593 if (info->attrs[NL80211_ATTR_MAC]) 5594 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5595 5596 if (key.type == -1) { 5597 if (mac_addr) 5598 key.type = NL80211_KEYTYPE_PAIRWISE; 5599 else 5600 key.type = NL80211_KEYTYPE_GROUP; 5601 } 5602 5603 /* for now */ 5604 if (key.type != NL80211_KEYTYPE_PAIRWISE && 5605 key.type != NL80211_KEYTYPE_GROUP) { 5606 GENL_SET_ERR_MSG(info, "key type not pairwise or group"); 5607 return -EINVAL; 5608 } 5609 5610 if (key.type == NL80211_KEYTYPE_GROUP && 5611 info->attrs[NL80211_ATTR_VLAN_ID]) 5612 key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 5613 5614 if (!rdev->ops->add_key) 5615 return -EOPNOTSUPP; 5616 5617 if (cfg80211_validate_key_settings(rdev, wdev, &key.p, key.idx, 5618 key.type == NL80211_KEYTYPE_PAIRWISE, 5619 mac_addr)) { 5620 GENL_SET_ERR_MSG(info, "key setting validation failed"); 5621 return -EINVAL; 5622 } 5623 5624 err = nl80211_key_allowed(wdev); 5625 if (err) 5626 GENL_SET_ERR_MSG(info, "key not allowed"); 5627 5628 if (!err) 5629 err = nl80211_validate_key_link_id(info, wdev, link_id, 5630 key.type == NL80211_KEYTYPE_PAIRWISE); 5631 5632 if (!err) { 5633 err = rdev_add_key(rdev, wdev, link_id, key.idx, 5634 key.type == NL80211_KEYTYPE_PAIRWISE, 5635 mac_addr, &key.p); 5636 if (err) 5637 GENL_SET_ERR_MSG(info, "key addition failed"); 5638 } 5639 5640 return err; 5641 } 5642 5643 static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info) 5644 { 5645 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5646 int err; 5647 struct wireless_dev *wdev = info->user_ptr[1]; 5648 u8 *mac_addr = NULL; 5649 struct key_parse key; 5650 int link_id = nl80211_link_id_or_invalid(info->attrs); 5651 5652 err = nl80211_parse_key(info, &key); 5653 if (err) 5654 return err; 5655 5656 if (info->attrs[NL80211_ATTR_MAC]) 5657 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5658 5659 if (key.type == -1) { 5660 if (mac_addr) 5661 key.type = NL80211_KEYTYPE_PAIRWISE; 5662 else 5663 key.type = NL80211_KEYTYPE_GROUP; 5664 } 5665 5666 /* for now */ 5667 if (key.type != NL80211_KEYTYPE_PAIRWISE && 5668 key.type != NL80211_KEYTYPE_GROUP) 5669 return -EINVAL; 5670 5671 if (!cfg80211_valid_key_idx(rdev, key.idx, 5672 key.type == NL80211_KEYTYPE_PAIRWISE)) 5673 return -EINVAL; 5674 5675 if (!rdev->ops->del_key) 5676 return -EOPNOTSUPP; 5677 5678 err = nl80211_key_allowed(wdev); 5679 5680 if (key.type == NL80211_KEYTYPE_GROUP && mac_addr && 5681 !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) 5682 err = -ENOENT; 5683 5684 if (!err) 5685 err = nl80211_validate_key_link_id(info, wdev, link_id, 5686 key.type == NL80211_KEYTYPE_PAIRWISE); 5687 5688 if (!err) 5689 err = rdev_del_key(rdev, wdev, link_id, key.idx, 5690 key.type == NL80211_KEYTYPE_PAIRWISE, 5691 mac_addr); 5692 5693 #ifdef CONFIG_CFG80211_WEXT 5694 if (!err) { 5695 if (key.idx == wdev->wext.default_key) 5696 wdev->wext.default_key = -1; 5697 else if (key.idx == wdev->wext.default_mgmt_key) 5698 wdev->wext.default_mgmt_key = -1; 5699 } 5700 #endif 5701 5702 return err; 5703 } 5704 5705 /* This function returns an error or the number of nested attributes */ 5706 static int validate_acl_mac_addrs(struct nlattr *nl_attr) 5707 { 5708 struct nlattr *attr; 5709 int n_entries = 0, tmp; 5710 5711 nla_for_each_nested(attr, nl_attr, tmp) { 5712 if (nla_len(attr) != ETH_ALEN) 5713 return -EINVAL; 5714 5715 n_entries++; 5716 } 5717 5718 return n_entries; 5719 } 5720 5721 /* 5722 * This function parses ACL information and allocates memory for ACL data. 5723 * On successful return, the calling function is responsible to free the 5724 * ACL buffer returned by this function. 5725 */ 5726 static struct cfg80211_acl_data *parse_acl_data(struct wiphy *wiphy, 5727 struct genl_info *info) 5728 { 5729 enum nl80211_acl_policy acl_policy; 5730 struct nlattr *attr; 5731 struct cfg80211_acl_data *acl; 5732 int i = 0, n_entries, tmp; 5733 5734 if (!wiphy->max_acl_mac_addrs) 5735 return ERR_PTR(-EOPNOTSUPP); 5736 5737 if (!info->attrs[NL80211_ATTR_ACL_POLICY]) 5738 return ERR_PTR(-EINVAL); 5739 5740 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]); 5741 if (acl_policy != NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED && 5742 acl_policy != NL80211_ACL_POLICY_DENY_UNLESS_LISTED) 5743 return ERR_PTR(-EINVAL); 5744 5745 if (!info->attrs[NL80211_ATTR_MAC_ADDRS]) 5746 return ERR_PTR(-EINVAL); 5747 5748 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]); 5749 if (n_entries < 0) 5750 return ERR_PTR(n_entries); 5751 5752 if (n_entries > wiphy->max_acl_mac_addrs) 5753 return ERR_PTR(-EOPNOTSUPP); 5754 5755 acl = kzalloc_flex(*acl, mac_addrs, n_entries); 5756 if (!acl) 5757 return ERR_PTR(-ENOMEM); 5758 acl->n_acl_entries = n_entries; 5759 5760 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { 5761 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); 5762 i++; 5763 } 5764 acl->acl_policy = acl_policy; 5765 5766 return acl; 5767 } 5768 5769 static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info) 5770 { 5771 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5772 struct net_device *dev = info->user_ptr[1]; 5773 struct cfg80211_acl_data *acl; 5774 int err; 5775 5776 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 5777 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 5778 return -EOPNOTSUPP; 5779 5780 if (!dev->ieee80211_ptr->links[0].ap.beacon_interval) 5781 return -EINVAL; 5782 5783 acl = parse_acl_data(&rdev->wiphy, info); 5784 if (IS_ERR(acl)) 5785 return PTR_ERR(acl); 5786 5787 err = rdev_set_mac_acl(rdev, dev, acl); 5788 5789 kfree(acl); 5790 5791 return err; 5792 } 5793 5794 static u32 rateset_to_mask(struct ieee80211_supported_band *sband, 5795 u8 *rates, u8 rates_len) 5796 { 5797 u8 i; 5798 u32 mask = 0; 5799 5800 for (i = 0; i < rates_len; i++) { 5801 int rate = (rates[i] & 0x7f) * 5; 5802 int ridx; 5803 5804 for (ridx = 0; ridx < sband->n_bitrates; ridx++) { 5805 struct ieee80211_rate *srate = 5806 &sband->bitrates[ridx]; 5807 if (rate == srate->bitrate) { 5808 mask |= 1 << ridx; 5809 break; 5810 } 5811 } 5812 if (ridx == sband->n_bitrates) 5813 return 0; /* rate not found */ 5814 } 5815 5816 return mask; 5817 } 5818 5819 static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband, 5820 u8 *rates, u8 rates_len, 5821 u8 mcs[IEEE80211_HT_MCS_MASK_LEN]) 5822 { 5823 u8 i; 5824 5825 memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN); 5826 5827 for (i = 0; i < rates_len; i++) { 5828 int ridx, rbit; 5829 5830 ridx = rates[i] / 8; 5831 rbit = BIT(rates[i] % 8); 5832 5833 /* check validity */ 5834 if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN)) 5835 return false; 5836 5837 /* check availability */ 5838 ridx = array_index_nospec(ridx, IEEE80211_HT_MCS_MASK_LEN); 5839 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) 5840 mcs[ridx] |= rbit; 5841 else 5842 return false; 5843 } 5844 5845 return true; 5846 } 5847 5848 static u16 vht_mcs_map_to_mcs_mask(u8 vht_mcs_map) 5849 { 5850 u16 mcs_mask = 0; 5851 5852 switch (vht_mcs_map) { 5853 case IEEE80211_VHT_MCS_NOT_SUPPORTED: 5854 break; 5855 case IEEE80211_VHT_MCS_SUPPORT_0_7: 5856 mcs_mask = 0x00FF; 5857 break; 5858 case IEEE80211_VHT_MCS_SUPPORT_0_8: 5859 mcs_mask = 0x01FF; 5860 break; 5861 case IEEE80211_VHT_MCS_SUPPORT_0_9: 5862 mcs_mask = 0x03FF; 5863 break; 5864 default: 5865 break; 5866 } 5867 5868 return mcs_mask; 5869 } 5870 5871 static void vht_build_mcs_mask(u16 vht_mcs_map, 5872 u16 vht_mcs_mask[NL80211_VHT_NSS_MAX]) 5873 { 5874 u8 nss; 5875 5876 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) { 5877 vht_mcs_mask[nss] = vht_mcs_map_to_mcs_mask(vht_mcs_map & 0x03); 5878 vht_mcs_map >>= 2; 5879 } 5880 } 5881 5882 static bool vht_set_mcs_mask(struct ieee80211_supported_band *sband, 5883 struct nl80211_txrate_vht *txrate, 5884 u16 mcs[NL80211_VHT_NSS_MAX]) 5885 { 5886 u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 5887 u16 tx_mcs_mask[NL80211_VHT_NSS_MAX] = {}; 5888 u8 i; 5889 5890 if (!sband->vht_cap.vht_supported) 5891 return false; 5892 5893 memset(mcs, 0, sizeof(u16) * NL80211_VHT_NSS_MAX); 5894 5895 /* Build vht_mcs_mask from VHT capabilities */ 5896 vht_build_mcs_mask(tx_mcs_map, tx_mcs_mask); 5897 5898 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 5899 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) 5900 mcs[i] = txrate->mcs[i]; 5901 else 5902 return false; 5903 } 5904 5905 return true; 5906 } 5907 5908 static u16 he_mcs_map_to_mcs_mask(u8 he_mcs_map) 5909 { 5910 switch (he_mcs_map) { 5911 case IEEE80211_HE_MCS_NOT_SUPPORTED: 5912 return 0; 5913 case IEEE80211_HE_MCS_SUPPORT_0_7: 5914 return 0x00FF; 5915 case IEEE80211_HE_MCS_SUPPORT_0_9: 5916 return 0x03FF; 5917 case IEEE80211_HE_MCS_SUPPORT_0_11: 5918 return 0xFFF; 5919 default: 5920 break; 5921 } 5922 return 0; 5923 } 5924 5925 static void he_build_mcs_mask(u16 he_mcs_map, 5926 u16 he_mcs_mask[NL80211_HE_NSS_MAX]) 5927 { 5928 u8 nss; 5929 5930 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) { 5931 he_mcs_mask[nss] = he_mcs_map_to_mcs_mask(he_mcs_map & 0x03); 5932 he_mcs_map >>= 2; 5933 } 5934 } 5935 5936 static u16 he_get_txmcsmap(struct genl_info *info, unsigned int link_id, 5937 const struct ieee80211_sta_he_cap *he_cap) 5938 { 5939 struct net_device *dev = info->user_ptr[1]; 5940 struct wireless_dev *wdev = dev->ieee80211_ptr; 5941 struct cfg80211_chan_def *chandef; 5942 __le16 tx_mcs; 5943 5944 chandef = wdev_chandef(wdev, link_id); 5945 if (!chandef) { 5946 /* 5947 * This is probably broken, but we never maintained 5948 * a chandef in these cases, so it always was. 5949 */ 5950 return le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); 5951 } 5952 5953 switch (chandef->width) { 5954 case NL80211_CHAN_WIDTH_80P80: 5955 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80p80; 5956 break; 5957 case NL80211_CHAN_WIDTH_160: 5958 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_160; 5959 break; 5960 default: 5961 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80; 5962 break; 5963 } 5964 5965 return le16_to_cpu(tx_mcs); 5966 } 5967 5968 static bool he_set_mcs_mask(struct genl_info *info, 5969 struct wireless_dev *wdev, 5970 struct ieee80211_supported_band *sband, 5971 struct nl80211_txrate_he *txrate, 5972 u16 mcs[NL80211_HE_NSS_MAX], 5973 unsigned int link_id) 5974 { 5975 const struct ieee80211_sta_he_cap *he_cap; 5976 u16 tx_mcs_mask[NL80211_HE_NSS_MAX] = {}; 5977 u16 tx_mcs_map = 0; 5978 u8 i; 5979 5980 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); 5981 if (!he_cap) 5982 return false; 5983 5984 memset(mcs, 0, sizeof(u16) * NL80211_HE_NSS_MAX); 5985 5986 tx_mcs_map = he_get_txmcsmap(info, link_id, he_cap); 5987 5988 /* Build he_mcs_mask from HE capabilities */ 5989 he_build_mcs_mask(tx_mcs_map, tx_mcs_mask); 5990 5991 for (i = 0; i < NL80211_HE_NSS_MAX; i++) { 5992 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) 5993 mcs[i] = txrate->mcs[i]; 5994 else 5995 return false; 5996 } 5997 5998 return true; 5999 } 6000 6001 static void eht_build_mcs_mask(struct genl_info *info, 6002 const struct ieee80211_sta_eht_cap *eht_cap, 6003 u8 mcs_nss_len, u16 *mcs_mask) 6004 { 6005 struct net_device *dev = info->user_ptr[1]; 6006 struct wireless_dev *wdev = dev->ieee80211_ptr; 6007 u8 nss, mcs_7 = 0, mcs_9 = 0, mcs_11 = 0, mcs_13 = 0; 6008 unsigned int link_id = nl80211_link_id(info->attrs); 6009 6010 if (mcs_nss_len == 4) { 6011 const struct ieee80211_eht_mcs_nss_supp_20mhz_only *mcs = 6012 &eht_cap->eht_mcs_nss_supp.only_20mhz; 6013 6014 mcs_7 = u8_get_bits(mcs->rx_tx_mcs7_max_nss, 6015 IEEE80211_EHT_MCS_NSS_TX); 6016 mcs_9 = u8_get_bits(mcs->rx_tx_mcs9_max_nss, 6017 IEEE80211_EHT_MCS_NSS_TX); 6018 mcs_11 = u8_get_bits(mcs->rx_tx_mcs11_max_nss, 6019 IEEE80211_EHT_MCS_NSS_TX); 6020 mcs_13 = u8_get_bits(mcs->rx_tx_mcs13_max_nss, 6021 IEEE80211_EHT_MCS_NSS_TX); 6022 6023 } else { 6024 const struct ieee80211_eht_mcs_nss_supp_bw *mcs; 6025 enum nl80211_chan_width width; 6026 6027 switch (wdev->iftype) { 6028 case NL80211_IFTYPE_ADHOC: 6029 width = wdev->u.ibss.chandef.width; 6030 break; 6031 case NL80211_IFTYPE_MESH_POINT: 6032 width = wdev->u.mesh.chandef.width; 6033 break; 6034 case NL80211_IFTYPE_OCB: 6035 width = wdev->u.ocb.chandef.width; 6036 break; 6037 default: 6038 if (wdev->valid_links) 6039 width = wdev->links[link_id].ap.chandef.width; 6040 else 6041 width = wdev->u.ap.preset_chandef.width; 6042 break; 6043 } 6044 6045 switch (width) { 6046 case NL80211_CHAN_WIDTH_320: 6047 mcs = &eht_cap->eht_mcs_nss_supp.bw._320; 6048 break; 6049 case NL80211_CHAN_WIDTH_160: 6050 mcs = &eht_cap->eht_mcs_nss_supp.bw._160; 6051 break; 6052 default: 6053 mcs = &eht_cap->eht_mcs_nss_supp.bw._80; 6054 break; 6055 } 6056 6057 mcs_7 = u8_get_bits(mcs->rx_tx_mcs9_max_nss, 6058 IEEE80211_EHT_MCS_NSS_TX); 6059 mcs_9 = u8_get_bits(mcs->rx_tx_mcs9_max_nss, 6060 IEEE80211_EHT_MCS_NSS_TX); 6061 mcs_11 = u8_get_bits(mcs->rx_tx_mcs11_max_nss, 6062 IEEE80211_EHT_MCS_NSS_TX); 6063 mcs_13 = u8_get_bits(mcs->rx_tx_mcs13_max_nss, 6064 IEEE80211_EHT_MCS_NSS_TX); 6065 } 6066 6067 /* Enable MCS 14 for NSS 0 */ 6068 if (eht_cap->eht_cap_elem.phy_cap_info[6] & 6069 IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP) 6070 mcs_mask[0] |= 0x4000; 6071 6072 /* Enable MCS 15 for NSS 0 */ 6073 mcs_mask[0] |= 0x8000; 6074 6075 for (nss = 0; nss < NL80211_EHT_NSS_MAX; nss++) { 6076 if (!mcs_7) 6077 continue; 6078 mcs_mask[nss] |= 0x00FF; 6079 mcs_7--; 6080 6081 if (!mcs_9) 6082 continue; 6083 mcs_mask[nss] |= 0x0300; 6084 mcs_9--; 6085 6086 if (!mcs_11) 6087 continue; 6088 mcs_mask[nss] |= 0x0C00; 6089 mcs_11--; 6090 6091 if (!mcs_13) 6092 continue; 6093 mcs_mask[nss] |= 0x3000; 6094 mcs_13--; 6095 } 6096 } 6097 6098 static bool eht_set_mcs_mask(struct genl_info *info, struct wireless_dev *wdev, 6099 struct ieee80211_supported_band *sband, 6100 struct nl80211_txrate_eht *txrate, 6101 u16 mcs[NL80211_EHT_NSS_MAX]) 6102 { 6103 const struct ieee80211_sta_he_cap *he_cap; 6104 const struct ieee80211_sta_eht_cap *eht_cap; 6105 u16 tx_mcs_mask[NL80211_EHT_NSS_MAX] = { 0 }; 6106 u8 i, mcs_nss_len; 6107 6108 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); 6109 if (!he_cap) 6110 return false; 6111 6112 eht_cap = ieee80211_get_eht_iftype_cap(sband, wdev->iftype); 6113 if (!eht_cap) 6114 return false; 6115 6116 /* Checks for MCS 14 */ 6117 if (txrate->mcs[0] & 0x4000) { 6118 if (sband->band != NL80211_BAND_6GHZ) 6119 return false; 6120 6121 if (!(eht_cap->eht_cap_elem.phy_cap_info[6] & 6122 IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP)) 6123 return false; 6124 } 6125 6126 mcs_nss_len = ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem, 6127 &eht_cap->eht_cap_elem, 6128 wdev->iftype == 6129 NL80211_IFTYPE_STATION); 6130 6131 if (mcs_nss_len == 3) { 6132 /* Supported iftypes for setting non-20 MHZ only EHT MCS */ 6133 switch (wdev->iftype) { 6134 case NL80211_IFTYPE_ADHOC: 6135 case NL80211_IFTYPE_AP: 6136 case NL80211_IFTYPE_P2P_GO: 6137 case NL80211_IFTYPE_MESH_POINT: 6138 case NL80211_IFTYPE_OCB: 6139 break; 6140 default: 6141 return false; 6142 } 6143 } 6144 6145 /* Build eht_mcs_mask from EHT and HE capabilities */ 6146 eht_build_mcs_mask(info, eht_cap, mcs_nss_len, tx_mcs_mask); 6147 6148 memset(mcs, 0, sizeof(u16) * NL80211_EHT_NSS_MAX); 6149 for (i = 0; i < NL80211_EHT_NSS_MAX; i++) { 6150 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) 6151 mcs[i] = txrate->mcs[i]; 6152 else 6153 return false; 6154 } 6155 6156 return true; 6157 } 6158 6159 static int nl80211_parse_tx_bitrate_mask(struct genl_info *info, 6160 struct nlattr *attrs[], 6161 enum nl80211_attrs attr, 6162 struct cfg80211_bitrate_mask *mask, 6163 struct net_device *dev, 6164 bool default_all_enabled, 6165 unsigned int link_id) 6166 { 6167 struct nlattr *tb[NL80211_TXRATE_MAX + 1]; 6168 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6169 struct wireless_dev *wdev = dev->ieee80211_ptr; 6170 int rem, i; 6171 struct nlattr *tx_rates; 6172 struct ieee80211_supported_band *sband; 6173 u16 vht_tx_mcs_map, he_tx_mcs_map; 6174 6175 memset(mask, 0, sizeof(*mask)); 6176 /* Default to all rates enabled */ 6177 for (i = 0; i < NUM_NL80211_BANDS; i++) { 6178 const struct ieee80211_sta_he_cap *he_cap; 6179 const struct ieee80211_sta_eht_cap *eht_cap; 6180 u8 mcs_nss_len; 6181 6182 if (!default_all_enabled) 6183 break; 6184 6185 sband = rdev->wiphy.bands[i]; 6186 6187 if (!sband) 6188 continue; 6189 6190 mask->control[i].legacy = (1 << sband->n_bitrates) - 1; 6191 memcpy(mask->control[i].ht_mcs, 6192 sband->ht_cap.mcs.rx_mask, 6193 sizeof(mask->control[i].ht_mcs)); 6194 6195 if (sband->vht_cap.vht_supported) { 6196 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 6197 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs); 6198 } 6199 6200 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); 6201 if (!he_cap) 6202 continue; 6203 6204 he_tx_mcs_map = he_get_txmcsmap(info, link_id, he_cap); 6205 he_build_mcs_mask(he_tx_mcs_map, mask->control[i].he_mcs); 6206 6207 mask->control[i].he_gi = 0xFF; 6208 mask->control[i].he_ltf = 0xFF; 6209 6210 eht_cap = ieee80211_get_eht_iftype_cap(sband, wdev->iftype); 6211 if (!eht_cap) 6212 continue; 6213 6214 mcs_nss_len = ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem, 6215 &eht_cap->eht_cap_elem, 6216 wdev->iftype == 6217 NL80211_IFTYPE_STATION); 6218 6219 eht_build_mcs_mask(info, eht_cap, mcs_nss_len, 6220 mask->control[i].eht_mcs); 6221 6222 mask->control[i].eht_gi = 0xFF; 6223 mask->control[i].eht_ltf = 0xFF; 6224 } 6225 6226 /* if no rates are given set it back to the defaults */ 6227 if (!attrs[attr]) 6228 goto out; 6229 6230 /* The nested attribute uses enum nl80211_band as the index. This maps 6231 * directly to the enum nl80211_band values used in cfg80211. 6232 */ 6233 BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8); 6234 nla_for_each_nested(tx_rates, attrs[attr], rem) { 6235 int band = nla_type(tx_rates); 6236 int err; 6237 6238 if (band < 0 || band >= NUM_NL80211_BANDS) 6239 return -EINVAL; 6240 sband = rdev->wiphy.bands[band]; 6241 if (sband == NULL) 6242 return -EINVAL; 6243 err = nla_parse_nested_deprecated(tb, NL80211_TXRATE_MAX, 6244 tx_rates, 6245 nl80211_txattr_policy, 6246 info->extack); 6247 if (err) 6248 return err; 6249 if (tb[NL80211_TXRATE_LEGACY]) { 6250 mask->control[band].legacy = rateset_to_mask( 6251 sband, 6252 nla_data(tb[NL80211_TXRATE_LEGACY]), 6253 nla_len(tb[NL80211_TXRATE_LEGACY])); 6254 if ((mask->control[band].legacy == 0) && 6255 nla_len(tb[NL80211_TXRATE_LEGACY])) 6256 return -EINVAL; 6257 } 6258 if (tb[NL80211_TXRATE_HT]) { 6259 if (!ht_rateset_to_mask( 6260 sband, 6261 nla_data(tb[NL80211_TXRATE_HT]), 6262 nla_len(tb[NL80211_TXRATE_HT]), 6263 mask->control[band].ht_mcs)) 6264 return -EINVAL; 6265 } 6266 6267 if (tb[NL80211_TXRATE_VHT]) { 6268 if (!vht_set_mcs_mask( 6269 sband, 6270 nla_data(tb[NL80211_TXRATE_VHT]), 6271 mask->control[band].vht_mcs)) 6272 return -EINVAL; 6273 } 6274 6275 if (tb[NL80211_TXRATE_GI]) { 6276 mask->control[band].gi = 6277 nla_get_u8(tb[NL80211_TXRATE_GI]); 6278 if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI) 6279 return -EINVAL; 6280 } 6281 if (tb[NL80211_TXRATE_HE] && 6282 !he_set_mcs_mask(info, wdev, sband, 6283 nla_data(tb[NL80211_TXRATE_HE]), 6284 mask->control[band].he_mcs, 6285 link_id)) 6286 return -EINVAL; 6287 6288 if (tb[NL80211_TXRATE_HE_GI]) 6289 mask->control[band].he_gi = 6290 nla_get_u8(tb[NL80211_TXRATE_HE_GI]); 6291 if (tb[NL80211_TXRATE_HE_LTF]) 6292 mask->control[band].he_ltf = 6293 nla_get_u8(tb[NL80211_TXRATE_HE_LTF]); 6294 6295 if (tb[NL80211_TXRATE_EHT] && 6296 !eht_set_mcs_mask(info, wdev, sband, 6297 nla_data(tb[NL80211_TXRATE_EHT]), 6298 mask->control[band].eht_mcs)) 6299 return -EINVAL; 6300 6301 if (tb[NL80211_TXRATE_EHT_GI]) 6302 mask->control[band].eht_gi = 6303 nla_get_u8(tb[NL80211_TXRATE_EHT_GI]); 6304 if (tb[NL80211_TXRATE_EHT_LTF]) 6305 mask->control[band].eht_ltf = 6306 nla_get_u8(tb[NL80211_TXRATE_EHT_LTF]); 6307 6308 if (mask->control[band].legacy == 0) { 6309 /* don't allow empty legacy rates if HT, VHT, HE or EHT 6310 * are not even supported. 6311 */ 6312 if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported || 6313 rdev->wiphy.bands[band]->vht_cap.vht_supported || 6314 ieee80211_get_he_iftype_cap(sband, wdev->iftype) || 6315 ieee80211_get_eht_iftype_cap(sband, wdev->iftype))) 6316 return -EINVAL; 6317 6318 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) 6319 if (mask->control[band].ht_mcs[i]) 6320 goto out; 6321 6322 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) 6323 if (mask->control[band].vht_mcs[i]) 6324 goto out; 6325 6326 for (i = 0; i < NL80211_HE_NSS_MAX; i++) 6327 if (mask->control[band].he_mcs[i]) 6328 goto out; 6329 6330 for (i = 0; i < NL80211_EHT_NSS_MAX; i++) 6331 if (mask->control[band].eht_mcs[i]) 6332 goto out; 6333 6334 /* legacy and mcs rates may not be both empty */ 6335 return -EINVAL; 6336 } 6337 } 6338 6339 out: 6340 return 0; 6341 } 6342 6343 static int validate_beacon_tx_rate(struct cfg80211_registered_device *rdev, 6344 enum nl80211_band band, 6345 struct cfg80211_bitrate_mask *beacon_rate) 6346 { 6347 u32 count_ht, count_vht, count_he, count_eht, i; 6348 u32 rate = beacon_rate->control[band].legacy; 6349 6350 /* Allow only one rate */ 6351 if (hweight32(rate) > 1) 6352 return -EINVAL; 6353 6354 count_ht = 0; 6355 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) { 6356 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) { 6357 return -EINVAL; 6358 } else if (beacon_rate->control[band].ht_mcs[i]) { 6359 count_ht++; 6360 if (count_ht > 1) 6361 return -EINVAL; 6362 } 6363 if (count_ht && rate) 6364 return -EINVAL; 6365 } 6366 6367 count_vht = 0; 6368 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 6369 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) { 6370 return -EINVAL; 6371 } else if (beacon_rate->control[band].vht_mcs[i]) { 6372 count_vht++; 6373 if (count_vht > 1) 6374 return -EINVAL; 6375 } 6376 if (count_vht && rate) 6377 return -EINVAL; 6378 } 6379 6380 count_he = 0; 6381 for (i = 0; i < NL80211_HE_NSS_MAX; i++) { 6382 if (hweight16(beacon_rate->control[band].he_mcs[i]) > 1) { 6383 return -EINVAL; 6384 } else if (beacon_rate->control[band].he_mcs[i]) { 6385 count_he++; 6386 if (count_he > 1) 6387 return -EINVAL; 6388 } 6389 if (count_he && rate) 6390 return -EINVAL; 6391 } 6392 6393 count_eht = 0; 6394 for (i = 0; i < NL80211_EHT_NSS_MAX; i++) { 6395 if (hweight16(beacon_rate->control[band].eht_mcs[i]) > 1) { 6396 return -EINVAL; 6397 } else if (beacon_rate->control[band].eht_mcs[i]) { 6398 count_eht++; 6399 if (count_eht > 1) 6400 return -EINVAL; 6401 } 6402 if (count_eht && rate) 6403 return -EINVAL; 6404 } 6405 6406 if ((count_ht && count_vht && count_he && count_eht) || 6407 (!rate && !count_ht && !count_vht && !count_he && !count_eht)) 6408 return -EINVAL; 6409 6410 if (rate && 6411 !wiphy_ext_feature_isset(&rdev->wiphy, 6412 NL80211_EXT_FEATURE_BEACON_RATE_LEGACY)) 6413 return -EINVAL; 6414 if (count_ht && 6415 !wiphy_ext_feature_isset(&rdev->wiphy, 6416 NL80211_EXT_FEATURE_BEACON_RATE_HT)) 6417 return -EINVAL; 6418 if (count_vht && 6419 !wiphy_ext_feature_isset(&rdev->wiphy, 6420 NL80211_EXT_FEATURE_BEACON_RATE_VHT)) 6421 return -EINVAL; 6422 if (count_he && 6423 !wiphy_ext_feature_isset(&rdev->wiphy, 6424 NL80211_EXT_FEATURE_BEACON_RATE_HE)) 6425 return -EINVAL; 6426 6427 if (count_eht && 6428 !wiphy_ext_feature_isset(&rdev->wiphy, 6429 NL80211_EXT_FEATURE_BEACON_RATE_EHT)) 6430 return -EINVAL; 6431 6432 return 0; 6433 } 6434 6435 static int nl80211_parse_mbssid_config(struct wiphy *wiphy, 6436 struct net_device *dev, 6437 unsigned int link_id, 6438 struct nlattr *attrs, 6439 struct cfg80211_mbssid_config *config, 6440 u8 num_elems) 6441 { 6442 struct nlattr *tb[NL80211_MBSSID_CONFIG_ATTR_MAX + 1]; 6443 int tx_link_id = -1; 6444 6445 if (!wiphy->mbssid_max_interfaces) 6446 return -EOPNOTSUPP; 6447 6448 if (nla_parse_nested(tb, NL80211_MBSSID_CONFIG_ATTR_MAX, attrs, NULL, 6449 NULL) || 6450 !tb[NL80211_MBSSID_CONFIG_ATTR_INDEX]) 6451 return -EINVAL; 6452 6453 config->ema = nla_get_flag(tb[NL80211_MBSSID_CONFIG_ATTR_EMA]); 6454 if (config->ema) { 6455 if (!wiphy->ema_max_profile_periodicity) 6456 return -EOPNOTSUPP; 6457 6458 if (num_elems > wiphy->ema_max_profile_periodicity) 6459 return -EINVAL; 6460 } 6461 6462 config->index = nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_INDEX]); 6463 if (config->index >= wiphy->mbssid_max_interfaces || 6464 (!config->index && !num_elems)) 6465 return -EINVAL; 6466 6467 if (tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID]) 6468 tx_link_id = nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID]); 6469 6470 if (tb[NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX]) { 6471 u32 tx_ifindex = 6472 nla_get_u32(tb[NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX]); 6473 6474 if ((!config->index && tx_ifindex != dev->ifindex) || 6475 (config->index && tx_ifindex == dev->ifindex)) 6476 return -EINVAL; 6477 6478 if (tx_ifindex != dev->ifindex) { 6479 struct net_device *tx_netdev = 6480 dev_get_by_index(wiphy_net(wiphy), tx_ifindex); 6481 6482 if (!tx_netdev || !tx_netdev->ieee80211_ptr || 6483 tx_netdev->ieee80211_ptr->wiphy != wiphy || 6484 tx_netdev->ieee80211_ptr->iftype != 6485 NL80211_IFTYPE_AP) { 6486 dev_put(tx_netdev); 6487 return -EINVAL; 6488 } 6489 6490 config->tx_wdev = tx_netdev->ieee80211_ptr; 6491 /* Caller should call dev_put(config->tx_wdev) from this point */ 6492 6493 if (config->tx_wdev->valid_links) { 6494 if (tx_link_id == -1 || 6495 !(config->tx_wdev->valid_links & BIT(tx_link_id))) 6496 return -ENOLINK; 6497 6498 config->tx_link_id = tx_link_id; 6499 } 6500 } else { 6501 if (tx_link_id >= 0 && tx_link_id != link_id) 6502 return -EINVAL; 6503 6504 config->tx_wdev = dev->ieee80211_ptr; 6505 } 6506 } else if (!config->index) { 6507 if (tx_link_id >= 0 && tx_link_id != link_id) 6508 return -EINVAL; 6509 6510 config->tx_wdev = dev->ieee80211_ptr; 6511 } else { 6512 return -EINVAL; 6513 } 6514 6515 return 0; 6516 } 6517 6518 static struct cfg80211_mbssid_elems * 6519 nl80211_parse_mbssid_elems(struct wiphy *wiphy, struct nlattr *attrs) 6520 { 6521 struct nlattr *nl_elems; 6522 struct cfg80211_mbssid_elems *elems; 6523 int rem_elems; 6524 u8 i = 0, num_elems = 0; 6525 6526 if (!wiphy->mbssid_max_interfaces) 6527 return ERR_PTR(-EINVAL); 6528 6529 nla_for_each_nested(nl_elems, attrs, rem_elems) { 6530 if (num_elems >= 255) 6531 return ERR_PTR(-EINVAL); 6532 num_elems++; 6533 } 6534 6535 elems = kzalloc_flex(*elems, elem, num_elems); 6536 if (!elems) 6537 return ERR_PTR(-ENOMEM); 6538 elems->cnt = num_elems; 6539 6540 nla_for_each_nested(nl_elems, attrs, rem_elems) { 6541 elems->elem[i].data = nla_data(nl_elems); 6542 elems->elem[i].len = nla_len(nl_elems); 6543 i++; 6544 } 6545 return elems; 6546 } 6547 6548 static struct cfg80211_rnr_elems * 6549 nl80211_parse_rnr_elems(struct wiphy *wiphy, struct nlattr *attrs, 6550 struct netlink_ext_ack *extack) 6551 { 6552 struct nlattr *nl_elems; 6553 struct cfg80211_rnr_elems *elems; 6554 int rem_elems; 6555 u8 i = 0, num_elems = 0; 6556 6557 nla_for_each_nested(nl_elems, attrs, rem_elems) { 6558 int ret; 6559 6560 ret = validate_ie_attr(nl_elems, extack); 6561 if (ret) 6562 return ERR_PTR(ret); 6563 6564 num_elems++; 6565 } 6566 6567 elems = kzalloc_flex(*elems, elem, num_elems); 6568 if (!elems) 6569 return ERR_PTR(-ENOMEM); 6570 elems->cnt = num_elems; 6571 6572 nla_for_each_nested(nl_elems, attrs, rem_elems) { 6573 elems->elem[i].data = nla_data(nl_elems); 6574 elems->elem[i].len = nla_len(nl_elems); 6575 i++; 6576 } 6577 return elems; 6578 } 6579 6580 static int nl80211_parse_he_bss_color(struct nlattr *attrs, 6581 struct cfg80211_he_bss_color *he_bss_color) 6582 { 6583 struct nlattr *tb[NL80211_HE_BSS_COLOR_ATTR_MAX + 1]; 6584 int err; 6585 6586 err = nla_parse_nested(tb, NL80211_HE_BSS_COLOR_ATTR_MAX, attrs, 6587 he_bss_color_policy, NULL); 6588 if (err) 6589 return err; 6590 6591 if (!tb[NL80211_HE_BSS_COLOR_ATTR_COLOR]) 6592 return -EINVAL; 6593 6594 he_bss_color->color = 6595 nla_get_u8(tb[NL80211_HE_BSS_COLOR_ATTR_COLOR]); 6596 he_bss_color->enabled = 6597 !nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_DISABLED]); 6598 he_bss_color->partial = 6599 nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_PARTIAL]); 6600 6601 return 0; 6602 } 6603 6604 static void nl80211_check_ap_rate_selectors(struct cfg80211_beacon_data *bcn, 6605 const struct element *rates) 6606 { 6607 int i; 6608 6609 if (!rates) 6610 return; 6611 6612 for (i = 0; i < rates->datalen; i++) { 6613 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY) 6614 bcn->ht_required = true; 6615 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY) 6616 bcn->vht_required = true; 6617 } 6618 } 6619 6620 /* 6621 * Since the nl80211 API didn't include, from the beginning, attributes about 6622 * HT/VHT/... operation, we parse them out of the elements and check for 6623 * validity for use by drivers/mac80211. 6624 */ 6625 static int nl80211_calculate_ap_operation(struct nlattr *attrs[], 6626 struct cfg80211_beacon_data *bcn, 6627 struct netlink_ext_ack *extack) 6628 { 6629 size_t ies_len = bcn->tail_len; 6630 const u8 *ies = bcn->tail; 6631 const struct element *rates; 6632 const struct element *op; 6633 6634 rates = cfg80211_find_elem(WLAN_EID_SUPP_RATES, ies, ies_len); 6635 nl80211_check_ap_rate_selectors(bcn, rates); 6636 6637 rates = cfg80211_find_elem(WLAN_EID_EXT_SUPP_RATES, ies, ies_len); 6638 nl80211_check_ap_rate_selectors(bcn, rates); 6639 6640 op = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION, ies, ies_len); 6641 if (op) { 6642 if (op->datalen < sizeof(*bcn->he_oper) + 1) { 6643 NL_SET_ERR_MSG(extack, "bad HE operation in beacon"); 6644 return -EINVAL; 6645 } 6646 bcn->he_oper = (void *)(op->data + 1); 6647 /* takes extension ID into account */ 6648 if (op->datalen < ieee80211_he_oper_size((void *)bcn->he_oper)) { 6649 NL_SET_ERR_MSG(extack, "bad HE operation in beacon"); 6650 return -EINVAL; 6651 } 6652 } 6653 6654 op = cfg80211_find_elem(WLAN_EID_HT_OPERATION, ies, ies_len); 6655 if (op) { 6656 if (op->datalen < sizeof(*bcn->ht_oper)) { 6657 NL_SET_ERR_MSG(extack, "bad HT operation in beacon"); 6658 return -EINVAL; 6659 } 6660 bcn->ht_oper = (void *)op->data; 6661 } 6662 6663 op = cfg80211_find_elem(WLAN_EID_VHT_OPERATION, ies, ies_len); 6664 if (op) { 6665 if (op->datalen < sizeof(*bcn->vht_oper)) { 6666 NL_SET_ERR_MSG(extack, "bad VHT operation in beacon"); 6667 return -EINVAL; 6668 } 6669 bcn->vht_oper = (void *)op->data; 6670 } 6671 6672 op = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_OPERATION, ies, ies_len); 6673 if (op) { 6674 if (!ieee80211_eht_oper_size_ok(op->data + 1, 6675 op->datalen - 1)) { 6676 NL_SET_ERR_MSG(extack, "bad EHT operation in beacon"); 6677 return -EINVAL; 6678 } 6679 bcn->eht_oper = (void *)(op->data + 1); 6680 } 6681 6682 op = cfg80211_find_ext_elem(WLAN_EID_EXT_UHR_OPER, ies, ies_len); 6683 if (op) { 6684 /* need full UHR operation separately */ 6685 if (!attrs[NL80211_ATTR_UHR_OPERATION]) { 6686 NL_SET_ERR_MSG(extack, "missing UHR operation"); 6687 return -EINVAL; 6688 } 6689 bcn->uhr_oper = nla_data(attrs[NL80211_ATTR_UHR_OPERATION]); 6690 } else if (attrs[NL80211_ATTR_UHR_OPERATION]) { 6691 NL_SET_ERR_MSG(extack, "unexpected UHR operation"); 6692 return -EINVAL; 6693 } 6694 6695 return 0; 6696 } 6697 6698 static int nl80211_parse_beacon(struct cfg80211_registered_device *rdev, 6699 struct nlattr *attrs[], 6700 struct cfg80211_beacon_data *bcn, 6701 struct ieee80211_channel *chan, 6702 struct netlink_ext_ack *extack) 6703 { 6704 bool haveinfo = false; 6705 int err; 6706 6707 memset(bcn, 0, sizeof(*bcn)); 6708 6709 bcn->link_id = nl80211_link_id(attrs); 6710 6711 if (attrs[NL80211_ATTR_BEACON_HEAD]) { 6712 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); 6713 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); 6714 if (!bcn->head_len) 6715 return -EINVAL; 6716 haveinfo = true; 6717 } 6718 6719 if (attrs[NL80211_ATTR_BEACON_TAIL]) { 6720 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]); 6721 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]); 6722 haveinfo = true; 6723 } 6724 6725 if (!haveinfo) 6726 return -EINVAL; 6727 6728 if (attrs[NL80211_ATTR_IE]) { 6729 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]); 6730 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]); 6731 } 6732 6733 if (attrs[NL80211_ATTR_IE_PROBE_RESP]) { 6734 bcn->proberesp_ies = 6735 nla_data(attrs[NL80211_ATTR_IE_PROBE_RESP]); 6736 bcn->proberesp_ies_len = 6737 nla_len(attrs[NL80211_ATTR_IE_PROBE_RESP]); 6738 } 6739 6740 if (attrs[NL80211_ATTR_IE_ASSOC_RESP]) { 6741 bcn->assocresp_ies = 6742 nla_data(attrs[NL80211_ATTR_IE_ASSOC_RESP]); 6743 bcn->assocresp_ies_len = 6744 nla_len(attrs[NL80211_ATTR_IE_ASSOC_RESP]); 6745 } 6746 6747 if (attrs[NL80211_ATTR_PROBE_RESP]) { 6748 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]); 6749 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]); 6750 } 6751 6752 if (attrs[NL80211_ATTR_FTM_RESPONDER]) { 6753 struct nlattr *tb[NL80211_FTM_RESP_ATTR_MAX + 1]; 6754 6755 err = nla_parse_nested_deprecated(tb, 6756 NL80211_FTM_RESP_ATTR_MAX, 6757 attrs[NL80211_ATTR_FTM_RESPONDER], 6758 NULL, NULL); 6759 if (err) 6760 return err; 6761 6762 if (tb[NL80211_FTM_RESP_ATTR_ENABLED] && 6763 wiphy_ext_feature_isset(&rdev->wiphy, 6764 NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER)) 6765 bcn->ftm_responder = 1; 6766 else 6767 return -EOPNOTSUPP; 6768 6769 if (tb[NL80211_FTM_RESP_ATTR_LCI]) { 6770 bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]); 6771 bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]); 6772 } 6773 6774 if (tb[NL80211_FTM_RESP_ATTR_CIVICLOC]) { 6775 bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); 6776 bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); 6777 } 6778 } else { 6779 bcn->ftm_responder = -1; 6780 } 6781 6782 if (attrs[NL80211_ATTR_HE_BSS_COLOR]) { 6783 err = nl80211_parse_he_bss_color(attrs[NL80211_ATTR_HE_BSS_COLOR], 6784 &bcn->he_bss_color); 6785 if (err) 6786 return err; 6787 bcn->he_bss_color_valid = true; 6788 } 6789 6790 if (attrs[NL80211_ATTR_MBSSID_ELEMS]) { 6791 struct cfg80211_mbssid_elems *mbssid = 6792 nl80211_parse_mbssid_elems(&rdev->wiphy, 6793 attrs[NL80211_ATTR_MBSSID_ELEMS]); 6794 6795 if (IS_ERR(mbssid)) 6796 return PTR_ERR(mbssid); 6797 6798 bcn->mbssid_ies = mbssid; 6799 6800 if (bcn->mbssid_ies && attrs[NL80211_ATTR_EMA_RNR_ELEMS]) { 6801 struct cfg80211_rnr_elems *rnr = 6802 nl80211_parse_rnr_elems(&rdev->wiphy, 6803 attrs[NL80211_ATTR_EMA_RNR_ELEMS], 6804 extack); 6805 6806 if (IS_ERR(rnr)) 6807 return PTR_ERR(rnr); 6808 6809 if (rnr && rnr->cnt < bcn->mbssid_ies->cnt) 6810 return -EINVAL; 6811 6812 bcn->rnr_ies = rnr; 6813 } 6814 } 6815 6816 err = nl80211_calculate_ap_operation(attrs, bcn, extack); 6817 if (err) 6818 return err; 6819 6820 if (bcn->he_oper && (chan->flags & IEEE80211_CHAN_NO_HE)) 6821 return -EOPNOTSUPP; 6822 6823 if (bcn->eht_oper && (chan->flags & IEEE80211_CHAN_NO_EHT)) 6824 return -EOPNOTSUPP; 6825 6826 if (bcn->uhr_oper && (chan->flags & IEEE80211_CHAN_NO_UHR)) 6827 return -EOPNOTSUPP; 6828 6829 return 0; 6830 } 6831 6832 static int nl80211_parse_he_obss_pd(struct nlattr *attrs, 6833 struct ieee80211_he_obss_pd *he_obss_pd) 6834 { 6835 struct nlattr *tb[NL80211_HE_OBSS_PD_ATTR_MAX + 1]; 6836 int err; 6837 6838 err = nla_parse_nested(tb, NL80211_HE_OBSS_PD_ATTR_MAX, attrs, 6839 he_obss_pd_policy, NULL); 6840 if (err) 6841 return err; 6842 6843 if (!tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]) 6844 return -EINVAL; 6845 6846 he_obss_pd->sr_ctrl = nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]); 6847 6848 if (tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET]) 6849 he_obss_pd->min_offset = 6850 nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET]); 6851 if (tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]) 6852 he_obss_pd->max_offset = 6853 nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]); 6854 if (tb[NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET]) 6855 he_obss_pd->non_srg_max_offset = 6856 nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET]); 6857 6858 if (he_obss_pd->min_offset > he_obss_pd->max_offset) 6859 return -EINVAL; 6860 6861 if (tb[NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP]) 6862 memcpy(he_obss_pd->bss_color_bitmap, 6863 nla_data(tb[NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP]), 6864 sizeof(he_obss_pd->bss_color_bitmap)); 6865 6866 if (tb[NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP]) 6867 memcpy(he_obss_pd->partial_bssid_bitmap, 6868 nla_data(tb[NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP]), 6869 sizeof(he_obss_pd->partial_bssid_bitmap)); 6870 6871 he_obss_pd->enable = true; 6872 6873 return 0; 6874 } 6875 6876 static int nl80211_parse_fils_discovery(struct cfg80211_registered_device *rdev, 6877 struct nlattr *attrs, 6878 struct cfg80211_fils_discovery *fd) 6879 { 6880 struct nlattr *tb[NL80211_FILS_DISCOVERY_ATTR_MAX + 1]; 6881 int ret; 6882 6883 if (!wiphy_ext_feature_isset(&rdev->wiphy, 6884 NL80211_EXT_FEATURE_FILS_DISCOVERY)) 6885 return -EINVAL; 6886 6887 ret = nla_parse_nested(tb, NL80211_FILS_DISCOVERY_ATTR_MAX, attrs, 6888 NULL, NULL); 6889 if (ret) 6890 return ret; 6891 6892 if (!tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN] && 6893 !tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX] && 6894 !tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]) { 6895 fd->update = true; 6896 return 0; 6897 } 6898 6899 if (!tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN] || 6900 !tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX] || 6901 !tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]) 6902 return -EINVAL; 6903 6904 fd->tmpl_len = nla_len(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); 6905 fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); 6906 fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]); 6907 fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]); 6908 fd->update = true; 6909 return 0; 6910 } 6911 6912 static int 6913 nl80211_parse_unsol_bcast_probe_resp(struct cfg80211_registered_device *rdev, 6914 struct nlattr *attrs, 6915 struct cfg80211_unsol_bcast_probe_resp *presp) 6916 { 6917 struct nlattr *tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX + 1]; 6918 int ret; 6919 6920 if (!wiphy_ext_feature_isset(&rdev->wiphy, 6921 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP)) 6922 return -EINVAL; 6923 6924 ret = nla_parse_nested(tb, NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX, 6925 attrs, NULL, NULL); 6926 if (ret) 6927 return ret; 6928 6929 if (!tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] && 6930 !tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]) { 6931 presp->update = true; 6932 return 0; 6933 } 6934 6935 if (!tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] || 6936 !tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]) 6937 return -EINVAL; 6938 6939 presp->tmpl = nla_data(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); 6940 presp->tmpl_len = nla_len(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); 6941 presp->interval = nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT]); 6942 presp->update = true; 6943 return 0; 6944 } 6945 6946 /* 6947 * Since the nl80211 API didn't include, from the beginning, attributes about 6948 * HT/VHT/... capabilities, we parse them out of the elements and check for 6949 * validity for use by drivers/mac80211. 6950 */ 6951 static int nl80211_calculate_ap_capabilities(struct genl_info *info, 6952 struct cfg80211_ap_settings *params) 6953 { 6954 size_t ies_len = params->beacon.tail_len; 6955 const u8 *ies = params->beacon.tail; 6956 const struct element *cap; 6957 6958 cap = cfg80211_find_elem(WLAN_EID_HT_CAPABILITY, ies, ies_len); 6959 if (cap) { 6960 if (cap->datalen < sizeof(*params->ht_cap)) { 6961 GENL_SET_ERR_MSG(info, "bad HT capability in beacon"); 6962 return -EINVAL; 6963 } 6964 params->ht_cap = (void *)cap->data; 6965 } 6966 6967 cap = cfg80211_find_elem(WLAN_EID_VHT_CAPABILITY, ies, ies_len); 6968 if (cap) { 6969 if (cap->datalen < sizeof(*params->vht_cap)) { 6970 GENL_SET_ERR_MSG(info, "bad VHT capability in beacon"); 6971 return -EINVAL; 6972 } 6973 params->vht_cap = (void *)cap->data; 6974 } 6975 6976 cap = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_CAPABILITY, ies, ies_len); 6977 if (cap) { 6978 if (cap->datalen < sizeof(*params->he_cap) + 1) { 6979 GENL_SET_ERR_MSG(info, "bad HE capability in beacon"); 6980 return -EINVAL; 6981 } 6982 params->he_cap = (void *)(cap->data + 1); 6983 } 6984 6985 cap = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_CAPABILITY, ies, ies_len); 6986 if (cap) { 6987 params->eht_cap = (void *)(cap->data + 1); 6988 if (!ieee80211_eht_capa_size_ok((const u8 *)params->he_cap, 6989 (const u8 *)params->eht_cap, 6990 cap->datalen - 1, true)) { 6991 GENL_SET_ERR_MSG(info, "bad EHT capability in beacon"); 6992 return -EINVAL; 6993 } 6994 } 6995 6996 return 0; 6997 } 6998 6999 static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev, 7000 struct cfg80211_ap_settings *params) 7001 { 7002 struct wireless_dev *wdev; 7003 7004 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 7005 if (wdev->iftype != NL80211_IFTYPE_AP && 7006 wdev->iftype != NL80211_IFTYPE_P2P_GO) 7007 continue; 7008 7009 if (!wdev->u.ap.preset_chandef.chan) 7010 continue; 7011 7012 params->chandef = wdev->u.ap.preset_chandef; 7013 return true; 7014 } 7015 7016 return false; 7017 } 7018 7019 static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev, 7020 enum nl80211_auth_type auth_type, 7021 enum nl80211_commands cmd) 7022 { 7023 if (auth_type > NL80211_AUTHTYPE_MAX) 7024 return false; 7025 7026 switch (cmd) { 7027 case NL80211_CMD_AUTHENTICATE: 7028 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && 7029 auth_type == NL80211_AUTHTYPE_SAE) 7030 return false; 7031 if (!wiphy_ext_feature_isset(&rdev->wiphy, 7032 NL80211_EXT_FEATURE_FILS_STA) && 7033 (auth_type == NL80211_AUTHTYPE_FILS_SK || 7034 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 7035 auth_type == NL80211_AUTHTYPE_FILS_PK)) 7036 return false; 7037 if (!wiphy_ext_feature_isset(&rdev->wiphy, 7038 NL80211_EXT_FEATURE_EPPKE) && 7039 auth_type == NL80211_AUTHTYPE_EPPKE) 7040 return false; 7041 if (!wiphy_ext_feature_isset(&rdev->wiphy, 7042 NL80211_EXT_FEATURE_IEEE8021X_AUTH) && 7043 auth_type == NL80211_AUTHTYPE_IEEE8021X) 7044 return false; 7045 return true; 7046 case NL80211_CMD_CONNECT: 7047 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && 7048 !wiphy_ext_feature_isset(&rdev->wiphy, 7049 NL80211_EXT_FEATURE_SAE_OFFLOAD) && 7050 auth_type == NL80211_AUTHTYPE_SAE) 7051 return false; 7052 7053 /* FILS with SK PFS or PK not supported yet */ 7054 if (auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 7055 auth_type == NL80211_AUTHTYPE_FILS_PK) 7056 return false; 7057 if (!wiphy_ext_feature_isset( 7058 &rdev->wiphy, 7059 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) && 7060 auth_type == NL80211_AUTHTYPE_FILS_SK) 7061 return false; 7062 if (!wiphy_ext_feature_isset(&rdev->wiphy, 7063 NL80211_EXT_FEATURE_EPPKE) && 7064 auth_type == NL80211_AUTHTYPE_EPPKE) 7065 return false; 7066 if (!wiphy_ext_feature_isset(&rdev->wiphy, 7067 NL80211_EXT_FEATURE_IEEE8021X_AUTH) && 7068 auth_type == NL80211_AUTHTYPE_IEEE8021X) 7069 return false; 7070 return true; 7071 case NL80211_CMD_START_AP: 7072 if (!wiphy_ext_feature_isset(&rdev->wiphy, 7073 NL80211_EXT_FEATURE_SAE_OFFLOAD_AP) && 7074 auth_type == NL80211_AUTHTYPE_SAE) 7075 return false; 7076 /* FILS not supported yet */ 7077 if (auth_type == NL80211_AUTHTYPE_FILS_SK || 7078 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 7079 auth_type == NL80211_AUTHTYPE_FILS_PK) 7080 return false; 7081 return true; 7082 default: 7083 return false; 7084 } 7085 } 7086 7087 static void nl80211_send_ap_started(struct wireless_dev *wdev, 7088 unsigned int link_id) 7089 { 7090 struct wiphy *wiphy = wdev->wiphy; 7091 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 7092 struct sk_buff *msg; 7093 void *hdr; 7094 7095 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 7096 if (!msg) 7097 return; 7098 7099 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_START_AP); 7100 if (!hdr) 7101 goto out; 7102 7103 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 7104 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || 7105 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 7106 NL80211_ATTR_PAD) || 7107 (wdev->u.ap.ssid_len && 7108 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len, 7109 wdev->u.ap.ssid)) || 7110 (wdev->valid_links && 7111 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))) 7112 goto out; 7113 7114 genlmsg_end(msg, hdr); 7115 7116 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0, 7117 NL80211_MCGRP_MLME, GFP_KERNEL); 7118 return; 7119 out: 7120 nlmsg_free(msg); 7121 } 7122 7123 static int 7124 nl80211_parse_s1g_short_beacon(struct cfg80211_registered_device *rdev, 7125 struct nlattr *attrs, 7126 struct cfg80211_s1g_short_beacon *sb) 7127 { 7128 struct nlattr *tb[NL80211_S1G_SHORT_BEACON_ATTR_MAX + 1]; 7129 int ret; 7130 7131 if (!rdev->wiphy.bands[NL80211_BAND_S1GHZ]) 7132 return -EINVAL; 7133 7134 ret = nla_parse_nested(tb, NL80211_S1G_SHORT_BEACON_ATTR_MAX, attrs, 7135 NULL, NULL); 7136 if (ret) 7137 return ret; 7138 7139 /* Short beacon tail is optional (i.e might only include the TIM) */ 7140 if (!tb[NL80211_S1G_SHORT_BEACON_ATTR_HEAD]) 7141 return -EINVAL; 7142 7143 sb->short_head = nla_data(tb[NL80211_S1G_SHORT_BEACON_ATTR_HEAD]); 7144 sb->short_head_len = nla_len(tb[NL80211_S1G_SHORT_BEACON_ATTR_HEAD]); 7145 sb->short_tail_len = 0; 7146 7147 if (tb[NL80211_S1G_SHORT_BEACON_ATTR_TAIL]) { 7148 sb->short_tail = 7149 nla_data(tb[NL80211_S1G_SHORT_BEACON_ATTR_TAIL]); 7150 sb->short_tail_len = 7151 nla_len(tb[NL80211_S1G_SHORT_BEACON_ATTR_TAIL]); 7152 } 7153 7154 sb->update = true; 7155 return 0; 7156 } 7157 7158 static int nl80211_check_npca(struct cfg80211_registered_device *rdev, 7159 const struct cfg80211_chan_def *chandef, 7160 enum nl80211_iftype iftype, 7161 struct netlink_ext_ack *extack) 7162 { 7163 const struct ieee80211_supported_band *sband; 7164 const struct ieee80211_sta_uhr_cap *uhr_cap; 7165 7166 if (!chandef->npca_chan) 7167 return 0; 7168 7169 sband = rdev->wiphy.bands[chandef->chan->band]; 7170 uhr_cap = ieee80211_get_uhr_iftype_cap(sband, iftype); 7171 7172 if (uhr_cap && 7173 (uhr_cap->mac.mac_cap[0] & IEEE80211_UHR_MAC_CAP0_NPCA_SUPP)) 7174 return 0; 7175 7176 NL_SET_ERR_MSG(extack, "NPCA not supported"); 7177 return -EINVAL; 7178 } 7179 7180 static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) 7181 { 7182 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7183 struct cfg80211_beaconing_check_config beacon_check = {}; 7184 unsigned int link_id = nl80211_link_id(info->attrs); 7185 struct net_device *dev = info->user_ptr[1]; 7186 struct wireless_dev *wdev = dev->ieee80211_ptr; 7187 struct cfg80211_ap_settings *params; 7188 int err; 7189 7190 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 7191 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 7192 return -EOPNOTSUPP; 7193 7194 if (!rdev->ops->start_ap) 7195 return -EOPNOTSUPP; 7196 7197 if (wdev->links[link_id].cac_started) 7198 return -EBUSY; 7199 7200 if (wdev->links[link_id].ap.beacon_interval) 7201 return -EALREADY; 7202 7203 /* these are required for START_AP */ 7204 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] || 7205 !info->attrs[NL80211_ATTR_DTIM_PERIOD] || 7206 !info->attrs[NL80211_ATTR_BEACON_HEAD]) 7207 return -EINVAL; 7208 7209 if (info->attrs[NL80211_ATTR_SMPS_MODE] && 7210 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]) != NL80211_SMPS_OFF) 7211 return -EOPNOTSUPP; 7212 7213 params = kzalloc_obj(*params); 7214 if (!params) 7215 return -ENOMEM; 7216 7217 params->beacon_interval = 7218 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 7219 params->dtim_period = 7220 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 7221 7222 err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype, 7223 params->beacon_interval); 7224 if (err) 7225 goto out; 7226 7227 /* 7228 * In theory, some of these attributes should be required here 7229 * but since they were not used when the command was originally 7230 * added, keep them optional for old user space programs to let 7231 * them continue to work with drivers that do not need the 7232 * additional information -- drivers must check! 7233 */ 7234 if (info->attrs[NL80211_ATTR_SSID]) { 7235 params->ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 7236 params->ssid_len = 7237 nla_len(info->attrs[NL80211_ATTR_SSID]); 7238 if (params->ssid_len == 0) { 7239 err = -EINVAL; 7240 goto out; 7241 } 7242 7243 if (wdev->u.ap.ssid_len && 7244 (wdev->u.ap.ssid_len != params->ssid_len || 7245 memcmp(wdev->u.ap.ssid, params->ssid, params->ssid_len))) { 7246 /* require identical SSID for MLO */ 7247 err = -EINVAL; 7248 goto out; 7249 } 7250 } else if (wdev->valid_links) { 7251 /* require SSID for MLO */ 7252 err = -EINVAL; 7253 goto out; 7254 } 7255 7256 if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) 7257 params->hidden_ssid = nla_get_u32( 7258 info->attrs[NL80211_ATTR_HIDDEN_SSID]); 7259 7260 params->privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 7261 7262 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 7263 params->auth_type = nla_get_u32( 7264 info->attrs[NL80211_ATTR_AUTH_TYPE]); 7265 if (!nl80211_valid_auth_type(rdev, params->auth_type, 7266 NL80211_CMD_START_AP)) { 7267 err = -EINVAL; 7268 goto out; 7269 } 7270 } else 7271 params->auth_type = NL80211_AUTHTYPE_AUTOMATIC; 7272 7273 err = nl80211_crypto_settings(rdev, info, ¶ms->crypto, 7274 NL80211_MAX_NR_CIPHER_SUITES); 7275 if (err) 7276 goto out; 7277 7278 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) { 7279 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) { 7280 err = -EOPNOTSUPP; 7281 goto out; 7282 } 7283 params->inactivity_timeout = nla_get_u16( 7284 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]); 7285 } 7286 7287 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 7288 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 7289 err = -EINVAL; 7290 goto out; 7291 } 7292 params->p2p_ctwindow = 7293 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 7294 if (params->p2p_ctwindow != 0 && 7295 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) { 7296 err = -EINVAL; 7297 goto out; 7298 } 7299 } 7300 7301 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 7302 u8 tmp; 7303 7304 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 7305 err = -EINVAL; 7306 goto out; 7307 } 7308 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 7309 params->p2p_opp_ps = tmp; 7310 if (params->p2p_opp_ps != 0 && 7311 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) { 7312 err = -EINVAL; 7313 goto out; 7314 } 7315 } 7316 7317 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 7318 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 7319 ¶ms->chandef, true); 7320 if (err) 7321 goto out; 7322 } else if (wdev->valid_links) { 7323 /* with MLD need to specify the channel configuration */ 7324 err = -EINVAL; 7325 goto out; 7326 } else if (wdev->u.ap.preset_chandef.chan) { 7327 params->chandef = wdev->u.ap.preset_chandef; 7328 } else if (!nl80211_get_ap_channel(rdev, params)) { 7329 err = -EINVAL; 7330 goto out; 7331 } 7332 7333 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms->beacon, 7334 params->chandef.chan, info->extack); 7335 if (err) 7336 goto out; 7337 7338 err = nl80211_check_npca(rdev, ¶ms->chandef, wdev->iftype, 7339 info->extack); 7340 if (err) 7341 goto out; 7342 7343 beacon_check.iftype = wdev->iftype; 7344 beacon_check.relax = true; 7345 beacon_check.reg_power = 7346 cfg80211_get_6ghz_power_type(params->beacon.tail, 7347 params->beacon.tail_len, 0); 7348 if (!cfg80211_reg_check_beaconing(&rdev->wiphy, ¶ms->chandef, 7349 &beacon_check)) { 7350 err = -EINVAL; 7351 goto out; 7352 } 7353 7354 if (info->attrs[NL80211_ATTR_TX_RATES]) { 7355 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, 7356 NL80211_ATTR_TX_RATES, 7357 ¶ms->beacon_rate, 7358 dev, false, link_id); 7359 if (err) 7360 goto out; 7361 7362 err = validate_beacon_tx_rate(rdev, params->chandef.chan->band, 7363 ¶ms->beacon_rate); 7364 if (err) 7365 goto out; 7366 } 7367 7368 params->pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); 7369 if (params->pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { 7370 err = -EOPNOTSUPP; 7371 goto out; 7372 } 7373 7374 if (info->attrs[NL80211_ATTR_ACL_POLICY]) { 7375 params->acl = parse_acl_data(&rdev->wiphy, info); 7376 if (IS_ERR(params->acl)) { 7377 err = PTR_ERR(params->acl); 7378 params->acl = NULL; 7379 goto out; 7380 } 7381 } 7382 7383 params->twt_responder = 7384 nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]); 7385 7386 if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) { 7387 err = nl80211_parse_he_obss_pd( 7388 info->attrs[NL80211_ATTR_HE_OBSS_PD], 7389 ¶ms->he_obss_pd); 7390 if (err) 7391 goto out; 7392 } 7393 7394 if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) { 7395 err = nl80211_parse_fils_discovery(rdev, 7396 info->attrs[NL80211_ATTR_FILS_DISCOVERY], 7397 ¶ms->fils_discovery); 7398 if (err) 7399 goto out; 7400 } 7401 7402 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { 7403 err = nl80211_parse_unsol_bcast_probe_resp( 7404 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], 7405 ¶ms->unsol_bcast_probe_resp); 7406 if (err) 7407 goto out; 7408 } 7409 7410 if (info->attrs[NL80211_ATTR_MBSSID_CONFIG]) { 7411 err = nl80211_parse_mbssid_config(&rdev->wiphy, dev, link_id, 7412 info->attrs[NL80211_ATTR_MBSSID_CONFIG], 7413 ¶ms->mbssid_config, 7414 params->beacon.mbssid_ies ? 7415 params->beacon.mbssid_ies->cnt : 7416 0); 7417 if (err) 7418 goto out; 7419 } 7420 7421 if (!params->mbssid_config.ema && params->beacon.rnr_ies) { 7422 err = -EINVAL; 7423 goto out; 7424 } 7425 7426 if (info->attrs[NL80211_ATTR_S1G_SHORT_BEACON]) { 7427 if (!info->attrs[NL80211_ATTR_S1G_LONG_BEACON_PERIOD]) { 7428 err = -EINVAL; 7429 goto out; 7430 } 7431 7432 params->s1g_long_beacon_period = nla_get_u8( 7433 info->attrs[NL80211_ATTR_S1G_LONG_BEACON_PERIOD]); 7434 7435 err = nl80211_parse_s1g_short_beacon( 7436 rdev, info->attrs[NL80211_ATTR_S1G_SHORT_BEACON], 7437 ¶ms->s1g_short_beacon); 7438 if (err) 7439 goto out; 7440 } 7441 7442 err = nl80211_calculate_ap_capabilities(info, params); 7443 if (err) 7444 goto out; 7445 7446 if (info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]) 7447 params->flags = nla_get_u32( 7448 info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]); 7449 else if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT]) 7450 params->flags |= NL80211_AP_SETTINGS_EXTERNAL_AUTH_SUPPORT; 7451 7452 if (wdev->conn_owner_nlportid && 7453 info->attrs[NL80211_ATTR_SOCKET_OWNER] && 7454 wdev->conn_owner_nlportid != info->snd_portid) { 7455 err = -EINVAL; 7456 goto out; 7457 } 7458 7459 /* FIXME: validate MLO/link-id against driver capabilities */ 7460 7461 err = rdev_start_ap(rdev, dev, params); 7462 if (!err) { 7463 wdev->links[link_id].ap.beacon_interval = params->beacon_interval; 7464 wdev->links[link_id].ap.chandef = params->chandef; 7465 wdev->u.ap.ssid_len = params->ssid_len; 7466 memcpy(wdev->u.ap.ssid, params->ssid, 7467 params->ssid_len); 7468 7469 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 7470 wdev->conn_owner_nlportid = info->snd_portid; 7471 7472 nl80211_send_ap_started(wdev, link_id); 7473 } 7474 out: 7475 kfree(params->acl); 7476 kfree(params->beacon.mbssid_ies); 7477 if (params->mbssid_config.tx_wdev && 7478 params->mbssid_config.tx_wdev->netdev && 7479 params->mbssid_config.tx_wdev->netdev != dev) 7480 dev_put(params->mbssid_config.tx_wdev->netdev); 7481 kfree(params->beacon.rnr_ies); 7482 kfree(params); 7483 7484 return err; 7485 } 7486 7487 static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info) 7488 { 7489 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7490 struct cfg80211_beaconing_check_config beacon_check = {}; 7491 unsigned int link_id = nl80211_link_id(info->attrs); 7492 struct net_device *dev = info->user_ptr[1]; 7493 struct wireless_dev *wdev = dev->ieee80211_ptr; 7494 struct cfg80211_ap_update *params; 7495 struct nlattr *attr; 7496 int err; 7497 7498 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 7499 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 7500 return -EOPNOTSUPP; 7501 7502 if (!rdev->ops->change_beacon) 7503 return -EOPNOTSUPP; 7504 7505 if (!wdev->links[link_id].ap.beacon_interval) 7506 return -EINVAL; 7507 7508 params = kzalloc_obj(*params); 7509 if (!params) 7510 return -ENOMEM; 7511 7512 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms->beacon, 7513 wdev->links[link_id].ap.chandef.chan, 7514 info->extack); 7515 if (err) 7516 goto out; 7517 7518 /* recheck beaconing is permitted with possibly changed power type */ 7519 beacon_check.iftype = wdev->iftype; 7520 beacon_check.relax = true; 7521 beacon_check.reg_power = 7522 cfg80211_get_6ghz_power_type(params->beacon.tail, 7523 params->beacon.tail_len, 0); 7524 if (!cfg80211_reg_check_beaconing(&rdev->wiphy, 7525 &wdev->links[link_id].ap.chandef, 7526 &beacon_check)) { 7527 err = -EINVAL; 7528 goto out; 7529 } 7530 7531 attr = info->attrs[NL80211_ATTR_FILS_DISCOVERY]; 7532 if (attr) { 7533 err = nl80211_parse_fils_discovery(rdev, attr, 7534 ¶ms->fils_discovery); 7535 if (err) 7536 goto out; 7537 } 7538 7539 attr = info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]; 7540 if (attr) { 7541 err = nl80211_parse_unsol_bcast_probe_resp(rdev, attr, 7542 ¶ms->unsol_bcast_probe_resp); 7543 if (err) 7544 goto out; 7545 } 7546 7547 attr = info->attrs[NL80211_ATTR_S1G_SHORT_BEACON]; 7548 if (attr) { 7549 err = nl80211_parse_s1g_short_beacon(rdev, attr, 7550 ¶ms->s1g_short_beacon); 7551 if (err) 7552 goto out; 7553 } 7554 7555 err = rdev_change_beacon(rdev, dev, params); 7556 7557 out: 7558 kfree(params->beacon.mbssid_ies); 7559 kfree(params->beacon.rnr_ies); 7560 kfree(params); 7561 return err; 7562 } 7563 7564 static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info) 7565 { 7566 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7567 unsigned int link_id = nl80211_link_id(info->attrs); 7568 struct net_device *dev = info->user_ptr[1]; 7569 7570 return cfg80211_stop_ap(rdev, dev, link_id, false); 7571 } 7572 7573 static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = { 7574 [NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG }, 7575 [NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG }, 7576 [NL80211_STA_FLAG_WME] = { .type = NLA_FLAG }, 7577 [NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG }, 7578 [NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG }, 7579 [NL80211_STA_FLAG_TDLS_PEER] = { .type = NLA_FLAG }, 7580 }; 7581 7582 static int parse_station_flags(struct genl_info *info, 7583 enum nl80211_iftype iftype, 7584 struct station_parameters *params) 7585 { 7586 struct nlattr *flags[NL80211_STA_FLAG_MAX + 1]; 7587 struct nlattr *nla; 7588 int flag; 7589 7590 /* 7591 * Try parsing the new attribute first so userspace 7592 * can specify both for older kernels. 7593 */ 7594 nla = info->attrs[NL80211_ATTR_STA_FLAGS2]; 7595 if (nla) { 7596 struct nl80211_sta_flag_update *sta_flags; 7597 7598 sta_flags = nla_data(nla); 7599 params->sta_flags_mask = sta_flags->mask; 7600 params->sta_flags_set = sta_flags->set; 7601 params->sta_flags_set &= params->sta_flags_mask; 7602 if ((params->sta_flags_mask | 7603 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID)) 7604 return -EINVAL; 7605 7606 if ((iftype == NL80211_IFTYPE_NAN || 7607 iftype == NL80211_IFTYPE_NAN_DATA) && 7608 params->sta_flags_mask & 7609 ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) | 7610 BIT(NL80211_STA_FLAG_ASSOCIATED) | 7611 BIT(NL80211_STA_FLAG_AUTHORIZED) | 7612 BIT(NL80211_STA_FLAG_MFP))) 7613 return -EINVAL; 7614 7615 /* WME is always used in NAN */ 7616 if (iftype == NL80211_IFTYPE_NAN_DATA) { 7617 /* but don't let userspace control it */ 7618 if (params->sta_flags_mask & BIT(NL80211_STA_FLAG_WME)) 7619 return -EINVAL; 7620 7621 params->sta_flags_mask |= BIT(NL80211_STA_FLAG_WME); 7622 params->sta_flags_set |= BIT(NL80211_STA_FLAG_WME); 7623 } 7624 7625 return 0; 7626 } 7627 7628 /* if present, parse the old attribute */ 7629 7630 nla = info->attrs[NL80211_ATTR_STA_FLAGS]; 7631 if (!nla) 7632 return 0; 7633 7634 if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack)) 7635 return -EINVAL; 7636 7637 /* 7638 * Only allow certain flags for interface types so that 7639 * other attributes are silently ignored. Remember that 7640 * this is backward compatibility code with old userspace 7641 * and shouldn't be hit in other cases anyway. 7642 */ 7643 switch (iftype) { 7644 case NL80211_IFTYPE_AP: 7645 case NL80211_IFTYPE_AP_VLAN: 7646 case NL80211_IFTYPE_P2P_GO: 7647 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 7648 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 7649 BIT(NL80211_STA_FLAG_WME) | 7650 BIT(NL80211_STA_FLAG_MFP); 7651 break; 7652 case NL80211_IFTYPE_P2P_CLIENT: 7653 case NL80211_IFTYPE_STATION: 7654 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 7655 BIT(NL80211_STA_FLAG_TDLS_PEER); 7656 break; 7657 case NL80211_IFTYPE_MESH_POINT: 7658 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | 7659 BIT(NL80211_STA_FLAG_MFP) | 7660 BIT(NL80211_STA_FLAG_AUTHORIZED); 7661 break; 7662 default: 7663 return -EINVAL; 7664 } 7665 7666 for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++) { 7667 if (flags[flag]) { 7668 params->sta_flags_set |= (1<<flag); 7669 7670 /* no longer support new API additions in old API */ 7671 if (flag > NL80211_STA_FLAG_MAX_OLD_API) 7672 return -EINVAL; 7673 } 7674 } 7675 7676 return 0; 7677 } 7678 7679 bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info, int attr) 7680 { 7681 struct nlattr *rate; 7682 u32 bitrate; 7683 u16 bitrate_compat; 7684 enum nl80211_rate_info rate_flg; 7685 7686 rate = nla_nest_start_noflag(msg, attr); 7687 if (!rate) 7688 return false; 7689 7690 /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */ 7691 bitrate = cfg80211_calculate_bitrate(info); 7692 /* report 16-bit bitrate only if we can */ 7693 bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0; 7694 if (bitrate > 0 && 7695 nla_put_u32(msg, NL80211_RATE_INFO_BITRATE32, bitrate)) 7696 return false; 7697 if (bitrate_compat > 0 && 7698 nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat)) 7699 return false; 7700 7701 switch (info->bw) { 7702 case RATE_INFO_BW_1: 7703 rate_flg = NL80211_RATE_INFO_1_MHZ_WIDTH; 7704 break; 7705 case RATE_INFO_BW_2: 7706 rate_flg = NL80211_RATE_INFO_2_MHZ_WIDTH; 7707 break; 7708 case RATE_INFO_BW_4: 7709 rate_flg = NL80211_RATE_INFO_4_MHZ_WIDTH; 7710 break; 7711 case RATE_INFO_BW_5: 7712 rate_flg = NL80211_RATE_INFO_5_MHZ_WIDTH; 7713 break; 7714 case RATE_INFO_BW_8: 7715 rate_flg = NL80211_RATE_INFO_8_MHZ_WIDTH; 7716 break; 7717 case RATE_INFO_BW_10: 7718 rate_flg = NL80211_RATE_INFO_10_MHZ_WIDTH; 7719 break; 7720 case RATE_INFO_BW_16: 7721 rate_flg = NL80211_RATE_INFO_16_MHZ_WIDTH; 7722 break; 7723 default: 7724 WARN_ON(1); 7725 fallthrough; 7726 case RATE_INFO_BW_20: 7727 rate_flg = 0; 7728 break; 7729 case RATE_INFO_BW_40: 7730 rate_flg = NL80211_RATE_INFO_40_MHZ_WIDTH; 7731 break; 7732 case RATE_INFO_BW_80: 7733 rate_flg = NL80211_RATE_INFO_80_MHZ_WIDTH; 7734 break; 7735 case RATE_INFO_BW_160: 7736 rate_flg = NL80211_RATE_INFO_160_MHZ_WIDTH; 7737 break; 7738 case RATE_INFO_BW_HE_RU: 7739 rate_flg = 0; 7740 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS)); 7741 break; 7742 case RATE_INFO_BW_320: 7743 rate_flg = NL80211_RATE_INFO_320_MHZ_WIDTH; 7744 break; 7745 case RATE_INFO_BW_EHT_RU: 7746 rate_flg = 0; 7747 WARN_ON(!(info->flags & RATE_INFO_FLAGS_EHT_MCS) && 7748 !(info->flags & RATE_INFO_FLAGS_UHR_MCS)); 7749 break; 7750 } 7751 7752 if (rate_flg && nla_put_flag(msg, rate_flg)) 7753 return false; 7754 7755 if (info->flags & RATE_INFO_FLAGS_MCS) { 7756 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) 7757 return false; 7758 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 7759 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 7760 return false; 7761 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) { 7762 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs)) 7763 return false; 7764 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) 7765 return false; 7766 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 7767 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 7768 return false; 7769 } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) { 7770 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs)) 7771 return false; 7772 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss)) 7773 return false; 7774 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi)) 7775 return false; 7776 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm)) 7777 return false; 7778 if (info->bw == RATE_INFO_BW_HE_RU && 7779 nla_put_u8(msg, NL80211_RATE_INFO_HE_RU_ALLOC, 7780 info->he_ru_alloc)) 7781 return false; 7782 } else if (info->flags & RATE_INFO_FLAGS_S1G_MCS) { 7783 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_MCS, info->mcs)) 7784 return false; 7785 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_NSS, info->nss)) 7786 return false; 7787 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 7788 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 7789 return false; 7790 } else if (info->flags & RATE_INFO_FLAGS_EHT_MCS) { 7791 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_MCS, info->mcs)) 7792 return false; 7793 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_NSS, info->nss)) 7794 return false; 7795 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_GI, info->eht_gi)) 7796 return false; 7797 if (info->bw == RATE_INFO_BW_EHT_RU && 7798 nla_put_u8(msg, NL80211_RATE_INFO_EHT_RU_ALLOC, 7799 info->eht_ru_alloc)) 7800 return false; 7801 } else if (info->flags & RATE_INFO_FLAGS_UHR_MCS) { 7802 if (nla_put_u8(msg, NL80211_RATE_INFO_UHR_MCS, info->mcs)) 7803 return false; 7804 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_NSS, info->nss)) 7805 return false; 7806 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_GI, info->eht_gi)) 7807 return false; 7808 if (info->bw == RATE_INFO_BW_EHT_RU && 7809 nla_put_u8(msg, NL80211_RATE_INFO_EHT_RU_ALLOC, 7810 info->eht_ru_alloc)) 7811 return false; 7812 if (info->flags & RATE_INFO_FLAGS_UHR_ELR_MCS && 7813 nla_put_flag(msg, NL80211_RATE_INFO_UHR_ELR)) 7814 return false; 7815 if (info->flags & RATE_INFO_FLAGS_UHR_IM && 7816 nla_put_flag(msg, NL80211_RATE_INFO_UHR_IM)) 7817 return false; 7818 } 7819 7820 nla_nest_end(msg, rate); 7821 return true; 7822 } 7823 7824 static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal, 7825 int id) 7826 { 7827 void *attr; 7828 int i = 0; 7829 7830 if (!mask) 7831 return true; 7832 7833 attr = nla_nest_start_noflag(msg, id); 7834 if (!attr) 7835 return false; 7836 7837 for (i = 0; i < IEEE80211_MAX_CHAINS; i++) { 7838 if (!(mask & BIT(i))) 7839 continue; 7840 7841 if (nla_put_u8(msg, i, signal[i])) 7842 return false; 7843 } 7844 7845 nla_nest_end(msg, attr); 7846 7847 return true; 7848 } 7849 7850 static int nl80211_fill_link_station(struct sk_buff *msg, 7851 struct cfg80211_registered_device *rdev, 7852 struct link_station_info *link_sinfo) 7853 { 7854 struct nlattr *bss_param, *link_sinfoattr; 7855 7856 #define PUT_LINK_SINFO(attr, memb, type) do { \ 7857 BUILD_BUG_ON(sizeof(type) == sizeof(u64)); \ 7858 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 7859 nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr, \ 7860 link_sinfo->memb)) \ 7861 goto nla_put_failure; \ 7862 } while (0) 7863 #define PUT_LINK_SINFO_U64(attr, memb) do { \ 7864 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 7865 nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr, \ 7866 link_sinfo->memb, NL80211_STA_INFO_PAD)) \ 7867 goto nla_put_failure; \ 7868 } while (0) 7869 7870 link_sinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_STA_INFO); 7871 if (!link_sinfoattr) 7872 goto nla_put_failure; 7873 7874 PUT_LINK_SINFO(INACTIVE_TIME, inactive_time, u32); 7875 7876 if (link_sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | 7877 BIT_ULL(NL80211_STA_INFO_RX_BYTES64)) && 7878 nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES, 7879 (u32)link_sinfo->rx_bytes)) 7880 goto nla_put_failure; 7881 7882 if (link_sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | 7883 BIT_ULL(NL80211_STA_INFO_TX_BYTES64)) && 7884 nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES, 7885 (u32)link_sinfo->tx_bytes)) 7886 goto nla_put_failure; 7887 7888 PUT_LINK_SINFO_U64(RX_BYTES64, rx_bytes); 7889 PUT_LINK_SINFO_U64(TX_BYTES64, tx_bytes); 7890 PUT_LINK_SINFO_U64(RX_DURATION, rx_duration); 7891 PUT_LINK_SINFO_U64(TX_DURATION, tx_duration); 7892 7893 if (wiphy_ext_feature_isset(&rdev->wiphy, 7894 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 7895 PUT_LINK_SINFO(AIRTIME_WEIGHT, airtime_weight, u16); 7896 7897 switch (rdev->wiphy.signal_type) { 7898 case CFG80211_SIGNAL_TYPE_MBM: 7899 PUT_LINK_SINFO(SIGNAL, signal, u8); 7900 PUT_LINK_SINFO(SIGNAL_AVG, signal_avg, u8); 7901 break; 7902 default: 7903 break; 7904 } 7905 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { 7906 if (!nl80211_put_signal(msg, link_sinfo->chains, 7907 link_sinfo->chain_signal, 7908 NL80211_STA_INFO_CHAIN_SIGNAL)) 7909 goto nla_put_failure; 7910 } 7911 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { 7912 if (!nl80211_put_signal(msg, link_sinfo->chains, 7913 link_sinfo->chain_signal_avg, 7914 NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) 7915 goto nla_put_failure; 7916 } 7917 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { 7918 if (!nl80211_put_sta_rate(msg, &link_sinfo->txrate, 7919 NL80211_STA_INFO_TX_BITRATE)) 7920 goto nla_put_failure; 7921 } 7922 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { 7923 if (!nl80211_put_sta_rate(msg, &link_sinfo->rxrate, 7924 NL80211_STA_INFO_RX_BITRATE)) 7925 goto nla_put_failure; 7926 } 7927 7928 PUT_LINK_SINFO(RX_PACKETS, rx_packets, u32); 7929 PUT_LINK_SINFO(TX_PACKETS, tx_packets, u32); 7930 PUT_LINK_SINFO(TX_RETRIES, tx_retries, u32); 7931 PUT_LINK_SINFO(TX_FAILED, tx_failed, u32); 7932 PUT_LINK_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32); 7933 PUT_LINK_SINFO(BEACON_LOSS, beacon_loss_count, u32); 7934 7935 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { 7936 bss_param = nla_nest_start_noflag(msg, 7937 NL80211_STA_INFO_BSS_PARAM); 7938 if (!bss_param) 7939 goto nla_put_failure; 7940 7941 if (((link_sinfo->bss_param.flags & 7942 BSS_PARAM_FLAGS_CTS_PROT) && 7943 nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) || 7944 ((link_sinfo->bss_param.flags & 7945 BSS_PARAM_FLAGS_SHORT_PREAMBLE) && 7946 nla_put_flag(msg, 7947 NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) || 7948 ((link_sinfo->bss_param.flags & 7949 BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && 7950 nla_put_flag(msg, 7951 NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) || 7952 nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD, 7953 link_sinfo->bss_param.dtim_period) || 7954 nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL, 7955 link_sinfo->bss_param.beacon_interval)) 7956 goto nla_put_failure; 7957 7958 nla_nest_end(msg, bss_param); 7959 } 7960 7961 PUT_LINK_SINFO_U64(RX_DROP_MISC, rx_dropped_misc); 7962 PUT_LINK_SINFO_U64(BEACON_RX, rx_beacon); 7963 PUT_LINK_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8); 7964 PUT_LINK_SINFO(RX_MPDUS, rx_mpdu_count, u32); 7965 PUT_LINK_SINFO(FCS_ERROR_COUNT, fcs_err_count, u32); 7966 if (wiphy_ext_feature_isset(&rdev->wiphy, 7967 NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT)) { 7968 PUT_LINK_SINFO(ACK_SIGNAL, ack_signal, u8); 7969 PUT_LINK_SINFO(ACK_SIGNAL_AVG, avg_ack_signal, s8); 7970 } 7971 7972 #undef PUT_LINK_SINFO 7973 #undef PUT_LINK_SINFO_U64 7974 7975 if (link_sinfo->pertid) { 7976 struct nlattr *tidsattr; 7977 int tid; 7978 7979 tidsattr = nla_nest_start_noflag(msg, 7980 NL80211_STA_INFO_TID_STATS); 7981 if (!tidsattr) 7982 goto nla_put_failure; 7983 7984 for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) { 7985 struct cfg80211_tid_stats *tidstats; 7986 struct nlattr *tidattr; 7987 7988 tidstats = &link_sinfo->pertid[tid]; 7989 7990 if (!tidstats->filled) 7991 continue; 7992 7993 tidattr = nla_nest_start_noflag(msg, tid + 1); 7994 if (!tidattr) 7995 goto nla_put_failure; 7996 7997 #define PUT_TIDVAL_U64(attr, memb) do { \ 7998 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ 7999 nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr, \ 8000 tidstats->memb, NL80211_TID_STATS_PAD)) \ 8001 goto nla_put_failure; \ 8002 } while (0) 8003 8004 PUT_TIDVAL_U64(RX_MSDU, rx_msdu); 8005 PUT_TIDVAL_U64(TX_MSDU, tx_msdu); 8006 PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries); 8007 PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed); 8008 8009 #undef PUT_TIDVAL_U64 8010 if ((tidstats->filled & 8011 BIT(NL80211_TID_STATS_TXQ_STATS)) && 8012 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, 8013 NL80211_TID_STATS_TXQ_STATS)) 8014 goto nla_put_failure; 8015 8016 nla_nest_end(msg, tidattr); 8017 } 8018 8019 nla_nest_end(msg, tidsattr); 8020 } 8021 8022 nla_nest_end(msg, link_sinfoattr); 8023 return 0; 8024 8025 nla_put_failure: 8026 return -EMSGSIZE; 8027 } 8028 8029 static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid, 8030 u32 seq, int flags, 8031 struct cfg80211_registered_device *rdev, 8032 struct wireless_dev *wdev, 8033 const u8 *mac_addr, struct station_info *sinfo, 8034 bool link_stats) 8035 { 8036 void *hdr; 8037 struct nlattr *sinfoattr, *bss_param; 8038 struct link_station_info *link_sinfo; 8039 struct nlattr *links, *link; 8040 int link_id; 8041 8042 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 8043 if (!hdr) { 8044 cfg80211_sinfo_release_content(sinfo); 8045 return -1; 8046 } 8047 8048 if ((wdev->netdev && 8049 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) || 8050 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 8051 NL80211_ATTR_PAD) || 8052 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 8053 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation)) 8054 goto nla_put_failure; 8055 8056 sinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_STA_INFO); 8057 if (!sinfoattr) 8058 goto nla_put_failure; 8059 8060 #define PUT_SINFO(attr, memb, type) do { \ 8061 BUILD_BUG_ON(sizeof(type) == sizeof(u64)); \ 8062 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 8063 nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr, \ 8064 sinfo->memb)) \ 8065 goto nla_put_failure; \ 8066 } while (0) 8067 #define PUT_SINFO_U64(attr, memb) do { \ 8068 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 8069 nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr, \ 8070 sinfo->memb, NL80211_STA_INFO_PAD)) \ 8071 goto nla_put_failure; \ 8072 } while (0) 8073 8074 PUT_SINFO(CONNECTED_TIME, connected_time, u32); 8075 PUT_SINFO(INACTIVE_TIME, inactive_time, u32); 8076 PUT_SINFO_U64(ASSOC_AT_BOOTTIME, assoc_at); 8077 8078 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | 8079 BIT_ULL(NL80211_STA_INFO_RX_BYTES64)) && 8080 nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES, 8081 (u32)sinfo->rx_bytes)) 8082 goto nla_put_failure; 8083 8084 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | 8085 BIT_ULL(NL80211_STA_INFO_TX_BYTES64)) && 8086 nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES, 8087 (u32)sinfo->tx_bytes)) 8088 goto nla_put_failure; 8089 8090 PUT_SINFO_U64(RX_BYTES64, rx_bytes); 8091 PUT_SINFO_U64(TX_BYTES64, tx_bytes); 8092 PUT_SINFO_U64(RX_DURATION, rx_duration); 8093 PUT_SINFO_U64(TX_DURATION, tx_duration); 8094 8095 if (wiphy_ext_feature_isset(&rdev->wiphy, 8096 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 8097 PUT_SINFO(AIRTIME_WEIGHT, airtime_weight, u16); 8098 8099 switch (rdev->wiphy.signal_type) { 8100 case CFG80211_SIGNAL_TYPE_MBM: 8101 PUT_SINFO(SIGNAL, signal, u8); 8102 PUT_SINFO(SIGNAL_AVG, signal_avg, u8); 8103 break; 8104 default: 8105 break; 8106 } 8107 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { 8108 if (!nl80211_put_signal(msg, sinfo->chains, 8109 sinfo->chain_signal, 8110 NL80211_STA_INFO_CHAIN_SIGNAL)) 8111 goto nla_put_failure; 8112 } 8113 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { 8114 if (!nl80211_put_signal(msg, sinfo->chains, 8115 sinfo->chain_signal_avg, 8116 NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) 8117 goto nla_put_failure; 8118 } 8119 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { 8120 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, 8121 NL80211_STA_INFO_TX_BITRATE)) 8122 goto nla_put_failure; 8123 } 8124 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { 8125 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, 8126 NL80211_STA_INFO_RX_BITRATE)) 8127 goto nla_put_failure; 8128 } 8129 8130 PUT_SINFO(RX_PACKETS, rx_packets, u32); 8131 PUT_SINFO(TX_PACKETS, tx_packets, u32); 8132 PUT_SINFO(TX_RETRIES, tx_retries, u32); 8133 PUT_SINFO(TX_FAILED, tx_failed, u32); 8134 PUT_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32); 8135 PUT_SINFO(BEACON_LOSS, beacon_loss_count, u32); 8136 8137 PUT_SINFO(LLID, llid, u16); 8138 PUT_SINFO(PLID, plid, u16); 8139 PUT_SINFO(PLINK_STATE, plink_state, u8); 8140 PUT_SINFO(AIRTIME_LINK_METRIC, airtime_link_metric, u32); 8141 PUT_SINFO(LOCAL_PM, local_pm, u32); 8142 PUT_SINFO(PEER_PM, peer_pm, u32); 8143 PUT_SINFO(NONPEER_PM, nonpeer_pm, u32); 8144 PUT_SINFO(CONNECTED_TO_GATE, connected_to_gate, u8); 8145 PUT_SINFO(CONNECTED_TO_AS, connected_to_as, u8); 8146 PUT_SINFO_U64(T_OFFSET, t_offset); 8147 8148 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { 8149 bss_param = nla_nest_start_noflag(msg, 8150 NL80211_STA_INFO_BSS_PARAM); 8151 if (!bss_param) 8152 goto nla_put_failure; 8153 8154 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) && 8155 nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) || 8156 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) && 8157 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) || 8158 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && 8159 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) || 8160 nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD, 8161 sinfo->bss_param.dtim_period) || 8162 nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL, 8163 sinfo->bss_param.beacon_interval)) 8164 goto nla_put_failure; 8165 8166 nla_nest_end(msg, bss_param); 8167 } 8168 if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) && 8169 nla_put(msg, NL80211_STA_INFO_STA_FLAGS, 8170 sizeof(struct nl80211_sta_flag_update), 8171 &sinfo->sta_flags)) 8172 goto nla_put_failure; 8173 8174 PUT_SINFO_U64(RX_DROP_MISC, rx_dropped_misc); 8175 PUT_SINFO_U64(BEACON_RX, rx_beacon); 8176 PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8); 8177 PUT_SINFO(RX_MPDUS, rx_mpdu_count, u32); 8178 PUT_SINFO(FCS_ERROR_COUNT, fcs_err_count, u32); 8179 if (wiphy_ext_feature_isset(&rdev->wiphy, 8180 NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT)) { 8181 PUT_SINFO(ACK_SIGNAL, ack_signal, u8); 8182 PUT_SINFO(ACK_SIGNAL_AVG, avg_ack_signal, s8); 8183 } 8184 8185 #undef PUT_SINFO 8186 #undef PUT_SINFO_U64 8187 8188 if (sinfo->pertid) { 8189 struct nlattr *tidsattr; 8190 int tid; 8191 8192 tidsattr = nla_nest_start_noflag(msg, 8193 NL80211_STA_INFO_TID_STATS); 8194 if (!tidsattr) 8195 goto nla_put_failure; 8196 8197 for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) { 8198 struct cfg80211_tid_stats *tidstats; 8199 struct nlattr *tidattr; 8200 8201 tidstats = &sinfo->pertid[tid]; 8202 8203 if (!tidstats->filled) 8204 continue; 8205 8206 tidattr = nla_nest_start_noflag(msg, tid + 1); 8207 if (!tidattr) 8208 goto nla_put_failure; 8209 8210 #define PUT_TIDVAL_U64(attr, memb) do { \ 8211 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ 8212 nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr, \ 8213 tidstats->memb, NL80211_TID_STATS_PAD)) \ 8214 goto nla_put_failure; \ 8215 } while (0) 8216 8217 PUT_TIDVAL_U64(RX_MSDU, rx_msdu); 8218 PUT_TIDVAL_U64(TX_MSDU, tx_msdu); 8219 PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries); 8220 PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed); 8221 8222 #undef PUT_TIDVAL_U64 8223 if ((tidstats->filled & 8224 BIT(NL80211_TID_STATS_TXQ_STATS)) && 8225 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, 8226 NL80211_TID_STATS_TXQ_STATS)) 8227 goto nla_put_failure; 8228 8229 nla_nest_end(msg, tidattr); 8230 } 8231 8232 nla_nest_end(msg, tidsattr); 8233 } 8234 8235 nla_nest_end(msg, sinfoattr); 8236 8237 if (sinfo->assoc_req_ies_len && 8238 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, 8239 sinfo->assoc_req_ies)) 8240 goto nla_put_failure; 8241 8242 if (sinfo->assoc_resp_ies_len && 8243 nla_put(msg, NL80211_ATTR_RESP_IE, sinfo->assoc_resp_ies_len, 8244 sinfo->assoc_resp_ies)) 8245 goto nla_put_failure; 8246 8247 if (sinfo->mlo_params_valid) { 8248 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, 8249 sinfo->assoc_link_id)) 8250 goto nla_put_failure; 8251 8252 if (!is_zero_ether_addr(sinfo->mld_addr) && 8253 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, 8254 sinfo->mld_addr)) 8255 goto nla_put_failure; 8256 } 8257 8258 if (link_stats && sinfo->valid_links) { 8259 links = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 8260 if (!links) 8261 goto nla_put_failure; 8262 8263 for_each_valid_link(sinfo, link_id) { 8264 link_sinfo = sinfo->links[link_id]; 8265 8266 if (WARN_ON_ONCE(!link_sinfo)) 8267 continue; 8268 8269 if (!is_valid_ether_addr(link_sinfo->addr)) 8270 continue; 8271 8272 link = nla_nest_start(msg, link_id + 1); 8273 if (!link) 8274 goto nla_put_failure; 8275 8276 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, 8277 link_id)) 8278 goto nla_put_failure; 8279 8280 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 8281 link_sinfo->addr)) 8282 goto nla_put_failure; 8283 8284 if (nl80211_fill_link_station(msg, rdev, link_sinfo)) 8285 goto nla_put_failure; 8286 8287 nla_nest_end(msg, link); 8288 } 8289 nla_nest_end(msg, links); 8290 } 8291 8292 cfg80211_sinfo_release_content(sinfo); 8293 genlmsg_end(msg, hdr); 8294 return 0; 8295 8296 nla_put_failure: 8297 cfg80211_sinfo_release_content(sinfo); 8298 genlmsg_cancel(msg, hdr); 8299 return -EMSGSIZE; 8300 } 8301 8302 static void cfg80211_sta_set_mld_sinfo(struct station_info *sinfo) 8303 { 8304 struct link_station_info *link_sinfo; 8305 int link_id, init = 0; 8306 u32 link_inactive_time; 8307 8308 sinfo->signal = -99; 8309 8310 for_each_valid_link(sinfo, link_id) { 8311 link_sinfo = sinfo->links[link_id]; 8312 if (!link_sinfo) 8313 continue; 8314 8315 if ((link_sinfo->filled & 8316 BIT_ULL(NL80211_STA_INFO_TX_PACKETS))) { 8317 sinfo->tx_packets += link_sinfo->tx_packets; 8318 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS); 8319 } 8320 8321 if ((link_sinfo->filled & 8322 BIT_ULL(NL80211_STA_INFO_RX_PACKETS))) { 8323 sinfo->rx_packets += link_sinfo->rx_packets; 8324 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS); 8325 } 8326 8327 if (link_sinfo->filled & 8328 (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | 8329 BIT_ULL(NL80211_STA_INFO_TX_BYTES64))) { 8330 sinfo->tx_bytes += link_sinfo->tx_bytes; 8331 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES); 8332 } 8333 8334 if (link_sinfo->filled & 8335 (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | 8336 BIT_ULL(NL80211_STA_INFO_TX_BYTES64))) { 8337 sinfo->rx_bytes += link_sinfo->rx_bytes; 8338 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES); 8339 } 8340 8341 if (link_sinfo->filled & 8342 BIT_ULL(NL80211_STA_INFO_TX_RETRIES)) { 8343 sinfo->tx_retries += link_sinfo->tx_retries; 8344 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES); 8345 } 8346 8347 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_FAILED)) { 8348 sinfo->tx_failed += link_sinfo->tx_failed; 8349 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED); 8350 } 8351 8352 if (link_sinfo->filled & 8353 BIT_ULL(NL80211_STA_INFO_RX_DROP_MISC)) { 8354 sinfo->rx_dropped_misc += link_sinfo->rx_dropped_misc; 8355 sinfo->filled |= 8356 BIT_ULL(NL80211_STA_INFO_RX_DROP_MISC); 8357 } 8358 8359 if (link_sinfo->filled & 8360 BIT_ULL(NL80211_STA_INFO_BEACON_LOSS)) { 8361 sinfo->beacon_loss_count += 8362 link_sinfo->beacon_loss_count; 8363 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_LOSS); 8364 } 8365 8366 if (link_sinfo->filled & 8367 BIT_ULL(NL80211_STA_INFO_EXPECTED_THROUGHPUT)) { 8368 sinfo->expected_throughput += 8369 link_sinfo->expected_throughput; 8370 sinfo->filled |= 8371 BIT_ULL(NL80211_STA_INFO_EXPECTED_THROUGHPUT); 8372 } 8373 8374 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_MPDUS)) { 8375 sinfo->rx_mpdu_count += link_sinfo->rx_mpdu_count; 8376 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_MPDUS); 8377 } 8378 8379 if (link_sinfo->filled & 8380 BIT_ULL(NL80211_STA_INFO_FCS_ERROR_COUNT)) { 8381 sinfo->fcs_err_count += link_sinfo->fcs_err_count; 8382 sinfo->filled |= 8383 BIT_ULL(NL80211_STA_INFO_FCS_ERROR_COUNT); 8384 } 8385 8386 if (link_sinfo->filled & 8387 BIT_ULL(NL80211_STA_INFO_BEACON_RX)) { 8388 sinfo->rx_beacon += link_sinfo->rx_beacon; 8389 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_RX); 8390 } 8391 8392 /* Update MLO signal, signal_avg as best among links */ 8393 if ((link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_SIGNAL)) && 8394 link_sinfo->signal > sinfo->signal) { 8395 sinfo->signal = link_sinfo->signal; 8396 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL); 8397 } 8398 8399 if ((link_sinfo->filled & 8400 BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG)) && 8401 link_sinfo->signal_avg > sinfo->signal_avg) { 8402 sinfo->signal_avg = link_sinfo->signal_avg; 8403 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG); 8404 } 8405 8406 /* Update MLO inactive_time, bss_param based on least 8407 * value for corresponding field of link. 8408 */ 8409 if ((link_sinfo->filled & 8410 BIT_ULL(NL80211_STA_INFO_INACTIVE_TIME)) && 8411 (!init || 8412 link_inactive_time > link_sinfo->inactive_time)) { 8413 link_inactive_time = link_sinfo->inactive_time; 8414 sinfo->inactive_time = link_sinfo->inactive_time; 8415 sinfo->filled |= NL80211_STA_INFO_INACTIVE_TIME; 8416 } 8417 8418 if (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM) && 8419 (!init || 8420 sinfo->bss_param.dtim_period > 8421 link_sinfo->bss_param.dtim_period)) { 8422 sinfo->bss_param.dtim_period = 8423 link_sinfo->bss_param.dtim_period; 8424 sinfo->filled |= NL80211_STA_BSS_PARAM_DTIM_PERIOD; 8425 sinfo->bss_param.beacon_interval = 8426 link_sinfo->bss_param.beacon_interval; 8427 sinfo->filled |= NL80211_STA_BSS_PARAM_BEACON_INTERVAL; 8428 } 8429 8430 /* Update MLO rates as per last updated link rate */ 8431 if ((link_sinfo->filled & 8432 BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) && 8433 (!init || 8434 link_inactive_time > link_sinfo->inactive_time)) { 8435 sinfo->txrate = link_sinfo->txrate; 8436 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 8437 } 8438 if ((link_sinfo->filled & 8439 BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) && 8440 (!init || 8441 link_inactive_time > link_sinfo->inactive_time)) { 8442 sinfo->rxrate = link_sinfo->rxrate; 8443 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE); 8444 } 8445 8446 if (link_sinfo->filled & 8447 BIT_ULL(NL80211_STA_INFO_TX_DURATION) && 8448 (!init || 8449 link_inactive_time > link_sinfo->inactive_time)) { 8450 sinfo->tx_duration += link_sinfo->tx_duration; 8451 sinfo->filled |= 8452 BIT_ULL(NL80211_STA_INFO_TX_DURATION); 8453 } 8454 if (link_sinfo->filled & 8455 BIT_ULL(NL80211_STA_INFO_RX_DURATION) && 8456 (!init || 8457 link_inactive_time > link_sinfo->inactive_time)) { 8458 sinfo->rx_duration += link_sinfo->rx_duration; 8459 sinfo->filled |= 8460 BIT_ULL(NL80211_STA_INFO_RX_DURATION); 8461 } 8462 init++; 8463 8464 /* pertid stats accumulate for rx/tx fields */ 8465 if (sinfo->pertid) { 8466 sinfo->pertid->rx_msdu += 8467 link_sinfo->pertid->rx_msdu; 8468 sinfo->pertid->tx_msdu += 8469 link_sinfo->pertid->tx_msdu; 8470 sinfo->pertid->tx_msdu_retries += 8471 link_sinfo->pertid->tx_msdu_retries; 8472 sinfo->pertid->tx_msdu_failed += 8473 link_sinfo->pertid->tx_msdu_failed; 8474 8475 sinfo->pertid->filled |= 8476 BIT(NL80211_TID_STATS_RX_MSDU) | 8477 BIT(NL80211_TID_STATS_TX_MSDU) | 8478 BIT(NL80211_TID_STATS_TX_MSDU_RETRIES) | 8479 BIT(NL80211_TID_STATS_TX_MSDU_FAILED); 8480 } 8481 } 8482 8483 /* Reset sinfo->filled bits to exclude fields which don't make 8484 * much sense at the MLO level. 8485 */ 8486 sinfo->filled &= ~BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL); 8487 sinfo->filled &= ~BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG); 8488 } 8489 8490 static int nl80211_dump_station(struct sk_buff *skb, 8491 struct netlink_callback *cb) 8492 { 8493 struct station_info sinfo; 8494 struct cfg80211_registered_device *rdev; 8495 struct wireless_dev *wdev; 8496 u8 mac_addr[ETH_ALEN]; 8497 int sta_idx = cb->args[2]; 8498 bool sinfo_alloc = false; 8499 int err, i; 8500 8501 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL); 8502 if (err) 8503 return err; 8504 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 8505 __acquire(&rdev->wiphy.mtx); 8506 8507 if (!wdev->netdev && wdev->iftype != NL80211_IFTYPE_NAN) { 8508 err = -EINVAL; 8509 goto out_err; 8510 } 8511 8512 if (!rdev->ops->dump_station) { 8513 err = -EOPNOTSUPP; 8514 goto out_err; 8515 } 8516 8517 while (1) { 8518 memset(&sinfo, 0, sizeof(sinfo)); 8519 8520 for (i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) { 8521 sinfo.links[i] = 8522 kzalloc_obj(*sinfo.links[0]); 8523 if (!sinfo.links[i]) { 8524 err = -ENOMEM; 8525 goto out_err; 8526 } 8527 sinfo_alloc = true; 8528 } 8529 8530 err = rdev_dump_station(rdev, wdev, sta_idx, 8531 mac_addr, &sinfo); 8532 if (err == -ENOENT) 8533 break; 8534 if (err) 8535 goto out_err; 8536 8537 if (sinfo.valid_links) 8538 cfg80211_sta_set_mld_sinfo(&sinfo); 8539 8540 /* reset the sinfo_alloc flag as nl80211_send_station() 8541 * always releases sinfo 8542 */ 8543 sinfo_alloc = false; 8544 8545 if (nl80211_send_station(skb, NL80211_CMD_NEW_STATION, 8546 NETLINK_CB(cb->skb).portid, 8547 cb->nlh->nlmsg_seq, NLM_F_MULTI, 8548 rdev, wdev, mac_addr, 8549 &sinfo, false) < 0) 8550 goto out; 8551 8552 sta_idx++; 8553 } 8554 8555 out: 8556 cb->args[2] = sta_idx; 8557 err = skb->len; 8558 out_err: 8559 if (sinfo_alloc) 8560 cfg80211_sinfo_release_content(&sinfo); 8561 wiphy_unlock(&rdev->wiphy); 8562 8563 return err; 8564 } 8565 8566 static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info) 8567 { 8568 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8569 struct wireless_dev *wdev = info->user_ptr[1]; 8570 struct station_info sinfo; 8571 struct sk_buff *msg; 8572 u8 *mac_addr = NULL; 8573 int err, i; 8574 8575 memset(&sinfo, 0, sizeof(sinfo)); 8576 8577 if (!wdev->netdev) 8578 return -EINVAL; 8579 8580 if (!info->attrs[NL80211_ATTR_MAC]) 8581 return -EINVAL; 8582 8583 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 8584 8585 if (!rdev->ops->get_station) 8586 return -EOPNOTSUPP; 8587 8588 for (i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) { 8589 sinfo.links[i] = kzalloc_obj(*sinfo.links[0]); 8590 if (!sinfo.links[i]) { 8591 cfg80211_sinfo_release_content(&sinfo); 8592 return -ENOMEM; 8593 } 8594 } 8595 8596 err = rdev_get_station(rdev, wdev, mac_addr, &sinfo); 8597 if (err) { 8598 cfg80211_sinfo_release_content(&sinfo); 8599 return err; 8600 } 8601 8602 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 8603 if (!msg) { 8604 cfg80211_sinfo_release_content(&sinfo); 8605 return -ENOMEM; 8606 } 8607 8608 if (sinfo.valid_links) 8609 cfg80211_sta_set_mld_sinfo(&sinfo); 8610 8611 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 8612 info->snd_portid, info->snd_seq, 0, 8613 rdev, wdev, mac_addr, &sinfo, false) < 0) { 8614 nlmsg_free(msg); 8615 return -ENOBUFS; 8616 } 8617 8618 return genlmsg_reply(msg, info); 8619 } 8620 8621 int cfg80211_check_station_change(struct wiphy *wiphy, 8622 struct station_parameters *params, 8623 enum cfg80211_station_type statype) 8624 { 8625 if (params->listen_interval != -1 && 8626 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 8627 return -EINVAL; 8628 8629 if (params->support_p2p_ps != -1 && 8630 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 8631 return -EINVAL; 8632 8633 if (params->aid && 8634 !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) && 8635 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 8636 return -EINVAL; 8637 8638 /* When you run into this, adjust the code below for the new flag */ 8639 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 8); 8640 8641 switch (statype) { 8642 case CFG80211_STA_MESH_PEER_KERNEL: 8643 case CFG80211_STA_MESH_PEER_USER: 8644 /* 8645 * No ignoring the TDLS flag here -- the userspace mesh 8646 * code doesn't have the bug of including TDLS in the 8647 * mask everywhere. 8648 */ 8649 if (params->sta_flags_mask & 8650 ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) | 8651 BIT(NL80211_STA_FLAG_MFP) | 8652 BIT(NL80211_STA_FLAG_AUTHORIZED))) 8653 return -EINVAL; 8654 break; 8655 case CFG80211_STA_TDLS_PEER_SETUP: 8656 case CFG80211_STA_TDLS_PEER_ACTIVE: 8657 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 8658 return -EINVAL; 8659 /* ignore since it can't change */ 8660 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 8661 break; 8662 default: 8663 /* disallow mesh-specific things */ 8664 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) 8665 return -EINVAL; 8666 if (params->local_pm) 8667 return -EINVAL; 8668 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) 8669 return -EINVAL; 8670 } 8671 8672 if (statype != CFG80211_STA_TDLS_PEER_SETUP && 8673 statype != CFG80211_STA_TDLS_PEER_ACTIVE) { 8674 /* TDLS can't be set, ... */ 8675 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) 8676 return -EINVAL; 8677 /* 8678 * ... but don't bother the driver with it. This works around 8679 * a hostapd/wpa_supplicant issue -- it always includes the 8680 * TLDS_PEER flag in the mask even for AP mode. 8681 */ 8682 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 8683 } 8684 8685 if (statype != CFG80211_STA_TDLS_PEER_SETUP && 8686 statype != CFG80211_STA_AP_CLIENT_UNASSOC) { 8687 /* reject other things that can't change */ 8688 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) 8689 return -EINVAL; 8690 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) 8691 return -EINVAL; 8692 if (params->link_sta_params.supported_rates) 8693 return -EINVAL; 8694 if (statype != CFG80211_STA_NAN_MGMT && 8695 (params->link_sta_params.ht_capa || 8696 params->link_sta_params.vht_capa || 8697 params->link_sta_params.he_capa)) 8698 return -EINVAL; 8699 if (params->ext_capab || params->link_sta_params.eht_capa || 8700 params->link_sta_params.uhr_capa) 8701 return -EINVAL; 8702 if (params->sta_flags_mask & BIT(NL80211_STA_FLAG_SPP_AMSDU)) 8703 return -EINVAL; 8704 } 8705 8706 if (statype != CFG80211_STA_AP_CLIENT && 8707 statype != CFG80211_STA_AP_CLIENT_UNASSOC) { 8708 if (params->vlan) 8709 return -EINVAL; 8710 } 8711 8712 /* Accept EMLSR capabilities only for AP client before association */ 8713 if (statype != CFG80211_STA_AP_CLIENT_UNASSOC && 8714 params->eml_cap_present) 8715 return -EINVAL; 8716 8717 switch (statype) { 8718 case CFG80211_STA_AP_MLME_CLIENT: 8719 /* Use this only for authorizing/unauthorizing a station */ 8720 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) 8721 return -EOPNOTSUPP; 8722 break; 8723 case CFG80211_STA_AP_CLIENT: 8724 case CFG80211_STA_AP_CLIENT_UNASSOC: 8725 /* accept only the listed bits */ 8726 if (params->sta_flags_mask & 8727 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 8728 BIT(NL80211_STA_FLAG_AUTHENTICATED) | 8729 BIT(NL80211_STA_FLAG_ASSOCIATED) | 8730 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 8731 BIT(NL80211_STA_FLAG_WME) | 8732 BIT(NL80211_STA_FLAG_MFP) | 8733 BIT(NL80211_STA_FLAG_SPP_AMSDU))) 8734 return -EINVAL; 8735 8736 /* but authenticated/associated only if driver handles it */ 8737 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 8738 params->sta_flags_mask & 8739 (BIT(NL80211_STA_FLAG_AUTHENTICATED) | 8740 BIT(NL80211_STA_FLAG_ASSOCIATED))) 8741 return -EINVAL; 8742 break; 8743 case CFG80211_STA_IBSS: 8744 case CFG80211_STA_AP_STA: 8745 /* reject any changes other than AUTHORIZED */ 8746 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) 8747 return -EINVAL; 8748 break; 8749 case CFG80211_STA_TDLS_PEER_SETUP: 8750 /* reject any changes other than AUTHORIZED or WME */ 8751 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 8752 BIT(NL80211_STA_FLAG_WME))) 8753 return -EINVAL; 8754 /* force (at least) rates when authorizing */ 8755 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) && 8756 !params->link_sta_params.supported_rates) 8757 return -EINVAL; 8758 break; 8759 case CFG80211_STA_TDLS_PEER_ACTIVE: 8760 /* reject any changes */ 8761 return -EINVAL; 8762 case CFG80211_STA_MESH_PEER_KERNEL: 8763 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) 8764 return -EINVAL; 8765 break; 8766 case CFG80211_STA_MESH_PEER_USER: 8767 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION && 8768 params->plink_action != NL80211_PLINK_ACTION_BLOCK) 8769 return -EINVAL; 8770 break; 8771 case CFG80211_STA_NAN_MGMT: 8772 if (params->sta_flags_mask & 8773 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 8774 BIT(NL80211_STA_FLAG_MFP))) 8775 return -EINVAL; 8776 break; 8777 case CFG80211_STA_NAN_DATA: 8778 if (params->sta_flags_mask & 8779 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 8780 BIT(NL80211_STA_FLAG_MFP) | 8781 BIT(NL80211_STA_FLAG_WME))) 8782 return -EINVAL; 8783 break; 8784 } 8785 8786 /* 8787 * Older kernel versions ignored this attribute entirely, so don't 8788 * reject attempts to update it but mark it as unused instead so the 8789 * driver won't look at the data. 8790 */ 8791 if (statype != CFG80211_STA_AP_CLIENT_UNASSOC && 8792 statype != CFG80211_STA_TDLS_PEER_SETUP) 8793 params->link_sta_params.opmode_notif_used = false; 8794 8795 return 0; 8796 } 8797 EXPORT_SYMBOL(cfg80211_check_station_change); 8798 8799 /* 8800 * Get vlan interface making sure it is running and on the right wiphy. 8801 */ 8802 static struct net_device *get_vlan(struct genl_info *info, 8803 struct cfg80211_registered_device *rdev) 8804 { 8805 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; 8806 struct net_device *v; 8807 int ret; 8808 8809 if (!vlanattr) 8810 return NULL; 8811 8812 v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr)); 8813 if (!v) 8814 return ERR_PTR(-ENODEV); 8815 8816 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { 8817 ret = -EINVAL; 8818 goto error; 8819 } 8820 8821 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && 8822 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 8823 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 8824 ret = -EINVAL; 8825 goto error; 8826 } 8827 8828 if (!netif_running(v)) { 8829 ret = -ENETDOWN; 8830 goto error; 8831 } 8832 8833 return v; 8834 error: 8835 dev_put(v); 8836 return ERR_PTR(ret); 8837 } 8838 8839 static int nl80211_parse_sta_wme(struct genl_info *info, 8840 struct station_parameters *params) 8841 { 8842 struct nlattr *tb[NL80211_STA_WME_MAX + 1]; 8843 struct nlattr *nla; 8844 int err; 8845 8846 /* parse WME attributes if present */ 8847 if (!info->attrs[NL80211_ATTR_STA_WME]) 8848 return 0; 8849 8850 nla = info->attrs[NL80211_ATTR_STA_WME]; 8851 err = nla_parse_nested_deprecated(tb, NL80211_STA_WME_MAX, nla, 8852 nl80211_sta_wme_policy, 8853 info->extack); 8854 if (err) 8855 return err; 8856 8857 if (tb[NL80211_STA_WME_UAPSD_QUEUES]) 8858 params->uapsd_queues = nla_get_u8( 8859 tb[NL80211_STA_WME_UAPSD_QUEUES]); 8860 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) 8861 return -EINVAL; 8862 8863 if (tb[NL80211_STA_WME_MAX_SP]) 8864 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); 8865 8866 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) 8867 return -EINVAL; 8868 8869 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; 8870 8871 return 0; 8872 } 8873 8874 static int nl80211_parse_sta_channel_info(struct genl_info *info, 8875 struct station_parameters *params) 8876 { 8877 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { 8878 params->supported_channels = 8879 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 8880 params->supported_channels_len = 8881 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 8882 /* 8883 * Need to include at least one (first channel, number of 8884 * channels) tuple for each subband (checked in policy), 8885 * and must have proper tuples for the rest of the data as well. 8886 */ 8887 if (params->supported_channels_len % 2) 8888 return -EINVAL; 8889 } 8890 8891 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { 8892 params->supported_oper_classes = 8893 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 8894 params->supported_oper_classes_len = 8895 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 8896 } 8897 return 0; 8898 } 8899 8900 static int nl80211_set_station_tdls(struct genl_info *info, 8901 struct station_parameters *params) 8902 { 8903 int err; 8904 /* Dummy STA entry gets updated once the peer capabilities are known */ 8905 if (info->attrs[NL80211_ATTR_PEER_AID]) 8906 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 8907 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 8908 params->link_sta_params.ht_capa = 8909 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 8910 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 8911 params->link_sta_params.vht_capa = 8912 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 8913 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 8914 params->link_sta_params.he_capa = 8915 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 8916 params->link_sta_params.he_capa_len = 8917 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 8918 8919 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { 8920 params->link_sta_params.eht_capa = 8921 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 8922 params->link_sta_params.eht_capa_len = 8923 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 8924 8925 if (!ieee80211_eht_capa_size_ok((const u8 *)params->link_sta_params.he_capa, 8926 (const u8 *)params->link_sta_params.eht_capa, 8927 params->link_sta_params.eht_capa_len, 8928 false)) 8929 return -EINVAL; 8930 } 8931 } 8932 8933 if (info->attrs[NL80211_ATTR_UHR_CAPABILITY]) { 8934 if (!params->link_sta_params.eht_capa) 8935 return -EINVAL; 8936 8937 params->link_sta_params.uhr_capa = 8938 nla_data(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 8939 params->link_sta_params.uhr_capa_len = 8940 nla_len(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 8941 } 8942 8943 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) 8944 params->link_sta_params.s1g_capa = 8945 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]); 8946 8947 err = nl80211_parse_sta_channel_info(info, params); 8948 if (err) 8949 return err; 8950 8951 return nl80211_parse_sta_wme(info, params); 8952 } 8953 8954 static int nl80211_parse_sta_txpower_setting(struct genl_info *info, 8955 struct sta_txpwr *txpwr, 8956 bool *txpwr_set) 8957 { 8958 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8959 int idx; 8960 8961 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) { 8962 if (!rdev->ops->set_tx_power || 8963 !wiphy_ext_feature_isset(&rdev->wiphy, 8964 NL80211_EXT_FEATURE_STA_TX_PWR)) 8965 return -EOPNOTSUPP; 8966 8967 idx = NL80211_ATTR_STA_TX_POWER_SETTING; 8968 txpwr->type = nla_get_u8(info->attrs[idx]); 8969 8970 if (txpwr->type == NL80211_TX_POWER_LIMITED) { 8971 idx = NL80211_ATTR_STA_TX_POWER; 8972 8973 if (info->attrs[idx]) 8974 txpwr->power = nla_get_s16(info->attrs[idx]); 8975 else 8976 return -EINVAL; 8977 } 8978 8979 *txpwr_set = true; 8980 } else { 8981 *txpwr_set = false; 8982 } 8983 8984 return 0; 8985 } 8986 8987 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) 8988 { 8989 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8990 struct wireless_dev *wdev = info->user_ptr[1]; 8991 struct net_device *dev = wdev->netdev; 8992 struct station_parameters params; 8993 u8 *mac_addr; 8994 int err; 8995 8996 memset(¶ms, 0, sizeof(params)); 8997 8998 if (!dev && wdev->iftype != NL80211_IFTYPE_NAN && 8999 wdev->iftype != NL80211_IFTYPE_NAN_DATA) 9000 return -EINVAL; 9001 9002 if (!rdev->ops->change_station) 9003 return -EOPNOTSUPP; 9004 9005 /* 9006 * AID and listen_interval properties can be set only for unassociated 9007 * station. Include these parameters here and will check them in 9008 * cfg80211_check_station_change(). 9009 */ 9010 if (info->attrs[NL80211_ATTR_STA_AID]) 9011 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 9012 9013 if (info->attrs[NL80211_ATTR_VLAN_ID]) 9014 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 9015 9016 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 9017 params.listen_interval = 9018 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 9019 else 9020 params.listen_interval = -1; 9021 9022 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) 9023 params.support_p2p_ps = 9024 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); 9025 else 9026 params.support_p2p_ps = -1; 9027 9028 if (!info->attrs[NL80211_ATTR_MAC]) 9029 return -EINVAL; 9030 9031 params.link_sta_params.link_id = 9032 nl80211_link_id_or_invalid(info->attrs); 9033 9034 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { 9035 /* If MLD_ADDR attribute is set then this is an MLD station 9036 * and the MLD_ADDR attribute holds the MLD address and the 9037 * MAC attribute holds for the LINK address. 9038 * In that case, the link_id is also expected to be valid. 9039 */ 9040 if (params.link_sta_params.link_id < 0) 9041 return -EINVAL; 9042 9043 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 9044 params.link_sta_params.mld_mac = mac_addr; 9045 params.link_sta_params.link_mac = 9046 nla_data(info->attrs[NL80211_ATTR_MAC]); 9047 if (!is_valid_ether_addr(params.link_sta_params.link_mac)) 9048 return -EINVAL; 9049 } else { 9050 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 9051 } 9052 9053 9054 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 9055 params.link_sta_params.supported_rates = 9056 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 9057 params.link_sta_params.supported_rates_len = 9058 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 9059 } 9060 9061 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 9062 params.capability = 9063 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 9064 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 9065 } 9066 9067 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 9068 params.ext_capab = 9069 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 9070 params.ext_capab_len = 9071 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 9072 } 9073 9074 if (parse_station_flags(info, wdev->iftype, ¶ms)) 9075 return -EINVAL; 9076 9077 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) 9078 params.plink_action = 9079 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 9080 9081 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { 9082 params.plink_state = 9083 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); 9084 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) 9085 params.peer_aid = nla_get_u16( 9086 info->attrs[NL80211_ATTR_MESH_PEER_AID]); 9087 params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE; 9088 } 9089 9090 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) 9091 params.local_pm = nla_get_u32( 9092 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); 9093 9094 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 9095 params.link_sta_params.opmode_notif_used = true; 9096 params.link_sta_params.opmode_notif = 9097 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 9098 } 9099 9100 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) 9101 params.link_sta_params.he_6ghz_capa = 9102 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); 9103 9104 if (info->attrs[NL80211_ATTR_EML_CAPABILITY]) { 9105 params.eml_cap_present = true; 9106 params.eml_cap = 9107 nla_get_u16(info->attrs[NL80211_ATTR_EML_CAPABILITY]); 9108 } 9109 9110 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) 9111 params.airtime_weight = 9112 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); 9113 9114 if (params.airtime_weight && 9115 !wiphy_ext_feature_isset(&rdev->wiphy, 9116 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 9117 return -EOPNOTSUPP; 9118 9119 err = nl80211_parse_sta_txpower_setting(info, 9120 ¶ms.link_sta_params.txpwr, 9121 ¶ms.link_sta_params.txpwr_set); 9122 if (err) 9123 return err; 9124 9125 /* Include parameters for TDLS peer (will check later) */ 9126 err = nl80211_set_station_tdls(info, ¶ms); 9127 if (err) 9128 return err; 9129 9130 params.vlan = get_vlan(info, rdev); 9131 if (IS_ERR(params.vlan)) 9132 return PTR_ERR(params.vlan); 9133 9134 switch (wdev->iftype) { 9135 case NL80211_IFTYPE_AP: 9136 case NL80211_IFTYPE_AP_VLAN: 9137 case NL80211_IFTYPE_P2P_GO: 9138 case NL80211_IFTYPE_P2P_CLIENT: 9139 case NL80211_IFTYPE_STATION: 9140 case NL80211_IFTYPE_ADHOC: 9141 case NL80211_IFTYPE_MESH_POINT: 9142 case NL80211_IFTYPE_NAN: 9143 case NL80211_IFTYPE_NAN_DATA: 9144 break; 9145 default: 9146 err = -EOPNOTSUPP; 9147 goto out_put_vlan; 9148 } 9149 9150 /* driver will call cfg80211_check_station_change() */ 9151 err = rdev_change_station(rdev, wdev, mac_addr, ¶ms); 9152 9153 out_put_vlan: 9154 dev_put(params.vlan); 9155 9156 return err; 9157 } 9158 9159 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info) 9160 { 9161 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9162 int err; 9163 struct wireless_dev *wdev = info->user_ptr[1]; 9164 struct net_device *dev = wdev->netdev; 9165 struct station_parameters params; 9166 u8 *mac_addr = NULL; 9167 u32 auth_assoc = BIT(NL80211_STA_FLAG_AUTHENTICATED) | 9168 BIT(NL80211_STA_FLAG_ASSOCIATED); 9169 9170 memset(¶ms, 0, sizeof(params)); 9171 9172 if (!dev && wdev->iftype != NL80211_IFTYPE_NAN) 9173 return -EINVAL; 9174 9175 if (!rdev->ops->add_station) 9176 return -EOPNOTSUPP; 9177 9178 if (!info->attrs[NL80211_ATTR_MAC]) 9179 return -EINVAL; 9180 9181 if (wdev->iftype == NL80211_IFTYPE_NAN || 9182 wdev->iftype == NL80211_IFTYPE_NAN_DATA) { 9183 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 9184 return -EINVAL; 9185 if (wdev->iftype == NL80211_IFTYPE_NAN_DATA) { 9186 if (!info->attrs[NL80211_ATTR_NAN_NMI_MAC]) 9187 return -EINVAL; 9188 9189 /* Only NMI stations receive the HT/VHT/HE capabilities */ 9190 if (info->attrs[NL80211_ATTR_HT_CAPABILITY] || 9191 info->attrs[NL80211_ATTR_VHT_CAPABILITY] || 9192 info->attrs[NL80211_ATTR_HE_CAPABILITY]) 9193 return -EINVAL; 9194 } 9195 } else { 9196 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 9197 return -EINVAL; 9198 9199 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 9200 return -EINVAL; 9201 9202 if (!info->attrs[NL80211_ATTR_STA_AID] && 9203 !info->attrs[NL80211_ATTR_PEER_AID]) 9204 return -EINVAL; 9205 } 9206 9207 params.link_sta_params.link_id = 9208 nl80211_link_id_or_invalid(info->attrs); 9209 9210 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { 9211 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 9212 params.link_sta_params.mld_mac = mac_addr; 9213 params.link_sta_params.link_mac = 9214 nla_data(info->attrs[NL80211_ATTR_MAC]); 9215 if (!is_valid_ether_addr(params.link_sta_params.link_mac)) 9216 return -EINVAL; 9217 } else { 9218 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 9219 } 9220 9221 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 9222 params.link_sta_params.supported_rates = 9223 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 9224 params.link_sta_params.supported_rates_len = 9225 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 9226 } 9227 9228 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 9229 params.listen_interval = 9230 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 9231 9232 if (info->attrs[NL80211_ATTR_VLAN_ID]) 9233 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 9234 9235 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { 9236 params.support_p2p_ps = 9237 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); 9238 } else { 9239 /* 9240 * if not specified, assume it's supported for P2P GO interface, 9241 * and is NOT supported for AP interface 9242 */ 9243 params.support_p2p_ps = 9244 wdev->iftype == NL80211_IFTYPE_P2P_GO; 9245 } 9246 9247 if (info->attrs[NL80211_ATTR_PEER_AID]) 9248 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 9249 else if (info->attrs[NL80211_ATTR_STA_AID]) 9250 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 9251 9252 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 9253 params.capability = 9254 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 9255 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 9256 } 9257 9258 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 9259 params.ext_capab = 9260 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 9261 params.ext_capab_len = 9262 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 9263 } 9264 9265 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 9266 params.link_sta_params.ht_capa = 9267 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 9268 9269 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 9270 params.link_sta_params.vht_capa = 9271 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 9272 9273 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 9274 params.link_sta_params.he_capa = 9275 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 9276 params.link_sta_params.he_capa_len = 9277 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 9278 9279 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { 9280 params.link_sta_params.eht_capa = 9281 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 9282 params.link_sta_params.eht_capa_len = 9283 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 9284 9285 if (!ieee80211_eht_capa_size_ok((const u8 *)params.link_sta_params.he_capa, 9286 (const u8 *)params.link_sta_params.eht_capa, 9287 params.link_sta_params.eht_capa_len, 9288 false)) 9289 return -EINVAL; 9290 } 9291 } 9292 9293 if (info->attrs[NL80211_ATTR_UHR_CAPABILITY]) { 9294 if (!params.link_sta_params.eht_capa) 9295 return -EINVAL; 9296 9297 params.link_sta_params.uhr_capa = 9298 nla_data(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 9299 params.link_sta_params.uhr_capa_len = 9300 nla_len(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 9301 } 9302 9303 if (info->attrs[NL80211_ATTR_EML_CAPABILITY]) { 9304 params.eml_cap_present = true; 9305 params.eml_cap = 9306 nla_get_u16(info->attrs[NL80211_ATTR_EML_CAPABILITY]); 9307 } 9308 9309 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) 9310 params.link_sta_params.he_6ghz_capa = 9311 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); 9312 9313 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) 9314 params.link_sta_params.s1g_capa = 9315 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]); 9316 9317 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 9318 params.link_sta_params.opmode_notif_used = true; 9319 params.link_sta_params.opmode_notif = 9320 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 9321 } 9322 9323 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) 9324 params.plink_action = 9325 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 9326 9327 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) 9328 params.airtime_weight = 9329 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); 9330 9331 if (params.airtime_weight && 9332 !wiphy_ext_feature_isset(&rdev->wiphy, 9333 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 9334 return -EOPNOTSUPP; 9335 9336 err = nl80211_parse_sta_txpower_setting(info, 9337 ¶ms.link_sta_params.txpwr, 9338 ¶ms.link_sta_params.txpwr_set); 9339 if (err) 9340 return err; 9341 9342 err = nl80211_parse_sta_channel_info(info, ¶ms); 9343 if (err) 9344 return err; 9345 9346 err = nl80211_parse_sta_wme(info, ¶ms); 9347 if (err) 9348 return err; 9349 9350 if (parse_station_flags(info, wdev->iftype, ¶ms)) 9351 return -EINVAL; 9352 9353 /* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT 9354 * as userspace might just pass through the capabilities from the IEs 9355 * directly, rather than enforcing this restriction and returning an 9356 * error in this case. 9357 */ 9358 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) { 9359 params.link_sta_params.ht_capa = NULL; 9360 params.link_sta_params.vht_capa = NULL; 9361 9362 /* HE, EHT and UHR require WME */ 9363 if (params.link_sta_params.he_capa_len || 9364 params.link_sta_params.he_6ghz_capa || 9365 params.link_sta_params.eht_capa_len || 9366 params.link_sta_params.uhr_capa_len) 9367 return -EINVAL; 9368 } 9369 9370 if (wdev->iftype == NL80211_IFTYPE_NAN || 9371 wdev->iftype == NL80211_IFTYPE_NAN_DATA) { 9372 if (params.sta_modify_mask & STATION_PARAM_APPLY_UAPSD) 9373 return -EINVAL; 9374 /* NAN NMI station must be added in associated or authorized state */ 9375 if (!(params.sta_flags_set & (BIT(NL80211_STA_FLAG_ASSOCIATED) | 9376 BIT(NL80211_STA_FLAG_AUTHENTICATED)))) 9377 return -EINVAL; 9378 } 9379 9380 /* Ensure that HT/VHT capabilities are not set for 6 GHz HE STA */ 9381 if (params.link_sta_params.he_6ghz_capa && 9382 (params.link_sta_params.ht_capa || params.link_sta_params.vht_capa)) 9383 return -EINVAL; 9384 9385 /* When you run into this, adjust the code below for the new flag */ 9386 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 8); 9387 9388 switch (wdev->iftype) { 9389 case NL80211_IFTYPE_AP: 9390 case NL80211_IFTYPE_AP_VLAN: 9391 case NL80211_IFTYPE_P2P_GO: 9392 /* ignore WME attributes if iface/sta is not capable */ 9393 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || 9394 !(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) 9395 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 9396 9397 /* TDLS peers cannot be added */ 9398 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 9399 info->attrs[NL80211_ATTR_PEER_AID]) 9400 return -EINVAL; 9401 /* but don't bother the driver with it */ 9402 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 9403 9404 /* allow authenticated/associated only if driver handles it */ 9405 if (!(rdev->wiphy.features & 9406 NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 9407 params.sta_flags_mask & auth_assoc) 9408 return -EINVAL; 9409 9410 if (!wiphy_ext_feature_isset(&rdev->wiphy, 9411 NL80211_EXT_FEATURE_SPP_AMSDU_SUPPORT) && 9412 params.sta_flags_mask & BIT(NL80211_STA_FLAG_SPP_AMSDU)) 9413 return -EINVAL; 9414 9415 /* Older userspace, or userspace wanting to be compatible with 9416 * !NL80211_FEATURE_FULL_AP_CLIENT_STATE, will not set the auth 9417 * and assoc flags in the mask, but assumes the station will be 9418 * added as associated anyway since this was the required driver 9419 * behaviour before NL80211_FEATURE_FULL_AP_CLIENT_STATE was 9420 * introduced. 9421 * In order to not bother drivers with this quirk in the API 9422 * set the flags in both the mask and set for new stations in 9423 * this case. 9424 */ 9425 if (!(params.sta_flags_mask & auth_assoc)) { 9426 params.sta_flags_mask |= auth_assoc; 9427 params.sta_flags_set |= auth_assoc; 9428 } 9429 9430 /* must be last in here for error handling */ 9431 params.vlan = get_vlan(info, rdev); 9432 if (IS_ERR(params.vlan)) 9433 return PTR_ERR(params.vlan); 9434 break; 9435 case NL80211_IFTYPE_MESH_POINT: 9436 /* ignore uAPSD data */ 9437 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 9438 9439 /* associated is disallowed */ 9440 if (params.sta_flags_mask & BIT(NL80211_STA_FLAG_ASSOCIATED)) 9441 return -EINVAL; 9442 /* TDLS peers cannot be added */ 9443 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 9444 info->attrs[NL80211_ATTR_PEER_AID]) 9445 return -EINVAL; 9446 break; 9447 case NL80211_IFTYPE_STATION: 9448 case NL80211_IFTYPE_P2P_CLIENT: 9449 /* ignore uAPSD data */ 9450 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 9451 9452 /* these are disallowed */ 9453 if (params.sta_flags_mask & 9454 (BIT(NL80211_STA_FLAG_ASSOCIATED) | 9455 BIT(NL80211_STA_FLAG_AUTHENTICATED))) 9456 return -EINVAL; 9457 /* Only TDLS peers can be added */ 9458 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 9459 return -EINVAL; 9460 /* Can only add if TDLS ... */ 9461 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) 9462 return -EOPNOTSUPP; 9463 /* ... with external setup is supported */ 9464 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) 9465 return -EOPNOTSUPP; 9466 /* 9467 * Older wpa_supplicant versions always mark the TDLS peer 9468 * as authorized, but it shouldn't yet be. 9469 */ 9470 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_AUTHORIZED); 9471 break; 9472 case NL80211_IFTYPE_NAN: 9473 break; 9474 case NL80211_IFTYPE_NAN_DATA: 9475 params.nmi_mac = nla_data(info->attrs[NL80211_ATTR_NAN_NMI_MAC]); 9476 break; 9477 default: 9478 return -EOPNOTSUPP; 9479 } 9480 9481 /* be aware of params.vlan when changing code here */ 9482 9483 if (wdev->valid_links) { 9484 if (params.link_sta_params.link_id < 0) { 9485 err = -EINVAL; 9486 goto out; 9487 } 9488 if (!(wdev->valid_links & BIT(params.link_sta_params.link_id))) { 9489 err = -ENOLINK; 9490 goto out; 9491 } 9492 } else { 9493 if (params.link_sta_params.link_id >= 0) { 9494 err = -EINVAL; 9495 goto out; 9496 } 9497 } 9498 9499 params.epp_peer = 9500 nla_get_flag(info->attrs[NL80211_ATTR_EPP_PEER]); 9501 9502 err = rdev_add_station(rdev, wdev, mac_addr, ¶ms); 9503 out: 9504 dev_put(params.vlan); 9505 return err; 9506 } 9507 9508 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info) 9509 { 9510 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9511 struct wireless_dev *wdev = info->user_ptr[1]; 9512 struct net_device *dev = wdev->netdev; 9513 struct station_del_parameters params; 9514 int link_id = nl80211_link_id_or_invalid(info->attrs); 9515 9516 memset(¶ms, 0, sizeof(params)); 9517 9518 if (!dev && wdev->iftype != NL80211_IFTYPE_NAN) 9519 return -EINVAL; 9520 9521 if (info->attrs[NL80211_ATTR_MAC]) 9522 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]); 9523 9524 switch (wdev->iftype) { 9525 case NL80211_IFTYPE_AP: 9526 case NL80211_IFTYPE_AP_VLAN: 9527 case NL80211_IFTYPE_MESH_POINT: 9528 case NL80211_IFTYPE_P2P_GO: 9529 case NL80211_IFTYPE_NAN: 9530 case NL80211_IFTYPE_NAN_DATA: 9531 /* always accept these */ 9532 break; 9533 case NL80211_IFTYPE_ADHOC: 9534 /* conditionally accept */ 9535 if (wiphy_ext_feature_isset(&rdev->wiphy, 9536 NL80211_EXT_FEATURE_DEL_IBSS_STA)) 9537 break; 9538 return -EINVAL; 9539 default: 9540 return -EINVAL; 9541 } 9542 9543 if (!rdev->ops->del_station) 9544 return -EOPNOTSUPP; 9545 9546 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) { 9547 params.subtype = 9548 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]); 9549 if (params.subtype != IEEE80211_STYPE_DISASSOC >> 4 && 9550 params.subtype != IEEE80211_STYPE_DEAUTH >> 4) 9551 return -EINVAL; 9552 } else { 9553 /* Default to Deauthentication frame */ 9554 params.subtype = IEEE80211_STYPE_DEAUTH >> 4; 9555 } 9556 9557 if (info->attrs[NL80211_ATTR_REASON_CODE]) { 9558 params.reason_code = 9559 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 9560 if (params.reason_code == 0) 9561 return -EINVAL; /* 0 is reserved */ 9562 } else { 9563 /* Default to reason code 2 */ 9564 params.reason_code = WLAN_REASON_PREV_AUTH_NOT_VALID; 9565 } 9566 9567 /* Link ID not expected in case of non-ML operation */ 9568 if (!wdev->valid_links && link_id != -1) 9569 return -EINVAL; 9570 9571 /* If given, a valid link ID should be passed during MLO */ 9572 if (wdev->valid_links && link_id >= 0 && 9573 !(wdev->valid_links & BIT(link_id))) 9574 return -EINVAL; 9575 9576 params.link_id = link_id; 9577 9578 return rdev_del_station(rdev, wdev, ¶ms); 9579 } 9580 9581 static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq, 9582 int flags, struct net_device *dev, 9583 u8 *dst, u8 *next_hop, 9584 struct mpath_info *pinfo) 9585 { 9586 void *hdr; 9587 struct nlattr *pinfoattr; 9588 9589 hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_MPATH); 9590 if (!hdr) 9591 return -1; 9592 9593 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 9594 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dst) || 9595 nla_put(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop) || 9596 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) 9597 goto nla_put_failure; 9598 9599 pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MPATH_INFO); 9600 if (!pinfoattr) 9601 goto nla_put_failure; 9602 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && 9603 nla_put_u32(msg, NL80211_MPATH_INFO_FRAME_QLEN, 9604 pinfo->frame_qlen)) 9605 goto nla_put_failure; 9606 if (((pinfo->filled & MPATH_INFO_SN) && 9607 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || 9608 ((pinfo->filled & MPATH_INFO_METRIC) && 9609 nla_put_u32(msg, NL80211_MPATH_INFO_METRIC, 9610 pinfo->metric)) || 9611 ((pinfo->filled & MPATH_INFO_EXPTIME) && 9612 nla_put_u32(msg, NL80211_MPATH_INFO_EXPTIME, 9613 pinfo->exptime)) || 9614 ((pinfo->filled & MPATH_INFO_FLAGS) && 9615 nla_put_u8(msg, NL80211_MPATH_INFO_FLAGS, 9616 pinfo->flags)) || 9617 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && 9618 nla_put_u32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT, 9619 pinfo->discovery_timeout)) || 9620 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && 9621 nla_put_u8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES, 9622 pinfo->discovery_retries)) || 9623 ((pinfo->filled & MPATH_INFO_HOP_COUNT) && 9624 nla_put_u8(msg, NL80211_MPATH_INFO_HOP_COUNT, 9625 pinfo->hop_count)) || 9626 ((pinfo->filled & MPATH_INFO_PATH_CHANGE) && 9627 nla_put_u32(msg, NL80211_MPATH_INFO_PATH_CHANGE, 9628 pinfo->path_change_count))) 9629 goto nla_put_failure; 9630 9631 nla_nest_end(msg, pinfoattr); 9632 9633 genlmsg_end(msg, hdr); 9634 return 0; 9635 9636 nla_put_failure: 9637 genlmsg_cancel(msg, hdr); 9638 return -EMSGSIZE; 9639 } 9640 9641 static int nl80211_dump_mpath(struct sk_buff *skb, 9642 struct netlink_callback *cb) 9643 { 9644 struct mpath_info pinfo; 9645 struct cfg80211_registered_device *rdev; 9646 struct wireless_dev *wdev; 9647 u8 dst[ETH_ALEN]; 9648 u8 next_hop[ETH_ALEN]; 9649 int path_idx = cb->args[2]; 9650 int err; 9651 9652 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL); 9653 if (err) 9654 return err; 9655 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 9656 __acquire(&rdev->wiphy.mtx); 9657 9658 if (!rdev->ops->dump_mpath) { 9659 err = -EOPNOTSUPP; 9660 goto out_err; 9661 } 9662 9663 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 9664 err = -EOPNOTSUPP; 9665 goto out_err; 9666 } 9667 9668 while (1) { 9669 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst, 9670 next_hop, &pinfo); 9671 if (err == -ENOENT) 9672 break; 9673 if (err) 9674 goto out_err; 9675 9676 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 9677 cb->nlh->nlmsg_seq, NLM_F_MULTI, 9678 wdev->netdev, dst, next_hop, 9679 &pinfo) < 0) 9680 goto out; 9681 9682 path_idx++; 9683 } 9684 9685 out: 9686 cb->args[2] = path_idx; 9687 err = skb->len; 9688 out_err: 9689 wiphy_unlock(&rdev->wiphy); 9690 return err; 9691 } 9692 9693 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info) 9694 { 9695 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9696 int err; 9697 struct net_device *dev = info->user_ptr[1]; 9698 struct mpath_info pinfo; 9699 struct sk_buff *msg; 9700 u8 *dst = NULL; 9701 u8 next_hop[ETH_ALEN]; 9702 9703 memset(&pinfo, 0, sizeof(pinfo)); 9704 9705 if (!info->attrs[NL80211_ATTR_MAC]) 9706 return -EINVAL; 9707 9708 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9709 9710 if (!rdev->ops->get_mpath) 9711 return -EOPNOTSUPP; 9712 9713 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9714 return -EOPNOTSUPP; 9715 9716 err = rdev_get_mpath(rdev, dev, dst, next_hop, &pinfo); 9717 if (err) 9718 return err; 9719 9720 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9721 if (!msg) 9722 return -ENOMEM; 9723 9724 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 9725 dev, dst, next_hop, &pinfo) < 0) { 9726 nlmsg_free(msg); 9727 return -ENOBUFS; 9728 } 9729 9730 return genlmsg_reply(msg, info); 9731 } 9732 9733 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info) 9734 { 9735 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9736 struct net_device *dev = info->user_ptr[1]; 9737 u8 *dst = NULL; 9738 u8 *next_hop = NULL; 9739 9740 if (!info->attrs[NL80211_ATTR_MAC]) 9741 return -EINVAL; 9742 9743 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 9744 return -EINVAL; 9745 9746 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9747 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 9748 9749 if (!rdev->ops->change_mpath) 9750 return -EOPNOTSUPP; 9751 9752 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9753 return -EOPNOTSUPP; 9754 9755 return rdev_change_mpath(rdev, dev, dst, next_hop); 9756 } 9757 9758 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info) 9759 { 9760 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9761 struct net_device *dev = info->user_ptr[1]; 9762 u8 *dst = NULL; 9763 u8 *next_hop = NULL; 9764 9765 if (!info->attrs[NL80211_ATTR_MAC]) 9766 return -EINVAL; 9767 9768 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 9769 return -EINVAL; 9770 9771 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9772 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 9773 9774 if (!rdev->ops->add_mpath) 9775 return -EOPNOTSUPP; 9776 9777 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9778 return -EOPNOTSUPP; 9779 9780 return rdev_add_mpath(rdev, dev, dst, next_hop); 9781 } 9782 9783 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info) 9784 { 9785 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9786 struct net_device *dev = info->user_ptr[1]; 9787 u8 *dst = NULL; 9788 9789 if (info->attrs[NL80211_ATTR_MAC]) 9790 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9791 9792 if (!rdev->ops->del_mpath) 9793 return -EOPNOTSUPP; 9794 9795 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9796 return -EOPNOTSUPP; 9797 9798 return rdev_del_mpath(rdev, dev, dst); 9799 } 9800 9801 static int nl80211_get_mpp(struct sk_buff *skb, struct genl_info *info) 9802 { 9803 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9804 int err; 9805 struct net_device *dev = info->user_ptr[1]; 9806 struct mpath_info pinfo; 9807 struct sk_buff *msg; 9808 u8 *dst = NULL; 9809 u8 mpp[ETH_ALEN]; 9810 9811 memset(&pinfo, 0, sizeof(pinfo)); 9812 9813 if (!info->attrs[NL80211_ATTR_MAC]) 9814 return -EINVAL; 9815 9816 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 9817 9818 if (!rdev->ops->get_mpp) 9819 return -EOPNOTSUPP; 9820 9821 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 9822 return -EOPNOTSUPP; 9823 9824 err = rdev_get_mpp(rdev, dev, dst, mpp, &pinfo); 9825 if (err) 9826 return err; 9827 9828 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9829 if (!msg) 9830 return -ENOMEM; 9831 9832 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 9833 dev, dst, mpp, &pinfo) < 0) { 9834 nlmsg_free(msg); 9835 return -ENOBUFS; 9836 } 9837 9838 return genlmsg_reply(msg, info); 9839 } 9840 9841 static int nl80211_dump_mpp(struct sk_buff *skb, 9842 struct netlink_callback *cb) 9843 { 9844 struct mpath_info pinfo; 9845 struct cfg80211_registered_device *rdev; 9846 struct wireless_dev *wdev; 9847 u8 dst[ETH_ALEN]; 9848 u8 mpp[ETH_ALEN]; 9849 int path_idx = cb->args[2]; 9850 int err; 9851 9852 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL); 9853 if (err) 9854 return err; 9855 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 9856 __acquire(&rdev->wiphy.mtx); 9857 9858 if (!rdev->ops->dump_mpp) { 9859 err = -EOPNOTSUPP; 9860 goto out_err; 9861 } 9862 9863 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 9864 err = -EOPNOTSUPP; 9865 goto out_err; 9866 } 9867 9868 while (1) { 9869 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst, 9870 mpp, &pinfo); 9871 if (err == -ENOENT) 9872 break; 9873 if (err) 9874 goto out_err; 9875 9876 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 9877 cb->nlh->nlmsg_seq, NLM_F_MULTI, 9878 wdev->netdev, dst, mpp, 9879 &pinfo) < 0) 9880 goto out; 9881 9882 path_idx++; 9883 } 9884 9885 out: 9886 cb->args[2] = path_idx; 9887 err = skb->len; 9888 out_err: 9889 wiphy_unlock(&rdev->wiphy); 9890 return err; 9891 } 9892 9893 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info) 9894 { 9895 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9896 struct net_device *dev = info->user_ptr[1]; 9897 struct bss_parameters params; 9898 u32 bss_param_support = rdev->wiphy.bss_param_support; 9899 u32 changed = 0; 9900 bool strict; 9901 9902 memset(¶ms, 0, sizeof(params)); 9903 params.link_id = nl80211_link_id_or_invalid(info->attrs); 9904 /* default to not changing parameters */ 9905 params.use_cts_prot = -1; 9906 params.use_short_preamble = -1; 9907 params.use_short_slot_time = -1; 9908 params.ap_isolate = -1; 9909 params.ht_opmode = -1; 9910 params.p2p_ctwindow = -1; 9911 params.p2p_opp_ps = -1; 9912 9913 strict = nla_get_flag(info->attrs[NL80211_ATTR_BSS_PARAM]); 9914 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) { 9915 if (strict && !(bss_param_support & WIPHY_BSS_PARAM_CTS_PROT)) 9916 return -EINVAL; 9917 params.use_cts_prot = 9918 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); 9919 changed |= WIPHY_BSS_PARAM_CTS_PROT; 9920 } 9921 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) { 9922 if (strict && 9923 !(bss_param_support & WIPHY_BSS_PARAM_SHORT_PREAMBLE)) 9924 return -EINVAL; 9925 params.use_short_preamble = 9926 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); 9927 changed |= WIPHY_BSS_PARAM_SHORT_PREAMBLE; 9928 } 9929 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) { 9930 if (strict && 9931 !(bss_param_support & WIPHY_BSS_PARAM_SHORT_SLOT_TIME)) 9932 return -EINVAL; 9933 params.use_short_slot_time = 9934 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); 9935 changed |= WIPHY_BSS_PARAM_SHORT_SLOT_TIME; 9936 } 9937 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 9938 if (strict && 9939 !(bss_param_support & WIPHY_BSS_PARAM_BASIC_RATES)) 9940 return -EINVAL; 9941 params.basic_rates = 9942 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 9943 params.basic_rates_len = 9944 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 9945 changed |= WIPHY_BSS_PARAM_BASIC_RATES; 9946 } 9947 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) { 9948 if (strict && !(bss_param_support & WIPHY_BSS_PARAM_AP_ISOLATE)) 9949 return -EINVAL; 9950 params.ap_isolate = 9951 !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); 9952 changed |= WIPHY_BSS_PARAM_AP_ISOLATE; 9953 } 9954 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) { 9955 if (strict && !(bss_param_support & WIPHY_BSS_PARAM_HT_OPMODE)) 9956 return -EINVAL; 9957 params.ht_opmode = 9958 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); 9959 changed |= WIPHY_BSS_PARAM_HT_OPMODE; 9960 } 9961 9962 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 9963 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 9964 return -EINVAL; 9965 params.p2p_ctwindow = 9966 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 9967 if (params.p2p_ctwindow != 0 && 9968 !(bss_param_support & WIPHY_BSS_PARAM_P2P_CTWINDOW)) 9969 return -EINVAL; 9970 changed |= WIPHY_BSS_PARAM_P2P_CTWINDOW; 9971 } 9972 9973 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 9974 u8 tmp; 9975 9976 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 9977 return -EINVAL; 9978 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 9979 if (tmp && !(bss_param_support & WIPHY_BSS_PARAM_P2P_OPPPS)) 9980 return -EINVAL; 9981 params.p2p_opp_ps = tmp; 9982 if (params.p2p_opp_ps && 9983 !(rdev->wiphy.bss_param_support & WIPHY_BSS_PARAM_P2P_OPPPS)) 9984 return -EINVAL; 9985 } 9986 9987 if (!rdev->ops->change_bss) 9988 return -EOPNOTSUPP; 9989 9990 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 9991 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 9992 return -EOPNOTSUPP; 9993 9994 changed &= rdev->wiphy.bss_param_support; 9995 if (!changed) 9996 return 0; 9997 9998 return rdev_change_bss(rdev, dev, ¶ms); 9999 } 10000 10001 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info) 10002 { 10003 char *data = NULL; 10004 bool is_indoor; 10005 enum nl80211_user_reg_hint_type user_reg_hint_type; 10006 u32 owner_nlportid; 10007 10008 /* 10009 * You should only get this when cfg80211 hasn't yet initialized 10010 * completely when built-in to the kernel right between the time 10011 * window between nl80211_init() and regulatory_init(), if that is 10012 * even possible. 10013 */ 10014 if (unlikely(!rcu_access_pointer(cfg80211_regdomain))) 10015 return -EINPROGRESS; 10016 10017 user_reg_hint_type = 10018 nla_get_u32_default(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE], 10019 NL80211_USER_REG_HINT_USER); 10020 10021 switch (user_reg_hint_type) { 10022 case NL80211_USER_REG_HINT_USER: 10023 case NL80211_USER_REG_HINT_CELL_BASE: 10024 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 10025 return -EINVAL; 10026 10027 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 10028 return regulatory_hint_user(data, user_reg_hint_type); 10029 case NL80211_USER_REG_HINT_INDOOR: 10030 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 10031 owner_nlportid = info->snd_portid; 10032 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR]; 10033 } else { 10034 owner_nlportid = 0; 10035 is_indoor = true; 10036 } 10037 10038 regulatory_hint_indoor(is_indoor, owner_nlportid); 10039 return 0; 10040 default: 10041 return -EINVAL; 10042 } 10043 } 10044 10045 static int nl80211_reload_regdb(struct sk_buff *skb, struct genl_info *info) 10046 { 10047 return reg_reload_regdb(); 10048 } 10049 10050 static int nl80211_get_mesh_config(struct sk_buff *skb, 10051 struct genl_info *info) 10052 { 10053 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10054 struct net_device *dev = info->user_ptr[1]; 10055 struct wireless_dev *wdev = dev->ieee80211_ptr; 10056 struct mesh_config cur_params; 10057 int err = 0; 10058 void *hdr; 10059 struct nlattr *pinfoattr; 10060 struct sk_buff *msg; 10061 10062 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 10063 return -EOPNOTSUPP; 10064 10065 if (!rdev->ops->get_mesh_config) 10066 return -EOPNOTSUPP; 10067 10068 /* If not connected, get default parameters */ 10069 if (!wdev->u.mesh.id_len) 10070 memcpy(&cur_params, &default_mesh_config, sizeof(cur_params)); 10071 else 10072 err = rdev_get_mesh_config(rdev, dev, &cur_params); 10073 10074 if (err) 10075 return err; 10076 10077 /* Draw up a netlink message to send back */ 10078 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 10079 if (!msg) 10080 return -ENOMEM; 10081 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 10082 NL80211_CMD_GET_MESH_CONFIG); 10083 if (!hdr) 10084 goto out; 10085 pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MESH_CONFIG); 10086 if (!pinfoattr) 10087 goto nla_put_failure; 10088 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 10089 nla_put_u16(msg, NL80211_MESHCONF_RETRY_TIMEOUT, 10090 cur_params.dot11MeshRetryTimeout) || 10091 nla_put_u16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT, 10092 cur_params.dot11MeshConfirmTimeout) || 10093 nla_put_u16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT, 10094 cur_params.dot11MeshHoldingTimeout) || 10095 nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS, 10096 cur_params.dot11MeshMaxPeerLinks) || 10097 nla_put_u8(msg, NL80211_MESHCONF_MAX_RETRIES, 10098 cur_params.dot11MeshMaxRetries) || 10099 nla_put_u8(msg, NL80211_MESHCONF_TTL, 10100 cur_params.dot11MeshTTL) || 10101 nla_put_u8(msg, NL80211_MESHCONF_ELEMENT_TTL, 10102 cur_params.element_ttl) || 10103 nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS, 10104 cur_params.auto_open_plinks) || 10105 nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 10106 cur_params.dot11MeshNbrOffsetMaxNeighbor) || 10107 nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 10108 cur_params.dot11MeshHWMPmaxPREQretries) || 10109 nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME, 10110 cur_params.path_refresh_time) || 10111 nla_put_u16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 10112 cur_params.min_discovery_timeout) || 10113 nla_put_u32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 10114 cur_params.dot11MeshHWMPactivePathTimeout) || 10115 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 10116 cur_params.dot11MeshHWMPpreqMinInterval) || 10117 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 10118 cur_params.dot11MeshHWMPperrMinInterval) || 10119 nla_put_u16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 10120 cur_params.dot11MeshHWMPnetDiameterTraversalTime) || 10121 nla_put_u8(msg, NL80211_MESHCONF_HWMP_ROOTMODE, 10122 cur_params.dot11MeshHWMPRootMode) || 10123 nla_put_u16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL, 10124 cur_params.dot11MeshHWMPRannInterval) || 10125 nla_put_u8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 10126 cur_params.dot11MeshGateAnnouncementProtocol) || 10127 nla_put_u8(msg, NL80211_MESHCONF_FORWARDING, 10128 cur_params.dot11MeshForwarding) || 10129 nla_put_s32(msg, NL80211_MESHCONF_RSSI_THRESHOLD, 10130 cur_params.rssi_threshold) || 10131 nla_put_u32(msg, NL80211_MESHCONF_HT_OPMODE, 10132 cur_params.ht_opmode) || 10133 nla_put_u32(msg, NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 10134 cur_params.dot11MeshHWMPactivePathToRootTimeout) || 10135 nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 10136 cur_params.dot11MeshHWMProotInterval) || 10137 nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 10138 cur_params.dot11MeshHWMPconfirmationInterval) || 10139 nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE, 10140 cur_params.power_mode) || 10141 nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW, 10142 cur_params.dot11MeshAwakeWindowDuration) || 10143 nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT, 10144 cur_params.plink_timeout) || 10145 nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_GATE, 10146 cur_params.dot11MeshConnectedToMeshGate) || 10147 nla_put_u8(msg, NL80211_MESHCONF_NOLEARN, 10148 cur_params.dot11MeshNolearn) || 10149 nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_AS, 10150 cur_params.dot11MeshConnectedToAuthServer)) 10151 goto nla_put_failure; 10152 nla_nest_end(msg, pinfoattr); 10153 genlmsg_end(msg, hdr); 10154 return genlmsg_reply(msg, info); 10155 10156 nla_put_failure: 10157 out: 10158 nlmsg_free(msg); 10159 return -ENOBUFS; 10160 } 10161 10162 static const struct nla_policy 10163 nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = { 10164 [NL80211_MESHCONF_RETRY_TIMEOUT] = 10165 NLA_POLICY_RANGE(NLA_U16, 1, 255), 10166 [NL80211_MESHCONF_CONFIRM_TIMEOUT] = 10167 NLA_POLICY_RANGE(NLA_U16, 1, 255), 10168 [NL80211_MESHCONF_HOLDING_TIMEOUT] = 10169 NLA_POLICY_RANGE(NLA_U16, 1, 255), 10170 [NL80211_MESHCONF_MAX_PEER_LINKS] = 10171 NLA_POLICY_RANGE(NLA_U16, 0, 255), 10172 [NL80211_MESHCONF_MAX_RETRIES] = NLA_POLICY_MAX(NLA_U8, 16), 10173 [NL80211_MESHCONF_TTL] = NLA_POLICY_MIN(NLA_U8, 1), 10174 [NL80211_MESHCONF_ELEMENT_TTL] = NLA_POLICY_MIN(NLA_U8, 1), 10175 [NL80211_MESHCONF_AUTO_OPEN_PLINKS] = NLA_POLICY_MAX(NLA_U8, 1), 10176 [NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] = 10177 NLA_POLICY_RANGE(NLA_U32, 1, 255), 10178 [NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 }, 10179 [NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 }, 10180 [NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = NLA_POLICY_MIN(NLA_U16, 1), 10181 [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 }, 10182 [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = 10183 NLA_POLICY_MIN(NLA_U16, 1), 10184 [NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] = 10185 NLA_POLICY_MIN(NLA_U16, 1), 10186 [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = 10187 NLA_POLICY_MIN(NLA_U16, 1), 10188 [NL80211_MESHCONF_HWMP_ROOTMODE] = NLA_POLICY_MAX(NLA_U8, 4), 10189 [NL80211_MESHCONF_HWMP_RANN_INTERVAL] = 10190 NLA_POLICY_MIN(NLA_U16, 1), 10191 [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = NLA_POLICY_MAX(NLA_U8, 1), 10192 [NL80211_MESHCONF_FORWARDING] = NLA_POLICY_MAX(NLA_U8, 1), 10193 [NL80211_MESHCONF_RSSI_THRESHOLD] = 10194 NLA_POLICY_RANGE(NLA_S32, -255, 0), 10195 [NL80211_MESHCONF_HT_OPMODE] = { .type = NLA_U16 }, 10196 [NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 }, 10197 [NL80211_MESHCONF_HWMP_ROOT_INTERVAL] = 10198 NLA_POLICY_MIN(NLA_U16, 1), 10199 [NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] = 10200 NLA_POLICY_MIN(NLA_U16, 1), 10201 [NL80211_MESHCONF_POWER_MODE] = 10202 NLA_POLICY_RANGE(NLA_U32, 10203 NL80211_MESH_POWER_ACTIVE, 10204 NL80211_MESH_POWER_MAX), 10205 [NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 }, 10206 [NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 }, 10207 [NL80211_MESHCONF_CONNECTED_TO_GATE] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 10208 [NL80211_MESHCONF_NOLEARN] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 10209 [NL80211_MESHCONF_CONNECTED_TO_AS] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 10210 }; 10211 10212 static const struct nla_policy 10213 nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = { 10214 [NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 }, 10215 [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 }, 10216 [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 }, 10217 [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG }, 10218 [NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 }, 10219 [NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG }, 10220 [NL80211_MESH_SETUP_IE] = 10221 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 10222 IEEE80211_MAX_DATA_LEN), 10223 [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG }, 10224 }; 10225 10226 static int nl80211_parse_mesh_config(struct genl_info *info, 10227 struct mesh_config *cfg, 10228 u32 *mask_out) 10229 { 10230 struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1]; 10231 u32 mask = 0; 10232 u16 ht_opmode; 10233 10234 #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, mask, attr, fn) \ 10235 do { \ 10236 if (tb[attr]) { \ 10237 cfg->param = fn(tb[attr]); \ 10238 mask |= BIT((attr) - 1); \ 10239 } \ 10240 } while (0) 10241 10242 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) 10243 return -EINVAL; 10244 if (nla_parse_nested_deprecated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params_policy, info->extack)) 10245 return -EINVAL; 10246 10247 /* This makes sure that there aren't more than 32 mesh config 10248 * parameters (otherwise our bitfield scheme would not work.) */ 10249 BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32); 10250 10251 /* Fill in the params struct */ 10252 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout, mask, 10253 NL80211_MESHCONF_RETRY_TIMEOUT, nla_get_u16); 10254 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout, mask, 10255 NL80211_MESHCONF_CONFIRM_TIMEOUT, 10256 nla_get_u16); 10257 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout, mask, 10258 NL80211_MESHCONF_HOLDING_TIMEOUT, 10259 nla_get_u16); 10260 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks, mask, 10261 NL80211_MESHCONF_MAX_PEER_LINKS, 10262 nla_get_u16); 10263 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries, mask, 10264 NL80211_MESHCONF_MAX_RETRIES, nla_get_u8); 10265 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL, mask, 10266 NL80211_MESHCONF_TTL, nla_get_u8); 10267 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl, mask, 10268 NL80211_MESHCONF_ELEMENT_TTL, nla_get_u8); 10269 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks, mask, 10270 NL80211_MESHCONF_AUTO_OPEN_PLINKS, 10271 nla_get_u8); 10272 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor, 10273 mask, 10274 NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 10275 nla_get_u32); 10276 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries, mask, 10277 NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 10278 nla_get_u8); 10279 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time, mask, 10280 NL80211_MESHCONF_PATH_REFRESH_TIME, 10281 nla_get_u32); 10282 if (mask & BIT(NL80211_MESHCONF_PATH_REFRESH_TIME) && 10283 (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535)) 10284 return -EINVAL; 10285 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout, mask, 10286 NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 10287 nla_get_u16); 10288 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout, 10289 mask, 10290 NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 10291 nla_get_u32); 10292 if (mask & BIT(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT) && 10293 (cfg->dot11MeshHWMPactivePathTimeout < 1 || 10294 cfg->dot11MeshHWMPactivePathTimeout > 65535)) 10295 return -EINVAL; 10296 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval, mask, 10297 NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 10298 nla_get_u16); 10299 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPperrMinInterval, mask, 10300 NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 10301 nla_get_u16); 10302 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 10303 dot11MeshHWMPnetDiameterTraversalTime, mask, 10304 NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 10305 nla_get_u16); 10306 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRootMode, mask, 10307 NL80211_MESHCONF_HWMP_ROOTMODE, nla_get_u8); 10308 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRannInterval, mask, 10309 NL80211_MESHCONF_HWMP_RANN_INTERVAL, 10310 nla_get_u16); 10311 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshGateAnnouncementProtocol, 10312 mask, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 10313 nla_get_u8); 10314 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, mask, 10315 NL80211_MESHCONF_FORWARDING, nla_get_u8); 10316 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, mask, 10317 NL80211_MESHCONF_RSSI_THRESHOLD, 10318 nla_get_s32); 10319 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToMeshGate, mask, 10320 NL80211_MESHCONF_CONNECTED_TO_GATE, 10321 nla_get_u8); 10322 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToAuthServer, mask, 10323 NL80211_MESHCONF_CONNECTED_TO_AS, 10324 nla_get_u8); 10325 /* 10326 * Check HT operation mode based on 10327 * IEEE 802.11-2016 9.4.2.57 HT Operation element. 10328 */ 10329 if (tb[NL80211_MESHCONF_HT_OPMODE]) { 10330 ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]); 10331 10332 if (ht_opmode & ~(IEEE80211_HT_OP_MODE_PROTECTION | 10333 IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT | 10334 IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)) 10335 return -EINVAL; 10336 10337 /* NON_HT_STA bit is reserved, but some programs set it */ 10338 ht_opmode &= ~IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT; 10339 10340 cfg->ht_opmode = ht_opmode; 10341 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); 10342 } 10343 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 10344 dot11MeshHWMPactivePathToRootTimeout, mask, 10345 NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 10346 nla_get_u32); 10347 if (mask & BIT(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT) && 10348 (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 || 10349 cfg->dot11MeshHWMPactivePathToRootTimeout > 65535)) 10350 return -EINVAL; 10351 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMProotInterval, mask, 10352 NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 10353 nla_get_u16); 10354 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPconfirmationInterval, 10355 mask, 10356 NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 10357 nla_get_u16); 10358 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode, mask, 10359 NL80211_MESHCONF_POWER_MODE, nla_get_u32); 10360 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration, mask, 10361 NL80211_MESHCONF_AWAKE_WINDOW, nla_get_u16); 10362 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, plink_timeout, mask, 10363 NL80211_MESHCONF_PLINK_TIMEOUT, nla_get_u32); 10364 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNolearn, mask, 10365 NL80211_MESHCONF_NOLEARN, nla_get_u8); 10366 if (mask_out) 10367 *mask_out = mask; 10368 10369 return 0; 10370 10371 #undef FILL_IN_MESH_PARAM_IF_SET 10372 } 10373 10374 static int nl80211_parse_mesh_setup(struct genl_info *info, 10375 struct mesh_setup *setup) 10376 { 10377 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10378 struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1]; 10379 10380 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) 10381 return -EINVAL; 10382 if (nla_parse_nested_deprecated(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_params_policy, info->extack)) 10383 return -EINVAL; 10384 10385 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC]) 10386 setup->sync_method = 10387 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ? 10388 IEEE80211_SYNC_METHOD_VENDOR : 10389 IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET; 10390 10391 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL]) 10392 setup->path_sel_proto = 10393 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ? 10394 IEEE80211_PATH_PROTOCOL_VENDOR : 10395 IEEE80211_PATH_PROTOCOL_HWMP; 10396 10397 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC]) 10398 setup->path_metric = 10399 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ? 10400 IEEE80211_PATH_METRIC_VENDOR : 10401 IEEE80211_PATH_METRIC_AIRTIME; 10402 10403 if (tb[NL80211_MESH_SETUP_IE]) { 10404 struct nlattr *ieattr = 10405 tb[NL80211_MESH_SETUP_IE]; 10406 setup->ie = nla_data(ieattr); 10407 setup->ie_len = nla_len(ieattr); 10408 } 10409 if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] && 10410 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) 10411 return -EINVAL; 10412 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); 10413 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); 10414 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); 10415 if (setup->is_secure) 10416 setup->user_mpm = true; 10417 10418 if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) { 10419 if (!setup->user_mpm) 10420 return -EINVAL; 10421 setup->auth_id = 10422 nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]); 10423 } 10424 10425 return 0; 10426 } 10427 10428 static int nl80211_update_mesh_config(struct sk_buff *skb, 10429 struct genl_info *info) 10430 { 10431 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10432 struct net_device *dev = info->user_ptr[1]; 10433 struct wireless_dev *wdev = dev->ieee80211_ptr; 10434 struct mesh_config cfg = {}; 10435 u32 mask; 10436 int err; 10437 10438 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 10439 return -EOPNOTSUPP; 10440 10441 if (!rdev->ops->update_mesh_config) 10442 return -EOPNOTSUPP; 10443 10444 err = nl80211_parse_mesh_config(info, &cfg, &mask); 10445 if (err) 10446 return err; 10447 10448 if (!wdev->u.mesh.id_len) 10449 err = -ENOLINK; 10450 10451 if (!err) 10452 err = rdev_update_mesh_config(rdev, dev, mask, &cfg); 10453 10454 return err; 10455 } 10456 10457 static int nl80211_put_regdom(const struct ieee80211_regdomain *regdom, 10458 struct sk_buff *msg) 10459 { 10460 struct nlattr *nl_reg_rules; 10461 unsigned int i; 10462 10463 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || 10464 (regdom->dfs_region && 10465 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) 10466 goto nla_put_failure; 10467 10468 nl_reg_rules = nla_nest_start_noflag(msg, NL80211_ATTR_REG_RULES); 10469 if (!nl_reg_rules) 10470 goto nla_put_failure; 10471 10472 for (i = 0; i < regdom->n_reg_rules; i++) { 10473 struct nlattr *nl_reg_rule; 10474 const struct ieee80211_reg_rule *reg_rule; 10475 const struct ieee80211_freq_range *freq_range; 10476 const struct ieee80211_power_rule *power_rule; 10477 unsigned int max_bandwidth_khz; 10478 10479 reg_rule = ®dom->reg_rules[i]; 10480 freq_range = ®_rule->freq_range; 10481 power_rule = ®_rule->power_rule; 10482 10483 nl_reg_rule = nla_nest_start_noflag(msg, i); 10484 if (!nl_reg_rule) 10485 goto nla_put_failure; 10486 10487 max_bandwidth_khz = freq_range->max_bandwidth_khz; 10488 if (!max_bandwidth_khz) 10489 max_bandwidth_khz = reg_get_max_bandwidth(regdom, 10490 reg_rule); 10491 10492 if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS, 10493 reg_rule->flags) || 10494 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START, 10495 freq_range->start_freq_khz) || 10496 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END, 10497 freq_range->end_freq_khz) || 10498 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW, 10499 max_bandwidth_khz) || 10500 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN, 10501 power_rule->max_antenna_gain) || 10502 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP, 10503 power_rule->max_eirp) || 10504 nla_put_u32(msg, NL80211_ATTR_DFS_CAC_TIME, 10505 reg_rule->dfs_cac_ms)) 10506 goto nla_put_failure; 10507 10508 if ((reg_rule->flags & NL80211_RRF_PSD) && 10509 nla_put_s8(msg, NL80211_ATTR_POWER_RULE_PSD, 10510 reg_rule->psd)) 10511 goto nla_put_failure; 10512 10513 nla_nest_end(msg, nl_reg_rule); 10514 } 10515 10516 nla_nest_end(msg, nl_reg_rules); 10517 return 0; 10518 10519 nla_put_failure: 10520 return -EMSGSIZE; 10521 } 10522 10523 static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info) 10524 { 10525 const struct ieee80211_regdomain *regdom = NULL; 10526 struct cfg80211_registered_device *rdev; 10527 struct wiphy *wiphy = NULL; 10528 struct sk_buff *msg; 10529 int err = -EMSGSIZE; 10530 void *hdr; 10531 10532 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 10533 if (!msg) 10534 return -ENOBUFS; 10535 10536 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 10537 NL80211_CMD_GET_REG); 10538 if (!hdr) 10539 goto put_failure; 10540 10541 rtnl_lock(); 10542 10543 if (info->attrs[NL80211_ATTR_WIPHY]) { 10544 bool self_managed; 10545 10546 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 10547 if (IS_ERR(rdev)) { 10548 err = PTR_ERR(rdev); 10549 goto nla_put_failure; 10550 } 10551 10552 wiphy = &rdev->wiphy; 10553 self_managed = wiphy->regulatory_flags & 10554 REGULATORY_WIPHY_SELF_MANAGED; 10555 10556 rcu_read_lock(); 10557 10558 regdom = get_wiphy_regdom(wiphy); 10559 10560 /* a self-managed-reg device must have a private regdom */ 10561 if (WARN_ON(!regdom && self_managed)) { 10562 err = -EINVAL; 10563 goto nla_put_failure_rcu; 10564 } 10565 10566 if (regdom && 10567 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 10568 goto nla_put_failure_rcu; 10569 } else { 10570 rcu_read_lock(); 10571 } 10572 10573 if (!wiphy && reg_last_request_cell_base() && 10574 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 10575 NL80211_USER_REG_HINT_CELL_BASE)) 10576 goto nla_put_failure_rcu; 10577 10578 if (!regdom) 10579 regdom = rcu_dereference(cfg80211_regdomain); 10580 10581 if (nl80211_put_regdom(regdom, msg)) 10582 goto nla_put_failure_rcu; 10583 10584 rcu_read_unlock(); 10585 10586 genlmsg_end(msg, hdr); 10587 rtnl_unlock(); 10588 return genlmsg_reply(msg, info); 10589 10590 nla_put_failure_rcu: 10591 rcu_read_unlock(); 10592 nla_put_failure: 10593 rtnl_unlock(); 10594 put_failure: 10595 nlmsg_free(msg); 10596 return err; 10597 } 10598 10599 static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb, 10600 u32 seq, int flags, struct wiphy *wiphy, 10601 const struct ieee80211_regdomain *regdom) 10602 { 10603 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 10604 NL80211_CMD_GET_REG); 10605 10606 if (!hdr) 10607 return -1; 10608 10609 genl_dump_check_consistent(cb, hdr); 10610 10611 if (nl80211_put_regdom(regdom, msg)) 10612 goto nla_put_failure; 10613 10614 if (!wiphy && reg_last_request_cell_base() && 10615 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 10616 NL80211_USER_REG_HINT_CELL_BASE)) 10617 goto nla_put_failure; 10618 10619 if (wiphy && 10620 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 10621 goto nla_put_failure; 10622 10623 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 10624 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 10625 goto nla_put_failure; 10626 10627 genlmsg_end(msg, hdr); 10628 return 0; 10629 10630 nla_put_failure: 10631 genlmsg_cancel(msg, hdr); 10632 return -EMSGSIZE; 10633 } 10634 10635 static int nl80211_get_reg_dump(struct sk_buff *skb, 10636 struct netlink_callback *cb) 10637 { 10638 const struct ieee80211_regdomain *regdom = NULL; 10639 struct cfg80211_registered_device *rdev; 10640 int err, reg_idx, start = cb->args[2]; 10641 10642 rcu_read_lock(); 10643 10644 if (cfg80211_regdomain && start == 0) { 10645 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, 10646 NLM_F_MULTI, NULL, 10647 rcu_dereference(cfg80211_regdomain)); 10648 if (err < 0) 10649 goto out_err; 10650 } 10651 10652 /* the global regdom is idx 0 */ 10653 reg_idx = 1; 10654 list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) { 10655 regdom = get_wiphy_regdom(&rdev->wiphy); 10656 if (!regdom) 10657 continue; 10658 10659 if (++reg_idx <= start) 10660 continue; 10661 10662 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, 10663 NLM_F_MULTI, &rdev->wiphy, regdom); 10664 if (err < 0) { 10665 reg_idx--; 10666 break; 10667 } 10668 } 10669 10670 cb->args[2] = reg_idx; 10671 err = skb->len; 10672 out_err: 10673 rcu_read_unlock(); 10674 return err; 10675 } 10676 10677 #ifdef CONFIG_CFG80211_CRDA_SUPPORT 10678 static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = { 10679 [NL80211_ATTR_REG_RULE_FLAGS] = { .type = NLA_U32 }, 10680 [NL80211_ATTR_FREQ_RANGE_START] = { .type = NLA_U32 }, 10681 [NL80211_ATTR_FREQ_RANGE_END] = { .type = NLA_U32 }, 10682 [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 }, 10683 [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 }, 10684 [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 }, 10685 [NL80211_ATTR_DFS_CAC_TIME] = { .type = NLA_U32 }, 10686 }; 10687 10688 static int parse_reg_rule(struct nlattr *tb[], 10689 struct ieee80211_reg_rule *reg_rule) 10690 { 10691 struct ieee80211_freq_range *freq_range = ®_rule->freq_range; 10692 struct ieee80211_power_rule *power_rule = ®_rule->power_rule; 10693 10694 if (!tb[NL80211_ATTR_REG_RULE_FLAGS]) 10695 return -EINVAL; 10696 if (!tb[NL80211_ATTR_FREQ_RANGE_START]) 10697 return -EINVAL; 10698 if (!tb[NL80211_ATTR_FREQ_RANGE_END]) 10699 return -EINVAL; 10700 if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]) 10701 return -EINVAL; 10702 if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]) 10703 return -EINVAL; 10704 10705 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); 10706 10707 freq_range->start_freq_khz = 10708 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]); 10709 freq_range->end_freq_khz = 10710 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]); 10711 freq_range->max_bandwidth_khz = 10712 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]); 10713 10714 power_rule->max_eirp = 10715 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]); 10716 10717 if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]) 10718 power_rule->max_antenna_gain = 10719 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]); 10720 10721 if (tb[NL80211_ATTR_DFS_CAC_TIME]) 10722 reg_rule->dfs_cac_ms = 10723 nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]); 10724 10725 return 0; 10726 } 10727 10728 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info) 10729 { 10730 struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1]; 10731 struct nlattr *nl_reg_rule; 10732 char *alpha2; 10733 int rem_reg_rules, r; 10734 u32 num_rules = 0, rule_idx = 0; 10735 enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET; 10736 struct ieee80211_regdomain *rd; 10737 10738 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 10739 return -EINVAL; 10740 10741 if (!info->attrs[NL80211_ATTR_REG_RULES]) 10742 return -EINVAL; 10743 10744 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 10745 10746 if (info->attrs[NL80211_ATTR_DFS_REGION]) 10747 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); 10748 10749 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 10750 rem_reg_rules) { 10751 num_rules++; 10752 if (num_rules > NL80211_MAX_SUPP_REG_RULES) 10753 return -EINVAL; 10754 } 10755 10756 rtnl_lock(); 10757 if (!reg_is_valid_request(alpha2)) { 10758 r = -EINVAL; 10759 goto out; 10760 } 10761 10762 rd = kzalloc_flex(*rd, reg_rules, num_rules); 10763 if (!rd) { 10764 r = -ENOMEM; 10765 goto out; 10766 } 10767 10768 rd->n_reg_rules = num_rules; 10769 rd->alpha2[0] = alpha2[0]; 10770 rd->alpha2[1] = alpha2[1]; 10771 10772 /* 10773 * Disable DFS master mode if the DFS region was 10774 * not supported or known on this kernel. 10775 */ 10776 if (reg_supported_dfs_region(dfs_region)) 10777 rd->dfs_region = dfs_region; 10778 10779 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 10780 rem_reg_rules) { 10781 r = nla_parse_nested_deprecated(tb, NL80211_REG_RULE_ATTR_MAX, 10782 nl_reg_rule, reg_rule_policy, 10783 info->extack); 10784 if (r) 10785 goto bad_reg; 10786 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); 10787 if (r) 10788 goto bad_reg; 10789 10790 rule_idx++; 10791 10792 if (rule_idx > NL80211_MAX_SUPP_REG_RULES) { 10793 r = -EINVAL; 10794 goto bad_reg; 10795 } 10796 } 10797 10798 r = set_regdom(rd, REGD_SOURCE_CRDA); 10799 /* set_regdom takes ownership of rd */ 10800 rd = NULL; 10801 bad_reg: 10802 kfree(rd); 10803 out: 10804 rtnl_unlock(); 10805 return r; 10806 } 10807 #endif /* CONFIG_CFG80211_CRDA_SUPPORT */ 10808 10809 static int validate_scan_freqs(struct nlattr *freqs) 10810 { 10811 struct nlattr *attr1, *attr2; 10812 int n_channels = 0, tmp1, tmp2; 10813 10814 nla_for_each_nested(attr1, freqs, tmp1) 10815 if (nla_len(attr1) != sizeof(u32)) 10816 return 0; 10817 10818 nla_for_each_nested(attr1, freqs, tmp1) { 10819 n_channels++; 10820 /* 10821 * Some hardware has a limited channel list for 10822 * scanning, and it is pretty much nonsensical 10823 * to scan for a channel twice, so disallow that 10824 * and don't require drivers to check that the 10825 * channel list they get isn't longer than what 10826 * they can scan, as long as they can scan all 10827 * the channels they registered at once. 10828 */ 10829 nla_for_each_nested(attr2, freqs, tmp2) 10830 if (attr1 != attr2 && 10831 nla_get_u32(attr1) == nla_get_u32(attr2)) 10832 return 0; 10833 } 10834 10835 return n_channels; 10836 } 10837 10838 static bool is_band_valid(struct wiphy *wiphy, enum nl80211_band b) 10839 { 10840 return b < NUM_NL80211_BANDS && wiphy->bands[b]; 10841 } 10842 10843 static int parse_bss_select(struct nlattr *nla, struct wiphy *wiphy, 10844 struct cfg80211_bss_selection *bss_select) 10845 { 10846 struct nlattr *attr[NL80211_BSS_SELECT_ATTR_MAX + 1]; 10847 struct nlattr *nest; 10848 int err; 10849 bool found = false; 10850 int i; 10851 10852 /* only process one nested attribute */ 10853 nest = nla_data(nla); 10854 if (!nla_ok(nest, nla_len(nest))) 10855 return -EINVAL; 10856 10857 err = nla_parse_nested_deprecated(attr, NL80211_BSS_SELECT_ATTR_MAX, 10858 nest, nl80211_bss_select_policy, 10859 NULL); 10860 if (err) 10861 return err; 10862 10863 /* only one attribute may be given */ 10864 for (i = 0; i <= NL80211_BSS_SELECT_ATTR_MAX; i++) { 10865 if (attr[i]) { 10866 if (found) 10867 return -EINVAL; 10868 found = true; 10869 } 10870 } 10871 10872 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID; 10873 10874 if (attr[NL80211_BSS_SELECT_ATTR_RSSI]) 10875 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI; 10876 10877 if (attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]) { 10878 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF; 10879 bss_select->param.band_pref = 10880 nla_get_u32(attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]); 10881 if (!is_band_valid(wiphy, bss_select->param.band_pref)) 10882 return -EINVAL; 10883 } 10884 10885 if (attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]) { 10886 struct nl80211_bss_select_rssi_adjust *adj_param; 10887 10888 adj_param = nla_data(attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]); 10889 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST; 10890 bss_select->param.adjust.band = adj_param->band; 10891 bss_select->param.adjust.delta = adj_param->delta; 10892 if (!is_band_valid(wiphy, bss_select->param.adjust.band)) 10893 return -EINVAL; 10894 } 10895 10896 /* user-space did not provide behaviour attribute */ 10897 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID) 10898 return -EINVAL; 10899 10900 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour))) 10901 return -EINVAL; 10902 10903 return 0; 10904 } 10905 10906 int nl80211_parse_random_mac(struct nlattr **attrs, 10907 u8 *mac_addr, u8 *mac_addr_mask) 10908 { 10909 int i; 10910 10911 if (!attrs[NL80211_ATTR_MAC] && !attrs[NL80211_ATTR_MAC_MASK]) { 10912 eth_zero_addr(mac_addr); 10913 eth_zero_addr(mac_addr_mask); 10914 mac_addr[0] = 0x2; 10915 mac_addr_mask[0] = 0x3; 10916 10917 return 0; 10918 } 10919 10920 /* need both or none */ 10921 if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_MAC_MASK]) 10922 return -EINVAL; 10923 10924 memcpy(mac_addr, nla_data(attrs[NL80211_ATTR_MAC]), ETH_ALEN); 10925 memcpy(mac_addr_mask, nla_data(attrs[NL80211_ATTR_MAC_MASK]), ETH_ALEN); 10926 10927 /* don't allow or configure an mcast address */ 10928 if (!is_multicast_ether_addr(mac_addr_mask) || 10929 is_multicast_ether_addr(mac_addr)) 10930 return -EINVAL; 10931 10932 /* 10933 * allow users to pass a MAC address that has bits set outside 10934 * of the mask, but don't bother drivers with having to deal 10935 * with such bits 10936 */ 10937 for (i = 0; i < ETH_ALEN; i++) 10938 mac_addr[i] &= mac_addr_mask[i]; 10939 10940 return 0; 10941 } 10942 10943 static bool cfg80211_off_channel_oper_allowed(struct wireless_dev *wdev, 10944 struct ieee80211_channel *chan) 10945 { 10946 unsigned int link_id; 10947 bool all_ok = true; 10948 int radio_idx; 10949 10950 lockdep_assert_wiphy(wdev->wiphy); 10951 10952 if (!cfg80211_wdev_channel_allowed(wdev, chan)) 10953 return false; 10954 10955 if (!cfg80211_beaconing_iface_active(wdev)) 10956 return true; 10957 10958 radio_idx = cfg80211_get_radio_idx_by_chan(wdev->wiphy, chan); 10959 10960 /* 10961 * FIXME: check if we have a free radio/link for chan 10962 * 10963 * This, as well as the FIXME below, requires knowing the link 10964 * capabilities of the hardware. 10965 */ 10966 10967 /* we cannot leave radar channels */ 10968 for_each_valid_link(wdev, link_id) { 10969 struct cfg80211_chan_def *chandef; 10970 int link_radio_idx; 10971 10972 chandef = wdev_chandef(wdev, link_id); 10973 if (!chandef || !chandef->chan) 10974 continue; 10975 10976 if (!(chandef->chan->flags & IEEE80211_CHAN_RADAR)) 10977 continue; 10978 10979 /* 10980 * chandef->chan is a radar channel. If the radio/link onto 10981 * which this radar channel falls is the same radio/link onto 10982 * which the input 'chan' falls, off-channel operation should 10983 * not be allowed. Hence, set 'all_ok' to false. 10984 */ 10985 10986 link_radio_idx = cfg80211_get_radio_idx_by_chan(wdev->wiphy, 10987 chandef->chan); 10988 if (link_radio_idx == radio_idx) { 10989 all_ok = false; 10990 break; 10991 } 10992 } 10993 10994 if (all_ok) 10995 return true; 10996 10997 return regulatory_pre_cac_allowed(wdev->wiphy); 10998 } 10999 11000 static bool nl80211_check_scan_feat(struct wiphy *wiphy, u32 flags, u32 flag, 11001 enum nl80211_ext_feature_index feat) 11002 { 11003 if (!(flags & flag)) 11004 return true; 11005 if (wiphy_ext_feature_isset(wiphy, feat)) 11006 return true; 11007 return false; 11008 } 11009 11010 static int 11011 nl80211_check_scan_flags(struct wiphy *wiphy, struct wireless_dev *wdev, 11012 struct nlattr **attrs, u8 *mac_addr, u8 *mac_addr_mask, 11013 u32 *flags, enum nl80211_feature_flags randomness_flag) 11014 { 11015 if (!attrs[NL80211_ATTR_SCAN_FLAGS]) 11016 return 0; 11017 11018 *flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]); 11019 11020 if (((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) && 11021 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) || 11022 !nl80211_check_scan_feat(wiphy, *flags, 11023 NL80211_SCAN_FLAG_LOW_SPAN, 11024 NL80211_EXT_FEATURE_LOW_SPAN_SCAN) || 11025 !nl80211_check_scan_feat(wiphy, *flags, 11026 NL80211_SCAN_FLAG_LOW_POWER, 11027 NL80211_EXT_FEATURE_LOW_POWER_SCAN) || 11028 !nl80211_check_scan_feat(wiphy, *flags, 11029 NL80211_SCAN_FLAG_HIGH_ACCURACY, 11030 NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN) || 11031 !nl80211_check_scan_feat(wiphy, *flags, 11032 NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME, 11033 NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME) || 11034 !nl80211_check_scan_feat(wiphy, *flags, 11035 NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP, 11036 NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP) || 11037 !nl80211_check_scan_feat(wiphy, *flags, 11038 NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION, 11039 NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION) || 11040 !nl80211_check_scan_feat(wiphy, *flags, 11041 NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE, 11042 NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE) || 11043 !nl80211_check_scan_feat(wiphy, *flags, 11044 NL80211_SCAN_FLAG_RANDOM_SN, 11045 NL80211_EXT_FEATURE_SCAN_RANDOM_SN) || 11046 !nl80211_check_scan_feat(wiphy, *flags, 11047 NL80211_SCAN_FLAG_MIN_PREQ_CONTENT, 11048 NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT)) 11049 return -EOPNOTSUPP; 11050 11051 if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { 11052 int err; 11053 11054 if (!(wiphy->features & randomness_flag) || 11055 (wdev && wdev->connected)) 11056 return -EOPNOTSUPP; 11057 11058 err = nl80211_parse_random_mac(attrs, mac_addr, mac_addr_mask); 11059 if (err) 11060 return err; 11061 } 11062 11063 return 0; 11064 } 11065 11066 static int 11067 nl80211_check_scan_flags_sched(struct wiphy *wiphy, struct wireless_dev *wdev, 11068 struct nlattr **attrs, 11069 struct cfg80211_sched_scan_request *req) 11070 { 11071 return nl80211_check_scan_flags(wiphy, wdev, attrs, 11072 req->mac_addr, req->mac_addr_mask, 11073 &req->flags, 11074 wdev ? NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR : 11075 NL80211_FEATURE_ND_RANDOM_MAC_ADDR); 11076 } 11077 11078 static int 11079 nl80211_check_scan_flags_reg(struct wiphy *wiphy, struct wireless_dev *wdev, 11080 struct nlattr **attrs, 11081 struct cfg80211_scan_request_int *req) 11082 { 11083 return nl80211_check_scan_flags(wiphy, wdev, attrs, 11084 req->req.mac_addr, 11085 req->req.mac_addr_mask, 11086 &req->req.flags, 11087 NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR); 11088 } 11089 11090 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) 11091 { 11092 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11093 struct wireless_dev *wdev = info->user_ptr[1]; 11094 struct cfg80211_scan_request_int *request; 11095 struct nlattr *scan_freqs = NULL; 11096 bool scan_freqs_khz = false; 11097 struct nlattr *attr; 11098 struct wiphy *wiphy; 11099 int err, tmp, n_ssids = 0, n_channels, i; 11100 size_t ie_len, size; 11101 size_t ssids_offset, ie_offset; 11102 11103 wiphy = &rdev->wiphy; 11104 11105 if (wdev->iftype == NL80211_IFTYPE_NAN || 11106 wdev->iftype == NL80211_IFTYPE_PD) 11107 return -EOPNOTSUPP; 11108 11109 if (!rdev->ops->scan) 11110 return -EOPNOTSUPP; 11111 11112 if (rdev->scan_req || rdev->scan_msg) 11113 return -EBUSY; 11114 11115 if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) { 11116 if (!wiphy_ext_feature_isset(wiphy, 11117 NL80211_EXT_FEATURE_SCAN_FREQ_KHZ)) 11118 return -EOPNOTSUPP; 11119 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]; 11120 scan_freqs_khz = true; 11121 } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) 11122 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]; 11123 11124 if (scan_freqs) { 11125 n_channels = validate_scan_freqs(scan_freqs); 11126 if (!n_channels) 11127 return -EINVAL; 11128 } else { 11129 n_channels = ieee80211_get_num_supported_channels(wiphy); 11130 } 11131 11132 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) 11133 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) 11134 n_ssids++; 11135 11136 if (n_ssids > wiphy->max_scan_ssids) 11137 return -EINVAL; 11138 11139 if (info->attrs[NL80211_ATTR_IE]) 11140 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 11141 else 11142 ie_len = 0; 11143 11144 if (ie_len > wiphy->max_scan_ie_len) 11145 return -EINVAL; 11146 11147 size = struct_size(request, req.channels, n_channels); 11148 ssids_offset = size; 11149 size = size_add(size, array_size(sizeof(*request->req.ssids), n_ssids)); 11150 ie_offset = size; 11151 size = size_add(size, ie_len); 11152 request = kzalloc(size, GFP_KERNEL); 11153 if (!request) 11154 return -ENOMEM; 11155 11156 if (n_ssids) 11157 request->req.ssids = (void *)request + ssids_offset; 11158 request->req.n_ssids = n_ssids; 11159 if (ie_len) 11160 request->req.ie = (void *)request + ie_offset; 11161 11162 i = 0; 11163 if (scan_freqs) { 11164 /* user specified, bail out if channel not found */ 11165 nla_for_each_nested(attr, scan_freqs, tmp) { 11166 struct ieee80211_channel *chan; 11167 int freq = nla_get_u32(attr); 11168 11169 if (!scan_freqs_khz) 11170 freq = MHZ_TO_KHZ(freq); 11171 11172 chan = ieee80211_get_channel_khz(wiphy, freq); 11173 if (!chan) { 11174 err = -EINVAL; 11175 goto out_free; 11176 } 11177 11178 /* Ignore disabled / no primary channels */ 11179 if (chan->flags & IEEE80211_CHAN_DISABLED || 11180 chan->flags & IEEE80211_CHAN_S1G_NO_PRIMARY || 11181 !cfg80211_wdev_channel_allowed(wdev, chan)) 11182 continue; 11183 11184 request->req.channels[i] = chan; 11185 i++; 11186 } 11187 } else { 11188 enum nl80211_band band; 11189 11190 /* all channels */ 11191 for (band = 0; band < NUM_NL80211_BANDS; band++) { 11192 int j; 11193 11194 if (!wiphy->bands[band]) 11195 continue; 11196 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 11197 struct ieee80211_channel *chan; 11198 11199 chan = &wiphy->bands[band]->channels[j]; 11200 11201 if (chan->flags & IEEE80211_CHAN_DISABLED || 11202 chan->flags & 11203 IEEE80211_CHAN_S1G_NO_PRIMARY || 11204 !cfg80211_wdev_channel_allowed(wdev, chan)) 11205 continue; 11206 11207 request->req.channels[i] = chan; 11208 i++; 11209 } 11210 } 11211 } 11212 11213 if (!i) { 11214 err = -EINVAL; 11215 goto out_free; 11216 } 11217 11218 request->req.n_channels = i; 11219 11220 for (i = 0; i < request->req.n_channels; i++) { 11221 struct ieee80211_channel *chan = request->req.channels[i]; 11222 11223 /* if we can go off-channel to the target channel we're good */ 11224 if (cfg80211_off_channel_oper_allowed(wdev, chan)) 11225 continue; 11226 11227 if (!cfg80211_wdev_on_sub_chan(wdev, chan, true)) { 11228 err = -EBUSY; 11229 goto out_free; 11230 } 11231 } 11232 11233 i = 0; 11234 if (n_ssids) { 11235 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { 11236 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 11237 err = -EINVAL; 11238 goto out_free; 11239 } 11240 request->req.ssids[i].ssid_len = nla_len(attr); 11241 memcpy(request->req.ssids[i].ssid, 11242 nla_data(attr), nla_len(attr)); 11243 i++; 11244 } 11245 } 11246 11247 if (info->attrs[NL80211_ATTR_IE]) { 11248 request->req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 11249 memcpy((void *)request->req.ie, 11250 nla_data(info->attrs[NL80211_ATTR_IE]), 11251 request->req.ie_len); 11252 } 11253 11254 for (i = 0; i < NUM_NL80211_BANDS; i++) 11255 if (wiphy->bands[i]) 11256 request->req.rates[i] = 11257 (1 << wiphy->bands[i]->n_bitrates) - 1; 11258 11259 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { 11260 nla_for_each_nested(attr, 11261 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], 11262 tmp) { 11263 int band = nla_type(attr); 11264 11265 if (band < 0 || band >= NUM_NL80211_BANDS) { 11266 err = -EINVAL; 11267 goto out_free; 11268 } 11269 11270 if (!wiphy->bands[band]) 11271 continue; 11272 11273 err = ieee80211_get_ratemask(wiphy->bands[band], 11274 nla_data(attr), 11275 nla_len(attr), 11276 &request->req.rates[band]); 11277 if (err) 11278 goto out_free; 11279 } 11280 } 11281 11282 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { 11283 request->req.duration = 11284 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); 11285 request->req.duration_mandatory = 11286 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); 11287 } 11288 11289 err = nl80211_check_scan_flags_reg(wiphy, wdev, info->attrs, request); 11290 if (err) 11291 goto out_free; 11292 11293 request->req.no_cck = 11294 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 11295 11296 /* Initial implementation used NL80211_ATTR_MAC to set the specific 11297 * BSSID to scan for. This was problematic because that same attribute 11298 * was already used for another purpose (local random MAC address). The 11299 * NL80211_ATTR_BSSID attribute was added to fix this. For backwards 11300 * compatibility with older userspace components, also use the 11301 * NL80211_ATTR_MAC value here if it can be determined to be used for 11302 * the specific BSSID use case instead of the random MAC address 11303 * (NL80211_ATTR_SCAN_FLAGS is used to enable random MAC address use). 11304 */ 11305 if (info->attrs[NL80211_ATTR_BSSID]) 11306 memcpy(request->req.bssid, 11307 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); 11308 else if (!(request->req.flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && 11309 info->attrs[NL80211_ATTR_MAC]) 11310 memcpy(request->req.bssid, 11311 nla_data(info->attrs[NL80211_ATTR_MAC]), 11312 ETH_ALEN); 11313 else 11314 eth_broadcast_addr(request->req.bssid); 11315 11316 request->req.tsf_report_link_id = 11317 nl80211_link_id_or_invalid(info->attrs); 11318 request->req.wdev = wdev; 11319 request->req.wiphy = &rdev->wiphy; 11320 request->req.scan_start = jiffies; 11321 11322 rdev->scan_req = request; 11323 err = cfg80211_scan(rdev); 11324 11325 if (err) 11326 goto out_free; 11327 11328 nl80211_send_scan_start(rdev, wdev); 11329 dev_hold(wdev->netdev); 11330 11331 return 0; 11332 11333 out_free: 11334 rdev->scan_req = NULL; 11335 kfree(request); 11336 11337 return err; 11338 } 11339 11340 static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info) 11341 { 11342 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11343 struct wireless_dev *wdev = info->user_ptr[1]; 11344 11345 if (!rdev->ops->abort_scan) 11346 return -EOPNOTSUPP; 11347 11348 if (rdev->scan_msg) 11349 return 0; 11350 11351 if (!rdev->scan_req) 11352 return -ENOENT; 11353 11354 rdev_abort_scan(rdev, wdev); 11355 return 0; 11356 } 11357 11358 static int 11359 nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans, 11360 struct cfg80211_sched_scan_request *request, 11361 struct nlattr **attrs) 11362 { 11363 int tmp, err, i = 0; 11364 struct nlattr *attr; 11365 11366 if (!attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) { 11367 u32 interval; 11368 11369 /* 11370 * If scan plans are not specified, 11371 * %NL80211_ATTR_SCHED_SCAN_INTERVAL will be specified. In this 11372 * case one scan plan will be set with the specified scan 11373 * interval and infinite number of iterations. 11374 */ 11375 interval = nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]); 11376 if (!interval) 11377 return -EINVAL; 11378 11379 request->scan_plans[0].interval = 11380 DIV_ROUND_UP(interval, MSEC_PER_SEC); 11381 if (!request->scan_plans[0].interval) 11382 return -EINVAL; 11383 11384 if (request->scan_plans[0].interval > 11385 wiphy->max_sched_scan_plan_interval) 11386 request->scan_plans[0].interval = 11387 wiphy->max_sched_scan_plan_interval; 11388 11389 return 0; 11390 } 11391 11392 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) { 11393 struct nlattr *plan[NL80211_SCHED_SCAN_PLAN_MAX + 1]; 11394 11395 if (WARN_ON(i >= n_plans)) 11396 return -EINVAL; 11397 11398 err = nla_parse_nested_deprecated(plan, 11399 NL80211_SCHED_SCAN_PLAN_MAX, 11400 attr, nl80211_plan_policy, 11401 NULL); 11402 if (err) 11403 return err; 11404 11405 if (!plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]) 11406 return -EINVAL; 11407 11408 request->scan_plans[i].interval = 11409 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]); 11410 if (!request->scan_plans[i].interval || 11411 request->scan_plans[i].interval > 11412 wiphy->max_sched_scan_plan_interval) 11413 return -EINVAL; 11414 11415 if (plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]) { 11416 request->scan_plans[i].iterations = 11417 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]); 11418 if (!request->scan_plans[i].iterations || 11419 (request->scan_plans[i].iterations > 11420 wiphy->max_sched_scan_plan_iterations)) 11421 return -EINVAL; 11422 } else if (i < n_plans - 1) { 11423 /* 11424 * All scan plans but the last one must specify 11425 * a finite number of iterations 11426 */ 11427 return -EINVAL; 11428 } 11429 11430 i++; 11431 } 11432 11433 /* 11434 * The last scan plan must not specify the number of 11435 * iterations, it is supposed to run infinitely 11436 */ 11437 if (request->scan_plans[n_plans - 1].iterations) 11438 return -EINVAL; 11439 11440 return 0; 11441 } 11442 11443 static struct cfg80211_sched_scan_request * 11444 nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev, 11445 struct nlattr **attrs, int max_match_sets) 11446 { 11447 struct cfg80211_sched_scan_request *request; 11448 struct nlattr *attr; 11449 int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i, n_plans = 0; 11450 enum nl80211_band band; 11451 size_t ie_len, size; 11452 struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1]; 11453 s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF; 11454 11455 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 11456 n_channels = validate_scan_freqs( 11457 attrs[NL80211_ATTR_SCAN_FREQUENCIES]); 11458 if (!n_channels) 11459 return ERR_PTR(-EINVAL); 11460 } else { 11461 n_channels = ieee80211_get_num_supported_channels(wiphy); 11462 } 11463 11464 if (attrs[NL80211_ATTR_SCAN_SSIDS]) 11465 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS], 11466 tmp) 11467 n_ssids++; 11468 11469 if (n_ssids > wiphy->max_sched_scan_ssids) 11470 return ERR_PTR(-EINVAL); 11471 11472 /* 11473 * First, count the number of 'real' matchsets. Due to an issue with 11474 * the old implementation, matchsets containing only the RSSI attribute 11475 * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default' 11476 * RSSI for all matchsets, rather than their own matchset for reporting 11477 * all APs with a strong RSSI. This is needed to be compatible with 11478 * older userspace that treated a matchset with only the RSSI as the 11479 * global RSSI for all other matchsets - if there are other matchsets. 11480 */ 11481 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 11482 nla_for_each_nested(attr, 11483 attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 11484 tmp) { 11485 struct nlattr *rssi; 11486 11487 err = nla_parse_nested_deprecated(tb, 11488 NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 11489 attr, 11490 nl80211_match_policy, 11491 NULL); 11492 if (err) 11493 return ERR_PTR(err); 11494 11495 /* SSID and BSSID are mutually exclusive */ 11496 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] && 11497 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) 11498 return ERR_PTR(-EINVAL); 11499 11500 /* add other standalone attributes here */ 11501 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] || 11502 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) { 11503 n_match_sets++; 11504 continue; 11505 } 11506 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 11507 if (rssi) 11508 default_match_rssi = nla_get_s32(rssi); 11509 } 11510 } 11511 11512 /* However, if there's no other matchset, add the RSSI one */ 11513 if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF) 11514 n_match_sets = 1; 11515 11516 if (n_match_sets > max_match_sets) 11517 return ERR_PTR(-EINVAL); 11518 11519 if (attrs[NL80211_ATTR_IE]) 11520 ie_len = nla_len(attrs[NL80211_ATTR_IE]); 11521 else 11522 ie_len = 0; 11523 11524 if (ie_len > wiphy->max_sched_scan_ie_len) 11525 return ERR_PTR(-EINVAL); 11526 11527 if (attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) { 11528 /* 11529 * NL80211_ATTR_SCHED_SCAN_INTERVAL must not be specified since 11530 * each scan plan already specifies its own interval 11531 */ 11532 if (attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 11533 return ERR_PTR(-EINVAL); 11534 11535 nla_for_each_nested(attr, 11536 attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) 11537 n_plans++; 11538 } else { 11539 /* 11540 * The scan interval attribute is kept for backward 11541 * compatibility. If no scan plans are specified and sched scan 11542 * interval is specified, one scan plan will be set with this 11543 * scan interval and infinite number of iterations. 11544 */ 11545 if (!attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 11546 return ERR_PTR(-EINVAL); 11547 11548 n_plans = 1; 11549 } 11550 11551 if (!n_plans || n_plans > wiphy->max_sched_scan_plans) 11552 return ERR_PTR(-EINVAL); 11553 11554 if (!wiphy_ext_feature_isset( 11555 wiphy, NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI) && 11556 (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] || 11557 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST])) 11558 return ERR_PTR(-EINVAL); 11559 11560 size = struct_size(request, channels, n_channels); 11561 size = size_add(size, array_size(sizeof(*request->ssids), n_ssids)); 11562 size = size_add(size, array_size(sizeof(*request->match_sets), 11563 n_match_sets)); 11564 size = size_add(size, array_size(sizeof(*request->scan_plans), 11565 n_plans)); 11566 size = size_add(size, ie_len); 11567 request = kzalloc(size, GFP_KERNEL); 11568 if (!request) 11569 return ERR_PTR(-ENOMEM); 11570 request->n_channels = n_channels; 11571 11572 if (n_ssids) 11573 request->ssids = (void *)request + 11574 struct_size(request, channels, n_channels); 11575 request->n_ssids = n_ssids; 11576 if (ie_len) { 11577 if (n_ssids) 11578 request->ie = (void *)(request->ssids + n_ssids); 11579 else 11580 request->ie = (void *)(request->channels + n_channels); 11581 } 11582 11583 if (n_match_sets) { 11584 if (request->ie) 11585 request->match_sets = (void *)(request->ie + ie_len); 11586 else if (n_ssids) 11587 request->match_sets = 11588 (void *)(request->ssids + n_ssids); 11589 else 11590 request->match_sets = 11591 (void *)(request->channels + n_channels); 11592 } 11593 request->n_match_sets = n_match_sets; 11594 11595 if (n_match_sets) 11596 request->scan_plans = (void *)(request->match_sets + 11597 n_match_sets); 11598 else if (request->ie) 11599 request->scan_plans = (void *)(request->ie + ie_len); 11600 else if (n_ssids) 11601 request->scan_plans = (void *)(request->ssids + n_ssids); 11602 else 11603 request->scan_plans = (void *)(request->channels + n_channels); 11604 11605 request->n_scan_plans = n_plans; 11606 11607 i = 0; 11608 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 11609 /* user specified, bail out if channel not found */ 11610 nla_for_each_nested(attr, 11611 attrs[NL80211_ATTR_SCAN_FREQUENCIES], 11612 tmp) { 11613 struct ieee80211_channel *chan; 11614 11615 chan = ieee80211_get_channel(wiphy, nla_get_u32(attr)); 11616 11617 if (!chan) { 11618 err = -EINVAL; 11619 goto out_free; 11620 } 11621 11622 /* ignore disabled channels */ 11623 if (chan->flags & IEEE80211_CHAN_DISABLED) 11624 continue; 11625 11626 request->channels[i] = chan; 11627 i++; 11628 } 11629 } else { 11630 /* all channels */ 11631 for (band = 0; band < NUM_NL80211_BANDS; band++) { 11632 int j; 11633 11634 if (!wiphy->bands[band]) 11635 continue; 11636 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 11637 struct ieee80211_channel *chan; 11638 11639 chan = &wiphy->bands[band]->channels[j]; 11640 11641 if (chan->flags & IEEE80211_CHAN_DISABLED) 11642 continue; 11643 11644 request->channels[i] = chan; 11645 i++; 11646 } 11647 } 11648 } 11649 11650 if (!i) { 11651 err = -EINVAL; 11652 goto out_free; 11653 } 11654 11655 request->n_channels = i; 11656 11657 i = 0; 11658 if (n_ssids) { 11659 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS], 11660 tmp) { 11661 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 11662 err = -EINVAL; 11663 goto out_free; 11664 } 11665 request->ssids[i].ssid_len = nla_len(attr); 11666 memcpy(request->ssids[i].ssid, nla_data(attr), 11667 nla_len(attr)); 11668 i++; 11669 } 11670 } 11671 11672 i = 0; 11673 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 11674 nla_for_each_nested(attr, 11675 attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 11676 tmp) { 11677 struct nlattr *ssid, *bssid, *rssi; 11678 11679 err = nla_parse_nested_deprecated(tb, 11680 NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 11681 attr, 11682 nl80211_match_policy, 11683 NULL); 11684 if (err) 11685 goto out_free; 11686 ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID]; 11687 bssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]; 11688 11689 if (!ssid && !bssid) { 11690 i++; 11691 continue; 11692 } 11693 11694 if (WARN_ON(i >= n_match_sets)) { 11695 /* this indicates a programming error, 11696 * the loop above should have verified 11697 * things properly 11698 */ 11699 err = -EINVAL; 11700 goto out_free; 11701 } 11702 11703 if (ssid) { 11704 memcpy(request->match_sets[i].ssid.ssid, 11705 nla_data(ssid), nla_len(ssid)); 11706 request->match_sets[i].ssid.ssid_len = 11707 nla_len(ssid); 11708 } 11709 if (bssid) 11710 memcpy(request->match_sets[i].bssid, 11711 nla_data(bssid), ETH_ALEN); 11712 11713 /* special attribute - old implementation w/a */ 11714 request->match_sets[i].rssi_thold = default_match_rssi; 11715 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 11716 if (rssi) 11717 request->match_sets[i].rssi_thold = 11718 nla_get_s32(rssi); 11719 i++; 11720 } 11721 11722 /* there was no other matchset, so the RSSI one is alone */ 11723 if (i == 0 && n_match_sets) 11724 request->match_sets[0].rssi_thold = default_match_rssi; 11725 11726 request->min_rssi_thold = INT_MAX; 11727 for (i = 0; i < n_match_sets; i++) 11728 request->min_rssi_thold = 11729 min(request->match_sets[i].rssi_thold, 11730 request->min_rssi_thold); 11731 } else { 11732 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF; 11733 } 11734 11735 if (ie_len) { 11736 request->ie_len = ie_len; 11737 memcpy((void *)request->ie, 11738 nla_data(attrs[NL80211_ATTR_IE]), 11739 request->ie_len); 11740 } 11741 11742 err = nl80211_check_scan_flags_sched(wiphy, wdev, attrs, request); 11743 if (err) 11744 goto out_free; 11745 11746 if (attrs[NL80211_ATTR_SCHED_SCAN_DELAY]) 11747 request->delay = 11748 nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_DELAY]); 11749 11750 if (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]) { 11751 request->relative_rssi = nla_get_s8( 11752 attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]); 11753 request->relative_rssi_set = true; 11754 } 11755 11756 if (request->relative_rssi_set && 11757 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]) { 11758 struct nl80211_bss_select_rssi_adjust *rssi_adjust; 11759 11760 rssi_adjust = nla_data( 11761 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]); 11762 request->rssi_adjust.band = rssi_adjust->band; 11763 request->rssi_adjust.delta = rssi_adjust->delta; 11764 if (!is_band_valid(wiphy, request->rssi_adjust.band)) { 11765 err = -EINVAL; 11766 goto out_free; 11767 } 11768 } 11769 11770 err = nl80211_parse_sched_scan_plans(wiphy, n_plans, request, attrs); 11771 if (err) 11772 goto out_free; 11773 11774 request->scan_start = jiffies; 11775 11776 return request; 11777 11778 out_free: 11779 kfree(request); 11780 return ERR_PTR(err); 11781 } 11782 11783 static int nl80211_start_sched_scan(struct sk_buff *skb, 11784 struct genl_info *info) 11785 { 11786 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11787 struct net_device *dev = info->user_ptr[1]; 11788 struct wireless_dev *wdev = dev->ieee80211_ptr; 11789 struct cfg80211_sched_scan_request *sched_scan_req; 11790 bool want_multi; 11791 int err; 11792 11793 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start) 11794 return -EOPNOTSUPP; 11795 11796 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI]; 11797 err = cfg80211_sched_scan_req_possible(rdev, want_multi); 11798 if (err) 11799 return err; 11800 11801 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev, 11802 info->attrs, 11803 rdev->wiphy.max_match_sets); 11804 11805 err = PTR_ERR_OR_ZERO(sched_scan_req); 11806 if (err) 11807 goto out_err; 11808 11809 /* leave request id zero for legacy request 11810 * or if driver does not support multi-scheduled scan 11811 */ 11812 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) 11813 sched_scan_req->reqid = cfg80211_assign_cookie(rdev); 11814 11815 err = rdev_sched_scan_start(rdev, dev, sched_scan_req); 11816 if (err) 11817 goto out_free; 11818 11819 sched_scan_req->dev = dev; 11820 sched_scan_req->wiphy = &rdev->wiphy; 11821 11822 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 11823 sched_scan_req->owner_nlportid = info->snd_portid; 11824 11825 cfg80211_add_sched_scan_req(rdev, sched_scan_req); 11826 11827 nl80211_send_sched_scan(sched_scan_req, NL80211_CMD_START_SCHED_SCAN); 11828 return 0; 11829 11830 out_free: 11831 kfree(sched_scan_req); 11832 out_err: 11833 return err; 11834 } 11835 11836 static int nl80211_stop_sched_scan(struct sk_buff *skb, 11837 struct genl_info *info) 11838 { 11839 struct cfg80211_sched_scan_request *req; 11840 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11841 u64 cookie; 11842 11843 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop) 11844 return -EOPNOTSUPP; 11845 11846 if (info->attrs[NL80211_ATTR_COOKIE]) { 11847 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 11848 return __cfg80211_stop_sched_scan(rdev, cookie, false); 11849 } 11850 11851 req = list_first_or_null_rcu(&rdev->sched_scan_req_list, 11852 struct cfg80211_sched_scan_request, 11853 list); 11854 if (!req || req->reqid || 11855 (req->owner_nlportid && 11856 req->owner_nlportid != info->snd_portid)) 11857 return -ENOENT; 11858 11859 return cfg80211_stop_sched_scan_req(rdev, req, false); 11860 } 11861 11862 static int nl80211_start_radar_detection(struct sk_buff *skb, 11863 struct genl_info *info) 11864 { 11865 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11866 struct net_device *dev = info->user_ptr[1]; 11867 struct wireless_dev *wdev = dev->ieee80211_ptr; 11868 int link_id = nl80211_link_id(info->attrs); 11869 struct wiphy *wiphy = wdev->wiphy; 11870 struct cfg80211_chan_def chandef; 11871 enum nl80211_dfs_regions dfs_region; 11872 unsigned int cac_time_ms; 11873 int err; 11874 11875 flush_delayed_work(&rdev->dfs_update_channels_wk); 11876 11877 switch (wdev->iftype) { 11878 case NL80211_IFTYPE_AP: 11879 case NL80211_IFTYPE_P2P_GO: 11880 case NL80211_IFTYPE_MESH_POINT: 11881 case NL80211_IFTYPE_ADHOC: 11882 break; 11883 default: 11884 /* caution - see cfg80211_beaconing_iface_active() below */ 11885 return -EINVAL; 11886 } 11887 11888 guard(wiphy)(wiphy); 11889 11890 dfs_region = reg_get_dfs_region(wiphy); 11891 if (dfs_region == NL80211_DFS_UNSET) 11892 return -EINVAL; 11893 11894 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef, 11895 false); 11896 if (err) 11897 return err; 11898 11899 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); 11900 if (err < 0) 11901 return err; 11902 11903 if (err == 0) 11904 return -EINVAL; 11905 11906 if (!cfg80211_chandef_dfs_usable(wiphy, &chandef)) 11907 return -EINVAL; 11908 11909 if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_BACKGROUND])) 11910 return cfg80211_start_background_radar_detection(rdev, wdev, 11911 &chandef); 11912 11913 if (cfg80211_beaconing_iface_active(wdev)) { 11914 /* During MLO other link(s) can beacon, only the current link 11915 * can not already beacon 11916 */ 11917 if (wdev->valid_links && 11918 !wdev->links[link_id].ap.beacon_interval) { 11919 /* nothing */ 11920 } else { 11921 return -EBUSY; 11922 } 11923 } 11924 11925 if (wdev->links[link_id].cac_started) 11926 return -EBUSY; 11927 11928 /* CAC start is offloaded to HW and can't be started manually */ 11929 if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD)) 11930 return -EOPNOTSUPP; 11931 11932 if (!rdev->ops->start_radar_detection) 11933 return -EOPNOTSUPP; 11934 11935 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); 11936 if (WARN_ON(!cac_time_ms)) 11937 cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS; 11938 11939 err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms, 11940 link_id); 11941 if (err) 11942 return err; 11943 11944 switch (wdev->iftype) { 11945 case NL80211_IFTYPE_AP: 11946 case NL80211_IFTYPE_P2P_GO: 11947 wdev->links[link_id].ap.chandef = chandef; 11948 break; 11949 case NL80211_IFTYPE_ADHOC: 11950 wdev->u.ibss.chandef = chandef; 11951 break; 11952 case NL80211_IFTYPE_MESH_POINT: 11953 wdev->u.mesh.chandef = chandef; 11954 break; 11955 default: 11956 break; 11957 } 11958 wdev->links[link_id].cac_started = true; 11959 wdev->links[link_id].cac_start_time = jiffies; 11960 wdev->links[link_id].cac_time_ms = cac_time_ms; 11961 cfg80211_set_cac_state(wiphy, &chandef, true); 11962 11963 return 0; 11964 } 11965 11966 static int nl80211_notify_radar_detection(struct sk_buff *skb, 11967 struct genl_info *info) 11968 { 11969 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11970 struct net_device *dev = info->user_ptr[1]; 11971 struct wireless_dev *wdev = dev->ieee80211_ptr; 11972 struct wiphy *wiphy = wdev->wiphy; 11973 struct cfg80211_chan_def chandef; 11974 enum nl80211_dfs_regions dfs_region; 11975 int err; 11976 11977 dfs_region = reg_get_dfs_region(wiphy); 11978 if (dfs_region == NL80211_DFS_UNSET) { 11979 GENL_SET_ERR_MSG(info, 11980 "DFS Region is not set. Unexpected Radar indication"); 11981 return -EINVAL; 11982 } 11983 11984 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef, 11985 false); 11986 if (err) { 11987 GENL_SET_ERR_MSG(info, "Unable to extract chandef info"); 11988 return err; 11989 } 11990 11991 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); 11992 if (err < 0) { 11993 GENL_SET_ERR_MSG(info, "chandef is invalid"); 11994 return err; 11995 } 11996 11997 if (err == 0) { 11998 GENL_SET_ERR_MSG(info, 11999 "Unexpected Radar indication for chandef/iftype"); 12000 return -EINVAL; 12001 } 12002 12003 /* Do not process this notification if radar is already detected 12004 * by kernel on this channel, and return success. 12005 */ 12006 if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE) 12007 return 0; 12008 12009 cfg80211_set_dfs_state(wiphy, &chandef, NL80211_DFS_UNAVAILABLE); 12010 12011 cfg80211_sched_dfs_chan_update(rdev); 12012 12013 rdev->radar_chandef = chandef; 12014 12015 /* Propagate this notification to other radios as well */ 12016 queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); 12017 12018 return 0; 12019 } 12020 12021 static int nl80211_parse_counter_offsets(struct cfg80211_registered_device *rdev, 12022 const u8 *data, size_t datalen, 12023 int first_count, struct nlattr *attr, 12024 const u16 **offsets, unsigned int *n_offsets) 12025 { 12026 int i; 12027 12028 *n_offsets = 0; 12029 12030 if (!attr) 12031 return 0; 12032 12033 if (!nla_len(attr) || (nla_len(attr) % sizeof(u16))) 12034 return -EINVAL; 12035 12036 *n_offsets = nla_len(attr) / sizeof(u16); 12037 if (rdev->wiphy.max_num_csa_counters && 12038 (*n_offsets > rdev->wiphy.max_num_csa_counters)) 12039 return -EINVAL; 12040 12041 *offsets = nla_data(attr); 12042 12043 /* sanity checks - counters should fit and be the same */ 12044 for (i = 0; i < *n_offsets; i++) { 12045 u16 offset = (*offsets)[i]; 12046 12047 if (offset >= datalen) 12048 return -EINVAL; 12049 12050 if (first_count != -1 && data[offset] != first_count) 12051 return -EINVAL; 12052 } 12053 12054 return 0; 12055 } 12056 12057 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info) 12058 { 12059 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12060 unsigned int link_id = nl80211_link_id(info->attrs); 12061 struct net_device *dev = info->user_ptr[1]; 12062 struct wireless_dev *wdev = dev->ieee80211_ptr; 12063 struct cfg80211_csa_settings params; 12064 struct nlattr **csa_attrs = NULL; 12065 int err; 12066 bool need_new_beacon = false; 12067 bool need_handle_dfs_flag = true; 12068 bool permit_npca = false; 12069 u32 cs_count; 12070 12071 if (!rdev->ops->channel_switch || 12072 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) 12073 return -EOPNOTSUPP; 12074 12075 switch (dev->ieee80211_ptr->iftype) { 12076 case NL80211_IFTYPE_AP: 12077 case NL80211_IFTYPE_P2P_GO: 12078 need_new_beacon = true; 12079 /* For all modes except AP the handle_dfs flag needs to be 12080 * supplied to tell the kernel that userspace will handle radar 12081 * events when they happen. Otherwise a switch to a channel 12082 * requiring DFS will be rejected. 12083 */ 12084 need_handle_dfs_flag = false; 12085 12086 permit_npca = true; 12087 12088 /* useless if AP is not running */ 12089 if (!wdev->links[link_id].ap.beacon_interval) 12090 return -ENOTCONN; 12091 break; 12092 case NL80211_IFTYPE_ADHOC: 12093 if (!wdev->u.ibss.ssid_len) 12094 return -ENOTCONN; 12095 break; 12096 case NL80211_IFTYPE_MESH_POINT: 12097 if (!wdev->u.mesh.id_len) 12098 return -ENOTCONN; 12099 break; 12100 default: 12101 return -EOPNOTSUPP; 12102 } 12103 12104 memset(¶ms, 0, sizeof(params)); 12105 params.beacon_csa.ftm_responder = -1; 12106 12107 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 12108 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) 12109 return -EINVAL; 12110 12111 /* only important for AP, IBSS and mesh create IEs internally */ 12112 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) 12113 return -EINVAL; 12114 12115 /* Even though the attribute is u32, the specification says 12116 * u8, so let's make sure we don't overflow. 12117 */ 12118 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); 12119 if (cs_count > 255) 12120 return -EINVAL; 12121 12122 params.count = cs_count; 12123 12124 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 12125 ¶ms.chandef, permit_npca); 12126 if (err) 12127 goto free; 12128 12129 err = nl80211_check_npca(rdev, ¶ms.chandef, wdev->iftype, 12130 info->extack); 12131 if (err) 12132 goto free; 12133 12134 if (!need_new_beacon) 12135 goto skip_beacons; 12136 12137 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_after, 12138 params.chandef.chan, info->extack); 12139 if (err) 12140 goto free; 12141 12142 csa_attrs = kzalloc_objs(*csa_attrs, NL80211_ATTR_MAX + 1); 12143 if (!csa_attrs) { 12144 err = -ENOMEM; 12145 goto free; 12146 } 12147 12148 err = nla_parse_nested_deprecated(csa_attrs, NL80211_ATTR_MAX, 12149 info->attrs[NL80211_ATTR_CSA_IES], 12150 nl80211_policy, info->extack); 12151 if (err) 12152 goto free; 12153 12154 err = nl80211_parse_beacon(rdev, csa_attrs, ¶ms.beacon_csa, 12155 wdev->links[link_id].ap.chandef.chan, 12156 info->extack); 12157 if (err) 12158 goto free; 12159 12160 if (!csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON]) { 12161 err = -EINVAL; 12162 goto free; 12163 } 12164 12165 err = nl80211_parse_counter_offsets(rdev, params.beacon_csa.tail, 12166 params.beacon_csa.tail_len, 12167 params.count, 12168 csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON], 12169 ¶ms.counter_offsets_beacon, 12170 ¶ms.n_counter_offsets_beacon); 12171 if (err) 12172 goto free; 12173 12174 err = nl80211_parse_counter_offsets(rdev, params.beacon_csa.probe_resp, 12175 params.beacon_csa.probe_resp_len, 12176 params.count, 12177 csa_attrs[NL80211_ATTR_CNTDWN_OFFS_PRESP], 12178 ¶ms.counter_offsets_presp, 12179 ¶ms.n_counter_offsets_presp); 12180 if (err) 12181 goto free; 12182 12183 skip_beacons: 12184 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, 12185 wdev->iftype)) { 12186 err = -EINVAL; 12187 goto free; 12188 } 12189 12190 err = cfg80211_chandef_dfs_required(wdev->wiphy, 12191 ¶ms.chandef, 12192 wdev->iftype); 12193 if (err < 0) 12194 goto free; 12195 12196 if (err > 0) { 12197 params.radar_required = true; 12198 if (need_handle_dfs_flag && 12199 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) { 12200 err = -EINVAL; 12201 goto free; 12202 } 12203 } 12204 12205 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) 12206 params.block_tx = true; 12207 12208 if ((wdev->iftype == NL80211_IFTYPE_AP || 12209 wdev->iftype == NL80211_IFTYPE_P2P_GO) && 12210 info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { 12211 err = nl80211_parse_unsol_bcast_probe_resp( 12212 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], 12213 ¶ms.unsol_bcast_probe_resp); 12214 if (err) 12215 goto free; 12216 } 12217 12218 params.link_id = link_id; 12219 err = rdev_channel_switch(rdev, dev, ¶ms); 12220 12221 free: 12222 kfree(params.beacon_after.mbssid_ies); 12223 kfree(params.beacon_csa.mbssid_ies); 12224 kfree(params.beacon_after.rnr_ies); 12225 kfree(params.beacon_csa.rnr_ies); 12226 kfree(csa_attrs); 12227 return err; 12228 } 12229 12230 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb, 12231 u32 seq, int flags, 12232 struct cfg80211_registered_device *rdev, 12233 struct wireless_dev *wdev, 12234 struct cfg80211_internal_bss *intbss) 12235 { 12236 struct cfg80211_bss *res = &intbss->pub; 12237 const struct cfg80211_bss_ies *ies; 12238 unsigned int link_id; 12239 void *hdr; 12240 struct nlattr *bss; 12241 12242 lockdep_assert_wiphy(wdev->wiphy); 12243 12244 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 12245 NL80211_CMD_NEW_SCAN_RESULTS); 12246 if (!hdr) 12247 return -1; 12248 12249 genl_dump_check_consistent(cb, hdr); 12250 12251 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) 12252 goto nla_put_failure; 12253 if (wdev->netdev && 12254 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) 12255 goto nla_put_failure; 12256 if (nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 12257 NL80211_ATTR_PAD)) 12258 goto nla_put_failure; 12259 12260 bss = nla_nest_start_noflag(msg, NL80211_ATTR_BSS); 12261 if (!bss) 12262 goto nla_put_failure; 12263 if ((!is_zero_ether_addr(res->bssid) && 12264 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) 12265 goto nla_put_failure; 12266 12267 rcu_read_lock(); 12268 /* indicate whether we have probe response data or not */ 12269 if (rcu_access_pointer(res->proberesp_ies) && 12270 nla_put_flag(msg, NL80211_BSS_PRESP_DATA)) 12271 goto fail_unlock_rcu; 12272 12273 /* this pointer prefers to be pointed to probe response data 12274 * but is always valid 12275 */ 12276 ies = rcu_dereference(res->ies); 12277 if (ies) { 12278 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf, 12279 NL80211_BSS_PAD)) 12280 goto fail_unlock_rcu; 12281 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, 12282 ies->len, ies->data)) 12283 goto fail_unlock_rcu; 12284 } 12285 12286 /* and this pointer is always (unless driver didn't know) beacon data */ 12287 ies = rcu_dereference(res->beacon_ies); 12288 if (ies && ies->from_beacon) { 12289 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf, 12290 NL80211_BSS_PAD)) 12291 goto fail_unlock_rcu; 12292 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, 12293 ies->len, ies->data)) 12294 goto fail_unlock_rcu; 12295 } 12296 rcu_read_unlock(); 12297 12298 if (res->beacon_interval && 12299 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) 12300 goto nla_put_failure; 12301 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || 12302 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || 12303 nla_put_u32(msg, NL80211_BSS_FREQUENCY_OFFSET, 12304 res->channel->freq_offset) || 12305 nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO, 12306 jiffies_to_msecs(jiffies - intbss->ts))) 12307 goto nla_put_failure; 12308 12309 if (intbss->parent_tsf && 12310 (nla_put_u64_64bit(msg, NL80211_BSS_PARENT_TSF, 12311 intbss->parent_tsf, NL80211_BSS_PAD) || 12312 nla_put(msg, NL80211_BSS_PARENT_BSSID, ETH_ALEN, 12313 intbss->parent_bssid))) 12314 goto nla_put_failure; 12315 12316 if (res->ts_boottime && 12317 nla_put_u64_64bit(msg, NL80211_BSS_LAST_SEEN_BOOTTIME, 12318 res->ts_boottime, NL80211_BSS_PAD)) 12319 goto nla_put_failure; 12320 12321 if (!nl80211_put_signal(msg, intbss->pub.chains, 12322 intbss->pub.chain_signal, 12323 NL80211_BSS_CHAIN_SIGNAL)) 12324 goto nla_put_failure; 12325 12326 if (intbss->bss_source != BSS_SOURCE_STA_PROFILE) { 12327 switch (rdev->wiphy.signal_type) { 12328 case CFG80211_SIGNAL_TYPE_MBM: 12329 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, 12330 res->signal)) 12331 goto nla_put_failure; 12332 break; 12333 case CFG80211_SIGNAL_TYPE_UNSPEC: 12334 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, 12335 res->signal)) 12336 goto nla_put_failure; 12337 break; 12338 default: 12339 break; 12340 } 12341 } 12342 12343 switch (wdev->iftype) { 12344 case NL80211_IFTYPE_P2P_CLIENT: 12345 case NL80211_IFTYPE_STATION: 12346 for_each_valid_link(wdev, link_id) { 12347 if (intbss == wdev->links[link_id].client.current_bss && 12348 (nla_put_u32(msg, NL80211_BSS_STATUS, 12349 NL80211_BSS_STATUS_ASSOCIATED) || 12350 (wdev->valid_links && 12351 (nla_put_u8(msg, NL80211_BSS_MLO_LINK_ID, 12352 link_id) || 12353 nla_put(msg, NL80211_BSS_MLD_ADDR, ETH_ALEN, 12354 wdev->u.client.connected_addr))))) 12355 goto nla_put_failure; 12356 } 12357 break; 12358 case NL80211_IFTYPE_ADHOC: 12359 if (intbss == wdev->u.ibss.current_bss && 12360 nla_put_u32(msg, NL80211_BSS_STATUS, 12361 NL80211_BSS_STATUS_IBSS_JOINED)) 12362 goto nla_put_failure; 12363 break; 12364 default: 12365 break; 12366 } 12367 12368 if (nla_put_u32(msg, NL80211_BSS_USE_FOR, res->use_for)) 12369 goto nla_put_failure; 12370 12371 if (res->cannot_use_reasons && 12372 nla_put_u64_64bit(msg, NL80211_BSS_CANNOT_USE_REASONS, 12373 res->cannot_use_reasons, 12374 NL80211_BSS_PAD)) 12375 goto nla_put_failure; 12376 12377 nla_nest_end(msg, bss); 12378 12379 genlmsg_end(msg, hdr); 12380 return 0; 12381 12382 fail_unlock_rcu: 12383 rcu_read_unlock(); 12384 nla_put_failure: 12385 genlmsg_cancel(msg, hdr); 12386 return -EMSGSIZE; 12387 } 12388 12389 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb) 12390 { 12391 struct cfg80211_registered_device *rdev; 12392 struct cfg80211_internal_bss *scan; 12393 struct wireless_dev *wdev; 12394 struct nlattr **attrbuf; 12395 int start = cb->args[2], idx = 0; 12396 bool dump_include_use_data; 12397 int err; 12398 12399 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 12400 if (!attrbuf) 12401 return -ENOMEM; 12402 12403 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, attrbuf); 12404 if (err) { 12405 kfree(attrbuf); 12406 return err; 12407 } 12408 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 12409 __acquire(&rdev->wiphy.mtx); 12410 12411 dump_include_use_data = 12412 attrbuf[NL80211_ATTR_BSS_DUMP_INCLUDE_USE_DATA]; 12413 kfree(attrbuf); 12414 12415 spin_lock_bh(&rdev->bss_lock); 12416 12417 /* 12418 * dump_scan will be called multiple times to break up the scan results 12419 * into multiple messages. It is unlikely that any more bss-es will be 12420 * expired after the first call, so only call only call this on the 12421 * first dump_scan invocation. 12422 */ 12423 if (start == 0) 12424 cfg80211_bss_expire(rdev); 12425 12426 cb->seq = rdev->bss_generation; 12427 12428 list_for_each_entry(scan, &rdev->bss_list, list) { 12429 if (++idx <= start) 12430 continue; 12431 if (!dump_include_use_data && 12432 !(scan->pub.use_for & NL80211_BSS_USE_FOR_NORMAL)) 12433 continue; 12434 if (nl80211_send_bss(skb, cb, 12435 cb->nlh->nlmsg_seq, NLM_F_MULTI, 12436 rdev, wdev, scan) < 0) { 12437 idx--; 12438 break; 12439 } 12440 } 12441 12442 spin_unlock_bh(&rdev->bss_lock); 12443 12444 cb->args[2] = idx; 12445 wiphy_unlock(&rdev->wiphy); 12446 12447 return skb->len; 12448 } 12449 12450 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq, 12451 int flags, struct net_device *dev, 12452 bool allow_radio_stats, 12453 struct survey_info *survey) 12454 { 12455 void *hdr; 12456 struct nlattr *infoattr; 12457 12458 /* skip radio stats if userspace didn't request them */ 12459 if (!survey->channel && !allow_radio_stats) 12460 return 0; 12461 12462 hdr = nl80211hdr_put(msg, portid, seq, flags, 12463 NL80211_CMD_NEW_SURVEY_RESULTS); 12464 if (!hdr) 12465 return -ENOMEM; 12466 12467 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 12468 goto nla_put_failure; 12469 12470 infoattr = nla_nest_start_noflag(msg, NL80211_ATTR_SURVEY_INFO); 12471 if (!infoattr) 12472 goto nla_put_failure; 12473 12474 if (survey->channel && 12475 nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY, 12476 survey->channel->center_freq)) 12477 goto nla_put_failure; 12478 12479 if (survey->channel && survey->channel->freq_offset && 12480 nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY_OFFSET, 12481 survey->channel->freq_offset)) 12482 goto nla_put_failure; 12483 12484 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && 12485 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) 12486 goto nla_put_failure; 12487 if ((survey->filled & SURVEY_INFO_IN_USE) && 12488 nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE)) 12489 goto nla_put_failure; 12490 if ((survey->filled & SURVEY_INFO_TIME) && 12491 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME, 12492 survey->time, NL80211_SURVEY_INFO_PAD)) 12493 goto nla_put_failure; 12494 if ((survey->filled & SURVEY_INFO_TIME_BUSY) && 12495 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BUSY, 12496 survey->time_busy, NL80211_SURVEY_INFO_PAD)) 12497 goto nla_put_failure; 12498 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) && 12499 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_EXT_BUSY, 12500 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD)) 12501 goto nla_put_failure; 12502 if ((survey->filled & SURVEY_INFO_TIME_RX) && 12503 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_RX, 12504 survey->time_rx, NL80211_SURVEY_INFO_PAD)) 12505 goto nla_put_failure; 12506 if ((survey->filled & SURVEY_INFO_TIME_TX) && 12507 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_TX, 12508 survey->time_tx, NL80211_SURVEY_INFO_PAD)) 12509 goto nla_put_failure; 12510 if ((survey->filled & SURVEY_INFO_TIME_SCAN) && 12511 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_SCAN, 12512 survey->time_scan, NL80211_SURVEY_INFO_PAD)) 12513 goto nla_put_failure; 12514 if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) && 12515 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BSS_RX, 12516 survey->time_bss_rx, NL80211_SURVEY_INFO_PAD)) 12517 goto nla_put_failure; 12518 12519 nla_nest_end(msg, infoattr); 12520 12521 genlmsg_end(msg, hdr); 12522 return 0; 12523 12524 nla_put_failure: 12525 genlmsg_cancel(msg, hdr); 12526 return -EMSGSIZE; 12527 } 12528 12529 static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb) 12530 { 12531 struct nlattr **attrbuf; 12532 struct survey_info survey; 12533 struct cfg80211_registered_device *rdev; 12534 struct wireless_dev *wdev; 12535 int survey_idx = cb->args[2]; 12536 int res; 12537 bool radio_stats; 12538 12539 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 12540 if (!attrbuf) 12541 return -ENOMEM; 12542 12543 res = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, attrbuf); 12544 if (res) { 12545 kfree(attrbuf); 12546 return res; 12547 } 12548 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 12549 __acquire(&rdev->wiphy.mtx); 12550 12551 /* prepare_wdev_dump parsed the attributes */ 12552 radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS]; 12553 12554 if (!wdev->netdev) { 12555 res = -EINVAL; 12556 goto out_err; 12557 } 12558 12559 if (!rdev->ops->dump_survey) { 12560 res = -EOPNOTSUPP; 12561 goto out_err; 12562 } 12563 12564 while (1) { 12565 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey); 12566 if (res == -ENOENT) 12567 break; 12568 if (res) 12569 goto out_err; 12570 12571 /* don't send disabled channels, but do send non-channel data */ 12572 if (survey.channel && 12573 survey.channel->flags & IEEE80211_CHAN_DISABLED) { 12574 survey_idx++; 12575 continue; 12576 } 12577 12578 if (nl80211_send_survey(skb, 12579 NETLINK_CB(cb->skb).portid, 12580 cb->nlh->nlmsg_seq, NLM_F_MULTI, 12581 wdev->netdev, radio_stats, &survey) < 0) 12582 goto out; 12583 survey_idx++; 12584 } 12585 12586 out: 12587 cb->args[2] = survey_idx; 12588 res = skb->len; 12589 out_err: 12590 kfree(attrbuf); 12591 wiphy_unlock(&rdev->wiphy); 12592 return res; 12593 } 12594 12595 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info) 12596 { 12597 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12598 struct net_device *dev = info->user_ptr[1]; 12599 struct ieee80211_channel *chan; 12600 const u8 *bssid, *ssid; 12601 int err, ssid_len; 12602 enum nl80211_auth_type auth_type; 12603 struct key_parse key; 12604 bool local_state_change; 12605 struct cfg80211_auth_request req = {}; 12606 u32 freq; 12607 12608 if (!info->attrs[NL80211_ATTR_MAC]) 12609 return -EINVAL; 12610 12611 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) 12612 return -EINVAL; 12613 12614 if (!info->attrs[NL80211_ATTR_SSID]) 12615 return -EINVAL; 12616 12617 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 12618 return -EINVAL; 12619 12620 err = nl80211_parse_key(info, &key); 12621 if (err) 12622 return err; 12623 12624 if (key.idx >= 0) { 12625 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) 12626 return -EINVAL; 12627 if (!key.p.key || !key.p.key_len) 12628 return -EINVAL; 12629 if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 || 12630 key.p.key_len != WLAN_KEY_LEN_WEP40) && 12631 (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 || 12632 key.p.key_len != WLAN_KEY_LEN_WEP104)) 12633 return -EINVAL; 12634 if (key.idx > 3) 12635 return -EINVAL; 12636 } else { 12637 key.p.key_len = 0; 12638 key.p.key = NULL; 12639 } 12640 12641 if (key.idx >= 0) { 12642 int i; 12643 bool ok = false; 12644 12645 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { 12646 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { 12647 ok = true; 12648 break; 12649 } 12650 } 12651 if (!ok) 12652 return -EINVAL; 12653 } 12654 12655 if (!rdev->ops->auth) 12656 return -EOPNOTSUPP; 12657 12658 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 12659 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 12660 return -EOPNOTSUPP; 12661 12662 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 12663 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); 12664 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 12665 freq += 12666 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 12667 12668 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); 12669 if (!chan) 12670 return -EINVAL; 12671 12672 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 12673 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 12674 12675 if (info->attrs[NL80211_ATTR_IE]) { 12676 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 12677 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 12678 } 12679 12680 if (info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]) { 12681 req.supported_selectors = 12682 nla_data(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 12683 req.supported_selectors_len = 12684 nla_len(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 12685 } 12686 12687 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 12688 if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE)) 12689 return -EINVAL; 12690 12691 if ((auth_type == NL80211_AUTHTYPE_SAE || 12692 auth_type == NL80211_AUTHTYPE_FILS_SK || 12693 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 12694 auth_type == NL80211_AUTHTYPE_FILS_PK || 12695 auth_type == NL80211_AUTHTYPE_EPPKE || 12696 auth_type == NL80211_AUTHTYPE_IEEE8021X) && 12697 !info->attrs[NL80211_ATTR_AUTH_DATA]) 12698 return -EINVAL; 12699 12700 if (info->attrs[NL80211_ATTR_AUTH_DATA]) { 12701 if (auth_type != NL80211_AUTHTYPE_SAE && 12702 auth_type != NL80211_AUTHTYPE_FILS_SK && 12703 auth_type != NL80211_AUTHTYPE_FILS_SK_PFS && 12704 auth_type != NL80211_AUTHTYPE_FILS_PK && 12705 auth_type != NL80211_AUTHTYPE_EPPKE && 12706 auth_type != NL80211_AUTHTYPE_IEEE8021X) 12707 return -EINVAL; 12708 req.auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]); 12709 req.auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]); 12710 } 12711 12712 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 12713 12714 /* 12715 * Since we no longer track auth state, ignore 12716 * requests to only change local state. 12717 */ 12718 if (local_state_change) 12719 return 0; 12720 12721 req.auth_type = auth_type; 12722 req.key = key.p.key; 12723 req.key_len = key.p.key_len; 12724 req.key_idx = key.idx; 12725 req.link_id = nl80211_link_id_or_invalid(info->attrs); 12726 if (req.link_id >= 0) { 12727 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) 12728 return -EINVAL; 12729 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) 12730 return -EINVAL; 12731 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 12732 if (!is_valid_ether_addr(req.ap_mld_addr)) 12733 return -EINVAL; 12734 } 12735 12736 req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len, 12737 IEEE80211_BSS_TYPE_ESS, 12738 IEEE80211_PRIVACY_ANY); 12739 if (!req.bss) 12740 return -ENOENT; 12741 12742 err = cfg80211_mlme_auth(rdev, dev, &req); 12743 12744 cfg80211_put_bss(&rdev->wiphy, req.bss); 12745 12746 return err; 12747 } 12748 12749 static int validate_pae_over_nl80211(struct cfg80211_registered_device *rdev, 12750 struct genl_info *info) 12751 { 12752 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 12753 GENL_SET_ERR_MSG(info, "SOCKET_OWNER not set"); 12754 return -EINVAL; 12755 } 12756 12757 if (!rdev->ops->tx_control_port || 12758 !wiphy_ext_feature_isset(&rdev->wiphy, 12759 NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211)) 12760 return -EOPNOTSUPP; 12761 12762 return 0; 12763 } 12764 12765 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, 12766 struct genl_info *info, 12767 struct cfg80211_crypto_settings *settings, 12768 int cipher_limit) 12769 { 12770 memset(settings, 0, sizeof(*settings)); 12771 12772 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; 12773 12774 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { 12775 u16 proto; 12776 12777 proto = nla_get_u16( 12778 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); 12779 settings->control_port_ethertype = cpu_to_be16(proto); 12780 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && 12781 proto != ETH_P_PAE) 12782 return -EINVAL; 12783 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) 12784 settings->control_port_no_encrypt = true; 12785 } else 12786 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); 12787 12788 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 12789 int r = validate_pae_over_nl80211(rdev, info); 12790 12791 if (r < 0) 12792 return r; 12793 12794 settings->control_port_over_nl80211 = true; 12795 12796 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH]) 12797 settings->control_port_no_preauth = true; 12798 } 12799 12800 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { 12801 void *data; 12802 int len, i; 12803 12804 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 12805 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 12806 settings->n_ciphers_pairwise = len / sizeof(u32); 12807 12808 if (len % sizeof(u32)) 12809 return -EINVAL; 12810 12811 if (settings->n_ciphers_pairwise > cipher_limit) 12812 return -EINVAL; 12813 12814 memcpy(settings->ciphers_pairwise, data, len); 12815 12816 for (i = 0; i < settings->n_ciphers_pairwise; i++) 12817 if (!cfg80211_supported_cipher_suite( 12818 &rdev->wiphy, 12819 settings->ciphers_pairwise[i])) 12820 return -EINVAL; 12821 } 12822 12823 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { 12824 settings->cipher_group = 12825 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); 12826 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, 12827 settings->cipher_group)) 12828 return -EINVAL; 12829 } 12830 12831 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) 12832 settings->wpa_versions = 12833 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); 12834 12835 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { 12836 void *data; 12837 int len; 12838 12839 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); 12840 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); 12841 settings->n_akm_suites = len / sizeof(u32); 12842 12843 if (len % sizeof(u32)) 12844 return -EINVAL; 12845 12846 if (settings->n_akm_suites > rdev->wiphy.max_num_akm_suites) 12847 return -EINVAL; 12848 12849 memcpy(settings->akm_suites, data, len); 12850 } 12851 12852 if (info->attrs[NL80211_ATTR_PMK]) { 12853 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN) 12854 return -EINVAL; 12855 if (!wiphy_ext_feature_isset(&rdev->wiphy, 12856 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK) && 12857 !wiphy_ext_feature_isset(&rdev->wiphy, 12858 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK)) 12859 return -EINVAL; 12860 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]); 12861 } 12862 12863 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) { 12864 if (!wiphy_ext_feature_isset(&rdev->wiphy, 12865 NL80211_EXT_FEATURE_SAE_OFFLOAD) && 12866 !wiphy_ext_feature_isset(&rdev->wiphy, 12867 NL80211_EXT_FEATURE_SAE_OFFLOAD_AP)) 12868 return -EINVAL; 12869 settings->sae_pwd = 12870 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]); 12871 settings->sae_pwd_len = 12872 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); 12873 } 12874 12875 settings->sae_pwe = 12876 nla_get_u8_default(info->attrs[NL80211_ATTR_SAE_PWE], 12877 NL80211_SAE_PWE_UNSPECIFIED); 12878 12879 return 0; 12880 } 12881 12882 static struct cfg80211_bss *nl80211_assoc_bss(struct cfg80211_registered_device *rdev, 12883 const u8 *ssid, int ssid_len, 12884 struct nlattr **attrs, 12885 int assoc_link_id, int link_id) 12886 { 12887 struct ieee80211_channel *chan; 12888 struct cfg80211_bss *bss; 12889 const u8 *bssid; 12890 u32 freq, use_for = 0; 12891 12892 if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_WIPHY_FREQ]) 12893 return ERR_PTR(-EINVAL); 12894 12895 bssid = nla_data(attrs[NL80211_ATTR_MAC]); 12896 12897 freq = MHZ_TO_KHZ(nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ])); 12898 if (attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 12899 freq += nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 12900 12901 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); 12902 if (!chan) 12903 return ERR_PTR(-EINVAL); 12904 12905 if (assoc_link_id >= 0) 12906 use_for = NL80211_BSS_USE_FOR_MLD_LINK; 12907 if (assoc_link_id == link_id) 12908 use_for |= NL80211_BSS_USE_FOR_NORMAL; 12909 12910 bss = __cfg80211_get_bss(&rdev->wiphy, chan, bssid, 12911 ssid, ssid_len, 12912 IEEE80211_BSS_TYPE_ESS, 12913 IEEE80211_PRIVACY_ANY, 12914 use_for); 12915 if (!bss) 12916 return ERR_PTR(-ENOENT); 12917 12918 return bss; 12919 } 12920 12921 static int nl80211_process_links(struct cfg80211_registered_device *rdev, 12922 struct cfg80211_assoc_link *links, 12923 int assoc_link_id, 12924 const u8 *ssid, int ssid_len, 12925 struct genl_info *info) 12926 { 12927 unsigned int attrsize = NUM_NL80211_ATTR * sizeof(struct nlattr *); 12928 struct nlattr **attrs __free(kfree) = kzalloc(attrsize, GFP_KERNEL); 12929 struct nlattr *link; 12930 unsigned int link_id; 12931 int rem, err; 12932 12933 if (!attrs) 12934 return -ENOMEM; 12935 12936 nla_for_each_nested(link, info->attrs[NL80211_ATTR_MLO_LINKS], rem) { 12937 memset(attrs, 0, attrsize); 12938 12939 nla_parse_nested(attrs, NL80211_ATTR_MAX, link, NULL, NULL); 12940 12941 if (!attrs[NL80211_ATTR_MLO_LINK_ID]) { 12942 NL_SET_BAD_ATTR(info->extack, link); 12943 return -EINVAL; 12944 } 12945 12946 link_id = nla_get_u8(attrs[NL80211_ATTR_MLO_LINK_ID]); 12947 /* cannot use the same link ID again */ 12948 if (links[link_id].bss) { 12949 NL_SET_BAD_ATTR(info->extack, link); 12950 return -EINVAL; 12951 } 12952 links[link_id].bss = 12953 nl80211_assoc_bss(rdev, ssid, ssid_len, attrs, 12954 assoc_link_id, link_id); 12955 if (IS_ERR(links[link_id].bss)) { 12956 err = PTR_ERR(links[link_id].bss); 12957 links[link_id].bss = NULL; 12958 NL_SET_ERR_MSG_ATTR(info->extack, link, 12959 "Error fetching BSS for link"); 12960 return err; 12961 } 12962 12963 if (attrs[NL80211_ATTR_IE]) { 12964 links[link_id].elems = nla_data(attrs[NL80211_ATTR_IE]); 12965 links[link_id].elems_len = 12966 nla_len(attrs[NL80211_ATTR_IE]); 12967 12968 if (cfg80211_find_elem(WLAN_EID_FRAGMENT, 12969 links[link_id].elems, 12970 links[link_id].elems_len)) { 12971 NL_SET_ERR_MSG_ATTR(info->extack, 12972 attrs[NL80211_ATTR_IE], 12973 "cannot deal with fragmentation"); 12974 return -EINVAL; 12975 } 12976 12977 if (cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE, 12978 links[link_id].elems, 12979 links[link_id].elems_len)) { 12980 NL_SET_ERR_MSG_ATTR(info->extack, 12981 attrs[NL80211_ATTR_IE], 12982 "cannot deal with non-inheritance"); 12983 return -EINVAL; 12984 } 12985 } 12986 } 12987 12988 return 0; 12989 } 12990 12991 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info) 12992 { 12993 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12994 struct net_device *dev = info->user_ptr[1]; 12995 struct cfg80211_assoc_request req = {}; 12996 const u8 *ap_addr, *ssid; 12997 unsigned int link_id; 12998 int err, ssid_len; 12999 13000 if (dev->ieee80211_ptr->conn_owner_nlportid && 13001 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 13002 return -EPERM; 13003 13004 if (!info->attrs[NL80211_ATTR_SSID]) 13005 return -EINVAL; 13006 13007 if (!rdev->ops->assoc) 13008 return -EOPNOTSUPP; 13009 13010 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 13011 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 13012 return -EOPNOTSUPP; 13013 13014 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 13015 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 13016 13017 if (info->attrs[NL80211_ATTR_IE]) { 13018 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13019 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13020 13021 if (cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE, 13022 req.ie, req.ie_len)) { 13023 NL_SET_ERR_MSG_ATTR(info->extack, 13024 info->attrs[NL80211_ATTR_IE], 13025 "non-inheritance makes no sense"); 13026 return -EINVAL; 13027 } 13028 } 13029 13030 if (info->attrs[NL80211_ATTR_USE_MFP]) { 13031 enum nl80211_mfp mfp = 13032 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 13033 if (mfp == NL80211_MFP_REQUIRED) 13034 req.use_mfp = true; 13035 else if (mfp != NL80211_MFP_NO) 13036 return -EINVAL; 13037 } 13038 13039 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 13040 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 13041 13042 if (info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]) { 13043 req.supported_selectors = 13044 nla_data(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 13045 req.supported_selectors_len = 13046 nla_len(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]); 13047 } 13048 13049 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 13050 req.flags |= ASSOC_REQ_DISABLE_HT; 13051 13052 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 13053 memcpy(&req.ht_capa_mask, 13054 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 13055 sizeof(req.ht_capa_mask)); 13056 13057 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 13058 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 13059 return -EINVAL; 13060 memcpy(&req.ht_capa, 13061 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 13062 sizeof(req.ht_capa)); 13063 } 13064 13065 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 13066 req.flags |= ASSOC_REQ_DISABLE_VHT; 13067 13068 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) 13069 req.flags |= ASSOC_REQ_DISABLE_HE; 13070 13071 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) 13072 req.flags |= ASSOC_REQ_DISABLE_EHT; 13073 13074 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_UHR])) 13075 req.flags |= ASSOC_REQ_DISABLE_UHR; 13076 13077 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 13078 memcpy(&req.vht_capa_mask, 13079 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 13080 sizeof(req.vht_capa_mask)); 13081 13082 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 13083 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 13084 return -EINVAL; 13085 memcpy(&req.vht_capa, 13086 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 13087 sizeof(req.vht_capa)); 13088 } 13089 13090 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { 13091 if (!((rdev->wiphy.features & 13092 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) && 13093 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && 13094 !wiphy_ext_feature_isset(&rdev->wiphy, 13095 NL80211_EXT_FEATURE_RRM)) 13096 return -EINVAL; 13097 req.flags |= ASSOC_REQ_USE_RRM; 13098 } 13099 13100 if (info->attrs[NL80211_ATTR_FILS_KEK]) { 13101 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); 13102 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); 13103 if (!info->attrs[NL80211_ATTR_FILS_NONCES]) 13104 return -EINVAL; 13105 req.fils_nonces = 13106 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); 13107 } 13108 13109 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) { 13110 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY]) 13111 return -EINVAL; 13112 memcpy(&req.s1g_capa_mask, 13113 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]), 13114 sizeof(req.s1g_capa_mask)); 13115 } 13116 13117 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) { 13118 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) 13119 return -EINVAL; 13120 memcpy(&req.s1g_capa, 13121 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]), 13122 sizeof(req.s1g_capa)); 13123 } 13124 13125 if (nla_get_flag(info->attrs[NL80211_ATTR_ASSOC_SPP_AMSDU])) { 13126 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13127 NL80211_EXT_FEATURE_SPP_AMSDU_SUPPORT)) { 13128 GENL_SET_ERR_MSG(info, "SPP A-MSDUs not supported"); 13129 return -EINVAL; 13130 } 13131 req.flags |= ASSOC_REQ_SPP_AMSDU; 13132 } 13133 13134 req.link_id = nl80211_link_id_or_invalid(info->attrs); 13135 13136 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { 13137 if (req.link_id < 0) 13138 return -EINVAL; 13139 13140 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) 13141 return -EINVAL; 13142 13143 if (info->attrs[NL80211_ATTR_MAC] || 13144 info->attrs[NL80211_ATTR_WIPHY_FREQ] || 13145 !info->attrs[NL80211_ATTR_MLD_ADDR]) 13146 return -EINVAL; 13147 13148 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 13149 ap_addr = req.ap_mld_addr; 13150 13151 err = nl80211_process_links(rdev, req.links, req.link_id, 13152 ssid, ssid_len, info); 13153 if (err) 13154 goto free; 13155 13156 if (!req.links[req.link_id].bss) { 13157 err = -EINVAL; 13158 goto free; 13159 } 13160 13161 if (req.links[req.link_id].elems_len) { 13162 GENL_SET_ERR_MSG(info, 13163 "cannot have per-link elems on assoc link"); 13164 err = -EINVAL; 13165 goto free; 13166 } 13167 13168 if (info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]) 13169 req.ext_mld_capa_ops = 13170 nla_get_u16(info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]); 13171 } else { 13172 if (req.link_id >= 0) 13173 return -EINVAL; 13174 13175 req.bss = nl80211_assoc_bss(rdev, ssid, ssid_len, info->attrs, 13176 -1, -1); 13177 if (IS_ERR(req.bss)) 13178 return PTR_ERR(req.bss); 13179 ap_addr = req.bss->bssid; 13180 13181 if (info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]) 13182 return -EINVAL; 13183 } 13184 13185 err = nl80211_crypto_settings(rdev, info, &req.crypto, 1); 13186 if (!err) { 13187 struct nlattr *link; 13188 int rem = 0; 13189 13190 err = cfg80211_mlme_assoc(rdev, dev, &req, 13191 info->extack); 13192 13193 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 13194 dev->ieee80211_ptr->conn_owner_nlportid = 13195 info->snd_portid; 13196 memcpy(dev->ieee80211_ptr->disconnect_bssid, 13197 ap_addr, ETH_ALEN); 13198 } 13199 13200 /* Report error from first problematic link */ 13201 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { 13202 nla_for_each_nested(link, 13203 info->attrs[NL80211_ATTR_MLO_LINKS], 13204 rem) { 13205 struct nlattr *link_id_attr = 13206 nla_find_nested(link, NL80211_ATTR_MLO_LINK_ID); 13207 13208 if (!link_id_attr) 13209 continue; 13210 13211 link_id = nla_get_u8(link_id_attr); 13212 13213 if (link_id == req.link_id) 13214 continue; 13215 13216 if (!req.links[link_id].error || 13217 WARN_ON(req.links[link_id].error > 0)) 13218 continue; 13219 13220 WARN_ON(err >= 0); 13221 13222 NL_SET_BAD_ATTR(info->extack, link); 13223 err = req.links[link_id].error; 13224 break; 13225 } 13226 } 13227 } 13228 13229 free: 13230 for (link_id = 0; link_id < ARRAY_SIZE(req.links); link_id++) 13231 cfg80211_put_bss(&rdev->wiphy, req.links[link_id].bss); 13232 cfg80211_put_bss(&rdev->wiphy, req.bss); 13233 13234 return err; 13235 } 13236 13237 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info) 13238 { 13239 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13240 struct net_device *dev = info->user_ptr[1]; 13241 const u8 *ie = NULL, *bssid; 13242 int ie_len = 0; 13243 u16 reason_code; 13244 bool local_state_change; 13245 13246 if (dev->ieee80211_ptr->conn_owner_nlportid && 13247 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 13248 return -EPERM; 13249 13250 if (!info->attrs[NL80211_ATTR_MAC]) 13251 return -EINVAL; 13252 13253 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 13254 return -EINVAL; 13255 13256 if (!rdev->ops->deauth) 13257 return -EOPNOTSUPP; 13258 13259 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 13260 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 13261 return -EOPNOTSUPP; 13262 13263 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 13264 13265 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 13266 if (reason_code == 0) { 13267 /* Reason Code 0 is reserved */ 13268 return -EINVAL; 13269 } 13270 13271 if (info->attrs[NL80211_ATTR_IE]) { 13272 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13273 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13274 } 13275 13276 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 13277 13278 return cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code, 13279 local_state_change); 13280 } 13281 13282 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) 13283 { 13284 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13285 struct net_device *dev = info->user_ptr[1]; 13286 const u8 *ie = NULL, *bssid; 13287 int ie_len = 0; 13288 u16 reason_code; 13289 bool local_state_change; 13290 13291 if (dev->ieee80211_ptr->conn_owner_nlportid && 13292 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 13293 return -EPERM; 13294 13295 if (!info->attrs[NL80211_ATTR_MAC]) 13296 return -EINVAL; 13297 13298 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 13299 return -EINVAL; 13300 13301 if (!rdev->ops->disassoc) 13302 return -EOPNOTSUPP; 13303 13304 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 13305 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 13306 return -EOPNOTSUPP; 13307 13308 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 13309 13310 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 13311 if (reason_code == 0) { 13312 /* Reason Code 0 is reserved */ 13313 return -EINVAL; 13314 } 13315 13316 if (info->attrs[NL80211_ATTR_IE]) { 13317 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13318 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13319 } 13320 13321 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 13322 13323 return cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code, 13324 local_state_change); 13325 } 13326 13327 static bool 13328 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev, 13329 int mcast_rate[NUM_NL80211_BANDS], 13330 int rateval) 13331 { 13332 struct wiphy *wiphy = &rdev->wiphy; 13333 bool found = false; 13334 int band, i; 13335 13336 for (band = 0; band < NUM_NL80211_BANDS; band++) { 13337 struct ieee80211_supported_band *sband; 13338 13339 sband = wiphy->bands[band]; 13340 if (!sband) 13341 continue; 13342 13343 for (i = 0; i < sband->n_bitrates; i++) { 13344 if (sband->bitrates[i].bitrate == rateval) { 13345 mcast_rate[band] = i + 1; 13346 found = true; 13347 break; 13348 } 13349 } 13350 } 13351 13352 return found; 13353 } 13354 13355 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info) 13356 { 13357 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13358 struct net_device *dev = info->user_ptr[1]; 13359 struct cfg80211_ibss_params ibss; 13360 struct wiphy *wiphy; 13361 struct cfg80211_cached_keys *connkeys = NULL; 13362 int err; 13363 13364 memset(&ibss, 0, sizeof(ibss)); 13365 13366 if (!info->attrs[NL80211_ATTR_SSID] || 13367 !nla_len(info->attrs[NL80211_ATTR_SSID])) 13368 return -EINVAL; 13369 13370 ibss.beacon_interval = 100; 13371 13372 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) 13373 ibss.beacon_interval = 13374 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 13375 13376 err = cfg80211_validate_beacon_int(rdev, NL80211_IFTYPE_ADHOC, 13377 ibss.beacon_interval); 13378 if (err) 13379 return err; 13380 13381 if (!rdev->ops->join_ibss) 13382 return -EOPNOTSUPP; 13383 13384 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 13385 return -EOPNOTSUPP; 13386 13387 wiphy = &rdev->wiphy; 13388 13389 if (info->attrs[NL80211_ATTR_MAC]) { 13390 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 13391 13392 if (!is_valid_ether_addr(ibss.bssid)) 13393 return -EINVAL; 13394 } 13395 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 13396 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 13397 13398 if (info->attrs[NL80211_ATTR_IE]) { 13399 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13400 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13401 } 13402 13403 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 13404 &ibss.chandef, false); 13405 if (err) 13406 return err; 13407 13408 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef, 13409 NL80211_IFTYPE_ADHOC)) 13410 return -EINVAL; 13411 13412 switch (ibss.chandef.width) { 13413 case NL80211_CHAN_WIDTH_5: 13414 case NL80211_CHAN_WIDTH_10: 13415 case NL80211_CHAN_WIDTH_20_NOHT: 13416 break; 13417 case NL80211_CHAN_WIDTH_20: 13418 case NL80211_CHAN_WIDTH_40: 13419 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) 13420 return -EINVAL; 13421 break; 13422 case NL80211_CHAN_WIDTH_80: 13423 case NL80211_CHAN_WIDTH_80P80: 13424 case NL80211_CHAN_WIDTH_160: 13425 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) 13426 return -EINVAL; 13427 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13428 NL80211_EXT_FEATURE_VHT_IBSS)) 13429 return -EINVAL; 13430 break; 13431 case NL80211_CHAN_WIDTH_320: 13432 return -EINVAL; 13433 default: 13434 return -EINVAL; 13435 } 13436 13437 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; 13438 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 13439 13440 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 13441 u8 *rates = 13442 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 13443 int n_rates = 13444 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 13445 struct ieee80211_supported_band *sband = 13446 wiphy->bands[ibss.chandef.chan->band]; 13447 13448 err = ieee80211_get_ratemask(sband, rates, n_rates, 13449 &ibss.basic_rates); 13450 if (err) 13451 return err; 13452 } 13453 13454 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 13455 memcpy(&ibss.ht_capa_mask, 13456 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 13457 sizeof(ibss.ht_capa_mask)); 13458 13459 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 13460 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 13461 return -EINVAL; 13462 memcpy(&ibss.ht_capa, 13463 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 13464 sizeof(ibss.ht_capa)); 13465 } 13466 13467 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 13468 !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate, 13469 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 13470 return -EINVAL; 13471 13472 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { 13473 bool no_ht = false; 13474 13475 connkeys = nl80211_parse_connkeys(rdev, dev->ieee80211_ptr, 13476 info, &no_ht); 13477 if (IS_ERR(connkeys)) 13478 return PTR_ERR(connkeys); 13479 13480 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) && 13481 no_ht) { 13482 kfree_sensitive(connkeys); 13483 return -EINVAL; 13484 } 13485 } 13486 13487 ibss.control_port = 13488 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); 13489 13490 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 13491 int r = validate_pae_over_nl80211(rdev, info); 13492 13493 if (r < 0) { 13494 kfree_sensitive(connkeys); 13495 return r; 13496 } 13497 13498 ibss.control_port_over_nl80211 = true; 13499 } 13500 13501 ibss.userspace_handles_dfs = 13502 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 13503 13504 err = __cfg80211_join_ibss(rdev, dev, &ibss, connkeys); 13505 if (err) 13506 kfree_sensitive(connkeys); 13507 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 13508 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 13509 13510 return err; 13511 } 13512 13513 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info) 13514 { 13515 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13516 struct net_device *dev = info->user_ptr[1]; 13517 13518 if (!rdev->ops->leave_ibss) 13519 return -EOPNOTSUPP; 13520 13521 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 13522 return -EOPNOTSUPP; 13523 13524 return cfg80211_leave_ibss(rdev, dev, false); 13525 } 13526 13527 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info) 13528 { 13529 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13530 struct net_device *dev = info->user_ptr[1]; 13531 int mcast_rate[NUM_NL80211_BANDS]; 13532 u32 nla_rate; 13533 13534 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && 13535 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && 13536 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) 13537 return -EOPNOTSUPP; 13538 13539 if (!rdev->ops->set_mcast_rate) 13540 return -EOPNOTSUPP; 13541 13542 memset(mcast_rate, 0, sizeof(mcast_rate)); 13543 13544 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) 13545 return -EINVAL; 13546 13547 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); 13548 if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate)) 13549 return -EINVAL; 13550 13551 return rdev_set_mcast_rate(rdev, dev, mcast_rate); 13552 } 13553 13554 static struct sk_buff * 13555 __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev, 13556 struct wireless_dev *wdev, int approxlen, 13557 u32 portid, u32 seq, enum nl80211_commands cmd, 13558 enum nl80211_attrs attr, 13559 const struct nl80211_vendor_cmd_info *info, 13560 gfp_t gfp) 13561 { 13562 struct sk_buff *skb; 13563 void *hdr; 13564 struct nlattr *data; 13565 13566 skb = nlmsg_new(approxlen + 100, gfp); 13567 if (!skb) 13568 return NULL; 13569 13570 hdr = nl80211hdr_put(skb, portid, seq, 0, cmd); 13571 if (!hdr) { 13572 kfree_skb(skb); 13573 return NULL; 13574 } 13575 13576 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 13577 goto nla_put_failure; 13578 13579 if (info) { 13580 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID, 13581 info->vendor_id)) 13582 goto nla_put_failure; 13583 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD, 13584 info->subcmd)) 13585 goto nla_put_failure; 13586 } 13587 13588 if (wdev) { 13589 if (nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 13590 wdev_id(wdev), NL80211_ATTR_PAD)) 13591 goto nla_put_failure; 13592 if (wdev->netdev && 13593 nla_put_u32(skb, NL80211_ATTR_IFINDEX, 13594 wdev->netdev->ifindex)) 13595 goto nla_put_failure; 13596 } 13597 13598 data = nla_nest_start_noflag(skb, attr); 13599 if (!data) 13600 goto nla_put_failure; 13601 13602 ((void **)skb->cb)[0] = rdev; 13603 ((void **)skb->cb)[1] = hdr; 13604 ((void **)skb->cb)[2] = data; 13605 13606 return skb; 13607 13608 nla_put_failure: 13609 kfree_skb(skb); 13610 return NULL; 13611 } 13612 13613 struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy, 13614 struct wireless_dev *wdev, 13615 enum nl80211_commands cmd, 13616 enum nl80211_attrs attr, 13617 unsigned int portid, 13618 int vendor_event_idx, 13619 int approxlen, gfp_t gfp) 13620 { 13621 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 13622 const struct nl80211_vendor_cmd_info *info; 13623 13624 switch (cmd) { 13625 case NL80211_CMD_TESTMODE: 13626 if (WARN_ON(vendor_event_idx != -1)) 13627 return NULL; 13628 info = NULL; 13629 break; 13630 case NL80211_CMD_VENDOR: 13631 if (WARN_ON(vendor_event_idx < 0 || 13632 vendor_event_idx >= wiphy->n_vendor_events)) 13633 return NULL; 13634 info = &wiphy->vendor_events[vendor_event_idx]; 13635 break; 13636 default: 13637 WARN_ON(1); 13638 return NULL; 13639 } 13640 13641 return __cfg80211_alloc_vendor_skb(rdev, wdev, approxlen, portid, 0, 13642 cmd, attr, info, gfp); 13643 } 13644 EXPORT_SYMBOL(__cfg80211_alloc_event_skb); 13645 13646 void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp) 13647 { 13648 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 13649 void *hdr = ((void **)skb->cb)[1]; 13650 struct nlmsghdr *nlhdr = nlmsg_hdr(skb); 13651 struct nlattr *data = ((void **)skb->cb)[2]; 13652 enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE; 13653 13654 /* clear CB data for netlink core to own from now on */ 13655 memset(skb->cb, 0, sizeof(skb->cb)); 13656 13657 nla_nest_end(skb, data); 13658 genlmsg_end(skb, hdr); 13659 13660 if (nlhdr->nlmsg_pid) { 13661 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb, 13662 nlhdr->nlmsg_pid); 13663 } else { 13664 if (data->nla_type == NL80211_ATTR_VENDOR_DATA) 13665 mcgrp = NL80211_MCGRP_VENDOR; 13666 13667 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 13668 skb, 0, mcgrp, gfp); 13669 } 13670 } 13671 EXPORT_SYMBOL(__cfg80211_send_event_skb); 13672 13673 #ifdef CONFIG_NL80211_TESTMODE 13674 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) 13675 { 13676 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13677 struct wireless_dev *wdev; 13678 int err; 13679 13680 lockdep_assert_held(&rdev->wiphy.mtx); 13681 13682 wdev = __cfg80211_wdev_from_attrs(rdev, genl_info_net(info), 13683 info->attrs); 13684 13685 if (!rdev->ops->testmode_cmd) 13686 return -EOPNOTSUPP; 13687 13688 if (IS_ERR(wdev)) { 13689 err = PTR_ERR(wdev); 13690 if (err != -EINVAL) 13691 return err; 13692 wdev = NULL; 13693 } else if (wdev->wiphy != &rdev->wiphy) { 13694 return -EINVAL; 13695 } 13696 13697 if (!info->attrs[NL80211_ATTR_TESTDATA]) 13698 return -EINVAL; 13699 13700 rdev->cur_cmd_info = info; 13701 err = rdev_testmode_cmd(rdev, wdev, 13702 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), 13703 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); 13704 rdev->cur_cmd_info = NULL; 13705 13706 return err; 13707 } 13708 13709 static int nl80211_testmode_dump(struct sk_buff *skb, 13710 struct netlink_callback *cb) 13711 { 13712 struct cfg80211_registered_device *rdev; 13713 struct nlattr **attrbuf = NULL; 13714 int err; 13715 long phy_idx; 13716 void *data = NULL; 13717 int data_len = 0; 13718 13719 rtnl_lock(); 13720 13721 if (cb->args[0]) { 13722 /* 13723 * 0 is a valid index, but not valid for args[0], 13724 * so we need to offset by 1. 13725 */ 13726 phy_idx = cb->args[0] - 1; 13727 13728 rdev = cfg80211_rdev_by_wiphy_idx(phy_idx); 13729 if (!rdev) { 13730 err = -ENOENT; 13731 goto out_err; 13732 } 13733 } else { 13734 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 13735 if (!attrbuf) { 13736 err = -ENOMEM; 13737 goto out_err; 13738 } 13739 13740 err = nlmsg_parse_deprecated(cb->nlh, 13741 GENL_HDRLEN + nl80211_fam.hdrsize, 13742 attrbuf, nl80211_fam.maxattr, 13743 nl80211_policy, NULL); 13744 if (err) 13745 goto out_err; 13746 13747 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); 13748 if (IS_ERR(rdev)) { 13749 err = PTR_ERR(rdev); 13750 goto out_err; 13751 } 13752 phy_idx = rdev->wiphy_idx; 13753 13754 if (attrbuf[NL80211_ATTR_TESTDATA]) 13755 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; 13756 } 13757 13758 if (cb->args[1]) { 13759 data = nla_data((void *)cb->args[1]); 13760 data_len = nla_len((void *)cb->args[1]); 13761 } 13762 13763 if (!rdev->ops->testmode_dump) { 13764 err = -EOPNOTSUPP; 13765 goto out_err; 13766 } 13767 13768 while (1) { 13769 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 13770 cb->nlh->nlmsg_seq, NLM_F_MULTI, 13771 NL80211_CMD_TESTMODE); 13772 struct nlattr *tmdata; 13773 13774 if (!hdr) 13775 break; 13776 13777 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) { 13778 genlmsg_cancel(skb, hdr); 13779 break; 13780 } 13781 13782 tmdata = nla_nest_start_noflag(skb, NL80211_ATTR_TESTDATA); 13783 if (!tmdata) { 13784 genlmsg_cancel(skb, hdr); 13785 break; 13786 } 13787 err = rdev_testmode_dump(rdev, skb, cb, data, data_len); 13788 nla_nest_end(skb, tmdata); 13789 13790 if (err == -ENOBUFS || err == -ENOENT) { 13791 genlmsg_cancel(skb, hdr); 13792 break; 13793 } else if (err) { 13794 genlmsg_cancel(skb, hdr); 13795 goto out_err; 13796 } 13797 13798 genlmsg_end(skb, hdr); 13799 } 13800 13801 err = skb->len; 13802 /* see above */ 13803 cb->args[0] = phy_idx + 1; 13804 out_err: 13805 kfree(attrbuf); 13806 rtnl_unlock(); 13807 return err; 13808 } 13809 #endif 13810 13811 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info) 13812 { 13813 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13814 struct net_device *dev = info->user_ptr[1]; 13815 struct cfg80211_connect_params connect; 13816 struct wiphy *wiphy; 13817 struct cfg80211_cached_keys *connkeys = NULL; 13818 u32 freq = 0; 13819 int err; 13820 13821 memset(&connect, 0, sizeof(connect)); 13822 13823 if (!info->attrs[NL80211_ATTR_SSID] || 13824 !nla_len(info->attrs[NL80211_ATTR_SSID])) 13825 return -EINVAL; 13826 13827 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 13828 connect.auth_type = 13829 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 13830 if (!nl80211_valid_auth_type(rdev, connect.auth_type, 13831 NL80211_CMD_CONNECT)) 13832 return -EINVAL; 13833 } else 13834 connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC; 13835 13836 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; 13837 13838 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] && 13839 !wiphy_ext_feature_isset(&rdev->wiphy, 13840 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 13841 return -EINVAL; 13842 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS]; 13843 13844 err = nl80211_crypto_settings(rdev, info, &connect.crypto, 13845 NL80211_MAX_NR_CIPHER_SUITES); 13846 if (err) 13847 return err; 13848 13849 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 13850 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 13851 return -EOPNOTSUPP; 13852 13853 wiphy = &rdev->wiphy; 13854 13855 connect.bg_scan_period = -1; 13856 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && 13857 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { 13858 connect.bg_scan_period = 13859 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); 13860 } 13861 13862 if (info->attrs[NL80211_ATTR_MAC]) 13863 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 13864 else if (info->attrs[NL80211_ATTR_MAC_HINT]) 13865 connect.bssid_hint = 13866 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]); 13867 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 13868 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 13869 13870 if (info->attrs[NL80211_ATTR_IE]) { 13871 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13872 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13873 } 13874 13875 if (info->attrs[NL80211_ATTR_USE_MFP]) { 13876 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 13877 if (connect.mfp == NL80211_MFP_OPTIONAL && 13878 !wiphy_ext_feature_isset(&rdev->wiphy, 13879 NL80211_EXT_FEATURE_MFP_OPTIONAL)) 13880 return -EOPNOTSUPP; 13881 } else { 13882 connect.mfp = NL80211_MFP_NO; 13883 } 13884 13885 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 13886 connect.prev_bssid = 13887 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 13888 13889 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) 13890 freq = MHZ_TO_KHZ(nla_get_u32( 13891 info->attrs[NL80211_ATTR_WIPHY_FREQ])); 13892 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 13893 freq += 13894 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 13895 13896 if (freq) { 13897 connect.channel = nl80211_get_valid_chan(wiphy, freq); 13898 if (!connect.channel) 13899 return -EINVAL; 13900 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) { 13901 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]); 13902 freq = MHZ_TO_KHZ(freq); 13903 connect.channel_hint = nl80211_get_valid_chan(wiphy, freq); 13904 if (!connect.channel_hint) 13905 return -EINVAL; 13906 } 13907 13908 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { 13909 connect.edmg.channels = 13910 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); 13911 13912 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) 13913 connect.edmg.bw_config = 13914 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); 13915 } 13916 13917 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { 13918 connkeys = nl80211_parse_connkeys(rdev, dev->ieee80211_ptr, 13919 info, NULL); 13920 if (IS_ERR(connkeys)) 13921 return PTR_ERR(connkeys); 13922 } 13923 13924 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 13925 connect.flags |= ASSOC_REQ_DISABLE_HT; 13926 13927 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 13928 memcpy(&connect.ht_capa_mask, 13929 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 13930 sizeof(connect.ht_capa_mask)); 13931 13932 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 13933 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { 13934 kfree_sensitive(connkeys); 13935 return -EINVAL; 13936 } 13937 memcpy(&connect.ht_capa, 13938 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 13939 sizeof(connect.ht_capa)); 13940 } 13941 13942 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 13943 connect.flags |= ASSOC_REQ_DISABLE_VHT; 13944 13945 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) 13946 connect.flags |= ASSOC_REQ_DISABLE_HE; 13947 13948 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) 13949 connect.flags |= ASSOC_REQ_DISABLE_EHT; 13950 13951 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_UHR])) 13952 connect.flags |= ASSOC_REQ_DISABLE_UHR; 13953 13954 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 13955 memcpy(&connect.vht_capa_mask, 13956 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 13957 sizeof(connect.vht_capa_mask)); 13958 13959 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 13960 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { 13961 kfree_sensitive(connkeys); 13962 return -EINVAL; 13963 } 13964 memcpy(&connect.vht_capa, 13965 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 13966 sizeof(connect.vht_capa)); 13967 } 13968 13969 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { 13970 if (!((rdev->wiphy.features & 13971 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) && 13972 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && 13973 !wiphy_ext_feature_isset(&rdev->wiphy, 13974 NL80211_EXT_FEATURE_RRM)) { 13975 kfree_sensitive(connkeys); 13976 return -EINVAL; 13977 } 13978 connect.flags |= ASSOC_REQ_USE_RRM; 13979 } 13980 13981 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); 13982 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { 13983 kfree_sensitive(connkeys); 13984 return -EOPNOTSUPP; 13985 } 13986 13987 if (info->attrs[NL80211_ATTR_BSS_SELECT]) { 13988 /* bss selection makes no sense if bssid is set */ 13989 if (connect.bssid) { 13990 kfree_sensitive(connkeys); 13991 return -EINVAL; 13992 } 13993 13994 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT], 13995 wiphy, &connect.bss_select); 13996 if (err) { 13997 kfree_sensitive(connkeys); 13998 return err; 13999 } 14000 } 14001 14002 if (wiphy_ext_feature_isset(&rdev->wiphy, 14003 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) && 14004 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && 14005 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && 14006 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && 14007 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 14008 connect.fils_erp_username = 14009 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 14010 connect.fils_erp_username_len = 14011 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 14012 connect.fils_erp_realm = 14013 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 14014 connect.fils_erp_realm_len = 14015 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 14016 connect.fils_erp_next_seq_num = 14017 nla_get_u16( 14018 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); 14019 connect.fils_erp_rrk = 14020 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 14021 connect.fils_erp_rrk_len = 14022 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 14023 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || 14024 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || 14025 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || 14026 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 14027 kfree_sensitive(connkeys); 14028 return -EINVAL; 14029 } 14030 14031 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) { 14032 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 14033 kfree_sensitive(connkeys); 14034 GENL_SET_ERR_MSG(info, 14035 "external auth requires connection ownership"); 14036 return -EINVAL; 14037 } 14038 connect.flags |= CONNECT_REQ_EXTERNAL_AUTH_SUPPORT; 14039 } 14040 14041 if (nla_get_flag(info->attrs[NL80211_ATTR_MLO_SUPPORT])) 14042 connect.flags |= CONNECT_REQ_MLO_SUPPORT; 14043 14044 err = cfg80211_connect(rdev, dev, &connect, connkeys, 14045 connect.prev_bssid); 14046 if (err) 14047 kfree_sensitive(connkeys); 14048 14049 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 14050 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 14051 if (connect.bssid) 14052 memcpy(dev->ieee80211_ptr->disconnect_bssid, 14053 connect.bssid, ETH_ALEN); 14054 else 14055 eth_zero_addr(dev->ieee80211_ptr->disconnect_bssid); 14056 } 14057 14058 return err; 14059 } 14060 14061 static int nl80211_update_connect_params(struct sk_buff *skb, 14062 struct genl_info *info) 14063 { 14064 struct cfg80211_connect_params connect = {}; 14065 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14066 struct net_device *dev = info->user_ptr[1]; 14067 struct wireless_dev *wdev = dev->ieee80211_ptr; 14068 bool fils_sk_offload; 14069 u32 auth_type; 14070 u32 changed = 0; 14071 14072 if (!rdev->ops->update_connect_params) 14073 return -EOPNOTSUPP; 14074 14075 if (info->attrs[NL80211_ATTR_IE]) { 14076 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 14077 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 14078 changed |= UPDATE_ASSOC_IES; 14079 } 14080 14081 fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy, 14082 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD); 14083 14084 /* 14085 * when driver supports fils-sk offload all attributes must be 14086 * provided. So the else covers "fils-sk-not-all" and 14087 * "no-fils-sk-any". 14088 */ 14089 if (fils_sk_offload && 14090 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && 14091 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && 14092 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && 14093 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 14094 connect.fils_erp_username = 14095 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 14096 connect.fils_erp_username_len = 14097 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 14098 connect.fils_erp_realm = 14099 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 14100 connect.fils_erp_realm_len = 14101 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 14102 connect.fils_erp_next_seq_num = 14103 nla_get_u16( 14104 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); 14105 connect.fils_erp_rrk = 14106 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 14107 connect.fils_erp_rrk_len = 14108 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 14109 changed |= UPDATE_FILS_ERP_INFO; 14110 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || 14111 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || 14112 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || 14113 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 14114 return -EINVAL; 14115 } 14116 14117 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 14118 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 14119 if (!nl80211_valid_auth_type(rdev, auth_type, 14120 NL80211_CMD_CONNECT)) 14121 return -EINVAL; 14122 14123 if (auth_type == NL80211_AUTHTYPE_FILS_SK && 14124 fils_sk_offload && !(changed & UPDATE_FILS_ERP_INFO)) 14125 return -EINVAL; 14126 14127 connect.auth_type = auth_type; 14128 changed |= UPDATE_AUTH_TYPE; 14129 } 14130 14131 if (!wdev->connected) 14132 return -ENOLINK; 14133 14134 return rdev_update_connect_params(rdev, dev, &connect, changed); 14135 } 14136 14137 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info) 14138 { 14139 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14140 struct net_device *dev = info->user_ptr[1]; 14141 u16 reason; 14142 14143 if (dev->ieee80211_ptr->conn_owner_nlportid && 14144 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 14145 return -EPERM; 14146 14147 reason = nla_get_u16_default(info->attrs[NL80211_ATTR_REASON_CODE], 14148 WLAN_REASON_DEAUTH_LEAVING); 14149 14150 if (reason == 0) 14151 return -EINVAL; 14152 14153 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14154 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 14155 return -EOPNOTSUPP; 14156 14157 return cfg80211_disconnect(rdev, dev, reason, true); 14158 } 14159 14160 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info) 14161 { 14162 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14163 struct net *net; 14164 int err; 14165 14166 if (info->attrs[NL80211_ATTR_PID]) { 14167 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); 14168 14169 net = get_net_ns_by_pid(pid); 14170 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) { 14171 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]); 14172 14173 net = get_net_ns_by_fd(fd); 14174 } else { 14175 return -EINVAL; 14176 } 14177 14178 if (IS_ERR(net)) 14179 return PTR_ERR(net); 14180 14181 /* 14182 * The caller already has CAP_NET_ADMIN over the source netns 14183 * (enforced by GENL_UNS_ADMIN_PERM on the genl op). Mirror the 14184 * convention used by net/core/rtnetlink.c::rtnl_get_net_ns_capable() 14185 * and require CAP_NET_ADMIN over the target netns as well, so that 14186 * a caller that is privileged in their own user namespace cannot 14187 * push a wiphy into a netns where they have no privilege. 14188 */ 14189 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) { 14190 put_net(net); 14191 return -EPERM; 14192 } 14193 14194 err = 0; 14195 14196 /* check if anything to do */ 14197 if (!net_eq(wiphy_net(&rdev->wiphy), net)) 14198 err = cfg80211_switch_netns(rdev, net); 14199 14200 put_net(net); 14201 return err; 14202 } 14203 14204 static int nl80211_set_pmksa(struct sk_buff *skb, struct genl_info *info) 14205 { 14206 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14207 struct net_device *dev = info->user_ptr[1]; 14208 struct cfg80211_pmksa pmksa; 14209 bool ap_pmksa_caching_support = false; 14210 14211 memset(&pmksa, 0, sizeof(struct cfg80211_pmksa)); 14212 14213 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, 14214 NL80211_EXT_FEATURE_AP_PMKSA_CACHING); 14215 14216 if (!info->attrs[NL80211_ATTR_PMKID]) 14217 return -EINVAL; 14218 14219 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 14220 14221 if (info->attrs[NL80211_ATTR_MAC]) { 14222 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 14223 } else if (info->attrs[NL80211_ATTR_SSID] && 14224 info->attrs[NL80211_ATTR_FILS_CACHE_ID] && 14225 info->attrs[NL80211_ATTR_PMK]) { 14226 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 14227 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 14228 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); 14229 } else { 14230 return -EINVAL; 14231 } 14232 14233 if (info->attrs[NL80211_ATTR_PMK]) { 14234 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); 14235 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); 14236 } 14237 14238 if (info->attrs[NL80211_ATTR_PMK_LIFETIME]) 14239 pmksa.pmk_lifetime = 14240 nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]); 14241 14242 if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]) 14243 pmksa.pmk_reauth_threshold = 14244 nla_get_u8(info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]); 14245 14246 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14247 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && 14248 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || 14249 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && 14250 ap_pmksa_caching_support)) 14251 return -EOPNOTSUPP; 14252 14253 if (!rdev->ops->set_pmksa) 14254 return -EOPNOTSUPP; 14255 14256 return rdev_set_pmksa(rdev, dev, &pmksa); 14257 } 14258 14259 static int nl80211_del_pmksa(struct sk_buff *skb, struct genl_info *info) 14260 { 14261 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14262 struct net_device *dev = info->user_ptr[1]; 14263 struct cfg80211_pmksa pmksa; 14264 bool sae_offload_support = false; 14265 bool owe_offload_support = false; 14266 bool ap_pmksa_caching_support = false; 14267 14268 memset(&pmksa, 0, sizeof(struct cfg80211_pmksa)); 14269 14270 sae_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, 14271 NL80211_EXT_FEATURE_SAE_OFFLOAD); 14272 owe_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, 14273 NL80211_EXT_FEATURE_OWE_OFFLOAD); 14274 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, 14275 NL80211_EXT_FEATURE_AP_PMKSA_CACHING); 14276 14277 if (info->attrs[NL80211_ATTR_PMKID]) 14278 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 14279 14280 if (info->attrs[NL80211_ATTR_MAC]) { 14281 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 14282 } else if (info->attrs[NL80211_ATTR_SSID]) { 14283 /* SSID based pmksa flush supported only for FILS, 14284 * OWE/SAE OFFLOAD cases 14285 */ 14286 if (info->attrs[NL80211_ATTR_FILS_CACHE_ID] && 14287 info->attrs[NL80211_ATTR_PMK]) { 14288 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); 14289 } else if (!sae_offload_support && !owe_offload_support) { 14290 return -EINVAL; 14291 } 14292 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 14293 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 14294 } else { 14295 return -EINVAL; 14296 } 14297 14298 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14299 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && 14300 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || 14301 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && 14302 ap_pmksa_caching_support)) 14303 return -EOPNOTSUPP; 14304 14305 if (!rdev->ops->del_pmksa) 14306 return -EOPNOTSUPP; 14307 14308 return rdev_del_pmksa(rdev, dev, &pmksa); 14309 } 14310 14311 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info) 14312 { 14313 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14314 struct net_device *dev = info->user_ptr[1]; 14315 14316 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 14317 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 14318 return -EOPNOTSUPP; 14319 14320 if (!rdev->ops->flush_pmksa) 14321 return -EOPNOTSUPP; 14322 14323 return rdev_flush_pmksa(rdev, dev); 14324 } 14325 14326 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info) 14327 { 14328 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14329 struct net_device *dev = info->user_ptr[1]; 14330 u8 action_code, dialog_token; 14331 u32 peer_capability = 0; 14332 u16 status_code; 14333 u8 *peer; 14334 int link_id; 14335 bool initiator; 14336 14337 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 14338 !rdev->ops->tdls_mgmt) 14339 return -EOPNOTSUPP; 14340 14341 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || 14342 !info->attrs[NL80211_ATTR_STATUS_CODE] || 14343 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || 14344 !info->attrs[NL80211_ATTR_IE] || 14345 !info->attrs[NL80211_ATTR_MAC]) 14346 return -EINVAL; 14347 14348 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 14349 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); 14350 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 14351 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); 14352 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]); 14353 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]) 14354 peer_capability = 14355 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]); 14356 link_id = nl80211_link_id_or_invalid(info->attrs); 14357 14358 return rdev_tdls_mgmt(rdev, dev, peer, link_id, action_code, 14359 dialog_token, status_code, peer_capability, 14360 initiator, 14361 nla_data(info->attrs[NL80211_ATTR_IE]), 14362 nla_len(info->attrs[NL80211_ATTR_IE])); 14363 } 14364 14365 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info) 14366 { 14367 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14368 struct net_device *dev = info->user_ptr[1]; 14369 enum nl80211_tdls_operation operation; 14370 u8 *peer; 14371 14372 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 14373 !rdev->ops->tdls_oper) 14374 return -EOPNOTSUPP; 14375 14376 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || 14377 !info->attrs[NL80211_ATTR_MAC]) 14378 return -EINVAL; 14379 14380 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); 14381 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 14382 14383 return rdev_tdls_oper(rdev, dev, peer, operation); 14384 } 14385 14386 static int nl80211_remain_on_channel(struct sk_buff *skb, 14387 struct genl_info *info) 14388 { 14389 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14390 unsigned int link_id = nl80211_link_id(info->attrs); 14391 struct wireless_dev *wdev = info->user_ptr[1]; 14392 struct cfg80211_chan_def chandef; 14393 const u8 *rx_addr = NULL; 14394 struct sk_buff *msg; 14395 void *hdr; 14396 u64 cookie; 14397 u32 duration; 14398 int err; 14399 14400 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 14401 !info->attrs[NL80211_ATTR_DURATION]) 14402 return -EINVAL; 14403 14404 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 14405 14406 if (info->attrs[NL80211_ATTR_MAC]) 14407 rx_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 14408 14409 if (rx_addr && 14410 !wiphy_ext_feature_isset(wdev->wiphy, 14411 NL80211_EXT_FEATURE_ROC_ADDR_FILTER)) 14412 return -EOPNOTSUPP; 14413 14414 if (!rdev->ops->remain_on_channel || 14415 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) 14416 return -EOPNOTSUPP; 14417 14418 /* 14419 * We should be on that channel for at least a minimum amount of 14420 * time (10ms) but no longer than the driver supports. 14421 */ 14422 if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 14423 duration > rdev->wiphy.max_remain_on_channel_duration) 14424 return -EINVAL; 14425 14426 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef, 14427 false); 14428 if (err) 14429 return err; 14430 14431 if (!cfg80211_off_channel_oper_allowed(wdev, chandef.chan)) { 14432 const struct cfg80211_chan_def *oper_chandef, *compat_chandef; 14433 14434 oper_chandef = wdev_chandef(wdev, link_id); 14435 14436 if (WARN_ON(!oper_chandef)) { 14437 /* cannot happen since we must beacon to get here */ 14438 WARN_ON(1); 14439 return -EBUSY; 14440 } 14441 14442 /* note: returns first one if identical chandefs */ 14443 compat_chandef = cfg80211_chandef_compatible(&chandef, 14444 oper_chandef); 14445 14446 if (compat_chandef != &chandef) 14447 return -EBUSY; 14448 } 14449 14450 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14451 if (!msg) 14452 return -ENOMEM; 14453 14454 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 14455 NL80211_CMD_REMAIN_ON_CHANNEL); 14456 if (!hdr) { 14457 err = -ENOBUFS; 14458 goto free_msg; 14459 } 14460 14461 err = rdev_remain_on_channel(rdev, wdev, chandef.chan, 14462 duration, &cookie, rx_addr); 14463 14464 if (err) 14465 goto free_msg; 14466 14467 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 14468 NL80211_ATTR_PAD)) 14469 goto nla_put_failure; 14470 14471 genlmsg_end(msg, hdr); 14472 14473 return genlmsg_reply(msg, info); 14474 14475 nla_put_failure: 14476 err = -ENOBUFS; 14477 free_msg: 14478 nlmsg_free(msg); 14479 return err; 14480 } 14481 14482 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb, 14483 struct genl_info *info) 14484 { 14485 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14486 struct wireless_dev *wdev = info->user_ptr[1]; 14487 u64 cookie; 14488 14489 if (!info->attrs[NL80211_ATTR_COOKIE]) 14490 return -EINVAL; 14491 14492 if (!rdev->ops->cancel_remain_on_channel) 14493 return -EOPNOTSUPP; 14494 14495 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 14496 14497 return rdev_cancel_remain_on_channel(rdev, wdev, cookie); 14498 } 14499 14500 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb, 14501 struct genl_info *info) 14502 { 14503 struct cfg80211_bitrate_mask mask; 14504 unsigned int link_id = nl80211_link_id(info->attrs); 14505 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14506 struct net_device *dev = info->user_ptr[1]; 14507 int err; 14508 14509 if (!rdev->ops->set_bitrate_mask) 14510 return -EOPNOTSUPP; 14511 14512 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, 14513 NL80211_ATTR_TX_RATES, &mask, 14514 dev, true, link_id); 14515 if (err) 14516 return err; 14517 14518 return rdev_set_bitrate_mask(rdev, dev, link_id, NULL, &mask); 14519 } 14520 14521 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info) 14522 { 14523 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14524 struct wireless_dev *wdev = info->user_ptr[1]; 14525 u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION; 14526 14527 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) 14528 return -EINVAL; 14529 14530 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) 14531 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); 14532 14533 switch (wdev->iftype) { 14534 case NL80211_IFTYPE_STATION: 14535 case NL80211_IFTYPE_ADHOC: 14536 case NL80211_IFTYPE_P2P_CLIENT: 14537 case NL80211_IFTYPE_AP: 14538 case NL80211_IFTYPE_AP_VLAN: 14539 case NL80211_IFTYPE_MESH_POINT: 14540 case NL80211_IFTYPE_P2P_GO: 14541 case NL80211_IFTYPE_P2P_DEVICE: 14542 break; 14543 case NL80211_IFTYPE_NAN: 14544 case NL80211_IFTYPE_NAN_DATA: 14545 if (!wiphy_ext_feature_isset(wdev->wiphy, 14546 NL80211_EXT_FEATURE_SECURE_NAN) && 14547 !(wdev->wiphy->nan_capa.flags & 14548 WIPHY_NAN_FLAGS_USERSPACE_DE)) 14549 return -EOPNOTSUPP; 14550 break; 14551 case NL80211_IFTYPE_PD: 14552 if (!wiphy_ext_feature_isset(wdev->wiphy, 14553 NL80211_EXT_FEATURE_SECURE_RTT)) 14554 return -EOPNOTSUPP; 14555 break; 14556 default: 14557 return -EOPNOTSUPP; 14558 } 14559 14560 /* not much point in registering if we can't reply */ 14561 if (!rdev->ops->mgmt_tx) 14562 return -EOPNOTSUPP; 14563 14564 if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] && 14565 !wiphy_ext_feature_isset(&rdev->wiphy, 14566 NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS)) { 14567 GENL_SET_ERR_MSG(info, 14568 "multicast RX registrations are not supported"); 14569 return -EOPNOTSUPP; 14570 } 14571 14572 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, 14573 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), 14574 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]), 14575 info->attrs[NL80211_ATTR_RECEIVE_MULTICAST], 14576 info->extack); 14577 } 14578 14579 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info) 14580 { 14581 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14582 struct wireless_dev *wdev = info->user_ptr[1]; 14583 struct cfg80211_chan_def chandef; 14584 int err; 14585 void *hdr = NULL; 14586 u64 cookie; 14587 struct sk_buff *msg = NULL; 14588 struct cfg80211_mgmt_tx_params params = { 14589 .dont_wait_for_ack = 14590 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], 14591 }; 14592 14593 if (!info->attrs[NL80211_ATTR_FRAME]) 14594 return -EINVAL; 14595 14596 if (!rdev->ops->mgmt_tx) 14597 return -EOPNOTSUPP; 14598 14599 switch (wdev->iftype) { 14600 case NL80211_IFTYPE_P2P_DEVICE: 14601 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 14602 return -EINVAL; 14603 break; 14604 case NL80211_IFTYPE_STATION: 14605 case NL80211_IFTYPE_ADHOC: 14606 case NL80211_IFTYPE_P2P_CLIENT: 14607 case NL80211_IFTYPE_AP: 14608 case NL80211_IFTYPE_AP_VLAN: 14609 case NL80211_IFTYPE_MESH_POINT: 14610 case NL80211_IFTYPE_P2P_GO: 14611 break; 14612 case NL80211_IFTYPE_NAN: 14613 case NL80211_IFTYPE_NAN_DATA: 14614 if (!wiphy_ext_feature_isset(wdev->wiphy, 14615 NL80211_EXT_FEATURE_SECURE_NAN) && 14616 !(wdev->wiphy->nan_capa.flags & 14617 WIPHY_NAN_FLAGS_USERSPACE_DE)) 14618 return -EOPNOTSUPP; 14619 break; 14620 case NL80211_IFTYPE_PD: 14621 if (!wiphy_ext_feature_isset(wdev->wiphy, 14622 NL80211_EXT_FEATURE_SECURE_RTT)) 14623 return -EOPNOTSUPP; 14624 break; 14625 default: 14626 return -EOPNOTSUPP; 14627 } 14628 14629 if (info->attrs[NL80211_ATTR_DURATION]) { 14630 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 14631 return -EINVAL; 14632 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 14633 14634 /* 14635 * We should wait on the channel for at least a minimum amount 14636 * of time (10ms) but no longer than the driver supports. 14637 */ 14638 if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 14639 params.wait > rdev->wiphy.max_remain_on_channel_duration) 14640 return -EINVAL; 14641 } 14642 14643 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; 14644 14645 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 14646 return -EINVAL; 14647 14648 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 14649 14650 /* get the channel if any has been specified, otherwise pass NULL to 14651 * the driver. The latter will use the current one 14652 */ 14653 chandef.chan = NULL; 14654 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 14655 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 14656 &chandef, false); 14657 if (err) 14658 return err; 14659 } 14660 14661 if (!chandef.chan && params.offchan) 14662 return -EINVAL; 14663 14664 if (params.offchan && 14665 !cfg80211_off_channel_oper_allowed(wdev, chandef.chan)) 14666 return -EBUSY; 14667 14668 params.link_id = nl80211_link_id_or_invalid(info->attrs); 14669 /* 14670 * This now races due to the unlock, but we cannot check 14671 * the valid links for the _station_ anyway, so that's up 14672 * to the driver. 14673 */ 14674 if (params.link_id >= 0 && 14675 !(wdev->valid_links & BIT(params.link_id))) 14676 return -EINVAL; 14677 14678 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 14679 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 14680 14681 err = nl80211_parse_counter_offsets(rdev, NULL, params.len, -1, 14682 info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX], 14683 ¶ms.csa_offsets, 14684 ¶ms.n_csa_offsets); 14685 if (err) 14686 return err; 14687 14688 if (!params.dont_wait_for_ack) { 14689 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14690 if (!msg) 14691 return -ENOMEM; 14692 14693 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 14694 NL80211_CMD_FRAME); 14695 if (!hdr) { 14696 err = -ENOBUFS; 14697 goto free_msg; 14698 } 14699 } 14700 14701 params.chan = chandef.chan; 14702 err = cfg80211_mlme_mgmt_tx(rdev, wdev, ¶ms, &cookie); 14703 if (err) 14704 goto free_msg; 14705 14706 if (msg) { 14707 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 14708 NL80211_ATTR_PAD)) 14709 goto nla_put_failure; 14710 14711 genlmsg_end(msg, hdr); 14712 return genlmsg_reply(msg, info); 14713 } 14714 14715 return 0; 14716 14717 nla_put_failure: 14718 err = -ENOBUFS; 14719 free_msg: 14720 nlmsg_free(msg); 14721 return err; 14722 } 14723 14724 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info) 14725 { 14726 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14727 struct wireless_dev *wdev = info->user_ptr[1]; 14728 u64 cookie; 14729 14730 if (!info->attrs[NL80211_ATTR_COOKIE]) 14731 return -EINVAL; 14732 14733 if (!rdev->ops->mgmt_tx_cancel_wait) 14734 return -EOPNOTSUPP; 14735 14736 switch (wdev->iftype) { 14737 case NL80211_IFTYPE_STATION: 14738 case NL80211_IFTYPE_ADHOC: 14739 case NL80211_IFTYPE_P2P_CLIENT: 14740 case NL80211_IFTYPE_AP: 14741 case NL80211_IFTYPE_AP_VLAN: 14742 case NL80211_IFTYPE_P2P_GO: 14743 case NL80211_IFTYPE_P2P_DEVICE: 14744 break; 14745 case NL80211_IFTYPE_NAN: 14746 if (!wiphy_ext_feature_isset(wdev->wiphy, 14747 NL80211_EXT_FEATURE_SECURE_NAN)) 14748 return -EOPNOTSUPP; 14749 break; 14750 case NL80211_IFTYPE_PD: 14751 if (!wiphy_ext_feature_isset(wdev->wiphy, 14752 NL80211_EXT_FEATURE_SECURE_RTT)) 14753 return -EOPNOTSUPP; 14754 break; 14755 default: 14756 return -EOPNOTSUPP; 14757 } 14758 14759 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 14760 14761 return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie); 14762 } 14763 14764 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info) 14765 { 14766 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14767 struct wireless_dev *wdev; 14768 struct net_device *dev = info->user_ptr[1]; 14769 u8 ps_state; 14770 bool state; 14771 int err; 14772 14773 if (!info->attrs[NL80211_ATTR_PS_STATE]) 14774 return -EINVAL; 14775 14776 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); 14777 14778 wdev = dev->ieee80211_ptr; 14779 14780 if (!rdev->ops->set_power_mgmt) 14781 return -EOPNOTSUPP; 14782 14783 state = (ps_state == NL80211_PS_ENABLED) ? true : false; 14784 14785 if (state == wdev->ps) 14786 return 0; 14787 14788 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); 14789 if (!err) 14790 wdev->ps = state; 14791 return err; 14792 } 14793 14794 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info) 14795 { 14796 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14797 enum nl80211_ps_state ps_state; 14798 struct wireless_dev *wdev; 14799 struct net_device *dev = info->user_ptr[1]; 14800 struct sk_buff *msg; 14801 void *hdr; 14802 int err; 14803 14804 wdev = dev->ieee80211_ptr; 14805 14806 if (!rdev->ops->set_power_mgmt) 14807 return -EOPNOTSUPP; 14808 14809 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14810 if (!msg) 14811 return -ENOMEM; 14812 14813 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 14814 NL80211_CMD_GET_POWER_SAVE); 14815 if (!hdr) { 14816 err = -ENOBUFS; 14817 goto free_msg; 14818 } 14819 14820 if (wdev->ps) 14821 ps_state = NL80211_PS_ENABLED; 14822 else 14823 ps_state = NL80211_PS_DISABLED; 14824 14825 if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state)) 14826 goto nla_put_failure; 14827 14828 genlmsg_end(msg, hdr); 14829 return genlmsg_reply(msg, info); 14830 14831 nla_put_failure: 14832 err = -ENOBUFS; 14833 free_msg: 14834 nlmsg_free(msg); 14835 return err; 14836 } 14837 14838 static const struct nla_policy 14839 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = { 14840 [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_BINARY }, 14841 [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 }, 14842 [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 }, 14843 [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 }, 14844 [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 }, 14845 [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 }, 14846 [NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_S32 }, 14847 }; 14848 14849 static int nl80211_set_cqm_txe(struct genl_info *info, 14850 u32 rate, u32 pkts, u32 intvl) 14851 { 14852 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14853 struct net_device *dev = info->user_ptr[1]; 14854 struct wireless_dev *wdev = dev->ieee80211_ptr; 14855 14856 if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL) 14857 return -EINVAL; 14858 14859 if (!rdev->ops->set_cqm_txe_config) 14860 return -EOPNOTSUPP; 14861 14862 if (wdev->iftype != NL80211_IFTYPE_STATION && 14863 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 14864 return -EOPNOTSUPP; 14865 14866 return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl); 14867 } 14868 14869 static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev, 14870 struct net_device *dev, 14871 struct cfg80211_cqm_config *cqm_config) 14872 { 14873 struct wireless_dev *wdev = dev->ieee80211_ptr; 14874 s32 last, low, high; 14875 u32 hyst; 14876 int i, n, low_index; 14877 int err; 14878 14879 /* 14880 * Obtain current RSSI value if possible, if not and no RSSI threshold 14881 * event has been received yet, we should receive an event after a 14882 * connection is established and enough beacons received to calculate 14883 * the average. 14884 */ 14885 if (!cqm_config->last_rssi_event_value && 14886 wdev->links[0].client.current_bss && 14887 rdev->ops->get_station) { 14888 struct station_info sinfo = {}; 14889 u8 *mac_addr; 14890 14891 mac_addr = wdev->links[0].client.current_bss->pub.bssid; 14892 14893 err = rdev_get_station(rdev, wdev, mac_addr, &sinfo); 14894 if (err) 14895 return err; 14896 14897 cfg80211_sinfo_release_content(&sinfo); 14898 if (sinfo.filled & BIT_ULL(NL80211_STA_INFO_BEACON_SIGNAL_AVG)) 14899 cqm_config->last_rssi_event_value = 14900 (s8) sinfo.rx_beacon_signal_avg; 14901 } 14902 14903 last = cqm_config->last_rssi_event_value; 14904 hyst = cqm_config->rssi_hyst; 14905 n = cqm_config->n_rssi_thresholds; 14906 14907 for (i = 0; i < n; i++) { 14908 i = array_index_nospec(i, n); 14909 if (last < cqm_config->rssi_thresholds[i]) 14910 break; 14911 } 14912 14913 low_index = i - 1; 14914 if (low_index >= 0) { 14915 low_index = array_index_nospec(low_index, n); 14916 low = cqm_config->rssi_thresholds[low_index] - hyst; 14917 } else { 14918 low = S32_MIN; 14919 } 14920 if (i < n) { 14921 i = array_index_nospec(i, n); 14922 high = cqm_config->rssi_thresholds[i] + hyst - 1; 14923 } else { 14924 high = S32_MAX; 14925 } 14926 14927 return rdev_set_cqm_rssi_range_config(rdev, dev, low, high); 14928 } 14929 14930 static int nl80211_set_cqm_rssi(struct genl_info *info, 14931 const s32 *thresholds, int n_thresholds, 14932 u32 hysteresis) 14933 { 14934 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14935 struct cfg80211_cqm_config *cqm_config = NULL, *old; 14936 struct net_device *dev = info->user_ptr[1]; 14937 struct wireless_dev *wdev = dev->ieee80211_ptr; 14938 s32 prev = S32_MIN; 14939 int i, err; 14940 14941 /* Check all values negative and sorted */ 14942 for (i = 0; i < n_thresholds; i++) { 14943 if (thresholds[i] > 0 || thresholds[i] <= prev) 14944 return -EINVAL; 14945 14946 prev = thresholds[i]; 14947 } 14948 14949 if (wdev->iftype != NL80211_IFTYPE_STATION && 14950 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 14951 return -EOPNOTSUPP; 14952 14953 if (n_thresholds == 1 && thresholds[0] == 0) /* Disabling */ 14954 n_thresholds = 0; 14955 14956 old = wiphy_dereference(wdev->wiphy, wdev->cqm_config); 14957 14958 /* if already disabled just succeed */ 14959 if (!n_thresholds && !old) 14960 return 0; 14961 14962 if (n_thresholds > 1) { 14963 if (!wiphy_ext_feature_isset(&rdev->wiphy, 14964 NL80211_EXT_FEATURE_CQM_RSSI_LIST) || 14965 !rdev->ops->set_cqm_rssi_range_config) 14966 return -EOPNOTSUPP; 14967 } else { 14968 if (!rdev->ops->set_cqm_rssi_config) 14969 return -EOPNOTSUPP; 14970 } 14971 14972 if (n_thresholds) { 14973 cqm_config = kzalloc_flex(*cqm_config, rssi_thresholds, 14974 n_thresholds); 14975 if (!cqm_config) 14976 return -ENOMEM; 14977 14978 cqm_config->rssi_hyst = hysteresis; 14979 cqm_config->n_rssi_thresholds = n_thresholds; 14980 memcpy(cqm_config->rssi_thresholds, thresholds, 14981 flex_array_size(cqm_config, rssi_thresholds, 14982 n_thresholds)); 14983 cqm_config->use_range_api = n_thresholds > 1 || 14984 !rdev->ops->set_cqm_rssi_config; 14985 14986 rcu_assign_pointer(wdev->cqm_config, cqm_config); 14987 14988 if (cqm_config->use_range_api) 14989 err = cfg80211_cqm_rssi_update(rdev, dev, cqm_config); 14990 else 14991 err = rdev_set_cqm_rssi_config(rdev, dev, 14992 thresholds[0], 14993 hysteresis); 14994 } else { 14995 RCU_INIT_POINTER(wdev->cqm_config, NULL); 14996 /* if enabled as range also disable via range */ 14997 if (old->use_range_api) 14998 err = rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0); 14999 else 15000 err = rdev_set_cqm_rssi_config(rdev, dev, 0, 0); 15001 } 15002 15003 if (err) { 15004 rcu_assign_pointer(wdev->cqm_config, old); 15005 kfree_rcu(cqm_config, rcu_head); 15006 } else { 15007 kfree_rcu(old, rcu_head); 15008 } 15009 15010 return err; 15011 } 15012 15013 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info) 15014 { 15015 struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1]; 15016 struct nlattr *cqm; 15017 int err; 15018 15019 cqm = info->attrs[NL80211_ATTR_CQM]; 15020 if (!cqm) 15021 return -EINVAL; 15022 15023 err = nla_parse_nested_deprecated(attrs, NL80211_ATTR_CQM_MAX, cqm, 15024 nl80211_attr_cqm_policy, 15025 info->extack); 15026 if (err) 15027 return err; 15028 15029 if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] && 15030 attrs[NL80211_ATTR_CQM_RSSI_HYST]) { 15031 const s32 *thresholds = 15032 nla_data(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 15033 int len = nla_len(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 15034 u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]); 15035 15036 if (len % 4) 15037 return -EINVAL; 15038 15039 return nl80211_set_cqm_rssi(info, thresholds, len / 4, 15040 hysteresis); 15041 } 15042 15043 if (attrs[NL80211_ATTR_CQM_TXE_RATE] && 15044 attrs[NL80211_ATTR_CQM_TXE_PKTS] && 15045 attrs[NL80211_ATTR_CQM_TXE_INTVL]) { 15046 u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]); 15047 u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]); 15048 u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]); 15049 15050 return nl80211_set_cqm_txe(info, rate, pkts, intvl); 15051 } 15052 15053 return -EINVAL; 15054 } 15055 15056 static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info) 15057 { 15058 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15059 struct net_device *dev = info->user_ptr[1]; 15060 struct ocb_setup setup = {}; 15061 int err; 15062 15063 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 15064 &setup.chandef, false); 15065 if (err) 15066 return err; 15067 15068 return cfg80211_join_ocb(rdev, dev, &setup); 15069 } 15070 15071 static int nl80211_leave_ocb(struct sk_buff *skb, struct genl_info *info) 15072 { 15073 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15074 struct net_device *dev = info->user_ptr[1]; 15075 15076 return cfg80211_leave_ocb(rdev, dev); 15077 } 15078 15079 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info) 15080 { 15081 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15082 struct net_device *dev = info->user_ptr[1]; 15083 struct mesh_config cfg; 15084 struct mesh_setup setup; 15085 int err; 15086 15087 /* start with default */ 15088 memcpy(&cfg, &default_mesh_config, sizeof(cfg)); 15089 memcpy(&setup, &default_mesh_setup, sizeof(setup)); 15090 15091 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { 15092 /* and parse parameters if given */ 15093 err = nl80211_parse_mesh_config(info, &cfg, NULL); 15094 if (err) 15095 return err; 15096 } 15097 15098 if (!info->attrs[NL80211_ATTR_MESH_ID] || 15099 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) 15100 return -EINVAL; 15101 15102 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); 15103 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 15104 15105 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 15106 !nl80211_parse_mcast_rate(rdev, setup.mcast_rate, 15107 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 15108 return -EINVAL; 15109 15110 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { 15111 setup.beacon_interval = 15112 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 15113 15114 err = cfg80211_validate_beacon_int(rdev, 15115 NL80211_IFTYPE_MESH_POINT, 15116 setup.beacon_interval); 15117 if (err) 15118 return err; 15119 } 15120 15121 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { 15122 setup.dtim_period = 15123 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 15124 if (setup.dtim_period < 1 || setup.dtim_period > 100) 15125 return -EINVAL; 15126 } 15127 15128 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { 15129 /* parse additional setup parameters if given */ 15130 err = nl80211_parse_mesh_setup(info, &setup); 15131 if (err) 15132 return err; 15133 } 15134 15135 if (setup.user_mpm) 15136 cfg.auto_open_plinks = false; 15137 15138 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 15139 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, 15140 &setup.chandef, false); 15141 if (err) 15142 return err; 15143 } else { 15144 /* __cfg80211_join_mesh() will sort it out */ 15145 setup.chandef.chan = NULL; 15146 } 15147 15148 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 15149 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 15150 int n_rates = 15151 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 15152 struct ieee80211_supported_band *sband; 15153 15154 if (!setup.chandef.chan) 15155 return -EINVAL; 15156 15157 sband = rdev->wiphy.bands[setup.chandef.chan->band]; 15158 15159 err = ieee80211_get_ratemask(sband, rates, n_rates, 15160 &setup.basic_rates); 15161 if (err) 15162 return err; 15163 } 15164 15165 if (info->attrs[NL80211_ATTR_TX_RATES]) { 15166 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, 15167 NL80211_ATTR_TX_RATES, 15168 &setup.beacon_rate, 15169 dev, false, 0); 15170 if (err) 15171 return err; 15172 15173 if (!setup.chandef.chan) 15174 return -EINVAL; 15175 15176 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band, 15177 &setup.beacon_rate); 15178 if (err) 15179 return err; 15180 } 15181 15182 setup.userspace_handles_dfs = 15183 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 15184 15185 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 15186 int r = validate_pae_over_nl80211(rdev, info); 15187 15188 if (r < 0) 15189 return r; 15190 15191 setup.control_port_over_nl80211 = true; 15192 } 15193 15194 err = __cfg80211_join_mesh(rdev, dev, &setup, &cfg); 15195 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) 15196 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 15197 15198 return err; 15199 } 15200 15201 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info) 15202 { 15203 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15204 struct net_device *dev = info->user_ptr[1]; 15205 15206 return cfg80211_leave_mesh(rdev, dev); 15207 } 15208 15209 #ifdef CONFIG_PM 15210 static int nl80211_send_wowlan_patterns(struct sk_buff *msg, 15211 struct cfg80211_registered_device *rdev) 15212 { 15213 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; 15214 struct nlattr *nl_pats, *nl_pat; 15215 int i, pat_len; 15216 15217 if (!wowlan->n_patterns) 15218 return 0; 15219 15220 nl_pats = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN); 15221 if (!nl_pats) 15222 return -ENOBUFS; 15223 15224 for (i = 0; i < wowlan->n_patterns; i++) { 15225 nl_pat = nla_nest_start_noflag(msg, i + 1); 15226 if (!nl_pat) 15227 return -ENOBUFS; 15228 pat_len = wowlan->patterns[i].pattern_len; 15229 if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8), 15230 wowlan->patterns[i].mask) || 15231 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 15232 wowlan->patterns[i].pattern) || 15233 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 15234 wowlan->patterns[i].pkt_offset)) 15235 return -ENOBUFS; 15236 nla_nest_end(msg, nl_pat); 15237 } 15238 nla_nest_end(msg, nl_pats); 15239 15240 return 0; 15241 } 15242 15243 static int nl80211_send_wowlan_tcp(struct sk_buff *msg, 15244 struct cfg80211_wowlan_tcp *tcp) 15245 { 15246 struct nlattr *nl_tcp; 15247 15248 if (!tcp) 15249 return 0; 15250 15251 nl_tcp = nla_nest_start_noflag(msg, 15252 NL80211_WOWLAN_TRIG_TCP_CONNECTION); 15253 if (!nl_tcp) 15254 return -ENOBUFS; 15255 15256 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || 15257 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || 15258 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || 15259 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || 15260 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || 15261 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 15262 tcp->payload_len, tcp->payload) || 15263 nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 15264 tcp->data_interval) || 15265 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 15266 tcp->wake_len, tcp->wake_data) || 15267 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK, 15268 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) 15269 return -ENOBUFS; 15270 15271 if (tcp->payload_seq.len && 15272 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ, 15273 sizeof(tcp->payload_seq), &tcp->payload_seq)) 15274 return -ENOBUFS; 15275 15276 if (tcp->payload_tok.len && 15277 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 15278 sizeof(tcp->payload_tok) + tcp->tokens_size, 15279 &tcp->payload_tok)) 15280 return -ENOBUFS; 15281 15282 nla_nest_end(msg, nl_tcp); 15283 15284 return 0; 15285 } 15286 15287 static int nl80211_send_wowlan_nd(struct sk_buff *msg, 15288 struct cfg80211_sched_scan_request *req) 15289 { 15290 struct nlattr *nd, *freqs, *matches, *match, *scan_plans, *scan_plan; 15291 int i; 15292 15293 if (!req) 15294 return 0; 15295 15296 nd = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_NET_DETECT); 15297 if (!nd) 15298 return -ENOBUFS; 15299 15300 if (req->n_scan_plans == 1 && 15301 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_INTERVAL, 15302 req->scan_plans[0].interval * 1000)) 15303 return -ENOBUFS; 15304 15305 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay)) 15306 return -ENOBUFS; 15307 15308 if (req->relative_rssi_set) { 15309 struct nl80211_bss_select_rssi_adjust rssi_adjust; 15310 15311 if (nla_put_s8(msg, NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI, 15312 req->relative_rssi)) 15313 return -ENOBUFS; 15314 15315 rssi_adjust.band = req->rssi_adjust.band; 15316 rssi_adjust.delta = req->rssi_adjust.delta; 15317 if (nla_put(msg, NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST, 15318 sizeof(rssi_adjust), &rssi_adjust)) 15319 return -ENOBUFS; 15320 } 15321 15322 freqs = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_FREQUENCIES); 15323 if (!freqs) 15324 return -ENOBUFS; 15325 15326 for (i = 0; i < req->n_channels; i++) { 15327 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) 15328 return -ENOBUFS; 15329 } 15330 15331 nla_nest_end(msg, freqs); 15332 15333 if (req->n_match_sets) { 15334 matches = nla_nest_start_noflag(msg, 15335 NL80211_ATTR_SCHED_SCAN_MATCH); 15336 if (!matches) 15337 return -ENOBUFS; 15338 15339 for (i = 0; i < req->n_match_sets; i++) { 15340 match = nla_nest_start_noflag(msg, i); 15341 if (!match) 15342 return -ENOBUFS; 15343 15344 if (nla_put(msg, NL80211_SCHED_SCAN_MATCH_ATTR_SSID, 15345 req->match_sets[i].ssid.ssid_len, 15346 req->match_sets[i].ssid.ssid)) 15347 return -ENOBUFS; 15348 nla_nest_end(msg, match); 15349 } 15350 nla_nest_end(msg, matches); 15351 } 15352 15353 scan_plans = nla_nest_start_noflag(msg, NL80211_ATTR_SCHED_SCAN_PLANS); 15354 if (!scan_plans) 15355 return -ENOBUFS; 15356 15357 for (i = 0; i < req->n_scan_plans; i++) { 15358 scan_plan = nla_nest_start_noflag(msg, i + 1); 15359 if (!scan_plan) 15360 return -ENOBUFS; 15361 15362 if (nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_INTERVAL, 15363 req->scan_plans[i].interval) || 15364 (req->scan_plans[i].iterations && 15365 nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_ITERATIONS, 15366 req->scan_plans[i].iterations))) 15367 return -ENOBUFS; 15368 nla_nest_end(msg, scan_plan); 15369 } 15370 nla_nest_end(msg, scan_plans); 15371 15372 nla_nest_end(msg, nd); 15373 15374 return 0; 15375 } 15376 15377 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info) 15378 { 15379 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15380 struct sk_buff *msg; 15381 void *hdr; 15382 u32 size = NLMSG_DEFAULT_SIZE; 15383 15384 if (!rdev->wiphy.wowlan) 15385 return -EOPNOTSUPP; 15386 15387 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { 15388 /* adjust size to have room for all the data */ 15389 size += rdev->wiphy.wowlan_config->tcp->tokens_size + 15390 rdev->wiphy.wowlan_config->tcp->payload_len + 15391 rdev->wiphy.wowlan_config->tcp->wake_len + 15392 rdev->wiphy.wowlan_config->tcp->wake_len / 8; 15393 } 15394 15395 msg = nlmsg_new(size, GFP_KERNEL); 15396 if (!msg) 15397 return -ENOMEM; 15398 15399 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 15400 NL80211_CMD_GET_WOWLAN); 15401 if (!hdr) 15402 goto nla_put_failure; 15403 15404 if (rdev->wiphy.wowlan_config) { 15405 struct nlattr *nl_wowlan; 15406 15407 nl_wowlan = nla_nest_start_noflag(msg, 15408 NL80211_ATTR_WOWLAN_TRIGGERS); 15409 if (!nl_wowlan) 15410 goto nla_put_failure; 15411 15412 if ((rdev->wiphy.wowlan_config->any && 15413 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 15414 (rdev->wiphy.wowlan_config->disconnect && 15415 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 15416 (rdev->wiphy.wowlan_config->magic_pkt && 15417 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 15418 (rdev->wiphy.wowlan_config->gtk_rekey_failure && 15419 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 15420 (rdev->wiphy.wowlan_config->eap_identity_req && 15421 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 15422 (rdev->wiphy.wowlan_config->four_way_handshake && 15423 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 15424 (rdev->wiphy.wowlan_config->rfkill_release && 15425 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 15426 goto nla_put_failure; 15427 15428 if (nl80211_send_wowlan_patterns(msg, rdev)) 15429 goto nla_put_failure; 15430 15431 if (nl80211_send_wowlan_tcp(msg, 15432 rdev->wiphy.wowlan_config->tcp)) 15433 goto nla_put_failure; 15434 15435 if (nl80211_send_wowlan_nd( 15436 msg, 15437 rdev->wiphy.wowlan_config->nd_config)) 15438 goto nla_put_failure; 15439 15440 nla_nest_end(msg, nl_wowlan); 15441 } 15442 15443 genlmsg_end(msg, hdr); 15444 return genlmsg_reply(msg, info); 15445 15446 nla_put_failure: 15447 nlmsg_free(msg); 15448 return -ENOBUFS; 15449 } 15450 15451 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev, 15452 struct nlattr *attr, 15453 struct cfg80211_wowlan *trig) 15454 { 15455 struct nlattr *tb[NUM_NL80211_WOWLAN_TCP]; 15456 struct cfg80211_wowlan_tcp *cfg; 15457 struct nl80211_wowlan_tcp_data_token *tok = NULL; 15458 struct nl80211_wowlan_tcp_data_seq *seq = NULL; 15459 u32 size; 15460 u32 data_size, wake_size, tokens_size = 0, wake_mask_size; 15461 int err, port; 15462 15463 if (!rdev->wiphy.wowlan->tcp) 15464 return -EINVAL; 15465 15466 err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TCP, attr, 15467 nl80211_wowlan_tcp_policy, NULL); 15468 if (err) 15469 return err; 15470 15471 if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] || 15472 !tb[NL80211_WOWLAN_TCP_DST_IPV4] || 15473 !tb[NL80211_WOWLAN_TCP_DST_MAC] || 15474 !tb[NL80211_WOWLAN_TCP_DST_PORT] || 15475 !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] || 15476 !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] || 15477 !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] || 15478 !tb[NL80211_WOWLAN_TCP_WAKE_MASK]) 15479 return -EINVAL; 15480 15481 data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]); 15482 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) 15483 return -EINVAL; 15484 15485 if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) > 15486 rdev->wiphy.wowlan->tcp->data_interval_max || 15487 nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0) 15488 return -EINVAL; 15489 15490 wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]); 15491 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) 15492 return -EINVAL; 15493 15494 wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]); 15495 if (wake_mask_size != DIV_ROUND_UP(wake_size, 8)) 15496 return -EINVAL; 15497 15498 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) { 15499 u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 15500 15501 tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 15502 tokens_size = tokln - sizeof(*tok); 15503 15504 if (!tok->len || tokens_size % tok->len) 15505 return -EINVAL; 15506 if (!rdev->wiphy.wowlan->tcp->tok) 15507 return -EINVAL; 15508 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) 15509 return -EINVAL; 15510 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) 15511 return -EINVAL; 15512 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) 15513 return -EINVAL; 15514 if (tok->offset + tok->len > data_size) 15515 return -EINVAL; 15516 } 15517 15518 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) { 15519 seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]); 15520 if (!rdev->wiphy.wowlan->tcp->seq) 15521 return -EINVAL; 15522 if (seq->len == 0 || seq->len > 4) 15523 return -EINVAL; 15524 if (seq->len + seq->offset > data_size) 15525 return -EINVAL; 15526 } 15527 15528 size = sizeof(*cfg); 15529 size += data_size; 15530 size += wake_size + wake_mask_size; 15531 size += tokens_size; 15532 15533 cfg = kzalloc(size, GFP_KERNEL); 15534 if (!cfg) 15535 return -ENOMEM; 15536 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); 15537 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]); 15538 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), 15539 ETH_ALEN); 15540 port = nla_get_u16_default(tb[NL80211_WOWLAN_TCP_SRC_PORT], 0); 15541 #ifdef CONFIG_INET 15542 /* allocate a socket and port for it and use it */ 15543 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, 15544 IPPROTO_TCP, &cfg->sock, 1); 15545 if (err) { 15546 kfree(cfg); 15547 return err; 15548 } 15549 if (inet_csk_get_port(cfg->sock->sk, port)) { 15550 sock_release(cfg->sock); 15551 kfree(cfg); 15552 return -EADDRINUSE; 15553 } 15554 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; 15555 #else 15556 if (!port) { 15557 kfree(cfg); 15558 return -EINVAL; 15559 } 15560 cfg->src_port = port; 15561 #endif 15562 15563 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); 15564 cfg->payload_len = data_size; 15565 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; 15566 memcpy((void *)cfg->payload, 15567 nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]), 15568 data_size); 15569 if (seq) 15570 cfg->payload_seq = *seq; 15571 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); 15572 cfg->wake_len = wake_size; 15573 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; 15574 memcpy((void *)cfg->wake_data, 15575 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]), 15576 wake_size); 15577 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + 15578 data_size + wake_size; 15579 memcpy((void *)cfg->wake_mask, 15580 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]), 15581 wake_mask_size); 15582 if (tok) { 15583 cfg->tokens_size = tokens_size; 15584 cfg->payload_tok = *tok; 15585 memcpy(cfg->payload_tok.token_stream, tok->token_stream, 15586 tokens_size); 15587 } 15588 15589 trig->tcp = cfg; 15590 15591 return 0; 15592 } 15593 15594 static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev, 15595 const struct wiphy_wowlan_support *wowlan, 15596 struct nlattr *attr, 15597 struct cfg80211_wowlan *trig) 15598 { 15599 struct nlattr **tb; 15600 int err; 15601 15602 tb = kzalloc_objs(*tb, NUM_NL80211_ATTR); 15603 if (!tb) 15604 return -ENOMEM; 15605 15606 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) { 15607 err = -EOPNOTSUPP; 15608 goto out; 15609 } 15610 15611 err = nla_parse_nested_deprecated(tb, NL80211_ATTR_MAX, attr, 15612 nl80211_policy, NULL); 15613 if (err) 15614 goto out; 15615 15616 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb, 15617 wowlan->max_nd_match_sets); 15618 err = PTR_ERR_OR_ZERO(trig->nd_config); 15619 if (err) 15620 trig->nd_config = NULL; 15621 15622 out: 15623 kfree(tb); 15624 return err; 15625 } 15626 15627 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info) 15628 { 15629 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15630 struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG]; 15631 struct cfg80211_wowlan new_triggers = {}; 15632 struct cfg80211_wowlan *ntrig; 15633 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; 15634 int err, i; 15635 bool prev_enabled = rdev->wiphy.wowlan_config; 15636 bool regular = false; 15637 15638 if (!wowlan) 15639 return -EOPNOTSUPP; 15640 15641 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { 15642 cfg80211_rdev_free_wowlan(rdev); 15643 rdev->wiphy.wowlan_config = NULL; 15644 goto set_wakeup; 15645 } 15646 15647 err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TRIG, 15648 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS], 15649 nl80211_wowlan_policy, info->extack); 15650 if (err) 15651 return err; 15652 15653 if (tb[NL80211_WOWLAN_TRIG_ANY]) { 15654 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) 15655 return -EINVAL; 15656 new_triggers.any = true; 15657 } 15658 15659 if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) { 15660 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) 15661 return -EINVAL; 15662 new_triggers.disconnect = true; 15663 regular = true; 15664 } 15665 15666 if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) { 15667 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) 15668 return -EINVAL; 15669 new_triggers.magic_pkt = true; 15670 regular = true; 15671 } 15672 15673 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED]) 15674 return -EINVAL; 15675 15676 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) { 15677 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) 15678 return -EINVAL; 15679 new_triggers.gtk_rekey_failure = true; 15680 regular = true; 15681 } 15682 15683 if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) { 15684 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) 15685 return -EINVAL; 15686 new_triggers.eap_identity_req = true; 15687 regular = true; 15688 } 15689 15690 if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) { 15691 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) 15692 return -EINVAL; 15693 new_triggers.four_way_handshake = true; 15694 regular = true; 15695 } 15696 15697 if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) { 15698 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) 15699 return -EINVAL; 15700 new_triggers.rfkill_release = true; 15701 regular = true; 15702 } 15703 15704 if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) { 15705 struct nlattr *pat; 15706 int n_patterns = 0; 15707 int rem, pat_len, mask_len, pkt_offset; 15708 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 15709 15710 regular = true; 15711 15712 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 15713 rem) 15714 n_patterns++; 15715 if (n_patterns > wowlan->n_patterns) 15716 return -EINVAL; 15717 15718 new_triggers.patterns = kzalloc_objs(new_triggers.patterns[0], 15719 n_patterns); 15720 if (!new_triggers.patterns) 15721 return -ENOMEM; 15722 15723 new_triggers.n_patterns = n_patterns; 15724 i = 0; 15725 15726 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 15727 rem) { 15728 u8 *mask_pat; 15729 15730 err = nla_parse_nested_deprecated(pat_tb, 15731 MAX_NL80211_PKTPAT, 15732 pat, 15733 nl80211_packet_pattern_policy, 15734 info->extack); 15735 if (err) 15736 goto error; 15737 15738 err = -EINVAL; 15739 if (!pat_tb[NL80211_PKTPAT_MASK] || 15740 !pat_tb[NL80211_PKTPAT_PATTERN]) 15741 goto error; 15742 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 15743 mask_len = DIV_ROUND_UP(pat_len, 8); 15744 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 15745 goto error; 15746 if (pat_len > wowlan->pattern_max_len || 15747 pat_len < wowlan->pattern_min_len) 15748 goto error; 15749 15750 pkt_offset = 15751 nla_get_u32_default(pat_tb[NL80211_PKTPAT_OFFSET], 15752 0); 15753 if (pkt_offset > wowlan->max_pkt_offset) 15754 goto error; 15755 new_triggers.patterns[i].pkt_offset = pkt_offset; 15756 15757 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL); 15758 if (!mask_pat) { 15759 err = -ENOMEM; 15760 goto error; 15761 } 15762 new_triggers.patterns[i].mask = mask_pat; 15763 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]), 15764 mask_len); 15765 mask_pat += mask_len; 15766 new_triggers.patterns[i].pattern = mask_pat; 15767 new_triggers.patterns[i].pattern_len = pat_len; 15768 memcpy(mask_pat, 15769 nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 15770 pat_len); 15771 i++; 15772 } 15773 } 15774 15775 if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) { 15776 regular = true; 15777 err = nl80211_parse_wowlan_tcp( 15778 rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION], 15779 &new_triggers); 15780 if (err) 15781 goto error; 15782 } 15783 15784 if (tb[NL80211_WOWLAN_TRIG_NET_DETECT]) { 15785 regular = true; 15786 err = nl80211_parse_wowlan_nd( 15787 rdev, wowlan, tb[NL80211_WOWLAN_TRIG_NET_DETECT], 15788 &new_triggers); 15789 if (err) 15790 goto error; 15791 } 15792 15793 /* The 'any' trigger means the device continues operating more or less 15794 * as in its normal operation mode and wakes up the host on most of the 15795 * normal interrupts (like packet RX, ...) 15796 * It therefore makes little sense to combine with the more constrained 15797 * wakeup trigger modes. 15798 */ 15799 if (new_triggers.any && regular) { 15800 err = -EINVAL; 15801 goto error; 15802 } 15803 15804 ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL); 15805 if (!ntrig) { 15806 err = -ENOMEM; 15807 goto error; 15808 } 15809 cfg80211_rdev_free_wowlan(rdev); 15810 rdev->wiphy.wowlan_config = ntrig; 15811 15812 set_wakeup: 15813 if (rdev->ops->set_wakeup && 15814 prev_enabled != !!rdev->wiphy.wowlan_config) 15815 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); 15816 15817 return 0; 15818 error: 15819 for (i = 0; i < new_triggers.n_patterns; i++) 15820 kfree(new_triggers.patterns[i].mask); 15821 kfree(new_triggers.patterns); 15822 if (new_triggers.tcp && new_triggers.tcp->sock) 15823 sock_release(new_triggers.tcp->sock); 15824 kfree(new_triggers.tcp); 15825 kfree(new_triggers.nd_config); 15826 return err; 15827 } 15828 #endif 15829 15830 static int nl80211_send_coalesce_rules(struct sk_buff *msg, 15831 struct cfg80211_registered_device *rdev) 15832 { 15833 struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules; 15834 int i, j, pat_len; 15835 struct cfg80211_coalesce_rules *rule; 15836 15837 if (!rdev->coalesce->n_rules) 15838 return 0; 15839 15840 nl_rules = nla_nest_start_noflag(msg, NL80211_ATTR_COALESCE_RULE); 15841 if (!nl_rules) 15842 return -ENOBUFS; 15843 15844 for (i = 0; i < rdev->coalesce->n_rules; i++) { 15845 nl_rule = nla_nest_start_noflag(msg, i + 1); 15846 if (!nl_rule) 15847 return -ENOBUFS; 15848 15849 rule = &rdev->coalesce->rules[i]; 15850 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY, 15851 rule->delay)) 15852 return -ENOBUFS; 15853 15854 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION, 15855 rule->condition)) 15856 return -ENOBUFS; 15857 15858 nl_pats = nla_nest_start_noflag(msg, 15859 NL80211_ATTR_COALESCE_RULE_PKT_PATTERN); 15860 if (!nl_pats) 15861 return -ENOBUFS; 15862 15863 for (j = 0; j < rule->n_patterns; j++) { 15864 nl_pat = nla_nest_start_noflag(msg, j + 1); 15865 if (!nl_pat) 15866 return -ENOBUFS; 15867 pat_len = rule->patterns[j].pattern_len; 15868 if (nla_put(msg, NL80211_PKTPAT_MASK, 15869 DIV_ROUND_UP(pat_len, 8), 15870 rule->patterns[j].mask) || 15871 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 15872 rule->patterns[j].pattern) || 15873 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 15874 rule->patterns[j].pkt_offset)) 15875 return -ENOBUFS; 15876 nla_nest_end(msg, nl_pat); 15877 } 15878 nla_nest_end(msg, nl_pats); 15879 nla_nest_end(msg, nl_rule); 15880 } 15881 nla_nest_end(msg, nl_rules); 15882 15883 return 0; 15884 } 15885 15886 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info) 15887 { 15888 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15889 struct sk_buff *msg; 15890 void *hdr; 15891 15892 if (!rdev->wiphy.coalesce) 15893 return -EOPNOTSUPP; 15894 15895 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 15896 if (!msg) 15897 return -ENOMEM; 15898 15899 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 15900 NL80211_CMD_GET_COALESCE); 15901 if (!hdr) 15902 goto nla_put_failure; 15903 15904 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) 15905 goto nla_put_failure; 15906 15907 genlmsg_end(msg, hdr); 15908 return genlmsg_reply(msg, info); 15909 15910 nla_put_failure: 15911 nlmsg_free(msg); 15912 return -ENOBUFS; 15913 } 15914 15915 void cfg80211_free_coalesce(struct cfg80211_coalesce *coalesce) 15916 { 15917 int i, j; 15918 struct cfg80211_coalesce_rules *rule; 15919 15920 if (!coalesce) 15921 return; 15922 15923 for (i = 0; i < coalesce->n_rules; i++) { 15924 rule = &coalesce->rules[i]; 15925 for (j = 0; j < rule->n_patterns; j++) 15926 kfree(rule->patterns[j].mask); 15927 kfree(rule->patterns); 15928 } 15929 kfree(coalesce); 15930 } 15931 15932 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev, 15933 struct nlattr *rule, 15934 struct cfg80211_coalesce_rules *new_rule) 15935 { 15936 int err, i; 15937 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 15938 struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat; 15939 int rem, pat_len, mask_len, pkt_offset, n_patterns = 0; 15940 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 15941 15942 err = nla_parse_nested_deprecated(tb, NL80211_ATTR_COALESCE_RULE_MAX, 15943 rule, nl80211_coalesce_policy, NULL); 15944 if (err) 15945 return err; 15946 15947 if (tb[NL80211_ATTR_COALESCE_RULE_DELAY]) 15948 new_rule->delay = 15949 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]); 15950 if (new_rule->delay > coalesce->max_delay) 15951 return -EINVAL; 15952 15953 if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION]) 15954 new_rule->condition = 15955 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]); 15956 15957 if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN]) 15958 return -EINVAL; 15959 15960 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 15961 rem) 15962 n_patterns++; 15963 if (n_patterns > coalesce->n_patterns) 15964 return -EINVAL; 15965 15966 new_rule->patterns = kzalloc_objs(new_rule->patterns[0], n_patterns); 15967 if (!new_rule->patterns) 15968 return -ENOMEM; 15969 15970 new_rule->n_patterns = n_patterns; 15971 i = 0; 15972 15973 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 15974 rem) { 15975 u8 *mask_pat; 15976 15977 err = nla_parse_nested_deprecated(pat_tb, MAX_NL80211_PKTPAT, 15978 pat, 15979 nl80211_packet_pattern_policy, 15980 NULL); 15981 if (err) 15982 return err; 15983 15984 if (!pat_tb[NL80211_PKTPAT_MASK] || 15985 !pat_tb[NL80211_PKTPAT_PATTERN]) 15986 return -EINVAL; 15987 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 15988 mask_len = DIV_ROUND_UP(pat_len, 8); 15989 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 15990 return -EINVAL; 15991 if (pat_len > coalesce->pattern_max_len || 15992 pat_len < coalesce->pattern_min_len) 15993 return -EINVAL; 15994 15995 pkt_offset = nla_get_u32_default(pat_tb[NL80211_PKTPAT_OFFSET], 15996 0); 15997 if (pkt_offset > coalesce->max_pkt_offset) 15998 return -EINVAL; 15999 new_rule->patterns[i].pkt_offset = pkt_offset; 16000 16001 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL); 16002 if (!mask_pat) 16003 return -ENOMEM; 16004 16005 new_rule->patterns[i].mask = mask_pat; 16006 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]), 16007 mask_len); 16008 16009 mask_pat += mask_len; 16010 new_rule->patterns[i].pattern = mask_pat; 16011 new_rule->patterns[i].pattern_len = pat_len; 16012 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 16013 pat_len); 16014 i++; 16015 } 16016 16017 return 0; 16018 } 16019 16020 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info) 16021 { 16022 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16023 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 16024 struct cfg80211_coalesce *new_coalesce; 16025 int err, rem_rule, n_rules = 0, i; 16026 struct nlattr *rule; 16027 16028 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) 16029 return -EOPNOTSUPP; 16030 16031 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { 16032 cfg80211_free_coalesce(rdev->coalesce); 16033 rdev->coalesce = NULL; 16034 rdev_set_coalesce(rdev, NULL); 16035 return 0; 16036 } 16037 16038 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 16039 rem_rule) 16040 n_rules++; 16041 if (n_rules > coalesce->n_rules) 16042 return -EINVAL; 16043 16044 new_coalesce = kzalloc_flex(*new_coalesce, rules, n_rules); 16045 if (!new_coalesce) 16046 return -ENOMEM; 16047 16048 new_coalesce->n_rules = n_rules; 16049 i = 0; 16050 16051 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 16052 rem_rule) { 16053 err = nl80211_parse_coalesce_rule(rdev, rule, 16054 &new_coalesce->rules[i]); 16055 if (err) 16056 goto error; 16057 16058 i++; 16059 } 16060 16061 err = rdev_set_coalesce(rdev, new_coalesce); 16062 if (err) 16063 goto error; 16064 16065 cfg80211_free_coalesce(rdev->coalesce); 16066 rdev->coalesce = new_coalesce; 16067 16068 return 0; 16069 error: 16070 cfg80211_free_coalesce(new_coalesce); 16071 16072 return err; 16073 } 16074 16075 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info) 16076 { 16077 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16078 struct net_device *dev = info->user_ptr[1]; 16079 struct wireless_dev *wdev = dev->ieee80211_ptr; 16080 struct nlattr *tb[NUM_NL80211_REKEY_DATA]; 16081 struct cfg80211_gtk_rekey_data rekey_data = {}; 16082 int err; 16083 16084 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) 16085 return -EINVAL; 16086 16087 err = nla_parse_nested_deprecated(tb, MAX_NL80211_REKEY_DATA, 16088 info->attrs[NL80211_ATTR_REKEY_DATA], 16089 nl80211_rekey_policy, info->extack); 16090 if (err) 16091 return err; 16092 16093 if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] || 16094 !tb[NL80211_REKEY_DATA_KCK]) 16095 return -EINVAL; 16096 if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN && 16097 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && 16098 nla_len(tb[NL80211_REKEY_DATA_KEK]) == NL80211_KEK_EXT_LEN)) 16099 return -ERANGE; 16100 if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN && 16101 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && 16102 nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN) && 16103 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KCK_32 && 16104 nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN_32)) 16105 return -ERANGE; 16106 16107 rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]); 16108 rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]); 16109 rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]); 16110 rekey_data.kek_len = nla_len(tb[NL80211_REKEY_DATA_KEK]); 16111 rekey_data.kck_len = nla_len(tb[NL80211_REKEY_DATA_KCK]); 16112 if (tb[NL80211_REKEY_DATA_AKM]) 16113 rekey_data.akm = nla_get_u32(tb[NL80211_REKEY_DATA_AKM]); 16114 16115 if (!wdev->connected) 16116 return -ENOTCONN; 16117 16118 if (!rdev->ops->set_rekey_data) 16119 return -EOPNOTSUPP; 16120 16121 return rdev_set_rekey_data(rdev, dev, &rekey_data); 16122 } 16123 16124 static int nl80211_register_unexpected_frame(struct sk_buff *skb, 16125 struct genl_info *info) 16126 { 16127 struct net_device *dev = info->user_ptr[1]; 16128 struct wireless_dev *wdev = dev->ieee80211_ptr; 16129 16130 if (wdev->iftype != NL80211_IFTYPE_AP && 16131 wdev->iftype != NL80211_IFTYPE_P2P_GO && 16132 wdev->iftype != NL80211_IFTYPE_NAN_DATA) 16133 return -EINVAL; 16134 16135 if (wdev->unexpected_nlportid) 16136 return -EBUSY; 16137 16138 wdev->unexpected_nlportid = info->snd_portid; 16139 return 0; 16140 } 16141 16142 static int nl80211_probe_client(struct sk_buff *skb, 16143 struct genl_info *info) 16144 { 16145 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16146 struct net_device *dev = info->user_ptr[1]; 16147 struct wireless_dev *wdev = dev->ieee80211_ptr; 16148 struct sk_buff *msg; 16149 void *hdr; 16150 const u8 *addr; 16151 u64 cookie; 16152 int err; 16153 16154 if (wdev->iftype != NL80211_IFTYPE_AP && 16155 wdev->iftype != NL80211_IFTYPE_P2P_GO) 16156 return -EOPNOTSUPP; 16157 16158 if (!info->attrs[NL80211_ATTR_MAC]) 16159 return -EINVAL; 16160 16161 if (!rdev->ops->probe_client) 16162 return -EOPNOTSUPP; 16163 16164 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 16165 if (!msg) 16166 return -ENOMEM; 16167 16168 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 16169 NL80211_CMD_PROBE_CLIENT); 16170 if (!hdr) { 16171 err = -ENOBUFS; 16172 goto free_msg; 16173 } 16174 16175 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 16176 16177 err = rdev_probe_client(rdev, dev, addr, &cookie); 16178 if (err) 16179 goto free_msg; 16180 16181 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 16182 NL80211_ATTR_PAD)) 16183 goto nla_put_failure; 16184 16185 genlmsg_end(msg, hdr); 16186 16187 return genlmsg_reply(msg, info); 16188 16189 nla_put_failure: 16190 err = -ENOBUFS; 16191 free_msg: 16192 nlmsg_free(msg); 16193 return err; 16194 } 16195 16196 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info) 16197 { 16198 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16199 struct cfg80211_beacon_registration *reg, *nreg; 16200 int rv; 16201 16202 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) 16203 return -EOPNOTSUPP; 16204 16205 nreg = kzalloc_obj(*nreg); 16206 if (!nreg) 16207 return -ENOMEM; 16208 16209 /* First, check if already registered. */ 16210 spin_lock_bh(&rdev->beacon_registrations_lock); 16211 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 16212 if (reg->nlportid == info->snd_portid) { 16213 rv = -EALREADY; 16214 goto out_err; 16215 } 16216 } 16217 /* Add it to the list */ 16218 nreg->nlportid = info->snd_portid; 16219 list_add(&nreg->list, &rdev->beacon_registrations); 16220 16221 spin_unlock_bh(&rdev->beacon_registrations_lock); 16222 16223 return 0; 16224 out_err: 16225 spin_unlock_bh(&rdev->beacon_registrations_lock); 16226 kfree(nreg); 16227 return rv; 16228 } 16229 16230 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info) 16231 { 16232 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16233 struct wireless_dev *wdev = info->user_ptr[1]; 16234 int err; 16235 16236 if (!rdev->ops->start_p2p_device) 16237 return -EOPNOTSUPP; 16238 16239 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 16240 return -EOPNOTSUPP; 16241 16242 if (wdev_running(wdev)) 16243 return 0; 16244 16245 if (rfkill_blocked(rdev->wiphy.rfkill)) 16246 return -ERFKILL; 16247 16248 err = rdev_start_p2p_device(rdev, wdev); 16249 if (err) 16250 return err; 16251 16252 wdev->is_running = true; 16253 rdev->opencount++; 16254 16255 return 0; 16256 } 16257 16258 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info) 16259 { 16260 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16261 struct wireless_dev *wdev = info->user_ptr[1]; 16262 16263 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 16264 return -EOPNOTSUPP; 16265 16266 if (!rdev->ops->stop_p2p_device) 16267 return -EOPNOTSUPP; 16268 16269 cfg80211_stop_p2p_device(rdev, wdev); 16270 16271 return 0; 16272 } 16273 16274 static struct ieee80211_channel *nl80211_get_nan_channel(struct wiphy *wiphy, 16275 int freq) 16276 { 16277 struct ieee80211_channel *chan; 16278 struct cfg80211_chan_def def; 16279 16280 /* Check if the frequency is valid for NAN */ 16281 if (freq != 5220 && freq != 5745 && freq != 2437) 16282 return NULL; 16283 16284 chan = ieee80211_get_channel(wiphy, freq); 16285 if (!chan) 16286 return NULL; 16287 16288 cfg80211_chandef_create(&def, chan, NL80211_CHAN_NO_HT); 16289 16290 /* Check if the channel is allowed */ 16291 if (cfg80211_reg_can_beacon(wiphy, &def, NL80211_IFTYPE_NAN)) 16292 return chan; 16293 16294 return NULL; 16295 } 16296 16297 static int nl80211_parse_nan_band_config(struct wiphy *wiphy, 16298 struct nlattr **tb, 16299 struct cfg80211_nan_band_config *cfg, 16300 enum nl80211_band band) 16301 { 16302 if (BIT(band) & ~(u32)wiphy->nan_supported_bands) 16303 return -EINVAL; 16304 16305 if (tb[NL80211_NAN_BAND_CONF_FREQ]) { 16306 u16 freq = nla_get_u16(tb[NL80211_NAN_BAND_CONF_FREQ]); 16307 16308 if (band != NL80211_BAND_5GHZ) 16309 return -EINVAL; 16310 16311 cfg->chan = nl80211_get_nan_channel(wiphy, freq); 16312 if (!cfg->chan) 16313 return -EINVAL; 16314 } 16315 16316 if (tb[NL80211_NAN_BAND_CONF_RSSI_CLOSE]) { 16317 cfg->rssi_close = 16318 nla_get_s8(tb[NL80211_NAN_BAND_CONF_RSSI_CLOSE]); 16319 if (!tb[NL80211_NAN_BAND_CONF_RSSI_MIDDLE]) 16320 return -EINVAL; 16321 } 16322 16323 if (tb[NL80211_NAN_BAND_CONF_RSSI_MIDDLE]) { 16324 cfg->rssi_middle = 16325 nla_get_s8(tb[NL80211_NAN_BAND_CONF_RSSI_MIDDLE]); 16326 if (!cfg->rssi_close || cfg->rssi_middle >= cfg->rssi_close) 16327 return -EINVAL; 16328 } 16329 16330 if (tb[NL80211_NAN_BAND_CONF_WAKE_DW]) { 16331 cfg->awake_dw_interval = 16332 nla_get_u8(tb[NL80211_NAN_BAND_CONF_WAKE_DW]); 16333 16334 if (band == NL80211_BAND_2GHZ && cfg->awake_dw_interval == 0) 16335 return -EINVAL; 16336 } 16337 16338 cfg->disable_scan = 16339 nla_get_flag(tb[NL80211_NAN_BAND_CONF_DISABLE_SCAN]); 16340 return 0; 16341 } 16342 16343 static int nl80211_parse_nan_conf(struct wiphy *wiphy, 16344 struct genl_info *info, 16345 struct cfg80211_nan_conf *conf, 16346 u32 *changed_flags, 16347 bool start) 16348 { 16349 struct nlattr *attrs[NL80211_NAN_CONF_ATTR_MAX + 1]; 16350 int err, rem; 16351 u32 changed = 0; 16352 struct nlattr *band_config; 16353 16354 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { 16355 conf->master_pref = 16356 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); 16357 16358 changed |= CFG80211_NAN_CONF_CHANGED_PREF; 16359 } 16360 16361 if (info->attrs[NL80211_ATTR_BANDS]) { 16362 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); 16363 16364 if (bands & ~(u32)wiphy->nan_supported_bands) 16365 return -EOPNOTSUPP; 16366 16367 if (bands && !(bands & BIT(NL80211_BAND_2GHZ))) 16368 return -EINVAL; 16369 16370 conf->bands = bands; 16371 changed |= CFG80211_NAN_CONF_CHANGED_BANDS; 16372 } 16373 16374 conf->band_cfgs[NL80211_BAND_2GHZ].awake_dw_interval = 1; 16375 if (conf->bands & BIT(NL80211_BAND_5GHZ) || !conf->bands) 16376 conf->band_cfgs[NL80211_BAND_5GHZ].awake_dw_interval = 1; 16377 16378 /* On 2.4 GHz band use channel 6 */ 16379 conf->band_cfgs[NL80211_BAND_2GHZ].chan = 16380 nl80211_get_nan_channel(wiphy, 2437); 16381 if (!conf->band_cfgs[NL80211_BAND_2GHZ].chan) 16382 return -EINVAL; 16383 16384 if (!info->attrs[NL80211_ATTR_NAN_CONFIG]) 16385 goto out; 16386 16387 err = nla_parse_nested(attrs, NL80211_NAN_CONF_ATTR_MAX, 16388 info->attrs[NL80211_ATTR_NAN_CONFIG], NULL, 16389 info->extack); 16390 if (err) 16391 return err; 16392 16393 changed |= CFG80211_NAN_CONF_CHANGED_CONFIG; 16394 if (attrs[NL80211_NAN_CONF_CLUSTER_ID] && start) { 16395 ether_addr_copy(conf->cluster_id, 16396 nla_data(attrs[NL80211_NAN_CONF_CLUSTER_ID])); 16397 } else if (start) { 16398 conf->cluster_id[0] = 0x50; 16399 conf->cluster_id[1] = 0x6f; 16400 conf->cluster_id[2] = 0x9a; 16401 conf->cluster_id[3] = 0x01; 16402 get_random_bytes(&conf->cluster_id[4], 2); 16403 } 16404 16405 if (attrs[NL80211_NAN_CONF_EXTRA_ATTRS]) { 16406 conf->extra_nan_attrs = 16407 nla_data(attrs[NL80211_NAN_CONF_EXTRA_ATTRS]); 16408 conf->extra_nan_attrs_len = 16409 nla_len(attrs[NL80211_NAN_CONF_EXTRA_ATTRS]); 16410 } 16411 16412 if (attrs[NL80211_NAN_CONF_VENDOR_ELEMS]) { 16413 conf->vendor_elems = 16414 nla_data(attrs[NL80211_NAN_CONF_VENDOR_ELEMS]); 16415 conf->vendor_elems_len = 16416 nla_len(attrs[NL80211_NAN_CONF_VENDOR_ELEMS]); 16417 } 16418 16419 if (attrs[NL80211_NAN_CONF_BAND_CONFIGS]) { 16420 nla_for_each_nested(band_config, 16421 attrs[NL80211_NAN_CONF_BAND_CONFIGS], 16422 rem) { 16423 enum nl80211_band band; 16424 struct cfg80211_nan_band_config *cfg; 16425 struct nlattr *tb[NL80211_NAN_BAND_CONF_ATTR_MAX + 1]; 16426 16427 err = nla_parse_nested(tb, 16428 NL80211_NAN_BAND_CONF_ATTR_MAX, 16429 band_config, NULL, 16430 info->extack); 16431 if (err) 16432 return err; 16433 16434 if (!tb[NL80211_NAN_BAND_CONF_BAND]) 16435 return -EINVAL; 16436 16437 band = nla_get_u8(tb[NL80211_NAN_BAND_CONF_BAND]); 16438 if (conf->bands && !(conf->bands & BIT(band))) 16439 return -EINVAL; 16440 16441 cfg = &conf->band_cfgs[band]; 16442 16443 err = nl80211_parse_nan_band_config(wiphy, tb, cfg, 16444 band); 16445 if (err) 16446 return err; 16447 } 16448 } 16449 16450 if (attrs[NL80211_NAN_CONF_SCAN_PERIOD]) 16451 conf->scan_period = 16452 nla_get_u16(attrs[NL80211_NAN_CONF_SCAN_PERIOD]); 16453 16454 if (attrs[NL80211_NAN_CONF_SCAN_DWELL_TIME]) 16455 conf->scan_dwell_time = 16456 nla_get_u16(attrs[NL80211_NAN_CONF_SCAN_DWELL_TIME]); 16457 16458 if (attrs[NL80211_NAN_CONF_DISCOVERY_BEACON_INTERVAL]) 16459 conf->discovery_beacon_interval = 16460 nla_get_u8(attrs[NL80211_NAN_CONF_DISCOVERY_BEACON_INTERVAL]); 16461 16462 if (attrs[NL80211_NAN_CONF_NOTIFY_DW]) 16463 conf->enable_dw_notification = 16464 nla_get_flag(attrs[NL80211_NAN_CONF_NOTIFY_DW]); 16465 16466 out: 16467 if (!conf->band_cfgs[NL80211_BAND_5GHZ].chan && 16468 (!conf->bands || conf->bands & BIT(NL80211_BAND_5GHZ))) { 16469 /* If no 5GHz channel is specified use default, if possible */ 16470 conf->band_cfgs[NL80211_BAND_5GHZ].chan = 16471 nl80211_get_nan_channel(wiphy, 5745); 16472 if (!conf->band_cfgs[NL80211_BAND_5GHZ].chan) 16473 conf->band_cfgs[NL80211_BAND_5GHZ].chan = 16474 nl80211_get_nan_channel(wiphy, 5220); 16475 16476 /* Return error if user space asked explicitly for 5 GHz */ 16477 if (!conf->band_cfgs[NL80211_BAND_5GHZ].chan && 16478 conf->bands & BIT(NL80211_BAND_5GHZ)) { 16479 NL_SET_ERR_MSG_ATTR(info->extack, 16480 info->attrs[NL80211_ATTR_BANDS], 16481 "5 GHz band operation is not allowed"); 16482 return -EINVAL; 16483 } 16484 } 16485 16486 if (changed_flags) 16487 *changed_flags = changed; 16488 16489 return 0; 16490 } 16491 16492 static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info) 16493 { 16494 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16495 struct wireless_dev *wdev = info->user_ptr[1]; 16496 struct cfg80211_nan_conf conf = {}; 16497 int err; 16498 16499 if (wdev->iftype != NL80211_IFTYPE_NAN) 16500 return -EOPNOTSUPP; 16501 16502 if (wdev_running(wdev)) 16503 return -EEXIST; 16504 16505 if (rfkill_blocked(rdev->wiphy.rfkill)) 16506 return -ERFKILL; 16507 16508 /* Master preference is mandatory for START_NAN */ 16509 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) 16510 return -EINVAL; 16511 16512 err = nl80211_parse_nan_conf(&rdev->wiphy, info, &conf, NULL, true); 16513 if (err) 16514 return err; 16515 16516 err = rdev_start_nan(rdev, wdev, &conf); 16517 if (err) 16518 return err; 16519 16520 wdev->is_running = true; 16521 rdev->opencount++; 16522 16523 return 0; 16524 } 16525 16526 static int nl80211_stop_nan(struct sk_buff *skb, struct genl_info *info) 16527 { 16528 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16529 struct wireless_dev *wdev = info->user_ptr[1]; 16530 16531 if (wdev->iftype != NL80211_IFTYPE_NAN) 16532 return -EOPNOTSUPP; 16533 16534 cfg80211_close_dependents(rdev, wdev); 16535 16536 guard(wiphy)(&rdev->wiphy); 16537 16538 cfg80211_stop_nan(rdev, wdev); 16539 16540 return 0; 16541 } 16542 16543 static int validate_nan_filter(struct nlattr *filter_attr) 16544 { 16545 struct nlattr *attr; 16546 int len = 0, n_entries = 0, rem; 16547 16548 nla_for_each_nested(attr, filter_attr, rem) { 16549 len += nla_len(attr); 16550 n_entries++; 16551 } 16552 16553 if (len >= U8_MAX) 16554 return -EINVAL; 16555 16556 return n_entries; 16557 } 16558 16559 static int handle_nan_filter(struct nlattr *attr_filter, 16560 struct cfg80211_nan_func *func, 16561 bool tx) 16562 { 16563 struct nlattr *attr; 16564 int n_entries, rem, i; 16565 struct cfg80211_nan_func_filter *filter; 16566 16567 n_entries = validate_nan_filter(attr_filter); 16568 if (n_entries < 0) 16569 return n_entries; 16570 16571 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters)); 16572 16573 filter = kzalloc_objs(*func->rx_filters, n_entries); 16574 if (!filter) 16575 return -ENOMEM; 16576 16577 i = 0; 16578 nla_for_each_nested(attr, attr_filter, rem) { 16579 filter[i].filter = nla_memdup(attr, GFP_KERNEL); 16580 if (!filter[i].filter) 16581 goto err; 16582 16583 filter[i].len = nla_len(attr); 16584 i++; 16585 } 16586 if (tx) { 16587 func->num_tx_filters = n_entries; 16588 func->tx_filters = filter; 16589 } else { 16590 func->num_rx_filters = n_entries; 16591 func->rx_filters = filter; 16592 } 16593 16594 return 0; 16595 16596 err: 16597 i = 0; 16598 nla_for_each_nested(attr, attr_filter, rem) { 16599 kfree(filter[i].filter); 16600 i++; 16601 } 16602 kfree(filter); 16603 return -ENOMEM; 16604 } 16605 16606 static int nl80211_nan_add_func(struct sk_buff *skb, 16607 struct genl_info *info) 16608 { 16609 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16610 struct wireless_dev *wdev = info->user_ptr[1]; 16611 struct nlattr *tb[NUM_NL80211_NAN_FUNC_ATTR], *func_attr; 16612 struct cfg80211_nan_func *func; 16613 struct sk_buff *msg = NULL; 16614 void *hdr = NULL; 16615 int err = 0; 16616 16617 if (wdev->iftype != NL80211_IFTYPE_NAN) 16618 return -EOPNOTSUPP; 16619 16620 if (!wdev_running(wdev)) 16621 return -ENOTCONN; 16622 16623 if (!info->attrs[NL80211_ATTR_NAN_FUNC]) 16624 return -EINVAL; 16625 16626 err = nla_parse_nested_deprecated(tb, NL80211_NAN_FUNC_ATTR_MAX, 16627 info->attrs[NL80211_ATTR_NAN_FUNC], 16628 nl80211_nan_func_policy, 16629 info->extack); 16630 if (err) 16631 return err; 16632 16633 func = kzalloc_obj(*func); 16634 if (!func) 16635 return -ENOMEM; 16636 16637 func->cookie = cfg80211_assign_cookie(rdev); 16638 16639 if (!tb[NL80211_NAN_FUNC_TYPE]) { 16640 err = -EINVAL; 16641 goto out; 16642 } 16643 16644 16645 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]); 16646 16647 if (!tb[NL80211_NAN_FUNC_SERVICE_ID]) { 16648 err = -EINVAL; 16649 goto out; 16650 } 16651 16652 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]), 16653 sizeof(func->service_id)); 16654 16655 func->close_range = 16656 nla_get_flag(tb[NL80211_NAN_FUNC_CLOSE_RANGE]); 16657 16658 if (tb[NL80211_NAN_FUNC_SERVICE_INFO]) { 16659 func->serv_spec_info_len = 16660 nla_len(tb[NL80211_NAN_FUNC_SERVICE_INFO]); 16661 func->serv_spec_info = 16662 kmemdup(nla_data(tb[NL80211_NAN_FUNC_SERVICE_INFO]), 16663 func->serv_spec_info_len, 16664 GFP_KERNEL); 16665 if (!func->serv_spec_info) { 16666 err = -ENOMEM; 16667 goto out; 16668 } 16669 } 16670 16671 if (tb[NL80211_NAN_FUNC_TTL]) 16672 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]); 16673 16674 switch (func->type) { 16675 case NL80211_NAN_FUNC_PUBLISH: 16676 if (!tb[NL80211_NAN_FUNC_PUBLISH_TYPE]) { 16677 err = -EINVAL; 16678 goto out; 16679 } 16680 16681 func->publish_type = 16682 nla_get_u8(tb[NL80211_NAN_FUNC_PUBLISH_TYPE]); 16683 func->publish_bcast = 16684 nla_get_flag(tb[NL80211_NAN_FUNC_PUBLISH_BCAST]); 16685 16686 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) && 16687 func->publish_bcast) { 16688 err = -EINVAL; 16689 goto out; 16690 } 16691 break; 16692 case NL80211_NAN_FUNC_SUBSCRIBE: 16693 func->subscribe_active = 16694 nla_get_flag(tb[NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE]); 16695 break; 16696 case NL80211_NAN_FUNC_FOLLOW_UP: 16697 if (!tb[NL80211_NAN_FUNC_FOLLOW_UP_ID] || 16698 !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] || 16699 !tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]) { 16700 err = -EINVAL; 16701 goto out; 16702 } 16703 16704 func->followup_id = 16705 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_ID]); 16706 func->followup_reqid = 16707 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]); 16708 memcpy(func->followup_dest.addr, 16709 nla_data(tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]), 16710 sizeof(func->followup_dest.addr)); 16711 if (func->ttl) { 16712 err = -EINVAL; 16713 goto out; 16714 } 16715 break; 16716 default: 16717 err = -EINVAL; 16718 goto out; 16719 } 16720 16721 if (tb[NL80211_NAN_FUNC_SRF]) { 16722 struct nlattr *srf_tb[NUM_NL80211_NAN_SRF_ATTR]; 16723 16724 err = nla_parse_nested_deprecated(srf_tb, 16725 NL80211_NAN_SRF_ATTR_MAX, 16726 tb[NL80211_NAN_FUNC_SRF], 16727 nl80211_nan_srf_policy, 16728 info->extack); 16729 if (err) 16730 goto out; 16731 16732 func->srf_include = 16733 nla_get_flag(srf_tb[NL80211_NAN_SRF_INCLUDE]); 16734 16735 if (srf_tb[NL80211_NAN_SRF_BF]) { 16736 if (srf_tb[NL80211_NAN_SRF_MAC_ADDRS] || 16737 !srf_tb[NL80211_NAN_SRF_BF_IDX]) { 16738 err = -EINVAL; 16739 goto out; 16740 } 16741 16742 func->srf_bf_len = 16743 nla_len(srf_tb[NL80211_NAN_SRF_BF]); 16744 func->srf_bf = 16745 kmemdup(nla_data(srf_tb[NL80211_NAN_SRF_BF]), 16746 func->srf_bf_len, GFP_KERNEL); 16747 if (!func->srf_bf) { 16748 err = -ENOMEM; 16749 goto out; 16750 } 16751 16752 func->srf_bf_idx = 16753 nla_get_u8(srf_tb[NL80211_NAN_SRF_BF_IDX]); 16754 } else { 16755 struct nlattr *attr, *mac_attr = 16756 srf_tb[NL80211_NAN_SRF_MAC_ADDRS]; 16757 int n_entries, rem, i = 0; 16758 16759 if (!mac_attr) { 16760 err = -EINVAL; 16761 goto out; 16762 } 16763 16764 n_entries = validate_acl_mac_addrs(mac_attr); 16765 if (n_entries <= 0) { 16766 err = -EINVAL; 16767 goto out; 16768 } 16769 16770 func->srf_num_macs = n_entries; 16771 func->srf_macs = 16772 kzalloc_objs(*func->srf_macs, n_entries); 16773 if (!func->srf_macs) { 16774 err = -ENOMEM; 16775 goto out; 16776 } 16777 16778 nla_for_each_nested(attr, mac_attr, rem) 16779 memcpy(func->srf_macs[i++].addr, nla_data(attr), 16780 sizeof(*func->srf_macs)); 16781 } 16782 } 16783 16784 if (tb[NL80211_NAN_FUNC_TX_MATCH_FILTER]) { 16785 err = handle_nan_filter(tb[NL80211_NAN_FUNC_TX_MATCH_FILTER], 16786 func, true); 16787 if (err) 16788 goto out; 16789 } 16790 16791 if (tb[NL80211_NAN_FUNC_RX_MATCH_FILTER]) { 16792 err = handle_nan_filter(tb[NL80211_NAN_FUNC_RX_MATCH_FILTER], 16793 func, false); 16794 if (err) 16795 goto out; 16796 } 16797 16798 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 16799 if (!msg) { 16800 err = -ENOMEM; 16801 goto out; 16802 } 16803 16804 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 16805 NL80211_CMD_ADD_NAN_FUNCTION); 16806 /* This can't really happen - we just allocated 4KB */ 16807 if (WARN_ON(!hdr)) { 16808 err = -ENOMEM; 16809 goto out; 16810 } 16811 16812 err = rdev_add_nan_func(rdev, wdev, func); 16813 out: 16814 if (err < 0) { 16815 cfg80211_free_nan_func(func); 16816 nlmsg_free(msg); 16817 return err; 16818 } 16819 16820 /* propagate the instance id and cookie to userspace */ 16821 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie, 16822 NL80211_ATTR_PAD)) 16823 goto nla_put_failure; 16824 16825 func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC); 16826 if (!func_attr) 16827 goto nla_put_failure; 16828 16829 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, 16830 func->instance_id)) 16831 goto nla_put_failure; 16832 16833 nla_nest_end(msg, func_attr); 16834 16835 genlmsg_end(msg, hdr); 16836 return genlmsg_reply(msg, info); 16837 16838 nla_put_failure: 16839 nlmsg_free(msg); 16840 return -ENOBUFS; 16841 } 16842 16843 static int nl80211_nan_del_func(struct sk_buff *skb, 16844 struct genl_info *info) 16845 { 16846 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16847 struct wireless_dev *wdev = info->user_ptr[1]; 16848 u64 cookie; 16849 16850 if (wdev->iftype != NL80211_IFTYPE_NAN) 16851 return -EOPNOTSUPP; 16852 16853 if (!wdev_running(wdev)) 16854 return -ENOTCONN; 16855 16856 if (!info->attrs[NL80211_ATTR_COOKIE]) 16857 return -EINVAL; 16858 16859 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 16860 16861 rdev_del_nan_func(rdev, wdev, cookie); 16862 16863 return 0; 16864 } 16865 16866 static int nl80211_nan_change_config(struct sk_buff *skb, 16867 struct genl_info *info) 16868 { 16869 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16870 struct wireless_dev *wdev = info->user_ptr[1]; 16871 struct cfg80211_nan_conf conf = {}; 16872 u32 changed = 0; 16873 int err; 16874 16875 if (wdev->iftype != NL80211_IFTYPE_NAN) 16876 return -EOPNOTSUPP; 16877 16878 if (!wdev_running(wdev)) 16879 return -ENOTCONN; 16880 16881 err = nl80211_parse_nan_conf(&rdev->wiphy, info, &conf, &changed, false); 16882 if (err) 16883 return err; 16884 16885 if (!changed) 16886 return -EINVAL; 16887 16888 return rdev_nan_change_conf(rdev, wdev, &conf, changed); 16889 } 16890 16891 static int nl80211_start_pd(struct sk_buff *skb, struct genl_info *info) 16892 { 16893 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16894 struct wireless_dev *wdev = info->user_ptr[1]; 16895 int err; 16896 16897 if (wdev->iftype != NL80211_IFTYPE_PD) 16898 return -EOPNOTSUPP; 16899 16900 if (wdev_running(wdev)) 16901 return -EEXIST; 16902 16903 if (rfkill_blocked(rdev->wiphy.rfkill)) 16904 return -ERFKILL; 16905 16906 if (!rdev->ops->start_pd) 16907 return -EOPNOTSUPP; 16908 16909 err = rdev_start_pd(rdev, wdev); 16910 if (err) 16911 return err; 16912 wdev->is_running = true; 16913 rdev->opencount++; 16914 16915 return 0; 16916 } 16917 16918 static int nl80211_stop_pd(struct sk_buff *skb, struct genl_info *info) 16919 { 16920 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16921 struct wireless_dev *wdev = info->user_ptr[1]; 16922 16923 if (wdev->iftype != NL80211_IFTYPE_PD) 16924 return -EOPNOTSUPP; 16925 16926 cfg80211_stop_pd(rdev, wdev); 16927 16928 return 0; 16929 } 16930 16931 void cfg80211_nan_match(struct wireless_dev *wdev, 16932 struct cfg80211_nan_match_params *match, gfp_t gfp) 16933 { 16934 struct wiphy *wiphy = wdev->wiphy; 16935 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16936 struct nlattr *match_attr, *local_func_attr, *peer_func_attr; 16937 struct sk_buff *msg; 16938 void *hdr; 16939 16940 if (WARN_ON(wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_USERSPACE_DE)) 16941 return; 16942 16943 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr)) 16944 return; 16945 16946 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16947 if (!msg) 16948 return; 16949 16950 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_MATCH); 16951 if (!hdr) { 16952 nlmsg_free(msg); 16953 return; 16954 } 16955 16956 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16957 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 16958 wdev->netdev->ifindex)) || 16959 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 16960 NL80211_ATTR_PAD)) 16961 goto nla_put_failure; 16962 16963 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie, 16964 NL80211_ATTR_PAD) || 16965 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr)) 16966 goto nla_put_failure; 16967 16968 match_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_MATCH); 16969 if (!match_attr) 16970 goto nla_put_failure; 16971 16972 local_func_attr = nla_nest_start_noflag(msg, 16973 NL80211_NAN_MATCH_FUNC_LOCAL); 16974 if (!local_func_attr) 16975 goto nla_put_failure; 16976 16977 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id)) 16978 goto nla_put_failure; 16979 16980 nla_nest_end(msg, local_func_attr); 16981 16982 peer_func_attr = nla_nest_start_noflag(msg, 16983 NL80211_NAN_MATCH_FUNC_PEER); 16984 if (!peer_func_attr) 16985 goto nla_put_failure; 16986 16987 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) || 16988 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id)) 16989 goto nla_put_failure; 16990 16991 if (match->info && match->info_len && 16992 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len, 16993 match->info)) 16994 goto nla_put_failure; 16995 16996 nla_nest_end(msg, peer_func_attr); 16997 nla_nest_end(msg, match_attr); 16998 genlmsg_end(msg, hdr); 16999 17000 if (!wdev->owner_nlportid) 17001 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 17002 msg, 0, NL80211_MCGRP_NAN, gfp); 17003 else 17004 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 17005 wdev->owner_nlportid); 17006 17007 return; 17008 17009 nla_put_failure: 17010 nlmsg_free(msg); 17011 } 17012 EXPORT_SYMBOL(cfg80211_nan_match); 17013 17014 void cfg80211_nan_func_terminated(struct wireless_dev *wdev, 17015 u8 inst_id, 17016 enum nl80211_nan_func_term_reason reason, 17017 u64 cookie, gfp_t gfp) 17018 { 17019 struct wiphy *wiphy = wdev->wiphy; 17020 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 17021 struct sk_buff *msg; 17022 struct nlattr *func_attr; 17023 void *hdr; 17024 17025 if (WARN_ON(wiphy->nan_capa.flags & WIPHY_NAN_FLAGS_USERSPACE_DE)) 17026 return; 17027 17028 if (WARN_ON(!inst_id)) 17029 return; 17030 17031 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 17032 if (!msg) 17033 return; 17034 17035 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_NAN_FUNCTION); 17036 if (!hdr) { 17037 nlmsg_free(msg); 17038 return; 17039 } 17040 17041 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17042 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 17043 wdev->netdev->ifindex)) || 17044 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 17045 NL80211_ATTR_PAD)) 17046 goto nla_put_failure; 17047 17048 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 17049 NL80211_ATTR_PAD)) 17050 goto nla_put_failure; 17051 17052 func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC); 17053 if (!func_attr) 17054 goto nla_put_failure; 17055 17056 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, inst_id) || 17057 nla_put_u8(msg, NL80211_NAN_FUNC_TERM_REASON, reason)) 17058 goto nla_put_failure; 17059 17060 nla_nest_end(msg, func_attr); 17061 genlmsg_end(msg, hdr); 17062 17063 if (!wdev->owner_nlportid) 17064 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 17065 msg, 0, NL80211_MCGRP_NAN, gfp); 17066 else 17067 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 17068 wdev->owner_nlportid); 17069 17070 return; 17071 17072 nla_put_failure: 17073 nlmsg_free(msg); 17074 } 17075 EXPORT_SYMBOL(cfg80211_nan_func_terminated); 17076 17077 void cfg80211_nan_sched_update_done(struct wireless_dev *wdev, bool success, 17078 gfp_t gfp) 17079 { 17080 struct wiphy *wiphy = wdev->wiphy; 17081 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 17082 struct sk_buff *msg; 17083 void *hdr; 17084 17085 trace_cfg80211_nan_sched_update_done(wiphy, wdev, success); 17086 17087 /* Can happen if we stopped NAN */ 17088 if (!wdev->u.nan.sched_update_pending) 17089 return; 17090 17091 wdev->u.nan.sched_update_pending = false; 17092 17093 if (!wdev->owner_nlportid) 17094 return; 17095 17096 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 17097 if (!msg) 17098 return; 17099 17100 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_SCHED_UPDATE_DONE); 17101 if (!hdr) 17102 goto nla_put_failure; 17103 17104 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17105 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 17106 NL80211_ATTR_PAD) || 17107 (success && 17108 nla_put_flag(msg, NL80211_ATTR_NAN_SCHED_UPDATE_SUCCESS))) 17109 goto nla_put_failure; 17110 17111 genlmsg_end(msg, hdr); 17112 17113 genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid); 17114 17115 return; 17116 17117 nla_put_failure: 17118 nlmsg_free(msg); 17119 } 17120 EXPORT_SYMBOL(cfg80211_nan_sched_update_done); 17121 17122 static int nl80211_parse_nan_channel(struct cfg80211_registered_device *rdev, 17123 struct nlattr *channel, 17124 struct genl_info *info, 17125 struct cfg80211_nan_channel *nan_channels, 17126 u8 index, bool local) 17127 { 17128 struct nlattr **channel_parsed __free(kfree) = NULL; 17129 struct cfg80211_chan_def chandef; 17130 u8 n_rx_nss; 17131 int ret; 17132 17133 channel_parsed = kcalloc(NL80211_ATTR_MAX + 1, sizeof(*channel_parsed), 17134 GFP_KERNEL); 17135 if (!channel_parsed) 17136 return -ENOMEM; 17137 17138 ret = nla_parse_nested(channel_parsed, NL80211_ATTR_MAX, channel, NULL, 17139 info->extack); 17140 if (ret) 17141 return ret; 17142 17143 ret = nl80211_parse_chandef(rdev, info->extack, channel_parsed, 17144 &chandef, false); 17145 if (ret) 17146 return ret; 17147 17148 if (chandef.chan->band == NL80211_BAND_6GHZ) { 17149 NL_SET_ERR_MSG(info->extack, 17150 "6 GHz band is not supported"); 17151 return -EOPNOTSUPP; 17152 } 17153 17154 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &chandef, 17155 NL80211_IFTYPE_NAN)) { 17156 NL_SET_ERR_MSG_ATTR(info->extack, channel, 17157 "Channel in NAN schedule is not allowed for NAN operation"); 17158 return -EINVAL; 17159 } 17160 17161 if (local) { 17162 for (int i = 0; i < index; i++) { 17163 if (cfg80211_chandef_compatible(&nan_channels[i].chandef, 17164 &chandef)) { 17165 NL_SET_ERR_MSG_ATTR(info->extack, channel, 17166 "Channels in NAN schedule must be mutually incompatible"); 17167 return -EINVAL; 17168 } 17169 } 17170 } 17171 17172 if (!channel_parsed[NL80211_ATTR_NAN_CHANNEL_ENTRY]) { 17173 NL_SET_ERR_MSG(info->extack, 17174 "Missing NAN channel entry attribute"); 17175 return -EINVAL; 17176 } 17177 17178 nan_channels[index].channel_entry = 17179 nla_data(channel_parsed[NL80211_ATTR_NAN_CHANNEL_ENTRY]); 17180 17181 if (!channel_parsed[NL80211_ATTR_NAN_RX_NSS]) { 17182 NL_SET_ERR_MSG(info->extack, 17183 "Missing NAN RX NSS attribute"); 17184 return -EINVAL; 17185 } 17186 17187 nan_channels[index].rx_nss = 17188 nla_get_u8(channel_parsed[NL80211_ATTR_NAN_RX_NSS]); 17189 17190 n_rx_nss = u8_get_bits(rdev->wiphy.nan_capa.n_antennas, 0x03); 17191 if ((local && nan_channels[index].rx_nss > n_rx_nss) || 17192 !nan_channels[index].rx_nss) { 17193 NL_SET_ERR_MSG_ATTR(info->extack, channel, 17194 "Invalid RX NSS in NAN channel definition"); 17195 return -EINVAL; 17196 } 17197 17198 nan_channels[index].chandef = chandef; 17199 17200 return 0; 17201 } 17202 17203 static int 17204 nl80211_parse_nan_schedule(struct genl_info *info, struct nlattr *slots_attr, 17205 u8 schedule[CFG80211_NAN_SCHED_NUM_TIME_SLOTS], 17206 u8 n_channels) 17207 { 17208 if (WARN_ON(nla_len(slots_attr) != CFG80211_NAN_SCHED_NUM_TIME_SLOTS)) 17209 return -EINVAL; 17210 17211 memcpy(schedule, nla_data(slots_attr), nla_len(slots_attr)); 17212 17213 for (int slot = 0; slot < CFG80211_NAN_SCHED_NUM_TIME_SLOTS; slot++) { 17214 if (schedule[slot] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT && 17215 schedule[slot] >= n_channels) { 17216 NL_SET_ERR_MSG_FMT(info->extack, 17217 "Invalid time slot: slot %d refers to channel index %d, n_channels=%d", 17218 slot, schedule[slot], n_channels); 17219 return -EINVAL; 17220 } 17221 } 17222 17223 return 0; 17224 } 17225 17226 static int 17227 nl80211_parse_nan_peer_map(struct genl_info *info, struct nlattr *map_attr, 17228 struct cfg80211_nan_peer_map *map, u8 n_channels) 17229 { 17230 struct nlattr *tb[NL80211_NAN_PEER_MAP_ATTR_MAX + 1]; 17231 int ret; 17232 17233 ret = nla_parse_nested(tb, NL80211_NAN_PEER_MAP_ATTR_MAX, map_attr, 17234 nl80211_nan_peer_map_policy, info->extack); 17235 if (ret) 17236 return ret; 17237 17238 if (!tb[NL80211_NAN_PEER_MAP_ATTR_MAP_ID] || 17239 !tb[NL80211_NAN_PEER_MAP_ATTR_TIME_SLOTS]) { 17240 NL_SET_ERR_MSG(info->extack, 17241 "Missing required peer map attributes"); 17242 return -EINVAL; 17243 } 17244 17245 map->map_id = nla_get_u8(tb[NL80211_NAN_PEER_MAP_ATTR_MAP_ID]); 17246 17247 /* Parse schedule */ 17248 return nl80211_parse_nan_schedule(info, 17249 tb[NL80211_NAN_PEER_MAP_ATTR_TIME_SLOTS], 17250 map->schedule, n_channels); 17251 } 17252 17253 static int nl80211_nan_validate_map_pair(struct wiphy *wiphy, 17254 struct genl_info *info, 17255 const struct cfg80211_nan_peer_map *map1, 17256 const struct cfg80211_nan_peer_map *map2, 17257 struct cfg80211_nan_channel *nan_channels) 17258 { 17259 /* Check for duplicate map_id */ 17260 if (map1->map_id == map2->map_id) { 17261 NL_SET_ERR_MSG_FMT(info->extack, "Duplicate map_id %u", 17262 map1->map_id); 17263 return -EINVAL; 17264 } 17265 17266 /* Check for compatible channels between maps */ 17267 for (int i = 0; i < ARRAY_SIZE(map1->schedule); i++) { 17268 if (map1->schedule[i] == NL80211_NAN_SCHED_NOT_AVAIL_SLOT) 17269 continue; 17270 17271 for (int j = 0; j < ARRAY_SIZE(map2->schedule); j++) { 17272 u8 ch1 = map1->schedule[i]; 17273 u8 ch2 = map2->schedule[j]; 17274 17275 if (ch2 == NL80211_NAN_SCHED_NOT_AVAIL_SLOT) 17276 continue; 17277 17278 if (cfg80211_chandef_compatible(&nan_channels[ch1].chandef, 17279 &nan_channels[ch2].chandef)) { 17280 NL_SET_ERR_MSG_FMT(info->extack, 17281 "Maps %u and %u have compatible channels %d and %d", 17282 map1->map_id, map2->map_id, 17283 ch1, ch2); 17284 return -EINVAL; 17285 } 17286 } 17287 } 17288 17289 /* 17290 * Check for conflicting time slots between maps. 17291 * Only check for single-radio devices (n_radio <= 1) which cannot 17292 * operate on multiple channels simultaneously. 17293 */ 17294 if (wiphy->n_radio > 1) 17295 return 0; 17296 17297 for (int i = 0; i < ARRAY_SIZE(map1->schedule); i++) { 17298 if (map1->schedule[i] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT && 17299 map2->schedule[i] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT) { 17300 NL_SET_ERR_MSG_FMT(info->extack, 17301 "Maps %u and %u both schedule slot %d", 17302 map1->map_id, map2->map_id, i); 17303 return -EINVAL; 17304 } 17305 } 17306 17307 return 0; 17308 } 17309 17310 static int nl80211_nan_set_peer_sched(struct sk_buff *skb, 17311 struct genl_info *info) 17312 { 17313 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17314 struct cfg80211_nan_channel *nan_channels __free(kfree) = NULL; 17315 struct cfg80211_nan_peer_sched sched = {}; 17316 struct wireless_dev *wdev = info->user_ptr[1]; 17317 struct nlattr *map_attr, *channel; 17318 int ret, n_maps = 0, n_channels = 0, i = 0, rem; 17319 17320 if (wdev->iftype != NL80211_IFTYPE_NAN) 17321 return -EOPNOTSUPP; 17322 17323 if (!info->attrs[NL80211_ATTR_MAC] || 17324 !info->attrs[NL80211_ATTR_NAN_COMMITTED_DW]) { 17325 NL_SET_ERR_MSG(info->extack, 17326 "Required NAN peer schedule attributes are missing"); 17327 return -EINVAL; 17328 } 17329 17330 /* First count how many channel attributes we got */ 17331 nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL, 17332 info->nlhdr, GENL_HDRLEN, rem) 17333 n_channels++; 17334 17335 if (!((info->attrs[NL80211_ATTR_NAN_SEQ_ID] && 17336 info->attrs[NL80211_ATTR_NAN_PEER_MAPS] && n_channels) || 17337 ((!info->attrs[NL80211_ATTR_NAN_SEQ_ID] && 17338 !info->attrs[NL80211_ATTR_NAN_PEER_MAPS] && !n_channels)))) { 17339 NL_SET_ERR_MSG(info->extack, 17340 "Either provide all of: seq id, channels and maps, or none"); 17341 return -EINVAL; 17342 } 17343 17344 /* 17345 * Limit the number of peer channels to: 17346 * local_channels * 4 (possible BWs) * 2 (possible NSS values) 17347 */ 17348 if (n_channels && n_channels > wdev->u.nan.n_channels * 4 * 2) { 17349 NL_SET_ERR_MSG_FMT(info->extack, 17350 "Too many peer channels: %d (max %d)", 17351 n_channels, 17352 wdev->u.nan.n_channels * 4 * 2); 17353 return -EINVAL; 17354 } 17355 17356 if (n_channels) { 17357 nan_channels = kcalloc(n_channels, sizeof(*nan_channels), 17358 GFP_KERNEL); 17359 if (!nan_channels) 17360 return -ENOMEM; 17361 } 17362 17363 /* Parse peer channels */ 17364 nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL, 17365 info->nlhdr, GENL_HDRLEN, rem) { 17366 bool compatible = false; 17367 17368 ret = nl80211_parse_nan_channel(rdev, channel, info, 17369 nan_channels, i, false); 17370 if (ret) 17371 return ret; 17372 17373 /* Verify channel is compatible with at least one local channel */ 17374 for (int j = 0; j < wdev->u.nan.n_channels; j++) { 17375 if (cfg80211_chandef_compatible(&nan_channels[i].chandef, 17376 &wdev->u.nan.chandefs[j])) { 17377 compatible = true; 17378 break; 17379 } 17380 } 17381 if (!compatible) { 17382 NL_SET_ERR_MSG_FMT(info->extack, 17383 "Channel %d not compatible with any local channel", 17384 i); 17385 return -EINVAL; 17386 } 17387 i++; 17388 } 17389 17390 sched.n_channels = n_channels; 17391 sched.nan_channels = nan_channels; 17392 sched.peer_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 17393 sched.seq_id = nla_get_u8_default(info->attrs[NL80211_ATTR_NAN_SEQ_ID], 0); 17394 sched.committed_dw = nla_get_u16(info->attrs[NL80211_ATTR_NAN_COMMITTED_DW]); 17395 sched.max_chan_switch = 17396 nla_get_u16_default(info->attrs[NL80211_ATTR_NAN_MAX_CHAN_SWITCH_TIME], 0); 17397 17398 if (info->attrs[NL80211_ATTR_NAN_ULW]) { 17399 sched.ulw_size = nla_len(info->attrs[NL80211_ATTR_NAN_ULW]); 17400 sched.init_ulw = nla_data(info->attrs[NL80211_ATTR_NAN_ULW]); 17401 } 17402 17403 /* Initialize all maps as invalid */ 17404 for (int j = 0; j < ARRAY_SIZE(sched.maps); j++) 17405 sched.maps[j].map_id = CFG80211_NAN_INVALID_MAP_ID; 17406 17407 if (info->attrs[NL80211_ATTR_NAN_PEER_MAPS]) { 17408 /* Parse each map */ 17409 nla_for_each_nested(map_attr, info->attrs[NL80211_ATTR_NAN_PEER_MAPS], 17410 rem) { 17411 if (n_maps >= ARRAY_SIZE(sched.maps)) { 17412 NL_SET_ERR_MSG(info->extack, "Too many peer maps"); 17413 return -EINVAL; 17414 } 17415 17416 ret = nl80211_parse_nan_peer_map(info, map_attr, 17417 &sched.maps[n_maps], 17418 n_channels); 17419 if (ret) 17420 return ret; 17421 17422 /* Validate against previous maps */ 17423 for (int j = 0; j < n_maps; j++) { 17424 ret = nl80211_nan_validate_map_pair(&rdev->wiphy, info, 17425 &sched.maps[j], 17426 &sched.maps[n_maps], 17427 nan_channels); 17428 if (ret) 17429 return ret; 17430 } 17431 17432 n_maps++; 17433 } 17434 } 17435 17436 /* Verify each channel is scheduled at least once */ 17437 for (int ch = 0; ch < n_channels; ch++) { 17438 bool scheduled = false; 17439 17440 for (int m = 0; m < n_maps && !scheduled; m++) { 17441 for (int s = 0; s < ARRAY_SIZE(sched.maps[m].schedule); s++) { 17442 if (sched.maps[m].schedule[s] == ch) { 17443 scheduled = true; 17444 break; 17445 } 17446 } 17447 } 17448 if (!scheduled) { 17449 NL_SET_ERR_MSG_FMT(info->extack, 17450 "Channel %d is not scheduled in any map", 17451 ch); 17452 return -EINVAL; 17453 } 17454 } 17455 17456 return rdev_nan_set_peer_sched(rdev, wdev, &sched); 17457 } 17458 17459 static bool nl80211_nan_is_sched_empty(struct cfg80211_nan_local_sched *sched) 17460 { 17461 if (!sched->n_channels) 17462 return true; 17463 17464 for (int i = 0; i < ARRAY_SIZE(sched->schedule); i++) { 17465 if (sched->schedule[i] != NL80211_NAN_SCHED_NOT_AVAIL_SLOT) 17466 return false; 17467 } 17468 17469 return true; 17470 } 17471 17472 static int nl80211_nan_set_local_sched(struct sk_buff *skb, 17473 struct genl_info *info) 17474 { 17475 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17476 struct cfg80211_nan_local_sched *sched __free(kfree) = NULL; 17477 struct wireless_dev *wdev = info->user_ptr[1]; 17478 int rem, i = 0, n_channels = 0, ret; 17479 struct nlattr *channel; 17480 bool sched_empty; 17481 17482 if (wdev->iftype != NL80211_IFTYPE_NAN) 17483 return -EOPNOTSUPP; 17484 17485 if (!wdev_running(wdev)) 17486 return -ENOTCONN; 17487 17488 if (!info->attrs[NL80211_ATTR_NAN_TIME_SLOTS]) 17489 return -EINVAL; 17490 17491 /* First count how many channel attributes we got */ 17492 nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL, 17493 info->nlhdr, GENL_HDRLEN, rem) 17494 n_channels++; 17495 17496 sched = kzalloc(struct_size(sched, nan_channels, n_channels), 17497 GFP_KERNEL); 17498 if (!sched) 17499 return -ENOMEM; 17500 17501 sched->n_channels = n_channels; 17502 17503 nlmsg_for_each_attr_type(channel, NL80211_ATTR_NAN_CHANNEL, 17504 info->nlhdr, GENL_HDRLEN, rem) { 17505 ret = nl80211_parse_nan_channel(rdev, channel, info, 17506 sched->nan_channels, i, true); 17507 17508 if (ret) 17509 return ret; 17510 i++; 17511 } 17512 17513 /* Parse and validate schedule */ 17514 ret = nl80211_parse_nan_schedule(info, 17515 info->attrs[NL80211_ATTR_NAN_TIME_SLOTS], 17516 sched->schedule, sched->n_channels); 17517 if (ret) 17518 return ret; 17519 17520 sched_empty = nl80211_nan_is_sched_empty(sched); 17521 17522 sched->deferred = 17523 nla_get_flag(info->attrs[NL80211_ATTR_NAN_SCHED_DEFERRED]); 17524 17525 if (sched_empty) { 17526 if (sched->deferred) { 17527 NL_SET_ERR_MSG(info->extack, 17528 "Schedule cannot be deferred if all time slots are unavailable"); 17529 return -EINVAL; 17530 } 17531 17532 if (info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]) { 17533 NL_SET_ERR_MSG(info->extack, 17534 "NAN Availability blob must be empty if all time slots are unavailable"); 17535 return -EINVAL; 17536 } 17537 } else { 17538 if (!info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]) { 17539 NL_SET_ERR_MSG(info->extack, 17540 "NAN Availability blob attribute is required"); 17541 return -EINVAL; 17542 } 17543 17544 sched->nan_avail_blob = 17545 nla_data(info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]); 17546 sched->nan_avail_blob_len = 17547 nla_len(info->attrs[NL80211_ATTR_NAN_AVAIL_BLOB]); 17548 } 17549 17550 return cfg80211_nan_set_local_schedule(rdev, wdev, sched); 17551 } 17552 17553 static int nl80211_get_protocol_features(struct sk_buff *skb, 17554 struct genl_info *info) 17555 { 17556 void *hdr; 17557 struct sk_buff *msg; 17558 17559 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 17560 if (!msg) 17561 return -ENOMEM; 17562 17563 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 17564 NL80211_CMD_GET_PROTOCOL_FEATURES); 17565 if (!hdr) 17566 goto nla_put_failure; 17567 17568 if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES, 17569 NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP)) 17570 goto nla_put_failure; 17571 17572 genlmsg_end(msg, hdr); 17573 return genlmsg_reply(msg, info); 17574 17575 nla_put_failure: 17576 kfree_skb(msg); 17577 return -ENOBUFS; 17578 } 17579 17580 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info) 17581 { 17582 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17583 struct cfg80211_update_ft_ies_params ft_params; 17584 struct net_device *dev = info->user_ptr[1]; 17585 17586 if (!rdev->ops->update_ft_ies) 17587 return -EOPNOTSUPP; 17588 17589 if (!info->attrs[NL80211_ATTR_MDID] || 17590 !info->attrs[NL80211_ATTR_IE]) 17591 return -EINVAL; 17592 17593 memset(&ft_params, 0, sizeof(ft_params)); 17594 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); 17595 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 17596 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 17597 17598 return rdev_update_ft_ies(rdev, dev, &ft_params); 17599 } 17600 17601 static int nl80211_crit_protocol_start(struct sk_buff *skb, 17602 struct genl_info *info) 17603 { 17604 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17605 struct wireless_dev *wdev = info->user_ptr[1]; 17606 enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC; 17607 u16 duration; 17608 int ret; 17609 17610 if (!rdev->ops->crit_proto_start) 17611 return -EOPNOTSUPP; 17612 17613 if (WARN_ON(!rdev->ops->crit_proto_stop)) 17614 return -EINVAL; 17615 17616 if (rdev->crit_proto_nlportid) 17617 return -EBUSY; 17618 17619 /* determine protocol if provided */ 17620 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) 17621 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); 17622 17623 if (proto >= NUM_NL80211_CRIT_PROTO) 17624 return -EINVAL; 17625 17626 /* timeout must be provided */ 17627 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) 17628 return -EINVAL; 17629 17630 duration = 17631 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); 17632 17633 ret = rdev_crit_proto_start(rdev, wdev, proto, duration); 17634 if (!ret) 17635 rdev->crit_proto_nlportid = info->snd_portid; 17636 17637 return ret; 17638 } 17639 17640 static int nl80211_crit_protocol_stop(struct sk_buff *skb, 17641 struct genl_info *info) 17642 { 17643 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17644 struct wireless_dev *wdev = info->user_ptr[1]; 17645 17646 if (!rdev->ops->crit_proto_stop) 17647 return -EOPNOTSUPP; 17648 17649 if (rdev->crit_proto_nlportid) { 17650 rdev->crit_proto_nlportid = 0; 17651 rdev_crit_proto_stop(rdev, wdev); 17652 } 17653 return 0; 17654 } 17655 17656 static int nl80211_vendor_check_policy(const struct wiphy_vendor_command *vcmd, 17657 struct nlattr *attr, 17658 struct netlink_ext_ack *extack) 17659 { 17660 if (vcmd->policy == VENDOR_CMD_RAW_DATA) { 17661 if (attr->nla_type & NLA_F_NESTED) { 17662 NL_SET_ERR_MSG_ATTR(extack, attr, 17663 "unexpected nested data"); 17664 return -EINVAL; 17665 } 17666 17667 return 0; 17668 } 17669 17670 if (!(attr->nla_type & NLA_F_NESTED)) { 17671 NL_SET_ERR_MSG_ATTR(extack, attr, "expected nested data"); 17672 return -EINVAL; 17673 } 17674 17675 return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack); 17676 } 17677 17678 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info) 17679 { 17680 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 17681 struct wireless_dev *wdev = 17682 __cfg80211_wdev_from_attrs(rdev, genl_info_net(info), 17683 info->attrs); 17684 int i, err; 17685 u32 vid, subcmd; 17686 17687 if (!rdev->wiphy.vendor_commands) 17688 return -EOPNOTSUPP; 17689 17690 if (IS_ERR(wdev)) { 17691 err = PTR_ERR(wdev); 17692 if (err != -EINVAL) 17693 return err; 17694 wdev = NULL; 17695 } else if (wdev->wiphy != &rdev->wiphy) { 17696 return -EINVAL; 17697 } 17698 17699 if (!info->attrs[NL80211_ATTR_VENDOR_ID] || 17700 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD]) 17701 return -EINVAL; 17702 17703 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]); 17704 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]); 17705 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { 17706 const struct wiphy_vendor_command *vcmd; 17707 void *data = NULL; 17708 int len = 0; 17709 17710 vcmd = &rdev->wiphy.vendor_commands[i]; 17711 17712 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) 17713 continue; 17714 17715 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | 17716 WIPHY_VENDOR_CMD_NEED_NETDEV)) { 17717 if (!wdev) 17718 return -EINVAL; 17719 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && 17720 !wdev->netdev) 17721 return -EINVAL; 17722 17723 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { 17724 if (!wdev_running(wdev)) 17725 return -ENETDOWN; 17726 } 17727 } else { 17728 wdev = NULL; 17729 } 17730 17731 if (!vcmd->doit) 17732 return -EOPNOTSUPP; 17733 17734 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { 17735 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); 17736 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); 17737 17738 err = nl80211_vendor_check_policy(vcmd, 17739 info->attrs[NL80211_ATTR_VENDOR_DATA], 17740 info->extack); 17741 if (err) 17742 return err; 17743 } 17744 17745 rdev->cur_cmd_info = info; 17746 err = vcmd->doit(&rdev->wiphy, wdev, data, len); 17747 rdev->cur_cmd_info = NULL; 17748 return err; 17749 } 17750 17751 return -EOPNOTSUPP; 17752 } 17753 17754 static int nl80211_prepare_vendor_dump(struct sk_buff *skb, 17755 struct netlink_callback *cb, 17756 struct cfg80211_registered_device **rdev, 17757 struct wireless_dev **wdev) 17758 { 17759 struct nlattr **attrbuf; 17760 u32 vid, subcmd; 17761 unsigned int i; 17762 int vcmd_idx = -1; 17763 int err; 17764 void *data = NULL; 17765 unsigned int data_len = 0; 17766 17767 if (cb->args[0]) { 17768 /* subtract the 1 again here */ 17769 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); 17770 struct wireless_dev *tmp; 17771 17772 if (!wiphy) 17773 return -ENODEV; 17774 *rdev = wiphy_to_rdev(wiphy); 17775 *wdev = NULL; 17776 17777 if (cb->args[1]) { 17778 list_for_each_entry(tmp, &wiphy->wdev_list, list) { 17779 if (tmp->identifier == cb->args[1] - 1) { 17780 *wdev = tmp; 17781 break; 17782 } 17783 } 17784 } 17785 17786 /* keep rtnl locked in successful case */ 17787 return 0; 17788 } 17789 17790 attrbuf = kzalloc_objs(*attrbuf, NUM_NL80211_ATTR); 17791 if (!attrbuf) 17792 return -ENOMEM; 17793 17794 err = nlmsg_parse_deprecated(cb->nlh, 17795 GENL_HDRLEN + nl80211_fam.hdrsize, 17796 attrbuf, nl80211_fam.maxattr, 17797 nl80211_policy, NULL); 17798 if (err) 17799 goto out; 17800 17801 if (!attrbuf[NL80211_ATTR_VENDOR_ID] || 17802 !attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) { 17803 err = -EINVAL; 17804 goto out; 17805 } 17806 17807 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(skb->sk), attrbuf); 17808 if (IS_ERR(*wdev)) 17809 *wdev = NULL; 17810 17811 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); 17812 if (IS_ERR(*rdev)) { 17813 err = PTR_ERR(*rdev); 17814 goto out; 17815 } 17816 17817 vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]); 17818 subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]); 17819 17820 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { 17821 const struct wiphy_vendor_command *vcmd; 17822 17823 vcmd = &(*rdev)->wiphy.vendor_commands[i]; 17824 17825 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) 17826 continue; 17827 17828 if (!vcmd->dumpit) { 17829 err = -EOPNOTSUPP; 17830 goto out; 17831 } 17832 17833 vcmd_idx = i; 17834 break; 17835 } 17836 17837 if (vcmd_idx < 0) { 17838 err = -EOPNOTSUPP; 17839 goto out; 17840 } 17841 17842 if (attrbuf[NL80211_ATTR_VENDOR_DATA]) { 17843 data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]); 17844 data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]); 17845 17846 err = nl80211_vendor_check_policy( 17847 &(*rdev)->wiphy.vendor_commands[vcmd_idx], 17848 attrbuf[NL80211_ATTR_VENDOR_DATA], 17849 cb->extack); 17850 if (err) 17851 goto out; 17852 } 17853 17854 /* 0 is the first index - add 1 to parse only once */ 17855 cb->args[0] = (*rdev)->wiphy_idx + 1; 17856 /* add 1 to know if it was NULL */ 17857 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0; 17858 cb->args[2] = vcmd_idx; 17859 cb->args[3] = (unsigned long)data; 17860 cb->args[4] = data_len; 17861 17862 /* keep rtnl locked in successful case */ 17863 err = 0; 17864 out: 17865 kfree(attrbuf); 17866 return err; 17867 } 17868 17869 static int nl80211_vendor_cmd_dump(struct sk_buff *skb, 17870 struct netlink_callback *cb) 17871 { 17872 struct cfg80211_registered_device *rdev; 17873 struct wireless_dev *wdev; 17874 unsigned int vcmd_idx; 17875 const struct wiphy_vendor_command *vcmd; 17876 void *data; 17877 int data_len; 17878 int err; 17879 struct nlattr *vendor_data; 17880 17881 rtnl_lock(); 17882 err = nl80211_prepare_vendor_dump(skb, cb, &rdev, &wdev); 17883 if (err) 17884 goto out; 17885 17886 vcmd_idx = cb->args[2]; 17887 data = (void *)cb->args[3]; 17888 data_len = cb->args[4]; 17889 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx]; 17890 17891 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | 17892 WIPHY_VENDOR_CMD_NEED_NETDEV)) { 17893 if (!wdev) { 17894 err = -EINVAL; 17895 goto out; 17896 } 17897 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && 17898 !wdev->netdev) { 17899 err = -EINVAL; 17900 goto out; 17901 } 17902 17903 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { 17904 if (!wdev_running(wdev)) { 17905 err = -ENETDOWN; 17906 goto out; 17907 } 17908 } 17909 } 17910 17911 while (1) { 17912 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 17913 cb->nlh->nlmsg_seq, NLM_F_MULTI, 17914 NL80211_CMD_VENDOR); 17915 if (!hdr) 17916 break; 17917 17918 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17919 (wdev && nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 17920 wdev_id(wdev), 17921 NL80211_ATTR_PAD))) { 17922 genlmsg_cancel(skb, hdr); 17923 break; 17924 } 17925 17926 vendor_data = nla_nest_start_noflag(skb, 17927 NL80211_ATTR_VENDOR_DATA); 17928 if (!vendor_data) { 17929 genlmsg_cancel(skb, hdr); 17930 break; 17931 } 17932 17933 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len, 17934 (unsigned long *)&cb->args[5]); 17935 nla_nest_end(skb, vendor_data); 17936 17937 if (err == -ENOBUFS || err == -ENOENT) { 17938 genlmsg_cancel(skb, hdr); 17939 break; 17940 } else if (err <= 0) { 17941 genlmsg_cancel(skb, hdr); 17942 goto out; 17943 } 17944 17945 genlmsg_end(skb, hdr); 17946 } 17947 17948 err = skb->len; 17949 out: 17950 rtnl_unlock(); 17951 return err; 17952 } 17953 17954 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy, 17955 enum nl80211_commands cmd, 17956 enum nl80211_attrs attr, 17957 int approxlen) 17958 { 17959 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 17960 17961 if (WARN_ON(!rdev->cur_cmd_info)) 17962 return NULL; 17963 17964 return __cfg80211_alloc_vendor_skb(rdev, NULL, approxlen, 17965 rdev->cur_cmd_info->snd_portid, 17966 rdev->cur_cmd_info->snd_seq, 17967 cmd, attr, NULL, GFP_KERNEL); 17968 } 17969 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb); 17970 17971 int cfg80211_vendor_cmd_reply(struct sk_buff *skb) 17972 { 17973 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 17974 void *hdr = ((void **)skb->cb)[1]; 17975 struct nlattr *data = ((void **)skb->cb)[2]; 17976 17977 /* clear CB data for netlink core to own from now on */ 17978 memset(skb->cb, 0, sizeof(skb->cb)); 17979 17980 if (WARN_ON(!rdev->cur_cmd_info)) { 17981 kfree_skb(skb); 17982 return -EINVAL; 17983 } 17984 17985 nla_nest_end(skb, data); 17986 genlmsg_end(skb, hdr); 17987 return genlmsg_reply(skb, rdev->cur_cmd_info); 17988 } 17989 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply); 17990 17991 unsigned int cfg80211_vendor_cmd_get_sender(struct wiphy *wiphy) 17992 { 17993 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 17994 17995 if (WARN_ON(!rdev->cur_cmd_info)) 17996 return 0; 17997 17998 return rdev->cur_cmd_info->snd_portid; 17999 } 18000 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_get_sender); 18001 18002 static int nl80211_set_qos_map(struct sk_buff *skb, 18003 struct genl_info *info) 18004 { 18005 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18006 struct cfg80211_qos_map *qos_map = NULL; 18007 struct net_device *dev = info->user_ptr[1]; 18008 u8 *pos, len, num_des, des_len, des; 18009 int ret; 18010 18011 if (!rdev->ops->set_qos_map) 18012 return -EOPNOTSUPP; 18013 18014 if (info->attrs[NL80211_ATTR_QOS_MAP]) { 18015 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]); 18016 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]); 18017 18018 if (len % 2) 18019 return -EINVAL; 18020 18021 qos_map = kzalloc_obj(struct cfg80211_qos_map); 18022 if (!qos_map) 18023 return -ENOMEM; 18024 18025 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1; 18026 if (num_des) { 18027 des_len = num_des * 18028 sizeof(struct cfg80211_dscp_exception); 18029 memcpy(qos_map->dscp_exception, pos, des_len); 18030 qos_map->num_des = num_des; 18031 for (des = 0; des < num_des; des++) { 18032 if (qos_map->dscp_exception[des].up > 7) { 18033 kfree(qos_map); 18034 return -EINVAL; 18035 } 18036 } 18037 pos += des_len; 18038 } 18039 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN); 18040 } 18041 18042 ret = nl80211_key_allowed(dev->ieee80211_ptr); 18043 if (!ret) 18044 ret = rdev_set_qos_map(rdev, dev, qos_map); 18045 18046 kfree(qos_map); 18047 return ret; 18048 } 18049 18050 static int nl80211_add_tx_ts(struct sk_buff *skb, struct genl_info *info) 18051 { 18052 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18053 struct net_device *dev = info->user_ptr[1]; 18054 struct wireless_dev *wdev = dev->ieee80211_ptr; 18055 const u8 *peer; 18056 u8 tsid, up; 18057 u16 admitted_time = 0; 18058 18059 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)) 18060 return -EOPNOTSUPP; 18061 18062 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] || 18063 !info->attrs[NL80211_ATTR_USER_PRIO]) 18064 return -EINVAL; 18065 18066 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); 18067 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]); 18068 18069 /* WMM uses TIDs 0-7 even for TSPEC */ 18070 if (tsid >= IEEE80211_FIRST_TSPEC_TSID) { 18071 /* TODO: handle 802.11 TSPEC/admission control 18072 * need more attributes for that (e.g. BA session requirement); 18073 * change the WMM admission test above to allow both then 18074 */ 18075 return -EINVAL; 18076 } 18077 18078 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 18079 18080 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) { 18081 admitted_time = 18082 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]); 18083 if (!admitted_time) 18084 return -EINVAL; 18085 } 18086 18087 switch (wdev->iftype) { 18088 case NL80211_IFTYPE_STATION: 18089 case NL80211_IFTYPE_P2P_CLIENT: 18090 if (wdev->connected) 18091 break; 18092 return -ENOTCONN; 18093 default: 18094 return -EOPNOTSUPP; 18095 } 18096 18097 return rdev_add_tx_ts(rdev, dev, tsid, peer, up, admitted_time); 18098 } 18099 18100 static int nl80211_del_tx_ts(struct sk_buff *skb, struct genl_info *info) 18101 { 18102 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18103 struct net_device *dev = info->user_ptr[1]; 18104 const u8 *peer; 18105 u8 tsid; 18106 18107 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC]) 18108 return -EINVAL; 18109 18110 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); 18111 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 18112 18113 return rdev_del_tx_ts(rdev, dev, tsid, peer); 18114 } 18115 18116 static int nl80211_tdls_channel_switch(struct sk_buff *skb, 18117 struct genl_info *info) 18118 { 18119 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18120 struct net_device *dev = info->user_ptr[1]; 18121 struct wireless_dev *wdev = dev->ieee80211_ptr; 18122 struct cfg80211_chan_def chandef = {}; 18123 const u8 *addr; 18124 u8 oper_class; 18125 int err; 18126 18127 if (!rdev->ops->tdls_channel_switch || 18128 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) 18129 return -EOPNOTSUPP; 18130 18131 switch (dev->ieee80211_ptr->iftype) { 18132 case NL80211_IFTYPE_STATION: 18133 case NL80211_IFTYPE_P2P_CLIENT: 18134 break; 18135 default: 18136 return -EOPNOTSUPP; 18137 } 18138 18139 if (!info->attrs[NL80211_ATTR_MAC] || 18140 !info->attrs[NL80211_ATTR_OPER_CLASS]) 18141 return -EINVAL; 18142 18143 err = nl80211_parse_chandef(rdev, info->extack, info->attrs, &chandef, 18144 false); 18145 if (err) 18146 return err; 18147 18148 /* 18149 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012 18150 * section 10.22.6.2.1. Disallow 5/10Mhz channels as well for now, the 18151 * specification is not defined for them. 18152 */ 18153 if (chandef.chan->band == NL80211_BAND_2GHZ && 18154 chandef.width != NL80211_CHAN_WIDTH_20_NOHT && 18155 chandef.width != NL80211_CHAN_WIDTH_20) 18156 return -EINVAL; 18157 18158 /* we will be active on the TDLS link */ 18159 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, 18160 wdev->iftype)) 18161 return -EINVAL; 18162 18163 /* don't allow switching to DFS channels */ 18164 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype)) 18165 return -EINVAL; 18166 18167 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 18168 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]); 18169 18170 return rdev_tdls_channel_switch(rdev, dev, addr, oper_class, &chandef); 18171 } 18172 18173 static int nl80211_tdls_cancel_channel_switch(struct sk_buff *skb, 18174 struct genl_info *info) 18175 { 18176 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18177 struct net_device *dev = info->user_ptr[1]; 18178 const u8 *addr; 18179 18180 if (!rdev->ops->tdls_channel_switch || 18181 !rdev->ops->tdls_cancel_channel_switch || 18182 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) 18183 return -EOPNOTSUPP; 18184 18185 switch (dev->ieee80211_ptr->iftype) { 18186 case NL80211_IFTYPE_STATION: 18187 case NL80211_IFTYPE_P2P_CLIENT: 18188 break; 18189 default: 18190 return -EOPNOTSUPP; 18191 } 18192 18193 if (!info->attrs[NL80211_ATTR_MAC]) 18194 return -EINVAL; 18195 18196 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 18197 18198 rdev_tdls_cancel_channel_switch(rdev, dev, addr); 18199 18200 return 0; 18201 } 18202 18203 static int nl80211_set_multicast_to_unicast(struct sk_buff *skb, 18204 struct genl_info *info) 18205 { 18206 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18207 struct net_device *dev = info->user_ptr[1]; 18208 struct wireless_dev *wdev = dev->ieee80211_ptr; 18209 const struct nlattr *nla; 18210 bool enabled; 18211 18212 if (!rdev->ops->set_multicast_to_unicast) 18213 return -EOPNOTSUPP; 18214 18215 if (wdev->iftype != NL80211_IFTYPE_AP && 18216 wdev->iftype != NL80211_IFTYPE_P2P_GO) 18217 return -EOPNOTSUPP; 18218 18219 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED]; 18220 enabled = nla_get_flag(nla); 18221 18222 return rdev_set_multicast_to_unicast(rdev, dev, enabled); 18223 } 18224 18225 static int nl80211_set_pmk(struct sk_buff *skb, struct genl_info *info) 18226 { 18227 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18228 struct net_device *dev = info->user_ptr[1]; 18229 struct wireless_dev *wdev = dev->ieee80211_ptr; 18230 struct cfg80211_pmk_conf pmk_conf = {}; 18231 18232 if (wdev->iftype != NL80211_IFTYPE_STATION && 18233 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 18234 return -EOPNOTSUPP; 18235 18236 if (!wiphy_ext_feature_isset(&rdev->wiphy, 18237 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 18238 return -EOPNOTSUPP; 18239 18240 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK]) 18241 return -EINVAL; 18242 18243 if (!wdev->connected) 18244 return -ENOTCONN; 18245 18246 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]); 18247 if (memcmp(pmk_conf.aa, wdev->u.client.connected_addr, ETH_ALEN)) 18248 return -EINVAL; 18249 18250 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); 18251 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); 18252 if (pmk_conf.pmk_len != WLAN_PMK_LEN && 18253 pmk_conf.pmk_len != WLAN_PMK_LEN_SUITE_B_192) 18254 return -EINVAL; 18255 18256 if (info->attrs[NL80211_ATTR_PMKR0_NAME]) 18257 pmk_conf.pmk_r0_name = 18258 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]); 18259 18260 return rdev_set_pmk(rdev, dev, &pmk_conf); 18261 } 18262 18263 static int nl80211_del_pmk(struct sk_buff *skb, struct genl_info *info) 18264 { 18265 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18266 struct net_device *dev = info->user_ptr[1]; 18267 struct wireless_dev *wdev = dev->ieee80211_ptr; 18268 const u8 *aa; 18269 18270 if (wdev->iftype != NL80211_IFTYPE_STATION && 18271 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 18272 return -EOPNOTSUPP; 18273 18274 if (!wiphy_ext_feature_isset(&rdev->wiphy, 18275 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 18276 return -EOPNOTSUPP; 18277 18278 if (!info->attrs[NL80211_ATTR_MAC]) 18279 return -EINVAL; 18280 18281 aa = nla_data(info->attrs[NL80211_ATTR_MAC]); 18282 return rdev_del_pmk(rdev, dev, aa); 18283 } 18284 18285 static int nl80211_external_auth(struct sk_buff *skb, struct genl_info *info) 18286 { 18287 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18288 struct net_device *dev = info->user_ptr[1]; 18289 struct cfg80211_external_auth_params params; 18290 18291 if (!rdev->ops->external_auth) 18292 return -EOPNOTSUPP; 18293 18294 if (!info->attrs[NL80211_ATTR_SSID] && 18295 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 18296 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 18297 return -EINVAL; 18298 18299 if (!info->attrs[NL80211_ATTR_BSSID]) 18300 return -EINVAL; 18301 18302 if (!info->attrs[NL80211_ATTR_STATUS_CODE]) 18303 return -EINVAL; 18304 18305 memset(¶ms, 0, sizeof(params)); 18306 18307 if (info->attrs[NL80211_ATTR_SSID]) { 18308 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 18309 if (params.ssid.ssid_len == 0) 18310 return -EINVAL; 18311 memcpy(params.ssid.ssid, 18312 nla_data(info->attrs[NL80211_ATTR_SSID]), 18313 params.ssid.ssid_len); 18314 } 18315 18316 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), 18317 ETH_ALEN); 18318 18319 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 18320 18321 if (info->attrs[NL80211_ATTR_PMKID]) 18322 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 18323 18324 return rdev_external_auth(rdev, dev, ¶ms); 18325 } 18326 18327 static int nl80211_tx_control_port(struct sk_buff *skb, struct genl_info *info) 18328 { 18329 bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK]; 18330 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18331 struct net_device *dev = info->user_ptr[1]; 18332 struct wireless_dev *wdev = dev->ieee80211_ptr; 18333 const u8 *buf; 18334 size_t len; 18335 u8 *dest; 18336 u16 proto; 18337 bool noencrypt; 18338 u64 cookie = 0; 18339 int link_id; 18340 int err; 18341 18342 if (!wiphy_ext_feature_isset(&rdev->wiphy, 18343 NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211)) 18344 return -EOPNOTSUPP; 18345 18346 if (!rdev->ops->tx_control_port) 18347 return -EOPNOTSUPP; 18348 18349 if (!info->attrs[NL80211_ATTR_FRAME] || 18350 !info->attrs[NL80211_ATTR_MAC] || 18351 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { 18352 GENL_SET_ERR_MSG(info, "Frame, MAC or ethertype missing"); 18353 return -EINVAL; 18354 } 18355 18356 switch (wdev->iftype) { 18357 case NL80211_IFTYPE_AP: 18358 case NL80211_IFTYPE_P2P_GO: 18359 case NL80211_IFTYPE_MESH_POINT: 18360 break; 18361 case NL80211_IFTYPE_ADHOC: 18362 if (wdev->u.ibss.current_bss) 18363 break; 18364 return -ENOTCONN; 18365 case NL80211_IFTYPE_STATION: 18366 case NL80211_IFTYPE_P2P_CLIENT: 18367 if (wdev->connected) 18368 break; 18369 return -ENOTCONN; 18370 default: 18371 return -EOPNOTSUPP; 18372 } 18373 18374 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 18375 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 18376 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); 18377 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); 18378 noencrypt = 18379 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]); 18380 18381 link_id = nl80211_link_id_or_invalid(info->attrs); 18382 18383 err = rdev_tx_control_port(rdev, dev, buf, len, 18384 dest, cpu_to_be16(proto), noencrypt, link_id, 18385 dont_wait_for_ack ? NULL : &cookie); 18386 if (!err && !dont_wait_for_ack) 18387 nl_set_extack_cookie_u64(info->extack, cookie); 18388 return err; 18389 } 18390 18391 static int nl80211_get_ftm_responder_stats(struct sk_buff *skb, 18392 struct genl_info *info) 18393 { 18394 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18395 struct net_device *dev = info->user_ptr[1]; 18396 struct wireless_dev *wdev = dev->ieee80211_ptr; 18397 struct cfg80211_ftm_responder_stats ftm_stats = {}; 18398 unsigned int link_id = nl80211_link_id(info->attrs); 18399 struct sk_buff *msg; 18400 void *hdr; 18401 struct nlattr *ftm_stats_attr; 18402 int err; 18403 18404 if (wdev->iftype != NL80211_IFTYPE_AP || 18405 !wdev->links[link_id].ap.beacon_interval) 18406 return -EOPNOTSUPP; 18407 18408 err = rdev_get_ftm_responder_stats(rdev, dev, &ftm_stats); 18409 if (err) 18410 return err; 18411 18412 if (!ftm_stats.filled) 18413 return -ENODATA; 18414 18415 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 18416 if (!msg) 18417 return -ENOMEM; 18418 18419 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 18420 NL80211_CMD_GET_FTM_RESPONDER_STATS); 18421 if (!hdr) 18422 goto nla_put_failure; 18423 18424 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 18425 goto nla_put_failure; 18426 18427 ftm_stats_attr = nla_nest_start_noflag(msg, 18428 NL80211_ATTR_FTM_RESPONDER_STATS); 18429 if (!ftm_stats_attr) 18430 goto nla_put_failure; 18431 18432 #define SET_FTM(field, name, type) \ 18433 do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \ 18434 nla_put_ ## type(msg, NL80211_FTM_STATS_ ## name, \ 18435 ftm_stats.field)) \ 18436 goto nla_put_failure; } while (0) 18437 #define SET_FTM_U64(field, name) \ 18438 do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \ 18439 nla_put_u64_64bit(msg, NL80211_FTM_STATS_ ## name, \ 18440 ftm_stats.field, NL80211_FTM_STATS_PAD)) \ 18441 goto nla_put_failure; } while (0) 18442 18443 SET_FTM(success_num, SUCCESS_NUM, u32); 18444 SET_FTM(partial_num, PARTIAL_NUM, u32); 18445 SET_FTM(failed_num, FAILED_NUM, u32); 18446 SET_FTM(asap_num, ASAP_NUM, u32); 18447 SET_FTM(non_asap_num, NON_ASAP_NUM, u32); 18448 SET_FTM_U64(total_duration_ms, TOTAL_DURATION_MSEC); 18449 SET_FTM(unknown_triggers_num, UNKNOWN_TRIGGERS_NUM, u32); 18450 SET_FTM(reschedule_requests_num, RESCHEDULE_REQUESTS_NUM, u32); 18451 SET_FTM(out_of_window_triggers_num, OUT_OF_WINDOW_TRIGGERS_NUM, u32); 18452 #undef SET_FTM 18453 18454 nla_nest_end(msg, ftm_stats_attr); 18455 18456 genlmsg_end(msg, hdr); 18457 return genlmsg_reply(msg, info); 18458 18459 nla_put_failure: 18460 nlmsg_free(msg); 18461 return -ENOBUFS; 18462 } 18463 18464 static int nl80211_update_owe_info(struct sk_buff *skb, struct genl_info *info) 18465 { 18466 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18467 struct cfg80211_update_owe_info owe_info; 18468 struct net_device *dev = info->user_ptr[1]; 18469 18470 if (!rdev->ops->update_owe_info) 18471 return -EOPNOTSUPP; 18472 18473 if (!info->attrs[NL80211_ATTR_STATUS_CODE] || 18474 !info->attrs[NL80211_ATTR_MAC]) 18475 return -EINVAL; 18476 18477 memset(&owe_info, 0, sizeof(owe_info)); 18478 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 18479 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); 18480 18481 if (info->attrs[NL80211_ATTR_IE]) { 18482 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 18483 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 18484 } 18485 18486 return rdev_update_owe_info(rdev, dev, &owe_info); 18487 } 18488 18489 static int nl80211_probe_mesh_link(struct sk_buff *skb, struct genl_info *info) 18490 { 18491 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18492 struct net_device *dev = info->user_ptr[1]; 18493 struct wireless_dev *wdev = dev->ieee80211_ptr; 18494 struct station_info sinfo = {}; 18495 const u8 *buf; 18496 size_t len; 18497 u8 *dest; 18498 int err; 18499 18500 if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station) 18501 return -EOPNOTSUPP; 18502 18503 if (!info->attrs[NL80211_ATTR_MAC] || 18504 !info->attrs[NL80211_ATTR_FRAME]) { 18505 GENL_SET_ERR_MSG(info, "Frame or MAC missing"); 18506 return -EINVAL; 18507 } 18508 18509 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 18510 return -EOPNOTSUPP; 18511 18512 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); 18513 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 18514 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 18515 18516 if (len < sizeof(struct ethhdr)) 18517 return -EINVAL; 18518 18519 if (!ether_addr_equal(buf, dest) || is_multicast_ether_addr(buf) || 18520 !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr)) 18521 return -EINVAL; 18522 18523 err = rdev_get_station(rdev, wdev, dest, &sinfo); 18524 if (err) 18525 return err; 18526 18527 cfg80211_sinfo_release_content(&sinfo); 18528 18529 return rdev_probe_mesh_link(rdev, dev, dest, buf, len); 18530 } 18531 18532 static int parse_tid_conf(struct cfg80211_registered_device *rdev, 18533 struct nlattr *attrs[], struct net_device *dev, 18534 struct cfg80211_tid_cfg *tid_conf, 18535 struct genl_info *info, const u8 *peer, 18536 unsigned int link_id) 18537 { 18538 struct netlink_ext_ack *extack = info->extack; 18539 u64 mask; 18540 int err; 18541 18542 if (!attrs[NL80211_TID_CONFIG_ATTR_TIDS]) 18543 return -EINVAL; 18544 18545 tid_conf->config_override = 18546 nla_get_flag(attrs[NL80211_TID_CONFIG_ATTR_OVERRIDE]); 18547 tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]); 18548 18549 if (tid_conf->config_override) { 18550 if (rdev->ops->reset_tid_config) { 18551 err = rdev_reset_tid_config(rdev, dev, peer, 18552 tid_conf->tids); 18553 if (err) 18554 return err; 18555 } else { 18556 return -EINVAL; 18557 } 18558 } 18559 18560 if (attrs[NL80211_TID_CONFIG_ATTR_NOACK]) { 18561 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK); 18562 tid_conf->noack = 18563 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_NOACK]); 18564 } 18565 18566 if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]) { 18567 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT); 18568 tid_conf->retry_short = 18569 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]); 18570 18571 if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count) 18572 return -EINVAL; 18573 } 18574 18575 if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]) { 18576 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG); 18577 tid_conf->retry_long = 18578 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]); 18579 18580 if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count) 18581 return -EINVAL; 18582 } 18583 18584 if (attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]) { 18585 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL); 18586 tid_conf->ampdu = 18587 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]); 18588 } 18589 18590 if (attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]) { 18591 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL); 18592 tid_conf->rtscts = 18593 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]); 18594 } 18595 18596 if (attrs[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL]) { 18597 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL); 18598 tid_conf->amsdu = 18599 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL]); 18600 } 18601 18602 if (attrs[NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE]) { 18603 u32 idx = NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE, attr; 18604 18605 tid_conf->txrate_type = nla_get_u8(attrs[idx]); 18606 18607 if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) { 18608 attr = NL80211_TID_CONFIG_ATTR_TX_RATE; 18609 err = nl80211_parse_tx_bitrate_mask(info, attrs, attr, 18610 &tid_conf->txrate_mask, dev, 18611 true, link_id); 18612 if (err) 18613 return err; 18614 18615 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE); 18616 } 18617 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE); 18618 } 18619 18620 if (peer) 18621 mask = rdev->wiphy.tid_config_support.peer; 18622 else 18623 mask = rdev->wiphy.tid_config_support.vif; 18624 18625 if (tid_conf->mask & ~mask) { 18626 NL_SET_ERR_MSG(extack, "unsupported TID configuration"); 18627 return -EOPNOTSUPP; 18628 } 18629 18630 return 0; 18631 } 18632 18633 static int nl80211_set_tid_config(struct sk_buff *skb, 18634 struct genl_info *info) 18635 { 18636 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18637 struct nlattr *attrs[NL80211_TID_CONFIG_ATTR_MAX + 1]; 18638 unsigned int link_id = nl80211_link_id(info->attrs); 18639 struct net_device *dev = info->user_ptr[1]; 18640 struct cfg80211_tid_config *tid_config; 18641 struct nlattr *tid; 18642 int conf_idx = 0, rem_conf; 18643 int ret = -EINVAL; 18644 u32 num_conf = 0; 18645 18646 if (!info->attrs[NL80211_ATTR_TID_CONFIG]) 18647 return -EINVAL; 18648 18649 if (!rdev->ops->set_tid_config) 18650 return -EOPNOTSUPP; 18651 18652 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], 18653 rem_conf) 18654 num_conf++; 18655 18656 tid_config = kzalloc_flex(*tid_config, tid_conf, num_conf); 18657 if (!tid_config) 18658 return -ENOMEM; 18659 18660 tid_config->n_tid_conf = num_conf; 18661 18662 if (info->attrs[NL80211_ATTR_MAC]) 18663 tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 18664 18665 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], 18666 rem_conf) { 18667 ret = nla_parse_nested(attrs, NL80211_TID_CONFIG_ATTR_MAX, 18668 tid, NULL, NULL); 18669 18670 if (ret) 18671 goto bad_tid_conf; 18672 18673 ret = parse_tid_conf(rdev, attrs, dev, 18674 &tid_config->tid_conf[conf_idx], 18675 info, tid_config->peer, link_id); 18676 if (ret) 18677 goto bad_tid_conf; 18678 18679 conf_idx++; 18680 } 18681 18682 ret = rdev_set_tid_config(rdev, dev, tid_config); 18683 18684 bad_tid_conf: 18685 kfree(tid_config); 18686 return ret; 18687 } 18688 18689 static int nl80211_color_change(struct sk_buff *skb, struct genl_info *info) 18690 { 18691 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18692 struct cfg80211_color_change_settings params = {}; 18693 struct net_device *dev = info->user_ptr[1]; 18694 struct wireless_dev *wdev = dev->ieee80211_ptr; 18695 struct nlattr **tb; 18696 u16 offset; 18697 int err; 18698 18699 if (!rdev->ops->color_change) 18700 return -EOPNOTSUPP; 18701 18702 if (!wiphy_ext_feature_isset(&rdev->wiphy, 18703 NL80211_EXT_FEATURE_BSS_COLOR)) 18704 return -EOPNOTSUPP; 18705 18706 if (wdev->iftype != NL80211_IFTYPE_AP) 18707 return -EOPNOTSUPP; 18708 18709 if (!info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT] || 18710 !info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR] || 18711 !info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS]) 18712 return -EINVAL; 18713 18714 params.count = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT]); 18715 params.color = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR]); 18716 18717 params.link_id = nl80211_link_id(info->attrs); 18718 if (!wdev->links[params.link_id].ap.beacon_interval) 18719 return -EINVAL; 18720 18721 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_next, 18722 wdev->links[params.link_id].ap.chandef.chan, 18723 info->extack); 18724 if (err) 18725 return err; 18726 18727 tb = kzalloc_objs(*tb, NL80211_ATTR_MAX + 1); 18728 if (!tb) 18729 return -ENOMEM; 18730 18731 err = nla_parse_nested(tb, NL80211_ATTR_MAX, 18732 info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS], 18733 nl80211_policy, info->extack); 18734 if (err) 18735 goto out; 18736 18737 err = nl80211_parse_beacon(rdev, tb, ¶ms.beacon_color_change, 18738 wdev->links[params.link_id].ap.chandef.chan, 18739 info->extack); 18740 if (err) 18741 goto out; 18742 18743 if (!tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]) { 18744 err = -EINVAL; 18745 goto out; 18746 } 18747 18748 if (nla_len(tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]) != sizeof(u16)) { 18749 err = -EINVAL; 18750 goto out; 18751 } 18752 18753 offset = nla_get_u16(tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]); 18754 if (offset >= params.beacon_color_change.tail_len) { 18755 err = -EINVAL; 18756 goto out; 18757 } 18758 18759 if (params.beacon_color_change.tail[offset] != params.count) { 18760 err = -EINVAL; 18761 goto out; 18762 } 18763 18764 params.counter_offset_beacon = offset; 18765 18766 if (tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]) { 18767 if (nla_len(tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]) != 18768 sizeof(u16)) { 18769 err = -EINVAL; 18770 goto out; 18771 } 18772 18773 offset = nla_get_u16(tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]); 18774 if (offset >= params.beacon_color_change.probe_resp_len) { 18775 err = -EINVAL; 18776 goto out; 18777 } 18778 18779 if (params.beacon_color_change.probe_resp[offset] != 18780 params.count) { 18781 err = -EINVAL; 18782 goto out; 18783 } 18784 18785 params.counter_offset_presp = offset; 18786 } 18787 18788 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { 18789 err = nl80211_parse_unsol_bcast_probe_resp( 18790 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], 18791 ¶ms.unsol_bcast_probe_resp); 18792 if (err) 18793 goto out; 18794 } 18795 18796 err = rdev_color_change(rdev, dev, ¶ms); 18797 18798 out: 18799 kfree(params.beacon_next.mbssid_ies); 18800 kfree(params.beacon_color_change.mbssid_ies); 18801 kfree(params.beacon_next.rnr_ies); 18802 kfree(params.beacon_color_change.rnr_ies); 18803 kfree(tb); 18804 return err; 18805 } 18806 18807 static int nl80211_set_fils_aad(struct sk_buff *skb, 18808 struct genl_info *info) 18809 { 18810 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18811 struct net_device *dev = info->user_ptr[1]; 18812 struct cfg80211_fils_aad fils_aad = {}; 18813 u8 *nonces; 18814 18815 if (!info->attrs[NL80211_ATTR_MAC] || 18816 !info->attrs[NL80211_ATTR_FILS_KEK] || 18817 !info->attrs[NL80211_ATTR_FILS_NONCES]) 18818 return -EINVAL; 18819 18820 fils_aad.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); 18821 fils_aad.kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); 18822 fils_aad.kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); 18823 nonces = nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); 18824 fils_aad.snonce = nonces; 18825 fils_aad.anonce = nonces + FILS_NONCE_LEN; 18826 18827 return rdev_set_fils_aad(rdev, dev, &fils_aad); 18828 } 18829 18830 static int nl80211_add_link(struct sk_buff *skb, struct genl_info *info) 18831 { 18832 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18833 unsigned int link_id = nl80211_link_id(info->attrs); 18834 struct net_device *dev = info->user_ptr[1]; 18835 struct wireless_dev *wdev = dev->ieee80211_ptr; 18836 int ret; 18837 18838 if (!(wdev->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO)) 18839 return -EINVAL; 18840 18841 switch (wdev->iftype) { 18842 case NL80211_IFTYPE_AP: 18843 break; 18844 default: 18845 return -EINVAL; 18846 } 18847 18848 if (!info->attrs[NL80211_ATTR_MAC] || 18849 !is_valid_ether_addr(nla_data(info->attrs[NL80211_ATTR_MAC]))) 18850 return -EINVAL; 18851 18852 wdev->valid_links |= BIT(link_id); 18853 ether_addr_copy(wdev->links[link_id].addr, 18854 nla_data(info->attrs[NL80211_ATTR_MAC])); 18855 18856 ret = rdev_add_intf_link(rdev, wdev, link_id); 18857 if (ret) { 18858 wdev->valid_links &= ~BIT(link_id); 18859 eth_zero_addr(wdev->links[link_id].addr); 18860 } 18861 18862 return ret; 18863 } 18864 18865 static int nl80211_remove_link(struct sk_buff *skb, struct genl_info *info) 18866 { 18867 unsigned int link_id = nl80211_link_id(info->attrs); 18868 struct net_device *dev = info->user_ptr[1]; 18869 struct wireless_dev *wdev = dev->ieee80211_ptr; 18870 18871 /* cannot remove if there's no link */ 18872 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) 18873 return -EINVAL; 18874 18875 switch (wdev->iftype) { 18876 case NL80211_IFTYPE_AP: 18877 break; 18878 default: 18879 return -EINVAL; 18880 } 18881 18882 cfg80211_remove_link(wdev, link_id); 18883 18884 return 0; 18885 } 18886 18887 static int 18888 nl80211_add_mod_link_station(struct sk_buff *skb, struct genl_info *info, 18889 bool add) 18890 { 18891 struct link_station_parameters params = {}; 18892 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 18893 struct net_device *dev = info->user_ptr[1]; 18894 int err; 18895 18896 if ((add && !rdev->ops->add_link_station) || 18897 (!add && !rdev->ops->mod_link_station)) 18898 return -EOPNOTSUPP; 18899 18900 if (add && !info->attrs[NL80211_ATTR_MAC]) 18901 return -EINVAL; 18902 18903 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) 18904 return -EINVAL; 18905 18906 if (add && !info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 18907 return -EINVAL; 18908 18909 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 18910 18911 if (info->attrs[NL80211_ATTR_MAC]) { 18912 params.link_mac = nla_data(info->attrs[NL80211_ATTR_MAC]); 18913 if (!is_valid_ether_addr(params.link_mac)) 18914 return -EINVAL; 18915 } 18916 18917 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) 18918 return -EINVAL; 18919 18920 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); 18921 18922 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 18923 params.supported_rates = 18924 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 18925 params.supported_rates_len = 18926 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 18927 } 18928 18929 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 18930 params.ht_capa = 18931 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 18932 18933 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 18934 params.vht_capa = 18935 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 18936 18937 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 18938 params.he_capa = 18939 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 18940 params.he_capa_len = 18941 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 18942 18943 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { 18944 params.eht_capa = 18945 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 18946 params.eht_capa_len = 18947 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 18948 18949 if (!ieee80211_eht_capa_size_ok((const u8 *)params.he_capa, 18950 (const u8 *)params.eht_capa, 18951 params.eht_capa_len, 18952 false)) 18953 return -EINVAL; 18954 } 18955 } 18956 18957 if (info->attrs[NL80211_ATTR_UHR_CAPABILITY]) { 18958 if (!params.eht_capa) 18959 return -EINVAL; 18960 18961 params.uhr_capa = 18962 nla_data(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 18963 params.uhr_capa_len = 18964 nla_len(info->attrs[NL80211_ATTR_UHR_CAPABILITY]); 18965 } 18966 18967 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) 18968 params.he_6ghz_capa = 18969 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); 18970 18971 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 18972 params.opmode_notif_used = true; 18973 params.opmode_notif = 18974 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 18975 } 18976 18977 err = nl80211_parse_sta_txpower_setting(info, ¶ms.txpwr, 18978 ¶ms.txpwr_set); 18979 if (err) 18980 return err; 18981 18982 if (add) 18983 return rdev_add_link_station(rdev, dev, ¶ms); 18984 18985 return rdev_mod_link_station(rdev, dev, ¶ms); 18986 } 18987 18988 static int 18989 nl80211_add_link_station(struct sk_buff *skb, struct genl_info *info) 18990 { 18991 return nl80211_add_mod_link_station(skb, info, true); 18992 } 18993 18994 static int 18995 nl80211_modify_link_station(struct sk_buff *skb, struct genl_info *info) 18996 { 18997 return nl80211_add_mod_link_station(skb, info, false); 18998 } 18999 19000 static int 19001 nl80211_remove_link_station(struct sk_buff *skb, struct genl_info *info) 19002 { 19003 struct link_station_del_parameters params = {}; 19004 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19005 struct net_device *dev = info->user_ptr[1]; 19006 19007 if (!rdev->ops->del_link_station) 19008 return -EOPNOTSUPP; 19009 19010 if (!info->attrs[NL80211_ATTR_MLD_ADDR] || 19011 !info->attrs[NL80211_ATTR_MLO_LINK_ID]) 19012 return -EINVAL; 19013 19014 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 19015 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); 19016 19017 return rdev_del_link_station(rdev, dev, ¶ms); 19018 } 19019 19020 static int nl80211_set_hw_timestamp(struct sk_buff *skb, 19021 struct genl_info *info) 19022 { 19023 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19024 struct net_device *dev = info->user_ptr[1]; 19025 struct cfg80211_set_hw_timestamp hwts = {}; 19026 19027 if (!rdev->wiphy.hw_timestamp_max_peers) 19028 return -EOPNOTSUPP; 19029 19030 if (!info->attrs[NL80211_ATTR_MAC] && 19031 rdev->wiphy.hw_timestamp_max_peers != CFG80211_HW_TIMESTAMP_ALL_PEERS) 19032 return -EOPNOTSUPP; 19033 19034 if (info->attrs[NL80211_ATTR_MAC]) 19035 hwts.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); 19036 19037 hwts.enable = 19038 nla_get_flag(info->attrs[NL80211_ATTR_HW_TIMESTAMP_ENABLED]); 19039 19040 return rdev_set_hw_timestamp(rdev, dev, &hwts); 19041 } 19042 19043 static int 19044 nl80211_set_ttlm(struct sk_buff *skb, struct genl_info *info) 19045 { 19046 struct cfg80211_ttlm_params params = {}; 19047 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19048 struct net_device *dev = info->user_ptr[1]; 19049 struct wireless_dev *wdev = dev->ieee80211_ptr; 19050 19051 if (wdev->iftype != NL80211_IFTYPE_STATION && 19052 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 19053 return -EOPNOTSUPP; 19054 19055 if (!wdev->connected) 19056 return -ENOLINK; 19057 19058 if (!info->attrs[NL80211_ATTR_MLO_TTLM_DLINK] || 19059 !info->attrs[NL80211_ATTR_MLO_TTLM_ULINK]) 19060 return -EINVAL; 19061 19062 nla_memcpy(params.dlink, 19063 info->attrs[NL80211_ATTR_MLO_TTLM_DLINK], 19064 sizeof(params.dlink)); 19065 nla_memcpy(params.ulink, 19066 info->attrs[NL80211_ATTR_MLO_TTLM_ULINK], 19067 sizeof(params.ulink)); 19068 19069 return rdev_set_ttlm(rdev, dev, ¶ms); 19070 } 19071 19072 static int nl80211_assoc_ml_reconf(struct sk_buff *skb, struct genl_info *info) 19073 { 19074 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19075 struct net_device *dev = info->user_ptr[1]; 19076 struct wireless_dev *wdev = dev->ieee80211_ptr; 19077 struct cfg80211_ml_reconf_req req = {}; 19078 unsigned int link_id; 19079 u16 add_links; 19080 int err; 19081 19082 if (!wdev->valid_links) 19083 return -EINVAL; 19084 19085 if (dev->ieee80211_ptr->conn_owner_nlportid && 19086 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 19087 return -EPERM; 19088 19089 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 19090 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 19091 return -EOPNOTSUPP; 19092 19093 add_links = 0; 19094 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { 19095 err = nl80211_process_links(rdev, req.add_links, 19096 /* mark as MLO, but not assoc */ 19097 IEEE80211_MLD_MAX_NUM_LINKS, 19098 NULL, 0, info); 19099 if (err) 19100 return err; 19101 19102 for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS; 19103 link_id++) { 19104 if (!req.add_links[link_id].bss) 19105 continue; 19106 add_links |= BIT(link_id); 19107 } 19108 } 19109 19110 if (info->attrs[NL80211_ATTR_MLO_RECONF_REM_LINKS]) 19111 req.rem_links = 19112 nla_get_u16(info->attrs[NL80211_ATTR_MLO_RECONF_REM_LINKS]); 19113 19114 /* Validate that existing links are not added, removed links are valid 19115 * and don't allow adding and removing the same links 19116 */ 19117 if ((add_links & req.rem_links) || !(add_links | req.rem_links) || 19118 (wdev->valid_links & add_links) || 19119 ((wdev->valid_links & req.rem_links) != req.rem_links)) { 19120 err = -EINVAL; 19121 goto out; 19122 } 19123 19124 if (info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]) 19125 req.ext_mld_capa_ops = 19126 nla_get_u16(info->attrs[NL80211_ATTR_EXT_MLD_CAPA_AND_OPS]); 19127 19128 err = cfg80211_assoc_ml_reconf(rdev, dev, &req); 19129 19130 out: 19131 for (link_id = 0; link_id < ARRAY_SIZE(req.add_links); link_id++) 19132 cfg80211_put_bss(&rdev->wiphy, req.add_links[link_id].bss); 19133 19134 return err; 19135 } 19136 19137 static int 19138 nl80211_epcs_cfg(struct sk_buff *skb, struct genl_info *info) 19139 { 19140 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19141 struct net_device *dev = info->user_ptr[1]; 19142 struct wireless_dev *wdev = dev->ieee80211_ptr; 19143 bool val; 19144 19145 if (wdev->iftype != NL80211_IFTYPE_STATION && 19146 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 19147 return -EOPNOTSUPP; 19148 19149 if (!wdev->connected) 19150 return -ENOLINK; 19151 19152 val = nla_get_flag(info->attrs[NL80211_ATTR_EPCS]); 19153 19154 return rdev_set_epcs(rdev, dev, val); 19155 } 19156 19157 #define NL80211_FLAG_NEED_WIPHY 0x01 19158 #define NL80211_FLAG_NEED_NETDEV 0x02 19159 #define NL80211_FLAG_NEED_RTNL 0x04 19160 #define NL80211_FLAG_CHECK_NETDEV_UP 0x08 19161 #define NL80211_FLAG_NEED_NETDEV_UP (NL80211_FLAG_NEED_NETDEV |\ 19162 NL80211_FLAG_CHECK_NETDEV_UP) 19163 #define NL80211_FLAG_NEED_WDEV 0x10 19164 /* If a netdev is associated, it must be UP, P2P must be started */ 19165 #define NL80211_FLAG_NEED_WDEV_UP (NL80211_FLAG_NEED_WDEV |\ 19166 NL80211_FLAG_CHECK_NETDEV_UP) 19167 #define NL80211_FLAG_CLEAR_SKB 0x20 19168 #define NL80211_FLAG_NO_WIPHY_MTX 0x40 19169 #define NL80211_FLAG_MLO_VALID_LINK_ID 0x80 19170 #define NL80211_FLAG_MLO_UNSUPPORTED 0x100 19171 19172 #define INTERNAL_FLAG_SELECTORS(__sel) \ 19173 SELECTOR(__sel, NONE, 0) /* must be first */ \ 19174 SELECTOR(__sel, WIPHY, \ 19175 NL80211_FLAG_NEED_WIPHY) \ 19176 SELECTOR(__sel, WDEV, \ 19177 NL80211_FLAG_NEED_WDEV) \ 19178 SELECTOR(__sel, NETDEV, \ 19179 NL80211_FLAG_NEED_NETDEV) \ 19180 SELECTOR(__sel, NETDEV_LINK, \ 19181 NL80211_FLAG_NEED_NETDEV | \ 19182 NL80211_FLAG_MLO_VALID_LINK_ID) \ 19183 SELECTOR(__sel, NETDEV_NO_MLO, \ 19184 NL80211_FLAG_NEED_NETDEV | \ 19185 NL80211_FLAG_MLO_UNSUPPORTED) \ 19186 SELECTOR(__sel, WIPHY_RTNL, \ 19187 NL80211_FLAG_NEED_WIPHY | \ 19188 NL80211_FLAG_NEED_RTNL) \ 19189 SELECTOR(__sel, WIPHY_RTNL_NOMTX, \ 19190 NL80211_FLAG_NEED_WIPHY | \ 19191 NL80211_FLAG_NEED_RTNL | \ 19192 NL80211_FLAG_NO_WIPHY_MTX) \ 19193 SELECTOR(__sel, WDEV_RTNL, \ 19194 NL80211_FLAG_NEED_WDEV | \ 19195 NL80211_FLAG_NEED_RTNL) \ 19196 SELECTOR(__sel, NETDEV_RTNL, \ 19197 NL80211_FLAG_NEED_NETDEV | \ 19198 NL80211_FLAG_NEED_RTNL) \ 19199 SELECTOR(__sel, NETDEV_UP, \ 19200 NL80211_FLAG_NEED_NETDEV_UP) \ 19201 SELECTOR(__sel, NETDEV_UP_LINK, \ 19202 NL80211_FLAG_NEED_NETDEV_UP | \ 19203 NL80211_FLAG_MLO_VALID_LINK_ID) \ 19204 SELECTOR(__sel, NETDEV_UP_NO_MLO, \ 19205 NL80211_FLAG_NEED_NETDEV_UP | \ 19206 NL80211_FLAG_MLO_UNSUPPORTED) \ 19207 SELECTOR(__sel, NETDEV_UP_NO_MLO_CLEAR, \ 19208 NL80211_FLAG_NEED_NETDEV_UP | \ 19209 NL80211_FLAG_CLEAR_SKB | \ 19210 NL80211_FLAG_MLO_UNSUPPORTED) \ 19211 SELECTOR(__sel, NETDEV_UP_NOTMX, \ 19212 NL80211_FLAG_NEED_NETDEV_UP | \ 19213 NL80211_FLAG_NO_WIPHY_MTX) \ 19214 SELECTOR(__sel, NETDEV_UP_NOTMX_MLO, \ 19215 NL80211_FLAG_NEED_NETDEV_UP | \ 19216 NL80211_FLAG_NO_WIPHY_MTX | \ 19217 NL80211_FLAG_MLO_VALID_LINK_ID) \ 19218 SELECTOR(__sel, NETDEV_UP_CLEAR, \ 19219 NL80211_FLAG_NEED_NETDEV_UP | \ 19220 NL80211_FLAG_CLEAR_SKB) \ 19221 SELECTOR(__sel, WDEV_UP, \ 19222 NL80211_FLAG_NEED_WDEV_UP) \ 19223 SELECTOR(__sel, WDEV_UP_CLEAR, \ 19224 NL80211_FLAG_NEED_WDEV_UP | \ 19225 NL80211_FLAG_CLEAR_SKB) \ 19226 SELECTOR(__sel, WDEV_UP_LINK, \ 19227 NL80211_FLAG_NEED_WDEV_UP | \ 19228 NL80211_FLAG_MLO_VALID_LINK_ID) \ 19229 SELECTOR(__sel, WDEV_UP_RTNL, \ 19230 NL80211_FLAG_NEED_WDEV_UP | \ 19231 NL80211_FLAG_NEED_RTNL) \ 19232 SELECTOR(__sel, WIPHY_CLEAR, \ 19233 NL80211_FLAG_NEED_WIPHY | \ 19234 NL80211_FLAG_CLEAR_SKB) \ 19235 SELECTOR(__sel, WDEV_UP_RTNL_NOMTX, \ 19236 NL80211_FLAG_NEED_WDEV_UP | \ 19237 NL80211_FLAG_NO_WIPHY_MTX | \ 19238 NL80211_FLAG_NEED_RTNL) 19239 19240 enum nl80211_internal_flags_selector { 19241 #define SELECTOR(_, name, value) NL80211_IFL_SEL_##name, 19242 INTERNAL_FLAG_SELECTORS(_) 19243 #undef SELECTOR 19244 }; 19245 19246 static u32 nl80211_internal_flags[] = { 19247 #define SELECTOR(_, name, value) [NL80211_IFL_SEL_##name] = value, 19248 INTERNAL_FLAG_SELECTORS(_) 19249 #undef SELECTOR 19250 }; 19251 19252 static int nl80211_pre_doit(const struct genl_split_ops *ops, 19253 struct sk_buff *skb, 19254 struct genl_info *info) 19255 { 19256 struct cfg80211_registered_device *rdev = NULL; 19257 struct wireless_dev *wdev = NULL; 19258 struct net_device *dev = NULL; 19259 u32 internal_flags; 19260 int err; 19261 19262 if (WARN_ON(ops->internal_flags >= ARRAY_SIZE(nl80211_internal_flags))) 19263 return -EINVAL; 19264 19265 internal_flags = nl80211_internal_flags[ops->internal_flags]; 19266 19267 rtnl_lock(); 19268 if (internal_flags & NL80211_FLAG_NEED_WIPHY) { 19269 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 19270 if (IS_ERR(rdev)) { 19271 err = PTR_ERR(rdev); 19272 goto out_unlock; 19273 } 19274 info->user_ptr[0] = rdev; 19275 } else if (internal_flags & NL80211_FLAG_NEED_NETDEV || 19276 internal_flags & NL80211_FLAG_NEED_WDEV) { 19277 wdev = __cfg80211_wdev_from_attrs(NULL, genl_info_net(info), 19278 info->attrs); 19279 if (IS_ERR(wdev)) { 19280 err = PTR_ERR(wdev); 19281 goto out_unlock; 19282 } 19283 19284 dev = wdev->netdev; 19285 dev_hold(dev); 19286 rdev = wiphy_to_rdev(wdev->wiphy); 19287 19288 if (internal_flags & NL80211_FLAG_NEED_NETDEV) { 19289 if (!dev) { 19290 err = -EINVAL; 19291 goto out_unlock; 19292 } 19293 19294 info->user_ptr[1] = dev; 19295 } else { 19296 info->user_ptr[1] = wdev; 19297 } 19298 19299 if (internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && 19300 !wdev_running(wdev)) { 19301 err = -ENETDOWN; 19302 goto out_unlock; 19303 } 19304 19305 info->user_ptr[0] = rdev; 19306 } 19307 19308 if (internal_flags & NL80211_FLAG_MLO_VALID_LINK_ID) { 19309 struct nlattr *link_id = info->attrs[NL80211_ATTR_MLO_LINK_ID]; 19310 19311 if (!wdev) { 19312 err = -EINVAL; 19313 goto out_unlock; 19314 } 19315 19316 /* MLO -> require valid link ID */ 19317 if (wdev->valid_links && 19318 (!link_id || 19319 !(wdev->valid_links & BIT(nla_get_u8(link_id))))) { 19320 err = -EINVAL; 19321 goto out_unlock; 19322 } 19323 19324 /* non-MLO -> no link ID attribute accepted */ 19325 if (!wdev->valid_links && link_id) { 19326 err = -EINVAL; 19327 goto out_unlock; 19328 } 19329 } 19330 19331 if (internal_flags & NL80211_FLAG_MLO_UNSUPPORTED) { 19332 if (info->attrs[NL80211_ATTR_MLO_LINK_ID] || 19333 (wdev && wdev->valid_links)) { 19334 err = -EINVAL; 19335 goto out_unlock; 19336 } 19337 } 19338 19339 if (rdev && !(internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) { 19340 wiphy_lock(&rdev->wiphy); 19341 /* we keep the mutex locked until post_doit */ 19342 __release(&rdev->wiphy.mtx); 19343 } 19344 if (!(internal_flags & NL80211_FLAG_NEED_RTNL)) 19345 rtnl_unlock(); 19346 19347 return 0; 19348 out_unlock: 19349 rtnl_unlock(); 19350 dev_put(dev); 19351 return err; 19352 } 19353 19354 static void nl80211_post_doit(const struct genl_split_ops *ops, 19355 struct sk_buff *skb, 19356 struct genl_info *info) 19357 { 19358 u32 internal_flags = nl80211_internal_flags[ops->internal_flags]; 19359 19360 if (info->user_ptr[1]) { 19361 if (internal_flags & NL80211_FLAG_NEED_WDEV) { 19362 struct wireless_dev *wdev = info->user_ptr[1]; 19363 19364 dev_put(wdev->netdev); 19365 } else { 19366 dev_put(info->user_ptr[1]); 19367 } 19368 } 19369 19370 if (info->user_ptr[0] && 19371 !(internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) { 19372 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19373 19374 /* we kept the mutex locked since pre_doit */ 19375 __acquire(&rdev->wiphy.mtx); 19376 wiphy_unlock(&rdev->wiphy); 19377 } 19378 19379 if (internal_flags & NL80211_FLAG_NEED_RTNL) 19380 rtnl_unlock(); 19381 19382 /* If needed, clear the netlink message payload from the SKB 19383 * as it might contain key data that shouldn't stick around on 19384 * the heap after the SKB is freed. The netlink message header 19385 * is still needed for further processing, so leave it intact. 19386 */ 19387 if (internal_flags & NL80211_FLAG_CLEAR_SKB) { 19388 struct nlmsghdr *nlh = nlmsg_hdr(skb); 19389 19390 memset(nlmsg_data(nlh), 0, nlmsg_len(nlh)); 19391 } 19392 } 19393 19394 static int nl80211_set_sar_sub_specs(struct cfg80211_registered_device *rdev, 19395 struct cfg80211_sar_specs *sar_specs, 19396 struct nlattr *spec[], int index) 19397 { 19398 u32 range_index, i; 19399 19400 if (!sar_specs || !spec) 19401 return -EINVAL; 19402 19403 if (!spec[NL80211_SAR_ATTR_SPECS_POWER] || 19404 !spec[NL80211_SAR_ATTR_SPECS_RANGE_INDEX]) 19405 return -EINVAL; 19406 19407 range_index = nla_get_u32(spec[NL80211_SAR_ATTR_SPECS_RANGE_INDEX]); 19408 19409 /* check if range_index exceeds num_freq_ranges */ 19410 if (range_index >= rdev->wiphy.sar_capa->num_freq_ranges) 19411 return -EINVAL; 19412 19413 /* check if range_index duplicates */ 19414 for (i = 0; i < index; i++) { 19415 if (sar_specs->sub_specs[i].freq_range_index == range_index) 19416 return -EINVAL; 19417 } 19418 19419 sar_specs->sub_specs[index].power = 19420 nla_get_s32(spec[NL80211_SAR_ATTR_SPECS_POWER]); 19421 19422 sar_specs->sub_specs[index].freq_range_index = range_index; 19423 19424 return 0; 19425 } 19426 19427 static int nl80211_set_sar_specs(struct sk_buff *skb, struct genl_info *info) 19428 { 19429 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 19430 struct nlattr *spec[NL80211_SAR_ATTR_SPECS_MAX + 1]; 19431 struct nlattr *tb[NL80211_SAR_ATTR_MAX + 1]; 19432 struct cfg80211_sar_specs *sar_spec; 19433 enum nl80211_sar_type type; 19434 struct nlattr *spec_list; 19435 u32 specs; 19436 int rem, err; 19437 19438 if (!rdev->wiphy.sar_capa || !rdev->ops->set_sar_specs) 19439 return -EOPNOTSUPP; 19440 19441 if (!info->attrs[NL80211_ATTR_SAR_SPEC]) 19442 return -EINVAL; 19443 19444 nla_parse_nested(tb, NL80211_SAR_ATTR_MAX, 19445 info->attrs[NL80211_ATTR_SAR_SPEC], 19446 NULL, NULL); 19447 19448 if (!tb[NL80211_SAR_ATTR_TYPE] || !tb[NL80211_SAR_ATTR_SPECS]) 19449 return -EINVAL; 19450 19451 type = nla_get_u32(tb[NL80211_SAR_ATTR_TYPE]); 19452 if (type != rdev->wiphy.sar_capa->type) 19453 return -EINVAL; 19454 19455 specs = 0; 19456 nla_for_each_nested(spec_list, tb[NL80211_SAR_ATTR_SPECS], rem) 19457 specs++; 19458 19459 if (specs > rdev->wiphy.sar_capa->num_freq_ranges) 19460 return -EINVAL; 19461 19462 sar_spec = kzalloc_flex(*sar_spec, sub_specs, specs); 19463 if (!sar_spec) 19464 return -ENOMEM; 19465 19466 sar_spec->num_sub_specs = specs; 19467 sar_spec->type = type; 19468 specs = 0; 19469 nla_for_each_nested(spec_list, tb[NL80211_SAR_ATTR_SPECS], rem) { 19470 nla_parse_nested(spec, NL80211_SAR_ATTR_SPECS_MAX, 19471 spec_list, NULL, NULL); 19472 19473 switch (type) { 19474 case NL80211_SAR_TYPE_POWER: 19475 if (nl80211_set_sar_sub_specs(rdev, sar_spec, 19476 spec, specs)) { 19477 err = -EINVAL; 19478 goto error; 19479 } 19480 break; 19481 default: 19482 err = -EINVAL; 19483 goto error; 19484 } 19485 specs++; 19486 } 19487 19488 sar_spec->num_sub_specs = specs; 19489 19490 rdev->cur_cmd_info = info; 19491 err = rdev_set_sar_specs(rdev, sar_spec); 19492 rdev->cur_cmd_info = NULL; 19493 error: 19494 kfree(sar_spec); 19495 return err; 19496 } 19497 19498 #define SELECTOR(__sel, name, value) \ 19499 ((__sel) == (value)) ? NL80211_IFL_SEL_##name : 19500 int __missing_selector(void); 19501 #define IFLAGS(__val) INTERNAL_FLAG_SELECTORS(__val) __missing_selector() 19502 19503 static const struct genl_ops nl80211_ops[] = { 19504 { 19505 .cmd = NL80211_CMD_GET_WIPHY, 19506 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19507 .doit = nl80211_get_wiphy, 19508 .dumpit = nl80211_dump_wiphy, 19509 .done = nl80211_dump_wiphy_done, 19510 /* can be retrieved by unprivileged users */ 19511 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 19512 }, 19513 }; 19514 19515 static const struct genl_small_ops nl80211_small_ops[] = { 19516 { 19517 .cmd = NL80211_CMD_SET_WIPHY, 19518 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19519 .doit = nl80211_set_wiphy, 19520 .flags = GENL_UNS_ADMIN_PERM, 19521 }, 19522 { 19523 .cmd = NL80211_CMD_GET_INTERFACE, 19524 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19525 .doit = nl80211_get_interface, 19526 .dumpit = nl80211_dump_interface, 19527 /* can be retrieved by unprivileged users */ 19528 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV), 19529 }, 19530 { 19531 .cmd = NL80211_CMD_SET_INTERFACE, 19532 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19533 .doit = nl80211_set_interface, 19534 .flags = GENL_UNS_ADMIN_PERM, 19535 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 19536 NL80211_FLAG_NEED_RTNL), 19537 }, 19538 { 19539 .cmd = NL80211_CMD_NEW_INTERFACE, 19540 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19541 .doit = nl80211_new_interface, 19542 .flags = GENL_UNS_ADMIN_PERM, 19543 .internal_flags = 19544 IFLAGS(NL80211_FLAG_NEED_WIPHY | 19545 NL80211_FLAG_NEED_RTNL | 19546 /* we take the wiphy mutex later ourselves */ 19547 NL80211_FLAG_NO_WIPHY_MTX), 19548 }, 19549 { 19550 .cmd = NL80211_CMD_DEL_INTERFACE, 19551 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19552 .doit = nl80211_del_interface, 19553 .flags = GENL_UNS_ADMIN_PERM, 19554 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 19555 NL80211_FLAG_NEED_RTNL), 19556 }, 19557 { 19558 .cmd = NL80211_CMD_GET_KEY, 19559 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19560 .doit = nl80211_get_key, 19561 .flags = GENL_UNS_ADMIN_PERM, 19562 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19563 }, 19564 { 19565 .cmd = NL80211_CMD_SET_KEY, 19566 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19567 .doit = nl80211_set_key, 19568 .flags = GENL_UNS_ADMIN_PERM, 19569 /* cannot use NL80211_FLAG_MLO_VALID_LINK_ID, depends on key */ 19570 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 19571 NL80211_FLAG_CLEAR_SKB), 19572 }, 19573 { 19574 .cmd = NL80211_CMD_NEW_KEY, 19575 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19576 .doit = nl80211_new_key, 19577 .flags = GENL_UNS_ADMIN_PERM, 19578 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 19579 NL80211_FLAG_CLEAR_SKB), 19580 }, 19581 { 19582 .cmd = NL80211_CMD_DEL_KEY, 19583 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19584 .doit = nl80211_del_key, 19585 .flags = GENL_UNS_ADMIN_PERM, 19586 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19587 }, 19588 { 19589 .cmd = NL80211_CMD_SET_BEACON, 19590 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19591 .flags = GENL_UNS_ADMIN_PERM, 19592 .doit = nl80211_set_beacon, 19593 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19594 NL80211_FLAG_MLO_VALID_LINK_ID), 19595 }, 19596 { 19597 .cmd = NL80211_CMD_START_AP, 19598 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19599 .flags = GENL_UNS_ADMIN_PERM, 19600 .doit = nl80211_start_ap, 19601 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19602 NL80211_FLAG_MLO_VALID_LINK_ID), 19603 }, 19604 { 19605 .cmd = NL80211_CMD_STOP_AP, 19606 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19607 .flags = GENL_UNS_ADMIN_PERM, 19608 .doit = nl80211_stop_ap, 19609 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19610 NL80211_FLAG_MLO_VALID_LINK_ID), 19611 }, 19612 { 19613 .cmd = NL80211_CMD_GET_STATION, 19614 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19615 .doit = nl80211_get_station, 19616 .dumpit = nl80211_dump_station, 19617 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV), 19618 }, 19619 { 19620 .cmd = NL80211_CMD_SET_STATION, 19621 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19622 .doit = nl80211_set_station, 19623 .flags = GENL_UNS_ADMIN_PERM, 19624 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19625 }, 19626 { 19627 .cmd = NL80211_CMD_NEW_STATION, 19628 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19629 .doit = nl80211_new_station, 19630 .flags = GENL_UNS_ADMIN_PERM, 19631 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19632 }, 19633 { 19634 .cmd = NL80211_CMD_DEL_STATION, 19635 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19636 .doit = nl80211_del_station, 19637 .flags = GENL_UNS_ADMIN_PERM, 19638 /* cannot use NL80211_FLAG_MLO_VALID_LINK_ID, depends on 19639 * whether MAC address is passed or not. If MAC address is 19640 * passed, then even during MLO, link ID is not required. 19641 */ 19642 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19643 }, 19644 { 19645 .cmd = NL80211_CMD_GET_MPATH, 19646 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19647 .doit = nl80211_get_mpath, 19648 .dumpit = nl80211_dump_mpath, 19649 .flags = GENL_UNS_ADMIN_PERM, 19650 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19651 }, 19652 { 19653 .cmd = NL80211_CMD_GET_MPP, 19654 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19655 .doit = nl80211_get_mpp, 19656 .dumpit = nl80211_dump_mpp, 19657 .flags = GENL_UNS_ADMIN_PERM, 19658 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19659 }, 19660 { 19661 .cmd = NL80211_CMD_SET_MPATH, 19662 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19663 .doit = nl80211_set_mpath, 19664 .flags = GENL_UNS_ADMIN_PERM, 19665 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19666 }, 19667 { 19668 .cmd = NL80211_CMD_NEW_MPATH, 19669 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19670 .doit = nl80211_new_mpath, 19671 .flags = GENL_UNS_ADMIN_PERM, 19672 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19673 }, 19674 { 19675 .cmd = NL80211_CMD_DEL_MPATH, 19676 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19677 .doit = nl80211_del_mpath, 19678 .flags = GENL_UNS_ADMIN_PERM, 19679 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19680 }, 19681 { 19682 .cmd = NL80211_CMD_SET_BSS, 19683 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19684 .doit = nl80211_set_bss, 19685 .flags = GENL_UNS_ADMIN_PERM, 19686 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19687 NL80211_FLAG_MLO_VALID_LINK_ID), 19688 }, 19689 { 19690 .cmd = NL80211_CMD_GET_REG, 19691 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19692 .doit = nl80211_get_reg_do, 19693 .dumpit = nl80211_get_reg_dump, 19694 /* can be retrieved by unprivileged users */ 19695 }, 19696 #ifdef CONFIG_CFG80211_CRDA_SUPPORT 19697 { 19698 .cmd = NL80211_CMD_SET_REG, 19699 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19700 .doit = nl80211_set_reg, 19701 .flags = GENL_ADMIN_PERM, 19702 }, 19703 #endif 19704 { 19705 .cmd = NL80211_CMD_REQ_SET_REG, 19706 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19707 .doit = nl80211_req_set_reg, 19708 .flags = GENL_ADMIN_PERM, 19709 }, 19710 { 19711 .cmd = NL80211_CMD_RELOAD_REGDB, 19712 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19713 .doit = nl80211_reload_regdb, 19714 .flags = GENL_ADMIN_PERM, 19715 }, 19716 { 19717 .cmd = NL80211_CMD_GET_MESH_CONFIG, 19718 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19719 .doit = nl80211_get_mesh_config, 19720 /* can be retrieved by unprivileged users */ 19721 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19722 }, 19723 { 19724 .cmd = NL80211_CMD_SET_MESH_CONFIG, 19725 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19726 .doit = nl80211_update_mesh_config, 19727 .flags = GENL_UNS_ADMIN_PERM, 19728 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19729 }, 19730 { 19731 .cmd = NL80211_CMD_TRIGGER_SCAN, 19732 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19733 .doit = nl80211_trigger_scan, 19734 .flags = GENL_UNS_ADMIN_PERM, 19735 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19736 }, 19737 { 19738 .cmd = NL80211_CMD_ABORT_SCAN, 19739 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19740 .doit = nl80211_abort_scan, 19741 .flags = GENL_UNS_ADMIN_PERM, 19742 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19743 }, 19744 { 19745 .cmd = NL80211_CMD_GET_SCAN, 19746 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19747 .dumpit = nl80211_dump_scan, 19748 }, 19749 { 19750 .cmd = NL80211_CMD_START_SCHED_SCAN, 19751 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19752 .doit = nl80211_start_sched_scan, 19753 .flags = GENL_UNS_ADMIN_PERM, 19754 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19755 }, 19756 { 19757 .cmd = NL80211_CMD_STOP_SCHED_SCAN, 19758 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19759 .doit = nl80211_stop_sched_scan, 19760 .flags = GENL_UNS_ADMIN_PERM, 19761 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19762 }, 19763 { 19764 .cmd = NL80211_CMD_AUTHENTICATE, 19765 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19766 .doit = nl80211_authenticate, 19767 .flags = GENL_UNS_ADMIN_PERM, 19768 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19769 NL80211_FLAG_CLEAR_SKB), 19770 }, 19771 { 19772 .cmd = NL80211_CMD_ASSOCIATE, 19773 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19774 .doit = nl80211_associate, 19775 .flags = GENL_UNS_ADMIN_PERM, 19776 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19777 NL80211_FLAG_CLEAR_SKB), 19778 }, 19779 { 19780 .cmd = NL80211_CMD_DEAUTHENTICATE, 19781 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19782 .doit = nl80211_deauthenticate, 19783 .flags = GENL_UNS_ADMIN_PERM, 19784 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19785 }, 19786 { 19787 .cmd = NL80211_CMD_DISASSOCIATE, 19788 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19789 .doit = nl80211_disassociate, 19790 .flags = GENL_UNS_ADMIN_PERM, 19791 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19792 }, 19793 { 19794 .cmd = NL80211_CMD_JOIN_IBSS, 19795 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19796 .doit = nl80211_join_ibss, 19797 .flags = GENL_UNS_ADMIN_PERM, 19798 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19799 }, 19800 { 19801 .cmd = NL80211_CMD_LEAVE_IBSS, 19802 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19803 .doit = nl80211_leave_ibss, 19804 .flags = GENL_UNS_ADMIN_PERM, 19805 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19806 }, 19807 #ifdef CONFIG_NL80211_TESTMODE 19808 { 19809 .cmd = NL80211_CMD_TESTMODE, 19810 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19811 .doit = nl80211_testmode_do, 19812 .dumpit = nl80211_testmode_dump, 19813 .flags = GENL_UNS_ADMIN_PERM, 19814 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 19815 }, 19816 #endif 19817 { 19818 .cmd = NL80211_CMD_CONNECT, 19819 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19820 .doit = nl80211_connect, 19821 .flags = GENL_UNS_ADMIN_PERM, 19822 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19823 NL80211_FLAG_CLEAR_SKB), 19824 }, 19825 { 19826 .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS, 19827 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19828 .doit = nl80211_update_connect_params, 19829 .flags = GENL_ADMIN_PERM, 19830 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19831 NL80211_FLAG_CLEAR_SKB), 19832 }, 19833 { 19834 .cmd = NL80211_CMD_DISCONNECT, 19835 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19836 .doit = nl80211_disconnect, 19837 .flags = GENL_UNS_ADMIN_PERM, 19838 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19839 }, 19840 { 19841 .cmd = NL80211_CMD_SET_WIPHY_NETNS, 19842 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19843 .doit = nl80211_wiphy_netns, 19844 .flags = GENL_UNS_ADMIN_PERM, 19845 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY | 19846 NL80211_FLAG_NEED_RTNL | 19847 NL80211_FLAG_NO_WIPHY_MTX), 19848 }, 19849 { 19850 .cmd = NL80211_CMD_GET_SURVEY, 19851 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19852 .dumpit = nl80211_dump_survey, 19853 }, 19854 { 19855 .cmd = NL80211_CMD_SET_PMKSA, 19856 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19857 .doit = nl80211_set_pmksa, 19858 .flags = GENL_UNS_ADMIN_PERM, 19859 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 19860 NL80211_FLAG_CLEAR_SKB), 19861 }, 19862 { 19863 .cmd = NL80211_CMD_DEL_PMKSA, 19864 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19865 .doit = nl80211_del_pmksa, 19866 .flags = GENL_UNS_ADMIN_PERM, 19867 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19868 }, 19869 { 19870 .cmd = NL80211_CMD_FLUSH_PMKSA, 19871 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19872 .doit = nl80211_flush_pmksa, 19873 .flags = GENL_UNS_ADMIN_PERM, 19874 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19875 }, 19876 { 19877 .cmd = NL80211_CMD_REMAIN_ON_CHANNEL, 19878 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19879 .doit = nl80211_remain_on_channel, 19880 .flags = GENL_UNS_ADMIN_PERM, 19881 /* FIXME: requiring a link ID here is probably not good */ 19882 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 19883 NL80211_FLAG_MLO_VALID_LINK_ID), 19884 }, 19885 { 19886 .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 19887 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19888 .doit = nl80211_cancel_remain_on_channel, 19889 .flags = GENL_UNS_ADMIN_PERM, 19890 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19891 }, 19892 { 19893 .cmd = NL80211_CMD_SET_TX_BITRATE_MASK, 19894 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19895 .doit = nl80211_set_tx_bitrate_mask, 19896 .flags = GENL_UNS_ADMIN_PERM, 19897 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 19898 NL80211_FLAG_MLO_VALID_LINK_ID), 19899 }, 19900 { 19901 .cmd = NL80211_CMD_REGISTER_FRAME, 19902 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19903 .doit = nl80211_register_mgmt, 19904 .flags = GENL_UNS_ADMIN_PERM, 19905 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV), 19906 }, 19907 { 19908 .cmd = NL80211_CMD_FRAME, 19909 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19910 .doit = nl80211_tx_mgmt, 19911 .flags = GENL_UNS_ADMIN_PERM, 19912 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19913 }, 19914 { 19915 .cmd = NL80211_CMD_FRAME_WAIT_CANCEL, 19916 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19917 .doit = nl80211_tx_mgmt_cancel_wait, 19918 .flags = GENL_UNS_ADMIN_PERM, 19919 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 19920 }, 19921 { 19922 .cmd = NL80211_CMD_SET_POWER_SAVE, 19923 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19924 .doit = nl80211_set_power_save, 19925 .flags = GENL_UNS_ADMIN_PERM, 19926 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 19927 }, 19928 { 19929 .cmd = NL80211_CMD_GET_POWER_SAVE, 19930 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19931 .doit = nl80211_get_power_save, 19932 /* can be retrieved by unprivileged users */ 19933 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 19934 }, 19935 { 19936 .cmd = NL80211_CMD_SET_CQM, 19937 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19938 .doit = nl80211_set_cqm, 19939 .flags = GENL_UNS_ADMIN_PERM, 19940 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 19941 }, 19942 { 19943 .cmd = NL80211_CMD_SET_CHANNEL, 19944 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19945 .doit = nl80211_set_channel, 19946 .flags = GENL_UNS_ADMIN_PERM, 19947 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 19948 NL80211_FLAG_MLO_VALID_LINK_ID), 19949 }, 19950 { 19951 .cmd = NL80211_CMD_JOIN_MESH, 19952 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19953 .doit = nl80211_join_mesh, 19954 .flags = GENL_UNS_ADMIN_PERM, 19955 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19956 }, 19957 { 19958 .cmd = NL80211_CMD_LEAVE_MESH, 19959 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19960 .doit = nl80211_leave_mesh, 19961 .flags = GENL_UNS_ADMIN_PERM, 19962 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19963 }, 19964 { 19965 .cmd = NL80211_CMD_JOIN_OCB, 19966 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19967 .doit = nl80211_join_ocb, 19968 .flags = GENL_UNS_ADMIN_PERM, 19969 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19970 }, 19971 { 19972 .cmd = NL80211_CMD_LEAVE_OCB, 19973 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19974 .doit = nl80211_leave_ocb, 19975 .flags = GENL_UNS_ADMIN_PERM, 19976 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 19977 }, 19978 #ifdef CONFIG_PM 19979 { 19980 .cmd = NL80211_CMD_GET_WOWLAN, 19981 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19982 .doit = nl80211_get_wowlan, 19983 /* can be retrieved by unprivileged users */ 19984 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 19985 }, 19986 { 19987 .cmd = NL80211_CMD_SET_WOWLAN, 19988 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19989 .doit = nl80211_set_wowlan, 19990 .flags = GENL_UNS_ADMIN_PERM, 19991 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 19992 }, 19993 #endif 19994 { 19995 .cmd = NL80211_CMD_SET_REKEY_OFFLOAD, 19996 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 19997 .doit = nl80211_set_rekey_data, 19998 .flags = GENL_UNS_ADMIN_PERM, 19999 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20000 NL80211_FLAG_CLEAR_SKB), 20001 }, 20002 { 20003 .cmd = NL80211_CMD_TDLS_MGMT, 20004 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20005 .doit = nl80211_tdls_mgmt, 20006 .flags = GENL_UNS_ADMIN_PERM, 20007 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20008 NL80211_FLAG_MLO_VALID_LINK_ID), 20009 }, 20010 { 20011 .cmd = NL80211_CMD_TDLS_OPER, 20012 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20013 .doit = nl80211_tdls_oper, 20014 .flags = GENL_UNS_ADMIN_PERM, 20015 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20016 }, 20017 { 20018 .cmd = NL80211_CMD_UNEXPECTED_FRAME, 20019 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20020 .doit = nl80211_register_unexpected_frame, 20021 .flags = GENL_UNS_ADMIN_PERM, 20022 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20023 }, 20024 { 20025 .cmd = NL80211_CMD_PROBE_CLIENT, 20026 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20027 .doit = nl80211_probe_client, 20028 .flags = GENL_UNS_ADMIN_PERM, 20029 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20030 }, 20031 { 20032 .cmd = NL80211_CMD_REGISTER_BEACONS, 20033 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20034 .doit = nl80211_register_beacons, 20035 .flags = GENL_UNS_ADMIN_PERM, 20036 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20037 }, 20038 { 20039 .cmd = NL80211_CMD_SET_NOACK_MAP, 20040 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20041 .doit = nl80211_set_noack_map, 20042 .flags = GENL_UNS_ADMIN_PERM, 20043 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20044 }, 20045 { 20046 .cmd = NL80211_CMD_START_P2P_DEVICE, 20047 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20048 .doit = nl80211_start_p2p_device, 20049 .flags = GENL_UNS_ADMIN_PERM, 20050 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 20051 NL80211_FLAG_NEED_RTNL), 20052 }, 20053 { 20054 .cmd = NL80211_CMD_STOP_P2P_DEVICE, 20055 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20056 .doit = nl80211_stop_p2p_device, 20057 .flags = GENL_UNS_ADMIN_PERM, 20058 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 20059 NL80211_FLAG_NEED_RTNL), 20060 }, 20061 { 20062 .cmd = NL80211_CMD_START_NAN, 20063 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20064 .doit = nl80211_start_nan, 20065 .flags = GENL_ADMIN_PERM, 20066 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 20067 NL80211_FLAG_NEED_RTNL), 20068 }, 20069 { 20070 .cmd = NL80211_CMD_STOP_NAN, 20071 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20072 .doit = nl80211_stop_nan, 20073 .flags = GENL_ADMIN_PERM, 20074 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 20075 NL80211_FLAG_NO_WIPHY_MTX | 20076 NL80211_FLAG_NEED_RTNL), 20077 }, 20078 { 20079 .cmd = NL80211_CMD_ADD_NAN_FUNCTION, 20080 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20081 .doit = nl80211_nan_add_func, 20082 .flags = GENL_ADMIN_PERM, 20083 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20084 }, 20085 { 20086 .cmd = NL80211_CMD_DEL_NAN_FUNCTION, 20087 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20088 .doit = nl80211_nan_del_func, 20089 .flags = GENL_ADMIN_PERM, 20090 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20091 }, 20092 { 20093 .cmd = NL80211_CMD_CHANGE_NAN_CONFIG, 20094 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20095 .doit = nl80211_nan_change_config, 20096 .flags = GENL_ADMIN_PERM, 20097 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20098 }, 20099 { 20100 .cmd = NL80211_CMD_START_PD, 20101 .doit = nl80211_start_pd, 20102 .flags = GENL_ADMIN_PERM, 20103 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 20104 NL80211_FLAG_NEED_RTNL), 20105 }, 20106 { 20107 .cmd = NL80211_CMD_STOP_PD, 20108 .doit = nl80211_stop_pd, 20109 .flags = GENL_ADMIN_PERM, 20110 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 20111 NL80211_FLAG_NEED_RTNL), 20112 }, 20113 { 20114 .cmd = NL80211_CMD_SET_MCAST_RATE, 20115 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20116 .doit = nl80211_set_mcast_rate, 20117 .flags = GENL_UNS_ADMIN_PERM, 20118 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20119 }, 20120 { 20121 .cmd = NL80211_CMD_SET_MAC_ACL, 20122 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20123 .doit = nl80211_set_mac_acl, 20124 .flags = GENL_UNS_ADMIN_PERM, 20125 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 20126 NL80211_FLAG_MLO_UNSUPPORTED), 20127 }, 20128 { 20129 .cmd = NL80211_CMD_RADAR_DETECT, 20130 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20131 .doit = nl80211_start_radar_detection, 20132 .flags = GENL_UNS_ADMIN_PERM, 20133 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20134 NL80211_FLAG_NO_WIPHY_MTX | 20135 NL80211_FLAG_MLO_VALID_LINK_ID), 20136 }, 20137 { 20138 .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES, 20139 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20140 .doit = nl80211_get_protocol_features, 20141 }, 20142 { 20143 .cmd = NL80211_CMD_UPDATE_FT_IES, 20144 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20145 .doit = nl80211_update_ft_ies, 20146 .flags = GENL_UNS_ADMIN_PERM, 20147 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20148 }, 20149 { 20150 .cmd = NL80211_CMD_CRIT_PROTOCOL_START, 20151 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20152 .doit = nl80211_crit_protocol_start, 20153 .flags = GENL_UNS_ADMIN_PERM, 20154 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20155 }, 20156 { 20157 .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP, 20158 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20159 .doit = nl80211_crit_protocol_stop, 20160 .flags = GENL_UNS_ADMIN_PERM, 20161 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20162 }, 20163 { 20164 .cmd = NL80211_CMD_GET_COALESCE, 20165 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20166 .doit = nl80211_get_coalesce, 20167 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20168 }, 20169 { 20170 .cmd = NL80211_CMD_SET_COALESCE, 20171 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20172 .doit = nl80211_set_coalesce, 20173 .flags = GENL_UNS_ADMIN_PERM, 20174 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 20175 }, 20176 { 20177 .cmd = NL80211_CMD_CHANNEL_SWITCH, 20178 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20179 .doit = nl80211_channel_switch, 20180 .flags = GENL_UNS_ADMIN_PERM, 20181 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20182 NL80211_FLAG_MLO_VALID_LINK_ID), 20183 }, 20184 { 20185 .cmd = NL80211_CMD_VENDOR, 20186 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20187 .doit = nl80211_vendor_cmd, 20188 .dumpit = nl80211_vendor_cmd_dump, 20189 .flags = GENL_UNS_ADMIN_PERM, 20190 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY | 20191 NL80211_FLAG_CLEAR_SKB), 20192 }, 20193 { 20194 .cmd = NL80211_CMD_SET_QOS_MAP, 20195 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20196 .doit = nl80211_set_qos_map, 20197 .flags = GENL_UNS_ADMIN_PERM, 20198 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20199 }, 20200 { 20201 .cmd = NL80211_CMD_ADD_TX_TS, 20202 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20203 .doit = nl80211_add_tx_ts, 20204 .flags = GENL_UNS_ADMIN_PERM, 20205 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20206 NL80211_FLAG_MLO_UNSUPPORTED), 20207 }, 20208 { 20209 .cmd = NL80211_CMD_DEL_TX_TS, 20210 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20211 .doit = nl80211_del_tx_ts, 20212 .flags = GENL_UNS_ADMIN_PERM, 20213 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20214 }, 20215 { 20216 .cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH, 20217 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20218 .doit = nl80211_tdls_channel_switch, 20219 .flags = GENL_UNS_ADMIN_PERM, 20220 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20221 }, 20222 { 20223 .cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, 20224 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20225 .doit = nl80211_tdls_cancel_channel_switch, 20226 .flags = GENL_UNS_ADMIN_PERM, 20227 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20228 }, 20229 { 20230 .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST, 20231 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20232 .doit = nl80211_set_multicast_to_unicast, 20233 .flags = GENL_UNS_ADMIN_PERM, 20234 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 20235 }, 20236 { 20237 .cmd = NL80211_CMD_SET_PMK, 20238 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20239 .doit = nl80211_set_pmk, 20240 .flags = GENL_UNS_ADMIN_PERM, 20241 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20242 NL80211_FLAG_CLEAR_SKB), 20243 }, 20244 { 20245 .cmd = NL80211_CMD_DEL_PMK, 20246 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20247 .doit = nl80211_del_pmk, 20248 .flags = GENL_UNS_ADMIN_PERM, 20249 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20250 }, 20251 { 20252 .cmd = NL80211_CMD_EXTERNAL_AUTH, 20253 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20254 .doit = nl80211_external_auth, 20255 .flags = GENL_ADMIN_PERM, 20256 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20257 }, 20258 { 20259 .cmd = NL80211_CMD_CONTROL_PORT_FRAME, 20260 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20261 .doit = nl80211_tx_control_port, 20262 .flags = GENL_UNS_ADMIN_PERM, 20263 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20264 }, 20265 { 20266 .cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS, 20267 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20268 .doit = nl80211_get_ftm_responder_stats, 20269 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 20270 NL80211_FLAG_MLO_VALID_LINK_ID), 20271 }, 20272 { 20273 .cmd = NL80211_CMD_PEER_MEASUREMENT_START, 20274 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20275 .doit = nl80211_pmsr_start, 20276 .flags = GENL_UNS_ADMIN_PERM, 20277 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20278 }, 20279 { 20280 .cmd = NL80211_CMD_NOTIFY_RADAR, 20281 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20282 .doit = nl80211_notify_radar_detection, 20283 .flags = GENL_UNS_ADMIN_PERM, 20284 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20285 }, 20286 { 20287 .cmd = NL80211_CMD_UPDATE_OWE_INFO, 20288 .doit = nl80211_update_owe_info, 20289 .flags = GENL_ADMIN_PERM, 20290 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20291 }, 20292 { 20293 .cmd = NL80211_CMD_PROBE_MESH_LINK, 20294 .doit = nl80211_probe_mesh_link, 20295 .flags = GENL_UNS_ADMIN_PERM, 20296 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20297 }, 20298 { 20299 .cmd = NL80211_CMD_SET_TID_CONFIG, 20300 .doit = nl80211_set_tid_config, 20301 .flags = GENL_UNS_ADMIN_PERM, 20302 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 20303 NL80211_FLAG_MLO_VALID_LINK_ID), 20304 }, 20305 { 20306 .cmd = NL80211_CMD_SET_SAR_SPECS, 20307 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20308 .doit = nl80211_set_sar_specs, 20309 .flags = GENL_UNS_ADMIN_PERM, 20310 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY | 20311 NL80211_FLAG_NEED_RTNL), 20312 }, 20313 { 20314 .cmd = NL80211_CMD_COLOR_CHANGE_REQUEST, 20315 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20316 .doit = nl80211_color_change, 20317 .flags = GENL_UNS_ADMIN_PERM, 20318 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20319 NL80211_FLAG_MLO_VALID_LINK_ID), 20320 }, 20321 { 20322 .cmd = NL80211_CMD_SET_FILS_AAD, 20323 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 20324 .doit = nl80211_set_fils_aad, 20325 .flags = GENL_UNS_ADMIN_PERM, 20326 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20327 }, 20328 { 20329 .cmd = NL80211_CMD_ADD_LINK, 20330 .doit = nl80211_add_link, 20331 .flags = GENL_UNS_ADMIN_PERM, 20332 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20333 }, 20334 { 20335 .cmd = NL80211_CMD_REMOVE_LINK, 20336 .doit = nl80211_remove_link, 20337 .flags = GENL_UNS_ADMIN_PERM, 20338 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20339 NL80211_FLAG_MLO_VALID_LINK_ID), 20340 }, 20341 { 20342 .cmd = NL80211_CMD_ADD_LINK_STA, 20343 .doit = nl80211_add_link_station, 20344 .flags = GENL_UNS_ADMIN_PERM, 20345 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20346 NL80211_FLAG_MLO_VALID_LINK_ID), 20347 }, 20348 { 20349 .cmd = NL80211_CMD_MODIFY_LINK_STA, 20350 .doit = nl80211_modify_link_station, 20351 .flags = GENL_UNS_ADMIN_PERM, 20352 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20353 NL80211_FLAG_MLO_VALID_LINK_ID), 20354 }, 20355 { 20356 .cmd = NL80211_CMD_REMOVE_LINK_STA, 20357 .doit = nl80211_remove_link_station, 20358 .flags = GENL_UNS_ADMIN_PERM, 20359 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 20360 NL80211_FLAG_MLO_VALID_LINK_ID), 20361 }, 20362 { 20363 .cmd = NL80211_CMD_SET_HW_TIMESTAMP, 20364 .doit = nl80211_set_hw_timestamp, 20365 .flags = GENL_UNS_ADMIN_PERM, 20366 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20367 }, 20368 { 20369 .cmd = NL80211_CMD_SET_TID_TO_LINK_MAPPING, 20370 .doit = nl80211_set_ttlm, 20371 .flags = GENL_UNS_ADMIN_PERM, 20372 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20373 }, 20374 { 20375 .cmd = NL80211_CMD_ASSOC_MLO_RECONF, 20376 .doit = nl80211_assoc_ml_reconf, 20377 .flags = GENL_UNS_ADMIN_PERM, 20378 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20379 }, 20380 { 20381 .cmd = NL80211_CMD_EPCS_CFG, 20382 .doit = nl80211_epcs_cfg, 20383 .flags = GENL_UNS_ADMIN_PERM, 20384 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 20385 }, 20386 { 20387 .cmd = NL80211_CMD_NAN_SET_LOCAL_SCHED, 20388 .doit = nl80211_nan_set_local_sched, 20389 .flags = GENL_ADMIN_PERM, 20390 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20391 }, 20392 { 20393 .cmd = NL80211_CMD_NAN_SET_PEER_SCHED, 20394 .doit = nl80211_nan_set_peer_sched, 20395 .flags = GENL_ADMIN_PERM, 20396 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 20397 }, 20398 }; 20399 20400 static struct genl_family nl80211_fam __ro_after_init = { 20401 .name = NL80211_GENL_NAME, /* have users key off the name instead */ 20402 .hdrsize = 0, /* no private header */ 20403 .version = 1, /* no particular meaning now */ 20404 .maxattr = NL80211_ATTR_MAX, 20405 .policy = nl80211_policy, 20406 .netnsok = true, 20407 .pre_doit = nl80211_pre_doit, 20408 .post_doit = nl80211_post_doit, 20409 .module = THIS_MODULE, 20410 .ops = nl80211_ops, 20411 .n_ops = ARRAY_SIZE(nl80211_ops), 20412 .small_ops = nl80211_small_ops, 20413 .n_small_ops = ARRAY_SIZE(nl80211_small_ops), 20414 .resv_start_op = NL80211_CMD_REMOVE_LINK_STA + 1, 20415 .mcgrps = nl80211_mcgrps, 20416 .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps), 20417 .parallel_ops = true, 20418 }; 20419 20420 /* notification functions */ 20421 20422 void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev, 20423 enum nl80211_commands cmd) 20424 { 20425 struct sk_buff *msg; 20426 struct nl80211_dump_wiphy_state state = {}; 20427 20428 WARN_ON(cmd != NL80211_CMD_NEW_WIPHY && 20429 cmd != NL80211_CMD_DEL_WIPHY); 20430 20431 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20432 if (!msg) 20433 return; 20434 20435 if (nl80211_send_wiphy(rdev, cmd, msg, 0, 0, 0, &state) < 0) { 20436 nlmsg_free(msg); 20437 return; 20438 } 20439 20440 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20441 NL80211_MCGRP_CONFIG, GFP_KERNEL); 20442 } 20443 20444 void nl80211_notify_iface(struct cfg80211_registered_device *rdev, 20445 struct wireless_dev *wdev, 20446 enum nl80211_commands cmd) 20447 { 20448 struct sk_buff *msg; 20449 20450 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20451 if (!msg) 20452 return; 20453 20454 if (nl80211_send_iface(msg, 0, 0, 0, rdev, wdev, cmd) < 0) { 20455 nlmsg_free(msg); 20456 return; 20457 } 20458 20459 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20460 NL80211_MCGRP_CONFIG, GFP_KERNEL); 20461 } 20462 20463 static int nl80211_add_scan_req(struct sk_buff *msg, 20464 struct cfg80211_registered_device *rdev) 20465 { 20466 struct cfg80211_scan_request_int *req = rdev->scan_req; 20467 struct nlattr *nest; 20468 int i; 20469 struct cfg80211_scan_info *info; 20470 20471 if (WARN_ON(!req)) 20472 return 0; 20473 20474 nest = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_SSIDS); 20475 if (!nest) 20476 goto nla_put_failure; 20477 for (i = 0; i < req->req.n_ssids; i++) { 20478 if (nla_put(msg, i, req->req.ssids[i].ssid_len, 20479 req->req.ssids[i].ssid)) 20480 goto nla_put_failure; 20481 } 20482 nla_nest_end(msg, nest); 20483 20484 if (req->req.flags & NL80211_SCAN_FLAG_FREQ_KHZ) { 20485 nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQ_KHZ); 20486 if (!nest) 20487 goto nla_put_failure; 20488 for (i = 0; i < req->req.n_channels; i++) { 20489 if (nla_put_u32(msg, i, 20490 ieee80211_channel_to_khz(req->req.channels[i]))) 20491 goto nla_put_failure; 20492 } 20493 nla_nest_end(msg, nest); 20494 } else { 20495 nest = nla_nest_start_noflag(msg, 20496 NL80211_ATTR_SCAN_FREQUENCIES); 20497 if (!nest) 20498 goto nla_put_failure; 20499 for (i = 0; i < req->req.n_channels; i++) { 20500 if (nla_put_u32(msg, i, 20501 req->req.channels[i]->center_freq)) 20502 goto nla_put_failure; 20503 } 20504 nla_nest_end(msg, nest); 20505 } 20506 20507 if (req->req.ie && 20508 nla_put(msg, NL80211_ATTR_IE, req->req.ie_len, req->req.ie)) 20509 goto nla_put_failure; 20510 20511 if (req->req.flags && 20512 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->req.flags)) 20513 goto nla_put_failure; 20514 20515 info = rdev->int_scan_req ? &rdev->int_scan_req->info : 20516 &rdev->scan_req->info; 20517 if (info->scan_start_tsf && 20518 (nla_put_u64_64bit(msg, NL80211_ATTR_SCAN_START_TIME_TSF, 20519 info->scan_start_tsf, NL80211_BSS_PAD) || 20520 nla_put(msg, NL80211_ATTR_SCAN_START_TIME_TSF_BSSID, ETH_ALEN, 20521 info->tsf_bssid))) 20522 goto nla_put_failure; 20523 20524 return 0; 20525 nla_put_failure: 20526 return -ENOBUFS; 20527 } 20528 20529 static int nl80211_prep_scan_msg(struct sk_buff *msg, 20530 struct cfg80211_registered_device *rdev, 20531 struct wireless_dev *wdev, 20532 u32 portid, u32 seq, int flags, 20533 u32 cmd) 20534 { 20535 void *hdr; 20536 20537 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 20538 if (!hdr) 20539 return -1; 20540 20541 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20542 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 20543 wdev->netdev->ifindex)) || 20544 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 20545 NL80211_ATTR_PAD)) 20546 goto nla_put_failure; 20547 20548 /* ignore errors and send incomplete event anyway */ 20549 nl80211_add_scan_req(msg, rdev); 20550 20551 genlmsg_end(msg, hdr); 20552 return 0; 20553 20554 nla_put_failure: 20555 genlmsg_cancel(msg, hdr); 20556 return -EMSGSIZE; 20557 } 20558 20559 static int 20560 nl80211_prep_sched_scan_msg(struct sk_buff *msg, 20561 struct cfg80211_sched_scan_request *req, u32 cmd) 20562 { 20563 void *hdr; 20564 20565 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 20566 if (!hdr) 20567 return -1; 20568 20569 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, 20570 wiphy_to_rdev(req->wiphy)->wiphy_idx) || 20571 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) || 20572 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid, 20573 NL80211_ATTR_PAD)) 20574 goto nla_put_failure; 20575 20576 genlmsg_end(msg, hdr); 20577 return 0; 20578 20579 nla_put_failure: 20580 genlmsg_cancel(msg, hdr); 20581 return -EMSGSIZE; 20582 } 20583 20584 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev, 20585 struct wireless_dev *wdev) 20586 { 20587 struct sk_buff *msg; 20588 20589 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20590 if (!msg) 20591 return; 20592 20593 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0, 20594 NL80211_CMD_TRIGGER_SCAN) < 0) { 20595 nlmsg_free(msg); 20596 return; 20597 } 20598 20599 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20600 NL80211_MCGRP_SCAN, GFP_KERNEL); 20601 } 20602 20603 struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev, 20604 struct wireless_dev *wdev, bool aborted) 20605 { 20606 struct sk_buff *msg; 20607 20608 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20609 if (!msg) 20610 return NULL; 20611 20612 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0, 20613 aborted ? NL80211_CMD_SCAN_ABORTED : 20614 NL80211_CMD_NEW_SCAN_RESULTS) < 0) { 20615 nlmsg_free(msg); 20616 return NULL; 20617 } 20618 20619 return msg; 20620 } 20621 20622 /* send message created by nl80211_build_scan_msg() */ 20623 void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev, 20624 struct sk_buff *msg) 20625 { 20626 if (!msg) 20627 return; 20628 20629 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20630 NL80211_MCGRP_SCAN, GFP_KERNEL); 20631 } 20632 20633 void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd) 20634 { 20635 struct sk_buff *msg; 20636 20637 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20638 if (!msg) 20639 return; 20640 20641 if (nl80211_prep_sched_scan_msg(msg, req, cmd) < 0) { 20642 nlmsg_free(msg); 20643 return; 20644 } 20645 20646 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0, 20647 NL80211_MCGRP_SCAN, GFP_KERNEL); 20648 } 20649 20650 static bool nl80211_reg_change_event_fill(struct sk_buff *msg, 20651 struct regulatory_request *request) 20652 { 20653 /* Userspace can always count this one always being set */ 20654 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) 20655 goto nla_put_failure; 20656 20657 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { 20658 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 20659 NL80211_REGDOM_TYPE_WORLD)) 20660 goto nla_put_failure; 20661 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { 20662 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 20663 NL80211_REGDOM_TYPE_CUSTOM_WORLD)) 20664 goto nla_put_failure; 20665 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || 20666 request->intersect) { 20667 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 20668 NL80211_REGDOM_TYPE_INTERSECTION)) 20669 goto nla_put_failure; 20670 } else { 20671 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 20672 NL80211_REGDOM_TYPE_COUNTRY) || 20673 nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, 20674 request->alpha2)) 20675 goto nla_put_failure; 20676 } 20677 20678 if (request->wiphy_idx != WIPHY_IDX_INVALID) { 20679 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx); 20680 20681 if (wiphy && 20682 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) 20683 goto nla_put_failure; 20684 20685 if (wiphy && 20686 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 20687 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 20688 goto nla_put_failure; 20689 } 20690 20691 return true; 20692 20693 nla_put_failure: 20694 return false; 20695 } 20696 20697 /* 20698 * This can happen on global regulatory changes or device specific settings 20699 * based on custom regulatory domains. 20700 */ 20701 void nl80211_common_reg_change_event(enum nl80211_commands cmd_id, 20702 struct regulatory_request *request) 20703 { 20704 struct sk_buff *msg; 20705 void *hdr; 20706 20707 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20708 if (!msg) 20709 return; 20710 20711 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd_id); 20712 if (!hdr) 20713 goto nla_put_failure; 20714 20715 if (!nl80211_reg_change_event_fill(msg, request)) 20716 goto nla_put_failure; 20717 20718 genlmsg_end(msg, hdr); 20719 20720 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 20721 NL80211_MCGRP_REGULATORY); 20722 20723 return; 20724 20725 nla_put_failure: 20726 nlmsg_free(msg); 20727 } 20728 20729 struct nl80211_mlme_event { 20730 enum nl80211_commands cmd; 20731 const u8 *buf; 20732 size_t buf_len; 20733 int uapsd_queues; 20734 const u8 *req_ies; 20735 size_t req_ies_len; 20736 bool reconnect; 20737 }; 20738 20739 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev, 20740 struct net_device *netdev, 20741 const struct nl80211_mlme_event *event, 20742 gfp_t gfp) 20743 { 20744 struct sk_buff *msg; 20745 void *hdr; 20746 20747 msg = nlmsg_new(100 + event->buf_len + event->req_ies_len, gfp); 20748 if (!msg) 20749 return; 20750 20751 hdr = nl80211hdr_put(msg, 0, 0, 0, event->cmd); 20752 if (!hdr) { 20753 nlmsg_free(msg); 20754 return; 20755 } 20756 20757 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20758 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 20759 nla_put(msg, NL80211_ATTR_FRAME, event->buf_len, event->buf) || 20760 (event->req_ies && 20761 nla_put(msg, NL80211_ATTR_REQ_IE, event->req_ies_len, 20762 event->req_ies))) 20763 goto nla_put_failure; 20764 20765 if (event->reconnect && 20766 nla_put_flag(msg, NL80211_ATTR_RECONNECT_REQUESTED)) 20767 goto nla_put_failure; 20768 20769 if (event->uapsd_queues >= 0) { 20770 struct nlattr *nla_wmm = 20771 nla_nest_start_noflag(msg, NL80211_ATTR_STA_WME); 20772 if (!nla_wmm) 20773 goto nla_put_failure; 20774 20775 if (nla_put_u8(msg, NL80211_STA_WME_UAPSD_QUEUES, 20776 event->uapsd_queues)) 20777 goto nla_put_failure; 20778 20779 nla_nest_end(msg, nla_wmm); 20780 } 20781 20782 genlmsg_end(msg, hdr); 20783 20784 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20785 NL80211_MCGRP_MLME, gfp); 20786 return; 20787 20788 nla_put_failure: 20789 nlmsg_free(msg); 20790 } 20791 20792 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev, 20793 struct net_device *netdev, const u8 *buf, 20794 size_t len, gfp_t gfp) 20795 { 20796 struct nl80211_mlme_event event = { 20797 .cmd = NL80211_CMD_AUTHENTICATE, 20798 .buf = buf, 20799 .buf_len = len, 20800 .uapsd_queues = -1, 20801 }; 20802 20803 nl80211_send_mlme_event(rdev, netdev, &event, gfp); 20804 } 20805 20806 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev, 20807 struct net_device *netdev, 20808 const struct cfg80211_rx_assoc_resp_data *data) 20809 { 20810 struct nl80211_mlme_event event = { 20811 .cmd = NL80211_CMD_ASSOCIATE, 20812 .buf = data->buf, 20813 .buf_len = data->len, 20814 .uapsd_queues = data->uapsd_queues, 20815 .req_ies = data->req_ies, 20816 .req_ies_len = data->req_ies_len, 20817 }; 20818 20819 nl80211_send_mlme_event(rdev, netdev, &event, GFP_KERNEL); 20820 } 20821 20822 void nl80211_send_deauth(struct cfg80211_registered_device *rdev, 20823 struct net_device *netdev, const u8 *buf, 20824 size_t len, bool reconnect, gfp_t gfp) 20825 { 20826 struct nl80211_mlme_event event = { 20827 .cmd = NL80211_CMD_DEAUTHENTICATE, 20828 .buf = buf, 20829 .buf_len = len, 20830 .reconnect = reconnect, 20831 .uapsd_queues = -1, 20832 }; 20833 20834 nl80211_send_mlme_event(rdev, netdev, &event, gfp); 20835 } 20836 20837 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev, 20838 struct net_device *netdev, const u8 *buf, 20839 size_t len, bool reconnect, gfp_t gfp) 20840 { 20841 struct nl80211_mlme_event event = { 20842 .cmd = NL80211_CMD_DISASSOCIATE, 20843 .buf = buf, 20844 .buf_len = len, 20845 .reconnect = reconnect, 20846 .uapsd_queues = -1, 20847 }; 20848 20849 nl80211_send_mlme_event(rdev, netdev, &event, gfp); 20850 } 20851 20852 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf, 20853 size_t len) 20854 { 20855 struct wireless_dev *wdev = dev->ieee80211_ptr; 20856 struct wiphy *wiphy = wdev->wiphy; 20857 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 20858 const struct ieee80211_mgmt *mgmt = (void *)buf; 20859 struct nl80211_mlme_event event = { 20860 .buf = buf, 20861 .buf_len = len, 20862 .uapsd_queues = -1, 20863 }; 20864 20865 if (WARN_ON(len < 2)) 20866 return; 20867 20868 if (ieee80211_is_deauth(mgmt->frame_control)) { 20869 event.cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE; 20870 } else if (ieee80211_is_disassoc(mgmt->frame_control)) { 20871 event.cmd = NL80211_CMD_UNPROT_DISASSOCIATE; 20872 } else if (ieee80211_is_beacon(mgmt->frame_control)) { 20873 if (wdev->unprot_beacon_reported && 20874 elapsed_jiffies_msecs(wdev->unprot_beacon_reported) < 10000) 20875 return; 20876 event.cmd = NL80211_CMD_UNPROT_BEACON; 20877 wdev->unprot_beacon_reported = jiffies; 20878 } else { 20879 return; 20880 } 20881 20882 trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len); 20883 nl80211_send_mlme_event(rdev, dev, &event, GFP_ATOMIC); 20884 } 20885 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt); 20886 20887 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev, 20888 struct net_device *netdev, int cmd, 20889 const u8 *addr, gfp_t gfp) 20890 { 20891 struct sk_buff *msg; 20892 void *hdr; 20893 20894 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 20895 if (!msg) 20896 return; 20897 20898 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 20899 if (!hdr) { 20900 nlmsg_free(msg); 20901 return; 20902 } 20903 20904 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20905 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 20906 nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 20907 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) 20908 goto nla_put_failure; 20909 20910 genlmsg_end(msg, hdr); 20911 20912 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20913 NL80211_MCGRP_MLME, gfp); 20914 return; 20915 20916 nla_put_failure: 20917 nlmsg_free(msg); 20918 } 20919 20920 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev, 20921 struct net_device *netdev, const u8 *addr, 20922 gfp_t gfp) 20923 { 20924 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE, 20925 addr, gfp); 20926 } 20927 20928 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev, 20929 struct net_device *netdev, const u8 *addr, 20930 gfp_t gfp) 20931 { 20932 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE, 20933 addr, gfp); 20934 } 20935 20936 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev, 20937 struct net_device *netdev, 20938 struct cfg80211_connect_resp_params *cr, 20939 gfp_t gfp) 20940 { 20941 struct sk_buff *msg; 20942 void *hdr; 20943 unsigned int link; 20944 size_t link_info_size = 0; 20945 const u8 *connected_addr = cr->valid_links ? 20946 cr->ap_mld_addr : cr->links[0].bssid; 20947 20948 if (cr->valid_links) { 20949 for_each_valid_link(cr, link) { 20950 /* Nested attribute header */ 20951 link_info_size += NLA_HDRLEN; 20952 /* Link ID */ 20953 link_info_size += nla_total_size(sizeof(u8)); 20954 link_info_size += cr->links[link].addr ? 20955 nla_total_size(ETH_ALEN) : 0; 20956 link_info_size += (cr->links[link].bssid || 20957 cr->links[link].bss) ? 20958 nla_total_size(ETH_ALEN) : 0; 20959 link_info_size += nla_total_size(sizeof(u16)); 20960 } 20961 } 20962 20963 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len + 20964 cr->fils.kek_len + cr->fils.pmk_len + 20965 (cr->fils.pmkid ? WLAN_PMKID_LEN : 0) + link_info_size, 20966 gfp); 20967 if (!msg) 20968 return; 20969 20970 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT); 20971 if (!hdr) { 20972 nlmsg_free(msg); 20973 return; 20974 } 20975 20976 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20977 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 20978 (connected_addr && 20979 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, connected_addr)) || 20980 nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, 20981 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE : 20982 cr->status) || 20983 (cr->status < 0 && 20984 (nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 20985 nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON, 20986 cr->timeout_reason))) || 20987 (cr->req_ie && 20988 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) || 20989 (cr->resp_ie && 20990 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len, 20991 cr->resp_ie)) || 20992 (cr->fils.update_erp_next_seq_num && 20993 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM, 20994 cr->fils.erp_next_seq_num)) || 20995 (cr->status == WLAN_STATUS_SUCCESS && 20996 ((cr->fils.kek && 20997 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len, 20998 cr->fils.kek)) || 20999 (cr->fils.pmk && 21000 nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) || 21001 (cr->fils.pmkid && 21002 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid)))) || 21003 (cr->assoc_encrypted && 21004 nla_put_flag(msg, NL80211_ATTR_ASSOC_ENCRYPTED))) 21005 goto nla_put_failure; 21006 21007 if (cr->valid_links) { 21008 int i = 1; 21009 struct nlattr *nested; 21010 21011 nested = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 21012 if (!nested) 21013 goto nla_put_failure; 21014 21015 for_each_valid_link(cr, link) { 21016 struct nlattr *nested_mlo_links; 21017 const u8 *bssid = cr->links[link].bss ? 21018 cr->links[link].bss->bssid : 21019 cr->links[link].bssid; 21020 21021 nested_mlo_links = nla_nest_start(msg, i); 21022 if (!nested_mlo_links) 21023 goto nla_put_failure; 21024 21025 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link) || 21026 (bssid && 21027 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, bssid)) || 21028 (cr->links[link].addr && 21029 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 21030 cr->links[link].addr)) || 21031 nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, 21032 cr->links[link].status)) 21033 goto nla_put_failure; 21034 21035 nla_nest_end(msg, nested_mlo_links); 21036 i++; 21037 } 21038 nla_nest_end(msg, nested); 21039 } 21040 21041 genlmsg_end(msg, hdr); 21042 21043 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21044 NL80211_MCGRP_MLME, gfp); 21045 return; 21046 21047 nla_put_failure: 21048 nlmsg_free(msg); 21049 } 21050 21051 void nl80211_send_roamed(struct cfg80211_registered_device *rdev, 21052 struct net_device *netdev, 21053 struct cfg80211_roam_info *info, gfp_t gfp) 21054 { 21055 struct sk_buff *msg; 21056 void *hdr; 21057 size_t link_info_size = 0; 21058 unsigned int link; 21059 const u8 *connected_addr = info->ap_mld_addr ? 21060 info->ap_mld_addr : 21061 (info->links[0].bss ? 21062 info->links[0].bss->bssid : 21063 info->links[0].bssid); 21064 21065 if (info->valid_links) { 21066 for_each_valid_link(info, link) { 21067 /* Nested attribute header */ 21068 link_info_size += NLA_HDRLEN; 21069 /* Link ID */ 21070 link_info_size += nla_total_size(sizeof(u8)); 21071 link_info_size += info->links[link].addr ? 21072 nla_total_size(ETH_ALEN) : 0; 21073 link_info_size += (info->links[link].bssid || 21074 info->links[link].bss) ? 21075 nla_total_size(ETH_ALEN) : 0; 21076 } 21077 } 21078 21079 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len + 21080 info->fils.kek_len + info->fils.pmk_len + 21081 (info->fils.pmkid ? WLAN_PMKID_LEN : 0) + 21082 link_info_size, gfp); 21083 if (!msg) 21084 return; 21085 21086 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM); 21087 if (!hdr) { 21088 nlmsg_free(msg); 21089 return; 21090 } 21091 21092 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21093 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21094 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, connected_addr) || 21095 (info->req_ie && 21096 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len, 21097 info->req_ie)) || 21098 (info->resp_ie && 21099 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len, 21100 info->resp_ie)) || 21101 (info->fils.update_erp_next_seq_num && 21102 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM, 21103 info->fils.erp_next_seq_num)) || 21104 (info->fils.kek && 21105 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len, 21106 info->fils.kek)) || 21107 (info->fils.pmk && 21108 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) || 21109 (info->fils.pmkid && 21110 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid))) 21111 goto nla_put_failure; 21112 21113 if (info->valid_links) { 21114 int i = 1; 21115 struct nlattr *nested; 21116 21117 nested = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 21118 if (!nested) 21119 goto nla_put_failure; 21120 21121 for_each_valid_link(info, link) { 21122 struct nlattr *nested_mlo_links; 21123 const u8 *bssid = info->links[link].bss ? 21124 info->links[link].bss->bssid : 21125 info->links[link].bssid; 21126 21127 nested_mlo_links = nla_nest_start(msg, i); 21128 if (!nested_mlo_links) 21129 goto nla_put_failure; 21130 21131 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link) || 21132 (bssid && 21133 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, bssid)) || 21134 (info->links[link].addr && 21135 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 21136 info->links[link].addr))) 21137 goto nla_put_failure; 21138 21139 nla_nest_end(msg, nested_mlo_links); 21140 i++; 21141 } 21142 nla_nest_end(msg, nested); 21143 } 21144 21145 genlmsg_end(msg, hdr); 21146 21147 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21148 NL80211_MCGRP_MLME, gfp); 21149 return; 21150 21151 nla_put_failure: 21152 nlmsg_free(msg); 21153 } 21154 21155 void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev, 21156 struct net_device *netdev, const u8 *peer_addr, 21157 const u8 *td_bitmap, u8 td_bitmap_len) 21158 { 21159 struct sk_buff *msg; 21160 void *hdr; 21161 21162 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 21163 if (!msg) 21164 return; 21165 21166 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PORT_AUTHORIZED); 21167 if (!hdr) { 21168 nlmsg_free(msg); 21169 return; 21170 } 21171 21172 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21173 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21174 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer_addr)) 21175 goto nla_put_failure; 21176 21177 if (td_bitmap_len > 0 && td_bitmap && 21178 nla_put(msg, NL80211_ATTR_TD_BITMAP, td_bitmap_len, td_bitmap)) 21179 goto nla_put_failure; 21180 21181 genlmsg_end(msg, hdr); 21182 21183 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21184 NL80211_MCGRP_MLME, GFP_KERNEL); 21185 return; 21186 21187 nla_put_failure: 21188 nlmsg_free(msg); 21189 } 21190 21191 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev, 21192 struct net_device *netdev, u16 reason, 21193 const u8 *ie, size_t ie_len, bool from_ap) 21194 { 21195 struct sk_buff *msg; 21196 void *hdr; 21197 21198 msg = nlmsg_new(100 + ie_len, GFP_KERNEL); 21199 if (!msg) 21200 return; 21201 21202 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT); 21203 if (!hdr) { 21204 nlmsg_free(msg); 21205 return; 21206 } 21207 21208 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21209 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21210 (reason && 21211 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) || 21212 (from_ap && 21213 nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) || 21214 (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie))) 21215 goto nla_put_failure; 21216 21217 genlmsg_end(msg, hdr); 21218 21219 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21220 NL80211_MCGRP_MLME, GFP_KERNEL); 21221 return; 21222 21223 nla_put_failure: 21224 nlmsg_free(msg); 21225 } 21226 21227 void cfg80211_links_removed(struct net_device *dev, u16 link_mask) 21228 { 21229 struct wireless_dev *wdev = dev->ieee80211_ptr; 21230 struct wiphy *wiphy = wdev->wiphy; 21231 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21232 struct sk_buff *msg; 21233 struct nlattr *links; 21234 void *hdr; 21235 21236 lockdep_assert_wiphy(wdev->wiphy); 21237 trace_cfg80211_links_removed(dev, link_mask); 21238 21239 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION && 21240 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)) 21241 return; 21242 21243 if (WARN_ON(!wdev->valid_links || !link_mask || 21244 (wdev->valid_links & link_mask) != link_mask || 21245 wdev->valid_links == link_mask)) 21246 return; 21247 21248 cfg80211_wdev_release_link_bsses(wdev, link_mask); 21249 wdev->valid_links &= ~link_mask; 21250 21251 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 21252 if (!msg) 21253 return; 21254 21255 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_LINKS_REMOVED); 21256 if (!hdr) { 21257 nlmsg_free(msg); 21258 return; 21259 } 21260 21261 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21262 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 21263 goto nla_put_failure; 21264 21265 links = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 21266 if (!links) 21267 goto nla_put_failure; 21268 21269 while (link_mask) { 21270 struct nlattr *link; 21271 int link_id = __ffs(link_mask); 21272 21273 link = nla_nest_start(msg, link_id + 1); 21274 if (!link) 21275 goto nla_put_failure; 21276 21277 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 21278 goto nla_put_failure; 21279 21280 nla_nest_end(msg, link); 21281 link_mask &= ~(1 << link_id); 21282 } 21283 21284 nla_nest_end(msg, links); 21285 21286 genlmsg_end(msg, hdr); 21287 21288 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21289 NL80211_MCGRP_MLME, GFP_KERNEL); 21290 return; 21291 21292 nla_put_failure: 21293 nlmsg_free(msg); 21294 } 21295 EXPORT_SYMBOL(cfg80211_links_removed); 21296 21297 void nl80211_mlo_reconf_add_done(struct net_device *dev, 21298 struct cfg80211_mlo_reconf_done_data *data) 21299 { 21300 struct wireless_dev *wdev = dev->ieee80211_ptr; 21301 struct wiphy *wiphy = wdev->wiphy; 21302 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21303 struct nl80211_mlme_event event = { 21304 .cmd = NL80211_CMD_ASSOC_MLO_RECONF, 21305 .buf = data->buf, 21306 .buf_len = data->len, 21307 .uapsd_queues = -1, 21308 }; 21309 21310 nl80211_send_mlme_event(rdev, dev, &event, GFP_KERNEL); 21311 } 21312 EXPORT_SYMBOL(nl80211_mlo_reconf_add_done); 21313 21314 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev, 21315 struct net_device *netdev, const u8 *bssid, 21316 gfp_t gfp) 21317 { 21318 struct sk_buff *msg; 21319 void *hdr; 21320 21321 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21322 if (!msg) 21323 return; 21324 21325 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS); 21326 if (!hdr) { 21327 nlmsg_free(msg); 21328 return; 21329 } 21330 21331 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21332 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21333 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 21334 goto nla_put_failure; 21335 21336 genlmsg_end(msg, hdr); 21337 21338 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21339 NL80211_MCGRP_MLME, gfp); 21340 return; 21341 21342 nla_put_failure: 21343 nlmsg_free(msg); 21344 } 21345 21346 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr, 21347 const u8 *ie, u8 ie_len, 21348 int sig_dbm, gfp_t gfp) 21349 { 21350 struct wireless_dev *wdev = dev->ieee80211_ptr; 21351 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 21352 struct sk_buff *msg; 21353 void *hdr; 21354 21355 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) 21356 return; 21357 21358 trace_cfg80211_notify_new_peer_candidate(dev, addr); 21359 21360 msg = nlmsg_new(100 + ie_len, gfp); 21361 if (!msg) 21362 return; 21363 21364 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE); 21365 if (!hdr) { 21366 nlmsg_free(msg); 21367 return; 21368 } 21369 21370 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21371 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 21372 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 21373 (ie_len && ie && 21374 nla_put(msg, NL80211_ATTR_IE, ie_len, ie)) || 21375 (sig_dbm && 21376 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm))) 21377 goto nla_put_failure; 21378 21379 genlmsg_end(msg, hdr); 21380 21381 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21382 NL80211_MCGRP_MLME, gfp); 21383 return; 21384 21385 nla_put_failure: 21386 nlmsg_free(msg); 21387 } 21388 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate); 21389 21390 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev, 21391 struct net_device *netdev, const u8 *addr, 21392 enum nl80211_key_type key_type, int key_id, 21393 const u8 *tsc, gfp_t gfp) 21394 { 21395 struct sk_buff *msg; 21396 void *hdr; 21397 21398 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21399 if (!msg) 21400 return; 21401 21402 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE); 21403 if (!hdr) { 21404 nlmsg_free(msg); 21405 return; 21406 } 21407 21408 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21409 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21410 (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) || 21411 nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) || 21412 (key_id != -1 && 21413 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) || 21414 (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc))) 21415 goto nla_put_failure; 21416 21417 genlmsg_end(msg, hdr); 21418 21419 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21420 NL80211_MCGRP_MLME, gfp); 21421 return; 21422 21423 nla_put_failure: 21424 nlmsg_free(msg); 21425 } 21426 21427 void nl80211_send_beacon_hint_event(struct wiphy *wiphy, 21428 struct ieee80211_channel *channel_before, 21429 struct ieee80211_channel *channel_after) 21430 { 21431 struct sk_buff *msg; 21432 void *hdr; 21433 struct nlattr *nl_freq; 21434 21435 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); 21436 if (!msg) 21437 return; 21438 21439 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT); 21440 if (!hdr) { 21441 nlmsg_free(msg); 21442 return; 21443 } 21444 21445 /* 21446 * Since we are applying the beacon hint to a wiphy we know its 21447 * wiphy_idx is valid 21448 */ 21449 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 21450 goto nla_put_failure; 21451 21452 /* Before */ 21453 nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_BEFORE); 21454 if (!nl_freq) 21455 goto nla_put_failure; 21456 21457 if (nl80211_msg_put_channel(msg, wiphy, channel_before, false)) 21458 goto nla_put_failure; 21459 nla_nest_end(msg, nl_freq); 21460 21461 /* After */ 21462 nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_AFTER); 21463 if (!nl_freq) 21464 goto nla_put_failure; 21465 21466 if (nl80211_msg_put_channel(msg, wiphy, channel_after, false)) 21467 goto nla_put_failure; 21468 nla_nest_end(msg, nl_freq); 21469 21470 genlmsg_end(msg, hdr); 21471 21472 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 21473 NL80211_MCGRP_REGULATORY); 21474 21475 return; 21476 21477 nla_put_failure: 21478 nlmsg_free(msg); 21479 } 21480 21481 static void nl80211_send_remain_on_chan_event( 21482 int cmd, struct cfg80211_registered_device *rdev, 21483 struct wireless_dev *wdev, u64 cookie, 21484 struct ieee80211_channel *chan, 21485 unsigned int duration, gfp_t gfp) 21486 { 21487 struct sk_buff *msg; 21488 void *hdr; 21489 21490 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21491 if (!msg) 21492 return; 21493 21494 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 21495 if (!hdr) { 21496 nlmsg_free(msg); 21497 return; 21498 } 21499 21500 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21501 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 21502 wdev->netdev->ifindex)) || 21503 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 21504 NL80211_ATTR_PAD) || 21505 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || 21506 nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 21507 NL80211_CHAN_NO_HT) || 21508 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 21509 NL80211_ATTR_PAD)) 21510 goto nla_put_failure; 21511 21512 if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL && 21513 nla_put_u32(msg, NL80211_ATTR_DURATION, duration)) 21514 goto nla_put_failure; 21515 21516 genlmsg_end(msg, hdr); 21517 21518 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21519 NL80211_MCGRP_MLME, gfp); 21520 return; 21521 21522 nla_put_failure: 21523 nlmsg_free(msg); 21524 } 21525 21526 void cfg80211_assoc_comeback(struct net_device *netdev, 21527 const u8 *ap_addr, u32 timeout) 21528 { 21529 struct wireless_dev *wdev = netdev->ieee80211_ptr; 21530 struct wiphy *wiphy = wdev->wiphy; 21531 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21532 struct sk_buff *msg; 21533 void *hdr; 21534 21535 trace_cfg80211_assoc_comeback(wdev, ap_addr, timeout); 21536 21537 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 21538 if (!msg) 21539 return; 21540 21541 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ASSOC_COMEBACK); 21542 if (!hdr) { 21543 nlmsg_free(msg); 21544 return; 21545 } 21546 21547 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21548 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 21549 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ap_addr) || 21550 nla_put_u32(msg, NL80211_ATTR_TIMEOUT, timeout)) 21551 goto nla_put_failure; 21552 21553 genlmsg_end(msg, hdr); 21554 21555 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21556 NL80211_MCGRP_MLME, GFP_KERNEL); 21557 return; 21558 21559 nla_put_failure: 21560 nlmsg_free(msg); 21561 } 21562 EXPORT_SYMBOL(cfg80211_assoc_comeback); 21563 21564 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie, 21565 struct ieee80211_channel *chan, 21566 unsigned int duration, gfp_t gfp) 21567 { 21568 struct wiphy *wiphy = wdev->wiphy; 21569 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21570 21571 trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration); 21572 nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL, 21573 rdev, wdev, cookie, chan, 21574 duration, gfp); 21575 } 21576 EXPORT_SYMBOL(cfg80211_ready_on_channel); 21577 21578 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie, 21579 struct ieee80211_channel *chan, 21580 gfp_t gfp) 21581 { 21582 struct wiphy *wiphy = wdev->wiphy; 21583 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21584 21585 trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan); 21586 nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 21587 rdev, wdev, cookie, chan, 0, gfp); 21588 } 21589 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired); 21590 21591 void cfg80211_tx_mgmt_expired(struct wireless_dev *wdev, u64 cookie, 21592 struct ieee80211_channel *chan, 21593 gfp_t gfp) 21594 { 21595 struct wiphy *wiphy = wdev->wiphy; 21596 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21597 21598 trace_cfg80211_tx_mgmt_expired(wdev, cookie, chan); 21599 nl80211_send_remain_on_chan_event(NL80211_CMD_FRAME_WAIT_CANCEL, 21600 rdev, wdev, cookie, chan, 0, gfp); 21601 } 21602 EXPORT_SYMBOL(cfg80211_tx_mgmt_expired); 21603 21604 void cfg80211_new_sta(struct wireless_dev *wdev, const u8 *mac_addr, 21605 struct station_info *sinfo, gfp_t gfp) 21606 { 21607 struct wiphy *wiphy = wdev->wiphy; 21608 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21609 struct sk_buff *msg; 21610 21611 trace_cfg80211_new_sta(wdev, mac_addr, sinfo); 21612 21613 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21614 if (!msg) 21615 return; 21616 21617 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 0, 0, 0, 21618 rdev, wdev, mac_addr, sinfo, false) < 0) { 21619 nlmsg_free(msg); 21620 return; 21621 } 21622 21623 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21624 NL80211_MCGRP_MLME, gfp); 21625 } 21626 EXPORT_SYMBOL(cfg80211_new_sta); 21627 21628 void cfg80211_del_sta_sinfo(struct wireless_dev *wdev, const u8 *mac_addr, 21629 struct station_info *sinfo, gfp_t gfp) 21630 { 21631 struct wiphy *wiphy = wdev->wiphy; 21632 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21633 struct sk_buff *msg; 21634 struct station_info empty_sinfo = {}; 21635 21636 if (!sinfo) 21637 sinfo = &empty_sinfo; 21638 21639 trace_cfg80211_del_sta(wdev, mac_addr); 21640 21641 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21642 if (!msg) { 21643 cfg80211_sinfo_release_content(sinfo); 21644 return; 21645 } 21646 21647 if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0, 21648 rdev, wdev, mac_addr, sinfo, false) < 0) { 21649 nlmsg_free(msg); 21650 return; 21651 } 21652 21653 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21654 NL80211_MCGRP_MLME, gfp); 21655 } 21656 EXPORT_SYMBOL(cfg80211_del_sta_sinfo); 21657 21658 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr, 21659 enum nl80211_connect_failed_reason reason, 21660 gfp_t gfp) 21661 { 21662 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 21663 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21664 struct sk_buff *msg; 21665 void *hdr; 21666 21667 msg = nlmsg_new(NLMSG_GOODSIZE, gfp); 21668 if (!msg) 21669 return; 21670 21671 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED); 21672 if (!hdr) { 21673 nlmsg_free(msg); 21674 return; 21675 } 21676 21677 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 21678 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 21679 nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason)) 21680 goto nla_put_failure; 21681 21682 genlmsg_end(msg, hdr); 21683 21684 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21685 NL80211_MCGRP_MLME, gfp); 21686 return; 21687 21688 nla_put_failure: 21689 nlmsg_free(msg); 21690 } 21691 EXPORT_SYMBOL(cfg80211_conn_failed); 21692 21693 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd, 21694 const u8 *addr, int link_id, gfp_t gfp) 21695 { 21696 struct wireless_dev *wdev = dev->ieee80211_ptr; 21697 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 21698 struct sk_buff *msg; 21699 void *hdr; 21700 u32 nlportid = READ_ONCE(wdev->unexpected_nlportid); 21701 21702 if (!nlportid) 21703 return false; 21704 21705 msg = nlmsg_new(100, gfp); 21706 if (!msg) 21707 return true; 21708 21709 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 21710 if (!hdr) { 21711 nlmsg_free(msg); 21712 return true; 21713 } 21714 21715 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21716 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 21717 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 21718 (link_id >= 0 && 21719 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))) 21720 goto nla_put_failure; 21721 21722 genlmsg_end(msg, hdr); 21723 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 21724 return true; 21725 21726 nla_put_failure: 21727 nlmsg_free(msg); 21728 return true; 21729 } 21730 21731 bool cfg80211_rx_spurious_frame(struct net_device *dev, const u8 *addr, 21732 int link_id, gfp_t gfp) 21733 { 21734 struct wireless_dev *wdev = dev->ieee80211_ptr; 21735 bool ret; 21736 21737 trace_cfg80211_rx_spurious_frame(dev, addr, link_id); 21738 21739 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 21740 wdev->iftype != NL80211_IFTYPE_P2P_GO && 21741 wdev->iftype != NL80211_IFTYPE_NAN_DATA)) { 21742 trace_cfg80211_return_bool(false); 21743 return false; 21744 } 21745 ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME, 21746 addr, link_id, gfp); 21747 trace_cfg80211_return_bool(ret); 21748 return ret; 21749 } 21750 EXPORT_SYMBOL(cfg80211_rx_spurious_frame); 21751 21752 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev, const u8 *addr, 21753 int link_id, gfp_t gfp) 21754 { 21755 struct wireless_dev *wdev = dev->ieee80211_ptr; 21756 bool ret; 21757 21758 trace_cfg80211_rx_unexpected_4addr_frame(dev, addr, link_id); 21759 21760 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 21761 wdev->iftype != NL80211_IFTYPE_P2P_GO && 21762 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { 21763 trace_cfg80211_return_bool(false); 21764 return false; 21765 } 21766 ret = __nl80211_unexpected_frame(dev, 21767 NL80211_CMD_UNEXPECTED_4ADDR_FRAME, 21768 addr, link_id, gfp); 21769 trace_cfg80211_return_bool(ret); 21770 return ret; 21771 } 21772 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame); 21773 21774 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, 21775 struct wireless_dev *wdev, u32 nlportid, 21776 struct cfg80211_rx_info *info, gfp_t gfp) 21777 { 21778 struct net_device *netdev = wdev->netdev; 21779 struct sk_buff *msg; 21780 void *hdr; 21781 21782 msg = nlmsg_new(100 + info->len, gfp); 21783 if (!msg) 21784 return -ENOMEM; 21785 21786 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 21787 if (!hdr) { 21788 nlmsg_free(msg); 21789 return -ENOMEM; 21790 } 21791 21792 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21793 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 21794 netdev->ifindex)) || 21795 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 21796 NL80211_ATTR_PAD) || 21797 (info->have_link_id && 21798 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, info->link_id)) || 21799 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, KHZ_TO_MHZ(info->freq)) || 21800 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, info->freq % 1000) || 21801 (info->sig_dbm && 21802 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, info->sig_dbm)) || 21803 nla_put(msg, NL80211_ATTR_FRAME, info->len, info->buf) || 21804 (info->flags && 21805 nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, info->flags)) || 21806 (info->rx_tstamp && nla_put_u64_64bit(msg, 21807 NL80211_ATTR_RX_HW_TIMESTAMP, 21808 info->rx_tstamp, 21809 NL80211_ATTR_PAD)) || 21810 (info->ack_tstamp && nla_put_u64_64bit(msg, 21811 NL80211_ATTR_TX_HW_TIMESTAMP, 21812 info->ack_tstamp, 21813 NL80211_ATTR_PAD))) 21814 goto nla_put_failure; 21815 21816 genlmsg_end(msg, hdr); 21817 21818 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 21819 21820 nla_put_failure: 21821 nlmsg_free(msg); 21822 return -ENOBUFS; 21823 } 21824 21825 static void nl80211_frame_tx_status(struct wireless_dev *wdev, 21826 struct cfg80211_tx_status *status, 21827 gfp_t gfp, enum nl80211_commands command) 21828 { 21829 struct wiphy *wiphy = wdev->wiphy; 21830 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 21831 struct net_device *netdev = wdev->netdev; 21832 struct sk_buff *msg; 21833 void *hdr; 21834 21835 if (command == NL80211_CMD_FRAME_TX_STATUS) 21836 trace_cfg80211_mgmt_tx_status(wdev, status->cookie, 21837 status->ack); 21838 else 21839 trace_cfg80211_control_port_tx_status(wdev, status->cookie, 21840 status->ack); 21841 21842 msg = nlmsg_new(100 + status->len, gfp); 21843 if (!msg) 21844 return; 21845 21846 hdr = nl80211hdr_put(msg, 0, 0, 0, command); 21847 if (!hdr) { 21848 nlmsg_free(msg); 21849 return; 21850 } 21851 21852 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21853 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 21854 netdev->ifindex)) || 21855 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 21856 NL80211_ATTR_PAD) || 21857 nla_put(msg, NL80211_ATTR_FRAME, status->len, status->buf) || 21858 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, status->cookie, 21859 NL80211_ATTR_PAD) || 21860 (status->ack && nla_put_flag(msg, NL80211_ATTR_ACK)) || 21861 (status->tx_tstamp && 21862 nla_put_u64_64bit(msg, NL80211_ATTR_TX_HW_TIMESTAMP, 21863 status->tx_tstamp, NL80211_ATTR_PAD)) || 21864 (status->ack_tstamp && 21865 nla_put_u64_64bit(msg, NL80211_ATTR_RX_HW_TIMESTAMP, 21866 status->ack_tstamp, NL80211_ATTR_PAD))) 21867 goto nla_put_failure; 21868 21869 genlmsg_end(msg, hdr); 21870 21871 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 21872 NL80211_MCGRP_MLME, gfp); 21873 return; 21874 21875 nla_put_failure: 21876 nlmsg_free(msg); 21877 } 21878 21879 void cfg80211_control_port_tx_status(struct wireless_dev *wdev, u64 cookie, 21880 const u8 *buf, size_t len, bool ack, 21881 gfp_t gfp) 21882 { 21883 struct cfg80211_tx_status status = { 21884 .cookie = cookie, 21885 .buf = buf, 21886 .len = len, 21887 .ack = ack 21888 }; 21889 21890 nl80211_frame_tx_status(wdev, &status, gfp, 21891 NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS); 21892 } 21893 EXPORT_SYMBOL(cfg80211_control_port_tx_status); 21894 21895 void cfg80211_mgmt_tx_status_ext(struct wireless_dev *wdev, 21896 struct cfg80211_tx_status *status, gfp_t gfp) 21897 { 21898 nl80211_frame_tx_status(wdev, status, gfp, NL80211_CMD_FRAME_TX_STATUS); 21899 } 21900 EXPORT_SYMBOL(cfg80211_mgmt_tx_status_ext); 21901 21902 static int __nl80211_rx_control_port(struct net_device *dev, 21903 struct sk_buff *skb, 21904 bool unencrypted, 21905 int link_id, 21906 gfp_t gfp) 21907 { 21908 struct wireless_dev *wdev = dev->ieee80211_ptr; 21909 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 21910 struct ethhdr *ehdr = eth_hdr(skb); 21911 const u8 *addr = ehdr->h_source; 21912 u16 proto = be16_to_cpu(skb->protocol); 21913 struct sk_buff *msg; 21914 void *hdr; 21915 struct nlattr *frame; 21916 21917 u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); 21918 21919 if (!nlportid) 21920 return -ENOENT; 21921 21922 msg = nlmsg_new(100 + skb->len, gfp); 21923 if (!msg) 21924 return -ENOMEM; 21925 21926 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONTROL_PORT_FRAME); 21927 if (!hdr) { 21928 nlmsg_free(msg); 21929 return -ENOBUFS; 21930 } 21931 21932 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21933 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 21934 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 21935 NL80211_ATTR_PAD) || 21936 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 21937 nla_put_u16(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE, proto) || 21938 (link_id >= 0 && 21939 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) || 21940 (unencrypted && nla_put_flag(msg, 21941 NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT))) 21942 goto nla_put_failure; 21943 21944 frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len); 21945 if (!frame) 21946 goto nla_put_failure; 21947 21948 skb_copy_bits(skb, 0, nla_data(frame), skb->len); 21949 genlmsg_end(msg, hdr); 21950 21951 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 21952 21953 nla_put_failure: 21954 nlmsg_free(msg); 21955 return -ENOBUFS; 21956 } 21957 21958 bool cfg80211_rx_control_port(struct net_device *dev, struct sk_buff *skb, 21959 bool unencrypted, int link_id) 21960 { 21961 int ret; 21962 21963 trace_cfg80211_rx_control_port(dev, skb, unencrypted, link_id); 21964 ret = __nl80211_rx_control_port(dev, skb, unencrypted, link_id, 21965 GFP_ATOMIC); 21966 trace_cfg80211_return_bool(ret == 0); 21967 return ret == 0; 21968 } 21969 EXPORT_SYMBOL(cfg80211_rx_control_port); 21970 21971 static struct sk_buff *cfg80211_prepare_cqm(struct net_device *dev, 21972 const char *mac, gfp_t gfp) 21973 { 21974 struct wireless_dev *wdev = dev->ieee80211_ptr; 21975 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 21976 struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 21977 void **cb; 21978 21979 if (!msg) 21980 return NULL; 21981 21982 cb = (void **)msg->cb; 21983 21984 cb[0] = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM); 21985 if (!cb[0]) { 21986 nlmsg_free(msg); 21987 return NULL; 21988 } 21989 21990 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 21991 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 21992 goto nla_put_failure; 21993 21994 if (mac && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac)) 21995 goto nla_put_failure; 21996 21997 cb[1] = nla_nest_start_noflag(msg, NL80211_ATTR_CQM); 21998 if (!cb[1]) 21999 goto nla_put_failure; 22000 22001 cb[2] = rdev; 22002 22003 return msg; 22004 nla_put_failure: 22005 nlmsg_free(msg); 22006 return NULL; 22007 } 22008 22009 static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp) 22010 { 22011 void **cb = (void **)msg->cb; 22012 struct cfg80211_registered_device *rdev = cb[2]; 22013 22014 nla_nest_end(msg, cb[1]); 22015 genlmsg_end(msg, cb[0]); 22016 22017 memset(msg->cb, 0, sizeof(msg->cb)); 22018 22019 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22020 NL80211_MCGRP_MLME, gfp); 22021 } 22022 22023 void cfg80211_cqm_rssi_notify(struct net_device *dev, 22024 enum nl80211_cqm_rssi_threshold_event rssi_event, 22025 s32 rssi_level, gfp_t gfp) 22026 { 22027 struct wireless_dev *wdev = dev->ieee80211_ptr; 22028 struct cfg80211_cqm_config *cqm_config; 22029 22030 trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level); 22031 22032 if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW && 22033 rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH)) 22034 return; 22035 22036 rcu_read_lock(); 22037 cqm_config = rcu_dereference(wdev->cqm_config); 22038 if (cqm_config) { 22039 cqm_config->last_rssi_event_value = rssi_level; 22040 cqm_config->last_rssi_event_type = rssi_event; 22041 wiphy_work_queue(wdev->wiphy, &wdev->cqm_rssi_work); 22042 } 22043 rcu_read_unlock(); 22044 } 22045 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify); 22046 22047 void cfg80211_cqm_rssi_notify_work(struct wiphy *wiphy, struct wiphy_work *work) 22048 { 22049 struct wireless_dev *wdev = container_of(work, struct wireless_dev, 22050 cqm_rssi_work); 22051 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22052 enum nl80211_cqm_rssi_threshold_event rssi_event; 22053 struct cfg80211_cqm_config *cqm_config; 22054 struct sk_buff *msg; 22055 s32 rssi_level; 22056 22057 cqm_config = wiphy_dereference(wdev->wiphy, wdev->cqm_config); 22058 if (!cqm_config) 22059 return; 22060 22061 if (cqm_config->use_range_api) 22062 cfg80211_cqm_rssi_update(rdev, wdev->netdev, cqm_config); 22063 22064 rssi_level = cqm_config->last_rssi_event_value; 22065 rssi_event = cqm_config->last_rssi_event_type; 22066 22067 msg = cfg80211_prepare_cqm(wdev->netdev, NULL, GFP_KERNEL); 22068 if (!msg) 22069 return; 22070 22071 if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT, 22072 rssi_event)) 22073 goto nla_put_failure; 22074 22075 if (rssi_level && nla_put_s32(msg, NL80211_ATTR_CQM_RSSI_LEVEL, 22076 rssi_level)) 22077 goto nla_put_failure; 22078 22079 cfg80211_send_cqm(msg, GFP_KERNEL); 22080 22081 return; 22082 22083 nla_put_failure: 22084 nlmsg_free(msg); 22085 } 22086 22087 void cfg80211_cqm_txe_notify(struct net_device *dev, 22088 const u8 *peer, u32 num_packets, 22089 u32 rate, u32 intvl, gfp_t gfp) 22090 { 22091 struct sk_buff *msg; 22092 22093 msg = cfg80211_prepare_cqm(dev, peer, gfp); 22094 if (!msg) 22095 return; 22096 22097 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets)) 22098 goto nla_put_failure; 22099 22100 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate)) 22101 goto nla_put_failure; 22102 22103 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl)) 22104 goto nla_put_failure; 22105 22106 cfg80211_send_cqm(msg, gfp); 22107 return; 22108 22109 nla_put_failure: 22110 nlmsg_free(msg); 22111 } 22112 EXPORT_SYMBOL(cfg80211_cqm_txe_notify); 22113 22114 void cfg80211_cqm_pktloss_notify(struct net_device *dev, 22115 const u8 *peer, u32 num_packets, gfp_t gfp) 22116 { 22117 struct sk_buff *msg; 22118 22119 trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets); 22120 22121 msg = cfg80211_prepare_cqm(dev, peer, gfp); 22122 if (!msg) 22123 return; 22124 22125 if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets)) 22126 goto nla_put_failure; 22127 22128 cfg80211_send_cqm(msg, gfp); 22129 return; 22130 22131 nla_put_failure: 22132 nlmsg_free(msg); 22133 } 22134 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify); 22135 22136 void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp) 22137 { 22138 struct sk_buff *msg; 22139 22140 msg = cfg80211_prepare_cqm(dev, NULL, gfp); 22141 if (!msg) 22142 return; 22143 22144 if (nla_put_flag(msg, NL80211_ATTR_CQM_BEACON_LOSS_EVENT)) 22145 goto nla_put_failure; 22146 22147 cfg80211_send_cqm(msg, gfp); 22148 return; 22149 22150 nla_put_failure: 22151 nlmsg_free(msg); 22152 } 22153 EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify); 22154 22155 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev, 22156 struct net_device *netdev, const u8 *bssid, 22157 const u8 *replay_ctr, gfp_t gfp) 22158 { 22159 struct sk_buff *msg; 22160 struct nlattr *rekey_attr; 22161 void *hdr; 22162 22163 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22164 if (!msg) 22165 return; 22166 22167 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD); 22168 if (!hdr) { 22169 nlmsg_free(msg); 22170 return; 22171 } 22172 22173 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22174 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 22175 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 22176 goto nla_put_failure; 22177 22178 rekey_attr = nla_nest_start_noflag(msg, NL80211_ATTR_REKEY_DATA); 22179 if (!rekey_attr) 22180 goto nla_put_failure; 22181 22182 if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR, 22183 NL80211_REPLAY_CTR_LEN, replay_ctr)) 22184 goto nla_put_failure; 22185 22186 nla_nest_end(msg, rekey_attr); 22187 22188 genlmsg_end(msg, hdr); 22189 22190 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22191 NL80211_MCGRP_MLME, gfp); 22192 return; 22193 22194 nla_put_failure: 22195 nlmsg_free(msg); 22196 } 22197 22198 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid, 22199 const u8 *replay_ctr, gfp_t gfp) 22200 { 22201 struct wireless_dev *wdev = dev->ieee80211_ptr; 22202 struct wiphy *wiphy = wdev->wiphy; 22203 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22204 22205 trace_cfg80211_gtk_rekey_notify(dev, bssid); 22206 nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp); 22207 } 22208 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify); 22209 22210 static void 22211 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev, 22212 struct net_device *netdev, int index, 22213 const u8 *bssid, bool preauth, gfp_t gfp) 22214 { 22215 struct sk_buff *msg; 22216 struct nlattr *attr; 22217 void *hdr; 22218 22219 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22220 if (!msg) 22221 return; 22222 22223 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE); 22224 if (!hdr) { 22225 nlmsg_free(msg); 22226 return; 22227 } 22228 22229 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22230 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 22231 goto nla_put_failure; 22232 22233 attr = nla_nest_start_noflag(msg, NL80211_ATTR_PMKSA_CANDIDATE); 22234 if (!attr) 22235 goto nla_put_failure; 22236 22237 if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) || 22238 nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) || 22239 (preauth && 22240 nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH))) 22241 goto nla_put_failure; 22242 22243 nla_nest_end(msg, attr); 22244 22245 genlmsg_end(msg, hdr); 22246 22247 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22248 NL80211_MCGRP_MLME, gfp); 22249 return; 22250 22251 nla_put_failure: 22252 nlmsg_free(msg); 22253 } 22254 22255 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index, 22256 const u8 *bssid, bool preauth, gfp_t gfp) 22257 { 22258 struct wireless_dev *wdev = dev->ieee80211_ptr; 22259 struct wiphy *wiphy = wdev->wiphy; 22260 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22261 22262 trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth); 22263 nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp); 22264 } 22265 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify); 22266 22267 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev, 22268 struct net_device *netdev, 22269 unsigned int link_id, 22270 struct cfg80211_chan_def *chandef, 22271 gfp_t gfp, 22272 enum nl80211_commands notif, 22273 u8 count, bool quiet) 22274 { 22275 struct wireless_dev *wdev = netdev->ieee80211_ptr; 22276 struct sk_buff *msg; 22277 void *hdr; 22278 22279 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22280 if (!msg) 22281 return; 22282 22283 hdr = nl80211hdr_put(msg, 0, 0, 0, notif); 22284 if (!hdr) { 22285 nlmsg_free(msg); 22286 return; 22287 } 22288 22289 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 22290 goto nla_put_failure; 22291 22292 if (wdev->valid_links && 22293 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 22294 goto nla_put_failure; 22295 22296 if (nl80211_send_chandef(msg, chandef)) 22297 goto nla_put_failure; 22298 22299 if (notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) { 22300 if (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count)) 22301 goto nla_put_failure; 22302 if (quiet && 22303 nla_put_flag(msg, NL80211_ATTR_CH_SWITCH_BLOCK_TX)) 22304 goto nla_put_failure; 22305 } 22306 22307 genlmsg_end(msg, hdr); 22308 22309 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22310 NL80211_MCGRP_MLME, gfp); 22311 return; 22312 22313 nla_put_failure: 22314 nlmsg_free(msg); 22315 } 22316 22317 void cfg80211_ch_switch_notify(struct net_device *dev, 22318 struct cfg80211_chan_def *chandef, 22319 unsigned int link_id) 22320 { 22321 struct wireless_dev *wdev = dev->ieee80211_ptr; 22322 struct wiphy *wiphy = wdev->wiphy; 22323 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22324 22325 lockdep_assert_wiphy(wdev->wiphy); 22326 WARN_INVALID_LINK_ID(wdev, link_id); 22327 22328 trace_cfg80211_ch_switch_notify(dev, chandef, link_id); 22329 22330 switch (wdev->iftype) { 22331 case NL80211_IFTYPE_STATION: 22332 case NL80211_IFTYPE_P2P_CLIENT: 22333 if (!WARN_ON(!wdev->links[link_id].client.current_bss)) 22334 cfg80211_update_assoc_bss_entry(wdev, link_id, 22335 chandef->chan); 22336 break; 22337 case NL80211_IFTYPE_MESH_POINT: 22338 wdev->u.mesh.chandef = *chandef; 22339 wdev->u.mesh.preset_chandef = *chandef; 22340 break; 22341 case NL80211_IFTYPE_AP: 22342 case NL80211_IFTYPE_P2P_GO: 22343 wdev->links[link_id].ap.chandef = *chandef; 22344 break; 22345 case NL80211_IFTYPE_ADHOC: 22346 wdev->u.ibss.chandef = *chandef; 22347 break; 22348 default: 22349 WARN_ON(1); 22350 break; 22351 } 22352 22353 cfg80211_schedule_channels_check(wdev); 22354 cfg80211_sched_dfs_chan_update(rdev); 22355 22356 nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL, 22357 NL80211_CMD_CH_SWITCH_NOTIFY, 0, false); 22358 } 22359 EXPORT_SYMBOL(cfg80211_ch_switch_notify); 22360 22361 void cfg80211_incumbent_signal_notify(struct wiphy *wiphy, 22362 const struct cfg80211_chan_def *chandef, 22363 u32 signal_interference_bitmap, 22364 gfp_t gfp) 22365 { 22366 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22367 struct sk_buff *msg; 22368 void *hdr; 22369 22370 trace_cfg80211_incumbent_signal_notify(wiphy, chandef, signal_interference_bitmap); 22371 22372 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22373 if (!msg) 22374 return; 22375 22376 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_INCUMBENT_SIGNAL_DETECT); 22377 if (!hdr) 22378 goto nla_put_failure; 22379 22380 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 22381 goto nla_put_failure; 22382 22383 if (nl80211_send_chandef(msg, chandef)) 22384 goto nla_put_failure; 22385 22386 if (nla_put_u32(msg, NL80211_ATTR_INCUMBENT_SIGNAL_INTERFERENCE_BITMAP, 22387 signal_interference_bitmap)) 22388 goto nla_put_failure; 22389 22390 genlmsg_end(msg, hdr); 22391 22392 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22393 NL80211_MCGRP_MLME, gfp); 22394 return; 22395 22396 nla_put_failure: 22397 nlmsg_free(msg); 22398 } 22399 EXPORT_SYMBOL(cfg80211_incumbent_signal_notify); 22400 22401 void cfg80211_ch_switch_started_notify(struct net_device *dev, 22402 struct cfg80211_chan_def *chandef, 22403 unsigned int link_id, u8 count, 22404 bool quiet) 22405 { 22406 struct wireless_dev *wdev = dev->ieee80211_ptr; 22407 struct wiphy *wiphy = wdev->wiphy; 22408 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22409 22410 lockdep_assert_wiphy(wdev->wiphy); 22411 WARN_INVALID_LINK_ID(wdev, link_id); 22412 22413 trace_cfg80211_ch_switch_started_notify(dev, chandef, link_id); 22414 22415 22416 nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL, 22417 NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, 22418 count, quiet); 22419 } 22420 EXPORT_SYMBOL(cfg80211_ch_switch_started_notify); 22421 22422 int cfg80211_bss_color_notify(struct net_device *dev, 22423 enum nl80211_commands cmd, u8 count, 22424 u64 color_bitmap, u8 link_id) 22425 { 22426 struct wireless_dev *wdev = dev->ieee80211_ptr; 22427 struct wiphy *wiphy = wdev->wiphy; 22428 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22429 struct sk_buff *msg; 22430 void *hdr; 22431 22432 lockdep_assert_wiphy(wdev->wiphy); 22433 22434 trace_cfg80211_bss_color_notify(dev, cmd, count, color_bitmap); 22435 22436 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 22437 if (!msg) 22438 return -ENOMEM; 22439 22440 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 22441 if (!hdr) 22442 goto nla_put_failure; 22443 22444 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 22445 goto nla_put_failure; 22446 22447 if (wdev->valid_links && 22448 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 22449 goto nla_put_failure; 22450 22451 if (cmd == NL80211_CMD_COLOR_CHANGE_STARTED && 22452 nla_put_u32(msg, NL80211_ATTR_COLOR_CHANGE_COUNT, count)) 22453 goto nla_put_failure; 22454 22455 if (cmd == NL80211_CMD_OBSS_COLOR_COLLISION && 22456 nla_put_u64_64bit(msg, NL80211_ATTR_OBSS_COLOR_BITMAP, 22457 color_bitmap, NL80211_ATTR_PAD)) 22458 goto nla_put_failure; 22459 22460 genlmsg_end(msg, hdr); 22461 22462 return genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 22463 msg, 0, NL80211_MCGRP_MLME, GFP_KERNEL); 22464 22465 nla_put_failure: 22466 nlmsg_free(msg); 22467 return -EINVAL; 22468 } 22469 EXPORT_SYMBOL(cfg80211_bss_color_notify); 22470 22471 void 22472 nl80211_radar_notify(struct cfg80211_registered_device *rdev, 22473 const struct cfg80211_chan_def *chandef, 22474 enum nl80211_radar_event event, 22475 struct net_device *netdev, gfp_t gfp) 22476 { 22477 struct sk_buff *msg; 22478 void *hdr; 22479 22480 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22481 if (!msg) 22482 return; 22483 22484 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT); 22485 if (!hdr) { 22486 nlmsg_free(msg); 22487 return; 22488 } 22489 22490 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 22491 goto nla_put_failure; 22492 22493 /* NOP and radar events don't need a netdev parameter */ 22494 if (netdev) { 22495 struct wireless_dev *wdev = netdev->ieee80211_ptr; 22496 22497 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 22498 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22499 NL80211_ATTR_PAD)) 22500 goto nla_put_failure; 22501 } 22502 22503 if (rdev->background_radar_wdev && 22504 cfg80211_chandef_identical(&rdev->background_radar_chandef, 22505 chandef)) { 22506 if (nla_put_flag(msg, NL80211_ATTR_RADAR_BACKGROUND)) 22507 goto nla_put_failure; 22508 } 22509 22510 if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event)) 22511 goto nla_put_failure; 22512 22513 if (nl80211_send_chandef(msg, chandef)) 22514 goto nla_put_failure; 22515 22516 genlmsg_end(msg, hdr); 22517 22518 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22519 NL80211_MCGRP_MLME, gfp); 22520 return; 22521 22522 nla_put_failure: 22523 nlmsg_free(msg); 22524 } 22525 22526 void cfg80211_sta_opmode_change_notify(struct net_device *dev, const u8 *mac, 22527 struct sta_opmode_info *sta_opmode, 22528 gfp_t gfp) 22529 { 22530 struct sk_buff *msg; 22531 struct wireless_dev *wdev = dev->ieee80211_ptr; 22532 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22533 void *hdr; 22534 22535 if (WARN_ON(!mac)) 22536 return; 22537 22538 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22539 if (!msg) 22540 return; 22541 22542 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STA_OPMODE_CHANGED); 22543 if (!hdr) { 22544 nlmsg_free(msg); 22545 return; 22546 } 22547 22548 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 22549 goto nla_put_failure; 22550 22551 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 22552 goto nla_put_failure; 22553 22554 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac)) 22555 goto nla_put_failure; 22556 22557 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) && 22558 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode)) 22559 goto nla_put_failure; 22560 22561 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && 22562 nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) 22563 goto nla_put_failure; 22564 22565 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && 22566 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss)) 22567 goto nla_put_failure; 22568 22569 genlmsg_end(msg, hdr); 22570 22571 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22572 NL80211_MCGRP_MLME, gfp); 22573 22574 return; 22575 22576 nla_put_failure: 22577 nlmsg_free(msg); 22578 } 22579 EXPORT_SYMBOL(cfg80211_sta_opmode_change_notify); 22580 22581 void cfg80211_probe_status(struct net_device *dev, const u8 *addr, 22582 u64 cookie, bool acked, s32 ack_signal, 22583 bool is_valid_ack_signal, gfp_t gfp) 22584 { 22585 struct wireless_dev *wdev = dev->ieee80211_ptr; 22586 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22587 struct sk_buff *msg; 22588 void *hdr; 22589 22590 trace_cfg80211_probe_status(dev, addr, cookie, acked); 22591 22592 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22593 22594 if (!msg) 22595 return; 22596 22597 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_CLIENT); 22598 if (!hdr) { 22599 nlmsg_free(msg); 22600 return; 22601 } 22602 22603 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22604 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 22605 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 22606 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 22607 NL80211_ATTR_PAD) || 22608 (acked && nla_put_flag(msg, NL80211_ATTR_ACK)) || 22609 (is_valid_ack_signal && nla_put_s32(msg, NL80211_ATTR_ACK_SIGNAL, 22610 ack_signal))) 22611 goto nla_put_failure; 22612 22613 genlmsg_end(msg, hdr); 22614 22615 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22616 NL80211_MCGRP_MLME, gfp); 22617 return; 22618 22619 nla_put_failure: 22620 nlmsg_free(msg); 22621 } 22622 EXPORT_SYMBOL(cfg80211_probe_status); 22623 22624 void cfg80211_report_obss_beacon_khz(struct wiphy *wiphy, const u8 *frame, 22625 size_t len, int freq, int sig_dbm) 22626 { 22627 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22628 struct sk_buff *msg; 22629 void *hdr; 22630 struct cfg80211_beacon_registration *reg; 22631 22632 trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm); 22633 22634 spin_lock_bh(&rdev->beacon_registrations_lock); 22635 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 22636 msg = nlmsg_new(len + 100, GFP_ATOMIC); 22637 if (!msg) { 22638 spin_unlock_bh(&rdev->beacon_registrations_lock); 22639 return; 22640 } 22641 22642 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 22643 if (!hdr) 22644 goto nla_put_failure; 22645 22646 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22647 (freq && 22648 (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, 22649 KHZ_TO_MHZ(freq)) || 22650 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, 22651 freq % 1000))) || 22652 (sig_dbm && 22653 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) || 22654 nla_put(msg, NL80211_ATTR_FRAME, len, frame)) 22655 goto nla_put_failure; 22656 22657 genlmsg_end(msg, hdr); 22658 22659 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); 22660 } 22661 spin_unlock_bh(&rdev->beacon_registrations_lock); 22662 return; 22663 22664 nla_put_failure: 22665 spin_unlock_bh(&rdev->beacon_registrations_lock); 22666 nlmsg_free(msg); 22667 } 22668 EXPORT_SYMBOL(cfg80211_report_obss_beacon_khz); 22669 22670 #ifdef CONFIG_PM 22671 static int cfg80211_net_detect_results(struct sk_buff *msg, 22672 struct cfg80211_wowlan_wakeup *wakeup) 22673 { 22674 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect; 22675 struct nlattr *nl_results, *nl_match, *nl_freqs; 22676 int i, j; 22677 22678 nl_results = nla_nest_start_noflag(msg, 22679 NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS); 22680 if (!nl_results) 22681 return -EMSGSIZE; 22682 22683 for (i = 0; i < nd->n_matches; i++) { 22684 struct cfg80211_wowlan_nd_match *match = nd->matches[i]; 22685 22686 nl_match = nla_nest_start_noflag(msg, i); 22687 if (!nl_match) 22688 break; 22689 22690 /* The SSID attribute is optional in nl80211, but for 22691 * simplicity reasons it's always present in the 22692 * cfg80211 structure. If a driver can't pass the 22693 * SSID, that needs to be changed. A zero length SSID 22694 * is still a valid SSID (wildcard), so it cannot be 22695 * used for this purpose. 22696 */ 22697 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len, 22698 match->ssid.ssid)) { 22699 nla_nest_cancel(msg, nl_match); 22700 goto out; 22701 } 22702 22703 if (match->n_channels) { 22704 nl_freqs = nla_nest_start_noflag(msg, 22705 NL80211_ATTR_SCAN_FREQUENCIES); 22706 if (!nl_freqs) { 22707 nla_nest_cancel(msg, nl_match); 22708 goto out; 22709 } 22710 22711 for (j = 0; j < match->n_channels; j++) { 22712 if (nla_put_u32(msg, j, match->channels[j])) { 22713 nla_nest_cancel(msg, nl_freqs); 22714 nla_nest_cancel(msg, nl_match); 22715 goto out; 22716 } 22717 } 22718 22719 nla_nest_end(msg, nl_freqs); 22720 } 22721 22722 nla_nest_end(msg, nl_match); 22723 } 22724 22725 out: 22726 nla_nest_end(msg, nl_results); 22727 return 0; 22728 } 22729 22730 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev, 22731 struct cfg80211_wowlan_wakeup *wakeup, 22732 gfp_t gfp) 22733 { 22734 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22735 struct sk_buff *msg; 22736 void *hdr; 22737 int size = 200; 22738 22739 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); 22740 22741 if (wakeup) 22742 size += wakeup->packet_present_len; 22743 22744 msg = nlmsg_new(size, gfp); 22745 if (!msg) 22746 return; 22747 22748 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN); 22749 if (!hdr) 22750 goto free_msg; 22751 22752 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22753 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 22754 NL80211_ATTR_PAD)) 22755 goto free_msg; 22756 22757 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 22758 wdev->netdev->ifindex)) 22759 goto free_msg; 22760 22761 if (wakeup) { 22762 struct nlattr *reasons; 22763 22764 reasons = nla_nest_start_noflag(msg, 22765 NL80211_ATTR_WOWLAN_TRIGGERS); 22766 if (!reasons) 22767 goto free_msg; 22768 22769 if (wakeup->disconnect && 22770 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) 22771 goto free_msg; 22772 if (wakeup->magic_pkt && 22773 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) 22774 goto free_msg; 22775 if (wakeup->gtk_rekey_failure && 22776 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) 22777 goto free_msg; 22778 if (wakeup->eap_identity_req && 22779 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) 22780 goto free_msg; 22781 if (wakeup->four_way_handshake && 22782 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) 22783 goto free_msg; 22784 if (wakeup->rfkill_release && 22785 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)) 22786 goto free_msg; 22787 22788 if (wakeup->pattern_idx >= 0 && 22789 nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN, 22790 wakeup->pattern_idx)) 22791 goto free_msg; 22792 22793 if (wakeup->tcp_match && 22794 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH)) 22795 goto free_msg; 22796 22797 if (wakeup->tcp_connlost && 22798 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST)) 22799 goto free_msg; 22800 22801 if (wakeup->tcp_nomoretokens && 22802 nla_put_flag(msg, 22803 NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS)) 22804 goto free_msg; 22805 22806 if (wakeup->unprot_deauth_disassoc && 22807 nla_put_flag(msg, 22808 NL80211_WOWLAN_TRIG_UNPROTECTED_DEAUTH_DISASSOC)) 22809 goto free_msg; 22810 22811 if (wakeup->packet) { 22812 u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211; 22813 u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN; 22814 22815 if (!wakeup->packet_80211) { 22816 pkt_attr = 22817 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023; 22818 len_attr = 22819 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN; 22820 } 22821 22822 if (wakeup->packet_len && 22823 nla_put_u32(msg, len_attr, wakeup->packet_len)) 22824 goto free_msg; 22825 22826 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, 22827 wakeup->packet)) 22828 goto free_msg; 22829 } 22830 22831 if (wakeup->net_detect && 22832 cfg80211_net_detect_results(msg, wakeup)) 22833 goto free_msg; 22834 22835 nla_nest_end(msg, reasons); 22836 } 22837 22838 genlmsg_end(msg, hdr); 22839 22840 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22841 NL80211_MCGRP_MLME, gfp); 22842 return; 22843 22844 free_msg: 22845 nlmsg_free(msg); 22846 } 22847 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup); 22848 #endif 22849 22850 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer, 22851 enum nl80211_tdls_operation oper, 22852 u16 reason_code, gfp_t gfp) 22853 { 22854 struct wireless_dev *wdev = dev->ieee80211_ptr; 22855 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 22856 struct sk_buff *msg; 22857 void *hdr; 22858 22859 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, 22860 reason_code); 22861 22862 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 22863 if (!msg) 22864 return; 22865 22866 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER); 22867 if (!hdr) { 22868 nlmsg_free(msg); 22869 return; 22870 } 22871 22872 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22873 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 22874 nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) || 22875 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) || 22876 (reason_code > 0 && 22877 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code))) 22878 goto nla_put_failure; 22879 22880 genlmsg_end(msg, hdr); 22881 22882 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22883 NL80211_MCGRP_MLME, gfp); 22884 return; 22885 22886 nla_put_failure: 22887 nlmsg_free(msg); 22888 } 22889 EXPORT_SYMBOL(cfg80211_tdls_oper_request); 22890 22891 static int nl80211_netlink_notify(struct notifier_block * nb, 22892 unsigned long state, 22893 void *_notify) 22894 { 22895 struct netlink_notify *notify = _notify; 22896 struct cfg80211_registered_device *rdev; 22897 struct wireless_dev *wdev; 22898 struct cfg80211_beacon_registration *reg, *tmp; 22899 22900 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC) 22901 return NOTIFY_DONE; 22902 22903 rcu_read_lock(); 22904 22905 list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) { 22906 struct cfg80211_sched_scan_request *sched_scan_req; 22907 22908 list_for_each_entry_rcu(sched_scan_req, 22909 &rdev->sched_scan_req_list, 22910 list) { 22911 if (sched_scan_req->owner_nlportid == notify->portid) { 22912 sched_scan_req->nl_owner_dead = true; 22913 wiphy_work_queue(&rdev->wiphy, 22914 &rdev->sched_scan_stop_wk); 22915 } 22916 } 22917 22918 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) { 22919 cfg80211_mlme_unregister_socket(wdev, notify->portid); 22920 22921 if (wdev->owner_nlportid == notify->portid) { 22922 wdev->nl_owner_dead = true; 22923 schedule_work(&rdev->destroy_work); 22924 } else if (wdev->conn_owner_nlportid == notify->portid) { 22925 schedule_work(&wdev->disconnect_wk); 22926 } 22927 22928 cfg80211_release_pmsr(wdev, notify->portid); 22929 } 22930 22931 spin_lock_bh(&rdev->beacon_registrations_lock); 22932 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, 22933 list) { 22934 if (reg->nlportid == notify->portid) { 22935 list_del(®->list); 22936 kfree(reg); 22937 break; 22938 } 22939 } 22940 spin_unlock_bh(&rdev->beacon_registrations_lock); 22941 } 22942 22943 rcu_read_unlock(); 22944 22945 /* 22946 * It is possible that the user space process that is controlling the 22947 * indoor setting disappeared, so notify the regulatory core. 22948 */ 22949 regulatory_netlink_notify(notify->portid); 22950 return NOTIFY_OK; 22951 } 22952 22953 static struct notifier_block nl80211_netlink_notifier = { 22954 .notifier_call = nl80211_netlink_notify, 22955 }; 22956 22957 void cfg80211_ft_event(struct net_device *netdev, 22958 struct cfg80211_ft_event_params *ft_event) 22959 { 22960 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; 22961 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 22962 struct sk_buff *msg; 22963 void *hdr; 22964 22965 trace_cfg80211_ft_event(wiphy, netdev, ft_event); 22966 22967 if (!ft_event->target_ap) 22968 return; 22969 22970 msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len, 22971 GFP_KERNEL); 22972 if (!msg) 22973 return; 22974 22975 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT); 22976 if (!hdr) 22977 goto out; 22978 22979 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 22980 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 22981 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) 22982 goto out; 22983 22984 if (ft_event->ies && 22985 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) 22986 goto out; 22987 if (ft_event->ric_ies && 22988 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, 22989 ft_event->ric_ies)) 22990 goto out; 22991 22992 genlmsg_end(msg, hdr); 22993 22994 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 22995 NL80211_MCGRP_MLME, GFP_KERNEL); 22996 return; 22997 out: 22998 nlmsg_free(msg); 22999 } 23000 EXPORT_SYMBOL(cfg80211_ft_event); 23001 23002 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp) 23003 { 23004 struct cfg80211_registered_device *rdev; 23005 struct sk_buff *msg; 23006 void *hdr; 23007 u32 nlportid; 23008 23009 rdev = wiphy_to_rdev(wdev->wiphy); 23010 if (!rdev->crit_proto_nlportid) 23011 return; 23012 23013 nlportid = rdev->crit_proto_nlportid; 23014 rdev->crit_proto_nlportid = 0; 23015 23016 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23017 if (!msg) 23018 return; 23019 23020 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP); 23021 if (!hdr) 23022 goto nla_put_failure; 23023 23024 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23025 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23026 NL80211_ATTR_PAD)) 23027 goto nla_put_failure; 23028 23029 genlmsg_end(msg, hdr); 23030 23031 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 23032 return; 23033 23034 nla_put_failure: 23035 nlmsg_free(msg); 23036 } 23037 EXPORT_SYMBOL(cfg80211_crit_proto_stopped); 23038 23039 void nl80211_send_ap_stopped(struct wireless_dev *wdev, unsigned int link_id) 23040 { 23041 struct wiphy *wiphy = wdev->wiphy; 23042 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23043 struct sk_buff *msg; 23044 void *hdr; 23045 23046 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 23047 if (!msg) 23048 return; 23049 23050 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP); 23051 if (!hdr) 23052 goto out; 23053 23054 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23055 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || 23056 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23057 NL80211_ATTR_PAD) || 23058 (wdev->valid_links && 23059 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))) 23060 goto out; 23061 23062 genlmsg_end(msg, hdr); 23063 23064 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0, 23065 NL80211_MCGRP_MLME, GFP_KERNEL); 23066 return; 23067 out: 23068 nlmsg_free(msg); 23069 } 23070 23071 int cfg80211_external_auth_request(struct net_device *dev, 23072 struct cfg80211_external_auth_params *params, 23073 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 if (!wdev->conn_owner_nlportid) 23081 return -EINVAL; 23082 23083 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23084 if (!msg) 23085 return -ENOMEM; 23086 23087 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EXTERNAL_AUTH); 23088 if (!hdr) 23089 goto nla_put_failure; 23090 23091 /* Some historical mistakes in drivers <-> userspace interface (notably 23092 * between drivers and wpa_supplicant) led to a big-endian conversion 23093 * being needed on NL80211_ATTR_AKM_SUITES _only_ when its value is 23094 * WLAN_AKM_SUITE_SAE. This is now fixed on userspace side, but for the 23095 * benefit of older wpa_supplicant versions, send this particular value 23096 * in big-endian. Note that newer wpa_supplicant will also detect this 23097 * particular value in big endian still, so it all continues to work. 23098 */ 23099 if (params->key_mgmt_suite == WLAN_AKM_SUITE_SAE) { 23100 if (nla_put_be32(msg, NL80211_ATTR_AKM_SUITES, 23101 cpu_to_be32(WLAN_AKM_SUITE_SAE))) 23102 goto nla_put_failure; 23103 } else { 23104 if (nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, 23105 params->key_mgmt_suite)) 23106 goto nla_put_failure; 23107 } 23108 23109 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23110 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 23111 nla_put_u32(msg, NL80211_ATTR_EXTERNAL_AUTH_ACTION, 23112 params->action) || 23113 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) || 23114 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len, 23115 params->ssid.ssid) || 23116 (!is_zero_ether_addr(params->mld_addr) && 23117 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, params->mld_addr))) 23118 goto nla_put_failure; 23119 23120 genlmsg_end(msg, hdr); 23121 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 23122 wdev->conn_owner_nlportid); 23123 return 0; 23124 23125 nla_put_failure: 23126 nlmsg_free(msg); 23127 return -ENOBUFS; 23128 } 23129 EXPORT_SYMBOL(cfg80211_external_auth_request); 23130 23131 void cfg80211_update_owe_info_event(struct net_device *netdev, 23132 struct cfg80211_update_owe_info *owe_info, 23133 gfp_t gfp) 23134 { 23135 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; 23136 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23137 struct sk_buff *msg; 23138 void *hdr; 23139 23140 trace_cfg80211_update_owe_info_event(wiphy, netdev, owe_info); 23141 23142 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23143 if (!msg) 23144 return; 23145 23146 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_UPDATE_OWE_INFO); 23147 if (!hdr) 23148 goto nla_put_failure; 23149 23150 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23151 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 23152 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer)) 23153 goto nla_put_failure; 23154 23155 if (!owe_info->ie_len || 23156 nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie)) 23157 goto nla_put_failure; 23158 23159 if (owe_info->assoc_link_id != -1) { 23160 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, 23161 owe_info->assoc_link_id)) 23162 goto nla_put_failure; 23163 23164 if (!is_zero_ether_addr(owe_info->peer_mld_addr) && 23165 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, 23166 owe_info->peer_mld_addr)) 23167 goto nla_put_failure; 23168 } 23169 23170 genlmsg_end(msg, hdr); 23171 23172 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 23173 NL80211_MCGRP_MLME, gfp); 23174 return; 23175 23176 nla_put_failure: 23177 genlmsg_cancel(msg, hdr); 23178 nlmsg_free(msg); 23179 } 23180 EXPORT_SYMBOL(cfg80211_update_owe_info_event); 23181 23182 void cfg80211_schedule_channels_check(struct wireless_dev *wdev) 23183 { 23184 struct wiphy *wiphy = wdev->wiphy; 23185 23186 /* Schedule channels check if NO_IR or DFS relaxations are supported */ 23187 if (wdev->iftype == NL80211_IFTYPE_STATION && 23188 (wiphy_ext_feature_isset(wiphy, 23189 NL80211_EXT_FEATURE_DFS_CONCURRENT) || 23190 (IS_ENABLED(CONFIG_CFG80211_REG_RELAX_NO_IR) && 23191 wiphy->regulatory_flags & REGULATORY_ENABLE_RELAX_NO_IR))) 23192 reg_check_channels(); 23193 } 23194 EXPORT_SYMBOL(cfg80211_schedule_channels_check); 23195 23196 void cfg80211_epcs_changed(struct net_device *netdev, bool enabled) 23197 { 23198 struct wireless_dev *wdev = netdev->ieee80211_ptr; 23199 struct wiphy *wiphy = wdev->wiphy; 23200 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23201 struct sk_buff *msg; 23202 void *hdr; 23203 23204 trace_cfg80211_epcs_changed(wdev, enabled); 23205 23206 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 23207 if (!msg) 23208 return; 23209 23210 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EPCS_CFG); 23211 if (!hdr) { 23212 nlmsg_free(msg); 23213 return; 23214 } 23215 23216 if (enabled && nla_put_flag(msg, NL80211_ATTR_EPCS)) 23217 goto nla_put_failure; 23218 23219 genlmsg_end(msg, hdr); 23220 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 23221 NL80211_MCGRP_MLME, GFP_KERNEL); 23222 return; 23223 23224 nla_put_failure: 23225 nlmsg_free(msg); 23226 } 23227 EXPORT_SYMBOL(cfg80211_epcs_changed); 23228 23229 void cfg80211_next_nan_dw_notif(struct wireless_dev *wdev, 23230 struct ieee80211_channel *chan, gfp_t gfp) 23231 { 23232 struct wiphy *wiphy = wdev->wiphy; 23233 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23234 struct sk_buff *msg; 23235 void *hdr; 23236 23237 trace_cfg80211_next_nan_dw_notif(wdev, chan); 23238 23239 if (!wdev->owner_nlportid) 23240 return; 23241 23242 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23243 if (!msg) 23244 return; 23245 23246 hdr = nl80211hdr_put(msg, 0, 0, 0, 23247 NL80211_CMD_NAN_NEXT_DW_NOTIFICATION); 23248 if (!hdr) 23249 goto nla_put_failure; 23250 23251 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23252 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23253 NL80211_ATTR_PAD) || 23254 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq)) 23255 goto nla_put_failure; 23256 23257 genlmsg_end(msg, hdr); 23258 23259 genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid); 23260 23261 return; 23262 23263 nla_put_failure: 23264 nlmsg_free(msg); 23265 } 23266 EXPORT_SYMBOL(cfg80211_next_nan_dw_notif); 23267 23268 void cfg80211_nan_cluster_joined(struct wireless_dev *wdev, 23269 const u8 *cluster_id, bool new_cluster, 23270 gfp_t gfp) 23271 { 23272 struct wiphy *wiphy = wdev->wiphy; 23273 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23274 struct sk_buff *msg; 23275 void *hdr; 23276 23277 trace_cfg80211_nan_cluster_joined(wdev, cluster_id, new_cluster); 23278 23279 memcpy(wdev->u.nan.cluster_id, cluster_id, ETH_ALEN); 23280 23281 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23282 if (!msg) 23283 return; 23284 23285 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_CLUSTER_JOINED); 23286 if (!hdr) 23287 goto nla_put_failure; 23288 23289 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23290 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23291 NL80211_ATTR_PAD) || 23292 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cluster_id) || 23293 (new_cluster && nla_put_flag(msg, NL80211_ATTR_NAN_NEW_CLUSTER))) 23294 goto nla_put_failure; 23295 23296 genlmsg_end(msg, hdr); 23297 23298 if (!wdev->owner_nlportid) 23299 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), 23300 msg, 0, NL80211_MCGRP_NAN, gfp); 23301 else 23302 genlmsg_unicast(wiphy_net(wiphy), msg, 23303 wdev->owner_nlportid); 23304 return; 23305 23306 nla_put_failure: 23307 nlmsg_free(msg); 23308 } 23309 EXPORT_SYMBOL(cfg80211_nan_cluster_joined); 23310 23311 void cfg80211_nan_ulw_update(struct wireless_dev *wdev, 23312 const u8 *ulw, size_t ulw_len, gfp_t gfp) 23313 { 23314 struct wiphy *wiphy = wdev->wiphy; 23315 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23316 struct sk_buff *msg; 23317 void *hdr; 23318 23319 trace_cfg80211_nan_ulw_update(wiphy, wdev, ulw, ulw_len); 23320 23321 if (!wdev->owner_nlportid) 23322 return; 23323 23324 /* 32 for the wiphy idx, 64 for the wdev id, 100 for padding */ 23325 msg = nlmsg_new(nla_total_size(sizeof(u32)) + 23326 nla_total_size(ulw_len) + 23327 nla_total_size(sizeof(u64)) + 100, 23328 gfp); 23329 if (!msg) 23330 return; 23331 23332 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_ULW_UPDATE); 23333 if (!hdr) 23334 goto nla_put_failure; 23335 23336 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23337 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23338 NL80211_ATTR_PAD) || 23339 (ulw && ulw_len && 23340 nla_put(msg, NL80211_ATTR_NAN_ULW, ulw_len, ulw))) 23341 goto nla_put_failure; 23342 23343 genlmsg_end(msg, hdr); 23344 23345 genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid); 23346 23347 return; 23348 23349 nla_put_failure: 23350 nlmsg_free(msg); 23351 } 23352 EXPORT_SYMBOL(cfg80211_nan_ulw_update); 23353 23354 void cfg80211_nan_channel_evac(struct wireless_dev *wdev, 23355 const struct cfg80211_chan_def *chandef, 23356 gfp_t gfp) 23357 { 23358 struct wiphy *wiphy = wdev->wiphy; 23359 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 23360 struct sk_buff *msg; 23361 struct nlattr *chan_attr; 23362 void *hdr; 23363 23364 trace_cfg80211_nan_channel_evac(wiphy, wdev, chandef); 23365 23366 if (!wdev->owner_nlportid) 23367 return; 23368 23369 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 23370 if (!msg) 23371 return; 23372 23373 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_CHANNEL_EVAC); 23374 if (!hdr) 23375 goto nla_put_failure; 23376 23377 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 23378 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 23379 NL80211_ATTR_PAD)) 23380 goto nla_put_failure; 23381 23382 chan_attr = nla_nest_start(msg, NL80211_ATTR_NAN_CHANNEL); 23383 if (!chan_attr) 23384 goto nla_put_failure; 23385 23386 if (nl80211_send_chandef(msg, chandef)) 23387 goto nla_put_failure; 23388 23389 nla_nest_end(msg, chan_attr); 23390 23391 genlmsg_end(msg, hdr); 23392 23393 genlmsg_unicast(wiphy_net(wiphy), msg, wdev->owner_nlportid); 23394 23395 return; 23396 23397 nla_put_failure: 23398 nlmsg_free(msg); 23399 } 23400 EXPORT_SYMBOL(cfg80211_nan_channel_evac); 23401 23402 /* initialisation/exit functions */ 23403 23404 int __init nl80211_init(void) 23405 { 23406 int err; 23407 23408 err = genl_register_family(&nl80211_fam); 23409 if (err) 23410 return err; 23411 23412 err = netlink_register_notifier(&nl80211_netlink_notifier); 23413 if (err) 23414 goto err_out; 23415 23416 return 0; 23417 err_out: 23418 genl_unregister_family(&nl80211_fam); 23419 return err; 23420 } 23421 23422 void nl80211_exit(void) 23423 { 23424 netlink_unregister_notifier(&nl80211_netlink_notifier); 23425 genl_unregister_family(&nl80211_fam); 23426 } 23427