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-2023 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 <net/net_namespace.h> 25 #include <net/genetlink.h> 26 #include <net/cfg80211.h> 27 #include <net/sock.h> 28 #include <net/inet_connection_sock.h> 29 #include "core.h" 30 #include "nl80211.h" 31 #include "reg.h" 32 #include "rdev-ops.h" 33 34 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, 35 struct genl_info *info, 36 struct cfg80211_crypto_settings *settings, 37 int cipher_limit); 38 39 /* the netlink family */ 40 static struct genl_family nl80211_fam; 41 42 /* multicast groups */ 43 enum nl80211_multicast_groups { 44 NL80211_MCGRP_CONFIG, 45 NL80211_MCGRP_SCAN, 46 NL80211_MCGRP_REGULATORY, 47 NL80211_MCGRP_MLME, 48 NL80211_MCGRP_VENDOR, 49 NL80211_MCGRP_NAN, 50 NL80211_MCGRP_TESTMODE /* keep last - ifdef! */ 51 }; 52 53 static const struct genl_multicast_group nl80211_mcgrps[] = { 54 [NL80211_MCGRP_CONFIG] = { .name = NL80211_MULTICAST_GROUP_CONFIG }, 55 [NL80211_MCGRP_SCAN] = { .name = NL80211_MULTICAST_GROUP_SCAN }, 56 [NL80211_MCGRP_REGULATORY] = { .name = NL80211_MULTICAST_GROUP_REG }, 57 [NL80211_MCGRP_MLME] = { .name = NL80211_MULTICAST_GROUP_MLME }, 58 [NL80211_MCGRP_VENDOR] = { .name = NL80211_MULTICAST_GROUP_VENDOR }, 59 [NL80211_MCGRP_NAN] = { .name = NL80211_MULTICAST_GROUP_NAN }, 60 #ifdef CONFIG_NL80211_TESTMODE 61 [NL80211_MCGRP_TESTMODE] = { .name = NL80211_MULTICAST_GROUP_TESTMODE } 62 #endif 63 }; 64 65 /* returns ERR_PTR values */ 66 static struct wireless_dev * 67 __cfg80211_wdev_from_attrs(struct cfg80211_registered_device *rdev, 68 struct net *netns, struct nlattr **attrs) 69 { 70 struct wireless_dev *result = NULL; 71 bool have_ifidx = attrs[NL80211_ATTR_IFINDEX]; 72 bool have_wdev_id = attrs[NL80211_ATTR_WDEV]; 73 u64 wdev_id = 0; 74 int wiphy_idx = -1; 75 int ifidx = -1; 76 77 if (!have_ifidx && !have_wdev_id) 78 return ERR_PTR(-EINVAL); 79 80 if (have_ifidx) 81 ifidx = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]); 82 if (have_wdev_id) { 83 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]); 84 wiphy_idx = wdev_id >> 32; 85 } 86 87 if (rdev) { 88 struct wireless_dev *wdev; 89 90 lockdep_assert_held(&rdev->wiphy.mtx); 91 92 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 93 if (have_ifidx && wdev->netdev && 94 wdev->netdev->ifindex == ifidx) { 95 result = wdev; 96 break; 97 } 98 if (have_wdev_id && wdev->identifier == (u32)wdev_id) { 99 result = wdev; 100 break; 101 } 102 } 103 104 return result ?: ERR_PTR(-ENODEV); 105 } 106 107 ASSERT_RTNL(); 108 109 for_each_rdev(rdev) { 110 struct wireless_dev *wdev; 111 112 if (wiphy_net(&rdev->wiphy) != netns) 113 continue; 114 115 if (have_wdev_id && rdev->wiphy_idx != wiphy_idx) 116 continue; 117 118 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 119 if (have_ifidx && wdev->netdev && 120 wdev->netdev->ifindex == ifidx) { 121 result = wdev; 122 break; 123 } 124 if (have_wdev_id && wdev->identifier == (u32)wdev_id) { 125 result = wdev; 126 break; 127 } 128 } 129 130 if (result) 131 break; 132 } 133 134 if (result) 135 return result; 136 return ERR_PTR(-ENODEV); 137 } 138 139 static struct cfg80211_registered_device * 140 __cfg80211_rdev_from_attrs(struct net *netns, struct nlattr **attrs) 141 { 142 struct cfg80211_registered_device *rdev = NULL, *tmp; 143 struct net_device *netdev; 144 145 ASSERT_RTNL(); 146 147 if (!attrs[NL80211_ATTR_WIPHY] && 148 !attrs[NL80211_ATTR_IFINDEX] && 149 !attrs[NL80211_ATTR_WDEV]) 150 return ERR_PTR(-EINVAL); 151 152 if (attrs[NL80211_ATTR_WIPHY]) 153 rdev = cfg80211_rdev_by_wiphy_idx( 154 nla_get_u32(attrs[NL80211_ATTR_WIPHY])); 155 156 if (attrs[NL80211_ATTR_WDEV]) { 157 u64 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]); 158 struct wireless_dev *wdev; 159 bool found = false; 160 161 tmp = cfg80211_rdev_by_wiphy_idx(wdev_id >> 32); 162 if (tmp) { 163 /* make sure wdev exists */ 164 list_for_each_entry(wdev, &tmp->wiphy.wdev_list, list) { 165 if (wdev->identifier != (u32)wdev_id) 166 continue; 167 found = true; 168 break; 169 } 170 171 if (!found) 172 tmp = NULL; 173 174 if (rdev && tmp != rdev) 175 return ERR_PTR(-EINVAL); 176 rdev = tmp; 177 } 178 } 179 180 if (attrs[NL80211_ATTR_IFINDEX]) { 181 int ifindex = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]); 182 183 netdev = __dev_get_by_index(netns, ifindex); 184 if (netdev) { 185 if (netdev->ieee80211_ptr) 186 tmp = wiphy_to_rdev( 187 netdev->ieee80211_ptr->wiphy); 188 else 189 tmp = NULL; 190 191 /* not wireless device -- return error */ 192 if (!tmp) 193 return ERR_PTR(-EINVAL); 194 195 /* mismatch -- return error */ 196 if (rdev && tmp != rdev) 197 return ERR_PTR(-EINVAL); 198 199 rdev = tmp; 200 } 201 } 202 203 if (!rdev) 204 return ERR_PTR(-ENODEV); 205 206 if (netns != wiphy_net(&rdev->wiphy)) 207 return ERR_PTR(-ENODEV); 208 209 return rdev; 210 } 211 212 /* 213 * This function returns a pointer to the driver 214 * that the genl_info item that is passed refers to. 215 * 216 * The result of this can be a PTR_ERR and hence must 217 * be checked with IS_ERR() for errors. 218 */ 219 static struct cfg80211_registered_device * 220 cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info) 221 { 222 return __cfg80211_rdev_from_attrs(netns, info->attrs); 223 } 224 225 static int validate_beacon_head(const struct nlattr *attr, 226 struct netlink_ext_ack *extack) 227 { 228 const u8 *data = nla_data(attr); 229 unsigned int len = nla_len(attr); 230 const struct element *elem; 231 const struct ieee80211_mgmt *mgmt = (void *)data; 232 unsigned int fixedlen, hdrlen; 233 bool s1g_bcn; 234 235 if (len < offsetofend(typeof(*mgmt), frame_control)) 236 goto err; 237 238 s1g_bcn = ieee80211_is_s1g_beacon(mgmt->frame_control); 239 if (s1g_bcn) { 240 fixedlen = offsetof(struct ieee80211_ext, 241 u.s1g_beacon.variable); 242 hdrlen = offsetof(struct ieee80211_ext, u.s1g_beacon); 243 } else { 244 fixedlen = offsetof(struct ieee80211_mgmt, 245 u.beacon.variable); 246 hdrlen = offsetof(struct ieee80211_mgmt, u.beacon); 247 } 248 249 if (len < fixedlen) 250 goto err; 251 252 if (ieee80211_hdrlen(mgmt->frame_control) != hdrlen) 253 goto err; 254 255 data += fixedlen; 256 len -= fixedlen; 257 258 for_each_element(elem, data, len) { 259 /* nothing */ 260 } 261 262 if (for_each_element_completed(elem, data, len)) 263 return 0; 264 265 err: 266 NL_SET_ERR_MSG_ATTR(extack, attr, "malformed beacon head"); 267 return -EINVAL; 268 } 269 270 static int validate_ie_attr(const struct nlattr *attr, 271 struct netlink_ext_ack *extack) 272 { 273 const u8 *data = nla_data(attr); 274 unsigned int len = nla_len(attr); 275 const struct element *elem; 276 277 for_each_element(elem, data, len) { 278 /* nothing */ 279 } 280 281 if (for_each_element_completed(elem, data, len)) 282 return 0; 283 284 NL_SET_ERR_MSG_ATTR(extack, attr, "malformed information elements"); 285 return -EINVAL; 286 } 287 288 static int validate_he_capa(const struct nlattr *attr, 289 struct netlink_ext_ack *extack) 290 { 291 if (!ieee80211_he_capa_size_ok(nla_data(attr), nla_len(attr))) 292 return -EINVAL; 293 294 return 0; 295 } 296 297 /* policy for the attributes */ 298 static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR]; 299 300 static const struct nla_policy 301 nl80211_ftm_responder_policy[NL80211_FTM_RESP_ATTR_MAX + 1] = { 302 [NL80211_FTM_RESP_ATTR_ENABLED] = { .type = NLA_FLAG, }, 303 [NL80211_FTM_RESP_ATTR_LCI] = { .type = NLA_BINARY, 304 .len = U8_MAX }, 305 [NL80211_FTM_RESP_ATTR_CIVICLOC] = { .type = NLA_BINARY, 306 .len = U8_MAX }, 307 }; 308 309 static const struct nla_policy 310 nl80211_pmsr_ftm_req_attr_policy[NL80211_PMSR_FTM_REQ_ATTR_MAX + 1] = { 311 [NL80211_PMSR_FTM_REQ_ATTR_ASAP] = { .type = NLA_FLAG }, 312 [NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE] = { .type = NLA_U32 }, 313 [NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP] = 314 NLA_POLICY_MAX(NLA_U8, 15), 315 [NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD] = { .type = NLA_U16 }, 316 [NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION] = 317 NLA_POLICY_MAX(NLA_U8, 15), 318 [NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST] = 319 NLA_POLICY_MAX(NLA_U8, 31), 320 [NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES] = { .type = NLA_U8 }, 321 [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI] = { .type = NLA_FLAG }, 322 [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC] = { .type = NLA_FLAG }, 323 [NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED] = { .type = NLA_FLAG }, 324 [NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED] = { .type = NLA_FLAG }, 325 [NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK] = { .type = NLA_FLAG }, 326 [NL80211_PMSR_FTM_REQ_ATTR_BSS_COLOR] = { .type = NLA_U8 }, 327 }; 328 329 static const struct nla_policy 330 nl80211_pmsr_req_data_policy[NL80211_PMSR_TYPE_MAX + 1] = { 331 [NL80211_PMSR_TYPE_FTM] = 332 NLA_POLICY_NESTED(nl80211_pmsr_ftm_req_attr_policy), 333 }; 334 335 static const struct nla_policy 336 nl80211_pmsr_req_attr_policy[NL80211_PMSR_REQ_ATTR_MAX + 1] = { 337 [NL80211_PMSR_REQ_ATTR_DATA] = 338 NLA_POLICY_NESTED(nl80211_pmsr_req_data_policy), 339 [NL80211_PMSR_REQ_ATTR_GET_AP_TSF] = { .type = NLA_FLAG }, 340 }; 341 342 static const struct nla_policy 343 nl80211_pmsr_peer_attr_policy[NL80211_PMSR_PEER_ATTR_MAX + 1] = { 344 [NL80211_PMSR_PEER_ATTR_ADDR] = NLA_POLICY_ETH_ADDR, 345 [NL80211_PMSR_PEER_ATTR_CHAN] = NLA_POLICY_NESTED(nl80211_policy), 346 [NL80211_PMSR_PEER_ATTR_REQ] = 347 NLA_POLICY_NESTED(nl80211_pmsr_req_attr_policy), 348 [NL80211_PMSR_PEER_ATTR_RESP] = { .type = NLA_REJECT }, 349 }; 350 351 static const struct nla_policy 352 nl80211_pmsr_attr_policy[NL80211_PMSR_ATTR_MAX + 1] = { 353 [NL80211_PMSR_ATTR_MAX_PEERS] = { .type = NLA_REJECT }, 354 [NL80211_PMSR_ATTR_REPORT_AP_TSF] = { .type = NLA_REJECT }, 355 [NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR] = { .type = NLA_REJECT }, 356 [NL80211_PMSR_ATTR_TYPE_CAPA] = { .type = NLA_REJECT }, 357 [NL80211_PMSR_ATTR_PEERS] = 358 NLA_POLICY_NESTED_ARRAY(nl80211_pmsr_peer_attr_policy), 359 }; 360 361 static const struct nla_policy 362 he_obss_pd_policy[NL80211_HE_OBSS_PD_ATTR_MAX + 1] = { 363 [NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET] = 364 NLA_POLICY_RANGE(NLA_U8, 1, 20), 365 [NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET] = 366 NLA_POLICY_RANGE(NLA_U8, 1, 20), 367 [NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET] = 368 NLA_POLICY_RANGE(NLA_U8, 1, 20), 369 [NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP] = 370 NLA_POLICY_EXACT_LEN(8), 371 [NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP] = 372 NLA_POLICY_EXACT_LEN(8), 373 [NL80211_HE_OBSS_PD_ATTR_SR_CTRL] = { .type = NLA_U8 }, 374 }; 375 376 static const struct nla_policy 377 he_bss_color_policy[NL80211_HE_BSS_COLOR_ATTR_MAX + 1] = { 378 [NL80211_HE_BSS_COLOR_ATTR_COLOR] = NLA_POLICY_RANGE(NLA_U8, 1, 63), 379 [NL80211_HE_BSS_COLOR_ATTR_DISABLED] = { .type = NLA_FLAG }, 380 [NL80211_HE_BSS_COLOR_ATTR_PARTIAL] = { .type = NLA_FLAG }, 381 }; 382 383 static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = { 384 [NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY, 385 .len = NL80211_MAX_SUPP_RATES }, 386 [NL80211_TXRATE_HT] = { .type = NLA_BINARY, 387 .len = NL80211_MAX_SUPP_HT_RATES }, 388 [NL80211_TXRATE_VHT] = NLA_POLICY_EXACT_LEN_WARN(sizeof(struct nl80211_txrate_vht)), 389 [NL80211_TXRATE_GI] = { .type = NLA_U8 }, 390 [NL80211_TXRATE_HE] = NLA_POLICY_EXACT_LEN(sizeof(struct nl80211_txrate_he)), 391 [NL80211_TXRATE_HE_GI] = NLA_POLICY_RANGE(NLA_U8, 392 NL80211_RATE_INFO_HE_GI_0_8, 393 NL80211_RATE_INFO_HE_GI_3_2), 394 [NL80211_TXRATE_HE_LTF] = NLA_POLICY_RANGE(NLA_U8, 395 NL80211_RATE_INFO_HE_1XLTF, 396 NL80211_RATE_INFO_HE_4XLTF), 397 }; 398 399 static const struct nla_policy 400 nl80211_tid_config_attr_policy[NL80211_TID_CONFIG_ATTR_MAX + 1] = { 401 [NL80211_TID_CONFIG_ATTR_VIF_SUPP] = { .type = NLA_U64 }, 402 [NL80211_TID_CONFIG_ATTR_PEER_SUPP] = { .type = NLA_U64 }, 403 [NL80211_TID_CONFIG_ATTR_OVERRIDE] = { .type = NLA_FLAG }, 404 [NL80211_TID_CONFIG_ATTR_TIDS] = NLA_POLICY_RANGE(NLA_U16, 1, 0xff), 405 [NL80211_TID_CONFIG_ATTR_NOACK] = 406 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 407 [NL80211_TID_CONFIG_ATTR_RETRY_SHORT] = NLA_POLICY_MIN(NLA_U8, 1), 408 [NL80211_TID_CONFIG_ATTR_RETRY_LONG] = NLA_POLICY_MIN(NLA_U8, 1), 409 [NL80211_TID_CONFIG_ATTR_AMPDU_CTRL] = 410 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 411 [NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL] = 412 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 413 [NL80211_TID_CONFIG_ATTR_AMSDU_CTRL] = 414 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 415 [NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE] = 416 NLA_POLICY_MAX(NLA_U8, NL80211_TX_RATE_FIXED), 417 [NL80211_TID_CONFIG_ATTR_TX_RATE] = 418 NLA_POLICY_NESTED(nl80211_txattr_policy), 419 }; 420 421 static const struct nla_policy 422 nl80211_fils_discovery_policy[NL80211_FILS_DISCOVERY_ATTR_MAX + 1] = { 423 [NL80211_FILS_DISCOVERY_ATTR_INT_MIN] = NLA_POLICY_MAX(NLA_U32, 10000), 424 [NL80211_FILS_DISCOVERY_ATTR_INT_MAX] = NLA_POLICY_MAX(NLA_U32, 10000), 425 [NL80211_FILS_DISCOVERY_ATTR_TMPL] = 426 NLA_POLICY_RANGE(NLA_BINARY, 427 NL80211_FILS_DISCOVERY_TMPL_MIN_LEN, 428 IEEE80211_MAX_DATA_LEN), 429 }; 430 431 static const struct nla_policy 432 nl80211_unsol_bcast_probe_resp_policy[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX + 1] = { 433 [NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] = NLA_POLICY_MAX(NLA_U32, 20), 434 [NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL] = { .type = NLA_BINARY, 435 .len = IEEE80211_MAX_DATA_LEN } 436 }; 437 438 static const struct nla_policy 439 sar_specs_policy[NL80211_SAR_ATTR_SPECS_MAX + 1] = { 440 [NL80211_SAR_ATTR_SPECS_POWER] = { .type = NLA_S32 }, 441 [NL80211_SAR_ATTR_SPECS_RANGE_INDEX] = {.type = NLA_U32 }, 442 }; 443 444 static const struct nla_policy 445 sar_policy[NL80211_SAR_ATTR_MAX + 1] = { 446 [NL80211_SAR_ATTR_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_SAR_TYPE), 447 [NL80211_SAR_ATTR_SPECS] = NLA_POLICY_NESTED_ARRAY(sar_specs_policy), 448 }; 449 450 static const struct nla_policy 451 nl80211_mbssid_config_policy[NL80211_MBSSID_CONFIG_ATTR_MAX + 1] = { 452 [NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES] = NLA_POLICY_MIN(NLA_U8, 2), 453 [NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY] = 454 NLA_POLICY_MIN(NLA_U8, 1), 455 [NL80211_MBSSID_CONFIG_ATTR_INDEX] = { .type = NLA_U8 }, 456 [NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX] = { .type = NLA_U32 }, 457 [NL80211_MBSSID_CONFIG_ATTR_EMA] = { .type = NLA_FLAG }, 458 }; 459 460 static const struct nla_policy 461 nl80211_sta_wme_policy[NL80211_STA_WME_MAX + 1] = { 462 [NL80211_STA_WME_UAPSD_QUEUES] = { .type = NLA_U8 }, 463 [NL80211_STA_WME_MAX_SP] = { .type = NLA_U8 }, 464 }; 465 466 static const struct netlink_range_validation nl80211_punct_bitmap_range = { 467 .min = 0, 468 .max = 0xffff, 469 }; 470 471 static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { 472 [0] = { .strict_start_type = NL80211_ATTR_HE_OBSS_PD }, 473 [NL80211_ATTR_WIPHY] = { .type = NLA_U32 }, 474 [NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING, 475 .len = 20-1 }, 476 [NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED }, 477 478 [NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 }, 479 [NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 }, 480 [NL80211_ATTR_WIPHY_EDMG_CHANNELS] = NLA_POLICY_RANGE(NLA_U8, 481 NL80211_EDMG_CHANNELS_MIN, 482 NL80211_EDMG_CHANNELS_MAX), 483 [NL80211_ATTR_WIPHY_EDMG_BW_CONFIG] = NLA_POLICY_RANGE(NLA_U8, 484 NL80211_EDMG_BW_CONFIG_MIN, 485 NL80211_EDMG_BW_CONFIG_MAX), 486 487 [NL80211_ATTR_CHANNEL_WIDTH] = { .type = NLA_U32 }, 488 [NL80211_ATTR_CENTER_FREQ1] = { .type = NLA_U32 }, 489 [NL80211_ATTR_CENTER_FREQ1_OFFSET] = NLA_POLICY_RANGE(NLA_U32, 0, 999), 490 [NL80211_ATTR_CENTER_FREQ2] = { .type = NLA_U32 }, 491 492 [NL80211_ATTR_WIPHY_RETRY_SHORT] = NLA_POLICY_MIN(NLA_U8, 1), 493 [NL80211_ATTR_WIPHY_RETRY_LONG] = NLA_POLICY_MIN(NLA_U8, 1), 494 [NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 }, 495 [NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 }, 496 [NL80211_ATTR_WIPHY_COVERAGE_CLASS] = { .type = NLA_U8 }, 497 [NL80211_ATTR_WIPHY_DYN_ACK] = { .type = NLA_FLAG }, 498 499 [NL80211_ATTR_IFTYPE] = NLA_POLICY_MAX(NLA_U32, NL80211_IFTYPE_MAX), 500 [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 }, 501 [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 }, 502 503 [NL80211_ATTR_MAC] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 504 [NL80211_ATTR_PREV_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 505 506 [NL80211_ATTR_KEY] = { .type = NLA_NESTED, }, 507 [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY, 508 .len = WLAN_MAX_KEY_LEN }, 509 [NL80211_ATTR_KEY_IDX] = NLA_POLICY_MAX(NLA_U8, 7), 510 [NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 }, 511 [NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG }, 512 [NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 }, 513 [NL80211_ATTR_KEY_TYPE] = 514 NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES), 515 516 [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 }, 517 [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 }, 518 [NL80211_ATTR_BEACON_HEAD] = 519 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_beacon_head, 520 IEEE80211_MAX_DATA_LEN), 521 [NL80211_ATTR_BEACON_TAIL] = 522 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 523 IEEE80211_MAX_DATA_LEN), 524 [NL80211_ATTR_STA_AID] = 525 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), 526 [NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED }, 527 [NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 }, 528 [NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY, 529 .len = NL80211_MAX_SUPP_RATES }, 530 [NL80211_ATTR_STA_PLINK_ACTION] = 531 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_ACTIONS - 1), 532 [NL80211_ATTR_STA_TX_POWER_SETTING] = 533 NLA_POLICY_RANGE(NLA_U8, 534 NL80211_TX_POWER_AUTOMATIC, 535 NL80211_TX_POWER_FIXED), 536 [NL80211_ATTR_STA_TX_POWER] = { .type = NLA_S16 }, 537 [NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 }, 538 [NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ }, 539 [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY, 540 .len = IEEE80211_MAX_MESH_ID_LEN }, 541 [NL80211_ATTR_MPATH_NEXT_HOP] = NLA_POLICY_ETH_ADDR_COMPAT, 542 543 /* allow 3 for NUL-termination, we used to declare this NLA_STRING */ 544 [NL80211_ATTR_REG_ALPHA2] = NLA_POLICY_RANGE(NLA_BINARY, 2, 3), 545 [NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED }, 546 547 [NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 }, 548 [NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 }, 549 [NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 }, 550 [NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY, 551 .len = NL80211_MAX_SUPP_RATES }, 552 [NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 }, 553 554 [NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED }, 555 [NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG }, 556 557 [NL80211_ATTR_HT_CAPABILITY] = NLA_POLICY_EXACT_LEN_WARN(NL80211_HT_CAPABILITY_LEN), 558 559 [NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 }, 560 [NL80211_ATTR_IE] = NLA_POLICY_VALIDATE_FN(NLA_BINARY, 561 validate_ie_attr, 562 IEEE80211_MAX_DATA_LEN), 563 [NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED }, 564 [NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED }, 565 566 [NL80211_ATTR_SSID] = { .type = NLA_BINARY, 567 .len = IEEE80211_MAX_SSID_LEN }, 568 [NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 }, 569 [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 }, 570 [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG }, 571 [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG }, 572 [NL80211_ATTR_USE_MFP] = NLA_POLICY_RANGE(NLA_U32, 573 NL80211_MFP_NO, 574 NL80211_MFP_OPTIONAL), 575 [NL80211_ATTR_STA_FLAGS2] = 576 NLA_POLICY_EXACT_LEN_WARN(sizeof(struct nl80211_sta_flag_update)), 577 [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG }, 578 [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 }, 579 [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG }, 580 [NL80211_ATTR_CONTROL_PORT_OVER_NL80211] = { .type = NLA_FLAG }, 581 [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG }, 582 [NL80211_ATTR_STATUS_CODE] = { .type = NLA_U16 }, 583 [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 }, 584 [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 }, 585 [NL80211_ATTR_PID] = { .type = NLA_U32 }, 586 [NL80211_ATTR_4ADDR] = { .type = NLA_U8 }, 587 [NL80211_ATTR_PMKID] = NLA_POLICY_EXACT_LEN_WARN(WLAN_PMKID_LEN), 588 [NL80211_ATTR_DURATION] = { .type = NLA_U32 }, 589 [NL80211_ATTR_COOKIE] = { .type = NLA_U64 }, 590 [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED }, 591 [NL80211_ATTR_FRAME] = { .type = NLA_BINARY, 592 .len = IEEE80211_MAX_DATA_LEN }, 593 [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, }, 594 [NL80211_ATTR_PS_STATE] = NLA_POLICY_RANGE(NLA_U32, 595 NL80211_PS_DISABLED, 596 NL80211_PS_ENABLED), 597 [NL80211_ATTR_CQM] = { .type = NLA_NESTED, }, 598 [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG }, 599 [NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 }, 600 [NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 }, 601 [NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 }, 602 [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 }, 603 [NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 }, 604 [NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 }, 605 [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 }, 606 [NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG }, 607 [NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED }, 608 [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED }, 609 [NL80211_ATTR_STA_PLINK_STATE] = 610 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1), 611 [NL80211_ATTR_MEASUREMENT_DURATION] = { .type = NLA_U16 }, 612 [NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY] = { .type = NLA_FLAG }, 613 [NL80211_ATTR_MESH_PEER_AID] = 614 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), 615 [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 }, 616 [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED }, 617 [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED }, 618 [NL80211_ATTR_HIDDEN_SSID] = 619 NLA_POLICY_RANGE(NLA_U32, 620 NL80211_HIDDEN_SSID_NOT_IN_USE, 621 NL80211_HIDDEN_SSID_ZERO_CONTENTS), 622 [NL80211_ATTR_IE_PROBE_RESP] = 623 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 624 IEEE80211_MAX_DATA_LEN), 625 [NL80211_ATTR_IE_ASSOC_RESP] = 626 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 627 IEEE80211_MAX_DATA_LEN), 628 [NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG }, 629 [NL80211_ATTR_STA_WME] = NLA_POLICY_NESTED(nl80211_sta_wme_policy), 630 [NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED }, 631 [NL80211_ATTR_TX_NO_CCK_RATE] = { .type = NLA_FLAG }, 632 [NL80211_ATTR_TDLS_ACTION] = { .type = NLA_U8 }, 633 [NL80211_ATTR_TDLS_DIALOG_TOKEN] = { .type = NLA_U8 }, 634 [NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 }, 635 [NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG }, 636 [NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG }, 637 [NL80211_ATTR_TDLS_INITIATOR] = { .type = NLA_FLAG }, 638 [NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG }, 639 [NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY, 640 .len = IEEE80211_MAX_DATA_LEN }, 641 [NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 }, 642 [NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG }, 643 [NL80211_ATTR_HT_CAPABILITY_MASK] = { 644 .len = NL80211_HT_CAPABILITY_LEN 645 }, 646 [NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 }, 647 [NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 }, 648 [NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 }, 649 [NL80211_ATTR_WDEV] = { .type = NLA_U64 }, 650 [NL80211_ATTR_USER_REG_HINT_TYPE] = { .type = NLA_U32 }, 651 652 /* need to include at least Auth Transaction and Status Code */ 653 [NL80211_ATTR_AUTH_DATA] = NLA_POLICY_MIN_LEN(4), 654 655 [NL80211_ATTR_VHT_CAPABILITY] = NLA_POLICY_EXACT_LEN_WARN(NL80211_VHT_CAPABILITY_LEN), 656 [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 }, 657 [NL80211_ATTR_P2P_CTWINDOW] = NLA_POLICY_MAX(NLA_U8, 127), 658 [NL80211_ATTR_P2P_OPPPS] = NLA_POLICY_MAX(NLA_U8, 1), 659 [NL80211_ATTR_LOCAL_MESH_POWER_MODE] = 660 NLA_POLICY_RANGE(NLA_U32, 661 NL80211_MESH_POWER_UNKNOWN + 1, 662 NL80211_MESH_POWER_MAX), 663 [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 }, 664 [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED }, 665 [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 }, 666 [NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, }, 667 [NL80211_ATTR_SPLIT_WIPHY_DUMP] = { .type = NLA_FLAG, }, 668 [NL80211_ATTR_DISABLE_VHT] = { .type = NLA_FLAG }, 669 [NL80211_ATTR_VHT_CAPABILITY_MASK] = { 670 .len = NL80211_VHT_CAPABILITY_LEN, 671 }, 672 [NL80211_ATTR_MDID] = { .type = NLA_U16 }, 673 [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY, 674 .len = IEEE80211_MAX_DATA_LEN }, 675 [NL80211_ATTR_CRIT_PROT_ID] = { .type = NLA_U16 }, 676 [NL80211_ATTR_MAX_CRIT_PROT_DURATION] = 677 NLA_POLICY_MAX(NLA_U16, NL80211_CRIT_PROTO_MAX_DURATION), 678 [NL80211_ATTR_PEER_AID] = 679 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), 680 [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 }, 681 [NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG }, 682 [NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED }, 683 [NL80211_ATTR_CNTDWN_OFFS_BEACON] = { .type = NLA_BINARY }, 684 [NL80211_ATTR_CNTDWN_OFFS_PRESP] = { .type = NLA_BINARY }, 685 [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = NLA_POLICY_MIN_LEN(2), 686 /* 687 * The value of the Length field of the Supported Operating 688 * Classes element is between 2 and 253. 689 */ 690 [NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = 691 NLA_POLICY_RANGE(NLA_BINARY, 2, 253), 692 [NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG }, 693 [NL80211_ATTR_OPMODE_NOTIF] = { .type = NLA_U8 }, 694 [NL80211_ATTR_VENDOR_ID] = { .type = NLA_U32 }, 695 [NL80211_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 }, 696 [NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY }, 697 [NL80211_ATTR_QOS_MAP] = NLA_POLICY_RANGE(NLA_BINARY, 698 IEEE80211_QOS_MAP_LEN_MIN, 699 IEEE80211_QOS_MAP_LEN_MAX), 700 [NL80211_ATTR_MAC_HINT] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 701 [NL80211_ATTR_WIPHY_FREQ_HINT] = { .type = NLA_U32 }, 702 [NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 }, 703 [NL80211_ATTR_SOCKET_OWNER] = { .type = NLA_FLAG }, 704 [NL80211_ATTR_CSA_C_OFFSETS_TX] = { .type = NLA_BINARY }, 705 [NL80211_ATTR_USE_RRM] = { .type = NLA_FLAG }, 706 [NL80211_ATTR_TSID] = NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_TIDS - 1), 707 [NL80211_ATTR_USER_PRIO] = 708 NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1), 709 [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 }, 710 [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 }, 711 [NL80211_ATTR_OPER_CLASS] = { .type = NLA_U8 }, 712 [NL80211_ATTR_MAC_MASK] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 713 [NL80211_ATTR_WIPHY_SELF_MANAGED_REG] = { .type = NLA_FLAG }, 714 [NL80211_ATTR_NETNS_FD] = { .type = NLA_U32 }, 715 [NL80211_ATTR_SCHED_SCAN_DELAY] = { .type = NLA_U32 }, 716 [NL80211_ATTR_REG_INDOOR] = { .type = NLA_FLAG }, 717 [NL80211_ATTR_PBSS] = { .type = NLA_FLAG }, 718 [NL80211_ATTR_BSS_SELECT] = { .type = NLA_NESTED }, 719 [NL80211_ATTR_STA_SUPPORT_P2P_PS] = 720 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_P2P_PS_STATUS - 1), 721 [NL80211_ATTR_MU_MIMO_GROUP_DATA] = { 722 .len = VHT_MUMIMO_GROUPS_DATA_LEN 723 }, 724 [NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 725 [NL80211_ATTR_NAN_MASTER_PREF] = NLA_POLICY_MIN(NLA_U8, 1), 726 [NL80211_ATTR_BANDS] = { .type = NLA_U32 }, 727 [NL80211_ATTR_NAN_FUNC] = { .type = NLA_NESTED }, 728 [NL80211_ATTR_FILS_KEK] = { .type = NLA_BINARY, 729 .len = FILS_MAX_KEK_LEN }, 730 [NL80211_ATTR_FILS_NONCES] = NLA_POLICY_EXACT_LEN_WARN(2 * FILS_NONCE_LEN), 731 [NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED] = { .type = NLA_FLAG, }, 732 [NL80211_ATTR_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 733 [NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] = { .type = NLA_S8 }, 734 [NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST] = { 735 .len = sizeof(struct nl80211_bss_select_rssi_adjust) 736 }, 737 [NL80211_ATTR_TIMEOUT_REASON] = { .type = NLA_U32 }, 738 [NL80211_ATTR_FILS_ERP_USERNAME] = { .type = NLA_BINARY, 739 .len = FILS_ERP_MAX_USERNAME_LEN }, 740 [NL80211_ATTR_FILS_ERP_REALM] = { .type = NLA_BINARY, 741 .len = FILS_ERP_MAX_REALM_LEN }, 742 [NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] = { .type = NLA_U16 }, 743 [NL80211_ATTR_FILS_ERP_RRK] = { .type = NLA_BINARY, 744 .len = FILS_ERP_MAX_RRK_LEN }, 745 [NL80211_ATTR_FILS_CACHE_ID] = NLA_POLICY_EXACT_LEN_WARN(2), 746 [NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN }, 747 [NL80211_ATTR_PMKR0_NAME] = NLA_POLICY_EXACT_LEN(WLAN_PMK_NAME_LEN), 748 [NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG }, 749 [NL80211_ATTR_EXTERNAL_AUTH_SUPPORT] = { .type = NLA_FLAG }, 750 751 [NL80211_ATTR_TXQ_LIMIT] = { .type = NLA_U32 }, 752 [NL80211_ATTR_TXQ_MEMORY_LIMIT] = { .type = NLA_U32 }, 753 [NL80211_ATTR_TXQ_QUANTUM] = { .type = NLA_U32 }, 754 [NL80211_ATTR_HE_CAPABILITY] = 755 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_he_capa, 756 NL80211_HE_MAX_CAPABILITY_LEN), 757 [NL80211_ATTR_FTM_RESPONDER] = 758 NLA_POLICY_NESTED(nl80211_ftm_responder_policy), 759 [NL80211_ATTR_TIMEOUT] = NLA_POLICY_MIN(NLA_U32, 1), 760 [NL80211_ATTR_PEER_MEASUREMENTS] = 761 NLA_POLICY_NESTED(nl80211_pmsr_attr_policy), 762 [NL80211_ATTR_AIRTIME_WEIGHT] = NLA_POLICY_MIN(NLA_U16, 1), 763 [NL80211_ATTR_SAE_PASSWORD] = { .type = NLA_BINARY, 764 .len = SAE_PASSWORD_MAX_LEN }, 765 [NL80211_ATTR_TWT_RESPONDER] = { .type = NLA_FLAG }, 766 [NL80211_ATTR_HE_OBSS_PD] = NLA_POLICY_NESTED(he_obss_pd_policy), 767 [NL80211_ATTR_VLAN_ID] = NLA_POLICY_RANGE(NLA_U16, 1, VLAN_N_VID - 2), 768 [NL80211_ATTR_HE_BSS_COLOR] = NLA_POLICY_NESTED(he_bss_color_policy), 769 [NL80211_ATTR_TID_CONFIG] = 770 NLA_POLICY_NESTED_ARRAY(nl80211_tid_config_attr_policy), 771 [NL80211_ATTR_CONTROL_PORT_NO_PREAUTH] = { .type = NLA_FLAG }, 772 [NL80211_ATTR_PMK_LIFETIME] = NLA_POLICY_MIN(NLA_U32, 1), 773 [NL80211_ATTR_PMK_REAUTH_THRESHOLD] = NLA_POLICY_RANGE(NLA_U8, 1, 100), 774 [NL80211_ATTR_RECEIVE_MULTICAST] = { .type = NLA_FLAG }, 775 [NL80211_ATTR_WIPHY_FREQ_OFFSET] = NLA_POLICY_RANGE(NLA_U32, 0, 999), 776 [NL80211_ATTR_SCAN_FREQ_KHZ] = { .type = NLA_NESTED }, 777 [NL80211_ATTR_HE_6GHZ_CAPABILITY] = 778 NLA_POLICY_EXACT_LEN(sizeof(struct ieee80211_he_6ghz_capa)), 779 [NL80211_ATTR_FILS_DISCOVERY] = 780 NLA_POLICY_NESTED(nl80211_fils_discovery_policy), 781 [NL80211_ATTR_UNSOL_BCAST_PROBE_RESP] = 782 NLA_POLICY_NESTED(nl80211_unsol_bcast_probe_resp_policy), 783 [NL80211_ATTR_S1G_CAPABILITY] = 784 NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN), 785 [NL80211_ATTR_S1G_CAPABILITY_MASK] = 786 NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN), 787 [NL80211_ATTR_SAE_PWE] = 788 NLA_POLICY_RANGE(NLA_U8, NL80211_SAE_PWE_HUNT_AND_PECK, 789 NL80211_SAE_PWE_BOTH), 790 [NL80211_ATTR_RECONNECT_REQUESTED] = { .type = NLA_REJECT }, 791 [NL80211_ATTR_SAR_SPEC] = NLA_POLICY_NESTED(sar_policy), 792 [NL80211_ATTR_DISABLE_HE] = { .type = NLA_FLAG }, 793 [NL80211_ATTR_OBSS_COLOR_BITMAP] = { .type = NLA_U64 }, 794 [NL80211_ATTR_COLOR_CHANGE_COUNT] = { .type = NLA_U8 }, 795 [NL80211_ATTR_COLOR_CHANGE_COLOR] = { .type = NLA_U8 }, 796 [NL80211_ATTR_COLOR_CHANGE_ELEMS] = NLA_POLICY_NESTED(nl80211_policy), 797 [NL80211_ATTR_MBSSID_CONFIG] = 798 NLA_POLICY_NESTED(nl80211_mbssid_config_policy), 799 [NL80211_ATTR_MBSSID_ELEMS] = { .type = NLA_NESTED }, 800 [NL80211_ATTR_RADAR_BACKGROUND] = { .type = NLA_FLAG }, 801 [NL80211_ATTR_AP_SETTINGS_FLAGS] = { .type = NLA_U32 }, 802 [NL80211_ATTR_EHT_CAPABILITY] = 803 NLA_POLICY_RANGE(NLA_BINARY, 804 NL80211_EHT_MIN_CAPABILITY_LEN, 805 NL80211_EHT_MAX_CAPABILITY_LEN), 806 [NL80211_ATTR_DISABLE_EHT] = { .type = NLA_FLAG }, 807 [NL80211_ATTR_MLO_LINKS] = 808 NLA_POLICY_NESTED_ARRAY(nl80211_policy), 809 [NL80211_ATTR_MLO_LINK_ID] = 810 NLA_POLICY_RANGE(NLA_U8, 0, IEEE80211_MLD_MAX_NUM_LINKS), 811 [NL80211_ATTR_MLD_ADDR] = NLA_POLICY_EXACT_LEN(ETH_ALEN), 812 [NL80211_ATTR_MLO_SUPPORT] = { .type = NLA_FLAG }, 813 [NL80211_ATTR_MAX_NUM_AKM_SUITES] = { .type = NLA_REJECT }, 814 [NL80211_ATTR_PUNCT_BITMAP] = 815 NLA_POLICY_FULL_RANGE(NLA_U32, &nl80211_punct_bitmap_range), 816 817 [NL80211_ATTR_MAX_HW_TIMESTAMP_PEERS] = { .type = NLA_U16 }, 818 [NL80211_ATTR_HW_TIMESTAMP_ENABLED] = { .type = NLA_FLAG }, 819 [NL80211_ATTR_EMA_RNR_ELEMS] = { .type = NLA_NESTED }, 820 [NL80211_ATTR_MLO_LINK_DISABLED] = { .type = NLA_FLAG }, 821 [NL80211_ATTR_BSS_DUMP_INCLUDE_USE_DATA] = { .type = NLA_FLAG }, 822 [NL80211_ATTR_MLO_TTLM_DLINK] = NLA_POLICY_EXACT_LEN(sizeof(u16) * 8), 823 [NL80211_ATTR_MLO_TTLM_ULINK] = NLA_POLICY_EXACT_LEN(sizeof(u16) * 8), 824 }; 825 826 /* policy for the key attributes */ 827 static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = { 828 [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN }, 829 [NL80211_KEY_IDX] = { .type = NLA_U8 }, 830 [NL80211_KEY_CIPHER] = { .type = NLA_U32 }, 831 [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 }, 832 [NL80211_KEY_DEFAULT] = { .type = NLA_FLAG }, 833 [NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG }, 834 [NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1), 835 [NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED }, 836 [NL80211_KEY_MODE] = NLA_POLICY_RANGE(NLA_U8, 0, NL80211_KEY_SET_TX), 837 }; 838 839 /* policy for the key default flags */ 840 static const struct nla_policy 841 nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = { 842 [NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG }, 843 [NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG }, 844 }; 845 846 #ifdef CONFIG_PM 847 /* policy for WoWLAN attributes */ 848 static const struct nla_policy 849 nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = { 850 [NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG }, 851 [NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG }, 852 [NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG }, 853 [NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED }, 854 [NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE] = { .type = NLA_FLAG }, 855 [NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST] = { .type = NLA_FLAG }, 856 [NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE] = { .type = NLA_FLAG }, 857 [NL80211_WOWLAN_TRIG_RFKILL_RELEASE] = { .type = NLA_FLAG }, 858 [NL80211_WOWLAN_TRIG_TCP_CONNECTION] = { .type = NLA_NESTED }, 859 [NL80211_WOWLAN_TRIG_NET_DETECT] = { .type = NLA_NESTED }, 860 }; 861 862 static const struct nla_policy 863 nl80211_wowlan_tcp_policy[NUM_NL80211_WOWLAN_TCP] = { 864 [NL80211_WOWLAN_TCP_SRC_IPV4] = { .type = NLA_U32 }, 865 [NL80211_WOWLAN_TCP_DST_IPV4] = { .type = NLA_U32 }, 866 [NL80211_WOWLAN_TCP_DST_MAC] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 867 [NL80211_WOWLAN_TCP_SRC_PORT] = { .type = NLA_U16 }, 868 [NL80211_WOWLAN_TCP_DST_PORT] = { .type = NLA_U16 }, 869 [NL80211_WOWLAN_TCP_DATA_PAYLOAD] = NLA_POLICY_MIN_LEN(1), 870 [NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ] = { 871 .len = sizeof(struct nl80211_wowlan_tcp_data_seq) 872 }, 873 [NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN] = { 874 .len = sizeof(struct nl80211_wowlan_tcp_data_token) 875 }, 876 [NL80211_WOWLAN_TCP_DATA_INTERVAL] = { .type = NLA_U32 }, 877 [NL80211_WOWLAN_TCP_WAKE_PAYLOAD] = NLA_POLICY_MIN_LEN(1), 878 [NL80211_WOWLAN_TCP_WAKE_MASK] = NLA_POLICY_MIN_LEN(1), 879 }; 880 #endif /* CONFIG_PM */ 881 882 /* policy for coalesce rule attributes */ 883 static const struct nla_policy 884 nl80211_coalesce_policy[NUM_NL80211_ATTR_COALESCE_RULE] = { 885 [NL80211_ATTR_COALESCE_RULE_DELAY] = { .type = NLA_U32 }, 886 [NL80211_ATTR_COALESCE_RULE_CONDITION] = 887 NLA_POLICY_RANGE(NLA_U32, 888 NL80211_COALESCE_CONDITION_MATCH, 889 NL80211_COALESCE_CONDITION_NO_MATCH), 890 [NL80211_ATTR_COALESCE_RULE_PKT_PATTERN] = { .type = NLA_NESTED }, 891 }; 892 893 /* policy for GTK rekey offload attributes */ 894 static const struct nla_policy 895 nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = { 896 [NL80211_REKEY_DATA_KEK] = { 897 .type = NLA_BINARY, 898 .len = NL80211_KEK_EXT_LEN 899 }, 900 [NL80211_REKEY_DATA_KCK] = { 901 .type = NLA_BINARY, 902 .len = NL80211_KCK_EXT_LEN_32 903 }, 904 [NL80211_REKEY_DATA_REPLAY_CTR] = NLA_POLICY_EXACT_LEN(NL80211_REPLAY_CTR_LEN), 905 [NL80211_REKEY_DATA_AKM] = { .type = NLA_U32 }, 906 }; 907 908 static const struct nla_policy 909 nl80211_match_band_rssi_policy[NUM_NL80211_BANDS] = { 910 [NL80211_BAND_2GHZ] = { .type = NLA_S32 }, 911 [NL80211_BAND_5GHZ] = { .type = NLA_S32 }, 912 [NL80211_BAND_6GHZ] = { .type = NLA_S32 }, 913 [NL80211_BAND_60GHZ] = { .type = NLA_S32 }, 914 [NL80211_BAND_LC] = { .type = NLA_S32 }, 915 }; 916 917 static const struct nla_policy 918 nl80211_match_policy[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1] = { 919 [NL80211_SCHED_SCAN_MATCH_ATTR_SSID] = { .type = NLA_BINARY, 920 .len = IEEE80211_MAX_SSID_LEN }, 921 [NL80211_SCHED_SCAN_MATCH_ATTR_BSSID] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 922 [NL80211_SCHED_SCAN_MATCH_ATTR_RSSI] = { .type = NLA_U32 }, 923 [NL80211_SCHED_SCAN_MATCH_PER_BAND_RSSI] = 924 NLA_POLICY_NESTED(nl80211_match_band_rssi_policy), 925 }; 926 927 static const struct nla_policy 928 nl80211_plan_policy[NL80211_SCHED_SCAN_PLAN_MAX + 1] = { 929 [NL80211_SCHED_SCAN_PLAN_INTERVAL] = { .type = NLA_U32 }, 930 [NL80211_SCHED_SCAN_PLAN_ITERATIONS] = { .type = NLA_U32 }, 931 }; 932 933 static const struct nla_policy 934 nl80211_bss_select_policy[NL80211_BSS_SELECT_ATTR_MAX + 1] = { 935 [NL80211_BSS_SELECT_ATTR_RSSI] = { .type = NLA_FLAG }, 936 [NL80211_BSS_SELECT_ATTR_BAND_PREF] = { .type = NLA_U32 }, 937 [NL80211_BSS_SELECT_ATTR_RSSI_ADJUST] = { 938 .len = sizeof(struct nl80211_bss_select_rssi_adjust) 939 }, 940 }; 941 942 /* policy for NAN function attributes */ 943 static const struct nla_policy 944 nl80211_nan_func_policy[NL80211_NAN_FUNC_ATTR_MAX + 1] = { 945 [NL80211_NAN_FUNC_TYPE] = 946 NLA_POLICY_MAX(NLA_U8, NL80211_NAN_FUNC_MAX_TYPE), 947 [NL80211_NAN_FUNC_SERVICE_ID] = { 948 .len = NL80211_NAN_FUNC_SERVICE_ID_LEN }, 949 [NL80211_NAN_FUNC_PUBLISH_TYPE] = { .type = NLA_U8 }, 950 [NL80211_NAN_FUNC_PUBLISH_BCAST] = { .type = NLA_FLAG }, 951 [NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE] = { .type = NLA_FLAG }, 952 [NL80211_NAN_FUNC_FOLLOW_UP_ID] = { .type = NLA_U8 }, 953 [NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] = { .type = NLA_U8 }, 954 [NL80211_NAN_FUNC_FOLLOW_UP_DEST] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN), 955 [NL80211_NAN_FUNC_CLOSE_RANGE] = { .type = NLA_FLAG }, 956 [NL80211_NAN_FUNC_TTL] = { .type = NLA_U32 }, 957 [NL80211_NAN_FUNC_SERVICE_INFO] = { .type = NLA_BINARY, 958 .len = NL80211_NAN_FUNC_SERVICE_SPEC_INFO_MAX_LEN }, 959 [NL80211_NAN_FUNC_SRF] = { .type = NLA_NESTED }, 960 [NL80211_NAN_FUNC_RX_MATCH_FILTER] = { .type = NLA_NESTED }, 961 [NL80211_NAN_FUNC_TX_MATCH_FILTER] = { .type = NLA_NESTED }, 962 [NL80211_NAN_FUNC_INSTANCE_ID] = { .type = NLA_U8 }, 963 [NL80211_NAN_FUNC_TERM_REASON] = { .type = NLA_U8 }, 964 }; 965 966 /* policy for Service Response Filter attributes */ 967 static const struct nla_policy 968 nl80211_nan_srf_policy[NL80211_NAN_SRF_ATTR_MAX + 1] = { 969 [NL80211_NAN_SRF_INCLUDE] = { .type = NLA_FLAG }, 970 [NL80211_NAN_SRF_BF] = { .type = NLA_BINARY, 971 .len = NL80211_NAN_FUNC_SRF_MAX_LEN }, 972 [NL80211_NAN_SRF_BF_IDX] = { .type = NLA_U8 }, 973 [NL80211_NAN_SRF_MAC_ADDRS] = { .type = NLA_NESTED }, 974 }; 975 976 /* policy for packet pattern attributes */ 977 static const struct nla_policy 978 nl80211_packet_pattern_policy[MAX_NL80211_PKTPAT + 1] = { 979 [NL80211_PKTPAT_MASK] = { .type = NLA_BINARY, }, 980 [NL80211_PKTPAT_PATTERN] = { .type = NLA_BINARY, }, 981 [NL80211_PKTPAT_OFFSET] = { .type = NLA_U32 }, 982 }; 983 984 static int nl80211_prepare_wdev_dump(struct netlink_callback *cb, 985 struct cfg80211_registered_device **rdev, 986 struct wireless_dev **wdev, 987 struct nlattr **attrbuf) 988 { 989 int err; 990 991 if (!cb->args[0]) { 992 struct nlattr **attrbuf_free = NULL; 993 994 if (!attrbuf) { 995 attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf), 996 GFP_KERNEL); 997 if (!attrbuf) 998 return -ENOMEM; 999 attrbuf_free = attrbuf; 1000 } 1001 1002 err = nlmsg_parse_deprecated(cb->nlh, 1003 GENL_HDRLEN + nl80211_fam.hdrsize, 1004 attrbuf, nl80211_fam.maxattr, 1005 nl80211_policy, NULL); 1006 if (err) { 1007 kfree(attrbuf_free); 1008 return err; 1009 } 1010 1011 rtnl_lock(); 1012 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(cb->skb->sk), 1013 attrbuf); 1014 kfree(attrbuf_free); 1015 if (IS_ERR(*wdev)) { 1016 rtnl_unlock(); 1017 return PTR_ERR(*wdev); 1018 } 1019 *rdev = wiphy_to_rdev((*wdev)->wiphy); 1020 mutex_lock(&(*rdev)->wiphy.mtx); 1021 rtnl_unlock(); 1022 /* 0 is the first index - add 1 to parse only once */ 1023 cb->args[0] = (*rdev)->wiphy_idx + 1; 1024 cb->args[1] = (*wdev)->identifier; 1025 } else { 1026 /* subtract the 1 again here */ 1027 struct wiphy *wiphy; 1028 struct wireless_dev *tmp; 1029 1030 rtnl_lock(); 1031 wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); 1032 if (!wiphy) { 1033 rtnl_unlock(); 1034 return -ENODEV; 1035 } 1036 *rdev = wiphy_to_rdev(wiphy); 1037 *wdev = NULL; 1038 1039 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) { 1040 if (tmp->identifier == cb->args[1]) { 1041 *wdev = tmp; 1042 break; 1043 } 1044 } 1045 1046 if (!*wdev) { 1047 rtnl_unlock(); 1048 return -ENODEV; 1049 } 1050 mutex_lock(&(*rdev)->wiphy.mtx); 1051 rtnl_unlock(); 1052 } 1053 1054 return 0; 1055 } 1056 1057 /* message building helper */ 1058 void *nl80211hdr_put(struct sk_buff *skb, u32 portid, u32 seq, 1059 int flags, u8 cmd) 1060 { 1061 /* since there is no private header just add the generic one */ 1062 return genlmsg_put(skb, portid, seq, &nl80211_fam, flags, cmd); 1063 } 1064 1065 static int nl80211_msg_put_wmm_rules(struct sk_buff *msg, 1066 const struct ieee80211_reg_rule *rule) 1067 { 1068 int j; 1069 struct nlattr *nl_wmm_rules = 1070 nla_nest_start_noflag(msg, NL80211_FREQUENCY_ATTR_WMM); 1071 1072 if (!nl_wmm_rules) 1073 goto nla_put_failure; 1074 1075 for (j = 0; j < IEEE80211_NUM_ACS; j++) { 1076 struct nlattr *nl_wmm_rule = nla_nest_start_noflag(msg, j); 1077 1078 if (!nl_wmm_rule) 1079 goto nla_put_failure; 1080 1081 if (nla_put_u16(msg, NL80211_WMMR_CW_MIN, 1082 rule->wmm_rule.client[j].cw_min) || 1083 nla_put_u16(msg, NL80211_WMMR_CW_MAX, 1084 rule->wmm_rule.client[j].cw_max) || 1085 nla_put_u8(msg, NL80211_WMMR_AIFSN, 1086 rule->wmm_rule.client[j].aifsn) || 1087 nla_put_u16(msg, NL80211_WMMR_TXOP, 1088 rule->wmm_rule.client[j].cot)) 1089 goto nla_put_failure; 1090 1091 nla_nest_end(msg, nl_wmm_rule); 1092 } 1093 nla_nest_end(msg, nl_wmm_rules); 1094 1095 return 0; 1096 1097 nla_put_failure: 1098 return -ENOBUFS; 1099 } 1100 1101 static int nl80211_msg_put_channel(struct sk_buff *msg, struct wiphy *wiphy, 1102 struct ieee80211_channel *chan, 1103 bool large) 1104 { 1105 /* Some channels must be completely excluded from the 1106 * list to protect old user-space tools from breaking 1107 */ 1108 if (!large && chan->flags & 1109 (IEEE80211_CHAN_NO_10MHZ | IEEE80211_CHAN_NO_20MHZ)) 1110 return 0; 1111 if (!large && chan->freq_offset) 1112 return 0; 1113 1114 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ, 1115 chan->center_freq)) 1116 goto nla_put_failure; 1117 1118 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_OFFSET, chan->freq_offset)) 1119 goto nla_put_failure; 1120 1121 if ((chan->flags & IEEE80211_CHAN_PSD) && 1122 nla_put_s8(msg, NL80211_FREQUENCY_ATTR_PSD, chan->psd)) 1123 goto nla_put_failure; 1124 1125 if ((chan->flags & IEEE80211_CHAN_DISABLED) && 1126 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DISABLED)) 1127 goto nla_put_failure; 1128 if (chan->flags & IEEE80211_CHAN_NO_IR) { 1129 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IR)) 1130 goto nla_put_failure; 1131 if (nla_put_flag(msg, __NL80211_FREQUENCY_ATTR_NO_IBSS)) 1132 goto nla_put_failure; 1133 } 1134 if (chan->flags & IEEE80211_CHAN_RADAR) { 1135 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR)) 1136 goto nla_put_failure; 1137 if (large) { 1138 u32 time; 1139 1140 time = elapsed_jiffies_msecs(chan->dfs_state_entered); 1141 1142 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE, 1143 chan->dfs_state)) 1144 goto nla_put_failure; 1145 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME, 1146 time)) 1147 goto nla_put_failure; 1148 if (nla_put_u32(msg, 1149 NL80211_FREQUENCY_ATTR_DFS_CAC_TIME, 1150 chan->dfs_cac_ms)) 1151 goto nla_put_failure; 1152 } 1153 } 1154 1155 if (large) { 1156 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) && 1157 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS)) 1158 goto nla_put_failure; 1159 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) && 1160 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS)) 1161 goto nla_put_failure; 1162 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) && 1163 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ)) 1164 goto nla_put_failure; 1165 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) && 1166 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ)) 1167 goto nla_put_failure; 1168 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) && 1169 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_INDOOR_ONLY)) 1170 goto nla_put_failure; 1171 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) && 1172 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_IR_CONCURRENT)) 1173 goto nla_put_failure; 1174 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) && 1175 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_20MHZ)) 1176 goto nla_put_failure; 1177 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) && 1178 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_10MHZ)) 1179 goto nla_put_failure; 1180 if ((chan->flags & IEEE80211_CHAN_NO_HE) && 1181 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HE)) 1182 goto nla_put_failure; 1183 if ((chan->flags & IEEE80211_CHAN_1MHZ) && 1184 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_1MHZ)) 1185 goto nla_put_failure; 1186 if ((chan->flags & IEEE80211_CHAN_2MHZ) && 1187 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_2MHZ)) 1188 goto nla_put_failure; 1189 if ((chan->flags & IEEE80211_CHAN_4MHZ) && 1190 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_4MHZ)) 1191 goto nla_put_failure; 1192 if ((chan->flags & IEEE80211_CHAN_8MHZ) && 1193 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_8MHZ)) 1194 goto nla_put_failure; 1195 if ((chan->flags & IEEE80211_CHAN_16MHZ) && 1196 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_16MHZ)) 1197 goto nla_put_failure; 1198 if ((chan->flags & IEEE80211_CHAN_NO_320MHZ) && 1199 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_320MHZ)) 1200 goto nla_put_failure; 1201 if ((chan->flags & IEEE80211_CHAN_NO_EHT) && 1202 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_EHT)) 1203 goto nla_put_failure; 1204 } 1205 1206 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER, 1207 DBM_TO_MBM(chan->max_power))) 1208 goto nla_put_failure; 1209 1210 if (large) { 1211 const struct ieee80211_reg_rule *rule = 1212 freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq)); 1213 1214 if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) { 1215 if (nl80211_msg_put_wmm_rules(msg, rule)) 1216 goto nla_put_failure; 1217 } 1218 } 1219 1220 return 0; 1221 1222 nla_put_failure: 1223 return -ENOBUFS; 1224 } 1225 1226 static bool nl80211_put_txq_stats(struct sk_buff *msg, 1227 struct cfg80211_txq_stats *txqstats, 1228 int attrtype) 1229 { 1230 struct nlattr *txqattr; 1231 1232 #define PUT_TXQVAL_U32(attr, memb) do { \ 1233 if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) && \ 1234 nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \ 1235 return false; \ 1236 } while (0) 1237 1238 txqattr = nla_nest_start_noflag(msg, attrtype); 1239 if (!txqattr) 1240 return false; 1241 1242 PUT_TXQVAL_U32(BACKLOG_BYTES, backlog_bytes); 1243 PUT_TXQVAL_U32(BACKLOG_PACKETS, backlog_packets); 1244 PUT_TXQVAL_U32(FLOWS, flows); 1245 PUT_TXQVAL_U32(DROPS, drops); 1246 PUT_TXQVAL_U32(ECN_MARKS, ecn_marks); 1247 PUT_TXQVAL_U32(OVERLIMIT, overlimit); 1248 PUT_TXQVAL_U32(OVERMEMORY, overmemory); 1249 PUT_TXQVAL_U32(COLLISIONS, collisions); 1250 PUT_TXQVAL_U32(TX_BYTES, tx_bytes); 1251 PUT_TXQVAL_U32(TX_PACKETS, tx_packets); 1252 PUT_TXQVAL_U32(MAX_FLOWS, max_flows); 1253 nla_nest_end(msg, txqattr); 1254 1255 #undef PUT_TXQVAL_U32 1256 return true; 1257 } 1258 1259 /* netlink command implementations */ 1260 1261 /** 1262 * nl80211_link_id - return link ID 1263 * @attrs: attributes to look at 1264 * 1265 * Returns: the link ID or 0 if not given 1266 * 1267 * Note this function doesn't do any validation of the link 1268 * ID validity wrt. links that were actually added, so it must 1269 * be called only from ops with %NL80211_FLAG_MLO_VALID_LINK_ID 1270 * or if additional validation is done. 1271 */ 1272 static unsigned int nl80211_link_id(struct nlattr **attrs) 1273 { 1274 struct nlattr *linkid = attrs[NL80211_ATTR_MLO_LINK_ID]; 1275 1276 if (!linkid) 1277 return 0; 1278 1279 return nla_get_u8(linkid); 1280 } 1281 1282 static int nl80211_link_id_or_invalid(struct nlattr **attrs) 1283 { 1284 struct nlattr *linkid = attrs[NL80211_ATTR_MLO_LINK_ID]; 1285 1286 if (!linkid) 1287 return -1; 1288 1289 return nla_get_u8(linkid); 1290 } 1291 1292 struct key_parse { 1293 struct key_params p; 1294 int idx; 1295 int type; 1296 bool def, defmgmt, defbeacon; 1297 bool def_uni, def_multi; 1298 }; 1299 1300 static int nl80211_parse_key_new(struct genl_info *info, struct nlattr *key, 1301 struct key_parse *k) 1302 { 1303 struct nlattr *tb[NL80211_KEY_MAX + 1]; 1304 int err = nla_parse_nested_deprecated(tb, NL80211_KEY_MAX, key, 1305 nl80211_key_policy, 1306 info->extack); 1307 if (err) 1308 return err; 1309 1310 k->def = !!tb[NL80211_KEY_DEFAULT]; 1311 k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT]; 1312 k->defbeacon = !!tb[NL80211_KEY_DEFAULT_BEACON]; 1313 1314 if (k->def) { 1315 k->def_uni = true; 1316 k->def_multi = true; 1317 } 1318 if (k->defmgmt || k->defbeacon) 1319 k->def_multi = true; 1320 1321 if (tb[NL80211_KEY_IDX]) 1322 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]); 1323 1324 if (tb[NL80211_KEY_DATA]) { 1325 k->p.key = nla_data(tb[NL80211_KEY_DATA]); 1326 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]); 1327 } 1328 1329 if (tb[NL80211_KEY_SEQ]) { 1330 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]); 1331 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]); 1332 } 1333 1334 if (tb[NL80211_KEY_CIPHER]) 1335 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]); 1336 1337 if (tb[NL80211_KEY_TYPE]) 1338 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]); 1339 1340 if (tb[NL80211_KEY_DEFAULT_TYPES]) { 1341 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES]; 1342 1343 err = nla_parse_nested_deprecated(kdt, 1344 NUM_NL80211_KEY_DEFAULT_TYPES - 1, 1345 tb[NL80211_KEY_DEFAULT_TYPES], 1346 nl80211_key_default_policy, 1347 info->extack); 1348 if (err) 1349 return err; 1350 1351 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; 1352 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; 1353 } 1354 1355 if (tb[NL80211_KEY_MODE]) 1356 k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]); 1357 1358 return 0; 1359 } 1360 1361 static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k) 1362 { 1363 if (info->attrs[NL80211_ATTR_KEY_DATA]) { 1364 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]); 1365 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]); 1366 } 1367 1368 if (info->attrs[NL80211_ATTR_KEY_SEQ]) { 1369 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]); 1370 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]); 1371 } 1372 1373 if (info->attrs[NL80211_ATTR_KEY_IDX]) 1374 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); 1375 1376 if (info->attrs[NL80211_ATTR_KEY_CIPHER]) 1377 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]); 1378 1379 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT]; 1380 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT]; 1381 1382 if (k->def) { 1383 k->def_uni = true; 1384 k->def_multi = true; 1385 } 1386 if (k->defmgmt) 1387 k->def_multi = true; 1388 1389 if (info->attrs[NL80211_ATTR_KEY_TYPE]) 1390 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); 1391 1392 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) { 1393 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES]; 1394 int err = nla_parse_nested_deprecated(kdt, 1395 NUM_NL80211_KEY_DEFAULT_TYPES - 1, 1396 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES], 1397 nl80211_key_default_policy, 1398 info->extack); 1399 if (err) 1400 return err; 1401 1402 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; 1403 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; 1404 } 1405 1406 return 0; 1407 } 1408 1409 static int nl80211_parse_key(struct genl_info *info, struct key_parse *k) 1410 { 1411 int err; 1412 1413 memset(k, 0, sizeof(*k)); 1414 k->idx = -1; 1415 k->type = -1; 1416 1417 if (info->attrs[NL80211_ATTR_KEY]) 1418 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k); 1419 else 1420 err = nl80211_parse_key_old(info, k); 1421 1422 if (err) 1423 return err; 1424 1425 if ((k->def ? 1 : 0) + (k->defmgmt ? 1 : 0) + 1426 (k->defbeacon ? 1 : 0) > 1) { 1427 GENL_SET_ERR_MSG(info, 1428 "key with multiple default flags is invalid"); 1429 return -EINVAL; 1430 } 1431 1432 if (k->defmgmt || k->defbeacon) { 1433 if (k->def_uni || !k->def_multi) { 1434 GENL_SET_ERR_MSG(info, 1435 "defmgmt/defbeacon key must be mcast"); 1436 return -EINVAL; 1437 } 1438 } 1439 1440 if (k->idx != -1) { 1441 if (k->defmgmt) { 1442 if (k->idx < 4 || k->idx > 5) { 1443 GENL_SET_ERR_MSG(info, 1444 "defmgmt key idx not 4 or 5"); 1445 return -EINVAL; 1446 } 1447 } else if (k->defbeacon) { 1448 if (k->idx < 6 || k->idx > 7) { 1449 GENL_SET_ERR_MSG(info, 1450 "defbeacon key idx not 6 or 7"); 1451 return -EINVAL; 1452 } 1453 } else if (k->def) { 1454 if (k->idx < 0 || k->idx > 3) { 1455 GENL_SET_ERR_MSG(info, "def key idx not 0-3"); 1456 return -EINVAL; 1457 } 1458 } else { 1459 if (k->idx < 0 || k->idx > 7) { 1460 GENL_SET_ERR_MSG(info, "key idx not 0-7"); 1461 return -EINVAL; 1462 } 1463 } 1464 } 1465 1466 return 0; 1467 } 1468 1469 static struct cfg80211_cached_keys * 1470 nl80211_parse_connkeys(struct cfg80211_registered_device *rdev, 1471 struct genl_info *info, bool *no_ht) 1472 { 1473 struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS]; 1474 struct key_parse parse; 1475 struct nlattr *key; 1476 struct cfg80211_cached_keys *result; 1477 int rem, err, def = 0; 1478 bool have_key = false; 1479 1480 nla_for_each_nested(key, keys, rem) { 1481 have_key = true; 1482 break; 1483 } 1484 1485 if (!have_key) 1486 return NULL; 1487 1488 result = kzalloc(sizeof(*result), GFP_KERNEL); 1489 if (!result) 1490 return ERR_PTR(-ENOMEM); 1491 1492 result->def = -1; 1493 1494 nla_for_each_nested(key, keys, rem) { 1495 memset(&parse, 0, sizeof(parse)); 1496 parse.idx = -1; 1497 1498 err = nl80211_parse_key_new(info, key, &parse); 1499 if (err) 1500 goto error; 1501 err = -EINVAL; 1502 if (!parse.p.key) 1503 goto error; 1504 if (parse.idx < 0 || parse.idx > 3) { 1505 GENL_SET_ERR_MSG(info, "key index out of range [0-3]"); 1506 goto error; 1507 } 1508 if (parse.def) { 1509 if (def) { 1510 GENL_SET_ERR_MSG(info, 1511 "only one key can be default"); 1512 goto error; 1513 } 1514 def = 1; 1515 result->def = parse.idx; 1516 if (!parse.def_uni || !parse.def_multi) 1517 goto error; 1518 } else if (parse.defmgmt) 1519 goto error; 1520 err = cfg80211_validate_key_settings(rdev, &parse.p, 1521 parse.idx, false, NULL); 1522 if (err) 1523 goto error; 1524 if (parse.p.cipher != WLAN_CIPHER_SUITE_WEP40 && 1525 parse.p.cipher != WLAN_CIPHER_SUITE_WEP104) { 1526 GENL_SET_ERR_MSG(info, "connect key must be WEP"); 1527 err = -EINVAL; 1528 goto error; 1529 } 1530 result->params[parse.idx].cipher = parse.p.cipher; 1531 result->params[parse.idx].key_len = parse.p.key_len; 1532 result->params[parse.idx].key = result->data[parse.idx]; 1533 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len); 1534 1535 /* must be WEP key if we got here */ 1536 if (no_ht) 1537 *no_ht = true; 1538 } 1539 1540 if (result->def < 0) { 1541 err = -EINVAL; 1542 GENL_SET_ERR_MSG(info, "need a default/TX key"); 1543 goto error; 1544 } 1545 1546 return result; 1547 error: 1548 kfree(result); 1549 return ERR_PTR(err); 1550 } 1551 1552 static int nl80211_key_allowed(struct wireless_dev *wdev) 1553 { 1554 lockdep_assert_wiphy(wdev->wiphy); 1555 1556 switch (wdev->iftype) { 1557 case NL80211_IFTYPE_AP: 1558 case NL80211_IFTYPE_AP_VLAN: 1559 case NL80211_IFTYPE_P2P_GO: 1560 case NL80211_IFTYPE_MESH_POINT: 1561 break; 1562 case NL80211_IFTYPE_ADHOC: 1563 if (wdev->u.ibss.current_bss) 1564 return 0; 1565 return -ENOLINK; 1566 case NL80211_IFTYPE_STATION: 1567 case NL80211_IFTYPE_P2P_CLIENT: 1568 if (wdev->connected) 1569 return 0; 1570 return -ENOLINK; 1571 case NL80211_IFTYPE_NAN: 1572 if (wiphy_ext_feature_isset(wdev->wiphy, 1573 NL80211_EXT_FEATURE_SECURE_NAN)) 1574 return 0; 1575 return -EINVAL; 1576 case NL80211_IFTYPE_UNSPECIFIED: 1577 case NL80211_IFTYPE_OCB: 1578 case NL80211_IFTYPE_MONITOR: 1579 case NL80211_IFTYPE_P2P_DEVICE: 1580 case NL80211_IFTYPE_WDS: 1581 case NUM_NL80211_IFTYPES: 1582 return -EINVAL; 1583 } 1584 1585 return 0; 1586 } 1587 1588 static struct ieee80211_channel *nl80211_get_valid_chan(struct wiphy *wiphy, 1589 u32 freq) 1590 { 1591 struct ieee80211_channel *chan; 1592 1593 chan = ieee80211_get_channel_khz(wiphy, freq); 1594 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) 1595 return NULL; 1596 return chan; 1597 } 1598 1599 static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes) 1600 { 1601 struct nlattr *nl_modes = nla_nest_start_noflag(msg, attr); 1602 int i; 1603 1604 if (!nl_modes) 1605 goto nla_put_failure; 1606 1607 i = 0; 1608 while (ifmodes) { 1609 if ((ifmodes & 1) && nla_put_flag(msg, i)) 1610 goto nla_put_failure; 1611 ifmodes >>= 1; 1612 i++; 1613 } 1614 1615 nla_nest_end(msg, nl_modes); 1616 return 0; 1617 1618 nla_put_failure: 1619 return -ENOBUFS; 1620 } 1621 1622 static int nl80211_put_iface_combinations(struct wiphy *wiphy, 1623 struct sk_buff *msg, 1624 bool large) 1625 { 1626 struct nlattr *nl_combis; 1627 int i, j; 1628 1629 nl_combis = nla_nest_start_noflag(msg, 1630 NL80211_ATTR_INTERFACE_COMBINATIONS); 1631 if (!nl_combis) 1632 goto nla_put_failure; 1633 1634 for (i = 0; i < wiphy->n_iface_combinations; i++) { 1635 const struct ieee80211_iface_combination *c; 1636 struct nlattr *nl_combi, *nl_limits; 1637 1638 c = &wiphy->iface_combinations[i]; 1639 1640 nl_combi = nla_nest_start_noflag(msg, i + 1); 1641 if (!nl_combi) 1642 goto nla_put_failure; 1643 1644 nl_limits = nla_nest_start_noflag(msg, 1645 NL80211_IFACE_COMB_LIMITS); 1646 if (!nl_limits) 1647 goto nla_put_failure; 1648 1649 for (j = 0; j < c->n_limits; j++) { 1650 struct nlattr *nl_limit; 1651 1652 nl_limit = nla_nest_start_noflag(msg, j + 1); 1653 if (!nl_limit) 1654 goto nla_put_failure; 1655 if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX, 1656 c->limits[j].max)) 1657 goto nla_put_failure; 1658 if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES, 1659 c->limits[j].types)) 1660 goto nla_put_failure; 1661 nla_nest_end(msg, nl_limit); 1662 } 1663 1664 nla_nest_end(msg, nl_limits); 1665 1666 if (c->beacon_int_infra_match && 1667 nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH)) 1668 goto nla_put_failure; 1669 if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS, 1670 c->num_different_channels) || 1671 nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM, 1672 c->max_interfaces)) 1673 goto nla_put_failure; 1674 if (large && 1675 (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS, 1676 c->radar_detect_widths) || 1677 nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS, 1678 c->radar_detect_regions))) 1679 goto nla_put_failure; 1680 if (c->beacon_int_min_gcd && 1681 nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD, 1682 c->beacon_int_min_gcd)) 1683 goto nla_put_failure; 1684 1685 nla_nest_end(msg, nl_combi); 1686 } 1687 1688 nla_nest_end(msg, nl_combis); 1689 1690 return 0; 1691 nla_put_failure: 1692 return -ENOBUFS; 1693 } 1694 1695 #ifdef CONFIG_PM 1696 static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev, 1697 struct sk_buff *msg) 1698 { 1699 const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp; 1700 struct nlattr *nl_tcp; 1701 1702 if (!tcp) 1703 return 0; 1704 1705 nl_tcp = nla_nest_start_noflag(msg, 1706 NL80211_WOWLAN_TRIG_TCP_CONNECTION); 1707 if (!nl_tcp) 1708 return -ENOBUFS; 1709 1710 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 1711 tcp->data_payload_max)) 1712 return -ENOBUFS; 1713 1714 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 1715 tcp->data_payload_max)) 1716 return -ENOBUFS; 1717 1718 if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ)) 1719 return -ENOBUFS; 1720 1721 if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 1722 sizeof(*tcp->tok), tcp->tok)) 1723 return -ENOBUFS; 1724 1725 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 1726 tcp->data_interval_max)) 1727 return -ENOBUFS; 1728 1729 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 1730 tcp->wake_payload_max)) 1731 return -ENOBUFS; 1732 1733 nla_nest_end(msg, nl_tcp); 1734 return 0; 1735 } 1736 1737 static int nl80211_send_wowlan(struct sk_buff *msg, 1738 struct cfg80211_registered_device *rdev, 1739 bool large) 1740 { 1741 struct nlattr *nl_wowlan; 1742 1743 if (!rdev->wiphy.wowlan) 1744 return 0; 1745 1746 nl_wowlan = nla_nest_start_noflag(msg, 1747 NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED); 1748 if (!nl_wowlan) 1749 return -ENOBUFS; 1750 1751 if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) && 1752 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 1753 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) && 1754 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 1755 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) && 1756 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 1757 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) && 1758 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED)) || 1759 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && 1760 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 1761 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) && 1762 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 1763 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) && 1764 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 1765 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) && 1766 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 1767 return -ENOBUFS; 1768 1769 if (rdev->wiphy.wowlan->n_patterns) { 1770 struct nl80211_pattern_support pat = { 1771 .max_patterns = rdev->wiphy.wowlan->n_patterns, 1772 .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len, 1773 .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len, 1774 .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset, 1775 }; 1776 1777 if (nla_put(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN, 1778 sizeof(pat), &pat)) 1779 return -ENOBUFS; 1780 } 1781 1782 if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) && 1783 nla_put_u32(msg, NL80211_WOWLAN_TRIG_NET_DETECT, 1784 rdev->wiphy.wowlan->max_nd_match_sets)) 1785 return -ENOBUFS; 1786 1787 if (large && nl80211_send_wowlan_tcp_caps(rdev, msg)) 1788 return -ENOBUFS; 1789 1790 nla_nest_end(msg, nl_wowlan); 1791 1792 return 0; 1793 } 1794 #endif 1795 1796 static int nl80211_send_coalesce(struct sk_buff *msg, 1797 struct cfg80211_registered_device *rdev) 1798 { 1799 struct nl80211_coalesce_rule_support rule; 1800 1801 if (!rdev->wiphy.coalesce) 1802 return 0; 1803 1804 rule.max_rules = rdev->wiphy.coalesce->n_rules; 1805 rule.max_delay = rdev->wiphy.coalesce->max_delay; 1806 rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns; 1807 rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len; 1808 rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len; 1809 rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset; 1810 1811 if (nla_put(msg, NL80211_ATTR_COALESCE_RULE, sizeof(rule), &rule)) 1812 return -ENOBUFS; 1813 1814 return 0; 1815 } 1816 1817 static int 1818 nl80211_send_iftype_data(struct sk_buff *msg, 1819 const struct ieee80211_supported_band *sband, 1820 const struct ieee80211_sband_iftype_data *iftdata) 1821 { 1822 const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap; 1823 const struct ieee80211_sta_eht_cap *eht_cap = &iftdata->eht_cap; 1824 1825 if (nl80211_put_iftypes(msg, NL80211_BAND_IFTYPE_ATTR_IFTYPES, 1826 iftdata->types_mask)) 1827 return -ENOBUFS; 1828 1829 if (he_cap->has_he) { 1830 if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC, 1831 sizeof(he_cap->he_cap_elem.mac_cap_info), 1832 he_cap->he_cap_elem.mac_cap_info) || 1833 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY, 1834 sizeof(he_cap->he_cap_elem.phy_cap_info), 1835 he_cap->he_cap_elem.phy_cap_info) || 1836 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET, 1837 sizeof(he_cap->he_mcs_nss_supp), 1838 &he_cap->he_mcs_nss_supp) || 1839 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE, 1840 sizeof(he_cap->ppe_thres), he_cap->ppe_thres)) 1841 return -ENOBUFS; 1842 } 1843 1844 if (eht_cap->has_eht && he_cap->has_he) { 1845 u8 mcs_nss_size, ppe_thresh_size; 1846 u16 ppe_thres_hdr; 1847 bool is_ap; 1848 1849 is_ap = iftdata->types_mask & BIT(NL80211_IFTYPE_AP) || 1850 iftdata->types_mask & BIT(NL80211_IFTYPE_P2P_GO); 1851 1852 mcs_nss_size = 1853 ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem, 1854 &eht_cap->eht_cap_elem, 1855 is_ap); 1856 1857 ppe_thres_hdr = get_unaligned_le16(&eht_cap->eht_ppe_thres[0]); 1858 ppe_thresh_size = 1859 ieee80211_eht_ppe_size(ppe_thres_hdr, 1860 eht_cap->eht_cap_elem.phy_cap_info); 1861 1862 if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MAC, 1863 sizeof(eht_cap->eht_cap_elem.mac_cap_info), 1864 eht_cap->eht_cap_elem.mac_cap_info) || 1865 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PHY, 1866 sizeof(eht_cap->eht_cap_elem.phy_cap_info), 1867 eht_cap->eht_cap_elem.phy_cap_info) || 1868 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MCS_SET, 1869 mcs_nss_size, &eht_cap->eht_mcs_nss_supp) || 1870 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PPE, 1871 ppe_thresh_size, eht_cap->eht_ppe_thres)) 1872 return -ENOBUFS; 1873 } 1874 1875 if (sband->band == NL80211_BAND_6GHZ && 1876 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA, 1877 sizeof(iftdata->he_6ghz_capa), 1878 &iftdata->he_6ghz_capa)) 1879 return -ENOBUFS; 1880 1881 if (iftdata->vendor_elems.data && iftdata->vendor_elems.len && 1882 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_VENDOR_ELEMS, 1883 iftdata->vendor_elems.len, iftdata->vendor_elems.data)) 1884 return -ENOBUFS; 1885 1886 return 0; 1887 } 1888 1889 static int nl80211_send_band_rateinfo(struct sk_buff *msg, 1890 struct ieee80211_supported_band *sband, 1891 bool large) 1892 { 1893 struct nlattr *nl_rates, *nl_rate; 1894 struct ieee80211_rate *rate; 1895 int i; 1896 1897 /* add HT info */ 1898 if (sband->ht_cap.ht_supported && 1899 (nla_put(msg, NL80211_BAND_ATTR_HT_MCS_SET, 1900 sizeof(sband->ht_cap.mcs), 1901 &sband->ht_cap.mcs) || 1902 nla_put_u16(msg, NL80211_BAND_ATTR_HT_CAPA, 1903 sband->ht_cap.cap) || 1904 nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR, 1905 sband->ht_cap.ampdu_factor) || 1906 nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY, 1907 sband->ht_cap.ampdu_density))) 1908 return -ENOBUFS; 1909 1910 /* add VHT info */ 1911 if (sband->vht_cap.vht_supported && 1912 (nla_put(msg, NL80211_BAND_ATTR_VHT_MCS_SET, 1913 sizeof(sband->vht_cap.vht_mcs), 1914 &sband->vht_cap.vht_mcs) || 1915 nla_put_u32(msg, NL80211_BAND_ATTR_VHT_CAPA, 1916 sband->vht_cap.cap))) 1917 return -ENOBUFS; 1918 1919 if (large && sband->n_iftype_data) { 1920 struct nlattr *nl_iftype_data = 1921 nla_nest_start_noflag(msg, 1922 NL80211_BAND_ATTR_IFTYPE_DATA); 1923 const struct ieee80211_sband_iftype_data *iftd; 1924 int err; 1925 1926 if (!nl_iftype_data) 1927 return -ENOBUFS; 1928 1929 for_each_sband_iftype_data(sband, i, iftd) { 1930 struct nlattr *iftdata; 1931 1932 iftdata = nla_nest_start_noflag(msg, i + 1); 1933 if (!iftdata) 1934 return -ENOBUFS; 1935 1936 err = nl80211_send_iftype_data(msg, sband, iftd); 1937 if (err) 1938 return err; 1939 1940 nla_nest_end(msg, iftdata); 1941 } 1942 1943 nla_nest_end(msg, nl_iftype_data); 1944 } 1945 1946 /* add EDMG info */ 1947 if (large && sband->edmg_cap.channels && 1948 (nla_put_u8(msg, NL80211_BAND_ATTR_EDMG_CHANNELS, 1949 sband->edmg_cap.channels) || 1950 nla_put_u8(msg, NL80211_BAND_ATTR_EDMG_BW_CONFIG, 1951 sband->edmg_cap.bw_config))) 1952 1953 return -ENOBUFS; 1954 1955 /* add bitrates */ 1956 nl_rates = nla_nest_start_noflag(msg, NL80211_BAND_ATTR_RATES); 1957 if (!nl_rates) 1958 return -ENOBUFS; 1959 1960 for (i = 0; i < sband->n_bitrates; i++) { 1961 nl_rate = nla_nest_start_noflag(msg, i); 1962 if (!nl_rate) 1963 return -ENOBUFS; 1964 1965 rate = &sband->bitrates[i]; 1966 if (nla_put_u32(msg, NL80211_BITRATE_ATTR_RATE, 1967 rate->bitrate)) 1968 return -ENOBUFS; 1969 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && 1970 nla_put_flag(msg, 1971 NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE)) 1972 return -ENOBUFS; 1973 1974 nla_nest_end(msg, nl_rate); 1975 } 1976 1977 nla_nest_end(msg, nl_rates); 1978 1979 /* S1G capabilities */ 1980 if (sband->band == NL80211_BAND_S1GHZ && sband->s1g_cap.s1g && 1981 (nla_put(msg, NL80211_BAND_ATTR_S1G_CAPA, 1982 sizeof(sband->s1g_cap.cap), 1983 sband->s1g_cap.cap) || 1984 nla_put(msg, NL80211_BAND_ATTR_S1G_MCS_NSS_SET, 1985 sizeof(sband->s1g_cap.nss_mcs), 1986 sband->s1g_cap.nss_mcs))) 1987 return -ENOBUFS; 1988 1989 return 0; 1990 } 1991 1992 static int 1993 nl80211_send_mgmt_stypes(struct sk_buff *msg, 1994 const struct ieee80211_txrx_stypes *mgmt_stypes) 1995 { 1996 u16 stypes; 1997 struct nlattr *nl_ftypes, *nl_ifs; 1998 enum nl80211_iftype ift; 1999 int i; 2000 2001 if (!mgmt_stypes) 2002 return 0; 2003 2004 nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_TX_FRAME_TYPES); 2005 if (!nl_ifs) 2006 return -ENOBUFS; 2007 2008 for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) { 2009 nl_ftypes = nla_nest_start_noflag(msg, ift); 2010 if (!nl_ftypes) 2011 return -ENOBUFS; 2012 i = 0; 2013 stypes = mgmt_stypes[ift].tx; 2014 while (stypes) { 2015 if ((stypes & 1) && 2016 nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE, 2017 (i << 4) | IEEE80211_FTYPE_MGMT)) 2018 return -ENOBUFS; 2019 stypes >>= 1; 2020 i++; 2021 } 2022 nla_nest_end(msg, nl_ftypes); 2023 } 2024 2025 nla_nest_end(msg, nl_ifs); 2026 2027 nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_RX_FRAME_TYPES); 2028 if (!nl_ifs) 2029 return -ENOBUFS; 2030 2031 for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) { 2032 nl_ftypes = nla_nest_start_noflag(msg, ift); 2033 if (!nl_ftypes) 2034 return -ENOBUFS; 2035 i = 0; 2036 stypes = mgmt_stypes[ift].rx; 2037 while (stypes) { 2038 if ((stypes & 1) && 2039 nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE, 2040 (i << 4) | IEEE80211_FTYPE_MGMT)) 2041 return -ENOBUFS; 2042 stypes >>= 1; 2043 i++; 2044 } 2045 nla_nest_end(msg, nl_ftypes); 2046 } 2047 nla_nest_end(msg, nl_ifs); 2048 2049 return 0; 2050 } 2051 2052 #define CMD(op, n) \ 2053 do { \ 2054 if (rdev->ops->op) { \ 2055 i++; \ 2056 if (nla_put_u32(msg, i, NL80211_CMD_ ## n)) \ 2057 goto nla_put_failure; \ 2058 } \ 2059 } while (0) 2060 2061 static int nl80211_add_commands_unsplit(struct cfg80211_registered_device *rdev, 2062 struct sk_buff *msg) 2063 { 2064 int i = 0; 2065 2066 /* 2067 * do *NOT* add anything into this function, new things need to be 2068 * advertised only to new versions of userspace that can deal with 2069 * the split (and they can't possibly care about new features... 2070 */ 2071 CMD(add_virtual_intf, NEW_INTERFACE); 2072 CMD(change_virtual_intf, SET_INTERFACE); 2073 CMD(add_key, NEW_KEY); 2074 CMD(start_ap, START_AP); 2075 CMD(add_station, NEW_STATION); 2076 CMD(add_mpath, NEW_MPATH); 2077 CMD(update_mesh_config, SET_MESH_CONFIG); 2078 CMD(change_bss, SET_BSS); 2079 CMD(auth, AUTHENTICATE); 2080 CMD(assoc, ASSOCIATE); 2081 CMD(deauth, DEAUTHENTICATE); 2082 CMD(disassoc, DISASSOCIATE); 2083 CMD(join_ibss, JOIN_IBSS); 2084 CMD(join_mesh, JOIN_MESH); 2085 CMD(set_pmksa, SET_PMKSA); 2086 CMD(del_pmksa, DEL_PMKSA); 2087 CMD(flush_pmksa, FLUSH_PMKSA); 2088 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) 2089 CMD(remain_on_channel, REMAIN_ON_CHANNEL); 2090 CMD(set_bitrate_mask, SET_TX_BITRATE_MASK); 2091 CMD(mgmt_tx, FRAME); 2092 CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL); 2093 if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) { 2094 i++; 2095 if (nla_put_u32(msg, i, NL80211_CMD_SET_WIPHY_NETNS)) 2096 goto nla_put_failure; 2097 } 2098 if (rdev->ops->set_monitor_channel || rdev->ops->start_ap || 2099 rdev->ops->join_mesh) { 2100 i++; 2101 if (nla_put_u32(msg, i, NL80211_CMD_SET_CHANNEL)) 2102 goto nla_put_failure; 2103 } 2104 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) { 2105 CMD(tdls_mgmt, TDLS_MGMT); 2106 CMD(tdls_oper, TDLS_OPER); 2107 } 2108 if (rdev->wiphy.max_sched_scan_reqs) 2109 CMD(sched_scan_start, START_SCHED_SCAN); 2110 CMD(probe_client, PROBE_CLIENT); 2111 CMD(set_noack_map, SET_NOACK_MAP); 2112 if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) { 2113 i++; 2114 if (nla_put_u32(msg, i, NL80211_CMD_REGISTER_BEACONS)) 2115 goto nla_put_failure; 2116 } 2117 CMD(start_p2p_device, START_P2P_DEVICE); 2118 CMD(set_mcast_rate, SET_MCAST_RATE); 2119 #ifdef CONFIG_NL80211_TESTMODE 2120 CMD(testmode_cmd, TESTMODE); 2121 #endif 2122 2123 if (rdev->ops->connect || rdev->ops->auth) { 2124 i++; 2125 if (nla_put_u32(msg, i, NL80211_CMD_CONNECT)) 2126 goto nla_put_failure; 2127 } 2128 2129 if (rdev->ops->disconnect || rdev->ops->deauth) { 2130 i++; 2131 if (nla_put_u32(msg, i, NL80211_CMD_DISCONNECT)) 2132 goto nla_put_failure; 2133 } 2134 2135 return i; 2136 nla_put_failure: 2137 return -ENOBUFS; 2138 } 2139 2140 static int 2141 nl80211_send_pmsr_ftm_capa(const struct cfg80211_pmsr_capabilities *cap, 2142 struct sk_buff *msg) 2143 { 2144 struct nlattr *ftm; 2145 2146 if (!cap->ftm.supported) 2147 return 0; 2148 2149 ftm = nla_nest_start_noflag(msg, NL80211_PMSR_TYPE_FTM); 2150 if (!ftm) 2151 return -ENOBUFS; 2152 2153 if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP)) 2154 return -ENOBUFS; 2155 if (cap->ftm.non_asap && 2156 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP)) 2157 return -ENOBUFS; 2158 if (cap->ftm.request_lci && 2159 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI)) 2160 return -ENOBUFS; 2161 if (cap->ftm.request_civicloc && 2162 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_CIVICLOC)) 2163 return -ENOBUFS; 2164 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES, 2165 cap->ftm.preambles)) 2166 return -ENOBUFS; 2167 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS, 2168 cap->ftm.bandwidths)) 2169 return -ENOBUFS; 2170 if (cap->ftm.max_bursts_exponent >= 0 && 2171 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT, 2172 cap->ftm.max_bursts_exponent)) 2173 return -ENOBUFS; 2174 if (cap->ftm.max_ftms_per_burst && 2175 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST, 2176 cap->ftm.max_ftms_per_burst)) 2177 return -ENOBUFS; 2178 if (cap->ftm.trigger_based && 2179 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED)) 2180 return -ENOBUFS; 2181 if (cap->ftm.non_trigger_based && 2182 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED)) 2183 return -ENOBUFS; 2184 2185 nla_nest_end(msg, ftm); 2186 return 0; 2187 } 2188 2189 static int nl80211_send_pmsr_capa(struct cfg80211_registered_device *rdev, 2190 struct sk_buff *msg) 2191 { 2192 const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa; 2193 struct nlattr *pmsr, *caps; 2194 2195 if (!cap) 2196 return 0; 2197 2198 /* 2199 * we don't need to clean up anything here since the caller 2200 * will genlmsg_cancel() if we fail 2201 */ 2202 2203 pmsr = nla_nest_start_noflag(msg, NL80211_ATTR_PEER_MEASUREMENTS); 2204 if (!pmsr) 2205 return -ENOBUFS; 2206 2207 if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers)) 2208 return -ENOBUFS; 2209 2210 if (cap->report_ap_tsf && 2211 nla_put_flag(msg, NL80211_PMSR_ATTR_REPORT_AP_TSF)) 2212 return -ENOBUFS; 2213 2214 if (cap->randomize_mac_addr && 2215 nla_put_flag(msg, NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR)) 2216 return -ENOBUFS; 2217 2218 caps = nla_nest_start_noflag(msg, NL80211_PMSR_ATTR_TYPE_CAPA); 2219 if (!caps) 2220 return -ENOBUFS; 2221 2222 if (nl80211_send_pmsr_ftm_capa(cap, msg)) 2223 return -ENOBUFS; 2224 2225 nla_nest_end(msg, caps); 2226 nla_nest_end(msg, pmsr); 2227 2228 return 0; 2229 } 2230 2231 static int 2232 nl80211_put_iftype_akm_suites(struct cfg80211_registered_device *rdev, 2233 struct sk_buff *msg) 2234 { 2235 int i; 2236 struct nlattr *nested, *nested_akms; 2237 const struct wiphy_iftype_akm_suites *iftype_akms; 2238 2239 if (!rdev->wiphy.num_iftype_akm_suites || 2240 !rdev->wiphy.iftype_akm_suites) 2241 return 0; 2242 2243 nested = nla_nest_start(msg, NL80211_ATTR_IFTYPE_AKM_SUITES); 2244 if (!nested) 2245 return -ENOBUFS; 2246 2247 for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) { 2248 nested_akms = nla_nest_start(msg, i + 1); 2249 if (!nested_akms) 2250 return -ENOBUFS; 2251 2252 iftype_akms = &rdev->wiphy.iftype_akm_suites[i]; 2253 2254 if (nl80211_put_iftypes(msg, NL80211_IFTYPE_AKM_ATTR_IFTYPES, 2255 iftype_akms->iftypes_mask)) 2256 return -ENOBUFS; 2257 2258 if (nla_put(msg, NL80211_IFTYPE_AKM_ATTR_SUITES, 2259 sizeof(u32) * iftype_akms->n_akm_suites, 2260 iftype_akms->akm_suites)) { 2261 return -ENOBUFS; 2262 } 2263 nla_nest_end(msg, nested_akms); 2264 } 2265 2266 nla_nest_end(msg, nested); 2267 2268 return 0; 2269 } 2270 2271 static int 2272 nl80211_put_tid_config_support(struct cfg80211_registered_device *rdev, 2273 struct sk_buff *msg) 2274 { 2275 struct nlattr *supp; 2276 2277 if (!rdev->wiphy.tid_config_support.vif && 2278 !rdev->wiphy.tid_config_support.peer) 2279 return 0; 2280 2281 supp = nla_nest_start(msg, NL80211_ATTR_TID_CONFIG); 2282 if (!supp) 2283 return -ENOSPC; 2284 2285 if (rdev->wiphy.tid_config_support.vif && 2286 nla_put_u64_64bit(msg, NL80211_TID_CONFIG_ATTR_VIF_SUPP, 2287 rdev->wiphy.tid_config_support.vif, 2288 NL80211_TID_CONFIG_ATTR_PAD)) 2289 goto fail; 2290 2291 if (rdev->wiphy.tid_config_support.peer && 2292 nla_put_u64_64bit(msg, NL80211_TID_CONFIG_ATTR_PEER_SUPP, 2293 rdev->wiphy.tid_config_support.peer, 2294 NL80211_TID_CONFIG_ATTR_PAD)) 2295 goto fail; 2296 2297 /* for now we just use the same value ... makes more sense */ 2298 if (nla_put_u8(msg, NL80211_TID_CONFIG_ATTR_RETRY_SHORT, 2299 rdev->wiphy.tid_config_support.max_retry)) 2300 goto fail; 2301 if (nla_put_u8(msg, NL80211_TID_CONFIG_ATTR_RETRY_LONG, 2302 rdev->wiphy.tid_config_support.max_retry)) 2303 goto fail; 2304 2305 nla_nest_end(msg, supp); 2306 2307 return 0; 2308 fail: 2309 nla_nest_cancel(msg, supp); 2310 return -ENOBUFS; 2311 } 2312 2313 static int 2314 nl80211_put_sar_specs(struct cfg80211_registered_device *rdev, 2315 struct sk_buff *msg) 2316 { 2317 struct nlattr *sar_capa, *specs, *sub_freq_range; 2318 u8 num_freq_ranges; 2319 int i; 2320 2321 if (!rdev->wiphy.sar_capa) 2322 return 0; 2323 2324 num_freq_ranges = rdev->wiphy.sar_capa->num_freq_ranges; 2325 2326 sar_capa = nla_nest_start(msg, NL80211_ATTR_SAR_SPEC); 2327 if (!sar_capa) 2328 return -ENOSPC; 2329 2330 if (nla_put_u32(msg, NL80211_SAR_ATTR_TYPE, rdev->wiphy.sar_capa->type)) 2331 goto fail; 2332 2333 specs = nla_nest_start(msg, NL80211_SAR_ATTR_SPECS); 2334 if (!specs) 2335 goto fail; 2336 2337 /* report supported freq_ranges */ 2338 for (i = 0; i < num_freq_ranges; i++) { 2339 sub_freq_range = nla_nest_start(msg, i + 1); 2340 if (!sub_freq_range) 2341 goto fail; 2342 2343 if (nla_put_u32(msg, NL80211_SAR_ATTR_SPECS_START_FREQ, 2344 rdev->wiphy.sar_capa->freq_ranges[i].start_freq)) 2345 goto fail; 2346 2347 if (nla_put_u32(msg, NL80211_SAR_ATTR_SPECS_END_FREQ, 2348 rdev->wiphy.sar_capa->freq_ranges[i].end_freq)) 2349 goto fail; 2350 2351 nla_nest_end(msg, sub_freq_range); 2352 } 2353 2354 nla_nest_end(msg, specs); 2355 nla_nest_end(msg, sar_capa); 2356 2357 return 0; 2358 fail: 2359 nla_nest_cancel(msg, sar_capa); 2360 return -ENOBUFS; 2361 } 2362 2363 static int nl80211_put_mbssid_support(struct wiphy *wiphy, struct sk_buff *msg) 2364 { 2365 struct nlattr *config; 2366 2367 if (!wiphy->mbssid_max_interfaces) 2368 return 0; 2369 2370 config = nla_nest_start(msg, NL80211_ATTR_MBSSID_CONFIG); 2371 if (!config) 2372 return -ENOBUFS; 2373 2374 if (nla_put_u8(msg, NL80211_MBSSID_CONFIG_ATTR_MAX_INTERFACES, 2375 wiphy->mbssid_max_interfaces)) 2376 goto fail; 2377 2378 if (wiphy->ema_max_profile_periodicity && 2379 nla_put_u8(msg, 2380 NL80211_MBSSID_CONFIG_ATTR_MAX_EMA_PROFILE_PERIODICITY, 2381 wiphy->ema_max_profile_periodicity)) 2382 goto fail; 2383 2384 nla_nest_end(msg, config); 2385 return 0; 2386 2387 fail: 2388 nla_nest_cancel(msg, config); 2389 return -ENOBUFS; 2390 } 2391 2392 struct nl80211_dump_wiphy_state { 2393 s64 filter_wiphy; 2394 long start; 2395 long split_start, band_start, chan_start, capa_start; 2396 bool split; 2397 }; 2398 2399 static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, 2400 enum nl80211_commands cmd, 2401 struct sk_buff *msg, u32 portid, u32 seq, 2402 int flags, struct nl80211_dump_wiphy_state *state) 2403 { 2404 void *hdr; 2405 struct nlattr *nl_bands, *nl_band; 2406 struct nlattr *nl_freqs, *nl_freq; 2407 struct nlattr *nl_cmds; 2408 enum nl80211_band band; 2409 struct ieee80211_channel *chan; 2410 int i; 2411 const struct ieee80211_txrx_stypes *mgmt_stypes = 2412 rdev->wiphy.mgmt_stypes; 2413 u32 features; 2414 2415 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 2416 if (!hdr) 2417 return -ENOBUFS; 2418 2419 if (WARN_ON(!state)) 2420 return -EINVAL; 2421 2422 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 2423 nla_put_string(msg, NL80211_ATTR_WIPHY_NAME, 2424 wiphy_name(&rdev->wiphy)) || 2425 nla_put_u32(msg, NL80211_ATTR_GENERATION, 2426 cfg80211_rdev_list_generation)) 2427 goto nla_put_failure; 2428 2429 if (cmd != NL80211_CMD_NEW_WIPHY) 2430 goto finish; 2431 2432 switch (state->split_start) { 2433 case 0: 2434 if (nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT, 2435 rdev->wiphy.retry_short) || 2436 nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_LONG, 2437 rdev->wiphy.retry_long) || 2438 nla_put_u32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD, 2439 rdev->wiphy.frag_threshold) || 2440 nla_put_u32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD, 2441 rdev->wiphy.rts_threshold) || 2442 nla_put_u8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS, 2443 rdev->wiphy.coverage_class) || 2444 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS, 2445 rdev->wiphy.max_scan_ssids) || 2446 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS, 2447 rdev->wiphy.max_sched_scan_ssids) || 2448 nla_put_u16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN, 2449 rdev->wiphy.max_scan_ie_len) || 2450 nla_put_u16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN, 2451 rdev->wiphy.max_sched_scan_ie_len) || 2452 nla_put_u8(msg, NL80211_ATTR_MAX_MATCH_SETS, 2453 rdev->wiphy.max_match_sets)) 2454 goto nla_put_failure; 2455 2456 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) && 2457 nla_put_flag(msg, NL80211_ATTR_SUPPORT_IBSS_RSN)) 2458 goto nla_put_failure; 2459 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) && 2460 nla_put_flag(msg, NL80211_ATTR_SUPPORT_MESH_AUTH)) 2461 goto nla_put_failure; 2462 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) && 2463 nla_put_flag(msg, NL80211_ATTR_SUPPORT_AP_UAPSD)) 2464 goto nla_put_failure; 2465 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) && 2466 nla_put_flag(msg, NL80211_ATTR_ROAM_SUPPORT)) 2467 goto nla_put_failure; 2468 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) && 2469 nla_put_flag(msg, NL80211_ATTR_TDLS_SUPPORT)) 2470 goto nla_put_failure; 2471 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) && 2472 nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP)) 2473 goto nla_put_failure; 2474 state->split_start++; 2475 if (state->split) 2476 break; 2477 fallthrough; 2478 case 1: 2479 if (nla_put(msg, NL80211_ATTR_CIPHER_SUITES, 2480 sizeof(u32) * rdev->wiphy.n_cipher_suites, 2481 rdev->wiphy.cipher_suites)) 2482 goto nla_put_failure; 2483 2484 if (nla_put_u8(msg, NL80211_ATTR_MAX_NUM_PMKIDS, 2485 rdev->wiphy.max_num_pmkids)) 2486 goto nla_put_failure; 2487 2488 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && 2489 nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE)) 2490 goto nla_put_failure; 2491 2492 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX, 2493 rdev->wiphy.available_antennas_tx) || 2494 nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX, 2495 rdev->wiphy.available_antennas_rx)) 2496 goto nla_put_failure; 2497 2498 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) && 2499 nla_put_u32(msg, NL80211_ATTR_PROBE_RESP_OFFLOAD, 2500 rdev->wiphy.probe_resp_offload)) 2501 goto nla_put_failure; 2502 2503 if ((rdev->wiphy.available_antennas_tx || 2504 rdev->wiphy.available_antennas_rx) && 2505 rdev->ops->get_antenna) { 2506 u32 tx_ant = 0, rx_ant = 0; 2507 int res; 2508 2509 res = rdev_get_antenna(rdev, &tx_ant, &rx_ant); 2510 if (!res) { 2511 if (nla_put_u32(msg, 2512 NL80211_ATTR_WIPHY_ANTENNA_TX, 2513 tx_ant) || 2514 nla_put_u32(msg, 2515 NL80211_ATTR_WIPHY_ANTENNA_RX, 2516 rx_ant)) 2517 goto nla_put_failure; 2518 } 2519 } 2520 2521 state->split_start++; 2522 if (state->split) 2523 break; 2524 fallthrough; 2525 case 2: 2526 if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES, 2527 rdev->wiphy.interface_modes)) 2528 goto nla_put_failure; 2529 state->split_start++; 2530 if (state->split) 2531 break; 2532 fallthrough; 2533 case 3: 2534 nl_bands = nla_nest_start_noflag(msg, 2535 NL80211_ATTR_WIPHY_BANDS); 2536 if (!nl_bands) 2537 goto nla_put_failure; 2538 2539 for (band = state->band_start; 2540 band < (state->split ? 2541 NUM_NL80211_BANDS : 2542 NL80211_BAND_60GHZ + 1); 2543 band++) { 2544 struct ieee80211_supported_band *sband; 2545 2546 /* omit higher bands for ancient software */ 2547 if (band > NL80211_BAND_5GHZ && !state->split) 2548 break; 2549 2550 sband = rdev->wiphy.bands[band]; 2551 2552 if (!sband) 2553 continue; 2554 2555 nl_band = nla_nest_start_noflag(msg, band); 2556 if (!nl_band) 2557 goto nla_put_failure; 2558 2559 switch (state->chan_start) { 2560 case 0: 2561 if (nl80211_send_band_rateinfo(msg, sband, 2562 state->split)) 2563 goto nla_put_failure; 2564 state->chan_start++; 2565 if (state->split) 2566 break; 2567 fallthrough; 2568 default: 2569 /* add frequencies */ 2570 nl_freqs = nla_nest_start_noflag(msg, 2571 NL80211_BAND_ATTR_FREQS); 2572 if (!nl_freqs) 2573 goto nla_put_failure; 2574 2575 for (i = state->chan_start - 1; 2576 i < sband->n_channels; 2577 i++) { 2578 nl_freq = nla_nest_start_noflag(msg, 2579 i); 2580 if (!nl_freq) 2581 goto nla_put_failure; 2582 2583 chan = &sband->channels[i]; 2584 2585 if (nl80211_msg_put_channel( 2586 msg, &rdev->wiphy, chan, 2587 state->split)) 2588 goto nla_put_failure; 2589 2590 nla_nest_end(msg, nl_freq); 2591 if (state->split) 2592 break; 2593 } 2594 if (i < sband->n_channels) 2595 state->chan_start = i + 2; 2596 else 2597 state->chan_start = 0; 2598 nla_nest_end(msg, nl_freqs); 2599 } 2600 2601 nla_nest_end(msg, nl_band); 2602 2603 if (state->split) { 2604 /* start again here */ 2605 if (state->chan_start) 2606 band--; 2607 break; 2608 } 2609 } 2610 nla_nest_end(msg, nl_bands); 2611 2612 if (band < NUM_NL80211_BANDS) 2613 state->band_start = band + 1; 2614 else 2615 state->band_start = 0; 2616 2617 /* if bands & channels are done, continue outside */ 2618 if (state->band_start == 0 && state->chan_start == 0) 2619 state->split_start++; 2620 if (state->split) 2621 break; 2622 fallthrough; 2623 case 4: 2624 nl_cmds = nla_nest_start_noflag(msg, 2625 NL80211_ATTR_SUPPORTED_COMMANDS); 2626 if (!nl_cmds) 2627 goto nla_put_failure; 2628 2629 i = nl80211_add_commands_unsplit(rdev, msg); 2630 if (i < 0) 2631 goto nla_put_failure; 2632 if (state->split) { 2633 CMD(crit_proto_start, CRIT_PROTOCOL_START); 2634 CMD(crit_proto_stop, CRIT_PROTOCOL_STOP); 2635 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) 2636 CMD(channel_switch, CHANNEL_SWITCH); 2637 CMD(set_qos_map, SET_QOS_MAP); 2638 if (rdev->wiphy.features & 2639 NL80211_FEATURE_SUPPORTS_WMM_ADMISSION) 2640 CMD(add_tx_ts, ADD_TX_TS); 2641 CMD(set_multicast_to_unicast, SET_MULTICAST_TO_UNICAST); 2642 CMD(update_connect_params, UPDATE_CONNECT_PARAMS); 2643 CMD(update_ft_ies, UPDATE_FT_IES); 2644 if (rdev->wiphy.sar_capa) 2645 CMD(set_sar_specs, SET_SAR_SPECS); 2646 } 2647 #undef CMD 2648 2649 nla_nest_end(msg, nl_cmds); 2650 state->split_start++; 2651 if (state->split) 2652 break; 2653 fallthrough; 2654 case 5: 2655 if (rdev->ops->remain_on_channel && 2656 (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) && 2657 nla_put_u32(msg, 2658 NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION, 2659 rdev->wiphy.max_remain_on_channel_duration)) 2660 goto nla_put_failure; 2661 2662 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) && 2663 nla_put_flag(msg, NL80211_ATTR_OFFCHANNEL_TX_OK)) 2664 goto nla_put_failure; 2665 2666 state->split_start++; 2667 if (state->split) 2668 break; 2669 fallthrough; 2670 case 6: 2671 #ifdef CONFIG_PM 2672 if (nl80211_send_wowlan(msg, rdev, state->split)) 2673 goto nla_put_failure; 2674 state->split_start++; 2675 if (state->split) 2676 break; 2677 #else 2678 state->split_start++; 2679 #endif 2680 fallthrough; 2681 case 7: 2682 if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES, 2683 rdev->wiphy.software_iftypes)) 2684 goto nla_put_failure; 2685 2686 if (nl80211_put_iface_combinations(&rdev->wiphy, msg, 2687 state->split)) 2688 goto nla_put_failure; 2689 2690 state->split_start++; 2691 if (state->split) 2692 break; 2693 fallthrough; 2694 case 8: 2695 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) && 2696 nla_put_u32(msg, NL80211_ATTR_DEVICE_AP_SME, 2697 rdev->wiphy.ap_sme_capa)) 2698 goto nla_put_failure; 2699 2700 features = rdev->wiphy.features; 2701 /* 2702 * We can only add the per-channel limit information if the 2703 * dump is split, otherwise it makes it too big. Therefore 2704 * only advertise it in that case. 2705 */ 2706 if (state->split) 2707 features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS; 2708 if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features)) 2709 goto nla_put_failure; 2710 2711 if (rdev->wiphy.ht_capa_mod_mask && 2712 nla_put(msg, NL80211_ATTR_HT_CAPABILITY_MASK, 2713 sizeof(*rdev->wiphy.ht_capa_mod_mask), 2714 rdev->wiphy.ht_capa_mod_mask)) 2715 goto nla_put_failure; 2716 2717 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME && 2718 rdev->wiphy.max_acl_mac_addrs && 2719 nla_put_u32(msg, NL80211_ATTR_MAC_ACL_MAX, 2720 rdev->wiphy.max_acl_mac_addrs)) 2721 goto nla_put_failure; 2722 2723 /* 2724 * Any information below this point is only available to 2725 * applications that can deal with it being split. This 2726 * helps ensure that newly added capabilities don't break 2727 * older tools by overrunning their buffers. 2728 * 2729 * We still increment split_start so that in the split 2730 * case we'll continue with more data in the next round, 2731 * but break unconditionally so unsplit data stops here. 2732 */ 2733 if (state->split) 2734 state->split_start++; 2735 else 2736 state->split_start = 0; 2737 break; 2738 case 9: 2739 if (nl80211_send_mgmt_stypes(msg, mgmt_stypes)) 2740 goto nla_put_failure; 2741 2742 if (nla_put_u32(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS, 2743 rdev->wiphy.max_sched_scan_plans) || 2744 nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL, 2745 rdev->wiphy.max_sched_scan_plan_interval) || 2746 nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS, 2747 rdev->wiphy.max_sched_scan_plan_iterations)) 2748 goto nla_put_failure; 2749 2750 if (rdev->wiphy.extended_capabilities && 2751 (nla_put(msg, NL80211_ATTR_EXT_CAPA, 2752 rdev->wiphy.extended_capabilities_len, 2753 rdev->wiphy.extended_capabilities) || 2754 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK, 2755 rdev->wiphy.extended_capabilities_len, 2756 rdev->wiphy.extended_capabilities_mask))) 2757 goto nla_put_failure; 2758 2759 if (rdev->wiphy.vht_capa_mod_mask && 2760 nla_put(msg, NL80211_ATTR_VHT_CAPABILITY_MASK, 2761 sizeof(*rdev->wiphy.vht_capa_mod_mask), 2762 rdev->wiphy.vht_capa_mod_mask)) 2763 goto nla_put_failure; 2764 2765 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 2766 rdev->wiphy.perm_addr)) 2767 goto nla_put_failure; 2768 2769 if (!is_zero_ether_addr(rdev->wiphy.addr_mask) && 2770 nla_put(msg, NL80211_ATTR_MAC_MASK, ETH_ALEN, 2771 rdev->wiphy.addr_mask)) 2772 goto nla_put_failure; 2773 2774 if (rdev->wiphy.n_addresses > 1) { 2775 void *attr; 2776 2777 attr = nla_nest_start(msg, NL80211_ATTR_MAC_ADDRS); 2778 if (!attr) 2779 goto nla_put_failure; 2780 2781 for (i = 0; i < rdev->wiphy.n_addresses; i++) 2782 if (nla_put(msg, i + 1, ETH_ALEN, 2783 rdev->wiphy.addresses[i].addr)) 2784 goto nla_put_failure; 2785 2786 nla_nest_end(msg, attr); 2787 } 2788 2789 state->split_start++; 2790 break; 2791 case 10: 2792 if (nl80211_send_coalesce(msg, rdev)) 2793 goto nla_put_failure; 2794 2795 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) && 2796 (nla_put_flag(msg, NL80211_ATTR_SUPPORT_5_MHZ) || 2797 nla_put_flag(msg, NL80211_ATTR_SUPPORT_10_MHZ))) 2798 goto nla_put_failure; 2799 2800 if (rdev->wiphy.max_ap_assoc_sta && 2801 nla_put_u32(msg, NL80211_ATTR_MAX_AP_ASSOC_STA, 2802 rdev->wiphy.max_ap_assoc_sta)) 2803 goto nla_put_failure; 2804 2805 state->split_start++; 2806 break; 2807 case 11: 2808 if (rdev->wiphy.n_vendor_commands) { 2809 const struct nl80211_vendor_cmd_info *info; 2810 struct nlattr *nested; 2811 2812 nested = nla_nest_start_noflag(msg, 2813 NL80211_ATTR_VENDOR_DATA); 2814 if (!nested) 2815 goto nla_put_failure; 2816 2817 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { 2818 info = &rdev->wiphy.vendor_commands[i].info; 2819 if (nla_put(msg, i + 1, sizeof(*info), info)) 2820 goto nla_put_failure; 2821 } 2822 nla_nest_end(msg, nested); 2823 } 2824 2825 if (rdev->wiphy.n_vendor_events) { 2826 const struct nl80211_vendor_cmd_info *info; 2827 struct nlattr *nested; 2828 2829 nested = nla_nest_start_noflag(msg, 2830 NL80211_ATTR_VENDOR_EVENTS); 2831 if (!nested) 2832 goto nla_put_failure; 2833 2834 for (i = 0; i < rdev->wiphy.n_vendor_events; i++) { 2835 info = &rdev->wiphy.vendor_events[i]; 2836 if (nla_put(msg, i + 1, sizeof(*info), info)) 2837 goto nla_put_failure; 2838 } 2839 nla_nest_end(msg, nested); 2840 } 2841 state->split_start++; 2842 break; 2843 case 12: 2844 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH && 2845 nla_put_u8(msg, NL80211_ATTR_MAX_CSA_COUNTERS, 2846 rdev->wiphy.max_num_csa_counters)) 2847 goto nla_put_failure; 2848 2849 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 2850 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 2851 goto nla_put_failure; 2852 2853 if (rdev->wiphy.max_sched_scan_reqs && 2854 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_MAX_REQS, 2855 rdev->wiphy.max_sched_scan_reqs)) 2856 goto nla_put_failure; 2857 2858 if (nla_put(msg, NL80211_ATTR_EXT_FEATURES, 2859 sizeof(rdev->wiphy.ext_features), 2860 rdev->wiphy.ext_features)) 2861 goto nla_put_failure; 2862 2863 if (rdev->wiphy.bss_select_support) { 2864 struct nlattr *nested; 2865 u32 bss_select_support = rdev->wiphy.bss_select_support; 2866 2867 nested = nla_nest_start_noflag(msg, 2868 NL80211_ATTR_BSS_SELECT); 2869 if (!nested) 2870 goto nla_put_failure; 2871 2872 i = 0; 2873 while (bss_select_support) { 2874 if ((bss_select_support & 1) && 2875 nla_put_flag(msg, i)) 2876 goto nla_put_failure; 2877 i++; 2878 bss_select_support >>= 1; 2879 } 2880 nla_nest_end(msg, nested); 2881 } 2882 2883 state->split_start++; 2884 break; 2885 case 13: 2886 if (rdev->wiphy.num_iftype_ext_capab && 2887 rdev->wiphy.iftype_ext_capab) { 2888 struct nlattr *nested_ext_capab, *nested; 2889 2890 nested = nla_nest_start_noflag(msg, 2891 NL80211_ATTR_IFTYPE_EXT_CAPA); 2892 if (!nested) 2893 goto nla_put_failure; 2894 2895 for (i = state->capa_start; 2896 i < rdev->wiphy.num_iftype_ext_capab; i++) { 2897 const struct wiphy_iftype_ext_capab *capab; 2898 2899 capab = &rdev->wiphy.iftype_ext_capab[i]; 2900 2901 nested_ext_capab = nla_nest_start_noflag(msg, 2902 i); 2903 if (!nested_ext_capab || 2904 nla_put_u32(msg, NL80211_ATTR_IFTYPE, 2905 capab->iftype) || 2906 nla_put(msg, NL80211_ATTR_EXT_CAPA, 2907 capab->extended_capabilities_len, 2908 capab->extended_capabilities) || 2909 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK, 2910 capab->extended_capabilities_len, 2911 capab->extended_capabilities_mask)) 2912 goto nla_put_failure; 2913 2914 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO && 2915 (nla_put_u16(msg, 2916 NL80211_ATTR_EML_CAPABILITY, 2917 capab->eml_capabilities) || 2918 nla_put_u16(msg, 2919 NL80211_ATTR_MLD_CAPA_AND_OPS, 2920 capab->mld_capa_and_ops))) 2921 goto nla_put_failure; 2922 2923 nla_nest_end(msg, nested_ext_capab); 2924 if (state->split) 2925 break; 2926 } 2927 nla_nest_end(msg, nested); 2928 if (i < rdev->wiphy.num_iftype_ext_capab) { 2929 state->capa_start = i + 1; 2930 break; 2931 } 2932 } 2933 2934 if (nla_put_u32(msg, NL80211_ATTR_BANDS, 2935 rdev->wiphy.nan_supported_bands)) 2936 goto nla_put_failure; 2937 2938 if (wiphy_ext_feature_isset(&rdev->wiphy, 2939 NL80211_EXT_FEATURE_TXQS)) { 2940 struct cfg80211_txq_stats txqstats = {}; 2941 int res; 2942 2943 res = rdev_get_txq_stats(rdev, NULL, &txqstats); 2944 if (!res && 2945 !nl80211_put_txq_stats(msg, &txqstats, 2946 NL80211_ATTR_TXQ_STATS)) 2947 goto nla_put_failure; 2948 2949 if (nla_put_u32(msg, NL80211_ATTR_TXQ_LIMIT, 2950 rdev->wiphy.txq_limit)) 2951 goto nla_put_failure; 2952 if (nla_put_u32(msg, NL80211_ATTR_TXQ_MEMORY_LIMIT, 2953 rdev->wiphy.txq_memory_limit)) 2954 goto nla_put_failure; 2955 if (nla_put_u32(msg, NL80211_ATTR_TXQ_QUANTUM, 2956 rdev->wiphy.txq_quantum)) 2957 goto nla_put_failure; 2958 } 2959 2960 state->split_start++; 2961 break; 2962 case 14: 2963 if (nl80211_send_pmsr_capa(rdev, msg)) 2964 goto nla_put_failure; 2965 2966 state->split_start++; 2967 break; 2968 case 15: 2969 if (rdev->wiphy.akm_suites && 2970 nla_put(msg, NL80211_ATTR_AKM_SUITES, 2971 sizeof(u32) * rdev->wiphy.n_akm_suites, 2972 rdev->wiphy.akm_suites)) 2973 goto nla_put_failure; 2974 2975 if (nl80211_put_iftype_akm_suites(rdev, msg)) 2976 goto nla_put_failure; 2977 2978 if (nl80211_put_tid_config_support(rdev, msg)) 2979 goto nla_put_failure; 2980 state->split_start++; 2981 break; 2982 case 16: 2983 if (nl80211_put_sar_specs(rdev, msg)) 2984 goto nla_put_failure; 2985 2986 if (nl80211_put_mbssid_support(&rdev->wiphy, msg)) 2987 goto nla_put_failure; 2988 2989 if (nla_put_u16(msg, NL80211_ATTR_MAX_NUM_AKM_SUITES, 2990 rdev->wiphy.max_num_akm_suites)) 2991 goto nla_put_failure; 2992 2993 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO) 2994 nla_put_flag(msg, NL80211_ATTR_MLO_SUPPORT); 2995 2996 if (rdev->wiphy.hw_timestamp_max_peers && 2997 nla_put_u16(msg, NL80211_ATTR_MAX_HW_TIMESTAMP_PEERS, 2998 rdev->wiphy.hw_timestamp_max_peers)) 2999 goto nla_put_failure; 3000 3001 /* done */ 3002 state->split_start = 0; 3003 break; 3004 } 3005 finish: 3006 genlmsg_end(msg, hdr); 3007 return 0; 3008 3009 nla_put_failure: 3010 genlmsg_cancel(msg, hdr); 3011 return -EMSGSIZE; 3012 } 3013 3014 static int nl80211_dump_wiphy_parse(struct sk_buff *skb, 3015 struct netlink_callback *cb, 3016 struct nl80211_dump_wiphy_state *state) 3017 { 3018 struct nlattr **tb = kcalloc(NUM_NL80211_ATTR, sizeof(*tb), GFP_KERNEL); 3019 int ret; 3020 3021 if (!tb) 3022 return -ENOMEM; 3023 3024 ret = nlmsg_parse_deprecated(cb->nlh, 3025 GENL_HDRLEN + nl80211_fam.hdrsize, 3026 tb, nl80211_fam.maxattr, 3027 nl80211_policy, NULL); 3028 /* ignore parse errors for backward compatibility */ 3029 if (ret) { 3030 ret = 0; 3031 goto out; 3032 } 3033 3034 state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; 3035 if (tb[NL80211_ATTR_WIPHY]) 3036 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]); 3037 if (tb[NL80211_ATTR_WDEV]) 3038 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32; 3039 if (tb[NL80211_ATTR_IFINDEX]) { 3040 struct net_device *netdev; 3041 struct cfg80211_registered_device *rdev; 3042 int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]); 3043 3044 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx); 3045 if (!netdev) { 3046 ret = -ENODEV; 3047 goto out; 3048 } 3049 if (netdev->ieee80211_ptr) { 3050 rdev = wiphy_to_rdev( 3051 netdev->ieee80211_ptr->wiphy); 3052 state->filter_wiphy = rdev->wiphy_idx; 3053 } 3054 } 3055 3056 ret = 0; 3057 out: 3058 kfree(tb); 3059 return ret; 3060 } 3061 3062 static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb) 3063 { 3064 int idx = 0, ret; 3065 struct nl80211_dump_wiphy_state *state = (void *)cb->args[0]; 3066 struct cfg80211_registered_device *rdev; 3067 3068 rtnl_lock(); 3069 if (!state) { 3070 state = kzalloc(sizeof(*state), GFP_KERNEL); 3071 if (!state) { 3072 rtnl_unlock(); 3073 return -ENOMEM; 3074 } 3075 state->filter_wiphy = -1; 3076 ret = nl80211_dump_wiphy_parse(skb, cb, state); 3077 if (ret) { 3078 kfree(state); 3079 rtnl_unlock(); 3080 return ret; 3081 } 3082 cb->args[0] = (long)state; 3083 } 3084 3085 for_each_rdev(rdev) { 3086 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) 3087 continue; 3088 if (++idx <= state->start) 3089 continue; 3090 if (state->filter_wiphy != -1 && 3091 state->filter_wiphy != rdev->wiphy_idx) 3092 continue; 3093 wiphy_lock(&rdev->wiphy); 3094 /* attempt to fit multiple wiphy data chunks into the skb */ 3095 do { 3096 ret = nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, 3097 skb, 3098 NETLINK_CB(cb->skb).portid, 3099 cb->nlh->nlmsg_seq, 3100 NLM_F_MULTI, state); 3101 if (ret < 0) { 3102 /* 3103 * If sending the wiphy data didn't fit (ENOBUFS 3104 * or EMSGSIZE returned), this SKB is still 3105 * empty (so it's not too big because another 3106 * wiphy dataset is already in the skb) and 3107 * we've not tried to adjust the dump allocation 3108 * yet ... then adjust the alloc size to be 3109 * bigger, and return 1 but with the empty skb. 3110 * This results in an empty message being RX'ed 3111 * in userspace, but that is ignored. 3112 * 3113 * We can then retry with the larger buffer. 3114 */ 3115 if ((ret == -ENOBUFS || ret == -EMSGSIZE) && 3116 !skb->len && !state->split && 3117 cb->min_dump_alloc < 4096) { 3118 cb->min_dump_alloc = 4096; 3119 state->split_start = 0; 3120 wiphy_unlock(&rdev->wiphy); 3121 rtnl_unlock(); 3122 return 1; 3123 } 3124 idx--; 3125 break; 3126 } 3127 } while (state->split_start > 0); 3128 wiphy_unlock(&rdev->wiphy); 3129 break; 3130 } 3131 rtnl_unlock(); 3132 3133 state->start = idx; 3134 3135 return skb->len; 3136 } 3137 3138 static int nl80211_dump_wiphy_done(struct netlink_callback *cb) 3139 { 3140 kfree((void *)cb->args[0]); 3141 return 0; 3142 } 3143 3144 static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info) 3145 { 3146 struct sk_buff *msg; 3147 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3148 struct nl80211_dump_wiphy_state state = {}; 3149 3150 msg = nlmsg_new(4096, GFP_KERNEL); 3151 if (!msg) 3152 return -ENOMEM; 3153 3154 if (nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, msg, 3155 info->snd_portid, info->snd_seq, 0, 3156 &state) < 0) { 3157 nlmsg_free(msg); 3158 return -ENOBUFS; 3159 } 3160 3161 return genlmsg_reply(msg, info); 3162 } 3163 3164 static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = { 3165 [NL80211_TXQ_ATTR_QUEUE] = { .type = NLA_U8 }, 3166 [NL80211_TXQ_ATTR_TXOP] = { .type = NLA_U16 }, 3167 [NL80211_TXQ_ATTR_CWMIN] = { .type = NLA_U16 }, 3168 [NL80211_TXQ_ATTR_CWMAX] = { .type = NLA_U16 }, 3169 [NL80211_TXQ_ATTR_AIFS] = { .type = NLA_U8 }, 3170 }; 3171 3172 static int parse_txq_params(struct nlattr *tb[], 3173 struct ieee80211_txq_params *txq_params) 3174 { 3175 u8 ac; 3176 3177 if (!tb[NL80211_TXQ_ATTR_AC] || !tb[NL80211_TXQ_ATTR_TXOP] || 3178 !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] || 3179 !tb[NL80211_TXQ_ATTR_AIFS]) 3180 return -EINVAL; 3181 3182 ac = nla_get_u8(tb[NL80211_TXQ_ATTR_AC]); 3183 txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]); 3184 txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]); 3185 txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]); 3186 txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]); 3187 3188 if (ac >= NL80211_NUM_ACS) 3189 return -EINVAL; 3190 txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS); 3191 return 0; 3192 } 3193 3194 static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev) 3195 { 3196 /* 3197 * You can only set the channel explicitly for some interfaces, 3198 * most have their channel managed via their respective 3199 * "establish a connection" command (connect, join, ...) 3200 * 3201 * For AP/GO and mesh mode, the channel can be set with the 3202 * channel userspace API, but is only stored and passed to the 3203 * low-level driver when the AP starts or the mesh is joined. 3204 * This is for backward compatibility, userspace can also give 3205 * the channel in the start-ap or join-mesh commands instead. 3206 * 3207 * Monitors are special as they are normally slaved to 3208 * whatever else is going on, so they have their own special 3209 * operation to set the monitor channel if possible. 3210 */ 3211 return !wdev || 3212 wdev->iftype == NL80211_IFTYPE_AP || 3213 wdev->iftype == NL80211_IFTYPE_MESH_POINT || 3214 wdev->iftype == NL80211_IFTYPE_MONITOR || 3215 wdev->iftype == NL80211_IFTYPE_P2P_GO; 3216 } 3217 3218 static int nl80211_parse_punct_bitmap(struct cfg80211_registered_device *rdev, 3219 struct genl_info *info, 3220 const struct cfg80211_chan_def *chandef, 3221 u16 *punct_bitmap) 3222 { 3223 if (!wiphy_ext_feature_isset(&rdev->wiphy, NL80211_EXT_FEATURE_PUNCT)) 3224 return -EINVAL; 3225 3226 *punct_bitmap = nla_get_u32(info->attrs[NL80211_ATTR_PUNCT_BITMAP]); 3227 if (!cfg80211_valid_disable_subchannel_bitmap(punct_bitmap, chandef)) 3228 return -EINVAL; 3229 3230 return 0; 3231 } 3232 3233 int nl80211_parse_chandef(struct cfg80211_registered_device *rdev, 3234 struct genl_info *info, 3235 struct cfg80211_chan_def *chandef) 3236 { 3237 struct netlink_ext_ack *extack = info->extack; 3238 struct nlattr **attrs = info->attrs; 3239 u32 control_freq; 3240 3241 if (!attrs[NL80211_ATTR_WIPHY_FREQ]) { 3242 NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ], 3243 "Frequency is missing"); 3244 return -EINVAL; 3245 } 3246 3247 control_freq = MHZ_TO_KHZ( 3248 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); 3249 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 3250 control_freq += 3251 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 3252 3253 memset(chandef, 0, sizeof(*chandef)); 3254 chandef->chan = ieee80211_get_channel_khz(&rdev->wiphy, control_freq); 3255 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; 3256 chandef->center_freq1 = KHZ_TO_MHZ(control_freq); 3257 chandef->freq1_offset = control_freq % 1000; 3258 chandef->center_freq2 = 0; 3259 3260 /* Primary channel not allowed */ 3261 if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED) { 3262 NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ], 3263 "Channel is disabled"); 3264 return -EINVAL; 3265 } 3266 3267 if (attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) { 3268 enum nl80211_channel_type chantype; 3269 3270 chantype = nla_get_u32(attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]); 3271 3272 switch (chantype) { 3273 case NL80211_CHAN_NO_HT: 3274 case NL80211_CHAN_HT20: 3275 case NL80211_CHAN_HT40PLUS: 3276 case NL80211_CHAN_HT40MINUS: 3277 cfg80211_chandef_create(chandef, chandef->chan, 3278 chantype); 3279 /* user input for center_freq is incorrect */ 3280 if (attrs[NL80211_ATTR_CENTER_FREQ1] && 3281 chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) { 3282 NL_SET_ERR_MSG_ATTR(extack, 3283 attrs[NL80211_ATTR_CENTER_FREQ1], 3284 "bad center frequency 1"); 3285 return -EINVAL; 3286 } 3287 /* center_freq2 must be zero */ 3288 if (attrs[NL80211_ATTR_CENTER_FREQ2] && 3289 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2])) { 3290 NL_SET_ERR_MSG_ATTR(extack, 3291 attrs[NL80211_ATTR_CENTER_FREQ2], 3292 "center frequency 2 can't be used"); 3293 return -EINVAL; 3294 } 3295 break; 3296 default: 3297 NL_SET_ERR_MSG_ATTR(extack, 3298 attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE], 3299 "invalid channel type"); 3300 return -EINVAL; 3301 } 3302 } else if (attrs[NL80211_ATTR_CHANNEL_WIDTH]) { 3303 chandef->width = 3304 nla_get_u32(attrs[NL80211_ATTR_CHANNEL_WIDTH]); 3305 if (chandef->chan->band == NL80211_BAND_S1GHZ) { 3306 /* User input error for channel width doesn't match channel */ 3307 if (chandef->width != ieee80211_s1g_channel_width(chandef->chan)) { 3308 NL_SET_ERR_MSG_ATTR(extack, 3309 attrs[NL80211_ATTR_CHANNEL_WIDTH], 3310 "bad channel width"); 3311 return -EINVAL; 3312 } 3313 } 3314 if (attrs[NL80211_ATTR_CENTER_FREQ1]) { 3315 chandef->center_freq1 = 3316 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1]); 3317 if (attrs[NL80211_ATTR_CENTER_FREQ1_OFFSET]) 3318 chandef->freq1_offset = nla_get_u32( 3319 attrs[NL80211_ATTR_CENTER_FREQ1_OFFSET]); 3320 else 3321 chandef->freq1_offset = 0; 3322 } 3323 if (attrs[NL80211_ATTR_CENTER_FREQ2]) 3324 chandef->center_freq2 = 3325 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2]); 3326 } 3327 3328 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { 3329 chandef->edmg.channels = 3330 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); 3331 3332 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) 3333 chandef->edmg.bw_config = 3334 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); 3335 } else { 3336 chandef->edmg.bw_config = 0; 3337 chandef->edmg.channels = 0; 3338 } 3339 3340 if (!cfg80211_chandef_valid(chandef)) { 3341 NL_SET_ERR_MSG(extack, "invalid channel definition"); 3342 return -EINVAL; 3343 } 3344 3345 if (!cfg80211_chandef_usable(&rdev->wiphy, chandef, 3346 IEEE80211_CHAN_DISABLED)) { 3347 NL_SET_ERR_MSG(extack, "(extension) channel is disabled"); 3348 return -EINVAL; 3349 } 3350 3351 if ((chandef->width == NL80211_CHAN_WIDTH_5 || 3352 chandef->width == NL80211_CHAN_WIDTH_10) && 3353 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) { 3354 NL_SET_ERR_MSG(extack, "5/10 MHz not supported"); 3355 return -EINVAL; 3356 } 3357 3358 return 0; 3359 } 3360 3361 static int __nl80211_set_channel(struct cfg80211_registered_device *rdev, 3362 struct net_device *dev, 3363 struct genl_info *info, 3364 int _link_id) 3365 { 3366 struct cfg80211_chan_def chandef; 3367 int result; 3368 enum nl80211_iftype iftype = NL80211_IFTYPE_MONITOR; 3369 struct wireless_dev *wdev = NULL; 3370 int link_id = _link_id; 3371 3372 if (dev) 3373 wdev = dev->ieee80211_ptr; 3374 if (!nl80211_can_set_dev_channel(wdev)) 3375 return -EOPNOTSUPP; 3376 if (wdev) 3377 iftype = wdev->iftype; 3378 3379 if (link_id < 0) { 3380 if (wdev && wdev->valid_links) 3381 return -EINVAL; 3382 link_id = 0; 3383 } 3384 3385 result = nl80211_parse_chandef(rdev, info, &chandef); 3386 if (result) 3387 return result; 3388 3389 switch (iftype) { 3390 case NL80211_IFTYPE_AP: 3391 case NL80211_IFTYPE_P2P_GO: 3392 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, 3393 iftype)) 3394 return -EINVAL; 3395 if (wdev->links[link_id].ap.beacon_interval) { 3396 struct ieee80211_channel *cur_chan; 3397 3398 if (!dev || !rdev->ops->set_ap_chanwidth || 3399 !(rdev->wiphy.features & 3400 NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE)) 3401 return -EBUSY; 3402 3403 /* Only allow dynamic channel width changes */ 3404 cur_chan = wdev->links[link_id].ap.chandef.chan; 3405 if (chandef.chan != cur_chan) 3406 return -EBUSY; 3407 3408 result = rdev_set_ap_chanwidth(rdev, dev, link_id, 3409 &chandef); 3410 if (result) 3411 return result; 3412 wdev->links[link_id].ap.chandef = chandef; 3413 } else { 3414 wdev->u.ap.preset_chandef = chandef; 3415 } 3416 return 0; 3417 case NL80211_IFTYPE_MESH_POINT: 3418 return cfg80211_set_mesh_channel(rdev, wdev, &chandef); 3419 case NL80211_IFTYPE_MONITOR: 3420 return cfg80211_set_monitor_channel(rdev, &chandef); 3421 default: 3422 break; 3423 } 3424 3425 return -EINVAL; 3426 } 3427 3428 static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info) 3429 { 3430 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3431 int link_id = nl80211_link_id_or_invalid(info->attrs); 3432 struct net_device *netdev = info->user_ptr[1]; 3433 3434 return __nl80211_set_channel(rdev, netdev, info, link_id); 3435 } 3436 3437 static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) 3438 { 3439 struct cfg80211_registered_device *rdev = NULL; 3440 struct net_device *netdev = NULL; 3441 struct wireless_dev *wdev; 3442 int result = 0, rem_txq_params = 0; 3443 struct nlattr *nl_txq_params; 3444 u32 changed; 3445 u8 retry_short = 0, retry_long = 0; 3446 u32 frag_threshold = 0, rts_threshold = 0; 3447 u8 coverage_class = 0; 3448 u32 txq_limit = 0, txq_memory_limit = 0, txq_quantum = 0; 3449 3450 rtnl_lock(); 3451 /* 3452 * Try to find the wiphy and netdev. Normally this 3453 * function shouldn't need the netdev, but this is 3454 * done for backward compatibility -- previously 3455 * setting the channel was done per wiphy, but now 3456 * it is per netdev. Previous userland like hostapd 3457 * also passed a netdev to set_wiphy, so that it is 3458 * possible to let that go to the right netdev! 3459 */ 3460 3461 if (info->attrs[NL80211_ATTR_IFINDEX]) { 3462 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); 3463 3464 netdev = __dev_get_by_index(genl_info_net(info), ifindex); 3465 if (netdev && netdev->ieee80211_ptr) 3466 rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy); 3467 else 3468 netdev = NULL; 3469 } 3470 3471 if (!netdev) { 3472 rdev = __cfg80211_rdev_from_attrs(genl_info_net(info), 3473 info->attrs); 3474 if (IS_ERR(rdev)) { 3475 rtnl_unlock(); 3476 return PTR_ERR(rdev); 3477 } 3478 wdev = NULL; 3479 netdev = NULL; 3480 result = 0; 3481 } else 3482 wdev = netdev->ieee80211_ptr; 3483 3484 wiphy_lock(&rdev->wiphy); 3485 3486 /* 3487 * end workaround code, by now the rdev is available 3488 * and locked, and wdev may or may not be NULL. 3489 */ 3490 3491 if (info->attrs[NL80211_ATTR_WIPHY_NAME]) 3492 result = cfg80211_dev_rename( 3493 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME])); 3494 rtnl_unlock(); 3495 3496 if (result) 3497 goto out; 3498 3499 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) { 3500 struct ieee80211_txq_params txq_params; 3501 struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1]; 3502 3503 if (!rdev->ops->set_txq_params) { 3504 result = -EOPNOTSUPP; 3505 goto out; 3506 } 3507 3508 if (!netdev) { 3509 result = -EINVAL; 3510 goto out; 3511 } 3512 3513 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 3514 netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 3515 result = -EINVAL; 3516 goto out; 3517 } 3518 3519 if (!netif_running(netdev)) { 3520 result = -ENETDOWN; 3521 goto out; 3522 } 3523 3524 nla_for_each_nested(nl_txq_params, 3525 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], 3526 rem_txq_params) { 3527 result = nla_parse_nested_deprecated(tb, 3528 NL80211_TXQ_ATTR_MAX, 3529 nl_txq_params, 3530 txq_params_policy, 3531 info->extack); 3532 if (result) 3533 goto out; 3534 result = parse_txq_params(tb, &txq_params); 3535 if (result) 3536 goto out; 3537 3538 txq_params.link_id = 3539 nl80211_link_id_or_invalid(info->attrs); 3540 3541 if (txq_params.link_id >= 0 && 3542 !(netdev->ieee80211_ptr->valid_links & 3543 BIT(txq_params.link_id))) 3544 result = -ENOLINK; 3545 else if (txq_params.link_id >= 0 && 3546 !netdev->ieee80211_ptr->valid_links) 3547 result = -EINVAL; 3548 else 3549 result = rdev_set_txq_params(rdev, netdev, 3550 &txq_params); 3551 if (result) 3552 goto out; 3553 } 3554 } 3555 3556 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 3557 int link_id = nl80211_link_id_or_invalid(info->attrs); 3558 3559 if (wdev) { 3560 result = __nl80211_set_channel( 3561 rdev, 3562 nl80211_can_set_dev_channel(wdev) ? netdev : NULL, 3563 info, link_id); 3564 } else { 3565 result = __nl80211_set_channel(rdev, netdev, info, link_id); 3566 } 3567 3568 if (result) 3569 goto out; 3570 } 3571 3572 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) { 3573 struct wireless_dev *txp_wdev = wdev; 3574 enum nl80211_tx_power_setting type; 3575 int idx, mbm = 0; 3576 3577 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER)) 3578 txp_wdev = NULL; 3579 3580 if (!rdev->ops->set_tx_power) { 3581 result = -EOPNOTSUPP; 3582 goto out; 3583 } 3584 3585 idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING; 3586 type = nla_get_u32(info->attrs[idx]); 3587 3588 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] && 3589 (type != NL80211_TX_POWER_AUTOMATIC)) { 3590 result = -EINVAL; 3591 goto out; 3592 } 3593 3594 if (type != NL80211_TX_POWER_AUTOMATIC) { 3595 idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL; 3596 mbm = nla_get_u32(info->attrs[idx]); 3597 } 3598 3599 result = rdev_set_tx_power(rdev, txp_wdev, type, mbm); 3600 if (result) 3601 goto out; 3602 } 3603 3604 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && 3605 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { 3606 u32 tx_ant, rx_ant; 3607 3608 if ((!rdev->wiphy.available_antennas_tx && 3609 !rdev->wiphy.available_antennas_rx) || 3610 !rdev->ops->set_antenna) { 3611 result = -EOPNOTSUPP; 3612 goto out; 3613 } 3614 3615 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]); 3616 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]); 3617 3618 /* reject antenna configurations which don't match the 3619 * available antenna masks, except for the "all" mask */ 3620 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) || 3621 (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) { 3622 result = -EINVAL; 3623 goto out; 3624 } 3625 3626 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx; 3627 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx; 3628 3629 result = rdev_set_antenna(rdev, tx_ant, rx_ant); 3630 if (result) 3631 goto out; 3632 } 3633 3634 changed = 0; 3635 3636 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) { 3637 retry_short = nla_get_u8( 3638 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]); 3639 3640 changed |= WIPHY_PARAM_RETRY_SHORT; 3641 } 3642 3643 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) { 3644 retry_long = nla_get_u8( 3645 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]); 3646 3647 changed |= WIPHY_PARAM_RETRY_LONG; 3648 } 3649 3650 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) { 3651 frag_threshold = nla_get_u32( 3652 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]); 3653 if (frag_threshold < 256) { 3654 result = -EINVAL; 3655 goto out; 3656 } 3657 3658 if (frag_threshold != (u32) -1) { 3659 /* 3660 * Fragments (apart from the last one) are required to 3661 * have even length. Make the fragmentation code 3662 * simpler by stripping LSB should someone try to use 3663 * odd threshold value. 3664 */ 3665 frag_threshold &= ~0x1; 3666 } 3667 changed |= WIPHY_PARAM_FRAG_THRESHOLD; 3668 } 3669 3670 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { 3671 rts_threshold = nla_get_u32( 3672 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); 3673 changed |= WIPHY_PARAM_RTS_THRESHOLD; 3674 } 3675 3676 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) { 3677 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { 3678 result = -EINVAL; 3679 goto out; 3680 } 3681 3682 coverage_class = nla_get_u8( 3683 info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]); 3684 changed |= WIPHY_PARAM_COVERAGE_CLASS; 3685 } 3686 3687 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { 3688 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION)) { 3689 result = -EOPNOTSUPP; 3690 goto out; 3691 } 3692 3693 changed |= WIPHY_PARAM_DYN_ACK; 3694 } 3695 3696 if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) { 3697 if (!wiphy_ext_feature_isset(&rdev->wiphy, 3698 NL80211_EXT_FEATURE_TXQS)) { 3699 result = -EOPNOTSUPP; 3700 goto out; 3701 } 3702 txq_limit = nla_get_u32( 3703 info->attrs[NL80211_ATTR_TXQ_LIMIT]); 3704 changed |= WIPHY_PARAM_TXQ_LIMIT; 3705 } 3706 3707 if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) { 3708 if (!wiphy_ext_feature_isset(&rdev->wiphy, 3709 NL80211_EXT_FEATURE_TXQS)) { 3710 result = -EOPNOTSUPP; 3711 goto out; 3712 } 3713 txq_memory_limit = nla_get_u32( 3714 info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]); 3715 changed |= WIPHY_PARAM_TXQ_MEMORY_LIMIT; 3716 } 3717 3718 if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) { 3719 if (!wiphy_ext_feature_isset(&rdev->wiphy, 3720 NL80211_EXT_FEATURE_TXQS)) { 3721 result = -EOPNOTSUPP; 3722 goto out; 3723 } 3724 txq_quantum = nla_get_u32( 3725 info->attrs[NL80211_ATTR_TXQ_QUANTUM]); 3726 changed |= WIPHY_PARAM_TXQ_QUANTUM; 3727 } 3728 3729 if (changed) { 3730 u8 old_retry_short, old_retry_long; 3731 u32 old_frag_threshold, old_rts_threshold; 3732 u8 old_coverage_class; 3733 u32 old_txq_limit, old_txq_memory_limit, old_txq_quantum; 3734 3735 if (!rdev->ops->set_wiphy_params) { 3736 result = -EOPNOTSUPP; 3737 goto out; 3738 } 3739 3740 old_retry_short = rdev->wiphy.retry_short; 3741 old_retry_long = rdev->wiphy.retry_long; 3742 old_frag_threshold = rdev->wiphy.frag_threshold; 3743 old_rts_threshold = rdev->wiphy.rts_threshold; 3744 old_coverage_class = rdev->wiphy.coverage_class; 3745 old_txq_limit = rdev->wiphy.txq_limit; 3746 old_txq_memory_limit = rdev->wiphy.txq_memory_limit; 3747 old_txq_quantum = rdev->wiphy.txq_quantum; 3748 3749 if (changed & WIPHY_PARAM_RETRY_SHORT) 3750 rdev->wiphy.retry_short = retry_short; 3751 if (changed & WIPHY_PARAM_RETRY_LONG) 3752 rdev->wiphy.retry_long = retry_long; 3753 if (changed & WIPHY_PARAM_FRAG_THRESHOLD) 3754 rdev->wiphy.frag_threshold = frag_threshold; 3755 if (changed & WIPHY_PARAM_RTS_THRESHOLD) 3756 rdev->wiphy.rts_threshold = rts_threshold; 3757 if (changed & WIPHY_PARAM_COVERAGE_CLASS) 3758 rdev->wiphy.coverage_class = coverage_class; 3759 if (changed & WIPHY_PARAM_TXQ_LIMIT) 3760 rdev->wiphy.txq_limit = txq_limit; 3761 if (changed & WIPHY_PARAM_TXQ_MEMORY_LIMIT) 3762 rdev->wiphy.txq_memory_limit = txq_memory_limit; 3763 if (changed & WIPHY_PARAM_TXQ_QUANTUM) 3764 rdev->wiphy.txq_quantum = txq_quantum; 3765 3766 result = rdev_set_wiphy_params(rdev, changed); 3767 if (result) { 3768 rdev->wiphy.retry_short = old_retry_short; 3769 rdev->wiphy.retry_long = old_retry_long; 3770 rdev->wiphy.frag_threshold = old_frag_threshold; 3771 rdev->wiphy.rts_threshold = old_rts_threshold; 3772 rdev->wiphy.coverage_class = old_coverage_class; 3773 rdev->wiphy.txq_limit = old_txq_limit; 3774 rdev->wiphy.txq_memory_limit = old_txq_memory_limit; 3775 rdev->wiphy.txq_quantum = old_txq_quantum; 3776 goto out; 3777 } 3778 } 3779 3780 result = 0; 3781 3782 out: 3783 wiphy_unlock(&rdev->wiphy); 3784 return result; 3785 } 3786 3787 int nl80211_send_chandef(struct sk_buff *msg, const struct cfg80211_chan_def *chandef) 3788 { 3789 if (WARN_ON(!cfg80211_chandef_valid(chandef))) 3790 return -EINVAL; 3791 3792 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, 3793 chandef->chan->center_freq)) 3794 return -ENOBUFS; 3795 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, 3796 chandef->chan->freq_offset)) 3797 return -ENOBUFS; 3798 switch (chandef->width) { 3799 case NL80211_CHAN_WIDTH_20_NOHT: 3800 case NL80211_CHAN_WIDTH_20: 3801 case NL80211_CHAN_WIDTH_40: 3802 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 3803 cfg80211_get_chandef_type(chandef))) 3804 return -ENOBUFS; 3805 break; 3806 default: 3807 break; 3808 } 3809 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width)) 3810 return -ENOBUFS; 3811 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1)) 3812 return -ENOBUFS; 3813 if (chandef->center_freq2 && 3814 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2)) 3815 return -ENOBUFS; 3816 return 0; 3817 } 3818 EXPORT_SYMBOL(nl80211_send_chandef); 3819 3820 static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags, 3821 struct cfg80211_registered_device *rdev, 3822 struct wireless_dev *wdev, 3823 enum nl80211_commands cmd) 3824 { 3825 struct net_device *dev = wdev->netdev; 3826 void *hdr; 3827 3828 lockdep_assert_wiphy(&rdev->wiphy); 3829 3830 WARN_ON(cmd != NL80211_CMD_NEW_INTERFACE && 3831 cmd != NL80211_CMD_DEL_INTERFACE && 3832 cmd != NL80211_CMD_SET_INTERFACE); 3833 3834 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 3835 if (!hdr) 3836 return -1; 3837 3838 if (dev && 3839 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 3840 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name))) 3841 goto nla_put_failure; 3842 3843 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 3844 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || 3845 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 3846 NL80211_ATTR_PAD) || 3847 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, wdev_address(wdev)) || 3848 nla_put_u32(msg, NL80211_ATTR_GENERATION, 3849 rdev->devlist_generation ^ 3850 (cfg80211_rdev_list_generation << 2)) || 3851 nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr)) 3852 goto nla_put_failure; 3853 3854 if (rdev->ops->get_channel && !wdev->valid_links) { 3855 struct cfg80211_chan_def chandef = {}; 3856 int ret; 3857 3858 ret = rdev_get_channel(rdev, wdev, 0, &chandef); 3859 if (ret == 0 && nl80211_send_chandef(msg, &chandef)) 3860 goto nla_put_failure; 3861 } 3862 3863 if (rdev->ops->get_tx_power) { 3864 int dbm, ret; 3865 3866 ret = rdev_get_tx_power(rdev, wdev, &dbm); 3867 if (ret == 0 && 3868 nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL, 3869 DBM_TO_MBM(dbm))) 3870 goto nla_put_failure; 3871 } 3872 3873 switch (wdev->iftype) { 3874 case NL80211_IFTYPE_AP: 3875 case NL80211_IFTYPE_P2P_GO: 3876 if (wdev->u.ap.ssid_len && 3877 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len, 3878 wdev->u.ap.ssid)) 3879 goto nla_put_failure; 3880 break; 3881 case NL80211_IFTYPE_STATION: 3882 case NL80211_IFTYPE_P2P_CLIENT: 3883 if (wdev->u.client.ssid_len && 3884 nla_put(msg, NL80211_ATTR_SSID, wdev->u.client.ssid_len, 3885 wdev->u.client.ssid)) 3886 goto nla_put_failure; 3887 break; 3888 case NL80211_IFTYPE_ADHOC: 3889 if (wdev->u.ibss.ssid_len && 3890 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ibss.ssid_len, 3891 wdev->u.ibss.ssid)) 3892 goto nla_put_failure; 3893 break; 3894 default: 3895 /* nothing */ 3896 break; 3897 } 3898 3899 if (rdev->ops->get_txq_stats) { 3900 struct cfg80211_txq_stats txqstats = {}; 3901 int ret = rdev_get_txq_stats(rdev, wdev, &txqstats); 3902 3903 if (ret == 0 && 3904 !nl80211_put_txq_stats(msg, &txqstats, 3905 NL80211_ATTR_TXQ_STATS)) 3906 goto nla_put_failure; 3907 } 3908 3909 if (wdev->valid_links) { 3910 unsigned int link_id; 3911 struct nlattr *links = nla_nest_start(msg, 3912 NL80211_ATTR_MLO_LINKS); 3913 3914 if (!links) 3915 goto nla_put_failure; 3916 3917 for_each_valid_link(wdev, link_id) { 3918 struct nlattr *link = nla_nest_start(msg, link_id + 1); 3919 struct cfg80211_chan_def chandef = {}; 3920 int ret; 3921 3922 if (!link) 3923 goto nla_put_failure; 3924 3925 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 3926 goto nla_put_failure; 3927 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 3928 wdev->links[link_id].addr)) 3929 goto nla_put_failure; 3930 3931 ret = rdev_get_channel(rdev, wdev, link_id, &chandef); 3932 if (ret == 0 && nl80211_send_chandef(msg, &chandef)) 3933 goto nla_put_failure; 3934 3935 nla_nest_end(msg, link); 3936 } 3937 3938 nla_nest_end(msg, links); 3939 } 3940 3941 genlmsg_end(msg, hdr); 3942 return 0; 3943 3944 nla_put_failure: 3945 genlmsg_cancel(msg, hdr); 3946 return -EMSGSIZE; 3947 } 3948 3949 static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb) 3950 { 3951 int wp_idx = 0; 3952 int if_idx = 0; 3953 int wp_start = cb->args[0]; 3954 int if_start = cb->args[1]; 3955 int filter_wiphy = -1; 3956 struct cfg80211_registered_device *rdev; 3957 struct wireless_dev *wdev; 3958 int ret; 3959 3960 rtnl_lock(); 3961 if (!cb->args[2]) { 3962 struct nl80211_dump_wiphy_state state = { 3963 .filter_wiphy = -1, 3964 }; 3965 3966 ret = nl80211_dump_wiphy_parse(skb, cb, &state); 3967 if (ret) 3968 goto out_unlock; 3969 3970 filter_wiphy = state.filter_wiphy; 3971 3972 /* 3973 * if filtering, set cb->args[2] to +1 since 0 is the default 3974 * value needed to determine that parsing is necessary. 3975 */ 3976 if (filter_wiphy >= 0) 3977 cb->args[2] = filter_wiphy + 1; 3978 else 3979 cb->args[2] = -1; 3980 } else if (cb->args[2] > 0) { 3981 filter_wiphy = cb->args[2] - 1; 3982 } 3983 3984 for_each_rdev(rdev) { 3985 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) 3986 continue; 3987 if (wp_idx < wp_start) { 3988 wp_idx++; 3989 continue; 3990 } 3991 3992 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx) 3993 continue; 3994 3995 if_idx = 0; 3996 3997 wiphy_lock(&rdev->wiphy); 3998 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 3999 if (if_idx < if_start) { 4000 if_idx++; 4001 continue; 4002 } 4003 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, 4004 cb->nlh->nlmsg_seq, NLM_F_MULTI, 4005 rdev, wdev, 4006 NL80211_CMD_NEW_INTERFACE) < 0) { 4007 wiphy_unlock(&rdev->wiphy); 4008 goto out; 4009 } 4010 if_idx++; 4011 } 4012 wiphy_unlock(&rdev->wiphy); 4013 4014 wp_idx++; 4015 } 4016 out: 4017 cb->args[0] = wp_idx; 4018 cb->args[1] = if_idx; 4019 4020 ret = skb->len; 4021 out_unlock: 4022 rtnl_unlock(); 4023 4024 return ret; 4025 } 4026 4027 static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info) 4028 { 4029 struct sk_buff *msg; 4030 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4031 struct wireless_dev *wdev = info->user_ptr[1]; 4032 4033 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 4034 if (!msg) 4035 return -ENOMEM; 4036 4037 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, 4038 rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) { 4039 nlmsg_free(msg); 4040 return -ENOBUFS; 4041 } 4042 4043 return genlmsg_reply(msg, info); 4044 } 4045 4046 static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = { 4047 [NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG }, 4048 [NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG }, 4049 [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG }, 4050 [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG }, 4051 [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG }, 4052 [NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG }, 4053 }; 4054 4055 static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags) 4056 { 4057 struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1]; 4058 int flag; 4059 4060 *mntrflags = 0; 4061 4062 if (!nla) 4063 return -EINVAL; 4064 4065 if (nla_parse_nested_deprecated(flags, NL80211_MNTR_FLAG_MAX, nla, mntr_flags_policy, NULL)) 4066 return -EINVAL; 4067 4068 for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++) 4069 if (flags[flag]) 4070 *mntrflags |= (1<<flag); 4071 4072 *mntrflags |= MONITOR_FLAG_CHANGED; 4073 4074 return 0; 4075 } 4076 4077 static int nl80211_parse_mon_options(struct cfg80211_registered_device *rdev, 4078 enum nl80211_iftype type, 4079 struct genl_info *info, 4080 struct vif_params *params) 4081 { 4082 bool change = false; 4083 int err; 4084 4085 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { 4086 if (type != NL80211_IFTYPE_MONITOR) 4087 return -EINVAL; 4088 4089 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], 4090 ¶ms->flags); 4091 if (err) 4092 return err; 4093 4094 change = true; 4095 } 4096 4097 if (params->flags & MONITOR_FLAG_ACTIVE && 4098 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) 4099 return -EOPNOTSUPP; 4100 4101 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) { 4102 const u8 *mumimo_groups; 4103 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER; 4104 4105 if (type != NL80211_IFTYPE_MONITOR) 4106 return -EINVAL; 4107 4108 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) 4109 return -EOPNOTSUPP; 4110 4111 mumimo_groups = 4112 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); 4113 4114 /* bits 0 and 63 are reserved and must be zero */ 4115 if ((mumimo_groups[0] & BIT(0)) || 4116 (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7))) 4117 return -EINVAL; 4118 4119 params->vht_mumimo_groups = mumimo_groups; 4120 change = true; 4121 } 4122 4123 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) { 4124 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER; 4125 4126 if (type != NL80211_IFTYPE_MONITOR) 4127 return -EINVAL; 4128 4129 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) 4130 return -EOPNOTSUPP; 4131 4132 params->vht_mumimo_follow_addr = 4133 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]); 4134 change = true; 4135 } 4136 4137 return change ? 1 : 0; 4138 } 4139 4140 static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev, 4141 struct net_device *netdev, u8 use_4addr, 4142 enum nl80211_iftype iftype) 4143 { 4144 if (!use_4addr) { 4145 if (netdev && netif_is_bridge_port(netdev)) 4146 return -EBUSY; 4147 return 0; 4148 } 4149 4150 switch (iftype) { 4151 case NL80211_IFTYPE_AP_VLAN: 4152 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP) 4153 return 0; 4154 break; 4155 case NL80211_IFTYPE_STATION: 4156 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION) 4157 return 0; 4158 break; 4159 default: 4160 break; 4161 } 4162 4163 return -EOPNOTSUPP; 4164 } 4165 4166 static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info) 4167 { 4168 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4169 struct vif_params params; 4170 int err; 4171 enum nl80211_iftype otype, ntype; 4172 struct net_device *dev = info->user_ptr[1]; 4173 bool change = false; 4174 4175 memset(¶ms, 0, sizeof(params)); 4176 4177 otype = ntype = dev->ieee80211_ptr->iftype; 4178 4179 if (info->attrs[NL80211_ATTR_IFTYPE]) { 4180 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); 4181 if (otype != ntype) 4182 change = true; 4183 } 4184 4185 if (info->attrs[NL80211_ATTR_MESH_ID]) { 4186 struct wireless_dev *wdev = dev->ieee80211_ptr; 4187 4188 if (ntype != NL80211_IFTYPE_MESH_POINT) 4189 return -EINVAL; 4190 if (netif_running(dev)) 4191 return -EBUSY; 4192 4193 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN != 4194 IEEE80211_MAX_MESH_ID_LEN); 4195 wdev->u.mesh.id_up_len = 4196 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 4197 memcpy(wdev->u.mesh.id, 4198 nla_data(info->attrs[NL80211_ATTR_MESH_ID]), 4199 wdev->u.mesh.id_up_len); 4200 } 4201 4202 if (info->attrs[NL80211_ATTR_4ADDR]) { 4203 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); 4204 change = true; 4205 err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype); 4206 if (err) 4207 return err; 4208 } else { 4209 params.use_4addr = -1; 4210 } 4211 4212 err = nl80211_parse_mon_options(rdev, ntype, info, ¶ms); 4213 if (err < 0) 4214 return err; 4215 if (err > 0) 4216 change = true; 4217 4218 if (change) 4219 err = cfg80211_change_iface(rdev, dev, ntype, ¶ms); 4220 else 4221 err = 0; 4222 4223 if (!err && params.use_4addr != -1) 4224 dev->ieee80211_ptr->use_4addr = params.use_4addr; 4225 4226 if (change && !err) { 4227 struct wireless_dev *wdev = dev->ieee80211_ptr; 4228 4229 nl80211_notify_iface(rdev, wdev, NL80211_CMD_SET_INTERFACE); 4230 } 4231 4232 return err; 4233 } 4234 4235 static int _nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) 4236 { 4237 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4238 struct vif_params params; 4239 struct wireless_dev *wdev; 4240 struct sk_buff *msg; 4241 int err; 4242 enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED; 4243 4244 memset(¶ms, 0, sizeof(params)); 4245 4246 if (!info->attrs[NL80211_ATTR_IFNAME]) 4247 return -EINVAL; 4248 4249 if (info->attrs[NL80211_ATTR_IFTYPE]) 4250 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); 4251 4252 if (!rdev->ops->add_virtual_intf) 4253 return -EOPNOTSUPP; 4254 4255 if ((type == NL80211_IFTYPE_P2P_DEVICE || type == NL80211_IFTYPE_NAN || 4256 rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) && 4257 info->attrs[NL80211_ATTR_MAC]) { 4258 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], 4259 ETH_ALEN); 4260 if (!is_valid_ether_addr(params.macaddr)) 4261 return -EADDRNOTAVAIL; 4262 } 4263 4264 if (info->attrs[NL80211_ATTR_4ADDR]) { 4265 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); 4266 err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type); 4267 if (err) 4268 return err; 4269 } 4270 4271 if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0)) 4272 return -EOPNOTSUPP; 4273 4274 err = nl80211_parse_mon_options(rdev, type, info, ¶ms); 4275 if (err < 0) 4276 return err; 4277 4278 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 4279 if (!msg) 4280 return -ENOMEM; 4281 4282 wdev = rdev_add_virtual_intf(rdev, 4283 nla_data(info->attrs[NL80211_ATTR_IFNAME]), 4284 NET_NAME_USER, type, ¶ms); 4285 if (WARN_ON(!wdev)) { 4286 nlmsg_free(msg); 4287 return -EPROTO; 4288 } else if (IS_ERR(wdev)) { 4289 nlmsg_free(msg); 4290 return PTR_ERR(wdev); 4291 } 4292 4293 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 4294 wdev->owner_nlportid = info->snd_portid; 4295 4296 switch (type) { 4297 case NL80211_IFTYPE_MESH_POINT: 4298 if (!info->attrs[NL80211_ATTR_MESH_ID]) 4299 break; 4300 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN != 4301 IEEE80211_MAX_MESH_ID_LEN); 4302 wdev->u.mesh.id_up_len = 4303 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 4304 memcpy(wdev->u.mesh.id, 4305 nla_data(info->attrs[NL80211_ATTR_MESH_ID]), 4306 wdev->u.mesh.id_up_len); 4307 break; 4308 case NL80211_IFTYPE_NAN: 4309 case NL80211_IFTYPE_P2P_DEVICE: 4310 /* 4311 * P2P Device and NAN do not have a netdev, so don't go 4312 * through the netdev notifier and must be added here 4313 */ 4314 cfg80211_init_wdev(wdev); 4315 cfg80211_register_wdev(rdev, wdev); 4316 break; 4317 default: 4318 break; 4319 } 4320 4321 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, 4322 rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) { 4323 nlmsg_free(msg); 4324 return -ENOBUFS; 4325 } 4326 4327 return genlmsg_reply(msg, info); 4328 } 4329 4330 static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) 4331 { 4332 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4333 int ret; 4334 4335 /* to avoid failing a new interface creation due to pending removal */ 4336 cfg80211_destroy_ifaces(rdev); 4337 4338 wiphy_lock(&rdev->wiphy); 4339 ret = _nl80211_new_interface(skb, info); 4340 wiphy_unlock(&rdev->wiphy); 4341 4342 return ret; 4343 } 4344 4345 static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info) 4346 { 4347 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4348 struct wireless_dev *wdev = info->user_ptr[1]; 4349 4350 if (!rdev->ops->del_virtual_intf) 4351 return -EOPNOTSUPP; 4352 4353 /* 4354 * We hold RTNL, so this is safe, without RTNL opencount cannot 4355 * reach 0, and thus the rdev cannot be deleted. 4356 * 4357 * We need to do it for the dev_close(), since that will call 4358 * the netdev notifiers, and we need to acquire the mutex there 4359 * but don't know if we get there from here or from some other 4360 * place (e.g. "ip link set ... down"). 4361 */ 4362 mutex_unlock(&rdev->wiphy.mtx); 4363 4364 /* 4365 * If we remove a wireless device without a netdev then clear 4366 * user_ptr[1] so that nl80211_post_doit won't dereference it 4367 * to check if it needs to do dev_put(). Otherwise it crashes 4368 * since the wdev has been freed, unlike with a netdev where 4369 * we need the dev_put() for the netdev to really be freed. 4370 */ 4371 if (!wdev->netdev) 4372 info->user_ptr[1] = NULL; 4373 else 4374 dev_close(wdev->netdev); 4375 4376 mutex_lock(&rdev->wiphy.mtx); 4377 4378 return cfg80211_remove_virtual_intf(rdev, wdev); 4379 } 4380 4381 static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info) 4382 { 4383 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4384 struct net_device *dev = info->user_ptr[1]; 4385 u16 noack_map; 4386 4387 if (!info->attrs[NL80211_ATTR_NOACK_MAP]) 4388 return -EINVAL; 4389 4390 if (!rdev->ops->set_noack_map) 4391 return -EOPNOTSUPP; 4392 4393 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]); 4394 4395 return rdev_set_noack_map(rdev, dev, noack_map); 4396 } 4397 4398 static int nl80211_validate_key_link_id(struct genl_info *info, 4399 struct wireless_dev *wdev, 4400 int link_id, bool pairwise) 4401 { 4402 if (pairwise) { 4403 if (link_id != -1) { 4404 GENL_SET_ERR_MSG(info, 4405 "link ID not allowed for pairwise key"); 4406 return -EINVAL; 4407 } 4408 4409 return 0; 4410 } 4411 4412 if (wdev->valid_links) { 4413 if (link_id == -1) { 4414 GENL_SET_ERR_MSG(info, 4415 "link ID must for MLO group key"); 4416 return -EINVAL; 4417 } 4418 if (!(wdev->valid_links & BIT(link_id))) { 4419 GENL_SET_ERR_MSG(info, "invalid link ID for MLO group key"); 4420 return -EINVAL; 4421 } 4422 } else if (link_id != -1) { 4423 GENL_SET_ERR_MSG(info, "link ID not allowed for non-MLO group key"); 4424 return -EINVAL; 4425 } 4426 4427 return 0; 4428 } 4429 4430 struct get_key_cookie { 4431 struct sk_buff *msg; 4432 int error; 4433 int idx; 4434 }; 4435 4436 static void get_key_callback(void *c, struct key_params *params) 4437 { 4438 struct nlattr *key; 4439 struct get_key_cookie *cookie = c; 4440 4441 if ((params->key && 4442 nla_put(cookie->msg, NL80211_ATTR_KEY_DATA, 4443 params->key_len, params->key)) || 4444 (params->seq && 4445 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ, 4446 params->seq_len, params->seq)) || 4447 (params->cipher && 4448 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER, 4449 params->cipher))) 4450 goto nla_put_failure; 4451 4452 key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY); 4453 if (!key) 4454 goto nla_put_failure; 4455 4456 if ((params->key && 4457 nla_put(cookie->msg, NL80211_KEY_DATA, 4458 params->key_len, params->key)) || 4459 (params->seq && 4460 nla_put(cookie->msg, NL80211_KEY_SEQ, 4461 params->seq_len, params->seq)) || 4462 (params->cipher && 4463 nla_put_u32(cookie->msg, NL80211_KEY_CIPHER, 4464 params->cipher))) 4465 goto nla_put_failure; 4466 4467 if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx)) 4468 goto nla_put_failure; 4469 4470 nla_nest_end(cookie->msg, key); 4471 4472 return; 4473 nla_put_failure: 4474 cookie->error = 1; 4475 } 4476 4477 static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) 4478 { 4479 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4480 int err; 4481 struct net_device *dev = info->user_ptr[1]; 4482 u8 key_idx = 0; 4483 const u8 *mac_addr = NULL; 4484 bool pairwise; 4485 struct get_key_cookie cookie = { 4486 .error = 0, 4487 }; 4488 void *hdr; 4489 struct sk_buff *msg; 4490 bool bigtk_support = false; 4491 int link_id = nl80211_link_id_or_invalid(info->attrs); 4492 struct wireless_dev *wdev = dev->ieee80211_ptr; 4493 4494 if (wiphy_ext_feature_isset(&rdev->wiphy, 4495 NL80211_EXT_FEATURE_BEACON_PROTECTION)) 4496 bigtk_support = true; 4497 4498 if ((wdev->iftype == NL80211_IFTYPE_STATION || 4499 wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) && 4500 wiphy_ext_feature_isset(&rdev->wiphy, 4501 NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT)) 4502 bigtk_support = true; 4503 4504 if (info->attrs[NL80211_ATTR_KEY_IDX]) { 4505 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); 4506 4507 if (key_idx >= 6 && key_idx <= 7 && !bigtk_support) { 4508 GENL_SET_ERR_MSG(info, "BIGTK not supported"); 4509 return -EINVAL; 4510 } 4511 } 4512 4513 if (info->attrs[NL80211_ATTR_MAC]) 4514 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 4515 4516 pairwise = !!mac_addr; 4517 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { 4518 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); 4519 4520 if (kt != NL80211_KEYTYPE_GROUP && 4521 kt != NL80211_KEYTYPE_PAIRWISE) 4522 return -EINVAL; 4523 pairwise = kt == NL80211_KEYTYPE_PAIRWISE; 4524 } 4525 4526 if (!rdev->ops->get_key) 4527 return -EOPNOTSUPP; 4528 4529 if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) 4530 return -ENOENT; 4531 4532 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 4533 if (!msg) 4534 return -ENOMEM; 4535 4536 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 4537 NL80211_CMD_NEW_KEY); 4538 if (!hdr) 4539 goto nla_put_failure; 4540 4541 cookie.msg = msg; 4542 cookie.idx = key_idx; 4543 4544 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 4545 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_idx)) 4546 goto nla_put_failure; 4547 if (mac_addr && 4548 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr)) 4549 goto nla_put_failure; 4550 4551 err = nl80211_validate_key_link_id(info, wdev, link_id, pairwise); 4552 if (err) 4553 goto free_msg; 4554 4555 err = rdev_get_key(rdev, dev, link_id, key_idx, pairwise, mac_addr, 4556 &cookie, get_key_callback); 4557 4558 if (err) 4559 goto free_msg; 4560 4561 if (cookie.error) 4562 goto nla_put_failure; 4563 4564 genlmsg_end(msg, hdr); 4565 return genlmsg_reply(msg, info); 4566 4567 nla_put_failure: 4568 err = -ENOBUFS; 4569 free_msg: 4570 nlmsg_free(msg); 4571 return err; 4572 } 4573 4574 static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info) 4575 { 4576 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4577 struct key_parse key; 4578 int err; 4579 struct net_device *dev = info->user_ptr[1]; 4580 int link_id = nl80211_link_id_or_invalid(info->attrs); 4581 struct wireless_dev *wdev = dev->ieee80211_ptr; 4582 4583 err = nl80211_parse_key(info, &key); 4584 if (err) 4585 return err; 4586 4587 if (key.idx < 0) 4588 return -EINVAL; 4589 4590 /* Only support setting default key and 4591 * Extended Key ID action NL80211_KEY_SET_TX. 4592 */ 4593 if (!key.def && !key.defmgmt && !key.defbeacon && 4594 !(key.p.mode == NL80211_KEY_SET_TX)) 4595 return -EINVAL; 4596 4597 if (key.def) { 4598 if (!rdev->ops->set_default_key) 4599 return -EOPNOTSUPP; 4600 4601 err = nl80211_key_allowed(wdev); 4602 if (err) 4603 return err; 4604 4605 err = nl80211_validate_key_link_id(info, wdev, link_id, false); 4606 if (err) 4607 return err; 4608 4609 err = rdev_set_default_key(rdev, dev, link_id, key.idx, 4610 key.def_uni, key.def_multi); 4611 4612 if (err) 4613 return err; 4614 4615 #ifdef CONFIG_CFG80211_WEXT 4616 wdev->wext.default_key = key.idx; 4617 #endif 4618 return 0; 4619 } else if (key.defmgmt) { 4620 if (key.def_uni || !key.def_multi) 4621 return -EINVAL; 4622 4623 if (!rdev->ops->set_default_mgmt_key) 4624 return -EOPNOTSUPP; 4625 4626 err = nl80211_key_allowed(wdev); 4627 if (err) 4628 return err; 4629 4630 err = nl80211_validate_key_link_id(info, wdev, link_id, false); 4631 if (err) 4632 return err; 4633 4634 err = rdev_set_default_mgmt_key(rdev, dev, link_id, key.idx); 4635 if (err) 4636 return err; 4637 4638 #ifdef CONFIG_CFG80211_WEXT 4639 wdev->wext.default_mgmt_key = key.idx; 4640 #endif 4641 return 0; 4642 } else if (key.defbeacon) { 4643 if (key.def_uni || !key.def_multi) 4644 return -EINVAL; 4645 4646 if (!rdev->ops->set_default_beacon_key) 4647 return -EOPNOTSUPP; 4648 4649 err = nl80211_key_allowed(wdev); 4650 if (err) 4651 return err; 4652 4653 err = nl80211_validate_key_link_id(info, wdev, link_id, false); 4654 if (err) 4655 return err; 4656 4657 return rdev_set_default_beacon_key(rdev, dev, link_id, key.idx); 4658 } else if (key.p.mode == NL80211_KEY_SET_TX && 4659 wiphy_ext_feature_isset(&rdev->wiphy, 4660 NL80211_EXT_FEATURE_EXT_KEY_ID)) { 4661 u8 *mac_addr = NULL; 4662 4663 if (info->attrs[NL80211_ATTR_MAC]) 4664 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 4665 4666 if (!mac_addr || key.idx < 0 || key.idx > 1) 4667 return -EINVAL; 4668 4669 err = nl80211_validate_key_link_id(info, wdev, link_id, true); 4670 if (err) 4671 return err; 4672 4673 return rdev_add_key(rdev, dev, link_id, key.idx, 4674 NL80211_KEYTYPE_PAIRWISE, 4675 mac_addr, &key.p); 4676 } 4677 4678 return -EINVAL; 4679 } 4680 4681 static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info) 4682 { 4683 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4684 int err; 4685 struct net_device *dev = info->user_ptr[1]; 4686 struct key_parse key; 4687 const u8 *mac_addr = NULL; 4688 int link_id = nl80211_link_id_or_invalid(info->attrs); 4689 struct wireless_dev *wdev = dev->ieee80211_ptr; 4690 4691 err = nl80211_parse_key(info, &key); 4692 if (err) 4693 return err; 4694 4695 if (!key.p.key) { 4696 GENL_SET_ERR_MSG(info, "no key"); 4697 return -EINVAL; 4698 } 4699 4700 if (info->attrs[NL80211_ATTR_MAC]) 4701 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 4702 4703 if (key.type == -1) { 4704 if (mac_addr) 4705 key.type = NL80211_KEYTYPE_PAIRWISE; 4706 else 4707 key.type = NL80211_KEYTYPE_GROUP; 4708 } 4709 4710 /* for now */ 4711 if (key.type != NL80211_KEYTYPE_PAIRWISE && 4712 key.type != NL80211_KEYTYPE_GROUP) { 4713 GENL_SET_ERR_MSG(info, "key type not pairwise or group"); 4714 return -EINVAL; 4715 } 4716 4717 if (key.type == NL80211_KEYTYPE_GROUP && 4718 info->attrs[NL80211_ATTR_VLAN_ID]) 4719 key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 4720 4721 if (!rdev->ops->add_key) 4722 return -EOPNOTSUPP; 4723 4724 if (cfg80211_validate_key_settings(rdev, &key.p, key.idx, 4725 key.type == NL80211_KEYTYPE_PAIRWISE, 4726 mac_addr)) { 4727 GENL_SET_ERR_MSG(info, "key setting validation failed"); 4728 return -EINVAL; 4729 } 4730 4731 err = nl80211_key_allowed(wdev); 4732 if (err) 4733 GENL_SET_ERR_MSG(info, "key not allowed"); 4734 4735 if (!err) 4736 err = nl80211_validate_key_link_id(info, wdev, link_id, 4737 key.type == NL80211_KEYTYPE_PAIRWISE); 4738 4739 if (!err) { 4740 err = rdev_add_key(rdev, dev, link_id, key.idx, 4741 key.type == NL80211_KEYTYPE_PAIRWISE, 4742 mac_addr, &key.p); 4743 if (err) 4744 GENL_SET_ERR_MSG(info, "key addition failed"); 4745 } 4746 4747 return err; 4748 } 4749 4750 static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info) 4751 { 4752 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4753 int err; 4754 struct net_device *dev = info->user_ptr[1]; 4755 u8 *mac_addr = NULL; 4756 struct key_parse key; 4757 int link_id = nl80211_link_id_or_invalid(info->attrs); 4758 struct wireless_dev *wdev = dev->ieee80211_ptr; 4759 4760 err = nl80211_parse_key(info, &key); 4761 if (err) 4762 return err; 4763 4764 if (info->attrs[NL80211_ATTR_MAC]) 4765 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 4766 4767 if (key.type == -1) { 4768 if (mac_addr) 4769 key.type = NL80211_KEYTYPE_PAIRWISE; 4770 else 4771 key.type = NL80211_KEYTYPE_GROUP; 4772 } 4773 4774 /* for now */ 4775 if (key.type != NL80211_KEYTYPE_PAIRWISE && 4776 key.type != NL80211_KEYTYPE_GROUP) 4777 return -EINVAL; 4778 4779 if (!cfg80211_valid_key_idx(rdev, key.idx, 4780 key.type == NL80211_KEYTYPE_PAIRWISE)) 4781 return -EINVAL; 4782 4783 if (!rdev->ops->del_key) 4784 return -EOPNOTSUPP; 4785 4786 err = nl80211_key_allowed(wdev); 4787 4788 if (key.type == NL80211_KEYTYPE_GROUP && mac_addr && 4789 !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) 4790 err = -ENOENT; 4791 4792 if (!err) 4793 err = nl80211_validate_key_link_id(info, wdev, link_id, 4794 key.type == NL80211_KEYTYPE_PAIRWISE); 4795 4796 if (!err) 4797 err = rdev_del_key(rdev, dev, link_id, key.idx, 4798 key.type == NL80211_KEYTYPE_PAIRWISE, 4799 mac_addr); 4800 4801 #ifdef CONFIG_CFG80211_WEXT 4802 if (!err) { 4803 if (key.idx == wdev->wext.default_key) 4804 wdev->wext.default_key = -1; 4805 else if (key.idx == wdev->wext.default_mgmt_key) 4806 wdev->wext.default_mgmt_key = -1; 4807 } 4808 #endif 4809 4810 return err; 4811 } 4812 4813 /* This function returns an error or the number of nested attributes */ 4814 static int validate_acl_mac_addrs(struct nlattr *nl_attr) 4815 { 4816 struct nlattr *attr; 4817 int n_entries = 0, tmp; 4818 4819 nla_for_each_nested(attr, nl_attr, tmp) { 4820 if (nla_len(attr) != ETH_ALEN) 4821 return -EINVAL; 4822 4823 n_entries++; 4824 } 4825 4826 return n_entries; 4827 } 4828 4829 /* 4830 * This function parses ACL information and allocates memory for ACL data. 4831 * On successful return, the calling function is responsible to free the 4832 * ACL buffer returned by this function. 4833 */ 4834 static struct cfg80211_acl_data *parse_acl_data(struct wiphy *wiphy, 4835 struct genl_info *info) 4836 { 4837 enum nl80211_acl_policy acl_policy; 4838 struct nlattr *attr; 4839 struct cfg80211_acl_data *acl; 4840 int i = 0, n_entries, tmp; 4841 4842 if (!wiphy->max_acl_mac_addrs) 4843 return ERR_PTR(-EOPNOTSUPP); 4844 4845 if (!info->attrs[NL80211_ATTR_ACL_POLICY]) 4846 return ERR_PTR(-EINVAL); 4847 4848 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]); 4849 if (acl_policy != NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED && 4850 acl_policy != NL80211_ACL_POLICY_DENY_UNLESS_LISTED) 4851 return ERR_PTR(-EINVAL); 4852 4853 if (!info->attrs[NL80211_ATTR_MAC_ADDRS]) 4854 return ERR_PTR(-EINVAL); 4855 4856 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]); 4857 if (n_entries < 0) 4858 return ERR_PTR(n_entries); 4859 4860 if (n_entries > wiphy->max_acl_mac_addrs) 4861 return ERR_PTR(-EOPNOTSUPP); 4862 4863 acl = kzalloc(struct_size(acl, mac_addrs, n_entries), GFP_KERNEL); 4864 if (!acl) 4865 return ERR_PTR(-ENOMEM); 4866 acl->n_acl_entries = n_entries; 4867 4868 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { 4869 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); 4870 i++; 4871 } 4872 acl->acl_policy = acl_policy; 4873 4874 return acl; 4875 } 4876 4877 static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info) 4878 { 4879 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4880 struct net_device *dev = info->user_ptr[1]; 4881 struct cfg80211_acl_data *acl; 4882 int err; 4883 4884 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 4885 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4886 return -EOPNOTSUPP; 4887 4888 if (!dev->ieee80211_ptr->links[0].ap.beacon_interval) 4889 return -EINVAL; 4890 4891 acl = parse_acl_data(&rdev->wiphy, info); 4892 if (IS_ERR(acl)) 4893 return PTR_ERR(acl); 4894 4895 err = rdev_set_mac_acl(rdev, dev, acl); 4896 4897 kfree(acl); 4898 4899 return err; 4900 } 4901 4902 static u32 rateset_to_mask(struct ieee80211_supported_band *sband, 4903 u8 *rates, u8 rates_len) 4904 { 4905 u8 i; 4906 u32 mask = 0; 4907 4908 for (i = 0; i < rates_len; i++) { 4909 int rate = (rates[i] & 0x7f) * 5; 4910 int ridx; 4911 4912 for (ridx = 0; ridx < sband->n_bitrates; ridx++) { 4913 struct ieee80211_rate *srate = 4914 &sband->bitrates[ridx]; 4915 if (rate == srate->bitrate) { 4916 mask |= 1 << ridx; 4917 break; 4918 } 4919 } 4920 if (ridx == sband->n_bitrates) 4921 return 0; /* rate not found */ 4922 } 4923 4924 return mask; 4925 } 4926 4927 static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband, 4928 u8 *rates, u8 rates_len, 4929 u8 mcs[IEEE80211_HT_MCS_MASK_LEN]) 4930 { 4931 u8 i; 4932 4933 memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN); 4934 4935 for (i = 0; i < rates_len; i++) { 4936 int ridx, rbit; 4937 4938 ridx = rates[i] / 8; 4939 rbit = BIT(rates[i] % 8); 4940 4941 /* check validity */ 4942 if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN)) 4943 return false; 4944 4945 /* check availability */ 4946 ridx = array_index_nospec(ridx, IEEE80211_HT_MCS_MASK_LEN); 4947 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) 4948 mcs[ridx] |= rbit; 4949 else 4950 return false; 4951 } 4952 4953 return true; 4954 } 4955 4956 static u16 vht_mcs_map_to_mcs_mask(u8 vht_mcs_map) 4957 { 4958 u16 mcs_mask = 0; 4959 4960 switch (vht_mcs_map) { 4961 case IEEE80211_VHT_MCS_NOT_SUPPORTED: 4962 break; 4963 case IEEE80211_VHT_MCS_SUPPORT_0_7: 4964 mcs_mask = 0x00FF; 4965 break; 4966 case IEEE80211_VHT_MCS_SUPPORT_0_8: 4967 mcs_mask = 0x01FF; 4968 break; 4969 case IEEE80211_VHT_MCS_SUPPORT_0_9: 4970 mcs_mask = 0x03FF; 4971 break; 4972 default: 4973 break; 4974 } 4975 4976 return mcs_mask; 4977 } 4978 4979 static void vht_build_mcs_mask(u16 vht_mcs_map, 4980 u16 vht_mcs_mask[NL80211_VHT_NSS_MAX]) 4981 { 4982 u8 nss; 4983 4984 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) { 4985 vht_mcs_mask[nss] = vht_mcs_map_to_mcs_mask(vht_mcs_map & 0x03); 4986 vht_mcs_map >>= 2; 4987 } 4988 } 4989 4990 static bool vht_set_mcs_mask(struct ieee80211_supported_band *sband, 4991 struct nl80211_txrate_vht *txrate, 4992 u16 mcs[NL80211_VHT_NSS_MAX]) 4993 { 4994 u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 4995 u16 tx_mcs_mask[NL80211_VHT_NSS_MAX] = {}; 4996 u8 i; 4997 4998 if (!sband->vht_cap.vht_supported) 4999 return false; 5000 5001 memset(mcs, 0, sizeof(u16) * NL80211_VHT_NSS_MAX); 5002 5003 /* Build vht_mcs_mask from VHT capabilities */ 5004 vht_build_mcs_mask(tx_mcs_map, tx_mcs_mask); 5005 5006 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 5007 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) 5008 mcs[i] = txrate->mcs[i]; 5009 else 5010 return false; 5011 } 5012 5013 return true; 5014 } 5015 5016 static u16 he_mcs_map_to_mcs_mask(u8 he_mcs_map) 5017 { 5018 switch (he_mcs_map) { 5019 case IEEE80211_HE_MCS_NOT_SUPPORTED: 5020 return 0; 5021 case IEEE80211_HE_MCS_SUPPORT_0_7: 5022 return 0x00FF; 5023 case IEEE80211_HE_MCS_SUPPORT_0_9: 5024 return 0x03FF; 5025 case IEEE80211_HE_MCS_SUPPORT_0_11: 5026 return 0xFFF; 5027 default: 5028 break; 5029 } 5030 return 0; 5031 } 5032 5033 static void he_build_mcs_mask(u16 he_mcs_map, 5034 u16 he_mcs_mask[NL80211_HE_NSS_MAX]) 5035 { 5036 u8 nss; 5037 5038 for (nss = 0; nss < NL80211_HE_NSS_MAX; nss++) { 5039 he_mcs_mask[nss] = he_mcs_map_to_mcs_mask(he_mcs_map & 0x03); 5040 he_mcs_map >>= 2; 5041 } 5042 } 5043 5044 static u16 he_get_txmcsmap(struct genl_info *info, unsigned int link_id, 5045 const struct ieee80211_sta_he_cap *he_cap) 5046 { 5047 struct net_device *dev = info->user_ptr[1]; 5048 struct wireless_dev *wdev = dev->ieee80211_ptr; 5049 struct cfg80211_chan_def *chandef; 5050 __le16 tx_mcs; 5051 5052 chandef = wdev_chandef(wdev, link_id); 5053 if (!chandef) { 5054 /* 5055 * This is probably broken, but we never maintained 5056 * a chandef in these cases, so it always was. 5057 */ 5058 return le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); 5059 } 5060 5061 switch (chandef->width) { 5062 case NL80211_CHAN_WIDTH_80P80: 5063 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80p80; 5064 break; 5065 case NL80211_CHAN_WIDTH_160: 5066 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_160; 5067 break; 5068 default: 5069 tx_mcs = he_cap->he_mcs_nss_supp.tx_mcs_80; 5070 break; 5071 } 5072 5073 return le16_to_cpu(tx_mcs); 5074 } 5075 5076 static bool he_set_mcs_mask(struct genl_info *info, 5077 struct wireless_dev *wdev, 5078 struct ieee80211_supported_band *sband, 5079 struct nl80211_txrate_he *txrate, 5080 u16 mcs[NL80211_HE_NSS_MAX], 5081 unsigned int link_id) 5082 { 5083 const struct ieee80211_sta_he_cap *he_cap; 5084 u16 tx_mcs_mask[NL80211_HE_NSS_MAX] = {}; 5085 u16 tx_mcs_map = 0; 5086 u8 i; 5087 5088 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); 5089 if (!he_cap) 5090 return false; 5091 5092 memset(mcs, 0, sizeof(u16) * NL80211_HE_NSS_MAX); 5093 5094 tx_mcs_map = he_get_txmcsmap(info, link_id, he_cap); 5095 5096 /* Build he_mcs_mask from HE capabilities */ 5097 he_build_mcs_mask(tx_mcs_map, tx_mcs_mask); 5098 5099 for (i = 0; i < NL80211_HE_NSS_MAX; i++) { 5100 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) 5101 mcs[i] = txrate->mcs[i]; 5102 else 5103 return false; 5104 } 5105 5106 return true; 5107 } 5108 5109 static int nl80211_parse_tx_bitrate_mask(struct genl_info *info, 5110 struct nlattr *attrs[], 5111 enum nl80211_attrs attr, 5112 struct cfg80211_bitrate_mask *mask, 5113 struct net_device *dev, 5114 bool default_all_enabled, 5115 unsigned int link_id) 5116 { 5117 struct nlattr *tb[NL80211_TXRATE_MAX + 1]; 5118 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5119 struct wireless_dev *wdev = dev->ieee80211_ptr; 5120 int rem, i; 5121 struct nlattr *tx_rates; 5122 struct ieee80211_supported_band *sband; 5123 u16 vht_tx_mcs_map, he_tx_mcs_map; 5124 5125 memset(mask, 0, sizeof(*mask)); 5126 /* Default to all rates enabled */ 5127 for (i = 0; i < NUM_NL80211_BANDS; i++) { 5128 const struct ieee80211_sta_he_cap *he_cap; 5129 5130 if (!default_all_enabled) 5131 break; 5132 5133 sband = rdev->wiphy.bands[i]; 5134 5135 if (!sband) 5136 continue; 5137 5138 mask->control[i].legacy = (1 << sband->n_bitrates) - 1; 5139 memcpy(mask->control[i].ht_mcs, 5140 sband->ht_cap.mcs.rx_mask, 5141 sizeof(mask->control[i].ht_mcs)); 5142 5143 if (sband->vht_cap.vht_supported) { 5144 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 5145 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs); 5146 } 5147 5148 he_cap = ieee80211_get_he_iftype_cap(sband, wdev->iftype); 5149 if (!he_cap) 5150 continue; 5151 5152 he_tx_mcs_map = he_get_txmcsmap(info, link_id, he_cap); 5153 he_build_mcs_mask(he_tx_mcs_map, mask->control[i].he_mcs); 5154 5155 mask->control[i].he_gi = 0xFF; 5156 mask->control[i].he_ltf = 0xFF; 5157 } 5158 5159 /* if no rates are given set it back to the defaults */ 5160 if (!attrs[attr]) 5161 goto out; 5162 5163 /* The nested attribute uses enum nl80211_band as the index. This maps 5164 * directly to the enum nl80211_band values used in cfg80211. 5165 */ 5166 BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8); 5167 nla_for_each_nested(tx_rates, attrs[attr], rem) { 5168 enum nl80211_band band = nla_type(tx_rates); 5169 int err; 5170 5171 if (band < 0 || band >= NUM_NL80211_BANDS) 5172 return -EINVAL; 5173 sband = rdev->wiphy.bands[band]; 5174 if (sband == NULL) 5175 return -EINVAL; 5176 err = nla_parse_nested_deprecated(tb, NL80211_TXRATE_MAX, 5177 tx_rates, 5178 nl80211_txattr_policy, 5179 info->extack); 5180 if (err) 5181 return err; 5182 if (tb[NL80211_TXRATE_LEGACY]) { 5183 mask->control[band].legacy = rateset_to_mask( 5184 sband, 5185 nla_data(tb[NL80211_TXRATE_LEGACY]), 5186 nla_len(tb[NL80211_TXRATE_LEGACY])); 5187 if ((mask->control[band].legacy == 0) && 5188 nla_len(tb[NL80211_TXRATE_LEGACY])) 5189 return -EINVAL; 5190 } 5191 if (tb[NL80211_TXRATE_HT]) { 5192 if (!ht_rateset_to_mask( 5193 sband, 5194 nla_data(tb[NL80211_TXRATE_HT]), 5195 nla_len(tb[NL80211_TXRATE_HT]), 5196 mask->control[band].ht_mcs)) 5197 return -EINVAL; 5198 } 5199 5200 if (tb[NL80211_TXRATE_VHT]) { 5201 if (!vht_set_mcs_mask( 5202 sband, 5203 nla_data(tb[NL80211_TXRATE_VHT]), 5204 mask->control[band].vht_mcs)) 5205 return -EINVAL; 5206 } 5207 5208 if (tb[NL80211_TXRATE_GI]) { 5209 mask->control[band].gi = 5210 nla_get_u8(tb[NL80211_TXRATE_GI]); 5211 if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI) 5212 return -EINVAL; 5213 } 5214 if (tb[NL80211_TXRATE_HE] && 5215 !he_set_mcs_mask(info, wdev, sband, 5216 nla_data(tb[NL80211_TXRATE_HE]), 5217 mask->control[band].he_mcs, 5218 link_id)) 5219 return -EINVAL; 5220 5221 if (tb[NL80211_TXRATE_HE_GI]) 5222 mask->control[band].he_gi = 5223 nla_get_u8(tb[NL80211_TXRATE_HE_GI]); 5224 if (tb[NL80211_TXRATE_HE_LTF]) 5225 mask->control[band].he_ltf = 5226 nla_get_u8(tb[NL80211_TXRATE_HE_LTF]); 5227 5228 if (mask->control[band].legacy == 0) { 5229 /* don't allow empty legacy rates if HT, VHT or HE 5230 * are not even supported. 5231 */ 5232 if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported || 5233 rdev->wiphy.bands[band]->vht_cap.vht_supported || 5234 ieee80211_get_he_iftype_cap(sband, wdev->iftype))) 5235 return -EINVAL; 5236 5237 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) 5238 if (mask->control[band].ht_mcs[i]) 5239 goto out; 5240 5241 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) 5242 if (mask->control[band].vht_mcs[i]) 5243 goto out; 5244 5245 for (i = 0; i < NL80211_HE_NSS_MAX; i++) 5246 if (mask->control[band].he_mcs[i]) 5247 goto out; 5248 5249 /* legacy and mcs rates may not be both empty */ 5250 return -EINVAL; 5251 } 5252 } 5253 5254 out: 5255 return 0; 5256 } 5257 5258 static int validate_beacon_tx_rate(struct cfg80211_registered_device *rdev, 5259 enum nl80211_band band, 5260 struct cfg80211_bitrate_mask *beacon_rate) 5261 { 5262 u32 count_ht, count_vht, count_he, i; 5263 u32 rate = beacon_rate->control[band].legacy; 5264 5265 /* Allow only one rate */ 5266 if (hweight32(rate) > 1) 5267 return -EINVAL; 5268 5269 count_ht = 0; 5270 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) { 5271 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) { 5272 return -EINVAL; 5273 } else if (beacon_rate->control[band].ht_mcs[i]) { 5274 count_ht++; 5275 if (count_ht > 1) 5276 return -EINVAL; 5277 } 5278 if (count_ht && rate) 5279 return -EINVAL; 5280 } 5281 5282 count_vht = 0; 5283 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 5284 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) { 5285 return -EINVAL; 5286 } else if (beacon_rate->control[band].vht_mcs[i]) { 5287 count_vht++; 5288 if (count_vht > 1) 5289 return -EINVAL; 5290 } 5291 if (count_vht && rate) 5292 return -EINVAL; 5293 } 5294 5295 count_he = 0; 5296 for (i = 0; i < NL80211_HE_NSS_MAX; i++) { 5297 if (hweight16(beacon_rate->control[band].he_mcs[i]) > 1) { 5298 return -EINVAL; 5299 } else if (beacon_rate->control[band].he_mcs[i]) { 5300 count_he++; 5301 if (count_he > 1) 5302 return -EINVAL; 5303 } 5304 if (count_he && rate) 5305 return -EINVAL; 5306 } 5307 5308 if ((count_ht && count_vht && count_he) || 5309 (!rate && !count_ht && !count_vht && !count_he)) 5310 return -EINVAL; 5311 5312 if (rate && 5313 !wiphy_ext_feature_isset(&rdev->wiphy, 5314 NL80211_EXT_FEATURE_BEACON_RATE_LEGACY)) 5315 return -EINVAL; 5316 if (count_ht && 5317 !wiphy_ext_feature_isset(&rdev->wiphy, 5318 NL80211_EXT_FEATURE_BEACON_RATE_HT)) 5319 return -EINVAL; 5320 if (count_vht && 5321 !wiphy_ext_feature_isset(&rdev->wiphy, 5322 NL80211_EXT_FEATURE_BEACON_RATE_VHT)) 5323 return -EINVAL; 5324 if (count_he && 5325 !wiphy_ext_feature_isset(&rdev->wiphy, 5326 NL80211_EXT_FEATURE_BEACON_RATE_HE)) 5327 return -EINVAL; 5328 5329 return 0; 5330 } 5331 5332 static int nl80211_parse_mbssid_config(struct wiphy *wiphy, 5333 struct net_device *dev, 5334 struct nlattr *attrs, 5335 struct cfg80211_mbssid_config *config, 5336 u8 num_elems) 5337 { 5338 struct nlattr *tb[NL80211_MBSSID_CONFIG_ATTR_MAX + 1]; 5339 5340 if (!wiphy->mbssid_max_interfaces) 5341 return -EOPNOTSUPP; 5342 5343 if (nla_parse_nested(tb, NL80211_MBSSID_CONFIG_ATTR_MAX, attrs, NULL, 5344 NULL) || 5345 !tb[NL80211_MBSSID_CONFIG_ATTR_INDEX]) 5346 return -EINVAL; 5347 5348 config->ema = nla_get_flag(tb[NL80211_MBSSID_CONFIG_ATTR_EMA]); 5349 if (config->ema) { 5350 if (!wiphy->ema_max_profile_periodicity) 5351 return -EOPNOTSUPP; 5352 5353 if (num_elems > wiphy->ema_max_profile_periodicity) 5354 return -EINVAL; 5355 } 5356 5357 config->index = nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_INDEX]); 5358 if (config->index >= wiphy->mbssid_max_interfaces || 5359 (!config->index && !num_elems)) 5360 return -EINVAL; 5361 5362 if (tb[NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX]) { 5363 u32 tx_ifindex = 5364 nla_get_u32(tb[NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX]); 5365 5366 if ((!config->index && tx_ifindex != dev->ifindex) || 5367 (config->index && tx_ifindex == dev->ifindex)) 5368 return -EINVAL; 5369 5370 if (tx_ifindex != dev->ifindex) { 5371 struct net_device *tx_netdev = 5372 dev_get_by_index(wiphy_net(wiphy), tx_ifindex); 5373 5374 if (!tx_netdev || !tx_netdev->ieee80211_ptr || 5375 tx_netdev->ieee80211_ptr->wiphy != wiphy || 5376 tx_netdev->ieee80211_ptr->iftype != 5377 NL80211_IFTYPE_AP) { 5378 dev_put(tx_netdev); 5379 return -EINVAL; 5380 } 5381 5382 config->tx_wdev = tx_netdev->ieee80211_ptr; 5383 } else { 5384 config->tx_wdev = dev->ieee80211_ptr; 5385 } 5386 } else if (!config->index) { 5387 config->tx_wdev = dev->ieee80211_ptr; 5388 } else { 5389 return -EINVAL; 5390 } 5391 5392 return 0; 5393 } 5394 5395 static struct cfg80211_mbssid_elems * 5396 nl80211_parse_mbssid_elems(struct wiphy *wiphy, struct nlattr *attrs) 5397 { 5398 struct nlattr *nl_elems; 5399 struct cfg80211_mbssid_elems *elems; 5400 int rem_elems; 5401 u8 i = 0, num_elems = 0; 5402 5403 if (!wiphy->mbssid_max_interfaces) 5404 return ERR_PTR(-EINVAL); 5405 5406 nla_for_each_nested(nl_elems, attrs, rem_elems) { 5407 if (num_elems >= 255) 5408 return ERR_PTR(-EINVAL); 5409 num_elems++; 5410 } 5411 5412 elems = kzalloc(struct_size(elems, elem, num_elems), GFP_KERNEL); 5413 if (!elems) 5414 return ERR_PTR(-ENOMEM); 5415 elems->cnt = num_elems; 5416 5417 nla_for_each_nested(nl_elems, attrs, rem_elems) { 5418 elems->elem[i].data = nla_data(nl_elems); 5419 elems->elem[i].len = nla_len(nl_elems); 5420 i++; 5421 } 5422 return elems; 5423 } 5424 5425 static struct cfg80211_rnr_elems * 5426 nl80211_parse_rnr_elems(struct wiphy *wiphy, struct nlattr *attrs, 5427 struct netlink_ext_ack *extack) 5428 { 5429 struct nlattr *nl_elems; 5430 struct cfg80211_rnr_elems *elems; 5431 int rem_elems; 5432 u8 i = 0, num_elems = 0; 5433 5434 nla_for_each_nested(nl_elems, attrs, rem_elems) { 5435 int ret; 5436 5437 ret = validate_ie_attr(nl_elems, extack); 5438 if (ret) 5439 return ERR_PTR(ret); 5440 5441 num_elems++; 5442 } 5443 5444 elems = kzalloc(struct_size(elems, elem, num_elems), GFP_KERNEL); 5445 if (!elems) 5446 return ERR_PTR(-ENOMEM); 5447 elems->cnt = num_elems; 5448 5449 nla_for_each_nested(nl_elems, attrs, rem_elems) { 5450 elems->elem[i].data = nla_data(nl_elems); 5451 elems->elem[i].len = nla_len(nl_elems); 5452 i++; 5453 } 5454 return elems; 5455 } 5456 5457 static int nl80211_parse_he_bss_color(struct nlattr *attrs, 5458 struct cfg80211_he_bss_color *he_bss_color) 5459 { 5460 struct nlattr *tb[NL80211_HE_BSS_COLOR_ATTR_MAX + 1]; 5461 int err; 5462 5463 err = nla_parse_nested(tb, NL80211_HE_BSS_COLOR_ATTR_MAX, attrs, 5464 he_bss_color_policy, NULL); 5465 if (err) 5466 return err; 5467 5468 if (!tb[NL80211_HE_BSS_COLOR_ATTR_COLOR]) 5469 return -EINVAL; 5470 5471 he_bss_color->color = 5472 nla_get_u8(tb[NL80211_HE_BSS_COLOR_ATTR_COLOR]); 5473 he_bss_color->enabled = 5474 !nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_DISABLED]); 5475 he_bss_color->partial = 5476 nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_PARTIAL]); 5477 5478 return 0; 5479 } 5480 5481 static int nl80211_parse_beacon(struct cfg80211_registered_device *rdev, 5482 struct nlattr *attrs[], 5483 struct cfg80211_beacon_data *bcn, 5484 struct netlink_ext_ack *extack) 5485 { 5486 bool haveinfo = false; 5487 int err; 5488 5489 memset(bcn, 0, sizeof(*bcn)); 5490 5491 bcn->link_id = nl80211_link_id(attrs); 5492 5493 if (attrs[NL80211_ATTR_BEACON_HEAD]) { 5494 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); 5495 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); 5496 if (!bcn->head_len) 5497 return -EINVAL; 5498 haveinfo = true; 5499 } 5500 5501 if (attrs[NL80211_ATTR_BEACON_TAIL]) { 5502 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]); 5503 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]); 5504 haveinfo = true; 5505 } 5506 5507 if (!haveinfo) 5508 return -EINVAL; 5509 5510 if (attrs[NL80211_ATTR_IE]) { 5511 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]); 5512 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]); 5513 } 5514 5515 if (attrs[NL80211_ATTR_IE_PROBE_RESP]) { 5516 bcn->proberesp_ies = 5517 nla_data(attrs[NL80211_ATTR_IE_PROBE_RESP]); 5518 bcn->proberesp_ies_len = 5519 nla_len(attrs[NL80211_ATTR_IE_PROBE_RESP]); 5520 } 5521 5522 if (attrs[NL80211_ATTR_IE_ASSOC_RESP]) { 5523 bcn->assocresp_ies = 5524 nla_data(attrs[NL80211_ATTR_IE_ASSOC_RESP]); 5525 bcn->assocresp_ies_len = 5526 nla_len(attrs[NL80211_ATTR_IE_ASSOC_RESP]); 5527 } 5528 5529 if (attrs[NL80211_ATTR_PROBE_RESP]) { 5530 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]); 5531 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]); 5532 } 5533 5534 if (attrs[NL80211_ATTR_FTM_RESPONDER]) { 5535 struct nlattr *tb[NL80211_FTM_RESP_ATTR_MAX + 1]; 5536 5537 err = nla_parse_nested_deprecated(tb, 5538 NL80211_FTM_RESP_ATTR_MAX, 5539 attrs[NL80211_ATTR_FTM_RESPONDER], 5540 NULL, NULL); 5541 if (err) 5542 return err; 5543 5544 if (tb[NL80211_FTM_RESP_ATTR_ENABLED] && 5545 wiphy_ext_feature_isset(&rdev->wiphy, 5546 NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER)) 5547 bcn->ftm_responder = 1; 5548 else 5549 return -EOPNOTSUPP; 5550 5551 if (tb[NL80211_FTM_RESP_ATTR_LCI]) { 5552 bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]); 5553 bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]); 5554 } 5555 5556 if (tb[NL80211_FTM_RESP_ATTR_CIVICLOC]) { 5557 bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); 5558 bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); 5559 } 5560 } else { 5561 bcn->ftm_responder = -1; 5562 } 5563 5564 if (attrs[NL80211_ATTR_HE_BSS_COLOR]) { 5565 err = nl80211_parse_he_bss_color(attrs[NL80211_ATTR_HE_BSS_COLOR], 5566 &bcn->he_bss_color); 5567 if (err) 5568 return err; 5569 bcn->he_bss_color_valid = true; 5570 } 5571 5572 if (attrs[NL80211_ATTR_MBSSID_ELEMS]) { 5573 struct cfg80211_mbssid_elems *mbssid = 5574 nl80211_parse_mbssid_elems(&rdev->wiphy, 5575 attrs[NL80211_ATTR_MBSSID_ELEMS]); 5576 5577 if (IS_ERR(mbssid)) 5578 return PTR_ERR(mbssid); 5579 5580 bcn->mbssid_ies = mbssid; 5581 5582 if (bcn->mbssid_ies && attrs[NL80211_ATTR_EMA_RNR_ELEMS]) { 5583 struct cfg80211_rnr_elems *rnr = 5584 nl80211_parse_rnr_elems(&rdev->wiphy, 5585 attrs[NL80211_ATTR_EMA_RNR_ELEMS], 5586 extack); 5587 5588 if (IS_ERR(rnr)) 5589 return PTR_ERR(rnr); 5590 5591 if (rnr && rnr->cnt < bcn->mbssid_ies->cnt) 5592 return -EINVAL; 5593 5594 bcn->rnr_ies = rnr; 5595 } 5596 } 5597 5598 return 0; 5599 } 5600 5601 static int nl80211_parse_he_obss_pd(struct nlattr *attrs, 5602 struct ieee80211_he_obss_pd *he_obss_pd) 5603 { 5604 struct nlattr *tb[NL80211_HE_OBSS_PD_ATTR_MAX + 1]; 5605 int err; 5606 5607 err = nla_parse_nested(tb, NL80211_HE_OBSS_PD_ATTR_MAX, attrs, 5608 he_obss_pd_policy, NULL); 5609 if (err) 5610 return err; 5611 5612 if (!tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]) 5613 return -EINVAL; 5614 5615 he_obss_pd->sr_ctrl = nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_SR_CTRL]); 5616 5617 if (tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET]) 5618 he_obss_pd->min_offset = 5619 nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET]); 5620 if (tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]) 5621 he_obss_pd->max_offset = 5622 nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]); 5623 if (tb[NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET]) 5624 he_obss_pd->non_srg_max_offset = 5625 nla_get_u8(tb[NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET]); 5626 5627 if (he_obss_pd->min_offset > he_obss_pd->max_offset) 5628 return -EINVAL; 5629 5630 if (tb[NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP]) 5631 memcpy(he_obss_pd->bss_color_bitmap, 5632 nla_data(tb[NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP]), 5633 sizeof(he_obss_pd->bss_color_bitmap)); 5634 5635 if (tb[NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP]) 5636 memcpy(he_obss_pd->partial_bssid_bitmap, 5637 nla_data(tb[NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP]), 5638 sizeof(he_obss_pd->partial_bssid_bitmap)); 5639 5640 he_obss_pd->enable = true; 5641 5642 return 0; 5643 } 5644 5645 static int nl80211_parse_fils_discovery(struct cfg80211_registered_device *rdev, 5646 struct nlattr *attrs, 5647 struct cfg80211_fils_discovery *fd) 5648 { 5649 struct nlattr *tb[NL80211_FILS_DISCOVERY_ATTR_MAX + 1]; 5650 int ret; 5651 5652 if (!wiphy_ext_feature_isset(&rdev->wiphy, 5653 NL80211_EXT_FEATURE_FILS_DISCOVERY)) 5654 return -EINVAL; 5655 5656 ret = nla_parse_nested(tb, NL80211_FILS_DISCOVERY_ATTR_MAX, attrs, 5657 NULL, NULL); 5658 if (ret) 5659 return ret; 5660 5661 if (!tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN] && 5662 !tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX] && 5663 !tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]) { 5664 fd->update = true; 5665 return 0; 5666 } 5667 5668 if (!tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN] || 5669 !tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX] || 5670 !tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]) 5671 return -EINVAL; 5672 5673 fd->tmpl_len = nla_len(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); 5674 fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]); 5675 fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]); 5676 fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]); 5677 fd->update = true; 5678 return 0; 5679 } 5680 5681 static int 5682 nl80211_parse_unsol_bcast_probe_resp(struct cfg80211_registered_device *rdev, 5683 struct nlattr *attrs, 5684 struct cfg80211_unsol_bcast_probe_resp *presp) 5685 { 5686 struct nlattr *tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX + 1]; 5687 int ret; 5688 5689 if (!wiphy_ext_feature_isset(&rdev->wiphy, 5690 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP)) 5691 return -EINVAL; 5692 5693 ret = nla_parse_nested(tb, NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX, 5694 attrs, NULL, NULL); 5695 if (ret) 5696 return ret; 5697 5698 if (!tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] && 5699 !tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]) { 5700 presp->update = true; 5701 return 0; 5702 } 5703 5704 if (!tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT] || 5705 !tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]) 5706 return -EINVAL; 5707 5708 presp->tmpl = nla_data(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); 5709 presp->tmpl_len = nla_len(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL]); 5710 presp->interval = nla_get_u32(tb[NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT]); 5711 presp->update = true; 5712 return 0; 5713 } 5714 5715 static void nl80211_check_ap_rate_selectors(struct cfg80211_ap_settings *params, 5716 const struct element *rates) 5717 { 5718 int i; 5719 5720 if (!rates) 5721 return; 5722 5723 for (i = 0; i < rates->datalen; i++) { 5724 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY) 5725 params->ht_required = true; 5726 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY) 5727 params->vht_required = true; 5728 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_HE_PHY) 5729 params->he_required = true; 5730 if (rates->data[i] == BSS_MEMBERSHIP_SELECTOR_SAE_H2E) 5731 params->sae_h2e_required = true; 5732 } 5733 } 5734 5735 /* 5736 * Since the nl80211 API didn't include, from the beginning, attributes about 5737 * HT/VHT requirements/capabilities, we parse them out of the IEs for the 5738 * benefit of drivers that rebuild IEs in the firmware. 5739 */ 5740 static int nl80211_calculate_ap_params(struct cfg80211_ap_settings *params) 5741 { 5742 const struct cfg80211_beacon_data *bcn = ¶ms->beacon; 5743 size_t ies_len = bcn->tail_len; 5744 const u8 *ies = bcn->tail; 5745 const struct element *rates; 5746 const struct element *cap; 5747 5748 rates = cfg80211_find_elem(WLAN_EID_SUPP_RATES, ies, ies_len); 5749 nl80211_check_ap_rate_selectors(params, rates); 5750 5751 rates = cfg80211_find_elem(WLAN_EID_EXT_SUPP_RATES, ies, ies_len); 5752 nl80211_check_ap_rate_selectors(params, rates); 5753 5754 cap = cfg80211_find_elem(WLAN_EID_HT_CAPABILITY, ies, ies_len); 5755 if (cap && cap->datalen >= sizeof(*params->ht_cap)) 5756 params->ht_cap = (void *)cap->data; 5757 cap = cfg80211_find_elem(WLAN_EID_VHT_CAPABILITY, ies, ies_len); 5758 if (cap && cap->datalen >= sizeof(*params->vht_cap)) 5759 params->vht_cap = (void *)cap->data; 5760 cap = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_CAPABILITY, ies, ies_len); 5761 if (cap && cap->datalen >= sizeof(*params->he_cap) + 1) 5762 params->he_cap = (void *)(cap->data + 1); 5763 cap = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION, ies, ies_len); 5764 if (cap && cap->datalen >= sizeof(*params->he_oper) + 1) 5765 params->he_oper = (void *)(cap->data + 1); 5766 cap = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_CAPABILITY, ies, ies_len); 5767 if (cap) { 5768 if (!cap->datalen) 5769 return -EINVAL; 5770 params->eht_cap = (void *)(cap->data + 1); 5771 if (!ieee80211_eht_capa_size_ok((const u8 *)params->he_cap, 5772 (const u8 *)params->eht_cap, 5773 cap->datalen - 1, true)) 5774 return -EINVAL; 5775 } 5776 cap = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_OPERATION, ies, ies_len); 5777 if (cap) { 5778 if (!cap->datalen) 5779 return -EINVAL; 5780 params->eht_oper = (void *)(cap->data + 1); 5781 if (!ieee80211_eht_oper_size_ok((const u8 *)params->eht_oper, 5782 cap->datalen - 1)) 5783 return -EINVAL; 5784 } 5785 return 0; 5786 } 5787 5788 static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev, 5789 struct cfg80211_ap_settings *params) 5790 { 5791 struct wireless_dev *wdev; 5792 5793 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 5794 if (wdev->iftype != NL80211_IFTYPE_AP && 5795 wdev->iftype != NL80211_IFTYPE_P2P_GO) 5796 continue; 5797 5798 if (!wdev->u.ap.preset_chandef.chan) 5799 continue; 5800 5801 params->chandef = wdev->u.ap.preset_chandef; 5802 return true; 5803 } 5804 5805 return false; 5806 } 5807 5808 static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev, 5809 enum nl80211_auth_type auth_type, 5810 enum nl80211_commands cmd) 5811 { 5812 if (auth_type > NL80211_AUTHTYPE_MAX) 5813 return false; 5814 5815 switch (cmd) { 5816 case NL80211_CMD_AUTHENTICATE: 5817 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && 5818 auth_type == NL80211_AUTHTYPE_SAE) 5819 return false; 5820 if (!wiphy_ext_feature_isset(&rdev->wiphy, 5821 NL80211_EXT_FEATURE_FILS_STA) && 5822 (auth_type == NL80211_AUTHTYPE_FILS_SK || 5823 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 5824 auth_type == NL80211_AUTHTYPE_FILS_PK)) 5825 return false; 5826 return true; 5827 case NL80211_CMD_CONNECT: 5828 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && 5829 !wiphy_ext_feature_isset(&rdev->wiphy, 5830 NL80211_EXT_FEATURE_SAE_OFFLOAD) && 5831 auth_type == NL80211_AUTHTYPE_SAE) 5832 return false; 5833 5834 /* FILS with SK PFS or PK not supported yet */ 5835 if (auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 5836 auth_type == NL80211_AUTHTYPE_FILS_PK) 5837 return false; 5838 if (!wiphy_ext_feature_isset( 5839 &rdev->wiphy, 5840 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) && 5841 auth_type == NL80211_AUTHTYPE_FILS_SK) 5842 return false; 5843 return true; 5844 case NL80211_CMD_START_AP: 5845 if (!wiphy_ext_feature_isset(&rdev->wiphy, 5846 NL80211_EXT_FEATURE_SAE_OFFLOAD_AP) && 5847 auth_type == NL80211_AUTHTYPE_SAE) 5848 return false; 5849 /* FILS not supported yet */ 5850 if (auth_type == NL80211_AUTHTYPE_FILS_SK || 5851 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 5852 auth_type == NL80211_AUTHTYPE_FILS_PK) 5853 return false; 5854 return true; 5855 default: 5856 return false; 5857 } 5858 } 5859 5860 static void nl80211_send_ap_started(struct wireless_dev *wdev, 5861 unsigned int link_id) 5862 { 5863 struct wiphy *wiphy = wdev->wiphy; 5864 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 5865 struct sk_buff *msg; 5866 void *hdr; 5867 5868 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 5869 if (!msg) 5870 return; 5871 5872 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_START_AP); 5873 if (!hdr) 5874 goto out; 5875 5876 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 5877 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || 5878 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 5879 NL80211_ATTR_PAD) || 5880 (wdev->u.ap.ssid_len && 5881 nla_put(msg, NL80211_ATTR_SSID, wdev->u.ap.ssid_len, 5882 wdev->u.ap.ssid)) || 5883 (wdev->valid_links && 5884 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))) 5885 goto out; 5886 5887 genlmsg_end(msg, hdr); 5888 5889 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0, 5890 NL80211_MCGRP_MLME, GFP_KERNEL); 5891 return; 5892 out: 5893 nlmsg_free(msg); 5894 } 5895 5896 static int nl80211_validate_ap_phy_operation(struct cfg80211_ap_settings *params) 5897 { 5898 struct ieee80211_channel *channel = params->chandef.chan; 5899 5900 if ((params->he_cap || params->he_oper) && 5901 (channel->flags & IEEE80211_CHAN_NO_HE)) 5902 return -EOPNOTSUPP; 5903 5904 if ((params->eht_cap || params->eht_oper) && 5905 (channel->flags & IEEE80211_CHAN_NO_EHT)) 5906 return -EOPNOTSUPP; 5907 5908 return 0; 5909 } 5910 5911 static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) 5912 { 5913 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5914 unsigned int link_id = nl80211_link_id(info->attrs); 5915 struct net_device *dev = info->user_ptr[1]; 5916 struct wireless_dev *wdev = dev->ieee80211_ptr; 5917 struct cfg80211_ap_settings *params; 5918 int err; 5919 5920 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 5921 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 5922 return -EOPNOTSUPP; 5923 5924 if (!rdev->ops->start_ap) 5925 return -EOPNOTSUPP; 5926 5927 if (wdev->links[link_id].ap.beacon_interval) 5928 return -EALREADY; 5929 5930 /* these are required for START_AP */ 5931 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] || 5932 !info->attrs[NL80211_ATTR_DTIM_PERIOD] || 5933 !info->attrs[NL80211_ATTR_BEACON_HEAD]) 5934 return -EINVAL; 5935 5936 params = kzalloc(sizeof(*params), GFP_KERNEL); 5937 if (!params) 5938 return -ENOMEM; 5939 5940 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms->beacon, 5941 info->extack); 5942 if (err) 5943 goto out; 5944 5945 params->beacon_interval = 5946 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 5947 params->dtim_period = 5948 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 5949 5950 err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype, 5951 params->beacon_interval); 5952 if (err) 5953 goto out; 5954 5955 /* 5956 * In theory, some of these attributes should be required here 5957 * but since they were not used when the command was originally 5958 * added, keep them optional for old user space programs to let 5959 * them continue to work with drivers that do not need the 5960 * additional information -- drivers must check! 5961 */ 5962 if (info->attrs[NL80211_ATTR_SSID]) { 5963 params->ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 5964 params->ssid_len = 5965 nla_len(info->attrs[NL80211_ATTR_SSID]); 5966 if (params->ssid_len == 0) { 5967 err = -EINVAL; 5968 goto out; 5969 } 5970 5971 if (wdev->u.ap.ssid_len && 5972 (wdev->u.ap.ssid_len != params->ssid_len || 5973 memcmp(wdev->u.ap.ssid, params->ssid, params->ssid_len))) { 5974 /* require identical SSID for MLO */ 5975 err = -EINVAL; 5976 goto out; 5977 } 5978 } else if (wdev->valid_links) { 5979 /* require SSID for MLO */ 5980 err = -EINVAL; 5981 goto out; 5982 } 5983 5984 if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) 5985 params->hidden_ssid = nla_get_u32( 5986 info->attrs[NL80211_ATTR_HIDDEN_SSID]); 5987 5988 params->privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 5989 5990 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 5991 params->auth_type = nla_get_u32( 5992 info->attrs[NL80211_ATTR_AUTH_TYPE]); 5993 if (!nl80211_valid_auth_type(rdev, params->auth_type, 5994 NL80211_CMD_START_AP)) { 5995 err = -EINVAL; 5996 goto out; 5997 } 5998 } else 5999 params->auth_type = NL80211_AUTHTYPE_AUTOMATIC; 6000 6001 err = nl80211_crypto_settings(rdev, info, ¶ms->crypto, 6002 NL80211_MAX_NR_CIPHER_SUITES); 6003 if (err) 6004 goto out; 6005 6006 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) { 6007 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) { 6008 err = -EOPNOTSUPP; 6009 goto out; 6010 } 6011 params->inactivity_timeout = nla_get_u16( 6012 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]); 6013 } 6014 6015 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 6016 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 6017 err = -EINVAL; 6018 goto out; 6019 } 6020 params->p2p_ctwindow = 6021 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 6022 if (params->p2p_ctwindow != 0 && 6023 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) { 6024 err = -EINVAL; 6025 goto out; 6026 } 6027 } 6028 6029 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 6030 u8 tmp; 6031 6032 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 6033 err = -EINVAL; 6034 goto out; 6035 } 6036 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 6037 params->p2p_opp_ps = tmp; 6038 if (params->p2p_opp_ps != 0 && 6039 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) { 6040 err = -EINVAL; 6041 goto out; 6042 } 6043 } 6044 6045 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 6046 err = nl80211_parse_chandef(rdev, info, ¶ms->chandef); 6047 if (err) 6048 goto out; 6049 } else if (wdev->valid_links) { 6050 /* with MLD need to specify the channel configuration */ 6051 err = -EINVAL; 6052 goto out; 6053 } else if (wdev->u.ap.preset_chandef.chan) { 6054 params->chandef = wdev->u.ap.preset_chandef; 6055 } else if (!nl80211_get_ap_channel(rdev, params)) { 6056 err = -EINVAL; 6057 goto out; 6058 } 6059 6060 if (info->attrs[NL80211_ATTR_PUNCT_BITMAP]) { 6061 err = nl80211_parse_punct_bitmap(rdev, info, 6062 ¶ms->chandef, 6063 ¶ms->punct_bitmap); 6064 if (err) 6065 goto out; 6066 } 6067 6068 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms->chandef, 6069 wdev->iftype)) { 6070 err = -EINVAL; 6071 goto out; 6072 } 6073 6074 if (info->attrs[NL80211_ATTR_TX_RATES]) { 6075 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, 6076 NL80211_ATTR_TX_RATES, 6077 ¶ms->beacon_rate, 6078 dev, false, link_id); 6079 if (err) 6080 goto out; 6081 6082 err = validate_beacon_tx_rate(rdev, params->chandef.chan->band, 6083 ¶ms->beacon_rate); 6084 if (err) 6085 goto out; 6086 } 6087 6088 if (info->attrs[NL80211_ATTR_SMPS_MODE]) { 6089 params->smps_mode = 6090 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]); 6091 switch (params->smps_mode) { 6092 case NL80211_SMPS_OFF: 6093 break; 6094 case NL80211_SMPS_STATIC: 6095 if (!(rdev->wiphy.features & 6096 NL80211_FEATURE_STATIC_SMPS)) { 6097 err = -EINVAL; 6098 goto out; 6099 } 6100 break; 6101 case NL80211_SMPS_DYNAMIC: 6102 if (!(rdev->wiphy.features & 6103 NL80211_FEATURE_DYNAMIC_SMPS)) { 6104 err = -EINVAL; 6105 goto out; 6106 } 6107 break; 6108 default: 6109 err = -EINVAL; 6110 goto out; 6111 } 6112 } else { 6113 params->smps_mode = NL80211_SMPS_OFF; 6114 } 6115 6116 params->pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); 6117 if (params->pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { 6118 err = -EOPNOTSUPP; 6119 goto out; 6120 } 6121 6122 if (info->attrs[NL80211_ATTR_ACL_POLICY]) { 6123 params->acl = parse_acl_data(&rdev->wiphy, info); 6124 if (IS_ERR(params->acl)) { 6125 err = PTR_ERR(params->acl); 6126 params->acl = NULL; 6127 goto out; 6128 } 6129 } 6130 6131 params->twt_responder = 6132 nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]); 6133 6134 if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) { 6135 err = nl80211_parse_he_obss_pd( 6136 info->attrs[NL80211_ATTR_HE_OBSS_PD], 6137 ¶ms->he_obss_pd); 6138 if (err) 6139 goto out; 6140 } 6141 6142 if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) { 6143 err = nl80211_parse_fils_discovery(rdev, 6144 info->attrs[NL80211_ATTR_FILS_DISCOVERY], 6145 ¶ms->fils_discovery); 6146 if (err) 6147 goto out; 6148 } 6149 6150 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) { 6151 err = nl80211_parse_unsol_bcast_probe_resp( 6152 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP], 6153 ¶ms->unsol_bcast_probe_resp); 6154 if (err) 6155 goto out; 6156 } 6157 6158 if (info->attrs[NL80211_ATTR_MBSSID_CONFIG]) { 6159 err = nl80211_parse_mbssid_config(&rdev->wiphy, dev, 6160 info->attrs[NL80211_ATTR_MBSSID_CONFIG], 6161 ¶ms->mbssid_config, 6162 params->beacon.mbssid_ies ? 6163 params->beacon.mbssid_ies->cnt : 6164 0); 6165 if (err) 6166 goto out; 6167 } 6168 6169 if (!params->mbssid_config.ema && params->beacon.rnr_ies) { 6170 err = -EINVAL; 6171 goto out; 6172 } 6173 6174 err = nl80211_calculate_ap_params(params); 6175 if (err) 6176 goto out; 6177 6178 err = nl80211_validate_ap_phy_operation(params); 6179 if (err) 6180 goto out; 6181 6182 if (info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]) 6183 params->flags = nla_get_u32( 6184 info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]); 6185 else if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT]) 6186 params->flags |= NL80211_AP_SETTINGS_EXTERNAL_AUTH_SUPPORT; 6187 6188 if (wdev->conn_owner_nlportid && 6189 info->attrs[NL80211_ATTR_SOCKET_OWNER] && 6190 wdev->conn_owner_nlportid != info->snd_portid) { 6191 err = -EINVAL; 6192 goto out; 6193 } 6194 6195 /* FIXME: validate MLO/link-id against driver capabilities */ 6196 6197 err = rdev_start_ap(rdev, dev, params); 6198 if (!err) { 6199 wdev->links[link_id].ap.beacon_interval = params->beacon_interval; 6200 wdev->links[link_id].ap.chandef = params->chandef; 6201 wdev->u.ap.ssid_len = params->ssid_len; 6202 memcpy(wdev->u.ap.ssid, params->ssid, 6203 params->ssid_len); 6204 6205 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 6206 wdev->conn_owner_nlportid = info->snd_portid; 6207 6208 nl80211_send_ap_started(wdev, link_id); 6209 } 6210 out: 6211 kfree(params->acl); 6212 kfree(params->beacon.mbssid_ies); 6213 if (params->mbssid_config.tx_wdev && 6214 params->mbssid_config.tx_wdev->netdev && 6215 params->mbssid_config.tx_wdev->netdev != dev) 6216 dev_put(params->mbssid_config.tx_wdev->netdev); 6217 kfree(params->beacon.rnr_ies); 6218 kfree(params); 6219 6220 return err; 6221 } 6222 6223 static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info) 6224 { 6225 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6226 unsigned int link_id = nl80211_link_id(info->attrs); 6227 struct net_device *dev = info->user_ptr[1]; 6228 struct wireless_dev *wdev = dev->ieee80211_ptr; 6229 struct cfg80211_ap_update *params; 6230 struct nlattr *attr; 6231 int err; 6232 6233 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 6234 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 6235 return -EOPNOTSUPP; 6236 6237 if (!rdev->ops->change_beacon) 6238 return -EOPNOTSUPP; 6239 6240 if (!wdev->links[link_id].ap.beacon_interval) 6241 return -EINVAL; 6242 6243 params = kzalloc(sizeof(*params), GFP_KERNEL); 6244 if (!params) 6245 return -ENOMEM; 6246 6247 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms->beacon, 6248 info->extack); 6249 if (err) 6250 goto out; 6251 6252 attr = info->attrs[NL80211_ATTR_FILS_DISCOVERY]; 6253 if (attr) { 6254 err = nl80211_parse_fils_discovery(rdev, attr, 6255 ¶ms->fils_discovery); 6256 if (err) 6257 goto out; 6258 } 6259 6260 attr = info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]; 6261 if (attr) { 6262 err = nl80211_parse_unsol_bcast_probe_resp(rdev, attr, 6263 ¶ms->unsol_bcast_probe_resp); 6264 if (err) 6265 goto out; 6266 } 6267 6268 err = rdev_change_beacon(rdev, dev, params); 6269 6270 out: 6271 kfree(params->beacon.mbssid_ies); 6272 kfree(params->beacon.rnr_ies); 6273 kfree(params); 6274 return err; 6275 } 6276 6277 static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info) 6278 { 6279 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6280 unsigned int link_id = nl80211_link_id(info->attrs); 6281 struct net_device *dev = info->user_ptr[1]; 6282 6283 return cfg80211_stop_ap(rdev, dev, link_id, false); 6284 } 6285 6286 static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = { 6287 [NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG }, 6288 [NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG }, 6289 [NL80211_STA_FLAG_WME] = { .type = NLA_FLAG }, 6290 [NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG }, 6291 [NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG }, 6292 [NL80211_STA_FLAG_TDLS_PEER] = { .type = NLA_FLAG }, 6293 }; 6294 6295 static int parse_station_flags(struct genl_info *info, 6296 enum nl80211_iftype iftype, 6297 struct station_parameters *params) 6298 { 6299 struct nlattr *flags[NL80211_STA_FLAG_MAX + 1]; 6300 struct nlattr *nla; 6301 int flag; 6302 6303 /* 6304 * Try parsing the new attribute first so userspace 6305 * can specify both for older kernels. 6306 */ 6307 nla = info->attrs[NL80211_ATTR_STA_FLAGS2]; 6308 if (nla) { 6309 struct nl80211_sta_flag_update *sta_flags; 6310 6311 sta_flags = nla_data(nla); 6312 params->sta_flags_mask = sta_flags->mask; 6313 params->sta_flags_set = sta_flags->set; 6314 params->sta_flags_set &= params->sta_flags_mask; 6315 if ((params->sta_flags_mask | 6316 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID)) 6317 return -EINVAL; 6318 return 0; 6319 } 6320 6321 /* if present, parse the old attribute */ 6322 6323 nla = info->attrs[NL80211_ATTR_STA_FLAGS]; 6324 if (!nla) 6325 return 0; 6326 6327 if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack)) 6328 return -EINVAL; 6329 6330 /* 6331 * Only allow certain flags for interface types so that 6332 * other attributes are silently ignored. Remember that 6333 * this is backward compatibility code with old userspace 6334 * and shouldn't be hit in other cases anyway. 6335 */ 6336 switch (iftype) { 6337 case NL80211_IFTYPE_AP: 6338 case NL80211_IFTYPE_AP_VLAN: 6339 case NL80211_IFTYPE_P2P_GO: 6340 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 6341 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 6342 BIT(NL80211_STA_FLAG_WME) | 6343 BIT(NL80211_STA_FLAG_MFP); 6344 break; 6345 case NL80211_IFTYPE_P2P_CLIENT: 6346 case NL80211_IFTYPE_STATION: 6347 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 6348 BIT(NL80211_STA_FLAG_TDLS_PEER); 6349 break; 6350 case NL80211_IFTYPE_MESH_POINT: 6351 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | 6352 BIT(NL80211_STA_FLAG_MFP) | 6353 BIT(NL80211_STA_FLAG_AUTHORIZED); 6354 break; 6355 default: 6356 return -EINVAL; 6357 } 6358 6359 for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++) { 6360 if (flags[flag]) { 6361 params->sta_flags_set |= (1<<flag); 6362 6363 /* no longer support new API additions in old API */ 6364 if (flag > NL80211_STA_FLAG_MAX_OLD_API) 6365 return -EINVAL; 6366 } 6367 } 6368 6369 return 0; 6370 } 6371 6372 bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info, int attr) 6373 { 6374 struct nlattr *rate; 6375 u32 bitrate; 6376 u16 bitrate_compat; 6377 enum nl80211_rate_info rate_flg; 6378 6379 rate = nla_nest_start_noflag(msg, attr); 6380 if (!rate) 6381 return false; 6382 6383 /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */ 6384 bitrate = cfg80211_calculate_bitrate(info); 6385 /* report 16-bit bitrate only if we can */ 6386 bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0; 6387 if (bitrate > 0 && 6388 nla_put_u32(msg, NL80211_RATE_INFO_BITRATE32, bitrate)) 6389 return false; 6390 if (bitrate_compat > 0 && 6391 nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat)) 6392 return false; 6393 6394 switch (info->bw) { 6395 case RATE_INFO_BW_1: 6396 rate_flg = NL80211_RATE_INFO_1_MHZ_WIDTH; 6397 break; 6398 case RATE_INFO_BW_2: 6399 rate_flg = NL80211_RATE_INFO_2_MHZ_WIDTH; 6400 break; 6401 case RATE_INFO_BW_4: 6402 rate_flg = NL80211_RATE_INFO_4_MHZ_WIDTH; 6403 break; 6404 case RATE_INFO_BW_5: 6405 rate_flg = NL80211_RATE_INFO_5_MHZ_WIDTH; 6406 break; 6407 case RATE_INFO_BW_8: 6408 rate_flg = NL80211_RATE_INFO_8_MHZ_WIDTH; 6409 break; 6410 case RATE_INFO_BW_10: 6411 rate_flg = NL80211_RATE_INFO_10_MHZ_WIDTH; 6412 break; 6413 case RATE_INFO_BW_16: 6414 rate_flg = NL80211_RATE_INFO_16_MHZ_WIDTH; 6415 break; 6416 default: 6417 WARN_ON(1); 6418 fallthrough; 6419 case RATE_INFO_BW_20: 6420 rate_flg = 0; 6421 break; 6422 case RATE_INFO_BW_40: 6423 rate_flg = NL80211_RATE_INFO_40_MHZ_WIDTH; 6424 break; 6425 case RATE_INFO_BW_80: 6426 rate_flg = NL80211_RATE_INFO_80_MHZ_WIDTH; 6427 break; 6428 case RATE_INFO_BW_160: 6429 rate_flg = NL80211_RATE_INFO_160_MHZ_WIDTH; 6430 break; 6431 case RATE_INFO_BW_HE_RU: 6432 rate_flg = 0; 6433 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS)); 6434 break; 6435 case RATE_INFO_BW_320: 6436 rate_flg = NL80211_RATE_INFO_320_MHZ_WIDTH; 6437 break; 6438 case RATE_INFO_BW_EHT_RU: 6439 rate_flg = 0; 6440 WARN_ON(!(info->flags & RATE_INFO_FLAGS_EHT_MCS)); 6441 break; 6442 } 6443 6444 if (rate_flg && nla_put_flag(msg, rate_flg)) 6445 return false; 6446 6447 if (info->flags & RATE_INFO_FLAGS_MCS) { 6448 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) 6449 return false; 6450 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 6451 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 6452 return false; 6453 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) { 6454 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs)) 6455 return false; 6456 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) 6457 return false; 6458 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 6459 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 6460 return false; 6461 } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) { 6462 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs)) 6463 return false; 6464 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss)) 6465 return false; 6466 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi)) 6467 return false; 6468 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm)) 6469 return false; 6470 if (info->bw == RATE_INFO_BW_HE_RU && 6471 nla_put_u8(msg, NL80211_RATE_INFO_HE_RU_ALLOC, 6472 info->he_ru_alloc)) 6473 return false; 6474 } else if (info->flags & RATE_INFO_FLAGS_S1G_MCS) { 6475 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_MCS, info->mcs)) 6476 return false; 6477 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_NSS, info->nss)) 6478 return false; 6479 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 6480 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 6481 return false; 6482 } else if (info->flags & RATE_INFO_FLAGS_EHT_MCS) { 6483 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_MCS, info->mcs)) 6484 return false; 6485 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_NSS, info->nss)) 6486 return false; 6487 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_GI, info->eht_gi)) 6488 return false; 6489 if (info->bw == RATE_INFO_BW_EHT_RU && 6490 nla_put_u8(msg, NL80211_RATE_INFO_EHT_RU_ALLOC, 6491 info->eht_ru_alloc)) 6492 return false; 6493 } 6494 6495 nla_nest_end(msg, rate); 6496 return true; 6497 } 6498 6499 static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal, 6500 int id) 6501 { 6502 void *attr; 6503 int i = 0; 6504 6505 if (!mask) 6506 return true; 6507 6508 attr = nla_nest_start_noflag(msg, id); 6509 if (!attr) 6510 return false; 6511 6512 for (i = 0; i < IEEE80211_MAX_CHAINS; i++) { 6513 if (!(mask & BIT(i))) 6514 continue; 6515 6516 if (nla_put_u8(msg, i, signal[i])) 6517 return false; 6518 } 6519 6520 nla_nest_end(msg, attr); 6521 6522 return true; 6523 } 6524 6525 static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid, 6526 u32 seq, int flags, 6527 struct cfg80211_registered_device *rdev, 6528 struct net_device *dev, 6529 const u8 *mac_addr, struct station_info *sinfo) 6530 { 6531 void *hdr; 6532 struct nlattr *sinfoattr, *bss_param; 6533 6534 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 6535 if (!hdr) { 6536 cfg80211_sinfo_release_content(sinfo); 6537 return -1; 6538 } 6539 6540 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 6541 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 6542 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation)) 6543 goto nla_put_failure; 6544 6545 sinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_STA_INFO); 6546 if (!sinfoattr) 6547 goto nla_put_failure; 6548 6549 #define PUT_SINFO(attr, memb, type) do { \ 6550 BUILD_BUG_ON(sizeof(type) == sizeof(u64)); \ 6551 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 6552 nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr, \ 6553 sinfo->memb)) \ 6554 goto nla_put_failure; \ 6555 } while (0) 6556 #define PUT_SINFO_U64(attr, memb) do { \ 6557 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 6558 nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr, \ 6559 sinfo->memb, NL80211_STA_INFO_PAD)) \ 6560 goto nla_put_failure; \ 6561 } while (0) 6562 6563 PUT_SINFO(CONNECTED_TIME, connected_time, u32); 6564 PUT_SINFO(INACTIVE_TIME, inactive_time, u32); 6565 PUT_SINFO_U64(ASSOC_AT_BOOTTIME, assoc_at); 6566 6567 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | 6568 BIT_ULL(NL80211_STA_INFO_RX_BYTES64)) && 6569 nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES, 6570 (u32)sinfo->rx_bytes)) 6571 goto nla_put_failure; 6572 6573 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | 6574 BIT_ULL(NL80211_STA_INFO_TX_BYTES64)) && 6575 nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES, 6576 (u32)sinfo->tx_bytes)) 6577 goto nla_put_failure; 6578 6579 PUT_SINFO_U64(RX_BYTES64, rx_bytes); 6580 PUT_SINFO_U64(TX_BYTES64, tx_bytes); 6581 PUT_SINFO(LLID, llid, u16); 6582 PUT_SINFO(PLID, plid, u16); 6583 PUT_SINFO(PLINK_STATE, plink_state, u8); 6584 PUT_SINFO_U64(RX_DURATION, rx_duration); 6585 PUT_SINFO_U64(TX_DURATION, tx_duration); 6586 6587 if (wiphy_ext_feature_isset(&rdev->wiphy, 6588 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 6589 PUT_SINFO(AIRTIME_WEIGHT, airtime_weight, u16); 6590 6591 switch (rdev->wiphy.signal_type) { 6592 case CFG80211_SIGNAL_TYPE_MBM: 6593 PUT_SINFO(SIGNAL, signal, u8); 6594 PUT_SINFO(SIGNAL_AVG, signal_avg, u8); 6595 break; 6596 default: 6597 break; 6598 } 6599 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { 6600 if (!nl80211_put_signal(msg, sinfo->chains, 6601 sinfo->chain_signal, 6602 NL80211_STA_INFO_CHAIN_SIGNAL)) 6603 goto nla_put_failure; 6604 } 6605 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { 6606 if (!nl80211_put_signal(msg, sinfo->chains, 6607 sinfo->chain_signal_avg, 6608 NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) 6609 goto nla_put_failure; 6610 } 6611 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { 6612 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, 6613 NL80211_STA_INFO_TX_BITRATE)) 6614 goto nla_put_failure; 6615 } 6616 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { 6617 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, 6618 NL80211_STA_INFO_RX_BITRATE)) 6619 goto nla_put_failure; 6620 } 6621 6622 PUT_SINFO(RX_PACKETS, rx_packets, u32); 6623 PUT_SINFO(TX_PACKETS, tx_packets, u32); 6624 PUT_SINFO(TX_RETRIES, tx_retries, u32); 6625 PUT_SINFO(TX_FAILED, tx_failed, u32); 6626 PUT_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32); 6627 PUT_SINFO(AIRTIME_LINK_METRIC, airtime_link_metric, u32); 6628 PUT_SINFO(BEACON_LOSS, beacon_loss_count, u32); 6629 PUT_SINFO(LOCAL_PM, local_pm, u32); 6630 PUT_SINFO(PEER_PM, peer_pm, u32); 6631 PUT_SINFO(NONPEER_PM, nonpeer_pm, u32); 6632 PUT_SINFO(CONNECTED_TO_GATE, connected_to_gate, u8); 6633 PUT_SINFO(CONNECTED_TO_AS, connected_to_as, u8); 6634 6635 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { 6636 bss_param = nla_nest_start_noflag(msg, 6637 NL80211_STA_INFO_BSS_PARAM); 6638 if (!bss_param) 6639 goto nla_put_failure; 6640 6641 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) && 6642 nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) || 6643 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) && 6644 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) || 6645 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && 6646 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) || 6647 nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD, 6648 sinfo->bss_param.dtim_period) || 6649 nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL, 6650 sinfo->bss_param.beacon_interval)) 6651 goto nla_put_failure; 6652 6653 nla_nest_end(msg, bss_param); 6654 } 6655 if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) && 6656 nla_put(msg, NL80211_STA_INFO_STA_FLAGS, 6657 sizeof(struct nl80211_sta_flag_update), 6658 &sinfo->sta_flags)) 6659 goto nla_put_failure; 6660 6661 PUT_SINFO_U64(T_OFFSET, t_offset); 6662 PUT_SINFO_U64(RX_DROP_MISC, rx_dropped_misc); 6663 PUT_SINFO_U64(BEACON_RX, rx_beacon); 6664 PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8); 6665 PUT_SINFO(RX_MPDUS, rx_mpdu_count, u32); 6666 PUT_SINFO(FCS_ERROR_COUNT, fcs_err_count, u32); 6667 if (wiphy_ext_feature_isset(&rdev->wiphy, 6668 NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT)) { 6669 PUT_SINFO(ACK_SIGNAL, ack_signal, u8); 6670 PUT_SINFO(ACK_SIGNAL_AVG, avg_ack_signal, s8); 6671 } 6672 6673 #undef PUT_SINFO 6674 #undef PUT_SINFO_U64 6675 6676 if (sinfo->pertid) { 6677 struct nlattr *tidsattr; 6678 int tid; 6679 6680 tidsattr = nla_nest_start_noflag(msg, 6681 NL80211_STA_INFO_TID_STATS); 6682 if (!tidsattr) 6683 goto nla_put_failure; 6684 6685 for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) { 6686 struct cfg80211_tid_stats *tidstats; 6687 struct nlattr *tidattr; 6688 6689 tidstats = &sinfo->pertid[tid]; 6690 6691 if (!tidstats->filled) 6692 continue; 6693 6694 tidattr = nla_nest_start_noflag(msg, tid + 1); 6695 if (!tidattr) 6696 goto nla_put_failure; 6697 6698 #define PUT_TIDVAL_U64(attr, memb) do { \ 6699 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ 6700 nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr, \ 6701 tidstats->memb, NL80211_TID_STATS_PAD)) \ 6702 goto nla_put_failure; \ 6703 } while (0) 6704 6705 PUT_TIDVAL_U64(RX_MSDU, rx_msdu); 6706 PUT_TIDVAL_U64(TX_MSDU, tx_msdu); 6707 PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries); 6708 PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed); 6709 6710 #undef PUT_TIDVAL_U64 6711 if ((tidstats->filled & 6712 BIT(NL80211_TID_STATS_TXQ_STATS)) && 6713 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, 6714 NL80211_TID_STATS_TXQ_STATS)) 6715 goto nla_put_failure; 6716 6717 nla_nest_end(msg, tidattr); 6718 } 6719 6720 nla_nest_end(msg, tidsattr); 6721 } 6722 6723 nla_nest_end(msg, sinfoattr); 6724 6725 if (sinfo->assoc_req_ies_len && 6726 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, 6727 sinfo->assoc_req_ies)) 6728 goto nla_put_failure; 6729 6730 if (sinfo->assoc_resp_ies_len && 6731 nla_put(msg, NL80211_ATTR_RESP_IE, sinfo->assoc_resp_ies_len, 6732 sinfo->assoc_resp_ies)) 6733 goto nla_put_failure; 6734 6735 if (sinfo->mlo_params_valid) { 6736 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, 6737 sinfo->assoc_link_id)) 6738 goto nla_put_failure; 6739 6740 if (!is_zero_ether_addr(sinfo->mld_addr) && 6741 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, 6742 sinfo->mld_addr)) 6743 goto nla_put_failure; 6744 } 6745 6746 cfg80211_sinfo_release_content(sinfo); 6747 genlmsg_end(msg, hdr); 6748 return 0; 6749 6750 nla_put_failure: 6751 cfg80211_sinfo_release_content(sinfo); 6752 genlmsg_cancel(msg, hdr); 6753 return -EMSGSIZE; 6754 } 6755 6756 static int nl80211_dump_station(struct sk_buff *skb, 6757 struct netlink_callback *cb) 6758 { 6759 struct station_info sinfo; 6760 struct cfg80211_registered_device *rdev; 6761 struct wireless_dev *wdev; 6762 u8 mac_addr[ETH_ALEN]; 6763 int sta_idx = cb->args[2]; 6764 int err; 6765 6766 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL); 6767 if (err) 6768 return err; 6769 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 6770 __acquire(&rdev->wiphy.mtx); 6771 6772 if (!wdev->netdev) { 6773 err = -EINVAL; 6774 goto out_err; 6775 } 6776 6777 if (!rdev->ops->dump_station) { 6778 err = -EOPNOTSUPP; 6779 goto out_err; 6780 } 6781 6782 while (1) { 6783 memset(&sinfo, 0, sizeof(sinfo)); 6784 err = rdev_dump_station(rdev, wdev->netdev, sta_idx, 6785 mac_addr, &sinfo); 6786 if (err == -ENOENT) 6787 break; 6788 if (err) 6789 goto out_err; 6790 6791 if (nl80211_send_station(skb, NL80211_CMD_NEW_STATION, 6792 NETLINK_CB(cb->skb).portid, 6793 cb->nlh->nlmsg_seq, NLM_F_MULTI, 6794 rdev, wdev->netdev, mac_addr, 6795 &sinfo) < 0) 6796 goto out; 6797 6798 sta_idx++; 6799 } 6800 6801 out: 6802 cb->args[2] = sta_idx; 6803 err = skb->len; 6804 out_err: 6805 wiphy_unlock(&rdev->wiphy); 6806 6807 return err; 6808 } 6809 6810 static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info) 6811 { 6812 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6813 struct net_device *dev = info->user_ptr[1]; 6814 struct station_info sinfo; 6815 struct sk_buff *msg; 6816 u8 *mac_addr = NULL; 6817 int err; 6818 6819 memset(&sinfo, 0, sizeof(sinfo)); 6820 6821 if (!info->attrs[NL80211_ATTR_MAC]) 6822 return -EINVAL; 6823 6824 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 6825 6826 if (!rdev->ops->get_station) 6827 return -EOPNOTSUPP; 6828 6829 err = rdev_get_station(rdev, dev, mac_addr, &sinfo); 6830 if (err) 6831 return err; 6832 6833 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 6834 if (!msg) { 6835 cfg80211_sinfo_release_content(&sinfo); 6836 return -ENOMEM; 6837 } 6838 6839 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 6840 info->snd_portid, info->snd_seq, 0, 6841 rdev, dev, mac_addr, &sinfo) < 0) { 6842 nlmsg_free(msg); 6843 return -ENOBUFS; 6844 } 6845 6846 return genlmsg_reply(msg, info); 6847 } 6848 6849 int cfg80211_check_station_change(struct wiphy *wiphy, 6850 struct station_parameters *params, 6851 enum cfg80211_station_type statype) 6852 { 6853 if (params->listen_interval != -1 && 6854 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 6855 return -EINVAL; 6856 6857 if (params->support_p2p_ps != -1 && 6858 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 6859 return -EINVAL; 6860 6861 if (params->aid && 6862 !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) && 6863 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 6864 return -EINVAL; 6865 6866 /* When you run into this, adjust the code below for the new flag */ 6867 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7); 6868 6869 switch (statype) { 6870 case CFG80211_STA_MESH_PEER_KERNEL: 6871 case CFG80211_STA_MESH_PEER_USER: 6872 /* 6873 * No ignoring the TDLS flag here -- the userspace mesh 6874 * code doesn't have the bug of including TDLS in the 6875 * mask everywhere. 6876 */ 6877 if (params->sta_flags_mask & 6878 ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) | 6879 BIT(NL80211_STA_FLAG_MFP) | 6880 BIT(NL80211_STA_FLAG_AUTHORIZED))) 6881 return -EINVAL; 6882 break; 6883 case CFG80211_STA_TDLS_PEER_SETUP: 6884 case CFG80211_STA_TDLS_PEER_ACTIVE: 6885 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 6886 return -EINVAL; 6887 /* ignore since it can't change */ 6888 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 6889 break; 6890 default: 6891 /* disallow mesh-specific things */ 6892 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) 6893 return -EINVAL; 6894 if (params->local_pm) 6895 return -EINVAL; 6896 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) 6897 return -EINVAL; 6898 } 6899 6900 if (statype != CFG80211_STA_TDLS_PEER_SETUP && 6901 statype != CFG80211_STA_TDLS_PEER_ACTIVE) { 6902 /* TDLS can't be set, ... */ 6903 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) 6904 return -EINVAL; 6905 /* 6906 * ... but don't bother the driver with it. This works around 6907 * a hostapd/wpa_supplicant issue -- it always includes the 6908 * TLDS_PEER flag in the mask even for AP mode. 6909 */ 6910 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 6911 } 6912 6913 if (statype != CFG80211_STA_TDLS_PEER_SETUP && 6914 statype != CFG80211_STA_AP_CLIENT_UNASSOC) { 6915 /* reject other things that can't change */ 6916 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) 6917 return -EINVAL; 6918 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) 6919 return -EINVAL; 6920 if (params->link_sta_params.supported_rates) 6921 return -EINVAL; 6922 if (params->ext_capab || params->link_sta_params.ht_capa || 6923 params->link_sta_params.vht_capa || 6924 params->link_sta_params.he_capa || 6925 params->link_sta_params.eht_capa) 6926 return -EINVAL; 6927 } 6928 6929 if (statype != CFG80211_STA_AP_CLIENT && 6930 statype != CFG80211_STA_AP_CLIENT_UNASSOC) { 6931 if (params->vlan) 6932 return -EINVAL; 6933 } 6934 6935 switch (statype) { 6936 case CFG80211_STA_AP_MLME_CLIENT: 6937 /* Use this only for authorizing/unauthorizing a station */ 6938 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) 6939 return -EOPNOTSUPP; 6940 break; 6941 case CFG80211_STA_AP_CLIENT: 6942 case CFG80211_STA_AP_CLIENT_UNASSOC: 6943 /* accept only the listed bits */ 6944 if (params->sta_flags_mask & 6945 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 6946 BIT(NL80211_STA_FLAG_AUTHENTICATED) | 6947 BIT(NL80211_STA_FLAG_ASSOCIATED) | 6948 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 6949 BIT(NL80211_STA_FLAG_WME) | 6950 BIT(NL80211_STA_FLAG_MFP))) 6951 return -EINVAL; 6952 6953 /* but authenticated/associated only if driver handles it */ 6954 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 6955 params->sta_flags_mask & 6956 (BIT(NL80211_STA_FLAG_AUTHENTICATED) | 6957 BIT(NL80211_STA_FLAG_ASSOCIATED))) 6958 return -EINVAL; 6959 break; 6960 case CFG80211_STA_IBSS: 6961 case CFG80211_STA_AP_STA: 6962 /* reject any changes other than AUTHORIZED */ 6963 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) 6964 return -EINVAL; 6965 break; 6966 case CFG80211_STA_TDLS_PEER_SETUP: 6967 /* reject any changes other than AUTHORIZED or WME */ 6968 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 6969 BIT(NL80211_STA_FLAG_WME))) 6970 return -EINVAL; 6971 /* force (at least) rates when authorizing */ 6972 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) && 6973 !params->link_sta_params.supported_rates) 6974 return -EINVAL; 6975 break; 6976 case CFG80211_STA_TDLS_PEER_ACTIVE: 6977 /* reject any changes */ 6978 return -EINVAL; 6979 case CFG80211_STA_MESH_PEER_KERNEL: 6980 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) 6981 return -EINVAL; 6982 break; 6983 case CFG80211_STA_MESH_PEER_USER: 6984 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION && 6985 params->plink_action != NL80211_PLINK_ACTION_BLOCK) 6986 return -EINVAL; 6987 break; 6988 } 6989 6990 /* 6991 * Older kernel versions ignored this attribute entirely, so don't 6992 * reject attempts to update it but mark it as unused instead so the 6993 * driver won't look at the data. 6994 */ 6995 if (statype != CFG80211_STA_AP_CLIENT_UNASSOC && 6996 statype != CFG80211_STA_TDLS_PEER_SETUP) 6997 params->link_sta_params.opmode_notif_used = false; 6998 6999 return 0; 7000 } 7001 EXPORT_SYMBOL(cfg80211_check_station_change); 7002 7003 /* 7004 * Get vlan interface making sure it is running and on the right wiphy. 7005 */ 7006 static struct net_device *get_vlan(struct genl_info *info, 7007 struct cfg80211_registered_device *rdev) 7008 { 7009 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; 7010 struct net_device *v; 7011 int ret; 7012 7013 if (!vlanattr) 7014 return NULL; 7015 7016 v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr)); 7017 if (!v) 7018 return ERR_PTR(-ENODEV); 7019 7020 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { 7021 ret = -EINVAL; 7022 goto error; 7023 } 7024 7025 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && 7026 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 7027 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 7028 ret = -EINVAL; 7029 goto error; 7030 } 7031 7032 if (!netif_running(v)) { 7033 ret = -ENETDOWN; 7034 goto error; 7035 } 7036 7037 return v; 7038 error: 7039 dev_put(v); 7040 return ERR_PTR(ret); 7041 } 7042 7043 static int nl80211_parse_sta_wme(struct genl_info *info, 7044 struct station_parameters *params) 7045 { 7046 struct nlattr *tb[NL80211_STA_WME_MAX + 1]; 7047 struct nlattr *nla; 7048 int err; 7049 7050 /* parse WME attributes if present */ 7051 if (!info->attrs[NL80211_ATTR_STA_WME]) 7052 return 0; 7053 7054 nla = info->attrs[NL80211_ATTR_STA_WME]; 7055 err = nla_parse_nested_deprecated(tb, NL80211_STA_WME_MAX, nla, 7056 nl80211_sta_wme_policy, 7057 info->extack); 7058 if (err) 7059 return err; 7060 7061 if (tb[NL80211_STA_WME_UAPSD_QUEUES]) 7062 params->uapsd_queues = nla_get_u8( 7063 tb[NL80211_STA_WME_UAPSD_QUEUES]); 7064 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) 7065 return -EINVAL; 7066 7067 if (tb[NL80211_STA_WME_MAX_SP]) 7068 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); 7069 7070 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) 7071 return -EINVAL; 7072 7073 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; 7074 7075 return 0; 7076 } 7077 7078 static int nl80211_parse_sta_channel_info(struct genl_info *info, 7079 struct station_parameters *params) 7080 { 7081 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { 7082 params->supported_channels = 7083 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 7084 params->supported_channels_len = 7085 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 7086 /* 7087 * Need to include at least one (first channel, number of 7088 * channels) tuple for each subband (checked in policy), 7089 * and must have proper tuples for the rest of the data as well. 7090 */ 7091 if (params->supported_channels_len % 2) 7092 return -EINVAL; 7093 } 7094 7095 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { 7096 params->supported_oper_classes = 7097 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 7098 params->supported_oper_classes_len = 7099 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 7100 } 7101 return 0; 7102 } 7103 7104 static int nl80211_set_station_tdls(struct genl_info *info, 7105 struct station_parameters *params) 7106 { 7107 int err; 7108 /* Dummy STA entry gets updated once the peer capabilities are known */ 7109 if (info->attrs[NL80211_ATTR_PEER_AID]) 7110 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 7111 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 7112 params->link_sta_params.ht_capa = 7113 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 7114 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 7115 params->link_sta_params.vht_capa = 7116 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 7117 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 7118 params->link_sta_params.he_capa = 7119 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 7120 params->link_sta_params.he_capa_len = 7121 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 7122 7123 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { 7124 params->link_sta_params.eht_capa = 7125 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 7126 params->link_sta_params.eht_capa_len = 7127 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 7128 7129 if (!ieee80211_eht_capa_size_ok((const u8 *)params->link_sta_params.he_capa, 7130 (const u8 *)params->link_sta_params.eht_capa, 7131 params->link_sta_params.eht_capa_len, 7132 false)) 7133 return -EINVAL; 7134 } 7135 } 7136 7137 err = nl80211_parse_sta_channel_info(info, params); 7138 if (err) 7139 return err; 7140 7141 return nl80211_parse_sta_wme(info, params); 7142 } 7143 7144 static int nl80211_parse_sta_txpower_setting(struct genl_info *info, 7145 struct sta_txpwr *txpwr, 7146 bool *txpwr_set) 7147 { 7148 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7149 int idx; 7150 7151 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) { 7152 if (!rdev->ops->set_tx_power || 7153 !wiphy_ext_feature_isset(&rdev->wiphy, 7154 NL80211_EXT_FEATURE_STA_TX_PWR)) 7155 return -EOPNOTSUPP; 7156 7157 idx = NL80211_ATTR_STA_TX_POWER_SETTING; 7158 txpwr->type = nla_get_u8(info->attrs[idx]); 7159 7160 if (txpwr->type == NL80211_TX_POWER_LIMITED) { 7161 idx = NL80211_ATTR_STA_TX_POWER; 7162 7163 if (info->attrs[idx]) 7164 txpwr->power = nla_get_s16(info->attrs[idx]); 7165 else 7166 return -EINVAL; 7167 } 7168 7169 *txpwr_set = true; 7170 } else { 7171 *txpwr_set = false; 7172 } 7173 7174 return 0; 7175 } 7176 7177 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) 7178 { 7179 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7180 struct net_device *dev = info->user_ptr[1]; 7181 struct station_parameters params; 7182 u8 *mac_addr; 7183 int err; 7184 7185 memset(¶ms, 0, sizeof(params)); 7186 7187 if (!rdev->ops->change_station) 7188 return -EOPNOTSUPP; 7189 7190 /* 7191 * AID and listen_interval properties can be set only for unassociated 7192 * station. Include these parameters here and will check them in 7193 * cfg80211_check_station_change(). 7194 */ 7195 if (info->attrs[NL80211_ATTR_STA_AID]) 7196 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 7197 7198 if (info->attrs[NL80211_ATTR_VLAN_ID]) 7199 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 7200 7201 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 7202 params.listen_interval = 7203 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 7204 else 7205 params.listen_interval = -1; 7206 7207 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) 7208 params.support_p2p_ps = 7209 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); 7210 else 7211 params.support_p2p_ps = -1; 7212 7213 if (!info->attrs[NL80211_ATTR_MAC]) 7214 return -EINVAL; 7215 7216 params.link_sta_params.link_id = 7217 nl80211_link_id_or_invalid(info->attrs); 7218 7219 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { 7220 /* If MLD_ADDR attribute is set then this is an MLD station 7221 * and the MLD_ADDR attribute holds the MLD address and the 7222 * MAC attribute holds for the LINK address. 7223 * In that case, the link_id is also expected to be valid. 7224 */ 7225 if (params.link_sta_params.link_id < 0) 7226 return -EINVAL; 7227 7228 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 7229 params.link_sta_params.mld_mac = mac_addr; 7230 params.link_sta_params.link_mac = 7231 nla_data(info->attrs[NL80211_ATTR_MAC]); 7232 if (!is_valid_ether_addr(params.link_sta_params.link_mac)) 7233 return -EINVAL; 7234 } else { 7235 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 7236 } 7237 7238 7239 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 7240 params.link_sta_params.supported_rates = 7241 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 7242 params.link_sta_params.supported_rates_len = 7243 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 7244 } 7245 7246 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 7247 params.capability = 7248 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 7249 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 7250 } 7251 7252 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 7253 params.ext_capab = 7254 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 7255 params.ext_capab_len = 7256 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 7257 } 7258 7259 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) 7260 return -EINVAL; 7261 7262 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) 7263 params.plink_action = 7264 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 7265 7266 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { 7267 params.plink_state = 7268 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); 7269 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) 7270 params.peer_aid = nla_get_u16( 7271 info->attrs[NL80211_ATTR_MESH_PEER_AID]); 7272 params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE; 7273 } 7274 7275 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) 7276 params.local_pm = nla_get_u32( 7277 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); 7278 7279 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 7280 params.link_sta_params.opmode_notif_used = true; 7281 params.link_sta_params.opmode_notif = 7282 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 7283 } 7284 7285 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) 7286 params.link_sta_params.he_6ghz_capa = 7287 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); 7288 7289 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) 7290 params.airtime_weight = 7291 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); 7292 7293 if (params.airtime_weight && 7294 !wiphy_ext_feature_isset(&rdev->wiphy, 7295 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 7296 return -EOPNOTSUPP; 7297 7298 err = nl80211_parse_sta_txpower_setting(info, 7299 ¶ms.link_sta_params.txpwr, 7300 ¶ms.link_sta_params.txpwr_set); 7301 if (err) 7302 return err; 7303 7304 /* Include parameters for TDLS peer (will check later) */ 7305 err = nl80211_set_station_tdls(info, ¶ms); 7306 if (err) 7307 return err; 7308 7309 params.vlan = get_vlan(info, rdev); 7310 if (IS_ERR(params.vlan)) 7311 return PTR_ERR(params.vlan); 7312 7313 switch (dev->ieee80211_ptr->iftype) { 7314 case NL80211_IFTYPE_AP: 7315 case NL80211_IFTYPE_AP_VLAN: 7316 case NL80211_IFTYPE_P2P_GO: 7317 case NL80211_IFTYPE_P2P_CLIENT: 7318 case NL80211_IFTYPE_STATION: 7319 case NL80211_IFTYPE_ADHOC: 7320 case NL80211_IFTYPE_MESH_POINT: 7321 break; 7322 default: 7323 err = -EOPNOTSUPP; 7324 goto out_put_vlan; 7325 } 7326 7327 /* driver will call cfg80211_check_station_change() */ 7328 err = rdev_change_station(rdev, dev, mac_addr, ¶ms); 7329 7330 out_put_vlan: 7331 dev_put(params.vlan); 7332 7333 return err; 7334 } 7335 7336 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info) 7337 { 7338 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7339 int err; 7340 struct net_device *dev = info->user_ptr[1]; 7341 struct wireless_dev *wdev = dev->ieee80211_ptr; 7342 struct station_parameters params; 7343 u8 *mac_addr = NULL; 7344 u32 auth_assoc = BIT(NL80211_STA_FLAG_AUTHENTICATED) | 7345 BIT(NL80211_STA_FLAG_ASSOCIATED); 7346 7347 memset(¶ms, 0, sizeof(params)); 7348 7349 if (!rdev->ops->add_station) 7350 return -EOPNOTSUPP; 7351 7352 if (!info->attrs[NL80211_ATTR_MAC]) 7353 return -EINVAL; 7354 7355 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 7356 return -EINVAL; 7357 7358 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 7359 return -EINVAL; 7360 7361 if (!info->attrs[NL80211_ATTR_STA_AID] && 7362 !info->attrs[NL80211_ATTR_PEER_AID]) 7363 return -EINVAL; 7364 7365 params.link_sta_params.link_id = 7366 nl80211_link_id_or_invalid(info->attrs); 7367 7368 if (info->attrs[NL80211_ATTR_MLD_ADDR]) { 7369 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 7370 params.link_sta_params.mld_mac = mac_addr; 7371 params.link_sta_params.link_mac = 7372 nla_data(info->attrs[NL80211_ATTR_MAC]); 7373 if (!is_valid_ether_addr(params.link_sta_params.link_mac)) 7374 return -EINVAL; 7375 } else { 7376 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 7377 } 7378 7379 params.link_sta_params.supported_rates = 7380 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 7381 params.link_sta_params.supported_rates_len = 7382 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 7383 params.listen_interval = 7384 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 7385 7386 if (info->attrs[NL80211_ATTR_VLAN_ID]) 7387 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 7388 7389 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { 7390 params.support_p2p_ps = 7391 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); 7392 } else { 7393 /* 7394 * if not specified, assume it's supported for P2P GO interface, 7395 * and is NOT supported for AP interface 7396 */ 7397 params.support_p2p_ps = 7398 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO; 7399 } 7400 7401 if (info->attrs[NL80211_ATTR_PEER_AID]) 7402 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 7403 else 7404 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 7405 7406 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 7407 params.capability = 7408 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 7409 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 7410 } 7411 7412 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 7413 params.ext_capab = 7414 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 7415 params.ext_capab_len = 7416 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 7417 } 7418 7419 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 7420 params.link_sta_params.ht_capa = 7421 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 7422 7423 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 7424 params.link_sta_params.vht_capa = 7425 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 7426 7427 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 7428 params.link_sta_params.he_capa = 7429 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 7430 params.link_sta_params.he_capa_len = 7431 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 7432 7433 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { 7434 params.link_sta_params.eht_capa = 7435 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 7436 params.link_sta_params.eht_capa_len = 7437 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 7438 7439 if (!ieee80211_eht_capa_size_ok((const u8 *)params.link_sta_params.he_capa, 7440 (const u8 *)params.link_sta_params.eht_capa, 7441 params.link_sta_params.eht_capa_len, 7442 false)) 7443 return -EINVAL; 7444 } 7445 } 7446 7447 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) 7448 params.link_sta_params.he_6ghz_capa = 7449 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); 7450 7451 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 7452 params.link_sta_params.opmode_notif_used = true; 7453 params.link_sta_params.opmode_notif = 7454 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 7455 } 7456 7457 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) 7458 params.plink_action = 7459 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 7460 7461 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) 7462 params.airtime_weight = 7463 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); 7464 7465 if (params.airtime_weight && 7466 !wiphy_ext_feature_isset(&rdev->wiphy, 7467 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 7468 return -EOPNOTSUPP; 7469 7470 err = nl80211_parse_sta_txpower_setting(info, 7471 ¶ms.link_sta_params.txpwr, 7472 ¶ms.link_sta_params.txpwr_set); 7473 if (err) 7474 return err; 7475 7476 err = nl80211_parse_sta_channel_info(info, ¶ms); 7477 if (err) 7478 return err; 7479 7480 err = nl80211_parse_sta_wme(info, ¶ms); 7481 if (err) 7482 return err; 7483 7484 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) 7485 return -EINVAL; 7486 7487 /* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT 7488 * as userspace might just pass through the capabilities from the IEs 7489 * directly, rather than enforcing this restriction and returning an 7490 * error in this case. 7491 */ 7492 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) { 7493 params.link_sta_params.ht_capa = NULL; 7494 params.link_sta_params.vht_capa = NULL; 7495 7496 /* HE and EHT require WME */ 7497 if (params.link_sta_params.he_capa_len || 7498 params.link_sta_params.he_6ghz_capa || 7499 params.link_sta_params.eht_capa_len) 7500 return -EINVAL; 7501 } 7502 7503 /* Ensure that HT/VHT capabilities are not set for 6 GHz HE STA */ 7504 if (params.link_sta_params.he_6ghz_capa && 7505 (params.link_sta_params.ht_capa || params.link_sta_params.vht_capa)) 7506 return -EINVAL; 7507 7508 /* When you run into this, adjust the code below for the new flag */ 7509 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7); 7510 7511 switch (dev->ieee80211_ptr->iftype) { 7512 case NL80211_IFTYPE_AP: 7513 case NL80211_IFTYPE_AP_VLAN: 7514 case NL80211_IFTYPE_P2P_GO: 7515 /* ignore WME attributes if iface/sta is not capable */ 7516 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || 7517 !(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) 7518 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 7519 7520 /* TDLS peers cannot be added */ 7521 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 7522 info->attrs[NL80211_ATTR_PEER_AID]) 7523 return -EINVAL; 7524 /* but don't bother the driver with it */ 7525 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 7526 7527 /* allow authenticated/associated only if driver handles it */ 7528 if (!(rdev->wiphy.features & 7529 NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 7530 params.sta_flags_mask & auth_assoc) 7531 return -EINVAL; 7532 7533 /* Older userspace, or userspace wanting to be compatible with 7534 * !NL80211_FEATURE_FULL_AP_CLIENT_STATE, will not set the auth 7535 * and assoc flags in the mask, but assumes the station will be 7536 * added as associated anyway since this was the required driver 7537 * behaviour before NL80211_FEATURE_FULL_AP_CLIENT_STATE was 7538 * introduced. 7539 * In order to not bother drivers with this quirk in the API 7540 * set the flags in both the mask and set for new stations in 7541 * this case. 7542 */ 7543 if (!(params.sta_flags_mask & auth_assoc)) { 7544 params.sta_flags_mask |= auth_assoc; 7545 params.sta_flags_set |= auth_assoc; 7546 } 7547 7548 /* must be last in here for error handling */ 7549 params.vlan = get_vlan(info, rdev); 7550 if (IS_ERR(params.vlan)) 7551 return PTR_ERR(params.vlan); 7552 break; 7553 case NL80211_IFTYPE_MESH_POINT: 7554 /* ignore uAPSD data */ 7555 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 7556 7557 /* associated is disallowed */ 7558 if (params.sta_flags_mask & BIT(NL80211_STA_FLAG_ASSOCIATED)) 7559 return -EINVAL; 7560 /* TDLS peers cannot be added */ 7561 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 7562 info->attrs[NL80211_ATTR_PEER_AID]) 7563 return -EINVAL; 7564 break; 7565 case NL80211_IFTYPE_STATION: 7566 case NL80211_IFTYPE_P2P_CLIENT: 7567 /* ignore uAPSD data */ 7568 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 7569 7570 /* these are disallowed */ 7571 if (params.sta_flags_mask & 7572 (BIT(NL80211_STA_FLAG_ASSOCIATED) | 7573 BIT(NL80211_STA_FLAG_AUTHENTICATED))) 7574 return -EINVAL; 7575 /* Only TDLS peers can be added */ 7576 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 7577 return -EINVAL; 7578 /* Can only add if TDLS ... */ 7579 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) 7580 return -EOPNOTSUPP; 7581 /* ... with external setup is supported */ 7582 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) 7583 return -EOPNOTSUPP; 7584 /* 7585 * Older wpa_supplicant versions always mark the TDLS peer 7586 * as authorized, but it shouldn't yet be. 7587 */ 7588 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_AUTHORIZED); 7589 break; 7590 default: 7591 return -EOPNOTSUPP; 7592 } 7593 7594 /* be aware of params.vlan when changing code here */ 7595 7596 if (wdev->valid_links) { 7597 if (params.link_sta_params.link_id < 0) { 7598 err = -EINVAL; 7599 goto out; 7600 } 7601 if (!(wdev->valid_links & BIT(params.link_sta_params.link_id))) { 7602 err = -ENOLINK; 7603 goto out; 7604 } 7605 } else { 7606 if (params.link_sta_params.link_id >= 0) { 7607 err = -EINVAL; 7608 goto out; 7609 } 7610 } 7611 err = rdev_add_station(rdev, dev, mac_addr, ¶ms); 7612 out: 7613 dev_put(params.vlan); 7614 return err; 7615 } 7616 7617 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info) 7618 { 7619 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7620 struct net_device *dev = info->user_ptr[1]; 7621 struct station_del_parameters params; 7622 7623 memset(¶ms, 0, sizeof(params)); 7624 7625 if (info->attrs[NL80211_ATTR_MAC]) 7626 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]); 7627 7628 switch (dev->ieee80211_ptr->iftype) { 7629 case NL80211_IFTYPE_AP: 7630 case NL80211_IFTYPE_AP_VLAN: 7631 case NL80211_IFTYPE_MESH_POINT: 7632 case NL80211_IFTYPE_P2P_GO: 7633 /* always accept these */ 7634 break; 7635 case NL80211_IFTYPE_ADHOC: 7636 /* conditionally accept */ 7637 if (wiphy_ext_feature_isset(&rdev->wiphy, 7638 NL80211_EXT_FEATURE_DEL_IBSS_STA)) 7639 break; 7640 return -EINVAL; 7641 default: 7642 return -EINVAL; 7643 } 7644 7645 if (!rdev->ops->del_station) 7646 return -EOPNOTSUPP; 7647 7648 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) { 7649 params.subtype = 7650 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]); 7651 if (params.subtype != IEEE80211_STYPE_DISASSOC >> 4 && 7652 params.subtype != IEEE80211_STYPE_DEAUTH >> 4) 7653 return -EINVAL; 7654 } else { 7655 /* Default to Deauthentication frame */ 7656 params.subtype = IEEE80211_STYPE_DEAUTH >> 4; 7657 } 7658 7659 if (info->attrs[NL80211_ATTR_REASON_CODE]) { 7660 params.reason_code = 7661 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 7662 if (params.reason_code == 0) 7663 return -EINVAL; /* 0 is reserved */ 7664 } else { 7665 /* Default to reason code 2 */ 7666 params.reason_code = WLAN_REASON_PREV_AUTH_NOT_VALID; 7667 } 7668 7669 return rdev_del_station(rdev, dev, ¶ms); 7670 } 7671 7672 static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq, 7673 int flags, struct net_device *dev, 7674 u8 *dst, u8 *next_hop, 7675 struct mpath_info *pinfo) 7676 { 7677 void *hdr; 7678 struct nlattr *pinfoattr; 7679 7680 hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_MPATH); 7681 if (!hdr) 7682 return -1; 7683 7684 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 7685 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dst) || 7686 nla_put(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop) || 7687 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) 7688 goto nla_put_failure; 7689 7690 pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MPATH_INFO); 7691 if (!pinfoattr) 7692 goto nla_put_failure; 7693 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && 7694 nla_put_u32(msg, NL80211_MPATH_INFO_FRAME_QLEN, 7695 pinfo->frame_qlen)) 7696 goto nla_put_failure; 7697 if (((pinfo->filled & MPATH_INFO_SN) && 7698 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || 7699 ((pinfo->filled & MPATH_INFO_METRIC) && 7700 nla_put_u32(msg, NL80211_MPATH_INFO_METRIC, 7701 pinfo->metric)) || 7702 ((pinfo->filled & MPATH_INFO_EXPTIME) && 7703 nla_put_u32(msg, NL80211_MPATH_INFO_EXPTIME, 7704 pinfo->exptime)) || 7705 ((pinfo->filled & MPATH_INFO_FLAGS) && 7706 nla_put_u8(msg, NL80211_MPATH_INFO_FLAGS, 7707 pinfo->flags)) || 7708 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && 7709 nla_put_u32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT, 7710 pinfo->discovery_timeout)) || 7711 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && 7712 nla_put_u8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES, 7713 pinfo->discovery_retries)) || 7714 ((pinfo->filled & MPATH_INFO_HOP_COUNT) && 7715 nla_put_u8(msg, NL80211_MPATH_INFO_HOP_COUNT, 7716 pinfo->hop_count)) || 7717 ((pinfo->filled & MPATH_INFO_PATH_CHANGE) && 7718 nla_put_u32(msg, NL80211_MPATH_INFO_PATH_CHANGE, 7719 pinfo->path_change_count))) 7720 goto nla_put_failure; 7721 7722 nla_nest_end(msg, pinfoattr); 7723 7724 genlmsg_end(msg, hdr); 7725 return 0; 7726 7727 nla_put_failure: 7728 genlmsg_cancel(msg, hdr); 7729 return -EMSGSIZE; 7730 } 7731 7732 static int nl80211_dump_mpath(struct sk_buff *skb, 7733 struct netlink_callback *cb) 7734 { 7735 struct mpath_info pinfo; 7736 struct cfg80211_registered_device *rdev; 7737 struct wireless_dev *wdev; 7738 u8 dst[ETH_ALEN]; 7739 u8 next_hop[ETH_ALEN]; 7740 int path_idx = cb->args[2]; 7741 int err; 7742 7743 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL); 7744 if (err) 7745 return err; 7746 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 7747 __acquire(&rdev->wiphy.mtx); 7748 7749 if (!rdev->ops->dump_mpath) { 7750 err = -EOPNOTSUPP; 7751 goto out_err; 7752 } 7753 7754 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 7755 err = -EOPNOTSUPP; 7756 goto out_err; 7757 } 7758 7759 while (1) { 7760 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst, 7761 next_hop, &pinfo); 7762 if (err == -ENOENT) 7763 break; 7764 if (err) 7765 goto out_err; 7766 7767 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 7768 cb->nlh->nlmsg_seq, NLM_F_MULTI, 7769 wdev->netdev, dst, next_hop, 7770 &pinfo) < 0) 7771 goto out; 7772 7773 path_idx++; 7774 } 7775 7776 out: 7777 cb->args[2] = path_idx; 7778 err = skb->len; 7779 out_err: 7780 wiphy_unlock(&rdev->wiphy); 7781 return err; 7782 } 7783 7784 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info) 7785 { 7786 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7787 int err; 7788 struct net_device *dev = info->user_ptr[1]; 7789 struct mpath_info pinfo; 7790 struct sk_buff *msg; 7791 u8 *dst = NULL; 7792 u8 next_hop[ETH_ALEN]; 7793 7794 memset(&pinfo, 0, sizeof(pinfo)); 7795 7796 if (!info->attrs[NL80211_ATTR_MAC]) 7797 return -EINVAL; 7798 7799 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 7800 7801 if (!rdev->ops->get_mpath) 7802 return -EOPNOTSUPP; 7803 7804 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 7805 return -EOPNOTSUPP; 7806 7807 err = rdev_get_mpath(rdev, dev, dst, next_hop, &pinfo); 7808 if (err) 7809 return err; 7810 7811 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 7812 if (!msg) 7813 return -ENOMEM; 7814 7815 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 7816 dev, dst, next_hop, &pinfo) < 0) { 7817 nlmsg_free(msg); 7818 return -ENOBUFS; 7819 } 7820 7821 return genlmsg_reply(msg, info); 7822 } 7823 7824 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info) 7825 { 7826 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7827 struct net_device *dev = info->user_ptr[1]; 7828 u8 *dst = NULL; 7829 u8 *next_hop = NULL; 7830 7831 if (!info->attrs[NL80211_ATTR_MAC]) 7832 return -EINVAL; 7833 7834 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 7835 return -EINVAL; 7836 7837 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 7838 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 7839 7840 if (!rdev->ops->change_mpath) 7841 return -EOPNOTSUPP; 7842 7843 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 7844 return -EOPNOTSUPP; 7845 7846 return rdev_change_mpath(rdev, dev, dst, next_hop); 7847 } 7848 7849 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info) 7850 { 7851 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7852 struct net_device *dev = info->user_ptr[1]; 7853 u8 *dst = NULL; 7854 u8 *next_hop = NULL; 7855 7856 if (!info->attrs[NL80211_ATTR_MAC]) 7857 return -EINVAL; 7858 7859 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 7860 return -EINVAL; 7861 7862 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 7863 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 7864 7865 if (!rdev->ops->add_mpath) 7866 return -EOPNOTSUPP; 7867 7868 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 7869 return -EOPNOTSUPP; 7870 7871 return rdev_add_mpath(rdev, dev, dst, next_hop); 7872 } 7873 7874 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info) 7875 { 7876 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7877 struct net_device *dev = info->user_ptr[1]; 7878 u8 *dst = NULL; 7879 7880 if (info->attrs[NL80211_ATTR_MAC]) 7881 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 7882 7883 if (!rdev->ops->del_mpath) 7884 return -EOPNOTSUPP; 7885 7886 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 7887 return -EOPNOTSUPP; 7888 7889 return rdev_del_mpath(rdev, dev, dst); 7890 } 7891 7892 static int nl80211_get_mpp(struct sk_buff *skb, struct genl_info *info) 7893 { 7894 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7895 int err; 7896 struct net_device *dev = info->user_ptr[1]; 7897 struct mpath_info pinfo; 7898 struct sk_buff *msg; 7899 u8 *dst = NULL; 7900 u8 mpp[ETH_ALEN]; 7901 7902 memset(&pinfo, 0, sizeof(pinfo)); 7903 7904 if (!info->attrs[NL80211_ATTR_MAC]) 7905 return -EINVAL; 7906 7907 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 7908 7909 if (!rdev->ops->get_mpp) 7910 return -EOPNOTSUPP; 7911 7912 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 7913 return -EOPNOTSUPP; 7914 7915 err = rdev_get_mpp(rdev, dev, dst, mpp, &pinfo); 7916 if (err) 7917 return err; 7918 7919 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 7920 if (!msg) 7921 return -ENOMEM; 7922 7923 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 7924 dev, dst, mpp, &pinfo) < 0) { 7925 nlmsg_free(msg); 7926 return -ENOBUFS; 7927 } 7928 7929 return genlmsg_reply(msg, info); 7930 } 7931 7932 static int nl80211_dump_mpp(struct sk_buff *skb, 7933 struct netlink_callback *cb) 7934 { 7935 struct mpath_info pinfo; 7936 struct cfg80211_registered_device *rdev; 7937 struct wireless_dev *wdev; 7938 u8 dst[ETH_ALEN]; 7939 u8 mpp[ETH_ALEN]; 7940 int path_idx = cb->args[2]; 7941 int err; 7942 7943 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL); 7944 if (err) 7945 return err; 7946 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 7947 __acquire(&rdev->wiphy.mtx); 7948 7949 if (!rdev->ops->dump_mpp) { 7950 err = -EOPNOTSUPP; 7951 goto out_err; 7952 } 7953 7954 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 7955 err = -EOPNOTSUPP; 7956 goto out_err; 7957 } 7958 7959 while (1) { 7960 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst, 7961 mpp, &pinfo); 7962 if (err == -ENOENT) 7963 break; 7964 if (err) 7965 goto out_err; 7966 7967 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 7968 cb->nlh->nlmsg_seq, NLM_F_MULTI, 7969 wdev->netdev, dst, mpp, 7970 &pinfo) < 0) 7971 goto out; 7972 7973 path_idx++; 7974 } 7975 7976 out: 7977 cb->args[2] = path_idx; 7978 err = skb->len; 7979 out_err: 7980 wiphy_unlock(&rdev->wiphy); 7981 return err; 7982 } 7983 7984 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info) 7985 { 7986 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7987 struct net_device *dev = info->user_ptr[1]; 7988 struct bss_parameters params; 7989 7990 memset(¶ms, 0, sizeof(params)); 7991 params.link_id = nl80211_link_id_or_invalid(info->attrs); 7992 /* default to not changing parameters */ 7993 params.use_cts_prot = -1; 7994 params.use_short_preamble = -1; 7995 params.use_short_slot_time = -1; 7996 params.ap_isolate = -1; 7997 params.ht_opmode = -1; 7998 params.p2p_ctwindow = -1; 7999 params.p2p_opp_ps = -1; 8000 8001 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) 8002 params.use_cts_prot = 8003 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); 8004 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) 8005 params.use_short_preamble = 8006 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); 8007 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) 8008 params.use_short_slot_time = 8009 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); 8010 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 8011 params.basic_rates = 8012 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 8013 params.basic_rates_len = 8014 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 8015 } 8016 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) 8017 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); 8018 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) 8019 params.ht_opmode = 8020 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); 8021 8022 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 8023 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 8024 return -EINVAL; 8025 params.p2p_ctwindow = 8026 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 8027 if (params.p2p_ctwindow != 0 && 8028 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) 8029 return -EINVAL; 8030 } 8031 8032 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 8033 u8 tmp; 8034 8035 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 8036 return -EINVAL; 8037 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 8038 params.p2p_opp_ps = tmp; 8039 if (params.p2p_opp_ps && 8040 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) 8041 return -EINVAL; 8042 } 8043 8044 if (!rdev->ops->change_bss) 8045 return -EOPNOTSUPP; 8046 8047 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 8048 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 8049 return -EOPNOTSUPP; 8050 8051 return rdev_change_bss(rdev, dev, ¶ms); 8052 } 8053 8054 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info) 8055 { 8056 char *data = NULL; 8057 bool is_indoor; 8058 enum nl80211_user_reg_hint_type user_reg_hint_type; 8059 u32 owner_nlportid; 8060 8061 /* 8062 * You should only get this when cfg80211 hasn't yet initialized 8063 * completely when built-in to the kernel right between the time 8064 * window between nl80211_init() and regulatory_init(), if that is 8065 * even possible. 8066 */ 8067 if (unlikely(!rcu_access_pointer(cfg80211_regdomain))) 8068 return -EINPROGRESS; 8069 8070 if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]) 8071 user_reg_hint_type = 8072 nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]); 8073 else 8074 user_reg_hint_type = NL80211_USER_REG_HINT_USER; 8075 8076 switch (user_reg_hint_type) { 8077 case NL80211_USER_REG_HINT_USER: 8078 case NL80211_USER_REG_HINT_CELL_BASE: 8079 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 8080 return -EINVAL; 8081 8082 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 8083 return regulatory_hint_user(data, user_reg_hint_type); 8084 case NL80211_USER_REG_HINT_INDOOR: 8085 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 8086 owner_nlportid = info->snd_portid; 8087 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR]; 8088 } else { 8089 owner_nlportid = 0; 8090 is_indoor = true; 8091 } 8092 8093 return regulatory_hint_indoor(is_indoor, owner_nlportid); 8094 default: 8095 return -EINVAL; 8096 } 8097 } 8098 8099 static int nl80211_reload_regdb(struct sk_buff *skb, struct genl_info *info) 8100 { 8101 return reg_reload_regdb(); 8102 } 8103 8104 static int nl80211_get_mesh_config(struct sk_buff *skb, 8105 struct genl_info *info) 8106 { 8107 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8108 struct net_device *dev = info->user_ptr[1]; 8109 struct wireless_dev *wdev = dev->ieee80211_ptr; 8110 struct mesh_config cur_params; 8111 int err = 0; 8112 void *hdr; 8113 struct nlattr *pinfoattr; 8114 struct sk_buff *msg; 8115 8116 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 8117 return -EOPNOTSUPP; 8118 8119 if (!rdev->ops->get_mesh_config) 8120 return -EOPNOTSUPP; 8121 8122 /* If not connected, get default parameters */ 8123 if (!wdev->u.mesh.id_len) 8124 memcpy(&cur_params, &default_mesh_config, sizeof(cur_params)); 8125 else 8126 err = rdev_get_mesh_config(rdev, dev, &cur_params); 8127 8128 if (err) 8129 return err; 8130 8131 /* Draw up a netlink message to send back */ 8132 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 8133 if (!msg) 8134 return -ENOMEM; 8135 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 8136 NL80211_CMD_GET_MESH_CONFIG); 8137 if (!hdr) 8138 goto out; 8139 pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MESH_CONFIG); 8140 if (!pinfoattr) 8141 goto nla_put_failure; 8142 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 8143 nla_put_u16(msg, NL80211_MESHCONF_RETRY_TIMEOUT, 8144 cur_params.dot11MeshRetryTimeout) || 8145 nla_put_u16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT, 8146 cur_params.dot11MeshConfirmTimeout) || 8147 nla_put_u16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT, 8148 cur_params.dot11MeshHoldingTimeout) || 8149 nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS, 8150 cur_params.dot11MeshMaxPeerLinks) || 8151 nla_put_u8(msg, NL80211_MESHCONF_MAX_RETRIES, 8152 cur_params.dot11MeshMaxRetries) || 8153 nla_put_u8(msg, NL80211_MESHCONF_TTL, 8154 cur_params.dot11MeshTTL) || 8155 nla_put_u8(msg, NL80211_MESHCONF_ELEMENT_TTL, 8156 cur_params.element_ttl) || 8157 nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS, 8158 cur_params.auto_open_plinks) || 8159 nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 8160 cur_params.dot11MeshNbrOffsetMaxNeighbor) || 8161 nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 8162 cur_params.dot11MeshHWMPmaxPREQretries) || 8163 nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME, 8164 cur_params.path_refresh_time) || 8165 nla_put_u16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 8166 cur_params.min_discovery_timeout) || 8167 nla_put_u32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 8168 cur_params.dot11MeshHWMPactivePathTimeout) || 8169 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 8170 cur_params.dot11MeshHWMPpreqMinInterval) || 8171 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 8172 cur_params.dot11MeshHWMPperrMinInterval) || 8173 nla_put_u16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 8174 cur_params.dot11MeshHWMPnetDiameterTraversalTime) || 8175 nla_put_u8(msg, NL80211_MESHCONF_HWMP_ROOTMODE, 8176 cur_params.dot11MeshHWMPRootMode) || 8177 nla_put_u16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL, 8178 cur_params.dot11MeshHWMPRannInterval) || 8179 nla_put_u8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 8180 cur_params.dot11MeshGateAnnouncementProtocol) || 8181 nla_put_u8(msg, NL80211_MESHCONF_FORWARDING, 8182 cur_params.dot11MeshForwarding) || 8183 nla_put_s32(msg, NL80211_MESHCONF_RSSI_THRESHOLD, 8184 cur_params.rssi_threshold) || 8185 nla_put_u32(msg, NL80211_MESHCONF_HT_OPMODE, 8186 cur_params.ht_opmode) || 8187 nla_put_u32(msg, NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 8188 cur_params.dot11MeshHWMPactivePathToRootTimeout) || 8189 nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 8190 cur_params.dot11MeshHWMProotInterval) || 8191 nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 8192 cur_params.dot11MeshHWMPconfirmationInterval) || 8193 nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE, 8194 cur_params.power_mode) || 8195 nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW, 8196 cur_params.dot11MeshAwakeWindowDuration) || 8197 nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT, 8198 cur_params.plink_timeout) || 8199 nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_GATE, 8200 cur_params.dot11MeshConnectedToMeshGate) || 8201 nla_put_u8(msg, NL80211_MESHCONF_NOLEARN, 8202 cur_params.dot11MeshNolearn) || 8203 nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_AS, 8204 cur_params.dot11MeshConnectedToAuthServer)) 8205 goto nla_put_failure; 8206 nla_nest_end(msg, pinfoattr); 8207 genlmsg_end(msg, hdr); 8208 return genlmsg_reply(msg, info); 8209 8210 nla_put_failure: 8211 out: 8212 nlmsg_free(msg); 8213 return -ENOBUFS; 8214 } 8215 8216 static const struct nla_policy 8217 nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = { 8218 [NL80211_MESHCONF_RETRY_TIMEOUT] = 8219 NLA_POLICY_RANGE(NLA_U16, 1, 255), 8220 [NL80211_MESHCONF_CONFIRM_TIMEOUT] = 8221 NLA_POLICY_RANGE(NLA_U16, 1, 255), 8222 [NL80211_MESHCONF_HOLDING_TIMEOUT] = 8223 NLA_POLICY_RANGE(NLA_U16, 1, 255), 8224 [NL80211_MESHCONF_MAX_PEER_LINKS] = 8225 NLA_POLICY_RANGE(NLA_U16, 0, 255), 8226 [NL80211_MESHCONF_MAX_RETRIES] = NLA_POLICY_MAX(NLA_U8, 16), 8227 [NL80211_MESHCONF_TTL] = NLA_POLICY_MIN(NLA_U8, 1), 8228 [NL80211_MESHCONF_ELEMENT_TTL] = NLA_POLICY_MIN(NLA_U8, 1), 8229 [NL80211_MESHCONF_AUTO_OPEN_PLINKS] = NLA_POLICY_MAX(NLA_U8, 1), 8230 [NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] = 8231 NLA_POLICY_RANGE(NLA_U32, 1, 255), 8232 [NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 }, 8233 [NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 }, 8234 [NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = NLA_POLICY_MIN(NLA_U16, 1), 8235 [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 }, 8236 [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = 8237 NLA_POLICY_MIN(NLA_U16, 1), 8238 [NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] = 8239 NLA_POLICY_MIN(NLA_U16, 1), 8240 [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = 8241 NLA_POLICY_MIN(NLA_U16, 1), 8242 [NL80211_MESHCONF_HWMP_ROOTMODE] = NLA_POLICY_MAX(NLA_U8, 4), 8243 [NL80211_MESHCONF_HWMP_RANN_INTERVAL] = 8244 NLA_POLICY_MIN(NLA_U16, 1), 8245 [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = NLA_POLICY_MAX(NLA_U8, 1), 8246 [NL80211_MESHCONF_FORWARDING] = NLA_POLICY_MAX(NLA_U8, 1), 8247 [NL80211_MESHCONF_RSSI_THRESHOLD] = 8248 NLA_POLICY_RANGE(NLA_S32, -255, 0), 8249 [NL80211_MESHCONF_HT_OPMODE] = { .type = NLA_U16 }, 8250 [NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 }, 8251 [NL80211_MESHCONF_HWMP_ROOT_INTERVAL] = 8252 NLA_POLICY_MIN(NLA_U16, 1), 8253 [NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] = 8254 NLA_POLICY_MIN(NLA_U16, 1), 8255 [NL80211_MESHCONF_POWER_MODE] = 8256 NLA_POLICY_RANGE(NLA_U32, 8257 NL80211_MESH_POWER_ACTIVE, 8258 NL80211_MESH_POWER_MAX), 8259 [NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 }, 8260 [NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 }, 8261 [NL80211_MESHCONF_CONNECTED_TO_GATE] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 8262 [NL80211_MESHCONF_NOLEARN] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 8263 [NL80211_MESHCONF_CONNECTED_TO_AS] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 8264 }; 8265 8266 static const struct nla_policy 8267 nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = { 8268 [NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 }, 8269 [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 }, 8270 [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 }, 8271 [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG }, 8272 [NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 }, 8273 [NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG }, 8274 [NL80211_MESH_SETUP_IE] = 8275 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 8276 IEEE80211_MAX_DATA_LEN), 8277 [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG }, 8278 }; 8279 8280 static int nl80211_parse_mesh_config(struct genl_info *info, 8281 struct mesh_config *cfg, 8282 u32 *mask_out) 8283 { 8284 struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1]; 8285 u32 mask = 0; 8286 u16 ht_opmode; 8287 8288 #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, mask, attr, fn) \ 8289 do { \ 8290 if (tb[attr]) { \ 8291 cfg->param = fn(tb[attr]); \ 8292 mask |= BIT((attr) - 1); \ 8293 } \ 8294 } while (0) 8295 8296 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) 8297 return -EINVAL; 8298 if (nla_parse_nested_deprecated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params_policy, info->extack)) 8299 return -EINVAL; 8300 8301 /* This makes sure that there aren't more than 32 mesh config 8302 * parameters (otherwise our bitfield scheme would not work.) */ 8303 BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32); 8304 8305 /* Fill in the params struct */ 8306 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout, mask, 8307 NL80211_MESHCONF_RETRY_TIMEOUT, nla_get_u16); 8308 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout, mask, 8309 NL80211_MESHCONF_CONFIRM_TIMEOUT, 8310 nla_get_u16); 8311 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout, mask, 8312 NL80211_MESHCONF_HOLDING_TIMEOUT, 8313 nla_get_u16); 8314 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks, mask, 8315 NL80211_MESHCONF_MAX_PEER_LINKS, 8316 nla_get_u16); 8317 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries, mask, 8318 NL80211_MESHCONF_MAX_RETRIES, nla_get_u8); 8319 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL, mask, 8320 NL80211_MESHCONF_TTL, nla_get_u8); 8321 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl, mask, 8322 NL80211_MESHCONF_ELEMENT_TTL, nla_get_u8); 8323 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks, mask, 8324 NL80211_MESHCONF_AUTO_OPEN_PLINKS, 8325 nla_get_u8); 8326 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor, 8327 mask, 8328 NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 8329 nla_get_u32); 8330 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries, mask, 8331 NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 8332 nla_get_u8); 8333 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time, mask, 8334 NL80211_MESHCONF_PATH_REFRESH_TIME, 8335 nla_get_u32); 8336 if (mask & BIT(NL80211_MESHCONF_PATH_REFRESH_TIME) && 8337 (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535)) 8338 return -EINVAL; 8339 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout, mask, 8340 NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 8341 nla_get_u16); 8342 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout, 8343 mask, 8344 NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 8345 nla_get_u32); 8346 if (mask & BIT(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT) && 8347 (cfg->dot11MeshHWMPactivePathTimeout < 1 || 8348 cfg->dot11MeshHWMPactivePathTimeout > 65535)) 8349 return -EINVAL; 8350 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval, mask, 8351 NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 8352 nla_get_u16); 8353 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPperrMinInterval, mask, 8354 NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 8355 nla_get_u16); 8356 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 8357 dot11MeshHWMPnetDiameterTraversalTime, mask, 8358 NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 8359 nla_get_u16); 8360 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRootMode, mask, 8361 NL80211_MESHCONF_HWMP_ROOTMODE, nla_get_u8); 8362 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRannInterval, mask, 8363 NL80211_MESHCONF_HWMP_RANN_INTERVAL, 8364 nla_get_u16); 8365 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshGateAnnouncementProtocol, 8366 mask, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 8367 nla_get_u8); 8368 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, mask, 8369 NL80211_MESHCONF_FORWARDING, nla_get_u8); 8370 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, mask, 8371 NL80211_MESHCONF_RSSI_THRESHOLD, 8372 nla_get_s32); 8373 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToMeshGate, mask, 8374 NL80211_MESHCONF_CONNECTED_TO_GATE, 8375 nla_get_u8); 8376 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToAuthServer, mask, 8377 NL80211_MESHCONF_CONNECTED_TO_AS, 8378 nla_get_u8); 8379 /* 8380 * Check HT operation mode based on 8381 * IEEE 802.11-2016 9.4.2.57 HT Operation element. 8382 */ 8383 if (tb[NL80211_MESHCONF_HT_OPMODE]) { 8384 ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]); 8385 8386 if (ht_opmode & ~(IEEE80211_HT_OP_MODE_PROTECTION | 8387 IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT | 8388 IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)) 8389 return -EINVAL; 8390 8391 /* NON_HT_STA bit is reserved, but some programs set it */ 8392 ht_opmode &= ~IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT; 8393 8394 cfg->ht_opmode = ht_opmode; 8395 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); 8396 } 8397 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 8398 dot11MeshHWMPactivePathToRootTimeout, mask, 8399 NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 8400 nla_get_u32); 8401 if (mask & BIT(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT) && 8402 (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 || 8403 cfg->dot11MeshHWMPactivePathToRootTimeout > 65535)) 8404 return -EINVAL; 8405 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMProotInterval, mask, 8406 NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 8407 nla_get_u16); 8408 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPconfirmationInterval, 8409 mask, 8410 NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 8411 nla_get_u16); 8412 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode, mask, 8413 NL80211_MESHCONF_POWER_MODE, nla_get_u32); 8414 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration, mask, 8415 NL80211_MESHCONF_AWAKE_WINDOW, nla_get_u16); 8416 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, plink_timeout, mask, 8417 NL80211_MESHCONF_PLINK_TIMEOUT, nla_get_u32); 8418 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNolearn, mask, 8419 NL80211_MESHCONF_NOLEARN, nla_get_u8); 8420 if (mask_out) 8421 *mask_out = mask; 8422 8423 return 0; 8424 8425 #undef FILL_IN_MESH_PARAM_IF_SET 8426 } 8427 8428 static int nl80211_parse_mesh_setup(struct genl_info *info, 8429 struct mesh_setup *setup) 8430 { 8431 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8432 struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1]; 8433 8434 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) 8435 return -EINVAL; 8436 if (nla_parse_nested_deprecated(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_params_policy, info->extack)) 8437 return -EINVAL; 8438 8439 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC]) 8440 setup->sync_method = 8441 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ? 8442 IEEE80211_SYNC_METHOD_VENDOR : 8443 IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET; 8444 8445 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL]) 8446 setup->path_sel_proto = 8447 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ? 8448 IEEE80211_PATH_PROTOCOL_VENDOR : 8449 IEEE80211_PATH_PROTOCOL_HWMP; 8450 8451 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC]) 8452 setup->path_metric = 8453 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ? 8454 IEEE80211_PATH_METRIC_VENDOR : 8455 IEEE80211_PATH_METRIC_AIRTIME; 8456 8457 if (tb[NL80211_MESH_SETUP_IE]) { 8458 struct nlattr *ieattr = 8459 tb[NL80211_MESH_SETUP_IE]; 8460 setup->ie = nla_data(ieattr); 8461 setup->ie_len = nla_len(ieattr); 8462 } 8463 if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] && 8464 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) 8465 return -EINVAL; 8466 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); 8467 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); 8468 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); 8469 if (setup->is_secure) 8470 setup->user_mpm = true; 8471 8472 if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) { 8473 if (!setup->user_mpm) 8474 return -EINVAL; 8475 setup->auth_id = 8476 nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]); 8477 } 8478 8479 return 0; 8480 } 8481 8482 static int nl80211_update_mesh_config(struct sk_buff *skb, 8483 struct genl_info *info) 8484 { 8485 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8486 struct net_device *dev = info->user_ptr[1]; 8487 struct wireless_dev *wdev = dev->ieee80211_ptr; 8488 struct mesh_config cfg = {}; 8489 u32 mask; 8490 int err; 8491 8492 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 8493 return -EOPNOTSUPP; 8494 8495 if (!rdev->ops->update_mesh_config) 8496 return -EOPNOTSUPP; 8497 8498 err = nl80211_parse_mesh_config(info, &cfg, &mask); 8499 if (err) 8500 return err; 8501 8502 if (!wdev->u.mesh.id_len) 8503 err = -ENOLINK; 8504 8505 if (!err) 8506 err = rdev_update_mesh_config(rdev, dev, mask, &cfg); 8507 8508 return err; 8509 } 8510 8511 static int nl80211_put_regdom(const struct ieee80211_regdomain *regdom, 8512 struct sk_buff *msg) 8513 { 8514 struct nlattr *nl_reg_rules; 8515 unsigned int i; 8516 8517 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || 8518 (regdom->dfs_region && 8519 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) 8520 goto nla_put_failure; 8521 8522 nl_reg_rules = nla_nest_start_noflag(msg, NL80211_ATTR_REG_RULES); 8523 if (!nl_reg_rules) 8524 goto nla_put_failure; 8525 8526 for (i = 0; i < regdom->n_reg_rules; i++) { 8527 struct nlattr *nl_reg_rule; 8528 const struct ieee80211_reg_rule *reg_rule; 8529 const struct ieee80211_freq_range *freq_range; 8530 const struct ieee80211_power_rule *power_rule; 8531 unsigned int max_bandwidth_khz; 8532 8533 reg_rule = ®dom->reg_rules[i]; 8534 freq_range = ®_rule->freq_range; 8535 power_rule = ®_rule->power_rule; 8536 8537 nl_reg_rule = nla_nest_start_noflag(msg, i); 8538 if (!nl_reg_rule) 8539 goto nla_put_failure; 8540 8541 max_bandwidth_khz = freq_range->max_bandwidth_khz; 8542 if (!max_bandwidth_khz) 8543 max_bandwidth_khz = reg_get_max_bandwidth(regdom, 8544 reg_rule); 8545 8546 if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS, 8547 reg_rule->flags) || 8548 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START, 8549 freq_range->start_freq_khz) || 8550 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END, 8551 freq_range->end_freq_khz) || 8552 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW, 8553 max_bandwidth_khz) || 8554 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN, 8555 power_rule->max_antenna_gain) || 8556 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP, 8557 power_rule->max_eirp) || 8558 nla_put_u32(msg, NL80211_ATTR_DFS_CAC_TIME, 8559 reg_rule->dfs_cac_ms)) 8560 goto nla_put_failure; 8561 8562 if ((reg_rule->flags & NL80211_RRF_PSD) && 8563 nla_put_s8(msg, NL80211_ATTR_POWER_RULE_PSD, 8564 reg_rule->psd)) 8565 goto nla_put_failure; 8566 8567 nla_nest_end(msg, nl_reg_rule); 8568 } 8569 8570 nla_nest_end(msg, nl_reg_rules); 8571 return 0; 8572 8573 nla_put_failure: 8574 return -EMSGSIZE; 8575 } 8576 8577 static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info) 8578 { 8579 const struct ieee80211_regdomain *regdom = NULL; 8580 struct cfg80211_registered_device *rdev; 8581 struct wiphy *wiphy = NULL; 8582 struct sk_buff *msg; 8583 int err = -EMSGSIZE; 8584 void *hdr; 8585 8586 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 8587 if (!msg) 8588 return -ENOBUFS; 8589 8590 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 8591 NL80211_CMD_GET_REG); 8592 if (!hdr) 8593 goto put_failure; 8594 8595 rtnl_lock(); 8596 8597 if (info->attrs[NL80211_ATTR_WIPHY]) { 8598 bool self_managed; 8599 8600 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 8601 if (IS_ERR(rdev)) { 8602 err = PTR_ERR(rdev); 8603 goto nla_put_failure; 8604 } 8605 8606 wiphy = &rdev->wiphy; 8607 self_managed = wiphy->regulatory_flags & 8608 REGULATORY_WIPHY_SELF_MANAGED; 8609 8610 rcu_read_lock(); 8611 8612 regdom = get_wiphy_regdom(wiphy); 8613 8614 /* a self-managed-reg device must have a private regdom */ 8615 if (WARN_ON(!regdom && self_managed)) { 8616 err = -EINVAL; 8617 goto nla_put_failure_rcu; 8618 } 8619 8620 if (regdom && 8621 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 8622 goto nla_put_failure_rcu; 8623 } else { 8624 rcu_read_lock(); 8625 } 8626 8627 if (!wiphy && reg_last_request_cell_base() && 8628 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 8629 NL80211_USER_REG_HINT_CELL_BASE)) 8630 goto nla_put_failure_rcu; 8631 8632 if (!regdom) 8633 regdom = rcu_dereference(cfg80211_regdomain); 8634 8635 if (nl80211_put_regdom(regdom, msg)) 8636 goto nla_put_failure_rcu; 8637 8638 rcu_read_unlock(); 8639 8640 genlmsg_end(msg, hdr); 8641 rtnl_unlock(); 8642 return genlmsg_reply(msg, info); 8643 8644 nla_put_failure_rcu: 8645 rcu_read_unlock(); 8646 nla_put_failure: 8647 rtnl_unlock(); 8648 put_failure: 8649 nlmsg_free(msg); 8650 return err; 8651 } 8652 8653 static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb, 8654 u32 seq, int flags, struct wiphy *wiphy, 8655 const struct ieee80211_regdomain *regdom) 8656 { 8657 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 8658 NL80211_CMD_GET_REG); 8659 8660 if (!hdr) 8661 return -1; 8662 8663 genl_dump_check_consistent(cb, hdr); 8664 8665 if (nl80211_put_regdom(regdom, msg)) 8666 goto nla_put_failure; 8667 8668 if (!wiphy && reg_last_request_cell_base() && 8669 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 8670 NL80211_USER_REG_HINT_CELL_BASE)) 8671 goto nla_put_failure; 8672 8673 if (wiphy && 8674 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 8675 goto nla_put_failure; 8676 8677 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 8678 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 8679 goto nla_put_failure; 8680 8681 genlmsg_end(msg, hdr); 8682 return 0; 8683 8684 nla_put_failure: 8685 genlmsg_cancel(msg, hdr); 8686 return -EMSGSIZE; 8687 } 8688 8689 static int nl80211_get_reg_dump(struct sk_buff *skb, 8690 struct netlink_callback *cb) 8691 { 8692 const struct ieee80211_regdomain *regdom = NULL; 8693 struct cfg80211_registered_device *rdev; 8694 int err, reg_idx, start = cb->args[2]; 8695 8696 rcu_read_lock(); 8697 8698 if (cfg80211_regdomain && start == 0) { 8699 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, 8700 NLM_F_MULTI, NULL, 8701 rcu_dereference(cfg80211_regdomain)); 8702 if (err < 0) 8703 goto out_err; 8704 } 8705 8706 /* the global regdom is idx 0 */ 8707 reg_idx = 1; 8708 list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) { 8709 regdom = get_wiphy_regdom(&rdev->wiphy); 8710 if (!regdom) 8711 continue; 8712 8713 if (++reg_idx <= start) 8714 continue; 8715 8716 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, 8717 NLM_F_MULTI, &rdev->wiphy, regdom); 8718 if (err < 0) { 8719 reg_idx--; 8720 break; 8721 } 8722 } 8723 8724 cb->args[2] = reg_idx; 8725 err = skb->len; 8726 out_err: 8727 rcu_read_unlock(); 8728 return err; 8729 } 8730 8731 #ifdef CONFIG_CFG80211_CRDA_SUPPORT 8732 static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = { 8733 [NL80211_ATTR_REG_RULE_FLAGS] = { .type = NLA_U32 }, 8734 [NL80211_ATTR_FREQ_RANGE_START] = { .type = NLA_U32 }, 8735 [NL80211_ATTR_FREQ_RANGE_END] = { .type = NLA_U32 }, 8736 [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 }, 8737 [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 }, 8738 [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 }, 8739 [NL80211_ATTR_DFS_CAC_TIME] = { .type = NLA_U32 }, 8740 }; 8741 8742 static int parse_reg_rule(struct nlattr *tb[], 8743 struct ieee80211_reg_rule *reg_rule) 8744 { 8745 struct ieee80211_freq_range *freq_range = ®_rule->freq_range; 8746 struct ieee80211_power_rule *power_rule = ®_rule->power_rule; 8747 8748 if (!tb[NL80211_ATTR_REG_RULE_FLAGS]) 8749 return -EINVAL; 8750 if (!tb[NL80211_ATTR_FREQ_RANGE_START]) 8751 return -EINVAL; 8752 if (!tb[NL80211_ATTR_FREQ_RANGE_END]) 8753 return -EINVAL; 8754 if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]) 8755 return -EINVAL; 8756 if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]) 8757 return -EINVAL; 8758 8759 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); 8760 8761 freq_range->start_freq_khz = 8762 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]); 8763 freq_range->end_freq_khz = 8764 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]); 8765 freq_range->max_bandwidth_khz = 8766 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]); 8767 8768 power_rule->max_eirp = 8769 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]); 8770 8771 if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]) 8772 power_rule->max_antenna_gain = 8773 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]); 8774 8775 if (tb[NL80211_ATTR_DFS_CAC_TIME]) 8776 reg_rule->dfs_cac_ms = 8777 nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]); 8778 8779 return 0; 8780 } 8781 8782 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info) 8783 { 8784 struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1]; 8785 struct nlattr *nl_reg_rule; 8786 char *alpha2; 8787 int rem_reg_rules, r; 8788 u32 num_rules = 0, rule_idx = 0; 8789 enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET; 8790 struct ieee80211_regdomain *rd; 8791 8792 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 8793 return -EINVAL; 8794 8795 if (!info->attrs[NL80211_ATTR_REG_RULES]) 8796 return -EINVAL; 8797 8798 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 8799 8800 if (info->attrs[NL80211_ATTR_DFS_REGION]) 8801 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); 8802 8803 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 8804 rem_reg_rules) { 8805 num_rules++; 8806 if (num_rules > NL80211_MAX_SUPP_REG_RULES) 8807 return -EINVAL; 8808 } 8809 8810 rtnl_lock(); 8811 if (!reg_is_valid_request(alpha2)) { 8812 r = -EINVAL; 8813 goto out; 8814 } 8815 8816 rd = kzalloc(struct_size(rd, reg_rules, num_rules), GFP_KERNEL); 8817 if (!rd) { 8818 r = -ENOMEM; 8819 goto out; 8820 } 8821 8822 rd->n_reg_rules = num_rules; 8823 rd->alpha2[0] = alpha2[0]; 8824 rd->alpha2[1] = alpha2[1]; 8825 8826 /* 8827 * Disable DFS master mode if the DFS region was 8828 * not supported or known on this kernel. 8829 */ 8830 if (reg_supported_dfs_region(dfs_region)) 8831 rd->dfs_region = dfs_region; 8832 8833 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 8834 rem_reg_rules) { 8835 r = nla_parse_nested_deprecated(tb, NL80211_REG_RULE_ATTR_MAX, 8836 nl_reg_rule, reg_rule_policy, 8837 info->extack); 8838 if (r) 8839 goto bad_reg; 8840 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); 8841 if (r) 8842 goto bad_reg; 8843 8844 rule_idx++; 8845 8846 if (rule_idx > NL80211_MAX_SUPP_REG_RULES) { 8847 r = -EINVAL; 8848 goto bad_reg; 8849 } 8850 } 8851 8852 r = set_regdom(rd, REGD_SOURCE_CRDA); 8853 /* set_regdom takes ownership of rd */ 8854 rd = NULL; 8855 bad_reg: 8856 kfree(rd); 8857 out: 8858 rtnl_unlock(); 8859 return r; 8860 } 8861 #endif /* CONFIG_CFG80211_CRDA_SUPPORT */ 8862 8863 static int validate_scan_freqs(struct nlattr *freqs) 8864 { 8865 struct nlattr *attr1, *attr2; 8866 int n_channels = 0, tmp1, tmp2; 8867 8868 nla_for_each_nested(attr1, freqs, tmp1) 8869 if (nla_len(attr1) != sizeof(u32)) 8870 return 0; 8871 8872 nla_for_each_nested(attr1, freqs, tmp1) { 8873 n_channels++; 8874 /* 8875 * Some hardware has a limited channel list for 8876 * scanning, and it is pretty much nonsensical 8877 * to scan for a channel twice, so disallow that 8878 * and don't require drivers to check that the 8879 * channel list they get isn't longer than what 8880 * they can scan, as long as they can scan all 8881 * the channels they registered at once. 8882 */ 8883 nla_for_each_nested(attr2, freqs, tmp2) 8884 if (attr1 != attr2 && 8885 nla_get_u32(attr1) == nla_get_u32(attr2)) 8886 return 0; 8887 } 8888 8889 return n_channels; 8890 } 8891 8892 static bool is_band_valid(struct wiphy *wiphy, enum nl80211_band b) 8893 { 8894 return b < NUM_NL80211_BANDS && wiphy->bands[b]; 8895 } 8896 8897 static int parse_bss_select(struct nlattr *nla, struct wiphy *wiphy, 8898 struct cfg80211_bss_selection *bss_select) 8899 { 8900 struct nlattr *attr[NL80211_BSS_SELECT_ATTR_MAX + 1]; 8901 struct nlattr *nest; 8902 int err; 8903 bool found = false; 8904 int i; 8905 8906 /* only process one nested attribute */ 8907 nest = nla_data(nla); 8908 if (!nla_ok(nest, nla_len(nest))) 8909 return -EINVAL; 8910 8911 err = nla_parse_nested_deprecated(attr, NL80211_BSS_SELECT_ATTR_MAX, 8912 nest, nl80211_bss_select_policy, 8913 NULL); 8914 if (err) 8915 return err; 8916 8917 /* only one attribute may be given */ 8918 for (i = 0; i <= NL80211_BSS_SELECT_ATTR_MAX; i++) { 8919 if (attr[i]) { 8920 if (found) 8921 return -EINVAL; 8922 found = true; 8923 } 8924 } 8925 8926 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID; 8927 8928 if (attr[NL80211_BSS_SELECT_ATTR_RSSI]) 8929 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI; 8930 8931 if (attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]) { 8932 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF; 8933 bss_select->param.band_pref = 8934 nla_get_u32(attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]); 8935 if (!is_band_valid(wiphy, bss_select->param.band_pref)) 8936 return -EINVAL; 8937 } 8938 8939 if (attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]) { 8940 struct nl80211_bss_select_rssi_adjust *adj_param; 8941 8942 adj_param = nla_data(attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]); 8943 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST; 8944 bss_select->param.adjust.band = adj_param->band; 8945 bss_select->param.adjust.delta = adj_param->delta; 8946 if (!is_band_valid(wiphy, bss_select->param.adjust.band)) 8947 return -EINVAL; 8948 } 8949 8950 /* user-space did not provide behaviour attribute */ 8951 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID) 8952 return -EINVAL; 8953 8954 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour))) 8955 return -EINVAL; 8956 8957 return 0; 8958 } 8959 8960 int nl80211_parse_random_mac(struct nlattr **attrs, 8961 u8 *mac_addr, u8 *mac_addr_mask) 8962 { 8963 int i; 8964 8965 if (!attrs[NL80211_ATTR_MAC] && !attrs[NL80211_ATTR_MAC_MASK]) { 8966 eth_zero_addr(mac_addr); 8967 eth_zero_addr(mac_addr_mask); 8968 mac_addr[0] = 0x2; 8969 mac_addr_mask[0] = 0x3; 8970 8971 return 0; 8972 } 8973 8974 /* need both or none */ 8975 if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_MAC_MASK]) 8976 return -EINVAL; 8977 8978 memcpy(mac_addr, nla_data(attrs[NL80211_ATTR_MAC]), ETH_ALEN); 8979 memcpy(mac_addr_mask, nla_data(attrs[NL80211_ATTR_MAC_MASK]), ETH_ALEN); 8980 8981 /* don't allow or configure an mcast address */ 8982 if (!is_multicast_ether_addr(mac_addr_mask) || 8983 is_multicast_ether_addr(mac_addr)) 8984 return -EINVAL; 8985 8986 /* 8987 * allow users to pass a MAC address that has bits set outside 8988 * of the mask, but don't bother drivers with having to deal 8989 * with such bits 8990 */ 8991 for (i = 0; i < ETH_ALEN; i++) 8992 mac_addr[i] &= mac_addr_mask[i]; 8993 8994 return 0; 8995 } 8996 8997 static bool cfg80211_off_channel_oper_allowed(struct wireless_dev *wdev, 8998 struct ieee80211_channel *chan) 8999 { 9000 unsigned int link_id; 9001 bool all_ok = true; 9002 9003 lockdep_assert_wiphy(wdev->wiphy); 9004 9005 if (!cfg80211_beaconing_iface_active(wdev)) 9006 return true; 9007 9008 /* 9009 * FIXME: check if we have a free HW resource/link for chan 9010 * 9011 * This, as well as the FIXME below, requires knowing the link 9012 * capabilities of the hardware. 9013 */ 9014 9015 /* we cannot leave radar channels */ 9016 for_each_valid_link(wdev, link_id) { 9017 struct cfg80211_chan_def *chandef; 9018 9019 chandef = wdev_chandef(wdev, link_id); 9020 if (!chandef || !chandef->chan) 9021 continue; 9022 9023 /* 9024 * FIXME: don't require all_ok, but rather check only the 9025 * correct HW resource/link onto which 'chan' falls, 9026 * as only that link leaves the channel for doing 9027 * the off-channel operation. 9028 */ 9029 9030 if (chandef->chan->flags & IEEE80211_CHAN_RADAR) 9031 all_ok = false; 9032 } 9033 9034 if (all_ok) 9035 return true; 9036 9037 return regulatory_pre_cac_allowed(wdev->wiphy); 9038 } 9039 9040 static bool nl80211_check_scan_feat(struct wiphy *wiphy, u32 flags, u32 flag, 9041 enum nl80211_ext_feature_index feat) 9042 { 9043 if (!(flags & flag)) 9044 return true; 9045 if (wiphy_ext_feature_isset(wiphy, feat)) 9046 return true; 9047 return false; 9048 } 9049 9050 static int 9051 nl80211_check_scan_flags(struct wiphy *wiphy, struct wireless_dev *wdev, 9052 void *request, struct nlattr **attrs, 9053 bool is_sched_scan) 9054 { 9055 u8 *mac_addr, *mac_addr_mask; 9056 u32 *flags; 9057 enum nl80211_feature_flags randomness_flag; 9058 9059 if (!attrs[NL80211_ATTR_SCAN_FLAGS]) 9060 return 0; 9061 9062 if (is_sched_scan) { 9063 struct cfg80211_sched_scan_request *req = request; 9064 9065 randomness_flag = wdev ? 9066 NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR : 9067 NL80211_FEATURE_ND_RANDOM_MAC_ADDR; 9068 flags = &req->flags; 9069 mac_addr = req->mac_addr; 9070 mac_addr_mask = req->mac_addr_mask; 9071 } else { 9072 struct cfg80211_scan_request *req = request; 9073 9074 randomness_flag = NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR; 9075 flags = &req->flags; 9076 mac_addr = req->mac_addr; 9077 mac_addr_mask = req->mac_addr_mask; 9078 } 9079 9080 *flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]); 9081 9082 if (((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) && 9083 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) || 9084 !nl80211_check_scan_feat(wiphy, *flags, 9085 NL80211_SCAN_FLAG_LOW_SPAN, 9086 NL80211_EXT_FEATURE_LOW_SPAN_SCAN) || 9087 !nl80211_check_scan_feat(wiphy, *flags, 9088 NL80211_SCAN_FLAG_LOW_POWER, 9089 NL80211_EXT_FEATURE_LOW_POWER_SCAN) || 9090 !nl80211_check_scan_feat(wiphy, *flags, 9091 NL80211_SCAN_FLAG_HIGH_ACCURACY, 9092 NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN) || 9093 !nl80211_check_scan_feat(wiphy, *flags, 9094 NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME, 9095 NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME) || 9096 !nl80211_check_scan_feat(wiphy, *flags, 9097 NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP, 9098 NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP) || 9099 !nl80211_check_scan_feat(wiphy, *flags, 9100 NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION, 9101 NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION) || 9102 !nl80211_check_scan_feat(wiphy, *flags, 9103 NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE, 9104 NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE) || 9105 !nl80211_check_scan_feat(wiphy, *flags, 9106 NL80211_SCAN_FLAG_RANDOM_SN, 9107 NL80211_EXT_FEATURE_SCAN_RANDOM_SN) || 9108 !nl80211_check_scan_feat(wiphy, *flags, 9109 NL80211_SCAN_FLAG_MIN_PREQ_CONTENT, 9110 NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT)) 9111 return -EOPNOTSUPP; 9112 9113 if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { 9114 int err; 9115 9116 if (!(wiphy->features & randomness_flag) || 9117 (wdev && wdev->connected)) 9118 return -EOPNOTSUPP; 9119 9120 err = nl80211_parse_random_mac(attrs, mac_addr, mac_addr_mask); 9121 if (err) 9122 return err; 9123 } 9124 9125 return 0; 9126 } 9127 9128 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) 9129 { 9130 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9131 struct wireless_dev *wdev = info->user_ptr[1]; 9132 struct cfg80211_scan_request *request; 9133 struct nlattr *scan_freqs = NULL; 9134 bool scan_freqs_khz = false; 9135 struct nlattr *attr; 9136 struct wiphy *wiphy; 9137 int err, tmp, n_ssids = 0, n_channels, i; 9138 size_t ie_len, size; 9139 9140 wiphy = &rdev->wiphy; 9141 9142 if (wdev->iftype == NL80211_IFTYPE_NAN) 9143 return -EOPNOTSUPP; 9144 9145 if (!rdev->ops->scan) 9146 return -EOPNOTSUPP; 9147 9148 if (rdev->scan_req || rdev->scan_msg) 9149 return -EBUSY; 9150 9151 if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) { 9152 if (!wiphy_ext_feature_isset(wiphy, 9153 NL80211_EXT_FEATURE_SCAN_FREQ_KHZ)) 9154 return -EOPNOTSUPP; 9155 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]; 9156 scan_freqs_khz = true; 9157 } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) 9158 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]; 9159 9160 if (scan_freqs) { 9161 n_channels = validate_scan_freqs(scan_freqs); 9162 if (!n_channels) 9163 return -EINVAL; 9164 } else { 9165 n_channels = ieee80211_get_num_supported_channels(wiphy); 9166 } 9167 9168 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) 9169 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) 9170 n_ssids++; 9171 9172 if (n_ssids > wiphy->max_scan_ssids) 9173 return -EINVAL; 9174 9175 if (info->attrs[NL80211_ATTR_IE]) 9176 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 9177 else 9178 ie_len = 0; 9179 9180 if (ie_len > wiphy->max_scan_ie_len) 9181 return -EINVAL; 9182 9183 size = struct_size(request, channels, n_channels); 9184 size = size_add(size, array_size(sizeof(*request->ssids), n_ssids)); 9185 size = size_add(size, ie_len); 9186 request = kzalloc(size, GFP_KERNEL); 9187 if (!request) 9188 return -ENOMEM; 9189 9190 if (n_ssids) 9191 request->ssids = (void *)&request->channels[n_channels]; 9192 request->n_ssids = n_ssids; 9193 if (ie_len) { 9194 if (n_ssids) 9195 request->ie = (void *)(request->ssids + n_ssids); 9196 else 9197 request->ie = (void *)(request->channels + n_channels); 9198 } 9199 9200 i = 0; 9201 if (scan_freqs) { 9202 /* user specified, bail out if channel not found */ 9203 nla_for_each_nested(attr, scan_freqs, tmp) { 9204 struct ieee80211_channel *chan; 9205 int freq = nla_get_u32(attr); 9206 9207 if (!scan_freqs_khz) 9208 freq = MHZ_TO_KHZ(freq); 9209 9210 chan = ieee80211_get_channel_khz(wiphy, freq); 9211 if (!chan) { 9212 err = -EINVAL; 9213 goto out_free; 9214 } 9215 9216 /* ignore disabled channels */ 9217 if (chan->flags & IEEE80211_CHAN_DISABLED) 9218 continue; 9219 9220 request->channels[i] = chan; 9221 i++; 9222 } 9223 } else { 9224 enum nl80211_band band; 9225 9226 /* all channels */ 9227 for (band = 0; band < NUM_NL80211_BANDS; band++) { 9228 int j; 9229 9230 if (!wiphy->bands[band]) 9231 continue; 9232 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 9233 struct ieee80211_channel *chan; 9234 9235 chan = &wiphy->bands[band]->channels[j]; 9236 9237 if (chan->flags & IEEE80211_CHAN_DISABLED) 9238 continue; 9239 9240 request->channels[i] = chan; 9241 i++; 9242 } 9243 } 9244 } 9245 9246 if (!i) { 9247 err = -EINVAL; 9248 goto out_free; 9249 } 9250 9251 request->n_channels = i; 9252 9253 for (i = 0; i < request->n_channels; i++) { 9254 struct ieee80211_channel *chan = request->channels[i]; 9255 9256 /* if we can go off-channel to the target channel we're good */ 9257 if (cfg80211_off_channel_oper_allowed(wdev, chan)) 9258 continue; 9259 9260 if (!cfg80211_wdev_on_sub_chan(wdev, chan, true)) { 9261 err = -EBUSY; 9262 goto out_free; 9263 } 9264 } 9265 9266 i = 0; 9267 if (n_ssids) { 9268 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { 9269 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 9270 err = -EINVAL; 9271 goto out_free; 9272 } 9273 request->ssids[i].ssid_len = nla_len(attr); 9274 memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr)); 9275 i++; 9276 } 9277 } 9278 9279 if (info->attrs[NL80211_ATTR_IE]) { 9280 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 9281 memcpy((void *)request->ie, 9282 nla_data(info->attrs[NL80211_ATTR_IE]), 9283 request->ie_len); 9284 } 9285 9286 for (i = 0; i < NUM_NL80211_BANDS; i++) 9287 if (wiphy->bands[i]) 9288 request->rates[i] = 9289 (1 << wiphy->bands[i]->n_bitrates) - 1; 9290 9291 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { 9292 nla_for_each_nested(attr, 9293 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], 9294 tmp) { 9295 enum nl80211_band band = nla_type(attr); 9296 9297 if (band < 0 || band >= NUM_NL80211_BANDS) { 9298 err = -EINVAL; 9299 goto out_free; 9300 } 9301 9302 if (!wiphy->bands[band]) 9303 continue; 9304 9305 err = ieee80211_get_ratemask(wiphy->bands[band], 9306 nla_data(attr), 9307 nla_len(attr), 9308 &request->rates[band]); 9309 if (err) 9310 goto out_free; 9311 } 9312 } 9313 9314 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { 9315 request->duration = 9316 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); 9317 request->duration_mandatory = 9318 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); 9319 } 9320 9321 err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs, 9322 false); 9323 if (err) 9324 goto out_free; 9325 9326 request->no_cck = 9327 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 9328 9329 /* Initial implementation used NL80211_ATTR_MAC to set the specific 9330 * BSSID to scan for. This was problematic because that same attribute 9331 * was already used for another purpose (local random MAC address). The 9332 * NL80211_ATTR_BSSID attribute was added to fix this. For backwards 9333 * compatibility with older userspace components, also use the 9334 * NL80211_ATTR_MAC value here if it can be determined to be used for 9335 * the specific BSSID use case instead of the random MAC address 9336 * (NL80211_ATTR_SCAN_FLAGS is used to enable random MAC address use). 9337 */ 9338 if (info->attrs[NL80211_ATTR_BSSID]) 9339 memcpy(request->bssid, 9340 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); 9341 else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && 9342 info->attrs[NL80211_ATTR_MAC]) 9343 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]), 9344 ETH_ALEN); 9345 else 9346 eth_broadcast_addr(request->bssid); 9347 9348 request->tsf_report_link_id = nl80211_link_id_or_invalid(info->attrs); 9349 request->wdev = wdev; 9350 request->wiphy = &rdev->wiphy; 9351 request->scan_start = jiffies; 9352 9353 rdev->scan_req = request; 9354 err = cfg80211_scan(rdev); 9355 9356 if (err) 9357 goto out_free; 9358 9359 nl80211_send_scan_start(rdev, wdev); 9360 dev_hold(wdev->netdev); 9361 9362 return 0; 9363 9364 out_free: 9365 rdev->scan_req = NULL; 9366 kfree(request); 9367 9368 return err; 9369 } 9370 9371 static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info) 9372 { 9373 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9374 struct wireless_dev *wdev = info->user_ptr[1]; 9375 9376 if (!rdev->ops->abort_scan) 9377 return -EOPNOTSUPP; 9378 9379 if (rdev->scan_msg) 9380 return 0; 9381 9382 if (!rdev->scan_req) 9383 return -ENOENT; 9384 9385 rdev_abort_scan(rdev, wdev); 9386 return 0; 9387 } 9388 9389 static int 9390 nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans, 9391 struct cfg80211_sched_scan_request *request, 9392 struct nlattr **attrs) 9393 { 9394 int tmp, err, i = 0; 9395 struct nlattr *attr; 9396 9397 if (!attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) { 9398 u32 interval; 9399 9400 /* 9401 * If scan plans are not specified, 9402 * %NL80211_ATTR_SCHED_SCAN_INTERVAL will be specified. In this 9403 * case one scan plan will be set with the specified scan 9404 * interval and infinite number of iterations. 9405 */ 9406 interval = nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]); 9407 if (!interval) 9408 return -EINVAL; 9409 9410 request->scan_plans[0].interval = 9411 DIV_ROUND_UP(interval, MSEC_PER_SEC); 9412 if (!request->scan_plans[0].interval) 9413 return -EINVAL; 9414 9415 if (request->scan_plans[0].interval > 9416 wiphy->max_sched_scan_plan_interval) 9417 request->scan_plans[0].interval = 9418 wiphy->max_sched_scan_plan_interval; 9419 9420 return 0; 9421 } 9422 9423 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) { 9424 struct nlattr *plan[NL80211_SCHED_SCAN_PLAN_MAX + 1]; 9425 9426 if (WARN_ON(i >= n_plans)) 9427 return -EINVAL; 9428 9429 err = nla_parse_nested_deprecated(plan, 9430 NL80211_SCHED_SCAN_PLAN_MAX, 9431 attr, nl80211_plan_policy, 9432 NULL); 9433 if (err) 9434 return err; 9435 9436 if (!plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]) 9437 return -EINVAL; 9438 9439 request->scan_plans[i].interval = 9440 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]); 9441 if (!request->scan_plans[i].interval || 9442 request->scan_plans[i].interval > 9443 wiphy->max_sched_scan_plan_interval) 9444 return -EINVAL; 9445 9446 if (plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]) { 9447 request->scan_plans[i].iterations = 9448 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]); 9449 if (!request->scan_plans[i].iterations || 9450 (request->scan_plans[i].iterations > 9451 wiphy->max_sched_scan_plan_iterations)) 9452 return -EINVAL; 9453 } else if (i < n_plans - 1) { 9454 /* 9455 * All scan plans but the last one must specify 9456 * a finite number of iterations 9457 */ 9458 return -EINVAL; 9459 } 9460 9461 i++; 9462 } 9463 9464 /* 9465 * The last scan plan must not specify the number of 9466 * iterations, it is supposed to run infinitely 9467 */ 9468 if (request->scan_plans[n_plans - 1].iterations) 9469 return -EINVAL; 9470 9471 return 0; 9472 } 9473 9474 static int 9475 nl80211_parse_sched_scan_per_band_rssi(struct wiphy *wiphy, 9476 struct cfg80211_match_set *match_sets, 9477 struct nlattr *tb_band_rssi, 9478 s32 rssi_thold) 9479 { 9480 struct nlattr *attr; 9481 int i, tmp, ret = 0; 9482 9483 if (!wiphy_ext_feature_isset(wiphy, 9484 NL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD)) { 9485 if (tb_band_rssi) 9486 ret = -EOPNOTSUPP; 9487 else 9488 for (i = 0; i < NUM_NL80211_BANDS; i++) 9489 match_sets->per_band_rssi_thold[i] = 9490 NL80211_SCAN_RSSI_THOLD_OFF; 9491 return ret; 9492 } 9493 9494 for (i = 0; i < NUM_NL80211_BANDS; i++) 9495 match_sets->per_band_rssi_thold[i] = rssi_thold; 9496 9497 nla_for_each_nested(attr, tb_band_rssi, tmp) { 9498 enum nl80211_band band = nla_type(attr); 9499 9500 if (band < 0 || band >= NUM_NL80211_BANDS) 9501 return -EINVAL; 9502 9503 match_sets->per_band_rssi_thold[band] = nla_get_s32(attr); 9504 } 9505 9506 return 0; 9507 } 9508 9509 static struct cfg80211_sched_scan_request * 9510 nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev, 9511 struct nlattr **attrs, int max_match_sets) 9512 { 9513 struct cfg80211_sched_scan_request *request; 9514 struct nlattr *attr; 9515 int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i, n_plans = 0; 9516 enum nl80211_band band; 9517 size_t ie_len, size; 9518 struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1]; 9519 s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF; 9520 9521 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 9522 n_channels = validate_scan_freqs( 9523 attrs[NL80211_ATTR_SCAN_FREQUENCIES]); 9524 if (!n_channels) 9525 return ERR_PTR(-EINVAL); 9526 } else { 9527 n_channels = ieee80211_get_num_supported_channels(wiphy); 9528 } 9529 9530 if (attrs[NL80211_ATTR_SCAN_SSIDS]) 9531 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS], 9532 tmp) 9533 n_ssids++; 9534 9535 if (n_ssids > wiphy->max_sched_scan_ssids) 9536 return ERR_PTR(-EINVAL); 9537 9538 /* 9539 * First, count the number of 'real' matchsets. Due to an issue with 9540 * the old implementation, matchsets containing only the RSSI attribute 9541 * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default' 9542 * RSSI for all matchsets, rather than their own matchset for reporting 9543 * all APs with a strong RSSI. This is needed to be compatible with 9544 * older userspace that treated a matchset with only the RSSI as the 9545 * global RSSI for all other matchsets - if there are other matchsets. 9546 */ 9547 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 9548 nla_for_each_nested(attr, 9549 attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 9550 tmp) { 9551 struct nlattr *rssi; 9552 9553 err = nla_parse_nested_deprecated(tb, 9554 NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 9555 attr, 9556 nl80211_match_policy, 9557 NULL); 9558 if (err) 9559 return ERR_PTR(err); 9560 9561 /* SSID and BSSID are mutually exclusive */ 9562 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] && 9563 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) 9564 return ERR_PTR(-EINVAL); 9565 9566 /* add other standalone attributes here */ 9567 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] || 9568 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) { 9569 n_match_sets++; 9570 continue; 9571 } 9572 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 9573 if (rssi) 9574 default_match_rssi = nla_get_s32(rssi); 9575 } 9576 } 9577 9578 /* However, if there's no other matchset, add the RSSI one */ 9579 if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF) 9580 n_match_sets = 1; 9581 9582 if (n_match_sets > max_match_sets) 9583 return ERR_PTR(-EINVAL); 9584 9585 if (attrs[NL80211_ATTR_IE]) 9586 ie_len = nla_len(attrs[NL80211_ATTR_IE]); 9587 else 9588 ie_len = 0; 9589 9590 if (ie_len > wiphy->max_sched_scan_ie_len) 9591 return ERR_PTR(-EINVAL); 9592 9593 if (attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) { 9594 /* 9595 * NL80211_ATTR_SCHED_SCAN_INTERVAL must not be specified since 9596 * each scan plan already specifies its own interval 9597 */ 9598 if (attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 9599 return ERR_PTR(-EINVAL); 9600 9601 nla_for_each_nested(attr, 9602 attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) 9603 n_plans++; 9604 } else { 9605 /* 9606 * The scan interval attribute is kept for backward 9607 * compatibility. If no scan plans are specified and sched scan 9608 * interval is specified, one scan plan will be set with this 9609 * scan interval and infinite number of iterations. 9610 */ 9611 if (!attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 9612 return ERR_PTR(-EINVAL); 9613 9614 n_plans = 1; 9615 } 9616 9617 if (!n_plans || n_plans > wiphy->max_sched_scan_plans) 9618 return ERR_PTR(-EINVAL); 9619 9620 if (!wiphy_ext_feature_isset( 9621 wiphy, NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI) && 9622 (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] || 9623 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST])) 9624 return ERR_PTR(-EINVAL); 9625 9626 size = struct_size(request, channels, n_channels); 9627 size = size_add(size, array_size(sizeof(*request->ssids), n_ssids)); 9628 size = size_add(size, array_size(sizeof(*request->match_sets), 9629 n_match_sets)); 9630 size = size_add(size, array_size(sizeof(*request->scan_plans), 9631 n_plans)); 9632 size = size_add(size, ie_len); 9633 request = kzalloc(size, GFP_KERNEL); 9634 if (!request) 9635 return ERR_PTR(-ENOMEM); 9636 9637 if (n_ssids) 9638 request->ssids = (void *)&request->channels[n_channels]; 9639 request->n_ssids = n_ssids; 9640 if (ie_len) { 9641 if (n_ssids) 9642 request->ie = (void *)(request->ssids + n_ssids); 9643 else 9644 request->ie = (void *)(request->channels + n_channels); 9645 } 9646 9647 if (n_match_sets) { 9648 if (request->ie) 9649 request->match_sets = (void *)(request->ie + ie_len); 9650 else if (n_ssids) 9651 request->match_sets = 9652 (void *)(request->ssids + n_ssids); 9653 else 9654 request->match_sets = 9655 (void *)(request->channels + n_channels); 9656 } 9657 request->n_match_sets = n_match_sets; 9658 9659 if (n_match_sets) 9660 request->scan_plans = (void *)(request->match_sets + 9661 n_match_sets); 9662 else if (request->ie) 9663 request->scan_plans = (void *)(request->ie + ie_len); 9664 else if (n_ssids) 9665 request->scan_plans = (void *)(request->ssids + n_ssids); 9666 else 9667 request->scan_plans = (void *)(request->channels + n_channels); 9668 9669 request->n_scan_plans = n_plans; 9670 9671 i = 0; 9672 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 9673 /* user specified, bail out if channel not found */ 9674 nla_for_each_nested(attr, 9675 attrs[NL80211_ATTR_SCAN_FREQUENCIES], 9676 tmp) { 9677 struct ieee80211_channel *chan; 9678 9679 chan = ieee80211_get_channel(wiphy, nla_get_u32(attr)); 9680 9681 if (!chan) { 9682 err = -EINVAL; 9683 goto out_free; 9684 } 9685 9686 /* ignore disabled channels */ 9687 if (chan->flags & IEEE80211_CHAN_DISABLED) 9688 continue; 9689 9690 request->channels[i] = chan; 9691 i++; 9692 } 9693 } else { 9694 /* all channels */ 9695 for (band = 0; band < NUM_NL80211_BANDS; band++) { 9696 int j; 9697 9698 if (!wiphy->bands[band]) 9699 continue; 9700 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 9701 struct ieee80211_channel *chan; 9702 9703 chan = &wiphy->bands[band]->channels[j]; 9704 9705 if (chan->flags & IEEE80211_CHAN_DISABLED) 9706 continue; 9707 9708 request->channels[i] = chan; 9709 i++; 9710 } 9711 } 9712 } 9713 9714 if (!i) { 9715 err = -EINVAL; 9716 goto out_free; 9717 } 9718 9719 request->n_channels = i; 9720 9721 i = 0; 9722 if (n_ssids) { 9723 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS], 9724 tmp) { 9725 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 9726 err = -EINVAL; 9727 goto out_free; 9728 } 9729 request->ssids[i].ssid_len = nla_len(attr); 9730 memcpy(request->ssids[i].ssid, nla_data(attr), 9731 nla_len(attr)); 9732 i++; 9733 } 9734 } 9735 9736 i = 0; 9737 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 9738 nla_for_each_nested(attr, 9739 attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 9740 tmp) { 9741 struct nlattr *ssid, *bssid, *rssi; 9742 9743 err = nla_parse_nested_deprecated(tb, 9744 NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 9745 attr, 9746 nl80211_match_policy, 9747 NULL); 9748 if (err) 9749 goto out_free; 9750 ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID]; 9751 bssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]; 9752 9753 if (!ssid && !bssid) { 9754 i++; 9755 continue; 9756 } 9757 9758 if (WARN_ON(i >= n_match_sets)) { 9759 /* this indicates a programming error, 9760 * the loop above should have verified 9761 * things properly 9762 */ 9763 err = -EINVAL; 9764 goto out_free; 9765 } 9766 9767 if (ssid) { 9768 memcpy(request->match_sets[i].ssid.ssid, 9769 nla_data(ssid), nla_len(ssid)); 9770 request->match_sets[i].ssid.ssid_len = 9771 nla_len(ssid); 9772 } 9773 if (bssid) 9774 memcpy(request->match_sets[i].bssid, 9775 nla_data(bssid), ETH_ALEN); 9776 9777 /* special attribute - old implementation w/a */ 9778 request->match_sets[i].rssi_thold = default_match_rssi; 9779 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 9780 if (rssi) 9781 request->match_sets[i].rssi_thold = 9782 nla_get_s32(rssi); 9783 9784 /* Parse per band RSSI attribute */ 9785 err = nl80211_parse_sched_scan_per_band_rssi(wiphy, 9786 &request->match_sets[i], 9787 tb[NL80211_SCHED_SCAN_MATCH_PER_BAND_RSSI], 9788 request->match_sets[i].rssi_thold); 9789 if (err) 9790 goto out_free; 9791 9792 i++; 9793 } 9794 9795 /* there was no other matchset, so the RSSI one is alone */ 9796 if (i == 0 && n_match_sets) 9797 request->match_sets[0].rssi_thold = default_match_rssi; 9798 9799 request->min_rssi_thold = INT_MAX; 9800 for (i = 0; i < n_match_sets; i++) 9801 request->min_rssi_thold = 9802 min(request->match_sets[i].rssi_thold, 9803 request->min_rssi_thold); 9804 } else { 9805 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF; 9806 } 9807 9808 if (ie_len) { 9809 request->ie_len = ie_len; 9810 memcpy((void *)request->ie, 9811 nla_data(attrs[NL80211_ATTR_IE]), 9812 request->ie_len); 9813 } 9814 9815 err = nl80211_check_scan_flags(wiphy, wdev, request, attrs, true); 9816 if (err) 9817 goto out_free; 9818 9819 if (attrs[NL80211_ATTR_SCHED_SCAN_DELAY]) 9820 request->delay = 9821 nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_DELAY]); 9822 9823 if (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]) { 9824 request->relative_rssi = nla_get_s8( 9825 attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]); 9826 request->relative_rssi_set = true; 9827 } 9828 9829 if (request->relative_rssi_set && 9830 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]) { 9831 struct nl80211_bss_select_rssi_adjust *rssi_adjust; 9832 9833 rssi_adjust = nla_data( 9834 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]); 9835 request->rssi_adjust.band = rssi_adjust->band; 9836 request->rssi_adjust.delta = rssi_adjust->delta; 9837 if (!is_band_valid(wiphy, request->rssi_adjust.band)) { 9838 err = -EINVAL; 9839 goto out_free; 9840 } 9841 } 9842 9843 err = nl80211_parse_sched_scan_plans(wiphy, n_plans, request, attrs); 9844 if (err) 9845 goto out_free; 9846 9847 request->scan_start = jiffies; 9848 9849 return request; 9850 9851 out_free: 9852 kfree(request); 9853 return ERR_PTR(err); 9854 } 9855 9856 static int nl80211_start_sched_scan(struct sk_buff *skb, 9857 struct genl_info *info) 9858 { 9859 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9860 struct net_device *dev = info->user_ptr[1]; 9861 struct wireless_dev *wdev = dev->ieee80211_ptr; 9862 struct cfg80211_sched_scan_request *sched_scan_req; 9863 bool want_multi; 9864 int err; 9865 9866 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start) 9867 return -EOPNOTSUPP; 9868 9869 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI]; 9870 err = cfg80211_sched_scan_req_possible(rdev, want_multi); 9871 if (err) 9872 return err; 9873 9874 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev, 9875 info->attrs, 9876 rdev->wiphy.max_match_sets); 9877 9878 err = PTR_ERR_OR_ZERO(sched_scan_req); 9879 if (err) 9880 goto out_err; 9881 9882 /* leave request id zero for legacy request 9883 * or if driver does not support multi-scheduled scan 9884 */ 9885 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) 9886 sched_scan_req->reqid = cfg80211_assign_cookie(rdev); 9887 9888 err = rdev_sched_scan_start(rdev, dev, sched_scan_req); 9889 if (err) 9890 goto out_free; 9891 9892 sched_scan_req->dev = dev; 9893 sched_scan_req->wiphy = &rdev->wiphy; 9894 9895 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 9896 sched_scan_req->owner_nlportid = info->snd_portid; 9897 9898 cfg80211_add_sched_scan_req(rdev, sched_scan_req); 9899 9900 nl80211_send_sched_scan(sched_scan_req, NL80211_CMD_START_SCHED_SCAN); 9901 return 0; 9902 9903 out_free: 9904 kfree(sched_scan_req); 9905 out_err: 9906 return err; 9907 } 9908 9909 static int nl80211_stop_sched_scan(struct sk_buff *skb, 9910 struct genl_info *info) 9911 { 9912 struct cfg80211_sched_scan_request *req; 9913 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9914 u64 cookie; 9915 9916 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop) 9917 return -EOPNOTSUPP; 9918 9919 if (info->attrs[NL80211_ATTR_COOKIE]) { 9920 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 9921 return __cfg80211_stop_sched_scan(rdev, cookie, false); 9922 } 9923 9924 req = list_first_or_null_rcu(&rdev->sched_scan_req_list, 9925 struct cfg80211_sched_scan_request, 9926 list); 9927 if (!req || req->reqid || 9928 (req->owner_nlportid && 9929 req->owner_nlportid != info->snd_portid)) 9930 return -ENOENT; 9931 9932 return cfg80211_stop_sched_scan_req(rdev, req, false); 9933 } 9934 9935 static int nl80211_start_radar_detection(struct sk_buff *skb, 9936 struct genl_info *info) 9937 { 9938 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9939 struct net_device *dev = info->user_ptr[1]; 9940 struct wireless_dev *wdev = dev->ieee80211_ptr; 9941 struct wiphy *wiphy = wdev->wiphy; 9942 struct cfg80211_chan_def chandef; 9943 enum nl80211_dfs_regions dfs_region; 9944 unsigned int cac_time_ms; 9945 int err = -EINVAL; 9946 9947 flush_delayed_work(&rdev->dfs_update_channels_wk); 9948 9949 wiphy_lock(wiphy); 9950 9951 dfs_region = reg_get_dfs_region(wiphy); 9952 if (dfs_region == NL80211_DFS_UNSET) 9953 goto unlock; 9954 9955 err = nl80211_parse_chandef(rdev, info, &chandef); 9956 if (err) 9957 goto unlock; 9958 9959 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); 9960 if (err < 0) 9961 goto unlock; 9962 9963 if (err == 0) { 9964 err = -EINVAL; 9965 goto unlock; 9966 } 9967 9968 if (!cfg80211_chandef_dfs_usable(wiphy, &chandef)) { 9969 err = -EINVAL; 9970 goto unlock; 9971 } 9972 9973 if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_BACKGROUND])) { 9974 err = cfg80211_start_background_radar_detection(rdev, wdev, 9975 &chandef); 9976 goto unlock; 9977 } 9978 9979 if (netif_carrier_ok(dev)) { 9980 err = -EBUSY; 9981 goto unlock; 9982 } 9983 9984 if (wdev->cac_started) { 9985 err = -EBUSY; 9986 goto unlock; 9987 } 9988 9989 /* CAC start is offloaded to HW and can't be started manually */ 9990 if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD)) { 9991 err = -EOPNOTSUPP; 9992 goto unlock; 9993 } 9994 9995 if (!rdev->ops->start_radar_detection) { 9996 err = -EOPNOTSUPP; 9997 goto unlock; 9998 } 9999 10000 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); 10001 if (WARN_ON(!cac_time_ms)) 10002 cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS; 10003 10004 err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms); 10005 if (!err) { 10006 wdev->links[0].ap.chandef = chandef; 10007 wdev->cac_started = true; 10008 wdev->cac_start_time = jiffies; 10009 wdev->cac_time_ms = cac_time_ms; 10010 } 10011 unlock: 10012 wiphy_unlock(wiphy); 10013 10014 return err; 10015 } 10016 10017 static int nl80211_notify_radar_detection(struct sk_buff *skb, 10018 struct genl_info *info) 10019 { 10020 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10021 struct net_device *dev = info->user_ptr[1]; 10022 struct wireless_dev *wdev = dev->ieee80211_ptr; 10023 struct wiphy *wiphy = wdev->wiphy; 10024 struct cfg80211_chan_def chandef; 10025 enum nl80211_dfs_regions dfs_region; 10026 int err; 10027 10028 dfs_region = reg_get_dfs_region(wiphy); 10029 if (dfs_region == NL80211_DFS_UNSET) { 10030 GENL_SET_ERR_MSG(info, 10031 "DFS Region is not set. Unexpected Radar indication"); 10032 return -EINVAL; 10033 } 10034 10035 err = nl80211_parse_chandef(rdev, info, &chandef); 10036 if (err) { 10037 GENL_SET_ERR_MSG(info, "Unable to extract chandef info"); 10038 return err; 10039 } 10040 10041 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); 10042 if (err < 0) { 10043 GENL_SET_ERR_MSG(info, "chandef is invalid"); 10044 return err; 10045 } 10046 10047 if (err == 0) { 10048 GENL_SET_ERR_MSG(info, 10049 "Unexpected Radar indication for chandef/iftype"); 10050 return -EINVAL; 10051 } 10052 10053 /* Do not process this notification if radar is already detected 10054 * by kernel on this channel, and return success. 10055 */ 10056 if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE) 10057 return 0; 10058 10059 cfg80211_set_dfs_state(wiphy, &chandef, NL80211_DFS_UNAVAILABLE); 10060 10061 cfg80211_sched_dfs_chan_update(rdev); 10062 10063 rdev->radar_chandef = chandef; 10064 10065 /* Propagate this notification to other radios as well */ 10066 queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); 10067 10068 return 0; 10069 } 10070 10071 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info) 10072 { 10073 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10074 unsigned int link_id = nl80211_link_id(info->attrs); 10075 struct net_device *dev = info->user_ptr[1]; 10076 struct wireless_dev *wdev = dev->ieee80211_ptr; 10077 struct cfg80211_csa_settings params; 10078 struct nlattr **csa_attrs = NULL; 10079 int err; 10080 bool need_new_beacon = false; 10081 bool need_handle_dfs_flag = true; 10082 int len, i; 10083 u32 cs_count; 10084 10085 if (!rdev->ops->channel_switch || 10086 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) 10087 return -EOPNOTSUPP; 10088 10089 switch (dev->ieee80211_ptr->iftype) { 10090 case NL80211_IFTYPE_AP: 10091 case NL80211_IFTYPE_P2P_GO: 10092 need_new_beacon = true; 10093 /* For all modes except AP the handle_dfs flag needs to be 10094 * supplied to tell the kernel that userspace will handle radar 10095 * events when they happen. Otherwise a switch to a channel 10096 * requiring DFS will be rejected. 10097 */ 10098 need_handle_dfs_flag = false; 10099 10100 /* useless if AP is not running */ 10101 if (!wdev->links[link_id].ap.beacon_interval) 10102 return -ENOTCONN; 10103 break; 10104 case NL80211_IFTYPE_ADHOC: 10105 if (!wdev->u.ibss.ssid_len) 10106 return -ENOTCONN; 10107 break; 10108 case NL80211_IFTYPE_MESH_POINT: 10109 if (!wdev->u.mesh.id_len) 10110 return -ENOTCONN; 10111 break; 10112 default: 10113 return -EOPNOTSUPP; 10114 } 10115 10116 memset(¶ms, 0, sizeof(params)); 10117 params.beacon_csa.ftm_responder = -1; 10118 10119 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 10120 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) 10121 return -EINVAL; 10122 10123 /* only important for AP, IBSS and mesh create IEs internally */ 10124 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) 10125 return -EINVAL; 10126 10127 /* Even though the attribute is u32, the specification says 10128 * u8, so let's make sure we don't overflow. 10129 */ 10130 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); 10131 if (cs_count > 255) 10132 return -EINVAL; 10133 10134 params.count = cs_count; 10135 10136 if (!need_new_beacon) 10137 goto skip_beacons; 10138 10139 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_after, 10140 info->extack); 10141 if (err) 10142 goto free; 10143 10144 csa_attrs = kcalloc(NL80211_ATTR_MAX + 1, sizeof(*csa_attrs), 10145 GFP_KERNEL); 10146 if (!csa_attrs) { 10147 err = -ENOMEM; 10148 goto free; 10149 } 10150 10151 err = nla_parse_nested_deprecated(csa_attrs, NL80211_ATTR_MAX, 10152 info->attrs[NL80211_ATTR_CSA_IES], 10153 nl80211_policy, info->extack); 10154 if (err) 10155 goto free; 10156 10157 err = nl80211_parse_beacon(rdev, csa_attrs, ¶ms.beacon_csa, 10158 info->extack); 10159 if (err) 10160 goto free; 10161 10162 if (!csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON]) { 10163 err = -EINVAL; 10164 goto free; 10165 } 10166 10167 len = nla_len(csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON]); 10168 if (!len || (len % sizeof(u16))) { 10169 err = -EINVAL; 10170 goto free; 10171 } 10172 10173 params.n_counter_offsets_beacon = len / sizeof(u16); 10174 if (rdev->wiphy.max_num_csa_counters && 10175 (params.n_counter_offsets_beacon > 10176 rdev->wiphy.max_num_csa_counters)) { 10177 err = -EINVAL; 10178 goto free; 10179 } 10180 10181 params.counter_offsets_beacon = 10182 nla_data(csa_attrs[NL80211_ATTR_CNTDWN_OFFS_BEACON]); 10183 10184 /* sanity checks - counters should fit and be the same */ 10185 for (i = 0; i < params.n_counter_offsets_beacon; i++) { 10186 u16 offset = params.counter_offsets_beacon[i]; 10187 10188 if (offset >= params.beacon_csa.tail_len) { 10189 err = -EINVAL; 10190 goto free; 10191 } 10192 10193 if (params.beacon_csa.tail[offset] != params.count) { 10194 err = -EINVAL; 10195 goto free; 10196 } 10197 } 10198 10199 if (csa_attrs[NL80211_ATTR_CNTDWN_OFFS_PRESP]) { 10200 len = nla_len(csa_attrs[NL80211_ATTR_CNTDWN_OFFS_PRESP]); 10201 if (!len || (len % sizeof(u16))) { 10202 err = -EINVAL; 10203 goto free; 10204 } 10205 10206 params.n_counter_offsets_presp = len / sizeof(u16); 10207 if (rdev->wiphy.max_num_csa_counters && 10208 (params.n_counter_offsets_presp > 10209 rdev->wiphy.max_num_csa_counters)) { 10210 err = -EINVAL; 10211 goto free; 10212 } 10213 10214 params.counter_offsets_presp = 10215 nla_data(csa_attrs[NL80211_ATTR_CNTDWN_OFFS_PRESP]); 10216 10217 /* sanity checks - counters should fit and be the same */ 10218 for (i = 0; i < params.n_counter_offsets_presp; i++) { 10219 u16 offset = params.counter_offsets_presp[i]; 10220 10221 if (offset >= params.beacon_csa.probe_resp_len) { 10222 err = -EINVAL; 10223 goto free; 10224 } 10225 10226 if (params.beacon_csa.probe_resp[offset] != 10227 params.count) { 10228 err = -EINVAL; 10229 goto free; 10230 } 10231 } 10232 } 10233 10234 skip_beacons: 10235 err = nl80211_parse_chandef(rdev, info, ¶ms.chandef); 10236 if (err) 10237 goto free; 10238 10239 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, 10240 wdev->iftype)) { 10241 err = -EINVAL; 10242 goto free; 10243 } 10244 10245 err = cfg80211_chandef_dfs_required(wdev->wiphy, 10246 ¶ms.chandef, 10247 wdev->iftype); 10248 if (err < 0) 10249 goto free; 10250 10251 if (err > 0) { 10252 params.radar_required = true; 10253 if (need_handle_dfs_flag && 10254 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) { 10255 err = -EINVAL; 10256 goto free; 10257 } 10258 } 10259 10260 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) 10261 params.block_tx = true; 10262 10263 if (info->attrs[NL80211_ATTR_PUNCT_BITMAP]) { 10264 err = nl80211_parse_punct_bitmap(rdev, info, 10265 ¶ms.chandef, 10266 ¶ms.punct_bitmap); 10267 if (err) 10268 goto free; 10269 } 10270 10271 err = rdev_channel_switch(rdev, dev, ¶ms); 10272 10273 free: 10274 kfree(params.beacon_after.mbssid_ies); 10275 kfree(params.beacon_csa.mbssid_ies); 10276 kfree(params.beacon_after.rnr_ies); 10277 kfree(params.beacon_csa.rnr_ies); 10278 kfree(csa_attrs); 10279 return err; 10280 } 10281 10282 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb, 10283 u32 seq, int flags, 10284 struct cfg80211_registered_device *rdev, 10285 struct wireless_dev *wdev, 10286 struct cfg80211_internal_bss *intbss) 10287 { 10288 struct cfg80211_bss *res = &intbss->pub; 10289 const struct cfg80211_bss_ies *ies; 10290 unsigned int link_id; 10291 void *hdr; 10292 struct nlattr *bss; 10293 10294 lockdep_assert_wiphy(wdev->wiphy); 10295 10296 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 10297 NL80211_CMD_NEW_SCAN_RESULTS); 10298 if (!hdr) 10299 return -1; 10300 10301 genl_dump_check_consistent(cb, hdr); 10302 10303 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) 10304 goto nla_put_failure; 10305 if (wdev->netdev && 10306 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) 10307 goto nla_put_failure; 10308 if (nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 10309 NL80211_ATTR_PAD)) 10310 goto nla_put_failure; 10311 10312 bss = nla_nest_start_noflag(msg, NL80211_ATTR_BSS); 10313 if (!bss) 10314 goto nla_put_failure; 10315 if ((!is_zero_ether_addr(res->bssid) && 10316 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) 10317 goto nla_put_failure; 10318 10319 rcu_read_lock(); 10320 /* indicate whether we have probe response data or not */ 10321 if (rcu_access_pointer(res->proberesp_ies) && 10322 nla_put_flag(msg, NL80211_BSS_PRESP_DATA)) 10323 goto fail_unlock_rcu; 10324 10325 /* this pointer prefers to be pointed to probe response data 10326 * but is always valid 10327 */ 10328 ies = rcu_dereference(res->ies); 10329 if (ies) { 10330 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf, 10331 NL80211_BSS_PAD)) 10332 goto fail_unlock_rcu; 10333 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, 10334 ies->len, ies->data)) 10335 goto fail_unlock_rcu; 10336 } 10337 10338 /* and this pointer is always (unless driver didn't know) beacon data */ 10339 ies = rcu_dereference(res->beacon_ies); 10340 if (ies && ies->from_beacon) { 10341 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf, 10342 NL80211_BSS_PAD)) 10343 goto fail_unlock_rcu; 10344 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, 10345 ies->len, ies->data)) 10346 goto fail_unlock_rcu; 10347 } 10348 rcu_read_unlock(); 10349 10350 if (res->beacon_interval && 10351 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) 10352 goto nla_put_failure; 10353 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || 10354 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || 10355 nla_put_u32(msg, NL80211_BSS_FREQUENCY_OFFSET, 10356 res->channel->freq_offset) || 10357 nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO, 10358 jiffies_to_msecs(jiffies - intbss->ts))) 10359 goto nla_put_failure; 10360 10361 if (intbss->parent_tsf && 10362 (nla_put_u64_64bit(msg, NL80211_BSS_PARENT_TSF, 10363 intbss->parent_tsf, NL80211_BSS_PAD) || 10364 nla_put(msg, NL80211_BSS_PARENT_BSSID, ETH_ALEN, 10365 intbss->parent_bssid))) 10366 goto nla_put_failure; 10367 10368 if (intbss->ts_boottime && 10369 nla_put_u64_64bit(msg, NL80211_BSS_LAST_SEEN_BOOTTIME, 10370 intbss->ts_boottime, NL80211_BSS_PAD)) 10371 goto nla_put_failure; 10372 10373 if (!nl80211_put_signal(msg, intbss->pub.chains, 10374 intbss->pub.chain_signal, 10375 NL80211_BSS_CHAIN_SIGNAL)) 10376 goto nla_put_failure; 10377 10378 switch (rdev->wiphy.signal_type) { 10379 case CFG80211_SIGNAL_TYPE_MBM: 10380 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal)) 10381 goto nla_put_failure; 10382 break; 10383 case CFG80211_SIGNAL_TYPE_UNSPEC: 10384 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal)) 10385 goto nla_put_failure; 10386 break; 10387 default: 10388 break; 10389 } 10390 10391 switch (wdev->iftype) { 10392 case NL80211_IFTYPE_P2P_CLIENT: 10393 case NL80211_IFTYPE_STATION: 10394 for_each_valid_link(wdev, link_id) { 10395 if (intbss == wdev->links[link_id].client.current_bss && 10396 (nla_put_u32(msg, NL80211_BSS_STATUS, 10397 NL80211_BSS_STATUS_ASSOCIATED) || 10398 (wdev->valid_links && 10399 (nla_put_u8(msg, NL80211_BSS_MLO_LINK_ID, 10400 link_id) || 10401 nla_put(msg, NL80211_BSS_MLD_ADDR, ETH_ALEN, 10402 wdev->u.client.connected_addr))))) 10403 goto nla_put_failure; 10404 } 10405 break; 10406 case NL80211_IFTYPE_ADHOC: 10407 if (intbss == wdev->u.ibss.current_bss && 10408 nla_put_u32(msg, NL80211_BSS_STATUS, 10409 NL80211_BSS_STATUS_IBSS_JOINED)) 10410 goto nla_put_failure; 10411 break; 10412 default: 10413 break; 10414 } 10415 10416 if (nla_put_u32(msg, NL80211_BSS_USE_FOR, res->use_for)) 10417 goto nla_put_failure; 10418 10419 if (res->cannot_use_reasons && 10420 nla_put_u64_64bit(msg, NL80211_BSS_CANNOT_USE_REASONS, 10421 res->cannot_use_reasons, 10422 NL80211_BSS_PAD)) 10423 goto nla_put_failure; 10424 10425 nla_nest_end(msg, bss); 10426 10427 genlmsg_end(msg, hdr); 10428 return 0; 10429 10430 fail_unlock_rcu: 10431 rcu_read_unlock(); 10432 nla_put_failure: 10433 genlmsg_cancel(msg, hdr); 10434 return -EMSGSIZE; 10435 } 10436 10437 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb) 10438 { 10439 struct cfg80211_registered_device *rdev; 10440 struct cfg80211_internal_bss *scan; 10441 struct wireless_dev *wdev; 10442 struct nlattr **attrbuf; 10443 int start = cb->args[2], idx = 0; 10444 bool dump_include_use_data; 10445 int err; 10446 10447 attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf), GFP_KERNEL); 10448 if (!attrbuf) 10449 return -ENOMEM; 10450 10451 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, attrbuf); 10452 if (err) { 10453 kfree(attrbuf); 10454 return err; 10455 } 10456 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 10457 __acquire(&rdev->wiphy.mtx); 10458 10459 dump_include_use_data = 10460 attrbuf[NL80211_ATTR_BSS_DUMP_INCLUDE_USE_DATA]; 10461 kfree(attrbuf); 10462 10463 spin_lock_bh(&rdev->bss_lock); 10464 10465 /* 10466 * dump_scan will be called multiple times to break up the scan results 10467 * into multiple messages. It is unlikely that any more bss-es will be 10468 * expired after the first call, so only call only call this on the 10469 * first dump_scan invocation. 10470 */ 10471 if (start == 0) 10472 cfg80211_bss_expire(rdev); 10473 10474 cb->seq = rdev->bss_generation; 10475 10476 list_for_each_entry(scan, &rdev->bss_list, list) { 10477 if (++idx <= start) 10478 continue; 10479 if (!dump_include_use_data && 10480 !(scan->pub.use_for & NL80211_BSS_USE_FOR_NORMAL)) 10481 continue; 10482 if (nl80211_send_bss(skb, cb, 10483 cb->nlh->nlmsg_seq, NLM_F_MULTI, 10484 rdev, wdev, scan) < 0) { 10485 idx--; 10486 break; 10487 } 10488 } 10489 10490 spin_unlock_bh(&rdev->bss_lock); 10491 10492 cb->args[2] = idx; 10493 wiphy_unlock(&rdev->wiphy); 10494 10495 return skb->len; 10496 } 10497 10498 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq, 10499 int flags, struct net_device *dev, 10500 bool allow_radio_stats, 10501 struct survey_info *survey) 10502 { 10503 void *hdr; 10504 struct nlattr *infoattr; 10505 10506 /* skip radio stats if userspace didn't request them */ 10507 if (!survey->channel && !allow_radio_stats) 10508 return 0; 10509 10510 hdr = nl80211hdr_put(msg, portid, seq, flags, 10511 NL80211_CMD_NEW_SURVEY_RESULTS); 10512 if (!hdr) 10513 return -ENOMEM; 10514 10515 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 10516 goto nla_put_failure; 10517 10518 infoattr = nla_nest_start_noflag(msg, NL80211_ATTR_SURVEY_INFO); 10519 if (!infoattr) 10520 goto nla_put_failure; 10521 10522 if (survey->channel && 10523 nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY, 10524 survey->channel->center_freq)) 10525 goto nla_put_failure; 10526 10527 if (survey->channel && survey->channel->freq_offset && 10528 nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY_OFFSET, 10529 survey->channel->freq_offset)) 10530 goto nla_put_failure; 10531 10532 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && 10533 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) 10534 goto nla_put_failure; 10535 if ((survey->filled & SURVEY_INFO_IN_USE) && 10536 nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE)) 10537 goto nla_put_failure; 10538 if ((survey->filled & SURVEY_INFO_TIME) && 10539 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME, 10540 survey->time, NL80211_SURVEY_INFO_PAD)) 10541 goto nla_put_failure; 10542 if ((survey->filled & SURVEY_INFO_TIME_BUSY) && 10543 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BUSY, 10544 survey->time_busy, NL80211_SURVEY_INFO_PAD)) 10545 goto nla_put_failure; 10546 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) && 10547 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_EXT_BUSY, 10548 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD)) 10549 goto nla_put_failure; 10550 if ((survey->filled & SURVEY_INFO_TIME_RX) && 10551 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_RX, 10552 survey->time_rx, NL80211_SURVEY_INFO_PAD)) 10553 goto nla_put_failure; 10554 if ((survey->filled & SURVEY_INFO_TIME_TX) && 10555 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_TX, 10556 survey->time_tx, NL80211_SURVEY_INFO_PAD)) 10557 goto nla_put_failure; 10558 if ((survey->filled & SURVEY_INFO_TIME_SCAN) && 10559 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_SCAN, 10560 survey->time_scan, NL80211_SURVEY_INFO_PAD)) 10561 goto nla_put_failure; 10562 if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) && 10563 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BSS_RX, 10564 survey->time_bss_rx, NL80211_SURVEY_INFO_PAD)) 10565 goto nla_put_failure; 10566 10567 nla_nest_end(msg, infoattr); 10568 10569 genlmsg_end(msg, hdr); 10570 return 0; 10571 10572 nla_put_failure: 10573 genlmsg_cancel(msg, hdr); 10574 return -EMSGSIZE; 10575 } 10576 10577 static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb) 10578 { 10579 struct nlattr **attrbuf; 10580 struct survey_info survey; 10581 struct cfg80211_registered_device *rdev; 10582 struct wireless_dev *wdev; 10583 int survey_idx = cb->args[2]; 10584 int res; 10585 bool radio_stats; 10586 10587 attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf), GFP_KERNEL); 10588 if (!attrbuf) 10589 return -ENOMEM; 10590 10591 res = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, attrbuf); 10592 if (res) { 10593 kfree(attrbuf); 10594 return res; 10595 } 10596 /* nl80211_prepare_wdev_dump acquired it in the successful case */ 10597 __acquire(&rdev->wiphy.mtx); 10598 10599 /* prepare_wdev_dump parsed the attributes */ 10600 radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS]; 10601 10602 if (!wdev->netdev) { 10603 res = -EINVAL; 10604 goto out_err; 10605 } 10606 10607 if (!rdev->ops->dump_survey) { 10608 res = -EOPNOTSUPP; 10609 goto out_err; 10610 } 10611 10612 while (1) { 10613 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey); 10614 if (res == -ENOENT) 10615 break; 10616 if (res) 10617 goto out_err; 10618 10619 /* don't send disabled channels, but do send non-channel data */ 10620 if (survey.channel && 10621 survey.channel->flags & IEEE80211_CHAN_DISABLED) { 10622 survey_idx++; 10623 continue; 10624 } 10625 10626 if (nl80211_send_survey(skb, 10627 NETLINK_CB(cb->skb).portid, 10628 cb->nlh->nlmsg_seq, NLM_F_MULTI, 10629 wdev->netdev, radio_stats, &survey) < 0) 10630 goto out; 10631 survey_idx++; 10632 } 10633 10634 out: 10635 cb->args[2] = survey_idx; 10636 res = skb->len; 10637 out_err: 10638 kfree(attrbuf); 10639 wiphy_unlock(&rdev->wiphy); 10640 return res; 10641 } 10642 10643 static bool nl80211_valid_wpa_versions(u32 wpa_versions) 10644 { 10645 return !(wpa_versions & ~(NL80211_WPA_VERSION_1 | 10646 NL80211_WPA_VERSION_2 | 10647 NL80211_WPA_VERSION_3)); 10648 } 10649 10650 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info) 10651 { 10652 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10653 struct net_device *dev = info->user_ptr[1]; 10654 struct ieee80211_channel *chan; 10655 const u8 *bssid, *ssid; 10656 int err, ssid_len; 10657 enum nl80211_auth_type auth_type; 10658 struct key_parse key; 10659 bool local_state_change; 10660 struct cfg80211_auth_request req = {}; 10661 u32 freq; 10662 10663 if (!info->attrs[NL80211_ATTR_MAC]) 10664 return -EINVAL; 10665 10666 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) 10667 return -EINVAL; 10668 10669 if (!info->attrs[NL80211_ATTR_SSID]) 10670 return -EINVAL; 10671 10672 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 10673 return -EINVAL; 10674 10675 err = nl80211_parse_key(info, &key); 10676 if (err) 10677 return err; 10678 10679 if (key.idx >= 0) { 10680 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) 10681 return -EINVAL; 10682 if (!key.p.key || !key.p.key_len) 10683 return -EINVAL; 10684 if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 || 10685 key.p.key_len != WLAN_KEY_LEN_WEP40) && 10686 (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 || 10687 key.p.key_len != WLAN_KEY_LEN_WEP104)) 10688 return -EINVAL; 10689 if (key.idx > 3) 10690 return -EINVAL; 10691 } else { 10692 key.p.key_len = 0; 10693 key.p.key = NULL; 10694 } 10695 10696 if (key.idx >= 0) { 10697 int i; 10698 bool ok = false; 10699 10700 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { 10701 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { 10702 ok = true; 10703 break; 10704 } 10705 } 10706 if (!ok) 10707 return -EINVAL; 10708 } 10709 10710 if (!rdev->ops->auth) 10711 return -EOPNOTSUPP; 10712 10713 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 10714 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 10715 return -EOPNOTSUPP; 10716 10717 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 10718 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); 10719 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 10720 freq += 10721 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 10722 10723 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); 10724 if (!chan) 10725 return -EINVAL; 10726 10727 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 10728 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 10729 10730 if (info->attrs[NL80211_ATTR_IE]) { 10731 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 10732 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 10733 } 10734 10735 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 10736 if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE)) 10737 return -EINVAL; 10738 10739 if ((auth_type == NL80211_AUTHTYPE_SAE || 10740 auth_type == NL80211_AUTHTYPE_FILS_SK || 10741 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 10742 auth_type == NL80211_AUTHTYPE_FILS_PK) && 10743 !info->attrs[NL80211_ATTR_AUTH_DATA]) 10744 return -EINVAL; 10745 10746 if (info->attrs[NL80211_ATTR_AUTH_DATA]) { 10747 if (auth_type != NL80211_AUTHTYPE_SAE && 10748 auth_type != NL80211_AUTHTYPE_FILS_SK && 10749 auth_type != NL80211_AUTHTYPE_FILS_SK_PFS && 10750 auth_type != NL80211_AUTHTYPE_FILS_PK) 10751 return -EINVAL; 10752 req.auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]); 10753 req.auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]); 10754 } 10755 10756 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 10757 10758 /* 10759 * Since we no longer track auth state, ignore 10760 * requests to only change local state. 10761 */ 10762 if (local_state_change) 10763 return 0; 10764 10765 req.auth_type = auth_type; 10766 req.key = key.p.key; 10767 req.key_len = key.p.key_len; 10768 req.key_idx = key.idx; 10769 req.link_id = nl80211_link_id_or_invalid(info->attrs); 10770 if (req.link_id >= 0) { 10771 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) 10772 return -EINVAL; 10773 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) 10774 return -EINVAL; 10775 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 10776 if (!is_valid_ether_addr(req.ap_mld_addr)) 10777 return -EINVAL; 10778 } 10779 10780 req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len, 10781 IEEE80211_BSS_TYPE_ESS, 10782 IEEE80211_PRIVACY_ANY); 10783 if (!req.bss) 10784 return -ENOENT; 10785 10786 err = cfg80211_mlme_auth(rdev, dev, &req); 10787 10788 cfg80211_put_bss(&rdev->wiphy, req.bss); 10789 10790 return err; 10791 } 10792 10793 static int validate_pae_over_nl80211(struct cfg80211_registered_device *rdev, 10794 struct genl_info *info) 10795 { 10796 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 10797 GENL_SET_ERR_MSG(info, "SOCKET_OWNER not set"); 10798 return -EINVAL; 10799 } 10800 10801 if (!rdev->ops->tx_control_port || 10802 !wiphy_ext_feature_isset(&rdev->wiphy, 10803 NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211)) 10804 return -EOPNOTSUPP; 10805 10806 return 0; 10807 } 10808 10809 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, 10810 struct genl_info *info, 10811 struct cfg80211_crypto_settings *settings, 10812 int cipher_limit) 10813 { 10814 memset(settings, 0, sizeof(*settings)); 10815 10816 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; 10817 10818 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { 10819 u16 proto; 10820 10821 proto = nla_get_u16( 10822 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); 10823 settings->control_port_ethertype = cpu_to_be16(proto); 10824 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && 10825 proto != ETH_P_PAE) 10826 return -EINVAL; 10827 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) 10828 settings->control_port_no_encrypt = true; 10829 } else 10830 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); 10831 10832 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 10833 int r = validate_pae_over_nl80211(rdev, info); 10834 10835 if (r < 0) 10836 return r; 10837 10838 settings->control_port_over_nl80211 = true; 10839 10840 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH]) 10841 settings->control_port_no_preauth = true; 10842 } 10843 10844 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { 10845 void *data; 10846 int len, i; 10847 10848 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 10849 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 10850 settings->n_ciphers_pairwise = len / sizeof(u32); 10851 10852 if (len % sizeof(u32)) 10853 return -EINVAL; 10854 10855 if (settings->n_ciphers_pairwise > cipher_limit) 10856 return -EINVAL; 10857 10858 memcpy(settings->ciphers_pairwise, data, len); 10859 10860 for (i = 0; i < settings->n_ciphers_pairwise; i++) 10861 if (!cfg80211_supported_cipher_suite( 10862 &rdev->wiphy, 10863 settings->ciphers_pairwise[i])) 10864 return -EINVAL; 10865 } 10866 10867 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { 10868 settings->cipher_group = 10869 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); 10870 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, 10871 settings->cipher_group)) 10872 return -EINVAL; 10873 } 10874 10875 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) { 10876 settings->wpa_versions = 10877 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); 10878 if (!nl80211_valid_wpa_versions(settings->wpa_versions)) 10879 return -EINVAL; 10880 } 10881 10882 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { 10883 void *data; 10884 int len; 10885 10886 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); 10887 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); 10888 settings->n_akm_suites = len / sizeof(u32); 10889 10890 if (len % sizeof(u32)) 10891 return -EINVAL; 10892 10893 if (settings->n_akm_suites > rdev->wiphy.max_num_akm_suites) 10894 return -EINVAL; 10895 10896 memcpy(settings->akm_suites, data, len); 10897 } 10898 10899 if (info->attrs[NL80211_ATTR_PMK]) { 10900 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN) 10901 return -EINVAL; 10902 if (!wiphy_ext_feature_isset(&rdev->wiphy, 10903 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK) && 10904 !wiphy_ext_feature_isset(&rdev->wiphy, 10905 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK)) 10906 return -EINVAL; 10907 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]); 10908 } 10909 10910 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) { 10911 if (!wiphy_ext_feature_isset(&rdev->wiphy, 10912 NL80211_EXT_FEATURE_SAE_OFFLOAD) && 10913 !wiphy_ext_feature_isset(&rdev->wiphy, 10914 NL80211_EXT_FEATURE_SAE_OFFLOAD_AP)) 10915 return -EINVAL; 10916 settings->sae_pwd = 10917 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]); 10918 settings->sae_pwd_len = 10919 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); 10920 } 10921 10922 if (info->attrs[NL80211_ATTR_SAE_PWE]) 10923 settings->sae_pwe = 10924 nla_get_u8(info->attrs[NL80211_ATTR_SAE_PWE]); 10925 else 10926 settings->sae_pwe = NL80211_SAE_PWE_UNSPECIFIED; 10927 10928 return 0; 10929 } 10930 10931 static struct cfg80211_bss *nl80211_assoc_bss(struct cfg80211_registered_device *rdev, 10932 const u8 *ssid, int ssid_len, 10933 struct nlattr **attrs, 10934 int assoc_link_id, int link_id) 10935 { 10936 struct ieee80211_channel *chan; 10937 struct cfg80211_bss *bss; 10938 const u8 *bssid; 10939 u32 freq, use_for = 0; 10940 10941 if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_WIPHY_FREQ]) 10942 return ERR_PTR(-EINVAL); 10943 10944 bssid = nla_data(attrs[NL80211_ATTR_MAC]); 10945 10946 freq = MHZ_TO_KHZ(nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ])); 10947 if (attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 10948 freq += nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 10949 10950 chan = nl80211_get_valid_chan(&rdev->wiphy, freq); 10951 if (!chan) 10952 return ERR_PTR(-EINVAL); 10953 10954 if (assoc_link_id >= 0) 10955 use_for = NL80211_BSS_USE_FOR_MLD_LINK; 10956 if (assoc_link_id == link_id) 10957 use_for |= NL80211_BSS_USE_FOR_NORMAL; 10958 10959 bss = __cfg80211_get_bss(&rdev->wiphy, chan, bssid, 10960 ssid, ssid_len, 10961 IEEE80211_BSS_TYPE_ESS, 10962 IEEE80211_PRIVACY_ANY, 10963 use_for); 10964 if (!bss) 10965 return ERR_PTR(-ENOENT); 10966 10967 return bss; 10968 } 10969 10970 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info) 10971 { 10972 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10973 struct net_device *dev = info->user_ptr[1]; 10974 struct cfg80211_assoc_request req = {}; 10975 struct nlattr **attrs = NULL; 10976 const u8 *ap_addr, *ssid; 10977 unsigned int link_id; 10978 int err, ssid_len; 10979 10980 if (dev->ieee80211_ptr->conn_owner_nlportid && 10981 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 10982 return -EPERM; 10983 10984 if (!info->attrs[NL80211_ATTR_SSID]) 10985 return -EINVAL; 10986 10987 if (!rdev->ops->assoc) 10988 return -EOPNOTSUPP; 10989 10990 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 10991 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 10992 return -EOPNOTSUPP; 10993 10994 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 10995 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 10996 10997 if (info->attrs[NL80211_ATTR_IE]) { 10998 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 10999 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 11000 11001 if (cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE, 11002 req.ie, req.ie_len)) { 11003 NL_SET_ERR_MSG_ATTR(info->extack, 11004 info->attrs[NL80211_ATTR_IE], 11005 "non-inheritance makes no sense"); 11006 return -EINVAL; 11007 } 11008 } 11009 11010 if (info->attrs[NL80211_ATTR_USE_MFP]) { 11011 enum nl80211_mfp mfp = 11012 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 11013 if (mfp == NL80211_MFP_REQUIRED) 11014 req.use_mfp = true; 11015 else if (mfp != NL80211_MFP_NO) 11016 return -EINVAL; 11017 } 11018 11019 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 11020 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 11021 11022 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 11023 req.flags |= ASSOC_REQ_DISABLE_HT; 11024 11025 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 11026 memcpy(&req.ht_capa_mask, 11027 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 11028 sizeof(req.ht_capa_mask)); 11029 11030 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 11031 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 11032 return -EINVAL; 11033 memcpy(&req.ht_capa, 11034 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 11035 sizeof(req.ht_capa)); 11036 } 11037 11038 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 11039 req.flags |= ASSOC_REQ_DISABLE_VHT; 11040 11041 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) 11042 req.flags |= ASSOC_REQ_DISABLE_HE; 11043 11044 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) 11045 req.flags |= ASSOC_REQ_DISABLE_EHT; 11046 11047 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 11048 memcpy(&req.vht_capa_mask, 11049 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 11050 sizeof(req.vht_capa_mask)); 11051 11052 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 11053 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 11054 return -EINVAL; 11055 memcpy(&req.vht_capa, 11056 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 11057 sizeof(req.vht_capa)); 11058 } 11059 11060 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { 11061 if (!((rdev->wiphy.features & 11062 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) && 11063 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && 11064 !wiphy_ext_feature_isset(&rdev->wiphy, 11065 NL80211_EXT_FEATURE_RRM)) 11066 return -EINVAL; 11067 req.flags |= ASSOC_REQ_USE_RRM; 11068 } 11069 11070 if (info->attrs[NL80211_ATTR_FILS_KEK]) { 11071 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); 11072 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); 11073 if (!info->attrs[NL80211_ATTR_FILS_NONCES]) 11074 return -EINVAL; 11075 req.fils_nonces = 11076 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); 11077 } 11078 11079 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) { 11080 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY]) 11081 return -EINVAL; 11082 memcpy(&req.s1g_capa_mask, 11083 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]), 11084 sizeof(req.s1g_capa_mask)); 11085 } 11086 11087 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) { 11088 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) 11089 return -EINVAL; 11090 memcpy(&req.s1g_capa, 11091 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]), 11092 sizeof(req.s1g_capa)); 11093 } 11094 11095 req.link_id = nl80211_link_id_or_invalid(info->attrs); 11096 11097 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { 11098 unsigned int attrsize = NUM_NL80211_ATTR * sizeof(*attrs); 11099 struct nlattr *link; 11100 int rem = 0; 11101 11102 if (req.link_id < 0) 11103 return -EINVAL; 11104 11105 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_MLO)) 11106 return -EINVAL; 11107 11108 if (info->attrs[NL80211_ATTR_MAC] || 11109 info->attrs[NL80211_ATTR_WIPHY_FREQ] || 11110 !info->attrs[NL80211_ATTR_MLD_ADDR]) 11111 return -EINVAL; 11112 11113 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 11114 ap_addr = req.ap_mld_addr; 11115 11116 attrs = kzalloc(attrsize, GFP_KERNEL); 11117 if (!attrs) 11118 return -ENOMEM; 11119 11120 nla_for_each_nested(link, 11121 info->attrs[NL80211_ATTR_MLO_LINKS], 11122 rem) { 11123 memset(attrs, 0, attrsize); 11124 11125 nla_parse_nested(attrs, NL80211_ATTR_MAX, 11126 link, NULL, NULL); 11127 11128 if (!attrs[NL80211_ATTR_MLO_LINK_ID]) { 11129 err = -EINVAL; 11130 NL_SET_BAD_ATTR(info->extack, link); 11131 goto free; 11132 } 11133 11134 link_id = nla_get_u8(attrs[NL80211_ATTR_MLO_LINK_ID]); 11135 /* cannot use the same link ID again */ 11136 if (req.links[link_id].bss) { 11137 err = -EINVAL; 11138 NL_SET_BAD_ATTR(info->extack, link); 11139 goto free; 11140 } 11141 req.links[link_id].bss = 11142 nl80211_assoc_bss(rdev, ssid, ssid_len, attrs, 11143 req.link_id, link_id); 11144 if (IS_ERR(req.links[link_id].bss)) { 11145 err = PTR_ERR(req.links[link_id].bss); 11146 req.links[link_id].bss = NULL; 11147 NL_SET_ERR_MSG_ATTR(info->extack, 11148 link, "Error fetching BSS for link"); 11149 goto free; 11150 } 11151 11152 if (attrs[NL80211_ATTR_IE]) { 11153 req.links[link_id].elems = 11154 nla_data(attrs[NL80211_ATTR_IE]); 11155 req.links[link_id].elems_len = 11156 nla_len(attrs[NL80211_ATTR_IE]); 11157 11158 if (cfg80211_find_elem(WLAN_EID_FRAGMENT, 11159 req.links[link_id].elems, 11160 req.links[link_id].elems_len)) { 11161 NL_SET_ERR_MSG_ATTR(info->extack, 11162 attrs[NL80211_ATTR_IE], 11163 "cannot deal with fragmentation"); 11164 err = -EINVAL; 11165 goto free; 11166 } 11167 11168 if (cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE, 11169 req.links[link_id].elems, 11170 req.links[link_id].elems_len)) { 11171 NL_SET_ERR_MSG_ATTR(info->extack, 11172 attrs[NL80211_ATTR_IE], 11173 "cannot deal with non-inheritance"); 11174 err = -EINVAL; 11175 goto free; 11176 } 11177 } 11178 11179 req.links[link_id].disabled = 11180 nla_get_flag(attrs[NL80211_ATTR_MLO_LINK_DISABLED]); 11181 } 11182 11183 if (!req.links[req.link_id].bss) { 11184 err = -EINVAL; 11185 goto free; 11186 } 11187 11188 if (req.links[req.link_id].elems_len) { 11189 GENL_SET_ERR_MSG(info, 11190 "cannot have per-link elems on assoc link"); 11191 err = -EINVAL; 11192 goto free; 11193 } 11194 11195 if (req.links[req.link_id].disabled) { 11196 GENL_SET_ERR_MSG(info, 11197 "cannot have assoc link disabled"); 11198 err = -EINVAL; 11199 goto free; 11200 } 11201 11202 kfree(attrs); 11203 attrs = NULL; 11204 } else { 11205 if (req.link_id >= 0) 11206 return -EINVAL; 11207 11208 req.bss = nl80211_assoc_bss(rdev, ssid, ssid_len, info->attrs, 11209 -1, -1); 11210 if (IS_ERR(req.bss)) 11211 return PTR_ERR(req.bss); 11212 ap_addr = req.bss->bssid; 11213 } 11214 11215 err = nl80211_crypto_settings(rdev, info, &req.crypto, 1); 11216 if (!err) { 11217 struct nlattr *link; 11218 int rem = 0; 11219 11220 err = cfg80211_mlme_assoc(rdev, dev, &req); 11221 11222 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 11223 dev->ieee80211_ptr->conn_owner_nlportid = 11224 info->snd_portid; 11225 memcpy(dev->ieee80211_ptr->disconnect_bssid, 11226 ap_addr, ETH_ALEN); 11227 } 11228 11229 /* Report error from first problematic link */ 11230 if (info->attrs[NL80211_ATTR_MLO_LINKS]) { 11231 nla_for_each_nested(link, 11232 info->attrs[NL80211_ATTR_MLO_LINKS], 11233 rem) { 11234 struct nlattr *link_id_attr = 11235 nla_find_nested(link, NL80211_ATTR_MLO_LINK_ID); 11236 11237 if (!link_id_attr) 11238 continue; 11239 11240 link_id = nla_get_u8(link_id_attr); 11241 11242 if (link_id == req.link_id) 11243 continue; 11244 11245 if (!req.links[link_id].error || 11246 WARN_ON(req.links[link_id].error > 0)) 11247 continue; 11248 11249 WARN_ON(err >= 0); 11250 11251 NL_SET_BAD_ATTR(info->extack, link); 11252 err = req.links[link_id].error; 11253 break; 11254 } 11255 } 11256 } 11257 11258 free: 11259 for (link_id = 0; link_id < ARRAY_SIZE(req.links); link_id++) 11260 cfg80211_put_bss(&rdev->wiphy, req.links[link_id].bss); 11261 cfg80211_put_bss(&rdev->wiphy, req.bss); 11262 kfree(attrs); 11263 11264 return err; 11265 } 11266 11267 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info) 11268 { 11269 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11270 struct net_device *dev = info->user_ptr[1]; 11271 const u8 *ie = NULL, *bssid; 11272 int ie_len = 0; 11273 u16 reason_code; 11274 bool local_state_change; 11275 11276 if (dev->ieee80211_ptr->conn_owner_nlportid && 11277 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 11278 return -EPERM; 11279 11280 if (!info->attrs[NL80211_ATTR_MAC]) 11281 return -EINVAL; 11282 11283 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 11284 return -EINVAL; 11285 11286 if (!rdev->ops->deauth) 11287 return -EOPNOTSUPP; 11288 11289 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 11290 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 11291 return -EOPNOTSUPP; 11292 11293 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 11294 11295 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 11296 if (reason_code == 0) { 11297 /* Reason Code 0 is reserved */ 11298 return -EINVAL; 11299 } 11300 11301 if (info->attrs[NL80211_ATTR_IE]) { 11302 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 11303 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 11304 } 11305 11306 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 11307 11308 return cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code, 11309 local_state_change); 11310 } 11311 11312 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) 11313 { 11314 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11315 struct net_device *dev = info->user_ptr[1]; 11316 const u8 *ie = NULL, *bssid; 11317 int ie_len = 0; 11318 u16 reason_code; 11319 bool local_state_change; 11320 11321 if (dev->ieee80211_ptr->conn_owner_nlportid && 11322 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 11323 return -EPERM; 11324 11325 if (!info->attrs[NL80211_ATTR_MAC]) 11326 return -EINVAL; 11327 11328 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 11329 return -EINVAL; 11330 11331 if (!rdev->ops->disassoc) 11332 return -EOPNOTSUPP; 11333 11334 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 11335 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 11336 return -EOPNOTSUPP; 11337 11338 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 11339 11340 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 11341 if (reason_code == 0) { 11342 /* Reason Code 0 is reserved */ 11343 return -EINVAL; 11344 } 11345 11346 if (info->attrs[NL80211_ATTR_IE]) { 11347 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 11348 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 11349 } 11350 11351 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 11352 11353 return cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code, 11354 local_state_change); 11355 } 11356 11357 static bool 11358 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev, 11359 int mcast_rate[NUM_NL80211_BANDS], 11360 int rateval) 11361 { 11362 struct wiphy *wiphy = &rdev->wiphy; 11363 bool found = false; 11364 int band, i; 11365 11366 for (band = 0; band < NUM_NL80211_BANDS; band++) { 11367 struct ieee80211_supported_band *sband; 11368 11369 sband = wiphy->bands[band]; 11370 if (!sband) 11371 continue; 11372 11373 for (i = 0; i < sband->n_bitrates; i++) { 11374 if (sband->bitrates[i].bitrate == rateval) { 11375 mcast_rate[band] = i + 1; 11376 found = true; 11377 break; 11378 } 11379 } 11380 } 11381 11382 return found; 11383 } 11384 11385 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info) 11386 { 11387 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11388 struct net_device *dev = info->user_ptr[1]; 11389 struct cfg80211_ibss_params ibss; 11390 struct wiphy *wiphy; 11391 struct cfg80211_cached_keys *connkeys = NULL; 11392 int err; 11393 11394 memset(&ibss, 0, sizeof(ibss)); 11395 11396 if (!info->attrs[NL80211_ATTR_SSID] || 11397 !nla_len(info->attrs[NL80211_ATTR_SSID])) 11398 return -EINVAL; 11399 11400 ibss.beacon_interval = 100; 11401 11402 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) 11403 ibss.beacon_interval = 11404 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 11405 11406 err = cfg80211_validate_beacon_int(rdev, NL80211_IFTYPE_ADHOC, 11407 ibss.beacon_interval); 11408 if (err) 11409 return err; 11410 11411 if (!rdev->ops->join_ibss) 11412 return -EOPNOTSUPP; 11413 11414 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 11415 return -EOPNOTSUPP; 11416 11417 wiphy = &rdev->wiphy; 11418 11419 if (info->attrs[NL80211_ATTR_MAC]) { 11420 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 11421 11422 if (!is_valid_ether_addr(ibss.bssid)) 11423 return -EINVAL; 11424 } 11425 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 11426 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 11427 11428 if (info->attrs[NL80211_ATTR_IE]) { 11429 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 11430 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 11431 } 11432 11433 err = nl80211_parse_chandef(rdev, info, &ibss.chandef); 11434 if (err) 11435 return err; 11436 11437 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef, 11438 NL80211_IFTYPE_ADHOC)) 11439 return -EINVAL; 11440 11441 switch (ibss.chandef.width) { 11442 case NL80211_CHAN_WIDTH_5: 11443 case NL80211_CHAN_WIDTH_10: 11444 case NL80211_CHAN_WIDTH_20_NOHT: 11445 break; 11446 case NL80211_CHAN_WIDTH_20: 11447 case NL80211_CHAN_WIDTH_40: 11448 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) 11449 return -EINVAL; 11450 break; 11451 case NL80211_CHAN_WIDTH_80: 11452 case NL80211_CHAN_WIDTH_80P80: 11453 case NL80211_CHAN_WIDTH_160: 11454 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) 11455 return -EINVAL; 11456 if (!wiphy_ext_feature_isset(&rdev->wiphy, 11457 NL80211_EXT_FEATURE_VHT_IBSS)) 11458 return -EINVAL; 11459 break; 11460 case NL80211_CHAN_WIDTH_320: 11461 return -EINVAL; 11462 default: 11463 return -EINVAL; 11464 } 11465 11466 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; 11467 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 11468 11469 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 11470 u8 *rates = 11471 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 11472 int n_rates = 11473 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 11474 struct ieee80211_supported_band *sband = 11475 wiphy->bands[ibss.chandef.chan->band]; 11476 11477 err = ieee80211_get_ratemask(sband, rates, n_rates, 11478 &ibss.basic_rates); 11479 if (err) 11480 return err; 11481 } 11482 11483 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 11484 memcpy(&ibss.ht_capa_mask, 11485 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 11486 sizeof(ibss.ht_capa_mask)); 11487 11488 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 11489 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 11490 return -EINVAL; 11491 memcpy(&ibss.ht_capa, 11492 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 11493 sizeof(ibss.ht_capa)); 11494 } 11495 11496 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 11497 !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate, 11498 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 11499 return -EINVAL; 11500 11501 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { 11502 bool no_ht = false; 11503 11504 connkeys = nl80211_parse_connkeys(rdev, info, &no_ht); 11505 if (IS_ERR(connkeys)) 11506 return PTR_ERR(connkeys); 11507 11508 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) && 11509 no_ht) { 11510 kfree_sensitive(connkeys); 11511 return -EINVAL; 11512 } 11513 } 11514 11515 ibss.control_port = 11516 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); 11517 11518 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 11519 int r = validate_pae_over_nl80211(rdev, info); 11520 11521 if (r < 0) { 11522 kfree_sensitive(connkeys); 11523 return r; 11524 } 11525 11526 ibss.control_port_over_nl80211 = true; 11527 } 11528 11529 ibss.userspace_handles_dfs = 11530 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 11531 11532 err = __cfg80211_join_ibss(rdev, dev, &ibss, connkeys); 11533 if (err) 11534 kfree_sensitive(connkeys); 11535 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 11536 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 11537 11538 return err; 11539 } 11540 11541 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info) 11542 { 11543 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11544 struct net_device *dev = info->user_ptr[1]; 11545 11546 if (!rdev->ops->leave_ibss) 11547 return -EOPNOTSUPP; 11548 11549 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 11550 return -EOPNOTSUPP; 11551 11552 return cfg80211_leave_ibss(rdev, dev, false); 11553 } 11554 11555 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info) 11556 { 11557 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11558 struct net_device *dev = info->user_ptr[1]; 11559 int mcast_rate[NUM_NL80211_BANDS]; 11560 u32 nla_rate; 11561 11562 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && 11563 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && 11564 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) 11565 return -EOPNOTSUPP; 11566 11567 if (!rdev->ops->set_mcast_rate) 11568 return -EOPNOTSUPP; 11569 11570 memset(mcast_rate, 0, sizeof(mcast_rate)); 11571 11572 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) 11573 return -EINVAL; 11574 11575 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); 11576 if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate)) 11577 return -EINVAL; 11578 11579 return rdev_set_mcast_rate(rdev, dev, mcast_rate); 11580 } 11581 11582 static struct sk_buff * 11583 __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev, 11584 struct wireless_dev *wdev, int approxlen, 11585 u32 portid, u32 seq, enum nl80211_commands cmd, 11586 enum nl80211_attrs attr, 11587 const struct nl80211_vendor_cmd_info *info, 11588 gfp_t gfp) 11589 { 11590 struct sk_buff *skb; 11591 void *hdr; 11592 struct nlattr *data; 11593 11594 skb = nlmsg_new(approxlen + 100, gfp); 11595 if (!skb) 11596 return NULL; 11597 11598 hdr = nl80211hdr_put(skb, portid, seq, 0, cmd); 11599 if (!hdr) { 11600 kfree_skb(skb); 11601 return NULL; 11602 } 11603 11604 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 11605 goto nla_put_failure; 11606 11607 if (info) { 11608 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID, 11609 info->vendor_id)) 11610 goto nla_put_failure; 11611 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD, 11612 info->subcmd)) 11613 goto nla_put_failure; 11614 } 11615 11616 if (wdev) { 11617 if (nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 11618 wdev_id(wdev), NL80211_ATTR_PAD)) 11619 goto nla_put_failure; 11620 if (wdev->netdev && 11621 nla_put_u32(skb, NL80211_ATTR_IFINDEX, 11622 wdev->netdev->ifindex)) 11623 goto nla_put_failure; 11624 } 11625 11626 data = nla_nest_start_noflag(skb, attr); 11627 if (!data) 11628 goto nla_put_failure; 11629 11630 ((void **)skb->cb)[0] = rdev; 11631 ((void **)skb->cb)[1] = hdr; 11632 ((void **)skb->cb)[2] = data; 11633 11634 return skb; 11635 11636 nla_put_failure: 11637 kfree_skb(skb); 11638 return NULL; 11639 } 11640 11641 struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy, 11642 struct wireless_dev *wdev, 11643 enum nl80211_commands cmd, 11644 enum nl80211_attrs attr, 11645 unsigned int portid, 11646 int vendor_event_idx, 11647 int approxlen, gfp_t gfp) 11648 { 11649 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 11650 const struct nl80211_vendor_cmd_info *info; 11651 11652 switch (cmd) { 11653 case NL80211_CMD_TESTMODE: 11654 if (WARN_ON(vendor_event_idx != -1)) 11655 return NULL; 11656 info = NULL; 11657 break; 11658 case NL80211_CMD_VENDOR: 11659 if (WARN_ON(vendor_event_idx < 0 || 11660 vendor_event_idx >= wiphy->n_vendor_events)) 11661 return NULL; 11662 info = &wiphy->vendor_events[vendor_event_idx]; 11663 break; 11664 default: 11665 WARN_ON(1); 11666 return NULL; 11667 } 11668 11669 return __cfg80211_alloc_vendor_skb(rdev, wdev, approxlen, portid, 0, 11670 cmd, attr, info, gfp); 11671 } 11672 EXPORT_SYMBOL(__cfg80211_alloc_event_skb); 11673 11674 void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp) 11675 { 11676 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 11677 void *hdr = ((void **)skb->cb)[1]; 11678 struct nlmsghdr *nlhdr = nlmsg_hdr(skb); 11679 struct nlattr *data = ((void **)skb->cb)[2]; 11680 enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE; 11681 11682 /* clear CB data for netlink core to own from now on */ 11683 memset(skb->cb, 0, sizeof(skb->cb)); 11684 11685 nla_nest_end(skb, data); 11686 genlmsg_end(skb, hdr); 11687 11688 if (nlhdr->nlmsg_pid) { 11689 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb, 11690 nlhdr->nlmsg_pid); 11691 } else { 11692 if (data->nla_type == NL80211_ATTR_VENDOR_DATA) 11693 mcgrp = NL80211_MCGRP_VENDOR; 11694 11695 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 11696 skb, 0, mcgrp, gfp); 11697 } 11698 } 11699 EXPORT_SYMBOL(__cfg80211_send_event_skb); 11700 11701 #ifdef CONFIG_NL80211_TESTMODE 11702 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) 11703 { 11704 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11705 struct wireless_dev *wdev; 11706 int err; 11707 11708 lockdep_assert_held(&rdev->wiphy.mtx); 11709 11710 wdev = __cfg80211_wdev_from_attrs(rdev, genl_info_net(info), 11711 info->attrs); 11712 11713 if (!rdev->ops->testmode_cmd) 11714 return -EOPNOTSUPP; 11715 11716 if (IS_ERR(wdev)) { 11717 err = PTR_ERR(wdev); 11718 if (err != -EINVAL) 11719 return err; 11720 wdev = NULL; 11721 } else if (wdev->wiphy != &rdev->wiphy) { 11722 return -EINVAL; 11723 } 11724 11725 if (!info->attrs[NL80211_ATTR_TESTDATA]) 11726 return -EINVAL; 11727 11728 rdev->cur_cmd_info = info; 11729 err = rdev_testmode_cmd(rdev, wdev, 11730 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), 11731 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); 11732 rdev->cur_cmd_info = NULL; 11733 11734 return err; 11735 } 11736 11737 static int nl80211_testmode_dump(struct sk_buff *skb, 11738 struct netlink_callback *cb) 11739 { 11740 struct cfg80211_registered_device *rdev; 11741 struct nlattr **attrbuf = NULL; 11742 int err; 11743 long phy_idx; 11744 void *data = NULL; 11745 int data_len = 0; 11746 11747 rtnl_lock(); 11748 11749 if (cb->args[0]) { 11750 /* 11751 * 0 is a valid index, but not valid for args[0], 11752 * so we need to offset by 1. 11753 */ 11754 phy_idx = cb->args[0] - 1; 11755 11756 rdev = cfg80211_rdev_by_wiphy_idx(phy_idx); 11757 if (!rdev) { 11758 err = -ENOENT; 11759 goto out_err; 11760 } 11761 } else { 11762 attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf), 11763 GFP_KERNEL); 11764 if (!attrbuf) { 11765 err = -ENOMEM; 11766 goto out_err; 11767 } 11768 11769 err = nlmsg_parse_deprecated(cb->nlh, 11770 GENL_HDRLEN + nl80211_fam.hdrsize, 11771 attrbuf, nl80211_fam.maxattr, 11772 nl80211_policy, NULL); 11773 if (err) 11774 goto out_err; 11775 11776 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); 11777 if (IS_ERR(rdev)) { 11778 err = PTR_ERR(rdev); 11779 goto out_err; 11780 } 11781 phy_idx = rdev->wiphy_idx; 11782 11783 if (attrbuf[NL80211_ATTR_TESTDATA]) 11784 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; 11785 } 11786 11787 if (cb->args[1]) { 11788 data = nla_data((void *)cb->args[1]); 11789 data_len = nla_len((void *)cb->args[1]); 11790 } 11791 11792 if (!rdev->ops->testmode_dump) { 11793 err = -EOPNOTSUPP; 11794 goto out_err; 11795 } 11796 11797 while (1) { 11798 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 11799 cb->nlh->nlmsg_seq, NLM_F_MULTI, 11800 NL80211_CMD_TESTMODE); 11801 struct nlattr *tmdata; 11802 11803 if (!hdr) 11804 break; 11805 11806 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) { 11807 genlmsg_cancel(skb, hdr); 11808 break; 11809 } 11810 11811 tmdata = nla_nest_start_noflag(skb, NL80211_ATTR_TESTDATA); 11812 if (!tmdata) { 11813 genlmsg_cancel(skb, hdr); 11814 break; 11815 } 11816 err = rdev_testmode_dump(rdev, skb, cb, data, data_len); 11817 nla_nest_end(skb, tmdata); 11818 11819 if (err == -ENOBUFS || err == -ENOENT) { 11820 genlmsg_cancel(skb, hdr); 11821 break; 11822 } else if (err) { 11823 genlmsg_cancel(skb, hdr); 11824 goto out_err; 11825 } 11826 11827 genlmsg_end(skb, hdr); 11828 } 11829 11830 err = skb->len; 11831 /* see above */ 11832 cb->args[0] = phy_idx + 1; 11833 out_err: 11834 kfree(attrbuf); 11835 rtnl_unlock(); 11836 return err; 11837 } 11838 #endif 11839 11840 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info) 11841 { 11842 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11843 struct net_device *dev = info->user_ptr[1]; 11844 struct cfg80211_connect_params connect; 11845 struct wiphy *wiphy; 11846 struct cfg80211_cached_keys *connkeys = NULL; 11847 u32 freq = 0; 11848 int err; 11849 11850 memset(&connect, 0, sizeof(connect)); 11851 11852 if (!info->attrs[NL80211_ATTR_SSID] || 11853 !nla_len(info->attrs[NL80211_ATTR_SSID])) 11854 return -EINVAL; 11855 11856 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 11857 connect.auth_type = 11858 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 11859 if (!nl80211_valid_auth_type(rdev, connect.auth_type, 11860 NL80211_CMD_CONNECT)) 11861 return -EINVAL; 11862 } else 11863 connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC; 11864 11865 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; 11866 11867 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] && 11868 !wiphy_ext_feature_isset(&rdev->wiphy, 11869 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 11870 return -EINVAL; 11871 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS]; 11872 11873 err = nl80211_crypto_settings(rdev, info, &connect.crypto, 11874 NL80211_MAX_NR_CIPHER_SUITES); 11875 if (err) 11876 return err; 11877 11878 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 11879 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 11880 return -EOPNOTSUPP; 11881 11882 wiphy = &rdev->wiphy; 11883 11884 connect.bg_scan_period = -1; 11885 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && 11886 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { 11887 connect.bg_scan_period = 11888 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); 11889 } 11890 11891 if (info->attrs[NL80211_ATTR_MAC]) 11892 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 11893 else if (info->attrs[NL80211_ATTR_MAC_HINT]) 11894 connect.bssid_hint = 11895 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]); 11896 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 11897 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 11898 11899 if (info->attrs[NL80211_ATTR_IE]) { 11900 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 11901 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 11902 } 11903 11904 if (info->attrs[NL80211_ATTR_USE_MFP]) { 11905 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 11906 if (connect.mfp == NL80211_MFP_OPTIONAL && 11907 !wiphy_ext_feature_isset(&rdev->wiphy, 11908 NL80211_EXT_FEATURE_MFP_OPTIONAL)) 11909 return -EOPNOTSUPP; 11910 } else { 11911 connect.mfp = NL80211_MFP_NO; 11912 } 11913 11914 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 11915 connect.prev_bssid = 11916 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 11917 11918 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) 11919 freq = MHZ_TO_KHZ(nla_get_u32( 11920 info->attrs[NL80211_ATTR_WIPHY_FREQ])); 11921 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]) 11922 freq += 11923 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]); 11924 11925 if (freq) { 11926 connect.channel = nl80211_get_valid_chan(wiphy, freq); 11927 if (!connect.channel) 11928 return -EINVAL; 11929 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) { 11930 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]); 11931 freq = MHZ_TO_KHZ(freq); 11932 connect.channel_hint = nl80211_get_valid_chan(wiphy, freq); 11933 if (!connect.channel_hint) 11934 return -EINVAL; 11935 } 11936 11937 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { 11938 connect.edmg.channels = 11939 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); 11940 11941 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) 11942 connect.edmg.bw_config = 11943 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); 11944 } 11945 11946 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { 11947 connkeys = nl80211_parse_connkeys(rdev, info, NULL); 11948 if (IS_ERR(connkeys)) 11949 return PTR_ERR(connkeys); 11950 } 11951 11952 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 11953 connect.flags |= ASSOC_REQ_DISABLE_HT; 11954 11955 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 11956 memcpy(&connect.ht_capa_mask, 11957 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 11958 sizeof(connect.ht_capa_mask)); 11959 11960 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 11961 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { 11962 kfree_sensitive(connkeys); 11963 return -EINVAL; 11964 } 11965 memcpy(&connect.ht_capa, 11966 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 11967 sizeof(connect.ht_capa)); 11968 } 11969 11970 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 11971 connect.flags |= ASSOC_REQ_DISABLE_VHT; 11972 11973 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE])) 11974 connect.flags |= ASSOC_REQ_DISABLE_HE; 11975 11976 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT])) 11977 connect.flags |= ASSOC_REQ_DISABLE_EHT; 11978 11979 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 11980 memcpy(&connect.vht_capa_mask, 11981 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 11982 sizeof(connect.vht_capa_mask)); 11983 11984 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 11985 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { 11986 kfree_sensitive(connkeys); 11987 return -EINVAL; 11988 } 11989 memcpy(&connect.vht_capa, 11990 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 11991 sizeof(connect.vht_capa)); 11992 } 11993 11994 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { 11995 if (!((rdev->wiphy.features & 11996 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) && 11997 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && 11998 !wiphy_ext_feature_isset(&rdev->wiphy, 11999 NL80211_EXT_FEATURE_RRM)) { 12000 kfree_sensitive(connkeys); 12001 return -EINVAL; 12002 } 12003 connect.flags |= ASSOC_REQ_USE_RRM; 12004 } 12005 12006 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); 12007 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { 12008 kfree_sensitive(connkeys); 12009 return -EOPNOTSUPP; 12010 } 12011 12012 if (info->attrs[NL80211_ATTR_BSS_SELECT]) { 12013 /* bss selection makes no sense if bssid is set */ 12014 if (connect.bssid) { 12015 kfree_sensitive(connkeys); 12016 return -EINVAL; 12017 } 12018 12019 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT], 12020 wiphy, &connect.bss_select); 12021 if (err) { 12022 kfree_sensitive(connkeys); 12023 return err; 12024 } 12025 } 12026 12027 if (wiphy_ext_feature_isset(&rdev->wiphy, 12028 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) && 12029 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && 12030 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && 12031 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && 12032 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 12033 connect.fils_erp_username = 12034 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 12035 connect.fils_erp_username_len = 12036 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 12037 connect.fils_erp_realm = 12038 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 12039 connect.fils_erp_realm_len = 12040 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 12041 connect.fils_erp_next_seq_num = 12042 nla_get_u16( 12043 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); 12044 connect.fils_erp_rrk = 12045 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 12046 connect.fils_erp_rrk_len = 12047 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 12048 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || 12049 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || 12050 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || 12051 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 12052 kfree_sensitive(connkeys); 12053 return -EINVAL; 12054 } 12055 12056 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) { 12057 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 12058 kfree_sensitive(connkeys); 12059 GENL_SET_ERR_MSG(info, 12060 "external auth requires connection ownership"); 12061 return -EINVAL; 12062 } 12063 connect.flags |= CONNECT_REQ_EXTERNAL_AUTH_SUPPORT; 12064 } 12065 12066 if (nla_get_flag(info->attrs[NL80211_ATTR_MLO_SUPPORT])) 12067 connect.flags |= CONNECT_REQ_MLO_SUPPORT; 12068 12069 err = cfg80211_connect(rdev, dev, &connect, connkeys, 12070 connect.prev_bssid); 12071 if (err) 12072 kfree_sensitive(connkeys); 12073 12074 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 12075 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 12076 if (connect.bssid) 12077 memcpy(dev->ieee80211_ptr->disconnect_bssid, 12078 connect.bssid, ETH_ALEN); 12079 else 12080 eth_zero_addr(dev->ieee80211_ptr->disconnect_bssid); 12081 } 12082 12083 return err; 12084 } 12085 12086 static int nl80211_update_connect_params(struct sk_buff *skb, 12087 struct genl_info *info) 12088 { 12089 struct cfg80211_connect_params connect = {}; 12090 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12091 struct net_device *dev = info->user_ptr[1]; 12092 struct wireless_dev *wdev = dev->ieee80211_ptr; 12093 bool fils_sk_offload; 12094 u32 auth_type; 12095 u32 changed = 0; 12096 12097 if (!rdev->ops->update_connect_params) 12098 return -EOPNOTSUPP; 12099 12100 if (info->attrs[NL80211_ATTR_IE]) { 12101 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 12102 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 12103 changed |= UPDATE_ASSOC_IES; 12104 } 12105 12106 fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy, 12107 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD); 12108 12109 /* 12110 * when driver supports fils-sk offload all attributes must be 12111 * provided. So the else covers "fils-sk-not-all" and 12112 * "no-fils-sk-any". 12113 */ 12114 if (fils_sk_offload && 12115 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && 12116 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && 12117 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && 12118 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 12119 connect.fils_erp_username = 12120 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 12121 connect.fils_erp_username_len = 12122 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 12123 connect.fils_erp_realm = 12124 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 12125 connect.fils_erp_realm_len = 12126 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 12127 connect.fils_erp_next_seq_num = 12128 nla_get_u16( 12129 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); 12130 connect.fils_erp_rrk = 12131 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 12132 connect.fils_erp_rrk_len = 12133 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 12134 changed |= UPDATE_FILS_ERP_INFO; 12135 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || 12136 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || 12137 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || 12138 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 12139 return -EINVAL; 12140 } 12141 12142 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 12143 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 12144 if (!nl80211_valid_auth_type(rdev, auth_type, 12145 NL80211_CMD_CONNECT)) 12146 return -EINVAL; 12147 12148 if (auth_type == NL80211_AUTHTYPE_FILS_SK && 12149 fils_sk_offload && !(changed & UPDATE_FILS_ERP_INFO)) 12150 return -EINVAL; 12151 12152 connect.auth_type = auth_type; 12153 changed |= UPDATE_AUTH_TYPE; 12154 } 12155 12156 if (!wdev->connected) 12157 return -ENOLINK; 12158 12159 return rdev_update_connect_params(rdev, dev, &connect, changed); 12160 } 12161 12162 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info) 12163 { 12164 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12165 struct net_device *dev = info->user_ptr[1]; 12166 u16 reason; 12167 12168 if (dev->ieee80211_ptr->conn_owner_nlportid && 12169 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 12170 return -EPERM; 12171 12172 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 12173 reason = WLAN_REASON_DEAUTH_LEAVING; 12174 else 12175 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 12176 12177 if (reason == 0) 12178 return -EINVAL; 12179 12180 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 12181 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 12182 return -EOPNOTSUPP; 12183 12184 return cfg80211_disconnect(rdev, dev, reason, true); 12185 } 12186 12187 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info) 12188 { 12189 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12190 struct net *net; 12191 int err; 12192 12193 if (info->attrs[NL80211_ATTR_PID]) { 12194 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); 12195 12196 net = get_net_ns_by_pid(pid); 12197 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) { 12198 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]); 12199 12200 net = get_net_ns_by_fd(fd); 12201 } else { 12202 return -EINVAL; 12203 } 12204 12205 if (IS_ERR(net)) 12206 return PTR_ERR(net); 12207 12208 err = 0; 12209 12210 /* check if anything to do */ 12211 if (!net_eq(wiphy_net(&rdev->wiphy), net)) 12212 err = cfg80211_switch_netns(rdev, net); 12213 12214 put_net(net); 12215 return err; 12216 } 12217 12218 static int nl80211_set_pmksa(struct sk_buff *skb, struct genl_info *info) 12219 { 12220 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12221 struct net_device *dev = info->user_ptr[1]; 12222 struct cfg80211_pmksa pmksa; 12223 bool ap_pmksa_caching_support = false; 12224 12225 memset(&pmksa, 0, sizeof(struct cfg80211_pmksa)); 12226 12227 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, 12228 NL80211_EXT_FEATURE_AP_PMKSA_CACHING); 12229 12230 if (!info->attrs[NL80211_ATTR_PMKID]) 12231 return -EINVAL; 12232 12233 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 12234 12235 if (info->attrs[NL80211_ATTR_MAC]) { 12236 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 12237 } else if (info->attrs[NL80211_ATTR_SSID] && 12238 info->attrs[NL80211_ATTR_FILS_CACHE_ID] && 12239 info->attrs[NL80211_ATTR_PMK]) { 12240 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 12241 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 12242 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); 12243 } else { 12244 return -EINVAL; 12245 } 12246 12247 if (info->attrs[NL80211_ATTR_PMK]) { 12248 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); 12249 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); 12250 } 12251 12252 if (info->attrs[NL80211_ATTR_PMK_LIFETIME]) 12253 pmksa.pmk_lifetime = 12254 nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]); 12255 12256 if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]) 12257 pmksa.pmk_reauth_threshold = 12258 nla_get_u8(info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]); 12259 12260 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 12261 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && 12262 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || 12263 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && 12264 ap_pmksa_caching_support)) 12265 return -EOPNOTSUPP; 12266 12267 if (!rdev->ops->set_pmksa) 12268 return -EOPNOTSUPP; 12269 12270 return rdev_set_pmksa(rdev, dev, &pmksa); 12271 } 12272 12273 static int nl80211_del_pmksa(struct sk_buff *skb, struct genl_info *info) 12274 { 12275 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12276 struct net_device *dev = info->user_ptr[1]; 12277 struct cfg80211_pmksa pmksa; 12278 bool sae_offload_support = false; 12279 bool owe_offload_support = false; 12280 bool ap_pmksa_caching_support = false; 12281 12282 memset(&pmksa, 0, sizeof(struct cfg80211_pmksa)); 12283 12284 sae_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, 12285 NL80211_EXT_FEATURE_SAE_OFFLOAD); 12286 owe_offload_support = wiphy_ext_feature_isset(&rdev->wiphy, 12287 NL80211_EXT_FEATURE_OWE_OFFLOAD); 12288 ap_pmksa_caching_support = wiphy_ext_feature_isset(&rdev->wiphy, 12289 NL80211_EXT_FEATURE_AP_PMKSA_CACHING); 12290 12291 if (info->attrs[NL80211_ATTR_PMKID]) 12292 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 12293 12294 if (info->attrs[NL80211_ATTR_MAC]) { 12295 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 12296 } else if (info->attrs[NL80211_ATTR_SSID]) { 12297 /* SSID based pmksa flush suppported only for FILS, 12298 * OWE/SAE OFFLOAD cases 12299 */ 12300 if (info->attrs[NL80211_ATTR_FILS_CACHE_ID] && 12301 info->attrs[NL80211_ATTR_PMK]) { 12302 pmksa.cache_id = nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); 12303 } else if (!sae_offload_support && !owe_offload_support) { 12304 return -EINVAL; 12305 } 12306 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 12307 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 12308 } else { 12309 return -EINVAL; 12310 } 12311 12312 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 12313 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && 12314 !((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || 12315 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) && 12316 ap_pmksa_caching_support)) 12317 return -EOPNOTSUPP; 12318 12319 if (!rdev->ops->del_pmksa) 12320 return -EOPNOTSUPP; 12321 12322 return rdev_del_pmksa(rdev, dev, &pmksa); 12323 } 12324 12325 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info) 12326 { 12327 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12328 struct net_device *dev = info->user_ptr[1]; 12329 12330 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 12331 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 12332 return -EOPNOTSUPP; 12333 12334 if (!rdev->ops->flush_pmksa) 12335 return -EOPNOTSUPP; 12336 12337 return rdev_flush_pmksa(rdev, dev); 12338 } 12339 12340 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info) 12341 { 12342 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12343 struct net_device *dev = info->user_ptr[1]; 12344 u8 action_code, dialog_token; 12345 u32 peer_capability = 0; 12346 u16 status_code; 12347 u8 *peer; 12348 int link_id; 12349 bool initiator; 12350 12351 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 12352 !rdev->ops->tdls_mgmt) 12353 return -EOPNOTSUPP; 12354 12355 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || 12356 !info->attrs[NL80211_ATTR_STATUS_CODE] || 12357 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || 12358 !info->attrs[NL80211_ATTR_IE] || 12359 !info->attrs[NL80211_ATTR_MAC]) 12360 return -EINVAL; 12361 12362 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 12363 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); 12364 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 12365 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); 12366 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]); 12367 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]) 12368 peer_capability = 12369 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]); 12370 link_id = nl80211_link_id_or_invalid(info->attrs); 12371 12372 return rdev_tdls_mgmt(rdev, dev, peer, link_id, action_code, 12373 dialog_token, status_code, peer_capability, 12374 initiator, 12375 nla_data(info->attrs[NL80211_ATTR_IE]), 12376 nla_len(info->attrs[NL80211_ATTR_IE])); 12377 } 12378 12379 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info) 12380 { 12381 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12382 struct net_device *dev = info->user_ptr[1]; 12383 enum nl80211_tdls_operation operation; 12384 u8 *peer; 12385 12386 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 12387 !rdev->ops->tdls_oper) 12388 return -EOPNOTSUPP; 12389 12390 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || 12391 !info->attrs[NL80211_ATTR_MAC]) 12392 return -EINVAL; 12393 12394 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); 12395 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 12396 12397 return rdev_tdls_oper(rdev, dev, peer, operation); 12398 } 12399 12400 static int nl80211_remain_on_channel(struct sk_buff *skb, 12401 struct genl_info *info) 12402 { 12403 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12404 unsigned int link_id = nl80211_link_id(info->attrs); 12405 struct wireless_dev *wdev = info->user_ptr[1]; 12406 struct cfg80211_chan_def chandef; 12407 struct sk_buff *msg; 12408 void *hdr; 12409 u64 cookie; 12410 u32 duration; 12411 int err; 12412 12413 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 12414 !info->attrs[NL80211_ATTR_DURATION]) 12415 return -EINVAL; 12416 12417 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 12418 12419 if (!rdev->ops->remain_on_channel || 12420 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) 12421 return -EOPNOTSUPP; 12422 12423 /* 12424 * We should be on that channel for at least a minimum amount of 12425 * time (10ms) but no longer than the driver supports. 12426 */ 12427 if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 12428 duration > rdev->wiphy.max_remain_on_channel_duration) 12429 return -EINVAL; 12430 12431 err = nl80211_parse_chandef(rdev, info, &chandef); 12432 if (err) 12433 return err; 12434 12435 if (!cfg80211_off_channel_oper_allowed(wdev, chandef.chan)) { 12436 const struct cfg80211_chan_def *oper_chandef, *compat_chandef; 12437 12438 oper_chandef = wdev_chandef(wdev, link_id); 12439 12440 if (WARN_ON(!oper_chandef)) { 12441 /* cannot happen since we must beacon to get here */ 12442 WARN_ON(1); 12443 return -EBUSY; 12444 } 12445 12446 /* note: returns first one if identical chandefs */ 12447 compat_chandef = cfg80211_chandef_compatible(&chandef, 12448 oper_chandef); 12449 12450 if (compat_chandef != &chandef) 12451 return -EBUSY; 12452 } 12453 12454 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 12455 if (!msg) 12456 return -ENOMEM; 12457 12458 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 12459 NL80211_CMD_REMAIN_ON_CHANNEL); 12460 if (!hdr) { 12461 err = -ENOBUFS; 12462 goto free_msg; 12463 } 12464 12465 err = rdev_remain_on_channel(rdev, wdev, chandef.chan, 12466 duration, &cookie); 12467 12468 if (err) 12469 goto free_msg; 12470 12471 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 12472 NL80211_ATTR_PAD)) 12473 goto nla_put_failure; 12474 12475 genlmsg_end(msg, hdr); 12476 12477 return genlmsg_reply(msg, info); 12478 12479 nla_put_failure: 12480 err = -ENOBUFS; 12481 free_msg: 12482 nlmsg_free(msg); 12483 return err; 12484 } 12485 12486 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb, 12487 struct genl_info *info) 12488 { 12489 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12490 struct wireless_dev *wdev = info->user_ptr[1]; 12491 u64 cookie; 12492 12493 if (!info->attrs[NL80211_ATTR_COOKIE]) 12494 return -EINVAL; 12495 12496 if (!rdev->ops->cancel_remain_on_channel) 12497 return -EOPNOTSUPP; 12498 12499 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 12500 12501 return rdev_cancel_remain_on_channel(rdev, wdev, cookie); 12502 } 12503 12504 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb, 12505 struct genl_info *info) 12506 { 12507 struct cfg80211_bitrate_mask mask; 12508 unsigned int link_id = nl80211_link_id(info->attrs); 12509 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12510 struct net_device *dev = info->user_ptr[1]; 12511 int err; 12512 12513 if (!rdev->ops->set_bitrate_mask) 12514 return -EOPNOTSUPP; 12515 12516 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, 12517 NL80211_ATTR_TX_RATES, &mask, 12518 dev, true, link_id); 12519 if (err) 12520 return err; 12521 12522 return rdev_set_bitrate_mask(rdev, dev, link_id, NULL, &mask); 12523 } 12524 12525 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info) 12526 { 12527 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12528 struct wireless_dev *wdev = info->user_ptr[1]; 12529 u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION; 12530 12531 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) 12532 return -EINVAL; 12533 12534 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) 12535 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); 12536 12537 switch (wdev->iftype) { 12538 case NL80211_IFTYPE_STATION: 12539 case NL80211_IFTYPE_ADHOC: 12540 case NL80211_IFTYPE_P2P_CLIENT: 12541 case NL80211_IFTYPE_AP: 12542 case NL80211_IFTYPE_AP_VLAN: 12543 case NL80211_IFTYPE_MESH_POINT: 12544 case NL80211_IFTYPE_P2P_GO: 12545 case NL80211_IFTYPE_P2P_DEVICE: 12546 break; 12547 case NL80211_IFTYPE_NAN: 12548 if (!wiphy_ext_feature_isset(wdev->wiphy, 12549 NL80211_EXT_FEATURE_SECURE_NAN)) 12550 return -EOPNOTSUPP; 12551 break; 12552 default: 12553 return -EOPNOTSUPP; 12554 } 12555 12556 /* not much point in registering if we can't reply */ 12557 if (!rdev->ops->mgmt_tx) 12558 return -EOPNOTSUPP; 12559 12560 if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] && 12561 !wiphy_ext_feature_isset(&rdev->wiphy, 12562 NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS)) { 12563 GENL_SET_ERR_MSG(info, 12564 "multicast RX registrations are not supported"); 12565 return -EOPNOTSUPP; 12566 } 12567 12568 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, 12569 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), 12570 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]), 12571 info->attrs[NL80211_ATTR_RECEIVE_MULTICAST], 12572 info->extack); 12573 } 12574 12575 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info) 12576 { 12577 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12578 struct wireless_dev *wdev = info->user_ptr[1]; 12579 struct cfg80211_chan_def chandef; 12580 int err; 12581 void *hdr = NULL; 12582 u64 cookie; 12583 struct sk_buff *msg = NULL; 12584 struct cfg80211_mgmt_tx_params params = { 12585 .dont_wait_for_ack = 12586 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], 12587 }; 12588 12589 if (!info->attrs[NL80211_ATTR_FRAME]) 12590 return -EINVAL; 12591 12592 if (!rdev->ops->mgmt_tx) 12593 return -EOPNOTSUPP; 12594 12595 switch (wdev->iftype) { 12596 case NL80211_IFTYPE_P2P_DEVICE: 12597 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 12598 return -EINVAL; 12599 break; 12600 case NL80211_IFTYPE_STATION: 12601 case NL80211_IFTYPE_ADHOC: 12602 case NL80211_IFTYPE_P2P_CLIENT: 12603 case NL80211_IFTYPE_AP: 12604 case NL80211_IFTYPE_AP_VLAN: 12605 case NL80211_IFTYPE_MESH_POINT: 12606 case NL80211_IFTYPE_P2P_GO: 12607 break; 12608 case NL80211_IFTYPE_NAN: 12609 if (!wiphy_ext_feature_isset(wdev->wiphy, 12610 NL80211_EXT_FEATURE_SECURE_NAN)) 12611 return -EOPNOTSUPP; 12612 break; 12613 default: 12614 return -EOPNOTSUPP; 12615 } 12616 12617 if (info->attrs[NL80211_ATTR_DURATION]) { 12618 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 12619 return -EINVAL; 12620 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 12621 12622 /* 12623 * We should wait on the channel for at least a minimum amount 12624 * of time (10ms) but no longer than the driver supports. 12625 */ 12626 if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 12627 params.wait > rdev->wiphy.max_remain_on_channel_duration) 12628 return -EINVAL; 12629 } 12630 12631 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; 12632 12633 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 12634 return -EINVAL; 12635 12636 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 12637 12638 /* get the channel if any has been specified, otherwise pass NULL to 12639 * the driver. The latter will use the current one 12640 */ 12641 chandef.chan = NULL; 12642 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 12643 err = nl80211_parse_chandef(rdev, info, &chandef); 12644 if (err) 12645 return err; 12646 } 12647 12648 if (!chandef.chan && params.offchan) 12649 return -EINVAL; 12650 12651 if (params.offchan && 12652 !cfg80211_off_channel_oper_allowed(wdev, chandef.chan)) 12653 return -EBUSY; 12654 12655 params.link_id = nl80211_link_id_or_invalid(info->attrs); 12656 /* 12657 * This now races due to the unlock, but we cannot check 12658 * the valid links for the _station_ anyway, so that's up 12659 * to the driver. 12660 */ 12661 if (params.link_id >= 0 && 12662 !(wdev->valid_links & BIT(params.link_id))) 12663 return -EINVAL; 12664 12665 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 12666 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 12667 12668 if (info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]) { 12669 int len = nla_len(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); 12670 int i; 12671 12672 if (len % sizeof(u16)) 12673 return -EINVAL; 12674 12675 params.n_csa_offsets = len / sizeof(u16); 12676 params.csa_offsets = 12677 nla_data(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); 12678 12679 /* check that all the offsets fit the frame */ 12680 for (i = 0; i < params.n_csa_offsets; i++) { 12681 if (params.csa_offsets[i] >= params.len) 12682 return -EINVAL; 12683 } 12684 } 12685 12686 if (!params.dont_wait_for_ack) { 12687 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 12688 if (!msg) 12689 return -ENOMEM; 12690 12691 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 12692 NL80211_CMD_FRAME); 12693 if (!hdr) { 12694 err = -ENOBUFS; 12695 goto free_msg; 12696 } 12697 } 12698 12699 params.chan = chandef.chan; 12700 err = cfg80211_mlme_mgmt_tx(rdev, wdev, ¶ms, &cookie); 12701 if (err) 12702 goto free_msg; 12703 12704 if (msg) { 12705 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 12706 NL80211_ATTR_PAD)) 12707 goto nla_put_failure; 12708 12709 genlmsg_end(msg, hdr); 12710 return genlmsg_reply(msg, info); 12711 } 12712 12713 return 0; 12714 12715 nla_put_failure: 12716 err = -ENOBUFS; 12717 free_msg: 12718 nlmsg_free(msg); 12719 return err; 12720 } 12721 12722 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info) 12723 { 12724 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12725 struct wireless_dev *wdev = info->user_ptr[1]; 12726 u64 cookie; 12727 12728 if (!info->attrs[NL80211_ATTR_COOKIE]) 12729 return -EINVAL; 12730 12731 if (!rdev->ops->mgmt_tx_cancel_wait) 12732 return -EOPNOTSUPP; 12733 12734 switch (wdev->iftype) { 12735 case NL80211_IFTYPE_STATION: 12736 case NL80211_IFTYPE_ADHOC: 12737 case NL80211_IFTYPE_P2P_CLIENT: 12738 case NL80211_IFTYPE_AP: 12739 case NL80211_IFTYPE_AP_VLAN: 12740 case NL80211_IFTYPE_P2P_GO: 12741 case NL80211_IFTYPE_P2P_DEVICE: 12742 break; 12743 case NL80211_IFTYPE_NAN: 12744 if (!wiphy_ext_feature_isset(wdev->wiphy, 12745 NL80211_EXT_FEATURE_SECURE_NAN)) 12746 return -EOPNOTSUPP; 12747 break; 12748 default: 12749 return -EOPNOTSUPP; 12750 } 12751 12752 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 12753 12754 return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie); 12755 } 12756 12757 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info) 12758 { 12759 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12760 struct wireless_dev *wdev; 12761 struct net_device *dev = info->user_ptr[1]; 12762 u8 ps_state; 12763 bool state; 12764 int err; 12765 12766 if (!info->attrs[NL80211_ATTR_PS_STATE]) 12767 return -EINVAL; 12768 12769 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); 12770 12771 wdev = dev->ieee80211_ptr; 12772 12773 if (!rdev->ops->set_power_mgmt) 12774 return -EOPNOTSUPP; 12775 12776 state = (ps_state == NL80211_PS_ENABLED) ? true : false; 12777 12778 if (state == wdev->ps) 12779 return 0; 12780 12781 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); 12782 if (!err) 12783 wdev->ps = state; 12784 return err; 12785 } 12786 12787 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info) 12788 { 12789 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12790 enum nl80211_ps_state ps_state; 12791 struct wireless_dev *wdev; 12792 struct net_device *dev = info->user_ptr[1]; 12793 struct sk_buff *msg; 12794 void *hdr; 12795 int err; 12796 12797 wdev = dev->ieee80211_ptr; 12798 12799 if (!rdev->ops->set_power_mgmt) 12800 return -EOPNOTSUPP; 12801 12802 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 12803 if (!msg) 12804 return -ENOMEM; 12805 12806 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 12807 NL80211_CMD_GET_POWER_SAVE); 12808 if (!hdr) { 12809 err = -ENOBUFS; 12810 goto free_msg; 12811 } 12812 12813 if (wdev->ps) 12814 ps_state = NL80211_PS_ENABLED; 12815 else 12816 ps_state = NL80211_PS_DISABLED; 12817 12818 if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state)) 12819 goto nla_put_failure; 12820 12821 genlmsg_end(msg, hdr); 12822 return genlmsg_reply(msg, info); 12823 12824 nla_put_failure: 12825 err = -ENOBUFS; 12826 free_msg: 12827 nlmsg_free(msg); 12828 return err; 12829 } 12830 12831 static const struct nla_policy 12832 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = { 12833 [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_BINARY }, 12834 [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 }, 12835 [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 }, 12836 [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 }, 12837 [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 }, 12838 [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 }, 12839 [NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_S32 }, 12840 }; 12841 12842 static int nl80211_set_cqm_txe(struct genl_info *info, 12843 u32 rate, u32 pkts, u32 intvl) 12844 { 12845 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12846 struct net_device *dev = info->user_ptr[1]; 12847 struct wireless_dev *wdev = dev->ieee80211_ptr; 12848 12849 if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL) 12850 return -EINVAL; 12851 12852 if (!rdev->ops->set_cqm_txe_config) 12853 return -EOPNOTSUPP; 12854 12855 if (wdev->iftype != NL80211_IFTYPE_STATION && 12856 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 12857 return -EOPNOTSUPP; 12858 12859 return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl); 12860 } 12861 12862 static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev, 12863 struct net_device *dev, 12864 struct cfg80211_cqm_config *cqm_config) 12865 { 12866 struct wireless_dev *wdev = dev->ieee80211_ptr; 12867 s32 last, low, high; 12868 u32 hyst; 12869 int i, n, low_index; 12870 int err; 12871 12872 /* 12873 * Obtain current RSSI value if possible, if not and no RSSI threshold 12874 * event has been received yet, we should receive an event after a 12875 * connection is established and enough beacons received to calculate 12876 * the average. 12877 */ 12878 if (!cqm_config->last_rssi_event_value && 12879 wdev->links[0].client.current_bss && 12880 rdev->ops->get_station) { 12881 struct station_info sinfo = {}; 12882 u8 *mac_addr; 12883 12884 mac_addr = wdev->links[0].client.current_bss->pub.bssid; 12885 12886 err = rdev_get_station(rdev, dev, mac_addr, &sinfo); 12887 if (err) 12888 return err; 12889 12890 cfg80211_sinfo_release_content(&sinfo); 12891 if (sinfo.filled & BIT_ULL(NL80211_STA_INFO_BEACON_SIGNAL_AVG)) 12892 cqm_config->last_rssi_event_value = 12893 (s8) sinfo.rx_beacon_signal_avg; 12894 } 12895 12896 last = cqm_config->last_rssi_event_value; 12897 hyst = cqm_config->rssi_hyst; 12898 n = cqm_config->n_rssi_thresholds; 12899 12900 for (i = 0; i < n; i++) { 12901 i = array_index_nospec(i, n); 12902 if (last < cqm_config->rssi_thresholds[i]) 12903 break; 12904 } 12905 12906 low_index = i - 1; 12907 if (low_index >= 0) { 12908 low_index = array_index_nospec(low_index, n); 12909 low = cqm_config->rssi_thresholds[low_index] - hyst; 12910 } else { 12911 low = S32_MIN; 12912 } 12913 if (i < n) { 12914 i = array_index_nospec(i, n); 12915 high = cqm_config->rssi_thresholds[i] + hyst - 1; 12916 } else { 12917 high = S32_MAX; 12918 } 12919 12920 return rdev_set_cqm_rssi_range_config(rdev, dev, low, high); 12921 } 12922 12923 static int nl80211_set_cqm_rssi(struct genl_info *info, 12924 const s32 *thresholds, int n_thresholds, 12925 u32 hysteresis) 12926 { 12927 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12928 struct cfg80211_cqm_config *cqm_config = NULL, *old; 12929 struct net_device *dev = info->user_ptr[1]; 12930 struct wireless_dev *wdev = dev->ieee80211_ptr; 12931 s32 prev = S32_MIN; 12932 int i, err; 12933 12934 /* Check all values negative and sorted */ 12935 for (i = 0; i < n_thresholds; i++) { 12936 if (thresholds[i] > 0 || thresholds[i] <= prev) 12937 return -EINVAL; 12938 12939 prev = thresholds[i]; 12940 } 12941 12942 if (wdev->iftype != NL80211_IFTYPE_STATION && 12943 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 12944 return -EOPNOTSUPP; 12945 12946 if (n_thresholds == 1 && thresholds[0] == 0) /* Disabling */ 12947 n_thresholds = 0; 12948 12949 old = wiphy_dereference(wdev->wiphy, wdev->cqm_config); 12950 12951 /* if already disabled just succeed */ 12952 if (!n_thresholds && !old) 12953 return 0; 12954 12955 if (n_thresholds > 1) { 12956 if (!wiphy_ext_feature_isset(&rdev->wiphy, 12957 NL80211_EXT_FEATURE_CQM_RSSI_LIST) || 12958 !rdev->ops->set_cqm_rssi_range_config) 12959 return -EOPNOTSUPP; 12960 } else { 12961 if (!rdev->ops->set_cqm_rssi_config) 12962 return -EOPNOTSUPP; 12963 } 12964 12965 if (n_thresholds) { 12966 cqm_config = kzalloc(struct_size(cqm_config, rssi_thresholds, 12967 n_thresholds), 12968 GFP_KERNEL); 12969 if (!cqm_config) 12970 return -ENOMEM; 12971 12972 cqm_config->rssi_hyst = hysteresis; 12973 cqm_config->n_rssi_thresholds = n_thresholds; 12974 memcpy(cqm_config->rssi_thresholds, thresholds, 12975 flex_array_size(cqm_config, rssi_thresholds, 12976 n_thresholds)); 12977 cqm_config->use_range_api = n_thresholds > 1 || 12978 !rdev->ops->set_cqm_rssi_config; 12979 12980 rcu_assign_pointer(wdev->cqm_config, cqm_config); 12981 12982 if (cqm_config->use_range_api) 12983 err = cfg80211_cqm_rssi_update(rdev, dev, cqm_config); 12984 else 12985 err = rdev_set_cqm_rssi_config(rdev, dev, 12986 thresholds[0], 12987 hysteresis); 12988 } else { 12989 RCU_INIT_POINTER(wdev->cqm_config, NULL); 12990 /* if enabled as range also disable via range */ 12991 if (old->use_range_api) 12992 err = rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0); 12993 else 12994 err = rdev_set_cqm_rssi_config(rdev, dev, 0, 0); 12995 } 12996 12997 if (err) { 12998 rcu_assign_pointer(wdev->cqm_config, old); 12999 kfree_rcu(cqm_config, rcu_head); 13000 } else { 13001 kfree_rcu(old, rcu_head); 13002 } 13003 13004 return err; 13005 } 13006 13007 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info) 13008 { 13009 struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1]; 13010 struct nlattr *cqm; 13011 int err; 13012 13013 cqm = info->attrs[NL80211_ATTR_CQM]; 13014 if (!cqm) 13015 return -EINVAL; 13016 13017 err = nla_parse_nested_deprecated(attrs, NL80211_ATTR_CQM_MAX, cqm, 13018 nl80211_attr_cqm_policy, 13019 info->extack); 13020 if (err) 13021 return err; 13022 13023 if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] && 13024 attrs[NL80211_ATTR_CQM_RSSI_HYST]) { 13025 const s32 *thresholds = 13026 nla_data(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 13027 int len = nla_len(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 13028 u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]); 13029 13030 if (len % 4) 13031 return -EINVAL; 13032 13033 return nl80211_set_cqm_rssi(info, thresholds, len / 4, 13034 hysteresis); 13035 } 13036 13037 if (attrs[NL80211_ATTR_CQM_TXE_RATE] && 13038 attrs[NL80211_ATTR_CQM_TXE_PKTS] && 13039 attrs[NL80211_ATTR_CQM_TXE_INTVL]) { 13040 u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]); 13041 u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]); 13042 u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]); 13043 13044 return nl80211_set_cqm_txe(info, rate, pkts, intvl); 13045 } 13046 13047 return -EINVAL; 13048 } 13049 13050 static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info) 13051 { 13052 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13053 struct net_device *dev = info->user_ptr[1]; 13054 struct ocb_setup setup = {}; 13055 int err; 13056 13057 err = nl80211_parse_chandef(rdev, info, &setup.chandef); 13058 if (err) 13059 return err; 13060 13061 return cfg80211_join_ocb(rdev, dev, &setup); 13062 } 13063 13064 static int nl80211_leave_ocb(struct sk_buff *skb, struct genl_info *info) 13065 { 13066 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13067 struct net_device *dev = info->user_ptr[1]; 13068 13069 return cfg80211_leave_ocb(rdev, dev); 13070 } 13071 13072 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info) 13073 { 13074 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13075 struct net_device *dev = info->user_ptr[1]; 13076 struct mesh_config cfg; 13077 struct mesh_setup setup; 13078 int err; 13079 13080 /* start with default */ 13081 memcpy(&cfg, &default_mesh_config, sizeof(cfg)); 13082 memcpy(&setup, &default_mesh_setup, sizeof(setup)); 13083 13084 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { 13085 /* and parse parameters if given */ 13086 err = nl80211_parse_mesh_config(info, &cfg, NULL); 13087 if (err) 13088 return err; 13089 } 13090 13091 if (!info->attrs[NL80211_ATTR_MESH_ID] || 13092 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) 13093 return -EINVAL; 13094 13095 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); 13096 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 13097 13098 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 13099 !nl80211_parse_mcast_rate(rdev, setup.mcast_rate, 13100 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 13101 return -EINVAL; 13102 13103 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { 13104 setup.beacon_interval = 13105 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 13106 13107 err = cfg80211_validate_beacon_int(rdev, 13108 NL80211_IFTYPE_MESH_POINT, 13109 setup.beacon_interval); 13110 if (err) 13111 return err; 13112 } 13113 13114 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { 13115 setup.dtim_period = 13116 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 13117 if (setup.dtim_period < 1 || setup.dtim_period > 100) 13118 return -EINVAL; 13119 } 13120 13121 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { 13122 /* parse additional setup parameters if given */ 13123 err = nl80211_parse_mesh_setup(info, &setup); 13124 if (err) 13125 return err; 13126 } 13127 13128 if (setup.user_mpm) 13129 cfg.auto_open_plinks = false; 13130 13131 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 13132 err = nl80211_parse_chandef(rdev, info, &setup.chandef); 13133 if (err) 13134 return err; 13135 } else { 13136 /* __cfg80211_join_mesh() will sort it out */ 13137 setup.chandef.chan = NULL; 13138 } 13139 13140 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 13141 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 13142 int n_rates = 13143 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 13144 struct ieee80211_supported_band *sband; 13145 13146 if (!setup.chandef.chan) 13147 return -EINVAL; 13148 13149 sband = rdev->wiphy.bands[setup.chandef.chan->band]; 13150 13151 err = ieee80211_get_ratemask(sband, rates, n_rates, 13152 &setup.basic_rates); 13153 if (err) 13154 return err; 13155 } 13156 13157 if (info->attrs[NL80211_ATTR_TX_RATES]) { 13158 err = nl80211_parse_tx_bitrate_mask(info, info->attrs, 13159 NL80211_ATTR_TX_RATES, 13160 &setup.beacon_rate, 13161 dev, false, 0); 13162 if (err) 13163 return err; 13164 13165 if (!setup.chandef.chan) 13166 return -EINVAL; 13167 13168 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band, 13169 &setup.beacon_rate); 13170 if (err) 13171 return err; 13172 } 13173 13174 setup.userspace_handles_dfs = 13175 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 13176 13177 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 13178 int r = validate_pae_over_nl80211(rdev, info); 13179 13180 if (r < 0) 13181 return r; 13182 13183 setup.control_port_over_nl80211 = true; 13184 } 13185 13186 err = __cfg80211_join_mesh(rdev, dev, &setup, &cfg); 13187 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) 13188 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 13189 13190 return err; 13191 } 13192 13193 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info) 13194 { 13195 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13196 struct net_device *dev = info->user_ptr[1]; 13197 13198 return cfg80211_leave_mesh(rdev, dev); 13199 } 13200 13201 #ifdef CONFIG_PM 13202 static int nl80211_send_wowlan_patterns(struct sk_buff *msg, 13203 struct cfg80211_registered_device *rdev) 13204 { 13205 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; 13206 struct nlattr *nl_pats, *nl_pat; 13207 int i, pat_len; 13208 13209 if (!wowlan->n_patterns) 13210 return 0; 13211 13212 nl_pats = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN); 13213 if (!nl_pats) 13214 return -ENOBUFS; 13215 13216 for (i = 0; i < wowlan->n_patterns; i++) { 13217 nl_pat = nla_nest_start_noflag(msg, i + 1); 13218 if (!nl_pat) 13219 return -ENOBUFS; 13220 pat_len = wowlan->patterns[i].pattern_len; 13221 if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8), 13222 wowlan->patterns[i].mask) || 13223 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 13224 wowlan->patterns[i].pattern) || 13225 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 13226 wowlan->patterns[i].pkt_offset)) 13227 return -ENOBUFS; 13228 nla_nest_end(msg, nl_pat); 13229 } 13230 nla_nest_end(msg, nl_pats); 13231 13232 return 0; 13233 } 13234 13235 static int nl80211_send_wowlan_tcp(struct sk_buff *msg, 13236 struct cfg80211_wowlan_tcp *tcp) 13237 { 13238 struct nlattr *nl_tcp; 13239 13240 if (!tcp) 13241 return 0; 13242 13243 nl_tcp = nla_nest_start_noflag(msg, 13244 NL80211_WOWLAN_TRIG_TCP_CONNECTION); 13245 if (!nl_tcp) 13246 return -ENOBUFS; 13247 13248 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || 13249 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || 13250 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || 13251 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || 13252 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || 13253 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 13254 tcp->payload_len, tcp->payload) || 13255 nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 13256 tcp->data_interval) || 13257 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 13258 tcp->wake_len, tcp->wake_data) || 13259 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK, 13260 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) 13261 return -ENOBUFS; 13262 13263 if (tcp->payload_seq.len && 13264 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ, 13265 sizeof(tcp->payload_seq), &tcp->payload_seq)) 13266 return -ENOBUFS; 13267 13268 if (tcp->payload_tok.len && 13269 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 13270 sizeof(tcp->payload_tok) + tcp->tokens_size, 13271 &tcp->payload_tok)) 13272 return -ENOBUFS; 13273 13274 nla_nest_end(msg, nl_tcp); 13275 13276 return 0; 13277 } 13278 13279 static int nl80211_send_wowlan_nd(struct sk_buff *msg, 13280 struct cfg80211_sched_scan_request *req) 13281 { 13282 struct nlattr *nd, *freqs, *matches, *match, *scan_plans, *scan_plan; 13283 int i; 13284 13285 if (!req) 13286 return 0; 13287 13288 nd = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_NET_DETECT); 13289 if (!nd) 13290 return -ENOBUFS; 13291 13292 if (req->n_scan_plans == 1 && 13293 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_INTERVAL, 13294 req->scan_plans[0].interval * 1000)) 13295 return -ENOBUFS; 13296 13297 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay)) 13298 return -ENOBUFS; 13299 13300 if (req->relative_rssi_set) { 13301 struct nl80211_bss_select_rssi_adjust rssi_adjust; 13302 13303 if (nla_put_s8(msg, NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI, 13304 req->relative_rssi)) 13305 return -ENOBUFS; 13306 13307 rssi_adjust.band = req->rssi_adjust.band; 13308 rssi_adjust.delta = req->rssi_adjust.delta; 13309 if (nla_put(msg, NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST, 13310 sizeof(rssi_adjust), &rssi_adjust)) 13311 return -ENOBUFS; 13312 } 13313 13314 freqs = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_FREQUENCIES); 13315 if (!freqs) 13316 return -ENOBUFS; 13317 13318 for (i = 0; i < req->n_channels; i++) { 13319 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) 13320 return -ENOBUFS; 13321 } 13322 13323 nla_nest_end(msg, freqs); 13324 13325 if (req->n_match_sets) { 13326 matches = nla_nest_start_noflag(msg, 13327 NL80211_ATTR_SCHED_SCAN_MATCH); 13328 if (!matches) 13329 return -ENOBUFS; 13330 13331 for (i = 0; i < req->n_match_sets; i++) { 13332 match = nla_nest_start_noflag(msg, i); 13333 if (!match) 13334 return -ENOBUFS; 13335 13336 if (nla_put(msg, NL80211_SCHED_SCAN_MATCH_ATTR_SSID, 13337 req->match_sets[i].ssid.ssid_len, 13338 req->match_sets[i].ssid.ssid)) 13339 return -ENOBUFS; 13340 nla_nest_end(msg, match); 13341 } 13342 nla_nest_end(msg, matches); 13343 } 13344 13345 scan_plans = nla_nest_start_noflag(msg, NL80211_ATTR_SCHED_SCAN_PLANS); 13346 if (!scan_plans) 13347 return -ENOBUFS; 13348 13349 for (i = 0; i < req->n_scan_plans; i++) { 13350 scan_plan = nla_nest_start_noflag(msg, i + 1); 13351 if (!scan_plan) 13352 return -ENOBUFS; 13353 13354 if (nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_INTERVAL, 13355 req->scan_plans[i].interval) || 13356 (req->scan_plans[i].iterations && 13357 nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_ITERATIONS, 13358 req->scan_plans[i].iterations))) 13359 return -ENOBUFS; 13360 nla_nest_end(msg, scan_plan); 13361 } 13362 nla_nest_end(msg, scan_plans); 13363 13364 nla_nest_end(msg, nd); 13365 13366 return 0; 13367 } 13368 13369 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info) 13370 { 13371 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13372 struct sk_buff *msg; 13373 void *hdr; 13374 u32 size = NLMSG_DEFAULT_SIZE; 13375 13376 if (!rdev->wiphy.wowlan) 13377 return -EOPNOTSUPP; 13378 13379 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { 13380 /* adjust size to have room for all the data */ 13381 size += rdev->wiphy.wowlan_config->tcp->tokens_size + 13382 rdev->wiphy.wowlan_config->tcp->payload_len + 13383 rdev->wiphy.wowlan_config->tcp->wake_len + 13384 rdev->wiphy.wowlan_config->tcp->wake_len / 8; 13385 } 13386 13387 msg = nlmsg_new(size, GFP_KERNEL); 13388 if (!msg) 13389 return -ENOMEM; 13390 13391 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 13392 NL80211_CMD_GET_WOWLAN); 13393 if (!hdr) 13394 goto nla_put_failure; 13395 13396 if (rdev->wiphy.wowlan_config) { 13397 struct nlattr *nl_wowlan; 13398 13399 nl_wowlan = nla_nest_start_noflag(msg, 13400 NL80211_ATTR_WOWLAN_TRIGGERS); 13401 if (!nl_wowlan) 13402 goto nla_put_failure; 13403 13404 if ((rdev->wiphy.wowlan_config->any && 13405 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 13406 (rdev->wiphy.wowlan_config->disconnect && 13407 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 13408 (rdev->wiphy.wowlan_config->magic_pkt && 13409 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 13410 (rdev->wiphy.wowlan_config->gtk_rekey_failure && 13411 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 13412 (rdev->wiphy.wowlan_config->eap_identity_req && 13413 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 13414 (rdev->wiphy.wowlan_config->four_way_handshake && 13415 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 13416 (rdev->wiphy.wowlan_config->rfkill_release && 13417 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 13418 goto nla_put_failure; 13419 13420 if (nl80211_send_wowlan_patterns(msg, rdev)) 13421 goto nla_put_failure; 13422 13423 if (nl80211_send_wowlan_tcp(msg, 13424 rdev->wiphy.wowlan_config->tcp)) 13425 goto nla_put_failure; 13426 13427 if (nl80211_send_wowlan_nd( 13428 msg, 13429 rdev->wiphy.wowlan_config->nd_config)) 13430 goto nla_put_failure; 13431 13432 nla_nest_end(msg, nl_wowlan); 13433 } 13434 13435 genlmsg_end(msg, hdr); 13436 return genlmsg_reply(msg, info); 13437 13438 nla_put_failure: 13439 nlmsg_free(msg); 13440 return -ENOBUFS; 13441 } 13442 13443 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev, 13444 struct nlattr *attr, 13445 struct cfg80211_wowlan *trig) 13446 { 13447 struct nlattr *tb[NUM_NL80211_WOWLAN_TCP]; 13448 struct cfg80211_wowlan_tcp *cfg; 13449 struct nl80211_wowlan_tcp_data_token *tok = NULL; 13450 struct nl80211_wowlan_tcp_data_seq *seq = NULL; 13451 u32 size; 13452 u32 data_size, wake_size, tokens_size = 0, wake_mask_size; 13453 int err, port; 13454 13455 if (!rdev->wiphy.wowlan->tcp) 13456 return -EINVAL; 13457 13458 err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TCP, attr, 13459 nl80211_wowlan_tcp_policy, NULL); 13460 if (err) 13461 return err; 13462 13463 if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] || 13464 !tb[NL80211_WOWLAN_TCP_DST_IPV4] || 13465 !tb[NL80211_WOWLAN_TCP_DST_MAC] || 13466 !tb[NL80211_WOWLAN_TCP_DST_PORT] || 13467 !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] || 13468 !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] || 13469 !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] || 13470 !tb[NL80211_WOWLAN_TCP_WAKE_MASK]) 13471 return -EINVAL; 13472 13473 data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]); 13474 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) 13475 return -EINVAL; 13476 13477 if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) > 13478 rdev->wiphy.wowlan->tcp->data_interval_max || 13479 nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0) 13480 return -EINVAL; 13481 13482 wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]); 13483 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) 13484 return -EINVAL; 13485 13486 wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]); 13487 if (wake_mask_size != DIV_ROUND_UP(wake_size, 8)) 13488 return -EINVAL; 13489 13490 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) { 13491 u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 13492 13493 tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 13494 tokens_size = tokln - sizeof(*tok); 13495 13496 if (!tok->len || tokens_size % tok->len) 13497 return -EINVAL; 13498 if (!rdev->wiphy.wowlan->tcp->tok) 13499 return -EINVAL; 13500 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) 13501 return -EINVAL; 13502 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) 13503 return -EINVAL; 13504 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) 13505 return -EINVAL; 13506 if (tok->offset + tok->len > data_size) 13507 return -EINVAL; 13508 } 13509 13510 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) { 13511 seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]); 13512 if (!rdev->wiphy.wowlan->tcp->seq) 13513 return -EINVAL; 13514 if (seq->len == 0 || seq->len > 4) 13515 return -EINVAL; 13516 if (seq->len + seq->offset > data_size) 13517 return -EINVAL; 13518 } 13519 13520 size = sizeof(*cfg); 13521 size += data_size; 13522 size += wake_size + wake_mask_size; 13523 size += tokens_size; 13524 13525 cfg = kzalloc(size, GFP_KERNEL); 13526 if (!cfg) 13527 return -ENOMEM; 13528 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); 13529 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]); 13530 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), 13531 ETH_ALEN); 13532 if (tb[NL80211_WOWLAN_TCP_SRC_PORT]) 13533 port = nla_get_u16(tb[NL80211_WOWLAN_TCP_SRC_PORT]); 13534 else 13535 port = 0; 13536 #ifdef CONFIG_INET 13537 /* allocate a socket and port for it and use it */ 13538 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, 13539 IPPROTO_TCP, &cfg->sock, 1); 13540 if (err) { 13541 kfree(cfg); 13542 return err; 13543 } 13544 if (inet_csk_get_port(cfg->sock->sk, port)) { 13545 sock_release(cfg->sock); 13546 kfree(cfg); 13547 return -EADDRINUSE; 13548 } 13549 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; 13550 #else 13551 if (!port) { 13552 kfree(cfg); 13553 return -EINVAL; 13554 } 13555 cfg->src_port = port; 13556 #endif 13557 13558 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); 13559 cfg->payload_len = data_size; 13560 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; 13561 memcpy((void *)cfg->payload, 13562 nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]), 13563 data_size); 13564 if (seq) 13565 cfg->payload_seq = *seq; 13566 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); 13567 cfg->wake_len = wake_size; 13568 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; 13569 memcpy((void *)cfg->wake_data, 13570 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]), 13571 wake_size); 13572 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + 13573 data_size + wake_size; 13574 memcpy((void *)cfg->wake_mask, 13575 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]), 13576 wake_mask_size); 13577 if (tok) { 13578 cfg->tokens_size = tokens_size; 13579 cfg->payload_tok = *tok; 13580 memcpy(cfg->payload_tok.token_stream, tok->token_stream, 13581 tokens_size); 13582 } 13583 13584 trig->tcp = cfg; 13585 13586 return 0; 13587 } 13588 13589 static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev, 13590 const struct wiphy_wowlan_support *wowlan, 13591 struct nlattr *attr, 13592 struct cfg80211_wowlan *trig) 13593 { 13594 struct nlattr **tb; 13595 int err; 13596 13597 tb = kcalloc(NUM_NL80211_ATTR, sizeof(*tb), GFP_KERNEL); 13598 if (!tb) 13599 return -ENOMEM; 13600 13601 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) { 13602 err = -EOPNOTSUPP; 13603 goto out; 13604 } 13605 13606 err = nla_parse_nested_deprecated(tb, NL80211_ATTR_MAX, attr, 13607 nl80211_policy, NULL); 13608 if (err) 13609 goto out; 13610 13611 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb, 13612 wowlan->max_nd_match_sets); 13613 err = PTR_ERR_OR_ZERO(trig->nd_config); 13614 if (err) 13615 trig->nd_config = NULL; 13616 13617 out: 13618 kfree(tb); 13619 return err; 13620 } 13621 13622 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info) 13623 { 13624 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13625 struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG]; 13626 struct cfg80211_wowlan new_triggers = {}; 13627 struct cfg80211_wowlan *ntrig; 13628 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; 13629 int err, i; 13630 bool prev_enabled = rdev->wiphy.wowlan_config; 13631 bool regular = false; 13632 13633 if (!wowlan) 13634 return -EOPNOTSUPP; 13635 13636 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { 13637 cfg80211_rdev_free_wowlan(rdev); 13638 rdev->wiphy.wowlan_config = NULL; 13639 goto set_wakeup; 13640 } 13641 13642 err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TRIG, 13643 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS], 13644 nl80211_wowlan_policy, info->extack); 13645 if (err) 13646 return err; 13647 13648 if (tb[NL80211_WOWLAN_TRIG_ANY]) { 13649 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) 13650 return -EINVAL; 13651 new_triggers.any = true; 13652 } 13653 13654 if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) { 13655 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) 13656 return -EINVAL; 13657 new_triggers.disconnect = true; 13658 regular = true; 13659 } 13660 13661 if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) { 13662 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) 13663 return -EINVAL; 13664 new_triggers.magic_pkt = true; 13665 regular = true; 13666 } 13667 13668 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED]) 13669 return -EINVAL; 13670 13671 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) { 13672 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) 13673 return -EINVAL; 13674 new_triggers.gtk_rekey_failure = true; 13675 regular = true; 13676 } 13677 13678 if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) { 13679 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) 13680 return -EINVAL; 13681 new_triggers.eap_identity_req = true; 13682 regular = true; 13683 } 13684 13685 if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) { 13686 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) 13687 return -EINVAL; 13688 new_triggers.four_way_handshake = true; 13689 regular = true; 13690 } 13691 13692 if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) { 13693 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) 13694 return -EINVAL; 13695 new_triggers.rfkill_release = true; 13696 regular = true; 13697 } 13698 13699 if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) { 13700 struct nlattr *pat; 13701 int n_patterns = 0; 13702 int rem, pat_len, mask_len, pkt_offset; 13703 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 13704 13705 regular = true; 13706 13707 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 13708 rem) 13709 n_patterns++; 13710 if (n_patterns > wowlan->n_patterns) 13711 return -EINVAL; 13712 13713 new_triggers.patterns = kcalloc(n_patterns, 13714 sizeof(new_triggers.patterns[0]), 13715 GFP_KERNEL); 13716 if (!new_triggers.patterns) 13717 return -ENOMEM; 13718 13719 new_triggers.n_patterns = n_patterns; 13720 i = 0; 13721 13722 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 13723 rem) { 13724 u8 *mask_pat; 13725 13726 err = nla_parse_nested_deprecated(pat_tb, 13727 MAX_NL80211_PKTPAT, 13728 pat, 13729 nl80211_packet_pattern_policy, 13730 info->extack); 13731 if (err) 13732 goto error; 13733 13734 err = -EINVAL; 13735 if (!pat_tb[NL80211_PKTPAT_MASK] || 13736 !pat_tb[NL80211_PKTPAT_PATTERN]) 13737 goto error; 13738 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 13739 mask_len = DIV_ROUND_UP(pat_len, 8); 13740 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 13741 goto error; 13742 if (pat_len > wowlan->pattern_max_len || 13743 pat_len < wowlan->pattern_min_len) 13744 goto error; 13745 13746 if (!pat_tb[NL80211_PKTPAT_OFFSET]) 13747 pkt_offset = 0; 13748 else 13749 pkt_offset = nla_get_u32( 13750 pat_tb[NL80211_PKTPAT_OFFSET]); 13751 if (pkt_offset > wowlan->max_pkt_offset) 13752 goto error; 13753 new_triggers.patterns[i].pkt_offset = pkt_offset; 13754 13755 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL); 13756 if (!mask_pat) { 13757 err = -ENOMEM; 13758 goto error; 13759 } 13760 new_triggers.patterns[i].mask = mask_pat; 13761 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]), 13762 mask_len); 13763 mask_pat += mask_len; 13764 new_triggers.patterns[i].pattern = mask_pat; 13765 new_triggers.patterns[i].pattern_len = pat_len; 13766 memcpy(mask_pat, 13767 nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 13768 pat_len); 13769 i++; 13770 } 13771 } 13772 13773 if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) { 13774 regular = true; 13775 err = nl80211_parse_wowlan_tcp( 13776 rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION], 13777 &new_triggers); 13778 if (err) 13779 goto error; 13780 } 13781 13782 if (tb[NL80211_WOWLAN_TRIG_NET_DETECT]) { 13783 regular = true; 13784 err = nl80211_parse_wowlan_nd( 13785 rdev, wowlan, tb[NL80211_WOWLAN_TRIG_NET_DETECT], 13786 &new_triggers); 13787 if (err) 13788 goto error; 13789 } 13790 13791 /* The 'any' trigger means the device continues operating more or less 13792 * as in its normal operation mode and wakes up the host on most of the 13793 * normal interrupts (like packet RX, ...) 13794 * It therefore makes little sense to combine with the more constrained 13795 * wakeup trigger modes. 13796 */ 13797 if (new_triggers.any && regular) { 13798 err = -EINVAL; 13799 goto error; 13800 } 13801 13802 ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL); 13803 if (!ntrig) { 13804 err = -ENOMEM; 13805 goto error; 13806 } 13807 cfg80211_rdev_free_wowlan(rdev); 13808 rdev->wiphy.wowlan_config = ntrig; 13809 13810 set_wakeup: 13811 if (rdev->ops->set_wakeup && 13812 prev_enabled != !!rdev->wiphy.wowlan_config) 13813 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); 13814 13815 return 0; 13816 error: 13817 for (i = 0; i < new_triggers.n_patterns; i++) 13818 kfree(new_triggers.patterns[i].mask); 13819 kfree(new_triggers.patterns); 13820 if (new_triggers.tcp && new_triggers.tcp->sock) 13821 sock_release(new_triggers.tcp->sock); 13822 kfree(new_triggers.tcp); 13823 kfree(new_triggers.nd_config); 13824 return err; 13825 } 13826 #endif 13827 13828 static int nl80211_send_coalesce_rules(struct sk_buff *msg, 13829 struct cfg80211_registered_device *rdev) 13830 { 13831 struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules; 13832 int i, j, pat_len; 13833 struct cfg80211_coalesce_rules *rule; 13834 13835 if (!rdev->coalesce->n_rules) 13836 return 0; 13837 13838 nl_rules = nla_nest_start_noflag(msg, NL80211_ATTR_COALESCE_RULE); 13839 if (!nl_rules) 13840 return -ENOBUFS; 13841 13842 for (i = 0; i < rdev->coalesce->n_rules; i++) { 13843 nl_rule = nla_nest_start_noflag(msg, i + 1); 13844 if (!nl_rule) 13845 return -ENOBUFS; 13846 13847 rule = &rdev->coalesce->rules[i]; 13848 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY, 13849 rule->delay)) 13850 return -ENOBUFS; 13851 13852 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION, 13853 rule->condition)) 13854 return -ENOBUFS; 13855 13856 nl_pats = nla_nest_start_noflag(msg, 13857 NL80211_ATTR_COALESCE_RULE_PKT_PATTERN); 13858 if (!nl_pats) 13859 return -ENOBUFS; 13860 13861 for (j = 0; j < rule->n_patterns; j++) { 13862 nl_pat = nla_nest_start_noflag(msg, j + 1); 13863 if (!nl_pat) 13864 return -ENOBUFS; 13865 pat_len = rule->patterns[j].pattern_len; 13866 if (nla_put(msg, NL80211_PKTPAT_MASK, 13867 DIV_ROUND_UP(pat_len, 8), 13868 rule->patterns[j].mask) || 13869 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 13870 rule->patterns[j].pattern) || 13871 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 13872 rule->patterns[j].pkt_offset)) 13873 return -ENOBUFS; 13874 nla_nest_end(msg, nl_pat); 13875 } 13876 nla_nest_end(msg, nl_pats); 13877 nla_nest_end(msg, nl_rule); 13878 } 13879 nla_nest_end(msg, nl_rules); 13880 13881 return 0; 13882 } 13883 13884 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info) 13885 { 13886 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13887 struct sk_buff *msg; 13888 void *hdr; 13889 13890 if (!rdev->wiphy.coalesce) 13891 return -EOPNOTSUPP; 13892 13893 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 13894 if (!msg) 13895 return -ENOMEM; 13896 13897 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 13898 NL80211_CMD_GET_COALESCE); 13899 if (!hdr) 13900 goto nla_put_failure; 13901 13902 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) 13903 goto nla_put_failure; 13904 13905 genlmsg_end(msg, hdr); 13906 return genlmsg_reply(msg, info); 13907 13908 nla_put_failure: 13909 nlmsg_free(msg); 13910 return -ENOBUFS; 13911 } 13912 13913 void cfg80211_rdev_free_coalesce(struct cfg80211_registered_device *rdev) 13914 { 13915 struct cfg80211_coalesce *coalesce = rdev->coalesce; 13916 int i, j; 13917 struct cfg80211_coalesce_rules *rule; 13918 13919 if (!coalesce) 13920 return; 13921 13922 for (i = 0; i < coalesce->n_rules; i++) { 13923 rule = &coalesce->rules[i]; 13924 for (j = 0; j < rule->n_patterns; j++) 13925 kfree(rule->patterns[j].mask); 13926 kfree(rule->patterns); 13927 } 13928 kfree(coalesce->rules); 13929 kfree(coalesce); 13930 rdev->coalesce = NULL; 13931 } 13932 13933 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev, 13934 struct nlattr *rule, 13935 struct cfg80211_coalesce_rules *new_rule) 13936 { 13937 int err, i; 13938 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 13939 struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat; 13940 int rem, pat_len, mask_len, pkt_offset, n_patterns = 0; 13941 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 13942 13943 err = nla_parse_nested_deprecated(tb, NL80211_ATTR_COALESCE_RULE_MAX, 13944 rule, nl80211_coalesce_policy, NULL); 13945 if (err) 13946 return err; 13947 13948 if (tb[NL80211_ATTR_COALESCE_RULE_DELAY]) 13949 new_rule->delay = 13950 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]); 13951 if (new_rule->delay > coalesce->max_delay) 13952 return -EINVAL; 13953 13954 if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION]) 13955 new_rule->condition = 13956 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]); 13957 13958 if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN]) 13959 return -EINVAL; 13960 13961 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 13962 rem) 13963 n_patterns++; 13964 if (n_patterns > coalesce->n_patterns) 13965 return -EINVAL; 13966 13967 new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]), 13968 GFP_KERNEL); 13969 if (!new_rule->patterns) 13970 return -ENOMEM; 13971 13972 new_rule->n_patterns = n_patterns; 13973 i = 0; 13974 13975 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 13976 rem) { 13977 u8 *mask_pat; 13978 13979 err = nla_parse_nested_deprecated(pat_tb, MAX_NL80211_PKTPAT, 13980 pat, 13981 nl80211_packet_pattern_policy, 13982 NULL); 13983 if (err) 13984 return err; 13985 13986 if (!pat_tb[NL80211_PKTPAT_MASK] || 13987 !pat_tb[NL80211_PKTPAT_PATTERN]) 13988 return -EINVAL; 13989 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 13990 mask_len = DIV_ROUND_UP(pat_len, 8); 13991 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 13992 return -EINVAL; 13993 if (pat_len > coalesce->pattern_max_len || 13994 pat_len < coalesce->pattern_min_len) 13995 return -EINVAL; 13996 13997 if (!pat_tb[NL80211_PKTPAT_OFFSET]) 13998 pkt_offset = 0; 13999 else 14000 pkt_offset = nla_get_u32(pat_tb[NL80211_PKTPAT_OFFSET]); 14001 if (pkt_offset > coalesce->max_pkt_offset) 14002 return -EINVAL; 14003 new_rule->patterns[i].pkt_offset = pkt_offset; 14004 14005 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL); 14006 if (!mask_pat) 14007 return -ENOMEM; 14008 14009 new_rule->patterns[i].mask = mask_pat; 14010 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]), 14011 mask_len); 14012 14013 mask_pat += mask_len; 14014 new_rule->patterns[i].pattern = mask_pat; 14015 new_rule->patterns[i].pattern_len = pat_len; 14016 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 14017 pat_len); 14018 i++; 14019 } 14020 14021 return 0; 14022 } 14023 14024 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info) 14025 { 14026 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14027 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 14028 struct cfg80211_coalesce new_coalesce = {}; 14029 struct cfg80211_coalesce *n_coalesce; 14030 int err, rem_rule, n_rules = 0, i, j; 14031 struct nlattr *rule; 14032 struct cfg80211_coalesce_rules *tmp_rule; 14033 14034 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) 14035 return -EOPNOTSUPP; 14036 14037 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { 14038 cfg80211_rdev_free_coalesce(rdev); 14039 rdev_set_coalesce(rdev, NULL); 14040 return 0; 14041 } 14042 14043 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 14044 rem_rule) 14045 n_rules++; 14046 if (n_rules > coalesce->n_rules) 14047 return -EINVAL; 14048 14049 new_coalesce.rules = kcalloc(n_rules, sizeof(new_coalesce.rules[0]), 14050 GFP_KERNEL); 14051 if (!new_coalesce.rules) 14052 return -ENOMEM; 14053 14054 new_coalesce.n_rules = n_rules; 14055 i = 0; 14056 14057 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 14058 rem_rule) { 14059 err = nl80211_parse_coalesce_rule(rdev, rule, 14060 &new_coalesce.rules[i]); 14061 if (err) 14062 goto error; 14063 14064 i++; 14065 } 14066 14067 err = rdev_set_coalesce(rdev, &new_coalesce); 14068 if (err) 14069 goto error; 14070 14071 n_coalesce = kmemdup(&new_coalesce, sizeof(new_coalesce), GFP_KERNEL); 14072 if (!n_coalesce) { 14073 err = -ENOMEM; 14074 goto error; 14075 } 14076 cfg80211_rdev_free_coalesce(rdev); 14077 rdev->coalesce = n_coalesce; 14078 14079 return 0; 14080 error: 14081 for (i = 0; i < new_coalesce.n_rules; i++) { 14082 tmp_rule = &new_coalesce.rules[i]; 14083 for (j = 0; j < tmp_rule->n_patterns; j++) 14084 kfree(tmp_rule->patterns[j].mask); 14085 kfree(tmp_rule->patterns); 14086 } 14087 kfree(new_coalesce.rules); 14088 14089 return err; 14090 } 14091 14092 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info) 14093 { 14094 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14095 struct net_device *dev = info->user_ptr[1]; 14096 struct wireless_dev *wdev = dev->ieee80211_ptr; 14097 struct nlattr *tb[NUM_NL80211_REKEY_DATA]; 14098 struct cfg80211_gtk_rekey_data rekey_data = {}; 14099 int err; 14100 14101 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) 14102 return -EINVAL; 14103 14104 err = nla_parse_nested_deprecated(tb, MAX_NL80211_REKEY_DATA, 14105 info->attrs[NL80211_ATTR_REKEY_DATA], 14106 nl80211_rekey_policy, info->extack); 14107 if (err) 14108 return err; 14109 14110 if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] || 14111 !tb[NL80211_REKEY_DATA_KCK]) 14112 return -EINVAL; 14113 if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN && 14114 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && 14115 nla_len(tb[NL80211_REKEY_DATA_KEK]) == NL80211_KEK_EXT_LEN)) 14116 return -ERANGE; 14117 if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN && 14118 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && 14119 nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN) && 14120 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KCK_32 && 14121 nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN_32)) 14122 return -ERANGE; 14123 14124 rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]); 14125 rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]); 14126 rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]); 14127 rekey_data.kek_len = nla_len(tb[NL80211_REKEY_DATA_KEK]); 14128 rekey_data.kck_len = nla_len(tb[NL80211_REKEY_DATA_KCK]); 14129 if (tb[NL80211_REKEY_DATA_AKM]) 14130 rekey_data.akm = nla_get_u32(tb[NL80211_REKEY_DATA_AKM]); 14131 14132 if (!wdev->connected) 14133 return -ENOTCONN; 14134 14135 if (!rdev->ops->set_rekey_data) 14136 return -EOPNOTSUPP; 14137 14138 return rdev_set_rekey_data(rdev, dev, &rekey_data); 14139 } 14140 14141 static int nl80211_register_unexpected_frame(struct sk_buff *skb, 14142 struct genl_info *info) 14143 { 14144 struct net_device *dev = info->user_ptr[1]; 14145 struct wireless_dev *wdev = dev->ieee80211_ptr; 14146 14147 if (wdev->iftype != NL80211_IFTYPE_AP && 14148 wdev->iftype != NL80211_IFTYPE_P2P_GO) 14149 return -EINVAL; 14150 14151 if (wdev->ap_unexpected_nlportid) 14152 return -EBUSY; 14153 14154 wdev->ap_unexpected_nlportid = info->snd_portid; 14155 return 0; 14156 } 14157 14158 static int nl80211_probe_client(struct sk_buff *skb, 14159 struct genl_info *info) 14160 { 14161 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14162 struct net_device *dev = info->user_ptr[1]; 14163 struct wireless_dev *wdev = dev->ieee80211_ptr; 14164 struct sk_buff *msg; 14165 void *hdr; 14166 const u8 *addr; 14167 u64 cookie; 14168 int err; 14169 14170 if (wdev->iftype != NL80211_IFTYPE_AP && 14171 wdev->iftype != NL80211_IFTYPE_P2P_GO) 14172 return -EOPNOTSUPP; 14173 14174 if (!info->attrs[NL80211_ATTR_MAC]) 14175 return -EINVAL; 14176 14177 if (!rdev->ops->probe_client) 14178 return -EOPNOTSUPP; 14179 14180 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14181 if (!msg) 14182 return -ENOMEM; 14183 14184 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 14185 NL80211_CMD_PROBE_CLIENT); 14186 if (!hdr) { 14187 err = -ENOBUFS; 14188 goto free_msg; 14189 } 14190 14191 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 14192 14193 err = rdev_probe_client(rdev, dev, addr, &cookie); 14194 if (err) 14195 goto free_msg; 14196 14197 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 14198 NL80211_ATTR_PAD)) 14199 goto nla_put_failure; 14200 14201 genlmsg_end(msg, hdr); 14202 14203 return genlmsg_reply(msg, info); 14204 14205 nla_put_failure: 14206 err = -ENOBUFS; 14207 free_msg: 14208 nlmsg_free(msg); 14209 return err; 14210 } 14211 14212 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info) 14213 { 14214 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14215 struct cfg80211_beacon_registration *reg, *nreg; 14216 int rv; 14217 14218 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) 14219 return -EOPNOTSUPP; 14220 14221 nreg = kzalloc(sizeof(*nreg), GFP_KERNEL); 14222 if (!nreg) 14223 return -ENOMEM; 14224 14225 /* First, check if already registered. */ 14226 spin_lock_bh(&rdev->beacon_registrations_lock); 14227 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 14228 if (reg->nlportid == info->snd_portid) { 14229 rv = -EALREADY; 14230 goto out_err; 14231 } 14232 } 14233 /* Add it to the list */ 14234 nreg->nlportid = info->snd_portid; 14235 list_add(&nreg->list, &rdev->beacon_registrations); 14236 14237 spin_unlock_bh(&rdev->beacon_registrations_lock); 14238 14239 return 0; 14240 out_err: 14241 spin_unlock_bh(&rdev->beacon_registrations_lock); 14242 kfree(nreg); 14243 return rv; 14244 } 14245 14246 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info) 14247 { 14248 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14249 struct wireless_dev *wdev = info->user_ptr[1]; 14250 int err; 14251 14252 if (!rdev->ops->start_p2p_device) 14253 return -EOPNOTSUPP; 14254 14255 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 14256 return -EOPNOTSUPP; 14257 14258 if (wdev_running(wdev)) 14259 return 0; 14260 14261 if (rfkill_blocked(rdev->wiphy.rfkill)) 14262 return -ERFKILL; 14263 14264 err = rdev_start_p2p_device(rdev, wdev); 14265 if (err) 14266 return err; 14267 14268 wdev->is_running = true; 14269 rdev->opencount++; 14270 14271 return 0; 14272 } 14273 14274 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info) 14275 { 14276 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14277 struct wireless_dev *wdev = info->user_ptr[1]; 14278 14279 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 14280 return -EOPNOTSUPP; 14281 14282 if (!rdev->ops->stop_p2p_device) 14283 return -EOPNOTSUPP; 14284 14285 cfg80211_stop_p2p_device(rdev, wdev); 14286 14287 return 0; 14288 } 14289 14290 static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info) 14291 { 14292 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14293 struct wireless_dev *wdev = info->user_ptr[1]; 14294 struct cfg80211_nan_conf conf = {}; 14295 int err; 14296 14297 if (wdev->iftype != NL80211_IFTYPE_NAN) 14298 return -EOPNOTSUPP; 14299 14300 if (wdev_running(wdev)) 14301 return -EEXIST; 14302 14303 if (rfkill_blocked(rdev->wiphy.rfkill)) 14304 return -ERFKILL; 14305 14306 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) 14307 return -EINVAL; 14308 14309 conf.master_pref = 14310 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); 14311 14312 if (info->attrs[NL80211_ATTR_BANDS]) { 14313 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); 14314 14315 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) 14316 return -EOPNOTSUPP; 14317 14318 if (bands && !(bands & BIT(NL80211_BAND_2GHZ))) 14319 return -EINVAL; 14320 14321 conf.bands = bands; 14322 } 14323 14324 err = rdev_start_nan(rdev, wdev, &conf); 14325 if (err) 14326 return err; 14327 14328 wdev->is_running = true; 14329 rdev->opencount++; 14330 14331 return 0; 14332 } 14333 14334 static int nl80211_stop_nan(struct sk_buff *skb, struct genl_info *info) 14335 { 14336 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14337 struct wireless_dev *wdev = info->user_ptr[1]; 14338 14339 if (wdev->iftype != NL80211_IFTYPE_NAN) 14340 return -EOPNOTSUPP; 14341 14342 cfg80211_stop_nan(rdev, wdev); 14343 14344 return 0; 14345 } 14346 14347 static int validate_nan_filter(struct nlattr *filter_attr) 14348 { 14349 struct nlattr *attr; 14350 int len = 0, n_entries = 0, rem; 14351 14352 nla_for_each_nested(attr, filter_attr, rem) { 14353 len += nla_len(attr); 14354 n_entries++; 14355 } 14356 14357 if (len >= U8_MAX) 14358 return -EINVAL; 14359 14360 return n_entries; 14361 } 14362 14363 static int handle_nan_filter(struct nlattr *attr_filter, 14364 struct cfg80211_nan_func *func, 14365 bool tx) 14366 { 14367 struct nlattr *attr; 14368 int n_entries, rem, i; 14369 struct cfg80211_nan_func_filter *filter; 14370 14371 n_entries = validate_nan_filter(attr_filter); 14372 if (n_entries < 0) 14373 return n_entries; 14374 14375 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters)); 14376 14377 filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL); 14378 if (!filter) 14379 return -ENOMEM; 14380 14381 i = 0; 14382 nla_for_each_nested(attr, attr_filter, rem) { 14383 filter[i].filter = nla_memdup(attr, GFP_KERNEL); 14384 if (!filter[i].filter) 14385 goto err; 14386 14387 filter[i].len = nla_len(attr); 14388 i++; 14389 } 14390 if (tx) { 14391 func->num_tx_filters = n_entries; 14392 func->tx_filters = filter; 14393 } else { 14394 func->num_rx_filters = n_entries; 14395 func->rx_filters = filter; 14396 } 14397 14398 return 0; 14399 14400 err: 14401 i = 0; 14402 nla_for_each_nested(attr, attr_filter, rem) { 14403 kfree(filter[i].filter); 14404 i++; 14405 } 14406 kfree(filter); 14407 return -ENOMEM; 14408 } 14409 14410 static int nl80211_nan_add_func(struct sk_buff *skb, 14411 struct genl_info *info) 14412 { 14413 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14414 struct wireless_dev *wdev = info->user_ptr[1]; 14415 struct nlattr *tb[NUM_NL80211_NAN_FUNC_ATTR], *func_attr; 14416 struct cfg80211_nan_func *func; 14417 struct sk_buff *msg = NULL; 14418 void *hdr = NULL; 14419 int err = 0; 14420 14421 if (wdev->iftype != NL80211_IFTYPE_NAN) 14422 return -EOPNOTSUPP; 14423 14424 if (!wdev_running(wdev)) 14425 return -ENOTCONN; 14426 14427 if (!info->attrs[NL80211_ATTR_NAN_FUNC]) 14428 return -EINVAL; 14429 14430 err = nla_parse_nested_deprecated(tb, NL80211_NAN_FUNC_ATTR_MAX, 14431 info->attrs[NL80211_ATTR_NAN_FUNC], 14432 nl80211_nan_func_policy, 14433 info->extack); 14434 if (err) 14435 return err; 14436 14437 func = kzalloc(sizeof(*func), GFP_KERNEL); 14438 if (!func) 14439 return -ENOMEM; 14440 14441 func->cookie = cfg80211_assign_cookie(rdev); 14442 14443 if (!tb[NL80211_NAN_FUNC_TYPE]) { 14444 err = -EINVAL; 14445 goto out; 14446 } 14447 14448 14449 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]); 14450 14451 if (!tb[NL80211_NAN_FUNC_SERVICE_ID]) { 14452 err = -EINVAL; 14453 goto out; 14454 } 14455 14456 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]), 14457 sizeof(func->service_id)); 14458 14459 func->close_range = 14460 nla_get_flag(tb[NL80211_NAN_FUNC_CLOSE_RANGE]); 14461 14462 if (tb[NL80211_NAN_FUNC_SERVICE_INFO]) { 14463 func->serv_spec_info_len = 14464 nla_len(tb[NL80211_NAN_FUNC_SERVICE_INFO]); 14465 func->serv_spec_info = 14466 kmemdup(nla_data(tb[NL80211_NAN_FUNC_SERVICE_INFO]), 14467 func->serv_spec_info_len, 14468 GFP_KERNEL); 14469 if (!func->serv_spec_info) { 14470 err = -ENOMEM; 14471 goto out; 14472 } 14473 } 14474 14475 if (tb[NL80211_NAN_FUNC_TTL]) 14476 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]); 14477 14478 switch (func->type) { 14479 case NL80211_NAN_FUNC_PUBLISH: 14480 if (!tb[NL80211_NAN_FUNC_PUBLISH_TYPE]) { 14481 err = -EINVAL; 14482 goto out; 14483 } 14484 14485 func->publish_type = 14486 nla_get_u8(tb[NL80211_NAN_FUNC_PUBLISH_TYPE]); 14487 func->publish_bcast = 14488 nla_get_flag(tb[NL80211_NAN_FUNC_PUBLISH_BCAST]); 14489 14490 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) && 14491 func->publish_bcast) { 14492 err = -EINVAL; 14493 goto out; 14494 } 14495 break; 14496 case NL80211_NAN_FUNC_SUBSCRIBE: 14497 func->subscribe_active = 14498 nla_get_flag(tb[NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE]); 14499 break; 14500 case NL80211_NAN_FUNC_FOLLOW_UP: 14501 if (!tb[NL80211_NAN_FUNC_FOLLOW_UP_ID] || 14502 !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] || 14503 !tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]) { 14504 err = -EINVAL; 14505 goto out; 14506 } 14507 14508 func->followup_id = 14509 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_ID]); 14510 func->followup_reqid = 14511 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]); 14512 memcpy(func->followup_dest.addr, 14513 nla_data(tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]), 14514 sizeof(func->followup_dest.addr)); 14515 if (func->ttl) { 14516 err = -EINVAL; 14517 goto out; 14518 } 14519 break; 14520 default: 14521 err = -EINVAL; 14522 goto out; 14523 } 14524 14525 if (tb[NL80211_NAN_FUNC_SRF]) { 14526 struct nlattr *srf_tb[NUM_NL80211_NAN_SRF_ATTR]; 14527 14528 err = nla_parse_nested_deprecated(srf_tb, 14529 NL80211_NAN_SRF_ATTR_MAX, 14530 tb[NL80211_NAN_FUNC_SRF], 14531 nl80211_nan_srf_policy, 14532 info->extack); 14533 if (err) 14534 goto out; 14535 14536 func->srf_include = 14537 nla_get_flag(srf_tb[NL80211_NAN_SRF_INCLUDE]); 14538 14539 if (srf_tb[NL80211_NAN_SRF_BF]) { 14540 if (srf_tb[NL80211_NAN_SRF_MAC_ADDRS] || 14541 !srf_tb[NL80211_NAN_SRF_BF_IDX]) { 14542 err = -EINVAL; 14543 goto out; 14544 } 14545 14546 func->srf_bf_len = 14547 nla_len(srf_tb[NL80211_NAN_SRF_BF]); 14548 func->srf_bf = 14549 kmemdup(nla_data(srf_tb[NL80211_NAN_SRF_BF]), 14550 func->srf_bf_len, GFP_KERNEL); 14551 if (!func->srf_bf) { 14552 err = -ENOMEM; 14553 goto out; 14554 } 14555 14556 func->srf_bf_idx = 14557 nla_get_u8(srf_tb[NL80211_NAN_SRF_BF_IDX]); 14558 } else { 14559 struct nlattr *attr, *mac_attr = 14560 srf_tb[NL80211_NAN_SRF_MAC_ADDRS]; 14561 int n_entries, rem, i = 0; 14562 14563 if (!mac_attr) { 14564 err = -EINVAL; 14565 goto out; 14566 } 14567 14568 n_entries = validate_acl_mac_addrs(mac_attr); 14569 if (n_entries <= 0) { 14570 err = -EINVAL; 14571 goto out; 14572 } 14573 14574 func->srf_num_macs = n_entries; 14575 func->srf_macs = 14576 kcalloc(n_entries, sizeof(*func->srf_macs), 14577 GFP_KERNEL); 14578 if (!func->srf_macs) { 14579 err = -ENOMEM; 14580 goto out; 14581 } 14582 14583 nla_for_each_nested(attr, mac_attr, rem) 14584 memcpy(func->srf_macs[i++].addr, nla_data(attr), 14585 sizeof(*func->srf_macs)); 14586 } 14587 } 14588 14589 if (tb[NL80211_NAN_FUNC_TX_MATCH_FILTER]) { 14590 err = handle_nan_filter(tb[NL80211_NAN_FUNC_TX_MATCH_FILTER], 14591 func, true); 14592 if (err) 14593 goto out; 14594 } 14595 14596 if (tb[NL80211_NAN_FUNC_RX_MATCH_FILTER]) { 14597 err = handle_nan_filter(tb[NL80211_NAN_FUNC_RX_MATCH_FILTER], 14598 func, false); 14599 if (err) 14600 goto out; 14601 } 14602 14603 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14604 if (!msg) { 14605 err = -ENOMEM; 14606 goto out; 14607 } 14608 14609 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 14610 NL80211_CMD_ADD_NAN_FUNCTION); 14611 /* This can't really happen - we just allocated 4KB */ 14612 if (WARN_ON(!hdr)) { 14613 err = -ENOMEM; 14614 goto out; 14615 } 14616 14617 err = rdev_add_nan_func(rdev, wdev, func); 14618 out: 14619 if (err < 0) { 14620 cfg80211_free_nan_func(func); 14621 nlmsg_free(msg); 14622 return err; 14623 } 14624 14625 /* propagate the instance id and cookie to userspace */ 14626 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie, 14627 NL80211_ATTR_PAD)) 14628 goto nla_put_failure; 14629 14630 func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC); 14631 if (!func_attr) 14632 goto nla_put_failure; 14633 14634 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, 14635 func->instance_id)) 14636 goto nla_put_failure; 14637 14638 nla_nest_end(msg, func_attr); 14639 14640 genlmsg_end(msg, hdr); 14641 return genlmsg_reply(msg, info); 14642 14643 nla_put_failure: 14644 nlmsg_free(msg); 14645 return -ENOBUFS; 14646 } 14647 14648 static int nl80211_nan_del_func(struct sk_buff *skb, 14649 struct genl_info *info) 14650 { 14651 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14652 struct wireless_dev *wdev = info->user_ptr[1]; 14653 u64 cookie; 14654 14655 if (wdev->iftype != NL80211_IFTYPE_NAN) 14656 return -EOPNOTSUPP; 14657 14658 if (!wdev_running(wdev)) 14659 return -ENOTCONN; 14660 14661 if (!info->attrs[NL80211_ATTR_COOKIE]) 14662 return -EINVAL; 14663 14664 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 14665 14666 rdev_del_nan_func(rdev, wdev, cookie); 14667 14668 return 0; 14669 } 14670 14671 static int nl80211_nan_change_config(struct sk_buff *skb, 14672 struct genl_info *info) 14673 { 14674 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14675 struct wireless_dev *wdev = info->user_ptr[1]; 14676 struct cfg80211_nan_conf conf = {}; 14677 u32 changed = 0; 14678 14679 if (wdev->iftype != NL80211_IFTYPE_NAN) 14680 return -EOPNOTSUPP; 14681 14682 if (!wdev_running(wdev)) 14683 return -ENOTCONN; 14684 14685 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { 14686 conf.master_pref = 14687 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); 14688 if (conf.master_pref <= 1 || conf.master_pref == 255) 14689 return -EINVAL; 14690 14691 changed |= CFG80211_NAN_CONF_CHANGED_PREF; 14692 } 14693 14694 if (info->attrs[NL80211_ATTR_BANDS]) { 14695 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); 14696 14697 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) 14698 return -EOPNOTSUPP; 14699 14700 if (bands && !(bands & BIT(NL80211_BAND_2GHZ))) 14701 return -EINVAL; 14702 14703 conf.bands = bands; 14704 changed |= CFG80211_NAN_CONF_CHANGED_BANDS; 14705 } 14706 14707 if (!changed) 14708 return -EINVAL; 14709 14710 return rdev_nan_change_conf(rdev, wdev, &conf, changed); 14711 } 14712 14713 void cfg80211_nan_match(struct wireless_dev *wdev, 14714 struct cfg80211_nan_match_params *match, gfp_t gfp) 14715 { 14716 struct wiphy *wiphy = wdev->wiphy; 14717 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 14718 struct nlattr *match_attr, *local_func_attr, *peer_func_attr; 14719 struct sk_buff *msg; 14720 void *hdr; 14721 14722 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr)) 14723 return; 14724 14725 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 14726 if (!msg) 14727 return; 14728 14729 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_MATCH); 14730 if (!hdr) { 14731 nlmsg_free(msg); 14732 return; 14733 } 14734 14735 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 14736 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 14737 wdev->netdev->ifindex)) || 14738 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 14739 NL80211_ATTR_PAD)) 14740 goto nla_put_failure; 14741 14742 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie, 14743 NL80211_ATTR_PAD) || 14744 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr)) 14745 goto nla_put_failure; 14746 14747 match_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_MATCH); 14748 if (!match_attr) 14749 goto nla_put_failure; 14750 14751 local_func_attr = nla_nest_start_noflag(msg, 14752 NL80211_NAN_MATCH_FUNC_LOCAL); 14753 if (!local_func_attr) 14754 goto nla_put_failure; 14755 14756 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id)) 14757 goto nla_put_failure; 14758 14759 nla_nest_end(msg, local_func_attr); 14760 14761 peer_func_attr = nla_nest_start_noflag(msg, 14762 NL80211_NAN_MATCH_FUNC_PEER); 14763 if (!peer_func_attr) 14764 goto nla_put_failure; 14765 14766 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) || 14767 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id)) 14768 goto nla_put_failure; 14769 14770 if (match->info && match->info_len && 14771 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len, 14772 match->info)) 14773 goto nla_put_failure; 14774 14775 nla_nest_end(msg, peer_func_attr); 14776 nla_nest_end(msg, match_attr); 14777 genlmsg_end(msg, hdr); 14778 14779 if (!wdev->owner_nlportid) 14780 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 14781 msg, 0, NL80211_MCGRP_NAN, gfp); 14782 else 14783 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 14784 wdev->owner_nlportid); 14785 14786 return; 14787 14788 nla_put_failure: 14789 nlmsg_free(msg); 14790 } 14791 EXPORT_SYMBOL(cfg80211_nan_match); 14792 14793 void cfg80211_nan_func_terminated(struct wireless_dev *wdev, 14794 u8 inst_id, 14795 enum nl80211_nan_func_term_reason reason, 14796 u64 cookie, gfp_t gfp) 14797 { 14798 struct wiphy *wiphy = wdev->wiphy; 14799 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 14800 struct sk_buff *msg; 14801 struct nlattr *func_attr; 14802 void *hdr; 14803 14804 if (WARN_ON(!inst_id)) 14805 return; 14806 14807 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 14808 if (!msg) 14809 return; 14810 14811 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_NAN_FUNCTION); 14812 if (!hdr) { 14813 nlmsg_free(msg); 14814 return; 14815 } 14816 14817 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 14818 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 14819 wdev->netdev->ifindex)) || 14820 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 14821 NL80211_ATTR_PAD)) 14822 goto nla_put_failure; 14823 14824 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 14825 NL80211_ATTR_PAD)) 14826 goto nla_put_failure; 14827 14828 func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC); 14829 if (!func_attr) 14830 goto nla_put_failure; 14831 14832 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, inst_id) || 14833 nla_put_u8(msg, NL80211_NAN_FUNC_TERM_REASON, reason)) 14834 goto nla_put_failure; 14835 14836 nla_nest_end(msg, func_attr); 14837 genlmsg_end(msg, hdr); 14838 14839 if (!wdev->owner_nlportid) 14840 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 14841 msg, 0, NL80211_MCGRP_NAN, gfp); 14842 else 14843 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 14844 wdev->owner_nlportid); 14845 14846 return; 14847 14848 nla_put_failure: 14849 nlmsg_free(msg); 14850 } 14851 EXPORT_SYMBOL(cfg80211_nan_func_terminated); 14852 14853 static int nl80211_get_protocol_features(struct sk_buff *skb, 14854 struct genl_info *info) 14855 { 14856 void *hdr; 14857 struct sk_buff *msg; 14858 14859 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14860 if (!msg) 14861 return -ENOMEM; 14862 14863 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 14864 NL80211_CMD_GET_PROTOCOL_FEATURES); 14865 if (!hdr) 14866 goto nla_put_failure; 14867 14868 if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES, 14869 NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP)) 14870 goto nla_put_failure; 14871 14872 genlmsg_end(msg, hdr); 14873 return genlmsg_reply(msg, info); 14874 14875 nla_put_failure: 14876 kfree_skb(msg); 14877 return -ENOBUFS; 14878 } 14879 14880 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info) 14881 { 14882 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14883 struct cfg80211_update_ft_ies_params ft_params; 14884 struct net_device *dev = info->user_ptr[1]; 14885 14886 if (!rdev->ops->update_ft_ies) 14887 return -EOPNOTSUPP; 14888 14889 if (!info->attrs[NL80211_ATTR_MDID] || 14890 !info->attrs[NL80211_ATTR_IE]) 14891 return -EINVAL; 14892 14893 memset(&ft_params, 0, sizeof(ft_params)); 14894 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); 14895 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 14896 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 14897 14898 return rdev_update_ft_ies(rdev, dev, &ft_params); 14899 } 14900 14901 static int nl80211_crit_protocol_start(struct sk_buff *skb, 14902 struct genl_info *info) 14903 { 14904 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14905 struct wireless_dev *wdev = info->user_ptr[1]; 14906 enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC; 14907 u16 duration; 14908 int ret; 14909 14910 if (!rdev->ops->crit_proto_start) 14911 return -EOPNOTSUPP; 14912 14913 if (WARN_ON(!rdev->ops->crit_proto_stop)) 14914 return -EINVAL; 14915 14916 if (rdev->crit_proto_nlportid) 14917 return -EBUSY; 14918 14919 /* determine protocol if provided */ 14920 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) 14921 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); 14922 14923 if (proto >= NUM_NL80211_CRIT_PROTO) 14924 return -EINVAL; 14925 14926 /* timeout must be provided */ 14927 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) 14928 return -EINVAL; 14929 14930 duration = 14931 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); 14932 14933 ret = rdev_crit_proto_start(rdev, wdev, proto, duration); 14934 if (!ret) 14935 rdev->crit_proto_nlportid = info->snd_portid; 14936 14937 return ret; 14938 } 14939 14940 static int nl80211_crit_protocol_stop(struct sk_buff *skb, 14941 struct genl_info *info) 14942 { 14943 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14944 struct wireless_dev *wdev = info->user_ptr[1]; 14945 14946 if (!rdev->ops->crit_proto_stop) 14947 return -EOPNOTSUPP; 14948 14949 if (rdev->crit_proto_nlportid) { 14950 rdev->crit_proto_nlportid = 0; 14951 rdev_crit_proto_stop(rdev, wdev); 14952 } 14953 return 0; 14954 } 14955 14956 static int nl80211_vendor_check_policy(const struct wiphy_vendor_command *vcmd, 14957 struct nlattr *attr, 14958 struct netlink_ext_ack *extack) 14959 { 14960 if (vcmd->policy == VENDOR_CMD_RAW_DATA) { 14961 if (attr->nla_type & NLA_F_NESTED) { 14962 NL_SET_ERR_MSG_ATTR(extack, attr, 14963 "unexpected nested data"); 14964 return -EINVAL; 14965 } 14966 14967 return 0; 14968 } 14969 14970 if (!(attr->nla_type & NLA_F_NESTED)) { 14971 NL_SET_ERR_MSG_ATTR(extack, attr, "expected nested data"); 14972 return -EINVAL; 14973 } 14974 14975 return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack); 14976 } 14977 14978 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info) 14979 { 14980 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14981 struct wireless_dev *wdev = 14982 __cfg80211_wdev_from_attrs(rdev, genl_info_net(info), 14983 info->attrs); 14984 int i, err; 14985 u32 vid, subcmd; 14986 14987 if (!rdev->wiphy.vendor_commands) 14988 return -EOPNOTSUPP; 14989 14990 if (IS_ERR(wdev)) { 14991 err = PTR_ERR(wdev); 14992 if (err != -EINVAL) 14993 return err; 14994 wdev = NULL; 14995 } else if (wdev->wiphy != &rdev->wiphy) { 14996 return -EINVAL; 14997 } 14998 14999 if (!info->attrs[NL80211_ATTR_VENDOR_ID] || 15000 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD]) 15001 return -EINVAL; 15002 15003 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]); 15004 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]); 15005 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { 15006 const struct wiphy_vendor_command *vcmd; 15007 void *data = NULL; 15008 int len = 0; 15009 15010 vcmd = &rdev->wiphy.vendor_commands[i]; 15011 15012 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) 15013 continue; 15014 15015 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | 15016 WIPHY_VENDOR_CMD_NEED_NETDEV)) { 15017 if (!wdev) 15018 return -EINVAL; 15019 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && 15020 !wdev->netdev) 15021 return -EINVAL; 15022 15023 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { 15024 if (!wdev_running(wdev)) 15025 return -ENETDOWN; 15026 } 15027 } else { 15028 wdev = NULL; 15029 } 15030 15031 if (!vcmd->doit) 15032 return -EOPNOTSUPP; 15033 15034 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { 15035 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); 15036 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); 15037 15038 err = nl80211_vendor_check_policy(vcmd, 15039 info->attrs[NL80211_ATTR_VENDOR_DATA], 15040 info->extack); 15041 if (err) 15042 return err; 15043 } 15044 15045 rdev->cur_cmd_info = info; 15046 err = vcmd->doit(&rdev->wiphy, wdev, data, len); 15047 rdev->cur_cmd_info = NULL; 15048 return err; 15049 } 15050 15051 return -EOPNOTSUPP; 15052 } 15053 15054 static int nl80211_prepare_vendor_dump(struct sk_buff *skb, 15055 struct netlink_callback *cb, 15056 struct cfg80211_registered_device **rdev, 15057 struct wireless_dev **wdev) 15058 { 15059 struct nlattr **attrbuf; 15060 u32 vid, subcmd; 15061 unsigned int i; 15062 int vcmd_idx = -1; 15063 int err; 15064 void *data = NULL; 15065 unsigned int data_len = 0; 15066 15067 if (cb->args[0]) { 15068 /* subtract the 1 again here */ 15069 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); 15070 struct wireless_dev *tmp; 15071 15072 if (!wiphy) 15073 return -ENODEV; 15074 *rdev = wiphy_to_rdev(wiphy); 15075 *wdev = NULL; 15076 15077 if (cb->args[1]) { 15078 list_for_each_entry(tmp, &wiphy->wdev_list, list) { 15079 if (tmp->identifier == cb->args[1] - 1) { 15080 *wdev = tmp; 15081 break; 15082 } 15083 } 15084 } 15085 15086 /* keep rtnl locked in successful case */ 15087 return 0; 15088 } 15089 15090 attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf), GFP_KERNEL); 15091 if (!attrbuf) 15092 return -ENOMEM; 15093 15094 err = nlmsg_parse_deprecated(cb->nlh, 15095 GENL_HDRLEN + nl80211_fam.hdrsize, 15096 attrbuf, nl80211_fam.maxattr, 15097 nl80211_policy, NULL); 15098 if (err) 15099 goto out; 15100 15101 if (!attrbuf[NL80211_ATTR_VENDOR_ID] || 15102 !attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) { 15103 err = -EINVAL; 15104 goto out; 15105 } 15106 15107 *wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(skb->sk), attrbuf); 15108 if (IS_ERR(*wdev)) 15109 *wdev = NULL; 15110 15111 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); 15112 if (IS_ERR(*rdev)) { 15113 err = PTR_ERR(*rdev); 15114 goto out; 15115 } 15116 15117 vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]); 15118 subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]); 15119 15120 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { 15121 const struct wiphy_vendor_command *vcmd; 15122 15123 vcmd = &(*rdev)->wiphy.vendor_commands[i]; 15124 15125 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) 15126 continue; 15127 15128 if (!vcmd->dumpit) { 15129 err = -EOPNOTSUPP; 15130 goto out; 15131 } 15132 15133 vcmd_idx = i; 15134 break; 15135 } 15136 15137 if (vcmd_idx < 0) { 15138 err = -EOPNOTSUPP; 15139 goto out; 15140 } 15141 15142 if (attrbuf[NL80211_ATTR_VENDOR_DATA]) { 15143 data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]); 15144 data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]); 15145 15146 err = nl80211_vendor_check_policy( 15147 &(*rdev)->wiphy.vendor_commands[vcmd_idx], 15148 attrbuf[NL80211_ATTR_VENDOR_DATA], 15149 cb->extack); 15150 if (err) 15151 goto out; 15152 } 15153 15154 /* 0 is the first index - add 1 to parse only once */ 15155 cb->args[0] = (*rdev)->wiphy_idx + 1; 15156 /* add 1 to know if it was NULL */ 15157 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0; 15158 cb->args[2] = vcmd_idx; 15159 cb->args[3] = (unsigned long)data; 15160 cb->args[4] = data_len; 15161 15162 /* keep rtnl locked in successful case */ 15163 err = 0; 15164 out: 15165 kfree(attrbuf); 15166 return err; 15167 } 15168 15169 static int nl80211_vendor_cmd_dump(struct sk_buff *skb, 15170 struct netlink_callback *cb) 15171 { 15172 struct cfg80211_registered_device *rdev; 15173 struct wireless_dev *wdev; 15174 unsigned int vcmd_idx; 15175 const struct wiphy_vendor_command *vcmd; 15176 void *data; 15177 int data_len; 15178 int err; 15179 struct nlattr *vendor_data; 15180 15181 rtnl_lock(); 15182 err = nl80211_prepare_vendor_dump(skb, cb, &rdev, &wdev); 15183 if (err) 15184 goto out; 15185 15186 vcmd_idx = cb->args[2]; 15187 data = (void *)cb->args[3]; 15188 data_len = cb->args[4]; 15189 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx]; 15190 15191 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | 15192 WIPHY_VENDOR_CMD_NEED_NETDEV)) { 15193 if (!wdev) { 15194 err = -EINVAL; 15195 goto out; 15196 } 15197 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && 15198 !wdev->netdev) { 15199 err = -EINVAL; 15200 goto out; 15201 } 15202 15203 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { 15204 if (!wdev_running(wdev)) { 15205 err = -ENETDOWN; 15206 goto out; 15207 } 15208 } 15209 } 15210 15211 while (1) { 15212 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 15213 cb->nlh->nlmsg_seq, NLM_F_MULTI, 15214 NL80211_CMD_VENDOR); 15215 if (!hdr) 15216 break; 15217 15218 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15219 (wdev && nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 15220 wdev_id(wdev), 15221 NL80211_ATTR_PAD))) { 15222 genlmsg_cancel(skb, hdr); 15223 break; 15224 } 15225 15226 vendor_data = nla_nest_start_noflag(skb, 15227 NL80211_ATTR_VENDOR_DATA); 15228 if (!vendor_data) { 15229 genlmsg_cancel(skb, hdr); 15230 break; 15231 } 15232 15233 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len, 15234 (unsigned long *)&cb->args[5]); 15235 nla_nest_end(skb, vendor_data); 15236 15237 if (err == -ENOBUFS || err == -ENOENT) { 15238 genlmsg_cancel(skb, hdr); 15239 break; 15240 } else if (err <= 0) { 15241 genlmsg_cancel(skb, hdr); 15242 goto out; 15243 } 15244 15245 genlmsg_end(skb, hdr); 15246 } 15247 15248 err = skb->len; 15249 out: 15250 rtnl_unlock(); 15251 return err; 15252 } 15253 15254 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy, 15255 enum nl80211_commands cmd, 15256 enum nl80211_attrs attr, 15257 int approxlen) 15258 { 15259 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 15260 15261 if (WARN_ON(!rdev->cur_cmd_info)) 15262 return NULL; 15263 15264 return __cfg80211_alloc_vendor_skb(rdev, NULL, approxlen, 15265 rdev->cur_cmd_info->snd_portid, 15266 rdev->cur_cmd_info->snd_seq, 15267 cmd, attr, NULL, GFP_KERNEL); 15268 } 15269 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb); 15270 15271 int cfg80211_vendor_cmd_reply(struct sk_buff *skb) 15272 { 15273 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 15274 void *hdr = ((void **)skb->cb)[1]; 15275 struct nlattr *data = ((void **)skb->cb)[2]; 15276 15277 /* clear CB data for netlink core to own from now on */ 15278 memset(skb->cb, 0, sizeof(skb->cb)); 15279 15280 if (WARN_ON(!rdev->cur_cmd_info)) { 15281 kfree_skb(skb); 15282 return -EINVAL; 15283 } 15284 15285 nla_nest_end(skb, data); 15286 genlmsg_end(skb, hdr); 15287 return genlmsg_reply(skb, rdev->cur_cmd_info); 15288 } 15289 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply); 15290 15291 unsigned int cfg80211_vendor_cmd_get_sender(struct wiphy *wiphy) 15292 { 15293 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 15294 15295 if (WARN_ON(!rdev->cur_cmd_info)) 15296 return 0; 15297 15298 return rdev->cur_cmd_info->snd_portid; 15299 } 15300 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_get_sender); 15301 15302 static int nl80211_set_qos_map(struct sk_buff *skb, 15303 struct genl_info *info) 15304 { 15305 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15306 struct cfg80211_qos_map *qos_map = NULL; 15307 struct net_device *dev = info->user_ptr[1]; 15308 u8 *pos, len, num_des, des_len, des; 15309 int ret; 15310 15311 if (!rdev->ops->set_qos_map) 15312 return -EOPNOTSUPP; 15313 15314 if (info->attrs[NL80211_ATTR_QOS_MAP]) { 15315 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]); 15316 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]); 15317 15318 if (len % 2) 15319 return -EINVAL; 15320 15321 qos_map = kzalloc(sizeof(struct cfg80211_qos_map), GFP_KERNEL); 15322 if (!qos_map) 15323 return -ENOMEM; 15324 15325 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1; 15326 if (num_des) { 15327 des_len = num_des * 15328 sizeof(struct cfg80211_dscp_exception); 15329 memcpy(qos_map->dscp_exception, pos, des_len); 15330 qos_map->num_des = num_des; 15331 for (des = 0; des < num_des; des++) { 15332 if (qos_map->dscp_exception[des].up > 7) { 15333 kfree(qos_map); 15334 return -EINVAL; 15335 } 15336 } 15337 pos += des_len; 15338 } 15339 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN); 15340 } 15341 15342 ret = nl80211_key_allowed(dev->ieee80211_ptr); 15343 if (!ret) 15344 ret = rdev_set_qos_map(rdev, dev, qos_map); 15345 15346 kfree(qos_map); 15347 return ret; 15348 } 15349 15350 static int nl80211_add_tx_ts(struct sk_buff *skb, struct genl_info *info) 15351 { 15352 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15353 struct net_device *dev = info->user_ptr[1]; 15354 struct wireless_dev *wdev = dev->ieee80211_ptr; 15355 const u8 *peer; 15356 u8 tsid, up; 15357 u16 admitted_time = 0; 15358 15359 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)) 15360 return -EOPNOTSUPP; 15361 15362 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] || 15363 !info->attrs[NL80211_ATTR_USER_PRIO]) 15364 return -EINVAL; 15365 15366 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); 15367 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]); 15368 15369 /* WMM uses TIDs 0-7 even for TSPEC */ 15370 if (tsid >= IEEE80211_FIRST_TSPEC_TSID) { 15371 /* TODO: handle 802.11 TSPEC/admission control 15372 * need more attributes for that (e.g. BA session requirement); 15373 * change the WMM adminssion test above to allow both then 15374 */ 15375 return -EINVAL; 15376 } 15377 15378 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 15379 15380 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) { 15381 admitted_time = 15382 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]); 15383 if (!admitted_time) 15384 return -EINVAL; 15385 } 15386 15387 switch (wdev->iftype) { 15388 case NL80211_IFTYPE_STATION: 15389 case NL80211_IFTYPE_P2P_CLIENT: 15390 if (wdev->connected) 15391 break; 15392 return -ENOTCONN; 15393 default: 15394 return -EOPNOTSUPP; 15395 } 15396 15397 return rdev_add_tx_ts(rdev, dev, tsid, peer, up, admitted_time); 15398 } 15399 15400 static int nl80211_del_tx_ts(struct sk_buff *skb, struct genl_info *info) 15401 { 15402 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15403 struct net_device *dev = info->user_ptr[1]; 15404 const u8 *peer; 15405 u8 tsid; 15406 15407 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC]) 15408 return -EINVAL; 15409 15410 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); 15411 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 15412 15413 return rdev_del_tx_ts(rdev, dev, tsid, peer); 15414 } 15415 15416 static int nl80211_tdls_channel_switch(struct sk_buff *skb, 15417 struct genl_info *info) 15418 { 15419 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15420 struct net_device *dev = info->user_ptr[1]; 15421 struct wireless_dev *wdev = dev->ieee80211_ptr; 15422 struct cfg80211_chan_def chandef = {}; 15423 const u8 *addr; 15424 u8 oper_class; 15425 int err; 15426 15427 if (!rdev->ops->tdls_channel_switch || 15428 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) 15429 return -EOPNOTSUPP; 15430 15431 switch (dev->ieee80211_ptr->iftype) { 15432 case NL80211_IFTYPE_STATION: 15433 case NL80211_IFTYPE_P2P_CLIENT: 15434 break; 15435 default: 15436 return -EOPNOTSUPP; 15437 } 15438 15439 if (!info->attrs[NL80211_ATTR_MAC] || 15440 !info->attrs[NL80211_ATTR_OPER_CLASS]) 15441 return -EINVAL; 15442 15443 err = nl80211_parse_chandef(rdev, info, &chandef); 15444 if (err) 15445 return err; 15446 15447 /* 15448 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012 15449 * section 10.22.6.2.1. Disallow 5/10Mhz channels as well for now, the 15450 * specification is not defined for them. 15451 */ 15452 if (chandef.chan->band == NL80211_BAND_2GHZ && 15453 chandef.width != NL80211_CHAN_WIDTH_20_NOHT && 15454 chandef.width != NL80211_CHAN_WIDTH_20) 15455 return -EINVAL; 15456 15457 /* we will be active on the TDLS link */ 15458 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, 15459 wdev->iftype)) 15460 return -EINVAL; 15461 15462 /* don't allow switching to DFS channels */ 15463 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype)) 15464 return -EINVAL; 15465 15466 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 15467 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]); 15468 15469 return rdev_tdls_channel_switch(rdev, dev, addr, oper_class, &chandef); 15470 } 15471 15472 static int nl80211_tdls_cancel_channel_switch(struct sk_buff *skb, 15473 struct genl_info *info) 15474 { 15475 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15476 struct net_device *dev = info->user_ptr[1]; 15477 const u8 *addr; 15478 15479 if (!rdev->ops->tdls_channel_switch || 15480 !rdev->ops->tdls_cancel_channel_switch || 15481 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) 15482 return -EOPNOTSUPP; 15483 15484 switch (dev->ieee80211_ptr->iftype) { 15485 case NL80211_IFTYPE_STATION: 15486 case NL80211_IFTYPE_P2P_CLIENT: 15487 break; 15488 default: 15489 return -EOPNOTSUPP; 15490 } 15491 15492 if (!info->attrs[NL80211_ATTR_MAC]) 15493 return -EINVAL; 15494 15495 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 15496 15497 rdev_tdls_cancel_channel_switch(rdev, dev, addr); 15498 15499 return 0; 15500 } 15501 15502 static int nl80211_set_multicast_to_unicast(struct sk_buff *skb, 15503 struct genl_info *info) 15504 { 15505 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15506 struct net_device *dev = info->user_ptr[1]; 15507 struct wireless_dev *wdev = dev->ieee80211_ptr; 15508 const struct nlattr *nla; 15509 bool enabled; 15510 15511 if (!rdev->ops->set_multicast_to_unicast) 15512 return -EOPNOTSUPP; 15513 15514 if (wdev->iftype != NL80211_IFTYPE_AP && 15515 wdev->iftype != NL80211_IFTYPE_P2P_GO) 15516 return -EOPNOTSUPP; 15517 15518 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED]; 15519 enabled = nla_get_flag(nla); 15520 15521 return rdev_set_multicast_to_unicast(rdev, dev, enabled); 15522 } 15523 15524 static int nl80211_set_pmk(struct sk_buff *skb, struct genl_info *info) 15525 { 15526 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15527 struct net_device *dev = info->user_ptr[1]; 15528 struct wireless_dev *wdev = dev->ieee80211_ptr; 15529 struct cfg80211_pmk_conf pmk_conf = {}; 15530 15531 if (wdev->iftype != NL80211_IFTYPE_STATION && 15532 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 15533 return -EOPNOTSUPP; 15534 15535 if (!wiphy_ext_feature_isset(&rdev->wiphy, 15536 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 15537 return -EOPNOTSUPP; 15538 15539 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK]) 15540 return -EINVAL; 15541 15542 if (!wdev->connected) 15543 return -ENOTCONN; 15544 15545 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]); 15546 if (memcmp(pmk_conf.aa, wdev->u.client.connected_addr, ETH_ALEN)) 15547 return -EINVAL; 15548 15549 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); 15550 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); 15551 if (pmk_conf.pmk_len != WLAN_PMK_LEN && 15552 pmk_conf.pmk_len != WLAN_PMK_LEN_SUITE_B_192) 15553 return -EINVAL; 15554 15555 if (info->attrs[NL80211_ATTR_PMKR0_NAME]) 15556 pmk_conf.pmk_r0_name = 15557 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]); 15558 15559 return rdev_set_pmk(rdev, dev, &pmk_conf); 15560 } 15561 15562 static int nl80211_del_pmk(struct sk_buff *skb, struct genl_info *info) 15563 { 15564 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15565 struct net_device *dev = info->user_ptr[1]; 15566 struct wireless_dev *wdev = dev->ieee80211_ptr; 15567 const u8 *aa; 15568 15569 if (wdev->iftype != NL80211_IFTYPE_STATION && 15570 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 15571 return -EOPNOTSUPP; 15572 15573 if (!wiphy_ext_feature_isset(&rdev->wiphy, 15574 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 15575 return -EOPNOTSUPP; 15576 15577 if (!info->attrs[NL80211_ATTR_MAC]) 15578 return -EINVAL; 15579 15580 aa = nla_data(info->attrs[NL80211_ATTR_MAC]); 15581 return rdev_del_pmk(rdev, dev, aa); 15582 } 15583 15584 static int nl80211_external_auth(struct sk_buff *skb, struct genl_info *info) 15585 { 15586 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15587 struct net_device *dev = info->user_ptr[1]; 15588 struct cfg80211_external_auth_params params; 15589 15590 if (!rdev->ops->external_auth) 15591 return -EOPNOTSUPP; 15592 15593 if (!info->attrs[NL80211_ATTR_SSID] && 15594 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 15595 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 15596 return -EINVAL; 15597 15598 if (!info->attrs[NL80211_ATTR_BSSID]) 15599 return -EINVAL; 15600 15601 if (!info->attrs[NL80211_ATTR_STATUS_CODE]) 15602 return -EINVAL; 15603 15604 memset(¶ms, 0, sizeof(params)); 15605 15606 if (info->attrs[NL80211_ATTR_SSID]) { 15607 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 15608 if (params.ssid.ssid_len == 0) 15609 return -EINVAL; 15610 memcpy(params.ssid.ssid, 15611 nla_data(info->attrs[NL80211_ATTR_SSID]), 15612 params.ssid.ssid_len); 15613 } 15614 15615 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), 15616 ETH_ALEN); 15617 15618 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 15619 15620 if (info->attrs[NL80211_ATTR_PMKID]) 15621 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 15622 15623 return rdev_external_auth(rdev, dev, ¶ms); 15624 } 15625 15626 static int nl80211_tx_control_port(struct sk_buff *skb, struct genl_info *info) 15627 { 15628 bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK]; 15629 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15630 struct net_device *dev = info->user_ptr[1]; 15631 struct wireless_dev *wdev = dev->ieee80211_ptr; 15632 const u8 *buf; 15633 size_t len; 15634 u8 *dest; 15635 u16 proto; 15636 bool noencrypt; 15637 u64 cookie = 0; 15638 int link_id; 15639 int err; 15640 15641 if (!wiphy_ext_feature_isset(&rdev->wiphy, 15642 NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211)) 15643 return -EOPNOTSUPP; 15644 15645 if (!rdev->ops->tx_control_port) 15646 return -EOPNOTSUPP; 15647 15648 if (!info->attrs[NL80211_ATTR_FRAME] || 15649 !info->attrs[NL80211_ATTR_MAC] || 15650 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { 15651 GENL_SET_ERR_MSG(info, "Frame, MAC or ethertype missing"); 15652 return -EINVAL; 15653 } 15654 15655 switch (wdev->iftype) { 15656 case NL80211_IFTYPE_AP: 15657 case NL80211_IFTYPE_P2P_GO: 15658 case NL80211_IFTYPE_MESH_POINT: 15659 break; 15660 case NL80211_IFTYPE_ADHOC: 15661 if (wdev->u.ibss.current_bss) 15662 break; 15663 return -ENOTCONN; 15664 case NL80211_IFTYPE_STATION: 15665 case NL80211_IFTYPE_P2P_CLIENT: 15666 if (wdev->connected) 15667 break; 15668 return -ENOTCONN; 15669 default: 15670 return -EOPNOTSUPP; 15671 } 15672 15673 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 15674 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 15675 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); 15676 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); 15677 noencrypt = 15678 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]); 15679 15680 link_id = nl80211_link_id_or_invalid(info->attrs); 15681 15682 err = rdev_tx_control_port(rdev, dev, buf, len, 15683 dest, cpu_to_be16(proto), noencrypt, link_id, 15684 dont_wait_for_ack ? NULL : &cookie); 15685 if (!err && !dont_wait_for_ack) 15686 nl_set_extack_cookie_u64(info->extack, cookie); 15687 return err; 15688 } 15689 15690 static int nl80211_get_ftm_responder_stats(struct sk_buff *skb, 15691 struct genl_info *info) 15692 { 15693 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15694 struct net_device *dev = info->user_ptr[1]; 15695 struct wireless_dev *wdev = dev->ieee80211_ptr; 15696 struct cfg80211_ftm_responder_stats ftm_stats = {}; 15697 unsigned int link_id = nl80211_link_id(info->attrs); 15698 struct sk_buff *msg; 15699 void *hdr; 15700 struct nlattr *ftm_stats_attr; 15701 int err; 15702 15703 if (wdev->iftype != NL80211_IFTYPE_AP || 15704 !wdev->links[link_id].ap.beacon_interval) 15705 return -EOPNOTSUPP; 15706 15707 err = rdev_get_ftm_responder_stats(rdev, dev, &ftm_stats); 15708 if (err) 15709 return err; 15710 15711 if (!ftm_stats.filled) 15712 return -ENODATA; 15713 15714 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 15715 if (!msg) 15716 return -ENOMEM; 15717 15718 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 15719 NL80211_CMD_GET_FTM_RESPONDER_STATS); 15720 if (!hdr) 15721 goto nla_put_failure; 15722 15723 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 15724 goto nla_put_failure; 15725 15726 ftm_stats_attr = nla_nest_start_noflag(msg, 15727 NL80211_ATTR_FTM_RESPONDER_STATS); 15728 if (!ftm_stats_attr) 15729 goto nla_put_failure; 15730 15731 #define SET_FTM(field, name, type) \ 15732 do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \ 15733 nla_put_ ## type(msg, NL80211_FTM_STATS_ ## name, \ 15734 ftm_stats.field)) \ 15735 goto nla_put_failure; } while (0) 15736 #define SET_FTM_U64(field, name) \ 15737 do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \ 15738 nla_put_u64_64bit(msg, NL80211_FTM_STATS_ ## name, \ 15739 ftm_stats.field, NL80211_FTM_STATS_PAD)) \ 15740 goto nla_put_failure; } while (0) 15741 15742 SET_FTM(success_num, SUCCESS_NUM, u32); 15743 SET_FTM(partial_num, PARTIAL_NUM, u32); 15744 SET_FTM(failed_num, FAILED_NUM, u32); 15745 SET_FTM(asap_num, ASAP_NUM, u32); 15746 SET_FTM(non_asap_num, NON_ASAP_NUM, u32); 15747 SET_FTM_U64(total_duration_ms, TOTAL_DURATION_MSEC); 15748 SET_FTM(unknown_triggers_num, UNKNOWN_TRIGGERS_NUM, u32); 15749 SET_FTM(reschedule_requests_num, RESCHEDULE_REQUESTS_NUM, u32); 15750 SET_FTM(out_of_window_triggers_num, OUT_OF_WINDOW_TRIGGERS_NUM, u32); 15751 #undef SET_FTM 15752 15753 nla_nest_end(msg, ftm_stats_attr); 15754 15755 genlmsg_end(msg, hdr); 15756 return genlmsg_reply(msg, info); 15757 15758 nla_put_failure: 15759 nlmsg_free(msg); 15760 return -ENOBUFS; 15761 } 15762 15763 static int nl80211_update_owe_info(struct sk_buff *skb, struct genl_info *info) 15764 { 15765 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15766 struct cfg80211_update_owe_info owe_info; 15767 struct net_device *dev = info->user_ptr[1]; 15768 15769 if (!rdev->ops->update_owe_info) 15770 return -EOPNOTSUPP; 15771 15772 if (!info->attrs[NL80211_ATTR_STATUS_CODE] || 15773 !info->attrs[NL80211_ATTR_MAC]) 15774 return -EINVAL; 15775 15776 memset(&owe_info, 0, sizeof(owe_info)); 15777 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 15778 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); 15779 15780 if (info->attrs[NL80211_ATTR_IE]) { 15781 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 15782 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 15783 } 15784 15785 return rdev_update_owe_info(rdev, dev, &owe_info); 15786 } 15787 15788 static int nl80211_probe_mesh_link(struct sk_buff *skb, struct genl_info *info) 15789 { 15790 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15791 struct net_device *dev = info->user_ptr[1]; 15792 struct wireless_dev *wdev = dev->ieee80211_ptr; 15793 struct station_info sinfo = {}; 15794 const u8 *buf; 15795 size_t len; 15796 u8 *dest; 15797 int err; 15798 15799 if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station) 15800 return -EOPNOTSUPP; 15801 15802 if (!info->attrs[NL80211_ATTR_MAC] || 15803 !info->attrs[NL80211_ATTR_FRAME]) { 15804 GENL_SET_ERR_MSG(info, "Frame or MAC missing"); 15805 return -EINVAL; 15806 } 15807 15808 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 15809 return -EOPNOTSUPP; 15810 15811 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); 15812 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 15813 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 15814 15815 if (len < sizeof(struct ethhdr)) 15816 return -EINVAL; 15817 15818 if (!ether_addr_equal(buf, dest) || is_multicast_ether_addr(buf) || 15819 !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr)) 15820 return -EINVAL; 15821 15822 err = rdev_get_station(rdev, dev, dest, &sinfo); 15823 if (err) 15824 return err; 15825 15826 cfg80211_sinfo_release_content(&sinfo); 15827 15828 return rdev_probe_mesh_link(rdev, dev, dest, buf, len); 15829 } 15830 15831 static int parse_tid_conf(struct cfg80211_registered_device *rdev, 15832 struct nlattr *attrs[], struct net_device *dev, 15833 struct cfg80211_tid_cfg *tid_conf, 15834 struct genl_info *info, const u8 *peer, 15835 unsigned int link_id) 15836 { 15837 struct netlink_ext_ack *extack = info->extack; 15838 u64 mask; 15839 int err; 15840 15841 if (!attrs[NL80211_TID_CONFIG_ATTR_TIDS]) 15842 return -EINVAL; 15843 15844 tid_conf->config_override = 15845 nla_get_flag(attrs[NL80211_TID_CONFIG_ATTR_OVERRIDE]); 15846 tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]); 15847 15848 if (tid_conf->config_override) { 15849 if (rdev->ops->reset_tid_config) { 15850 err = rdev_reset_tid_config(rdev, dev, peer, 15851 tid_conf->tids); 15852 if (err) 15853 return err; 15854 } else { 15855 return -EINVAL; 15856 } 15857 } 15858 15859 if (attrs[NL80211_TID_CONFIG_ATTR_NOACK]) { 15860 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK); 15861 tid_conf->noack = 15862 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_NOACK]); 15863 } 15864 15865 if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]) { 15866 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT); 15867 tid_conf->retry_short = 15868 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]); 15869 15870 if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count) 15871 return -EINVAL; 15872 } 15873 15874 if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]) { 15875 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG); 15876 tid_conf->retry_long = 15877 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]); 15878 15879 if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count) 15880 return -EINVAL; 15881 } 15882 15883 if (attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]) { 15884 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL); 15885 tid_conf->ampdu = 15886 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]); 15887 } 15888 15889 if (attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]) { 15890 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL); 15891 tid_conf->rtscts = 15892 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]); 15893 } 15894 15895 if (attrs[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL]) { 15896 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMSDU_CTRL); 15897 tid_conf->amsdu = 15898 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMSDU_CTRL]); 15899 } 15900 15901 if (attrs[NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE]) { 15902 u32 idx = NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE, attr; 15903 15904 tid_conf->txrate_type = nla_get_u8(attrs[idx]); 15905 15906 if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) { 15907 attr = NL80211_TID_CONFIG_ATTR_TX_RATE; 15908 err = nl80211_parse_tx_bitrate_mask(info, attrs, attr, 15909 &tid_conf->txrate_mask, dev, 15910 true, link_id); 15911 if (err) 15912 return err; 15913 15914 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE); 15915 } 15916 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE); 15917 } 15918 15919 if (peer) 15920 mask = rdev->wiphy.tid_config_support.peer; 15921 else 15922 mask = rdev->wiphy.tid_config_support.vif; 15923 15924 if (tid_conf->mask & ~mask) { 15925 NL_SET_ERR_MSG(extack, "unsupported TID configuration"); 15926 return -EOPNOTSUPP; 15927 } 15928 15929 return 0; 15930 } 15931 15932 static int nl80211_set_tid_config(struct sk_buff *skb, 15933 struct genl_info *info) 15934 { 15935 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15936 struct nlattr *attrs[NL80211_TID_CONFIG_ATTR_MAX + 1]; 15937 unsigned int link_id = nl80211_link_id(info->attrs); 15938 struct net_device *dev = info->user_ptr[1]; 15939 struct cfg80211_tid_config *tid_config; 15940 struct nlattr *tid; 15941 int conf_idx = 0, rem_conf; 15942 int ret = -EINVAL; 15943 u32 num_conf = 0; 15944 15945 if (!info->attrs[NL80211_ATTR_TID_CONFIG]) 15946 return -EINVAL; 15947 15948 if (!rdev->ops->set_tid_config) 15949 return -EOPNOTSUPP; 15950 15951 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], 15952 rem_conf) 15953 num_conf++; 15954 15955 tid_config = kzalloc(struct_size(tid_config, tid_conf, num_conf), 15956 GFP_KERNEL); 15957 if (!tid_config) 15958 return -ENOMEM; 15959 15960 tid_config->n_tid_conf = num_conf; 15961 15962 if (info->attrs[NL80211_ATTR_MAC]) 15963 tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 15964 15965 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], 15966 rem_conf) { 15967 ret = nla_parse_nested(attrs, NL80211_TID_CONFIG_ATTR_MAX, 15968 tid, NULL, NULL); 15969 15970 if (ret) 15971 goto bad_tid_conf; 15972 15973 ret = parse_tid_conf(rdev, attrs, dev, 15974 &tid_config->tid_conf[conf_idx], 15975 info, tid_config->peer, link_id); 15976 if (ret) 15977 goto bad_tid_conf; 15978 15979 conf_idx++; 15980 } 15981 15982 ret = rdev_set_tid_config(rdev, dev, tid_config); 15983 15984 bad_tid_conf: 15985 kfree(tid_config); 15986 return ret; 15987 } 15988 15989 static int nl80211_color_change(struct sk_buff *skb, struct genl_info *info) 15990 { 15991 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 15992 struct cfg80211_color_change_settings params = {}; 15993 struct net_device *dev = info->user_ptr[1]; 15994 struct wireless_dev *wdev = dev->ieee80211_ptr; 15995 struct nlattr **tb; 15996 u16 offset; 15997 int err; 15998 15999 if (!rdev->ops->color_change) 16000 return -EOPNOTSUPP; 16001 16002 if (!wiphy_ext_feature_isset(&rdev->wiphy, 16003 NL80211_EXT_FEATURE_BSS_COLOR)) 16004 return -EOPNOTSUPP; 16005 16006 if (wdev->iftype != NL80211_IFTYPE_AP) 16007 return -EOPNOTSUPP; 16008 16009 if (!info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT] || 16010 !info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR] || 16011 !info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS]) 16012 return -EINVAL; 16013 16014 params.count = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT]); 16015 params.color = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR]); 16016 16017 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_next, 16018 info->extack); 16019 if (err) 16020 return err; 16021 16022 tb = kcalloc(NL80211_ATTR_MAX + 1, sizeof(*tb), GFP_KERNEL); 16023 if (!tb) 16024 return -ENOMEM; 16025 16026 err = nla_parse_nested(tb, NL80211_ATTR_MAX, 16027 info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS], 16028 nl80211_policy, info->extack); 16029 if (err) 16030 goto out; 16031 16032 err = nl80211_parse_beacon(rdev, tb, ¶ms.beacon_color_change, 16033 info->extack); 16034 if (err) 16035 goto out; 16036 16037 if (!tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]) { 16038 err = -EINVAL; 16039 goto out; 16040 } 16041 16042 if (nla_len(tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]) != sizeof(u16)) { 16043 err = -EINVAL; 16044 goto out; 16045 } 16046 16047 offset = nla_get_u16(tb[NL80211_ATTR_CNTDWN_OFFS_BEACON]); 16048 if (offset >= params.beacon_color_change.tail_len) { 16049 err = -EINVAL; 16050 goto out; 16051 } 16052 16053 if (params.beacon_color_change.tail[offset] != params.count) { 16054 err = -EINVAL; 16055 goto out; 16056 } 16057 16058 params.counter_offset_beacon = offset; 16059 16060 if (tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]) { 16061 if (nla_len(tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]) != 16062 sizeof(u16)) { 16063 err = -EINVAL; 16064 goto out; 16065 } 16066 16067 offset = nla_get_u16(tb[NL80211_ATTR_CNTDWN_OFFS_PRESP]); 16068 if (offset >= params.beacon_color_change.probe_resp_len) { 16069 err = -EINVAL; 16070 goto out; 16071 } 16072 16073 if (params.beacon_color_change.probe_resp[offset] != 16074 params.count) { 16075 err = -EINVAL; 16076 goto out; 16077 } 16078 16079 params.counter_offset_presp = offset; 16080 } 16081 16082 err = rdev_color_change(rdev, dev, ¶ms); 16083 16084 out: 16085 kfree(params.beacon_next.mbssid_ies); 16086 kfree(params.beacon_color_change.mbssid_ies); 16087 kfree(params.beacon_next.rnr_ies); 16088 kfree(params.beacon_color_change.rnr_ies); 16089 kfree(tb); 16090 return err; 16091 } 16092 16093 static int nl80211_set_fils_aad(struct sk_buff *skb, 16094 struct genl_info *info) 16095 { 16096 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16097 struct net_device *dev = info->user_ptr[1]; 16098 struct cfg80211_fils_aad fils_aad = {}; 16099 u8 *nonces; 16100 16101 if (!info->attrs[NL80211_ATTR_MAC] || 16102 !info->attrs[NL80211_ATTR_FILS_KEK] || 16103 !info->attrs[NL80211_ATTR_FILS_NONCES]) 16104 return -EINVAL; 16105 16106 fils_aad.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); 16107 fils_aad.kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); 16108 fils_aad.kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); 16109 nonces = nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); 16110 fils_aad.snonce = nonces; 16111 fils_aad.anonce = nonces + FILS_NONCE_LEN; 16112 16113 return rdev_set_fils_aad(rdev, dev, &fils_aad); 16114 } 16115 16116 static int nl80211_add_link(struct sk_buff *skb, struct genl_info *info) 16117 { 16118 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16119 unsigned int link_id = nl80211_link_id(info->attrs); 16120 struct net_device *dev = info->user_ptr[1]; 16121 struct wireless_dev *wdev = dev->ieee80211_ptr; 16122 int ret; 16123 16124 if (!(wdev->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO)) 16125 return -EINVAL; 16126 16127 switch (wdev->iftype) { 16128 case NL80211_IFTYPE_AP: 16129 break; 16130 default: 16131 return -EINVAL; 16132 } 16133 16134 if (!info->attrs[NL80211_ATTR_MAC] || 16135 !is_valid_ether_addr(nla_data(info->attrs[NL80211_ATTR_MAC]))) 16136 return -EINVAL; 16137 16138 wdev->valid_links |= BIT(link_id); 16139 ether_addr_copy(wdev->links[link_id].addr, 16140 nla_data(info->attrs[NL80211_ATTR_MAC])); 16141 16142 ret = rdev_add_intf_link(rdev, wdev, link_id); 16143 if (ret) { 16144 wdev->valid_links &= ~BIT(link_id); 16145 eth_zero_addr(wdev->links[link_id].addr); 16146 } 16147 16148 return ret; 16149 } 16150 16151 static int nl80211_remove_link(struct sk_buff *skb, struct genl_info *info) 16152 { 16153 unsigned int link_id = nl80211_link_id(info->attrs); 16154 struct net_device *dev = info->user_ptr[1]; 16155 struct wireless_dev *wdev = dev->ieee80211_ptr; 16156 16157 /* cannot remove if there's no link */ 16158 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) 16159 return -EINVAL; 16160 16161 switch (wdev->iftype) { 16162 case NL80211_IFTYPE_AP: 16163 break; 16164 default: 16165 return -EINVAL; 16166 } 16167 16168 cfg80211_remove_link(wdev, link_id); 16169 16170 return 0; 16171 } 16172 16173 static int 16174 nl80211_add_mod_link_station(struct sk_buff *skb, struct genl_info *info, 16175 bool add) 16176 { 16177 struct link_station_parameters params = {}; 16178 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16179 struct net_device *dev = info->user_ptr[1]; 16180 int err; 16181 16182 if ((add && !rdev->ops->add_link_station) || 16183 (!add && !rdev->ops->mod_link_station)) 16184 return -EOPNOTSUPP; 16185 16186 if (add && !info->attrs[NL80211_ATTR_MAC]) 16187 return -EINVAL; 16188 16189 if (!info->attrs[NL80211_ATTR_MLD_ADDR]) 16190 return -EINVAL; 16191 16192 if (add && !info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 16193 return -EINVAL; 16194 16195 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 16196 16197 if (info->attrs[NL80211_ATTR_MAC]) { 16198 params.link_mac = nla_data(info->attrs[NL80211_ATTR_MAC]); 16199 if (!is_valid_ether_addr(params.link_mac)) 16200 return -EINVAL; 16201 } 16202 16203 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID]) 16204 return -EINVAL; 16205 16206 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); 16207 16208 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 16209 params.supported_rates = 16210 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 16211 params.supported_rates_len = 16212 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 16213 } 16214 16215 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 16216 params.ht_capa = 16217 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 16218 16219 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 16220 params.vht_capa = 16221 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 16222 16223 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 16224 params.he_capa = 16225 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 16226 params.he_capa_len = 16227 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 16228 16229 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { 16230 params.eht_capa = 16231 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 16232 params.eht_capa_len = 16233 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); 16234 16235 if (!ieee80211_eht_capa_size_ok((const u8 *)params.he_capa, 16236 (const u8 *)params.eht_capa, 16237 params.eht_capa_len, 16238 false)) 16239 return -EINVAL; 16240 } 16241 } 16242 16243 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]) 16244 params.he_6ghz_capa = 16245 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); 16246 16247 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 16248 params.opmode_notif_used = true; 16249 params.opmode_notif = 16250 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 16251 } 16252 16253 err = nl80211_parse_sta_txpower_setting(info, ¶ms.txpwr, 16254 ¶ms.txpwr_set); 16255 if (err) 16256 return err; 16257 16258 if (add) 16259 return rdev_add_link_station(rdev, dev, ¶ms); 16260 16261 return rdev_mod_link_station(rdev, dev, ¶ms); 16262 } 16263 16264 static int 16265 nl80211_add_link_station(struct sk_buff *skb, struct genl_info *info) 16266 { 16267 return nl80211_add_mod_link_station(skb, info, true); 16268 } 16269 16270 static int 16271 nl80211_modify_link_station(struct sk_buff *skb, struct genl_info *info) 16272 { 16273 return nl80211_add_mod_link_station(skb, info, false); 16274 } 16275 16276 static int 16277 nl80211_remove_link_station(struct sk_buff *skb, struct genl_info *info) 16278 { 16279 struct link_station_del_parameters params = {}; 16280 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16281 struct net_device *dev = info->user_ptr[1]; 16282 16283 if (!rdev->ops->del_link_station) 16284 return -EOPNOTSUPP; 16285 16286 if (!info->attrs[NL80211_ATTR_MLD_ADDR] || 16287 !info->attrs[NL80211_ATTR_MLO_LINK_ID]) 16288 return -EINVAL; 16289 16290 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); 16291 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]); 16292 16293 return rdev_del_link_station(rdev, dev, ¶ms); 16294 } 16295 16296 static int nl80211_set_hw_timestamp(struct sk_buff *skb, 16297 struct genl_info *info) 16298 { 16299 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16300 struct net_device *dev = info->user_ptr[1]; 16301 struct cfg80211_set_hw_timestamp hwts = {}; 16302 16303 if (!rdev->wiphy.hw_timestamp_max_peers) 16304 return -EOPNOTSUPP; 16305 16306 if (!info->attrs[NL80211_ATTR_MAC] && 16307 rdev->wiphy.hw_timestamp_max_peers != CFG80211_HW_TIMESTAMP_ALL_PEERS) 16308 return -EOPNOTSUPP; 16309 16310 if (info->attrs[NL80211_ATTR_MAC]) 16311 hwts.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]); 16312 16313 hwts.enable = 16314 nla_get_flag(info->attrs[NL80211_ATTR_HW_TIMESTAMP_ENABLED]); 16315 16316 return rdev_set_hw_timestamp(rdev, dev, &hwts); 16317 } 16318 16319 static int 16320 nl80211_set_ttlm(struct sk_buff *skb, struct genl_info *info) 16321 { 16322 struct cfg80211_ttlm_params params = {}; 16323 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16324 struct net_device *dev = info->user_ptr[1]; 16325 struct wireless_dev *wdev = dev->ieee80211_ptr; 16326 16327 if (wdev->iftype != NL80211_IFTYPE_STATION && 16328 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 16329 return -EOPNOTSUPP; 16330 16331 if (!wdev->connected) 16332 return -ENOLINK; 16333 16334 if (!info->attrs[NL80211_ATTR_MLO_TTLM_DLINK] || 16335 !info->attrs[NL80211_ATTR_MLO_TTLM_ULINK]) 16336 return -EINVAL; 16337 16338 nla_memcpy(params.dlink, 16339 info->attrs[NL80211_ATTR_MLO_TTLM_DLINK], 16340 sizeof(params.dlink)); 16341 nla_memcpy(params.ulink, 16342 info->attrs[NL80211_ATTR_MLO_TTLM_ULINK], 16343 sizeof(params.ulink)); 16344 16345 return rdev_set_ttlm(rdev, dev, ¶ms); 16346 } 16347 16348 #define NL80211_FLAG_NEED_WIPHY 0x01 16349 #define NL80211_FLAG_NEED_NETDEV 0x02 16350 #define NL80211_FLAG_NEED_RTNL 0x04 16351 #define NL80211_FLAG_CHECK_NETDEV_UP 0x08 16352 #define NL80211_FLAG_NEED_NETDEV_UP (NL80211_FLAG_NEED_NETDEV |\ 16353 NL80211_FLAG_CHECK_NETDEV_UP) 16354 #define NL80211_FLAG_NEED_WDEV 0x10 16355 /* If a netdev is associated, it must be UP, P2P must be started */ 16356 #define NL80211_FLAG_NEED_WDEV_UP (NL80211_FLAG_NEED_WDEV |\ 16357 NL80211_FLAG_CHECK_NETDEV_UP) 16358 #define NL80211_FLAG_CLEAR_SKB 0x20 16359 #define NL80211_FLAG_NO_WIPHY_MTX 0x40 16360 #define NL80211_FLAG_MLO_VALID_LINK_ID 0x80 16361 #define NL80211_FLAG_MLO_UNSUPPORTED 0x100 16362 16363 #define INTERNAL_FLAG_SELECTORS(__sel) \ 16364 SELECTOR(__sel, NONE, 0) /* must be first */ \ 16365 SELECTOR(__sel, WIPHY, \ 16366 NL80211_FLAG_NEED_WIPHY) \ 16367 SELECTOR(__sel, WDEV, \ 16368 NL80211_FLAG_NEED_WDEV) \ 16369 SELECTOR(__sel, NETDEV, \ 16370 NL80211_FLAG_NEED_NETDEV) \ 16371 SELECTOR(__sel, NETDEV_LINK, \ 16372 NL80211_FLAG_NEED_NETDEV | \ 16373 NL80211_FLAG_MLO_VALID_LINK_ID) \ 16374 SELECTOR(__sel, NETDEV_NO_MLO, \ 16375 NL80211_FLAG_NEED_NETDEV | \ 16376 NL80211_FLAG_MLO_UNSUPPORTED) \ 16377 SELECTOR(__sel, WIPHY_RTNL, \ 16378 NL80211_FLAG_NEED_WIPHY | \ 16379 NL80211_FLAG_NEED_RTNL) \ 16380 SELECTOR(__sel, WIPHY_RTNL_NOMTX, \ 16381 NL80211_FLAG_NEED_WIPHY | \ 16382 NL80211_FLAG_NEED_RTNL | \ 16383 NL80211_FLAG_NO_WIPHY_MTX) \ 16384 SELECTOR(__sel, WDEV_RTNL, \ 16385 NL80211_FLAG_NEED_WDEV | \ 16386 NL80211_FLAG_NEED_RTNL) \ 16387 SELECTOR(__sel, NETDEV_RTNL, \ 16388 NL80211_FLAG_NEED_NETDEV | \ 16389 NL80211_FLAG_NEED_RTNL) \ 16390 SELECTOR(__sel, NETDEV_UP, \ 16391 NL80211_FLAG_NEED_NETDEV_UP) \ 16392 SELECTOR(__sel, NETDEV_UP_LINK, \ 16393 NL80211_FLAG_NEED_NETDEV_UP | \ 16394 NL80211_FLAG_MLO_VALID_LINK_ID) \ 16395 SELECTOR(__sel, NETDEV_UP_NO_MLO, \ 16396 NL80211_FLAG_NEED_NETDEV_UP | \ 16397 NL80211_FLAG_MLO_UNSUPPORTED) \ 16398 SELECTOR(__sel, NETDEV_UP_NO_MLO_CLEAR, \ 16399 NL80211_FLAG_NEED_NETDEV_UP | \ 16400 NL80211_FLAG_CLEAR_SKB | \ 16401 NL80211_FLAG_MLO_UNSUPPORTED) \ 16402 SELECTOR(__sel, NETDEV_UP_NOTMX, \ 16403 NL80211_FLAG_NEED_NETDEV_UP | \ 16404 NL80211_FLAG_NO_WIPHY_MTX) \ 16405 SELECTOR(__sel, NETDEV_UP_NOTMX_NOMLO, \ 16406 NL80211_FLAG_NEED_NETDEV_UP | \ 16407 NL80211_FLAG_NO_WIPHY_MTX | \ 16408 NL80211_FLAG_MLO_UNSUPPORTED) \ 16409 SELECTOR(__sel, NETDEV_UP_CLEAR, \ 16410 NL80211_FLAG_NEED_NETDEV_UP | \ 16411 NL80211_FLAG_CLEAR_SKB) \ 16412 SELECTOR(__sel, WDEV_UP, \ 16413 NL80211_FLAG_NEED_WDEV_UP) \ 16414 SELECTOR(__sel, WDEV_UP_LINK, \ 16415 NL80211_FLAG_NEED_WDEV_UP | \ 16416 NL80211_FLAG_MLO_VALID_LINK_ID) \ 16417 SELECTOR(__sel, WDEV_UP_RTNL, \ 16418 NL80211_FLAG_NEED_WDEV_UP | \ 16419 NL80211_FLAG_NEED_RTNL) \ 16420 SELECTOR(__sel, WIPHY_CLEAR, \ 16421 NL80211_FLAG_NEED_WIPHY | \ 16422 NL80211_FLAG_CLEAR_SKB) 16423 16424 enum nl80211_internal_flags_selector { 16425 #define SELECTOR(_, name, value) NL80211_IFL_SEL_##name, 16426 INTERNAL_FLAG_SELECTORS(_) 16427 #undef SELECTOR 16428 }; 16429 16430 static u32 nl80211_internal_flags[] = { 16431 #define SELECTOR(_, name, value) [NL80211_IFL_SEL_##name] = value, 16432 INTERNAL_FLAG_SELECTORS(_) 16433 #undef SELECTOR 16434 }; 16435 16436 static int nl80211_pre_doit(const struct genl_split_ops *ops, 16437 struct sk_buff *skb, 16438 struct genl_info *info) 16439 { 16440 struct cfg80211_registered_device *rdev = NULL; 16441 struct wireless_dev *wdev = NULL; 16442 struct net_device *dev = NULL; 16443 u32 internal_flags; 16444 int err; 16445 16446 if (WARN_ON(ops->internal_flags >= ARRAY_SIZE(nl80211_internal_flags))) 16447 return -EINVAL; 16448 16449 internal_flags = nl80211_internal_flags[ops->internal_flags]; 16450 16451 rtnl_lock(); 16452 if (internal_flags & NL80211_FLAG_NEED_WIPHY) { 16453 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 16454 if (IS_ERR(rdev)) { 16455 err = PTR_ERR(rdev); 16456 goto out_unlock; 16457 } 16458 info->user_ptr[0] = rdev; 16459 } else if (internal_flags & NL80211_FLAG_NEED_NETDEV || 16460 internal_flags & NL80211_FLAG_NEED_WDEV) { 16461 wdev = __cfg80211_wdev_from_attrs(NULL, genl_info_net(info), 16462 info->attrs); 16463 if (IS_ERR(wdev)) { 16464 err = PTR_ERR(wdev); 16465 goto out_unlock; 16466 } 16467 16468 dev = wdev->netdev; 16469 dev_hold(dev); 16470 rdev = wiphy_to_rdev(wdev->wiphy); 16471 16472 if (internal_flags & NL80211_FLAG_NEED_NETDEV) { 16473 if (!dev) { 16474 err = -EINVAL; 16475 goto out_unlock; 16476 } 16477 16478 info->user_ptr[1] = dev; 16479 } else { 16480 info->user_ptr[1] = wdev; 16481 } 16482 16483 if (internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && 16484 !wdev_running(wdev)) { 16485 err = -ENETDOWN; 16486 goto out_unlock; 16487 } 16488 16489 info->user_ptr[0] = rdev; 16490 } 16491 16492 if (internal_flags & NL80211_FLAG_MLO_VALID_LINK_ID) { 16493 struct nlattr *link_id = info->attrs[NL80211_ATTR_MLO_LINK_ID]; 16494 16495 if (!wdev) { 16496 err = -EINVAL; 16497 goto out_unlock; 16498 } 16499 16500 /* MLO -> require valid link ID */ 16501 if (wdev->valid_links && 16502 (!link_id || 16503 !(wdev->valid_links & BIT(nla_get_u8(link_id))))) { 16504 err = -EINVAL; 16505 goto out_unlock; 16506 } 16507 16508 /* non-MLO -> no link ID attribute accepted */ 16509 if (!wdev->valid_links && link_id) { 16510 err = -EINVAL; 16511 goto out_unlock; 16512 } 16513 } 16514 16515 if (internal_flags & NL80211_FLAG_MLO_UNSUPPORTED) { 16516 if (info->attrs[NL80211_ATTR_MLO_LINK_ID] || 16517 (wdev && wdev->valid_links)) { 16518 err = -EINVAL; 16519 goto out_unlock; 16520 } 16521 } 16522 16523 if (rdev && !(internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) { 16524 wiphy_lock(&rdev->wiphy); 16525 /* we keep the mutex locked until post_doit */ 16526 __release(&rdev->wiphy.mtx); 16527 } 16528 if (!(internal_flags & NL80211_FLAG_NEED_RTNL)) 16529 rtnl_unlock(); 16530 16531 return 0; 16532 out_unlock: 16533 rtnl_unlock(); 16534 dev_put(dev); 16535 return err; 16536 } 16537 16538 static void nl80211_post_doit(const struct genl_split_ops *ops, 16539 struct sk_buff *skb, 16540 struct genl_info *info) 16541 { 16542 u32 internal_flags = nl80211_internal_flags[ops->internal_flags]; 16543 16544 if (info->user_ptr[1]) { 16545 if (internal_flags & NL80211_FLAG_NEED_WDEV) { 16546 struct wireless_dev *wdev = info->user_ptr[1]; 16547 16548 dev_put(wdev->netdev); 16549 } else { 16550 dev_put(info->user_ptr[1]); 16551 } 16552 } 16553 16554 if (info->user_ptr[0] && 16555 !(internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) { 16556 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16557 16558 /* we kept the mutex locked since pre_doit */ 16559 __acquire(&rdev->wiphy.mtx); 16560 wiphy_unlock(&rdev->wiphy); 16561 } 16562 16563 if (internal_flags & NL80211_FLAG_NEED_RTNL) 16564 rtnl_unlock(); 16565 16566 /* If needed, clear the netlink message payload from the SKB 16567 * as it might contain key data that shouldn't stick around on 16568 * the heap after the SKB is freed. The netlink message header 16569 * is still needed for further processing, so leave it intact. 16570 */ 16571 if (internal_flags & NL80211_FLAG_CLEAR_SKB) { 16572 struct nlmsghdr *nlh = nlmsg_hdr(skb); 16573 16574 memset(nlmsg_data(nlh), 0, nlmsg_len(nlh)); 16575 } 16576 } 16577 16578 static int nl80211_set_sar_sub_specs(struct cfg80211_registered_device *rdev, 16579 struct cfg80211_sar_specs *sar_specs, 16580 struct nlattr *spec[], int index) 16581 { 16582 u32 range_index, i; 16583 16584 if (!sar_specs || !spec) 16585 return -EINVAL; 16586 16587 if (!spec[NL80211_SAR_ATTR_SPECS_POWER] || 16588 !spec[NL80211_SAR_ATTR_SPECS_RANGE_INDEX]) 16589 return -EINVAL; 16590 16591 range_index = nla_get_u32(spec[NL80211_SAR_ATTR_SPECS_RANGE_INDEX]); 16592 16593 /* check if range_index exceeds num_freq_ranges */ 16594 if (range_index >= rdev->wiphy.sar_capa->num_freq_ranges) 16595 return -EINVAL; 16596 16597 /* check if range_index duplicates */ 16598 for (i = 0; i < index; i++) { 16599 if (sar_specs->sub_specs[i].freq_range_index == range_index) 16600 return -EINVAL; 16601 } 16602 16603 sar_specs->sub_specs[index].power = 16604 nla_get_s32(spec[NL80211_SAR_ATTR_SPECS_POWER]); 16605 16606 sar_specs->sub_specs[index].freq_range_index = range_index; 16607 16608 return 0; 16609 } 16610 16611 static int nl80211_set_sar_specs(struct sk_buff *skb, struct genl_info *info) 16612 { 16613 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 16614 struct nlattr *spec[NL80211_SAR_ATTR_SPECS_MAX + 1]; 16615 struct nlattr *tb[NL80211_SAR_ATTR_MAX + 1]; 16616 struct cfg80211_sar_specs *sar_spec; 16617 enum nl80211_sar_type type; 16618 struct nlattr *spec_list; 16619 u32 specs; 16620 int rem, err; 16621 16622 if (!rdev->wiphy.sar_capa || !rdev->ops->set_sar_specs) 16623 return -EOPNOTSUPP; 16624 16625 if (!info->attrs[NL80211_ATTR_SAR_SPEC]) 16626 return -EINVAL; 16627 16628 nla_parse_nested(tb, NL80211_SAR_ATTR_MAX, 16629 info->attrs[NL80211_ATTR_SAR_SPEC], 16630 NULL, NULL); 16631 16632 if (!tb[NL80211_SAR_ATTR_TYPE] || !tb[NL80211_SAR_ATTR_SPECS]) 16633 return -EINVAL; 16634 16635 type = nla_get_u32(tb[NL80211_SAR_ATTR_TYPE]); 16636 if (type != rdev->wiphy.sar_capa->type) 16637 return -EINVAL; 16638 16639 specs = 0; 16640 nla_for_each_nested(spec_list, tb[NL80211_SAR_ATTR_SPECS], rem) 16641 specs++; 16642 16643 if (specs > rdev->wiphy.sar_capa->num_freq_ranges) 16644 return -EINVAL; 16645 16646 sar_spec = kzalloc(struct_size(sar_spec, sub_specs, specs), GFP_KERNEL); 16647 if (!sar_spec) 16648 return -ENOMEM; 16649 16650 sar_spec->type = type; 16651 specs = 0; 16652 nla_for_each_nested(spec_list, tb[NL80211_SAR_ATTR_SPECS], rem) { 16653 nla_parse_nested(spec, NL80211_SAR_ATTR_SPECS_MAX, 16654 spec_list, NULL, NULL); 16655 16656 switch (type) { 16657 case NL80211_SAR_TYPE_POWER: 16658 if (nl80211_set_sar_sub_specs(rdev, sar_spec, 16659 spec, specs)) { 16660 err = -EINVAL; 16661 goto error; 16662 } 16663 break; 16664 default: 16665 err = -EINVAL; 16666 goto error; 16667 } 16668 specs++; 16669 } 16670 16671 sar_spec->num_sub_specs = specs; 16672 16673 rdev->cur_cmd_info = info; 16674 err = rdev_set_sar_specs(rdev, sar_spec); 16675 rdev->cur_cmd_info = NULL; 16676 error: 16677 kfree(sar_spec); 16678 return err; 16679 } 16680 16681 #define SELECTOR(__sel, name, value) \ 16682 ((__sel) == (value)) ? NL80211_IFL_SEL_##name : 16683 int __missing_selector(void); 16684 #define IFLAGS(__val) INTERNAL_FLAG_SELECTORS(__val) __missing_selector() 16685 16686 static const struct genl_ops nl80211_ops[] = { 16687 { 16688 .cmd = NL80211_CMD_GET_WIPHY, 16689 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16690 .doit = nl80211_get_wiphy, 16691 .dumpit = nl80211_dump_wiphy, 16692 .done = nl80211_dump_wiphy_done, 16693 /* can be retrieved by unprivileged users */ 16694 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 16695 }, 16696 }; 16697 16698 static const struct genl_small_ops nl80211_small_ops[] = { 16699 { 16700 .cmd = NL80211_CMD_SET_WIPHY, 16701 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16702 .doit = nl80211_set_wiphy, 16703 .flags = GENL_UNS_ADMIN_PERM, 16704 }, 16705 { 16706 .cmd = NL80211_CMD_GET_INTERFACE, 16707 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16708 .doit = nl80211_get_interface, 16709 .dumpit = nl80211_dump_interface, 16710 /* can be retrieved by unprivileged users */ 16711 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV), 16712 }, 16713 { 16714 .cmd = NL80211_CMD_SET_INTERFACE, 16715 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16716 .doit = nl80211_set_interface, 16717 .flags = GENL_UNS_ADMIN_PERM, 16718 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 16719 NL80211_FLAG_NEED_RTNL), 16720 }, 16721 { 16722 .cmd = NL80211_CMD_NEW_INTERFACE, 16723 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16724 .doit = nl80211_new_interface, 16725 .flags = GENL_UNS_ADMIN_PERM, 16726 .internal_flags = 16727 IFLAGS(NL80211_FLAG_NEED_WIPHY | 16728 NL80211_FLAG_NEED_RTNL | 16729 /* we take the wiphy mutex later ourselves */ 16730 NL80211_FLAG_NO_WIPHY_MTX), 16731 }, 16732 { 16733 .cmd = NL80211_CMD_DEL_INTERFACE, 16734 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16735 .doit = nl80211_del_interface, 16736 .flags = GENL_UNS_ADMIN_PERM, 16737 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 16738 NL80211_FLAG_NEED_RTNL), 16739 }, 16740 { 16741 .cmd = NL80211_CMD_GET_KEY, 16742 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16743 .doit = nl80211_get_key, 16744 .flags = GENL_UNS_ADMIN_PERM, 16745 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 16746 }, 16747 { 16748 .cmd = NL80211_CMD_SET_KEY, 16749 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16750 .doit = nl80211_set_key, 16751 .flags = GENL_UNS_ADMIN_PERM, 16752 /* cannot use NL80211_FLAG_MLO_VALID_LINK_ID, depends on key */ 16753 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 16754 NL80211_FLAG_CLEAR_SKB), 16755 }, 16756 { 16757 .cmd = NL80211_CMD_NEW_KEY, 16758 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16759 .doit = nl80211_new_key, 16760 .flags = GENL_UNS_ADMIN_PERM, 16761 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 16762 NL80211_FLAG_CLEAR_SKB), 16763 }, 16764 { 16765 .cmd = NL80211_CMD_DEL_KEY, 16766 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16767 .doit = nl80211_del_key, 16768 .flags = GENL_UNS_ADMIN_PERM, 16769 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 16770 }, 16771 { 16772 .cmd = NL80211_CMD_SET_BEACON, 16773 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16774 .flags = GENL_UNS_ADMIN_PERM, 16775 .doit = nl80211_set_beacon, 16776 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 16777 NL80211_FLAG_MLO_VALID_LINK_ID), 16778 }, 16779 { 16780 .cmd = NL80211_CMD_START_AP, 16781 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16782 .flags = GENL_UNS_ADMIN_PERM, 16783 .doit = nl80211_start_ap, 16784 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 16785 NL80211_FLAG_MLO_VALID_LINK_ID), 16786 }, 16787 { 16788 .cmd = NL80211_CMD_STOP_AP, 16789 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16790 .flags = GENL_UNS_ADMIN_PERM, 16791 .doit = nl80211_stop_ap, 16792 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 16793 NL80211_FLAG_MLO_VALID_LINK_ID), 16794 }, 16795 { 16796 .cmd = NL80211_CMD_GET_STATION, 16797 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16798 .doit = nl80211_get_station, 16799 .dumpit = nl80211_dump_station, 16800 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 16801 }, 16802 { 16803 .cmd = NL80211_CMD_SET_STATION, 16804 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16805 .doit = nl80211_set_station, 16806 .flags = GENL_UNS_ADMIN_PERM, 16807 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 16808 }, 16809 { 16810 .cmd = NL80211_CMD_NEW_STATION, 16811 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16812 .doit = nl80211_new_station, 16813 .flags = GENL_UNS_ADMIN_PERM, 16814 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 16815 }, 16816 { 16817 .cmd = NL80211_CMD_DEL_STATION, 16818 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16819 .doit = nl80211_del_station, 16820 .flags = GENL_UNS_ADMIN_PERM, 16821 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 16822 }, 16823 { 16824 .cmd = NL80211_CMD_GET_MPATH, 16825 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16826 .doit = nl80211_get_mpath, 16827 .dumpit = nl80211_dump_mpath, 16828 .flags = GENL_UNS_ADMIN_PERM, 16829 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 16830 }, 16831 { 16832 .cmd = NL80211_CMD_GET_MPP, 16833 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16834 .doit = nl80211_get_mpp, 16835 .dumpit = nl80211_dump_mpp, 16836 .flags = GENL_UNS_ADMIN_PERM, 16837 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 16838 }, 16839 { 16840 .cmd = NL80211_CMD_SET_MPATH, 16841 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16842 .doit = nl80211_set_mpath, 16843 .flags = GENL_UNS_ADMIN_PERM, 16844 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 16845 }, 16846 { 16847 .cmd = NL80211_CMD_NEW_MPATH, 16848 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16849 .doit = nl80211_new_mpath, 16850 .flags = GENL_UNS_ADMIN_PERM, 16851 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 16852 }, 16853 { 16854 .cmd = NL80211_CMD_DEL_MPATH, 16855 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16856 .doit = nl80211_del_mpath, 16857 .flags = GENL_UNS_ADMIN_PERM, 16858 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 16859 }, 16860 { 16861 .cmd = NL80211_CMD_SET_BSS, 16862 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16863 .doit = nl80211_set_bss, 16864 .flags = GENL_UNS_ADMIN_PERM, 16865 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 16866 NL80211_FLAG_MLO_VALID_LINK_ID), 16867 }, 16868 { 16869 .cmd = NL80211_CMD_GET_REG, 16870 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16871 .doit = nl80211_get_reg_do, 16872 .dumpit = nl80211_get_reg_dump, 16873 /* can be retrieved by unprivileged users */ 16874 }, 16875 #ifdef CONFIG_CFG80211_CRDA_SUPPORT 16876 { 16877 .cmd = NL80211_CMD_SET_REG, 16878 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16879 .doit = nl80211_set_reg, 16880 .flags = GENL_ADMIN_PERM, 16881 }, 16882 #endif 16883 { 16884 .cmd = NL80211_CMD_REQ_SET_REG, 16885 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16886 .doit = nl80211_req_set_reg, 16887 .flags = GENL_ADMIN_PERM, 16888 }, 16889 { 16890 .cmd = NL80211_CMD_RELOAD_REGDB, 16891 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16892 .doit = nl80211_reload_regdb, 16893 .flags = GENL_ADMIN_PERM, 16894 }, 16895 { 16896 .cmd = NL80211_CMD_GET_MESH_CONFIG, 16897 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16898 .doit = nl80211_get_mesh_config, 16899 /* can be retrieved by unprivileged users */ 16900 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 16901 }, 16902 { 16903 .cmd = NL80211_CMD_SET_MESH_CONFIG, 16904 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16905 .doit = nl80211_update_mesh_config, 16906 .flags = GENL_UNS_ADMIN_PERM, 16907 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 16908 }, 16909 { 16910 .cmd = NL80211_CMD_TRIGGER_SCAN, 16911 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16912 .doit = nl80211_trigger_scan, 16913 .flags = GENL_UNS_ADMIN_PERM, 16914 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 16915 }, 16916 { 16917 .cmd = NL80211_CMD_ABORT_SCAN, 16918 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16919 .doit = nl80211_abort_scan, 16920 .flags = GENL_UNS_ADMIN_PERM, 16921 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 16922 }, 16923 { 16924 .cmd = NL80211_CMD_GET_SCAN, 16925 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16926 .dumpit = nl80211_dump_scan, 16927 }, 16928 { 16929 .cmd = NL80211_CMD_START_SCHED_SCAN, 16930 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16931 .doit = nl80211_start_sched_scan, 16932 .flags = GENL_UNS_ADMIN_PERM, 16933 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 16934 }, 16935 { 16936 .cmd = NL80211_CMD_STOP_SCHED_SCAN, 16937 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16938 .doit = nl80211_stop_sched_scan, 16939 .flags = GENL_UNS_ADMIN_PERM, 16940 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 16941 }, 16942 { 16943 .cmd = NL80211_CMD_AUTHENTICATE, 16944 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16945 .doit = nl80211_authenticate, 16946 .flags = GENL_UNS_ADMIN_PERM, 16947 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 16948 NL80211_FLAG_CLEAR_SKB), 16949 }, 16950 { 16951 .cmd = NL80211_CMD_ASSOCIATE, 16952 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16953 .doit = nl80211_associate, 16954 .flags = GENL_UNS_ADMIN_PERM, 16955 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 16956 NL80211_FLAG_CLEAR_SKB), 16957 }, 16958 { 16959 .cmd = NL80211_CMD_DEAUTHENTICATE, 16960 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16961 .doit = nl80211_deauthenticate, 16962 .flags = GENL_UNS_ADMIN_PERM, 16963 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 16964 }, 16965 { 16966 .cmd = NL80211_CMD_DISASSOCIATE, 16967 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16968 .doit = nl80211_disassociate, 16969 .flags = GENL_UNS_ADMIN_PERM, 16970 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 16971 }, 16972 { 16973 .cmd = NL80211_CMD_JOIN_IBSS, 16974 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16975 .doit = nl80211_join_ibss, 16976 .flags = GENL_UNS_ADMIN_PERM, 16977 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 16978 }, 16979 { 16980 .cmd = NL80211_CMD_LEAVE_IBSS, 16981 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16982 .doit = nl80211_leave_ibss, 16983 .flags = GENL_UNS_ADMIN_PERM, 16984 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 16985 }, 16986 #ifdef CONFIG_NL80211_TESTMODE 16987 { 16988 .cmd = NL80211_CMD_TESTMODE, 16989 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16990 .doit = nl80211_testmode_do, 16991 .dumpit = nl80211_testmode_dump, 16992 .flags = GENL_UNS_ADMIN_PERM, 16993 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 16994 }, 16995 #endif 16996 { 16997 .cmd = NL80211_CMD_CONNECT, 16998 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 16999 .doit = nl80211_connect, 17000 .flags = GENL_UNS_ADMIN_PERM, 17001 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 17002 NL80211_FLAG_CLEAR_SKB), 17003 }, 17004 { 17005 .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS, 17006 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17007 .doit = nl80211_update_connect_params, 17008 .flags = GENL_ADMIN_PERM, 17009 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 17010 NL80211_FLAG_CLEAR_SKB), 17011 }, 17012 { 17013 .cmd = NL80211_CMD_DISCONNECT, 17014 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17015 .doit = nl80211_disconnect, 17016 .flags = GENL_UNS_ADMIN_PERM, 17017 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17018 }, 17019 { 17020 .cmd = NL80211_CMD_SET_WIPHY_NETNS, 17021 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17022 .doit = nl80211_wiphy_netns, 17023 .flags = GENL_UNS_ADMIN_PERM, 17024 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY | 17025 NL80211_FLAG_NEED_RTNL | 17026 NL80211_FLAG_NO_WIPHY_MTX), 17027 }, 17028 { 17029 .cmd = NL80211_CMD_GET_SURVEY, 17030 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17031 .dumpit = nl80211_dump_survey, 17032 }, 17033 { 17034 .cmd = NL80211_CMD_SET_PMKSA, 17035 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17036 .doit = nl80211_set_pmksa, 17037 .flags = GENL_UNS_ADMIN_PERM, 17038 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 17039 NL80211_FLAG_CLEAR_SKB), 17040 }, 17041 { 17042 .cmd = NL80211_CMD_DEL_PMKSA, 17043 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17044 .doit = nl80211_del_pmksa, 17045 .flags = GENL_UNS_ADMIN_PERM, 17046 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17047 }, 17048 { 17049 .cmd = NL80211_CMD_FLUSH_PMKSA, 17050 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17051 .doit = nl80211_flush_pmksa, 17052 .flags = GENL_UNS_ADMIN_PERM, 17053 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17054 }, 17055 { 17056 .cmd = NL80211_CMD_REMAIN_ON_CHANNEL, 17057 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17058 .doit = nl80211_remain_on_channel, 17059 .flags = GENL_UNS_ADMIN_PERM, 17060 /* FIXME: requiring a link ID here is probably not good */ 17061 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 17062 NL80211_FLAG_MLO_VALID_LINK_ID), 17063 }, 17064 { 17065 .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 17066 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17067 .doit = nl80211_cancel_remain_on_channel, 17068 .flags = GENL_UNS_ADMIN_PERM, 17069 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 17070 }, 17071 { 17072 .cmd = NL80211_CMD_SET_TX_BITRATE_MASK, 17073 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17074 .doit = nl80211_set_tx_bitrate_mask, 17075 .flags = GENL_UNS_ADMIN_PERM, 17076 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 17077 NL80211_FLAG_MLO_VALID_LINK_ID), 17078 }, 17079 { 17080 .cmd = NL80211_CMD_REGISTER_FRAME, 17081 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17082 .doit = nl80211_register_mgmt, 17083 .flags = GENL_UNS_ADMIN_PERM, 17084 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV), 17085 }, 17086 { 17087 .cmd = NL80211_CMD_FRAME, 17088 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17089 .doit = nl80211_tx_mgmt, 17090 .flags = GENL_UNS_ADMIN_PERM, 17091 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 17092 }, 17093 { 17094 .cmd = NL80211_CMD_FRAME_WAIT_CANCEL, 17095 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17096 .doit = nl80211_tx_mgmt_cancel_wait, 17097 .flags = GENL_UNS_ADMIN_PERM, 17098 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 17099 }, 17100 { 17101 .cmd = NL80211_CMD_SET_POWER_SAVE, 17102 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17103 .doit = nl80211_set_power_save, 17104 .flags = GENL_UNS_ADMIN_PERM, 17105 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 17106 }, 17107 { 17108 .cmd = NL80211_CMD_GET_POWER_SAVE, 17109 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17110 .doit = nl80211_get_power_save, 17111 /* can be retrieved by unprivileged users */ 17112 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 17113 }, 17114 { 17115 .cmd = NL80211_CMD_SET_CQM, 17116 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17117 .doit = nl80211_set_cqm, 17118 .flags = GENL_UNS_ADMIN_PERM, 17119 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 17120 }, 17121 { 17122 .cmd = NL80211_CMD_SET_CHANNEL, 17123 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17124 .doit = nl80211_set_channel, 17125 .flags = GENL_UNS_ADMIN_PERM, 17126 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 17127 NL80211_FLAG_MLO_VALID_LINK_ID), 17128 }, 17129 { 17130 .cmd = NL80211_CMD_JOIN_MESH, 17131 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17132 .doit = nl80211_join_mesh, 17133 .flags = GENL_UNS_ADMIN_PERM, 17134 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17135 }, 17136 { 17137 .cmd = NL80211_CMD_LEAVE_MESH, 17138 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17139 .doit = nl80211_leave_mesh, 17140 .flags = GENL_UNS_ADMIN_PERM, 17141 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17142 }, 17143 { 17144 .cmd = NL80211_CMD_JOIN_OCB, 17145 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17146 .doit = nl80211_join_ocb, 17147 .flags = GENL_UNS_ADMIN_PERM, 17148 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17149 }, 17150 { 17151 .cmd = NL80211_CMD_LEAVE_OCB, 17152 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17153 .doit = nl80211_leave_ocb, 17154 .flags = GENL_UNS_ADMIN_PERM, 17155 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17156 }, 17157 #ifdef CONFIG_PM 17158 { 17159 .cmd = NL80211_CMD_GET_WOWLAN, 17160 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17161 .doit = nl80211_get_wowlan, 17162 /* can be retrieved by unprivileged users */ 17163 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 17164 }, 17165 { 17166 .cmd = NL80211_CMD_SET_WOWLAN, 17167 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17168 .doit = nl80211_set_wowlan, 17169 .flags = GENL_UNS_ADMIN_PERM, 17170 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 17171 }, 17172 #endif 17173 { 17174 .cmd = NL80211_CMD_SET_REKEY_OFFLOAD, 17175 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17176 .doit = nl80211_set_rekey_data, 17177 .flags = GENL_UNS_ADMIN_PERM, 17178 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 17179 NL80211_FLAG_CLEAR_SKB), 17180 }, 17181 { 17182 .cmd = NL80211_CMD_TDLS_MGMT, 17183 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17184 .doit = nl80211_tdls_mgmt, 17185 .flags = GENL_UNS_ADMIN_PERM, 17186 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 17187 NL80211_FLAG_MLO_VALID_LINK_ID), 17188 }, 17189 { 17190 .cmd = NL80211_CMD_TDLS_OPER, 17191 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17192 .doit = nl80211_tdls_oper, 17193 .flags = GENL_UNS_ADMIN_PERM, 17194 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17195 }, 17196 { 17197 .cmd = NL80211_CMD_UNEXPECTED_FRAME, 17198 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17199 .doit = nl80211_register_unexpected_frame, 17200 .flags = GENL_UNS_ADMIN_PERM, 17201 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 17202 }, 17203 { 17204 .cmd = NL80211_CMD_PROBE_CLIENT, 17205 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17206 .doit = nl80211_probe_client, 17207 .flags = GENL_UNS_ADMIN_PERM, 17208 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17209 }, 17210 { 17211 .cmd = NL80211_CMD_REGISTER_BEACONS, 17212 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17213 .doit = nl80211_register_beacons, 17214 .flags = GENL_UNS_ADMIN_PERM, 17215 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 17216 }, 17217 { 17218 .cmd = NL80211_CMD_SET_NOACK_MAP, 17219 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17220 .doit = nl80211_set_noack_map, 17221 .flags = GENL_UNS_ADMIN_PERM, 17222 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 17223 }, 17224 { 17225 .cmd = NL80211_CMD_START_P2P_DEVICE, 17226 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17227 .doit = nl80211_start_p2p_device, 17228 .flags = GENL_UNS_ADMIN_PERM, 17229 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 17230 NL80211_FLAG_NEED_RTNL), 17231 }, 17232 { 17233 .cmd = NL80211_CMD_STOP_P2P_DEVICE, 17234 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17235 .doit = nl80211_stop_p2p_device, 17236 .flags = GENL_UNS_ADMIN_PERM, 17237 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 17238 NL80211_FLAG_NEED_RTNL), 17239 }, 17240 { 17241 .cmd = NL80211_CMD_START_NAN, 17242 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17243 .doit = nl80211_start_nan, 17244 .flags = GENL_ADMIN_PERM, 17245 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV | 17246 NL80211_FLAG_NEED_RTNL), 17247 }, 17248 { 17249 .cmd = NL80211_CMD_STOP_NAN, 17250 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17251 .doit = nl80211_stop_nan, 17252 .flags = GENL_ADMIN_PERM, 17253 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP | 17254 NL80211_FLAG_NEED_RTNL), 17255 }, 17256 { 17257 .cmd = NL80211_CMD_ADD_NAN_FUNCTION, 17258 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17259 .doit = nl80211_nan_add_func, 17260 .flags = GENL_ADMIN_PERM, 17261 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 17262 }, 17263 { 17264 .cmd = NL80211_CMD_DEL_NAN_FUNCTION, 17265 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17266 .doit = nl80211_nan_del_func, 17267 .flags = GENL_ADMIN_PERM, 17268 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 17269 }, 17270 { 17271 .cmd = NL80211_CMD_CHANGE_NAN_CONFIG, 17272 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17273 .doit = nl80211_nan_change_config, 17274 .flags = GENL_ADMIN_PERM, 17275 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 17276 }, 17277 { 17278 .cmd = NL80211_CMD_SET_MCAST_RATE, 17279 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17280 .doit = nl80211_set_mcast_rate, 17281 .flags = GENL_UNS_ADMIN_PERM, 17282 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 17283 }, 17284 { 17285 .cmd = NL80211_CMD_SET_MAC_ACL, 17286 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17287 .doit = nl80211_set_mac_acl, 17288 .flags = GENL_UNS_ADMIN_PERM, 17289 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 17290 NL80211_FLAG_MLO_UNSUPPORTED), 17291 }, 17292 { 17293 .cmd = NL80211_CMD_RADAR_DETECT, 17294 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17295 .doit = nl80211_start_radar_detection, 17296 .flags = GENL_UNS_ADMIN_PERM, 17297 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 17298 NL80211_FLAG_NO_WIPHY_MTX | 17299 NL80211_FLAG_MLO_UNSUPPORTED), 17300 }, 17301 { 17302 .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES, 17303 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17304 .doit = nl80211_get_protocol_features, 17305 }, 17306 { 17307 .cmd = NL80211_CMD_UPDATE_FT_IES, 17308 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17309 .doit = nl80211_update_ft_ies, 17310 .flags = GENL_UNS_ADMIN_PERM, 17311 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17312 }, 17313 { 17314 .cmd = NL80211_CMD_CRIT_PROTOCOL_START, 17315 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17316 .doit = nl80211_crit_protocol_start, 17317 .flags = GENL_UNS_ADMIN_PERM, 17318 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 17319 }, 17320 { 17321 .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP, 17322 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17323 .doit = nl80211_crit_protocol_stop, 17324 .flags = GENL_UNS_ADMIN_PERM, 17325 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 17326 }, 17327 { 17328 .cmd = NL80211_CMD_GET_COALESCE, 17329 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17330 .doit = nl80211_get_coalesce, 17331 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 17332 }, 17333 { 17334 .cmd = NL80211_CMD_SET_COALESCE, 17335 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17336 .doit = nl80211_set_coalesce, 17337 .flags = GENL_UNS_ADMIN_PERM, 17338 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY), 17339 }, 17340 { 17341 .cmd = NL80211_CMD_CHANNEL_SWITCH, 17342 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17343 .doit = nl80211_channel_switch, 17344 .flags = GENL_UNS_ADMIN_PERM, 17345 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 17346 NL80211_FLAG_MLO_VALID_LINK_ID), 17347 }, 17348 { 17349 .cmd = NL80211_CMD_VENDOR, 17350 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17351 .doit = nl80211_vendor_cmd, 17352 .dumpit = nl80211_vendor_cmd_dump, 17353 .flags = GENL_UNS_ADMIN_PERM, 17354 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY | 17355 NL80211_FLAG_CLEAR_SKB), 17356 }, 17357 { 17358 .cmd = NL80211_CMD_SET_QOS_MAP, 17359 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17360 .doit = nl80211_set_qos_map, 17361 .flags = GENL_UNS_ADMIN_PERM, 17362 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17363 }, 17364 { 17365 .cmd = NL80211_CMD_ADD_TX_TS, 17366 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17367 .doit = nl80211_add_tx_ts, 17368 .flags = GENL_UNS_ADMIN_PERM, 17369 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 17370 NL80211_FLAG_MLO_UNSUPPORTED), 17371 }, 17372 { 17373 .cmd = NL80211_CMD_DEL_TX_TS, 17374 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17375 .doit = nl80211_del_tx_ts, 17376 .flags = GENL_UNS_ADMIN_PERM, 17377 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17378 }, 17379 { 17380 .cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH, 17381 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17382 .doit = nl80211_tdls_channel_switch, 17383 .flags = GENL_UNS_ADMIN_PERM, 17384 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17385 }, 17386 { 17387 .cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, 17388 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17389 .doit = nl80211_tdls_cancel_channel_switch, 17390 .flags = GENL_UNS_ADMIN_PERM, 17391 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17392 }, 17393 { 17394 .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST, 17395 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17396 .doit = nl80211_set_multicast_to_unicast, 17397 .flags = GENL_UNS_ADMIN_PERM, 17398 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV), 17399 }, 17400 { 17401 .cmd = NL80211_CMD_SET_PMK, 17402 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17403 .doit = nl80211_set_pmk, 17404 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 17405 NL80211_FLAG_CLEAR_SKB), 17406 }, 17407 { 17408 .cmd = NL80211_CMD_DEL_PMK, 17409 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17410 .doit = nl80211_del_pmk, 17411 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17412 }, 17413 { 17414 .cmd = NL80211_CMD_EXTERNAL_AUTH, 17415 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17416 .doit = nl80211_external_auth, 17417 .flags = GENL_ADMIN_PERM, 17418 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17419 }, 17420 { 17421 .cmd = NL80211_CMD_CONTROL_PORT_FRAME, 17422 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17423 .doit = nl80211_tx_control_port, 17424 .flags = GENL_UNS_ADMIN_PERM, 17425 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17426 }, 17427 { 17428 .cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS, 17429 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17430 .doit = nl80211_get_ftm_responder_stats, 17431 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 17432 NL80211_FLAG_MLO_VALID_LINK_ID), 17433 }, 17434 { 17435 .cmd = NL80211_CMD_PEER_MEASUREMENT_START, 17436 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17437 .doit = nl80211_pmsr_start, 17438 .flags = GENL_UNS_ADMIN_PERM, 17439 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WDEV_UP), 17440 }, 17441 { 17442 .cmd = NL80211_CMD_NOTIFY_RADAR, 17443 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17444 .doit = nl80211_notify_radar_detection, 17445 .flags = GENL_UNS_ADMIN_PERM, 17446 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17447 }, 17448 { 17449 .cmd = NL80211_CMD_UPDATE_OWE_INFO, 17450 .doit = nl80211_update_owe_info, 17451 .flags = GENL_ADMIN_PERM, 17452 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17453 }, 17454 { 17455 .cmd = NL80211_CMD_PROBE_MESH_LINK, 17456 .doit = nl80211_probe_mesh_link, 17457 .flags = GENL_UNS_ADMIN_PERM, 17458 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17459 }, 17460 { 17461 .cmd = NL80211_CMD_SET_TID_CONFIG, 17462 .doit = nl80211_set_tid_config, 17463 .flags = GENL_UNS_ADMIN_PERM, 17464 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV | 17465 NL80211_FLAG_MLO_VALID_LINK_ID), 17466 }, 17467 { 17468 .cmd = NL80211_CMD_SET_SAR_SPECS, 17469 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17470 .doit = nl80211_set_sar_specs, 17471 .flags = GENL_UNS_ADMIN_PERM, 17472 .internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY | 17473 NL80211_FLAG_NEED_RTNL), 17474 }, 17475 { 17476 .cmd = NL80211_CMD_COLOR_CHANGE_REQUEST, 17477 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17478 .doit = nl80211_color_change, 17479 .flags = GENL_UNS_ADMIN_PERM, 17480 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17481 }, 17482 { 17483 .cmd = NL80211_CMD_SET_FILS_AAD, 17484 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 17485 .doit = nl80211_set_fils_aad, 17486 .flags = GENL_UNS_ADMIN_PERM, 17487 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17488 }, 17489 { 17490 .cmd = NL80211_CMD_ADD_LINK, 17491 .doit = nl80211_add_link, 17492 .flags = GENL_UNS_ADMIN_PERM, 17493 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17494 }, 17495 { 17496 .cmd = NL80211_CMD_REMOVE_LINK, 17497 .doit = nl80211_remove_link, 17498 .flags = GENL_UNS_ADMIN_PERM, 17499 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 17500 NL80211_FLAG_MLO_VALID_LINK_ID), 17501 }, 17502 { 17503 .cmd = NL80211_CMD_ADD_LINK_STA, 17504 .doit = nl80211_add_link_station, 17505 .flags = GENL_UNS_ADMIN_PERM, 17506 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 17507 NL80211_FLAG_MLO_VALID_LINK_ID), 17508 }, 17509 { 17510 .cmd = NL80211_CMD_MODIFY_LINK_STA, 17511 .doit = nl80211_modify_link_station, 17512 .flags = GENL_UNS_ADMIN_PERM, 17513 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 17514 NL80211_FLAG_MLO_VALID_LINK_ID), 17515 }, 17516 { 17517 .cmd = NL80211_CMD_REMOVE_LINK_STA, 17518 .doit = nl80211_remove_link_station, 17519 .flags = GENL_UNS_ADMIN_PERM, 17520 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | 17521 NL80211_FLAG_MLO_VALID_LINK_ID), 17522 }, 17523 { 17524 .cmd = NL80211_CMD_SET_HW_TIMESTAMP, 17525 .doit = nl80211_set_hw_timestamp, 17526 .flags = GENL_UNS_ADMIN_PERM, 17527 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17528 }, 17529 { 17530 .cmd = NL80211_CMD_SET_TID_TO_LINK_MAPPING, 17531 .doit = nl80211_set_ttlm, 17532 .flags = GENL_UNS_ADMIN_PERM, 17533 .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), 17534 }, 17535 }; 17536 17537 static struct genl_family nl80211_fam __ro_after_init = { 17538 .name = NL80211_GENL_NAME, /* have users key off the name instead */ 17539 .hdrsize = 0, /* no private header */ 17540 .version = 1, /* no particular meaning now */ 17541 .maxattr = NL80211_ATTR_MAX, 17542 .policy = nl80211_policy, 17543 .netnsok = true, 17544 .pre_doit = nl80211_pre_doit, 17545 .post_doit = nl80211_post_doit, 17546 .module = THIS_MODULE, 17547 .ops = nl80211_ops, 17548 .n_ops = ARRAY_SIZE(nl80211_ops), 17549 .small_ops = nl80211_small_ops, 17550 .n_small_ops = ARRAY_SIZE(nl80211_small_ops), 17551 .resv_start_op = NL80211_CMD_REMOVE_LINK_STA + 1, 17552 .mcgrps = nl80211_mcgrps, 17553 .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps), 17554 .parallel_ops = true, 17555 }; 17556 17557 /* notification functions */ 17558 17559 void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev, 17560 enum nl80211_commands cmd) 17561 { 17562 struct sk_buff *msg; 17563 struct nl80211_dump_wiphy_state state = {}; 17564 17565 WARN_ON(cmd != NL80211_CMD_NEW_WIPHY && 17566 cmd != NL80211_CMD_DEL_WIPHY); 17567 17568 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 17569 if (!msg) 17570 return; 17571 17572 if (nl80211_send_wiphy(rdev, cmd, msg, 0, 0, 0, &state) < 0) { 17573 nlmsg_free(msg); 17574 return; 17575 } 17576 17577 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 17578 NL80211_MCGRP_CONFIG, GFP_KERNEL); 17579 } 17580 17581 void nl80211_notify_iface(struct cfg80211_registered_device *rdev, 17582 struct wireless_dev *wdev, 17583 enum nl80211_commands cmd) 17584 { 17585 struct sk_buff *msg; 17586 17587 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 17588 if (!msg) 17589 return; 17590 17591 if (nl80211_send_iface(msg, 0, 0, 0, rdev, wdev, cmd) < 0) { 17592 nlmsg_free(msg); 17593 return; 17594 } 17595 17596 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 17597 NL80211_MCGRP_CONFIG, GFP_KERNEL); 17598 } 17599 17600 static int nl80211_add_scan_req(struct sk_buff *msg, 17601 struct cfg80211_registered_device *rdev) 17602 { 17603 struct cfg80211_scan_request *req = rdev->scan_req; 17604 struct nlattr *nest; 17605 int i; 17606 struct cfg80211_scan_info *info; 17607 17608 if (WARN_ON(!req)) 17609 return 0; 17610 17611 nest = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_SSIDS); 17612 if (!nest) 17613 goto nla_put_failure; 17614 for (i = 0; i < req->n_ssids; i++) { 17615 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid)) 17616 goto nla_put_failure; 17617 } 17618 nla_nest_end(msg, nest); 17619 17620 if (req->flags & NL80211_SCAN_FLAG_FREQ_KHZ) { 17621 nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQ_KHZ); 17622 if (!nest) 17623 goto nla_put_failure; 17624 for (i = 0; i < req->n_channels; i++) { 17625 if (nla_put_u32(msg, i, 17626 ieee80211_channel_to_khz(req->channels[i]))) 17627 goto nla_put_failure; 17628 } 17629 nla_nest_end(msg, nest); 17630 } else { 17631 nest = nla_nest_start_noflag(msg, 17632 NL80211_ATTR_SCAN_FREQUENCIES); 17633 if (!nest) 17634 goto nla_put_failure; 17635 for (i = 0; i < req->n_channels; i++) { 17636 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) 17637 goto nla_put_failure; 17638 } 17639 nla_nest_end(msg, nest); 17640 } 17641 17642 if (req->ie && 17643 nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie)) 17644 goto nla_put_failure; 17645 17646 if (req->flags && 17647 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags)) 17648 goto nla_put_failure; 17649 17650 info = rdev->int_scan_req ? &rdev->int_scan_req->info : 17651 &rdev->scan_req->info; 17652 if (info->scan_start_tsf && 17653 (nla_put_u64_64bit(msg, NL80211_ATTR_SCAN_START_TIME_TSF, 17654 info->scan_start_tsf, NL80211_BSS_PAD) || 17655 nla_put(msg, NL80211_ATTR_SCAN_START_TIME_TSF_BSSID, ETH_ALEN, 17656 info->tsf_bssid))) 17657 goto nla_put_failure; 17658 17659 return 0; 17660 nla_put_failure: 17661 return -ENOBUFS; 17662 } 17663 17664 static int nl80211_prep_scan_msg(struct sk_buff *msg, 17665 struct cfg80211_registered_device *rdev, 17666 struct wireless_dev *wdev, 17667 u32 portid, u32 seq, int flags, 17668 u32 cmd) 17669 { 17670 void *hdr; 17671 17672 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 17673 if (!hdr) 17674 return -1; 17675 17676 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17677 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 17678 wdev->netdev->ifindex)) || 17679 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 17680 NL80211_ATTR_PAD)) 17681 goto nla_put_failure; 17682 17683 /* ignore errors and send incomplete event anyway */ 17684 nl80211_add_scan_req(msg, rdev); 17685 17686 genlmsg_end(msg, hdr); 17687 return 0; 17688 17689 nla_put_failure: 17690 genlmsg_cancel(msg, hdr); 17691 return -EMSGSIZE; 17692 } 17693 17694 static int 17695 nl80211_prep_sched_scan_msg(struct sk_buff *msg, 17696 struct cfg80211_sched_scan_request *req, u32 cmd) 17697 { 17698 void *hdr; 17699 17700 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 17701 if (!hdr) 17702 return -1; 17703 17704 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, 17705 wiphy_to_rdev(req->wiphy)->wiphy_idx) || 17706 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) || 17707 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid, 17708 NL80211_ATTR_PAD)) 17709 goto nla_put_failure; 17710 17711 genlmsg_end(msg, hdr); 17712 return 0; 17713 17714 nla_put_failure: 17715 genlmsg_cancel(msg, hdr); 17716 return -EMSGSIZE; 17717 } 17718 17719 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev, 17720 struct wireless_dev *wdev) 17721 { 17722 struct sk_buff *msg; 17723 17724 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 17725 if (!msg) 17726 return; 17727 17728 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0, 17729 NL80211_CMD_TRIGGER_SCAN) < 0) { 17730 nlmsg_free(msg); 17731 return; 17732 } 17733 17734 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 17735 NL80211_MCGRP_SCAN, GFP_KERNEL); 17736 } 17737 17738 struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev, 17739 struct wireless_dev *wdev, bool aborted) 17740 { 17741 struct sk_buff *msg; 17742 17743 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 17744 if (!msg) 17745 return NULL; 17746 17747 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0, 17748 aborted ? NL80211_CMD_SCAN_ABORTED : 17749 NL80211_CMD_NEW_SCAN_RESULTS) < 0) { 17750 nlmsg_free(msg); 17751 return NULL; 17752 } 17753 17754 return msg; 17755 } 17756 17757 /* send message created by nl80211_build_scan_msg() */ 17758 void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev, 17759 struct sk_buff *msg) 17760 { 17761 if (!msg) 17762 return; 17763 17764 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 17765 NL80211_MCGRP_SCAN, GFP_KERNEL); 17766 } 17767 17768 void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd) 17769 { 17770 struct sk_buff *msg; 17771 17772 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 17773 if (!msg) 17774 return; 17775 17776 if (nl80211_prep_sched_scan_msg(msg, req, cmd) < 0) { 17777 nlmsg_free(msg); 17778 return; 17779 } 17780 17781 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0, 17782 NL80211_MCGRP_SCAN, GFP_KERNEL); 17783 } 17784 17785 static bool nl80211_reg_change_event_fill(struct sk_buff *msg, 17786 struct regulatory_request *request) 17787 { 17788 /* Userspace can always count this one always being set */ 17789 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) 17790 goto nla_put_failure; 17791 17792 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { 17793 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 17794 NL80211_REGDOM_TYPE_WORLD)) 17795 goto nla_put_failure; 17796 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { 17797 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 17798 NL80211_REGDOM_TYPE_CUSTOM_WORLD)) 17799 goto nla_put_failure; 17800 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || 17801 request->intersect) { 17802 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 17803 NL80211_REGDOM_TYPE_INTERSECTION)) 17804 goto nla_put_failure; 17805 } else { 17806 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 17807 NL80211_REGDOM_TYPE_COUNTRY) || 17808 nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, 17809 request->alpha2)) 17810 goto nla_put_failure; 17811 } 17812 17813 if (request->wiphy_idx != WIPHY_IDX_INVALID) { 17814 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx); 17815 17816 if (wiphy && 17817 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) 17818 goto nla_put_failure; 17819 17820 if (wiphy && 17821 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 17822 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 17823 goto nla_put_failure; 17824 } 17825 17826 return true; 17827 17828 nla_put_failure: 17829 return false; 17830 } 17831 17832 /* 17833 * This can happen on global regulatory changes or device specific settings 17834 * based on custom regulatory domains. 17835 */ 17836 void nl80211_common_reg_change_event(enum nl80211_commands cmd_id, 17837 struct regulatory_request *request) 17838 { 17839 struct sk_buff *msg; 17840 void *hdr; 17841 17842 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 17843 if (!msg) 17844 return; 17845 17846 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd_id); 17847 if (!hdr) 17848 goto nla_put_failure; 17849 17850 if (!nl80211_reg_change_event_fill(msg, request)) 17851 goto nla_put_failure; 17852 17853 genlmsg_end(msg, hdr); 17854 17855 rcu_read_lock(); 17856 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 17857 NL80211_MCGRP_REGULATORY, GFP_ATOMIC); 17858 rcu_read_unlock(); 17859 17860 return; 17861 17862 nla_put_failure: 17863 nlmsg_free(msg); 17864 } 17865 17866 struct nl80211_mlme_event { 17867 enum nl80211_commands cmd; 17868 const u8 *buf; 17869 size_t buf_len; 17870 int uapsd_queues; 17871 const u8 *req_ies; 17872 size_t req_ies_len; 17873 bool reconnect; 17874 }; 17875 17876 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev, 17877 struct net_device *netdev, 17878 const struct nl80211_mlme_event *event, 17879 gfp_t gfp) 17880 { 17881 struct sk_buff *msg; 17882 void *hdr; 17883 17884 msg = nlmsg_new(100 + event->buf_len + event->req_ies_len, gfp); 17885 if (!msg) 17886 return; 17887 17888 hdr = nl80211hdr_put(msg, 0, 0, 0, event->cmd); 17889 if (!hdr) { 17890 nlmsg_free(msg); 17891 return; 17892 } 17893 17894 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17895 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 17896 nla_put(msg, NL80211_ATTR_FRAME, event->buf_len, event->buf) || 17897 (event->req_ies && 17898 nla_put(msg, NL80211_ATTR_REQ_IE, event->req_ies_len, 17899 event->req_ies))) 17900 goto nla_put_failure; 17901 17902 if (event->reconnect && 17903 nla_put_flag(msg, NL80211_ATTR_RECONNECT_REQUESTED)) 17904 goto nla_put_failure; 17905 17906 if (event->uapsd_queues >= 0) { 17907 struct nlattr *nla_wmm = 17908 nla_nest_start_noflag(msg, NL80211_ATTR_STA_WME); 17909 if (!nla_wmm) 17910 goto nla_put_failure; 17911 17912 if (nla_put_u8(msg, NL80211_STA_WME_UAPSD_QUEUES, 17913 event->uapsd_queues)) 17914 goto nla_put_failure; 17915 17916 nla_nest_end(msg, nla_wmm); 17917 } 17918 17919 genlmsg_end(msg, hdr); 17920 17921 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 17922 NL80211_MCGRP_MLME, gfp); 17923 return; 17924 17925 nla_put_failure: 17926 nlmsg_free(msg); 17927 } 17928 17929 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev, 17930 struct net_device *netdev, const u8 *buf, 17931 size_t len, gfp_t gfp) 17932 { 17933 struct nl80211_mlme_event event = { 17934 .cmd = NL80211_CMD_AUTHENTICATE, 17935 .buf = buf, 17936 .buf_len = len, 17937 .uapsd_queues = -1, 17938 }; 17939 17940 nl80211_send_mlme_event(rdev, netdev, &event, gfp); 17941 } 17942 17943 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev, 17944 struct net_device *netdev, 17945 const struct cfg80211_rx_assoc_resp_data *data) 17946 { 17947 struct nl80211_mlme_event event = { 17948 .cmd = NL80211_CMD_ASSOCIATE, 17949 .buf = data->buf, 17950 .buf_len = data->len, 17951 .uapsd_queues = data->uapsd_queues, 17952 .req_ies = data->req_ies, 17953 .req_ies_len = data->req_ies_len, 17954 }; 17955 17956 nl80211_send_mlme_event(rdev, netdev, &event, GFP_KERNEL); 17957 } 17958 17959 void nl80211_send_deauth(struct cfg80211_registered_device *rdev, 17960 struct net_device *netdev, const u8 *buf, 17961 size_t len, bool reconnect, gfp_t gfp) 17962 { 17963 struct nl80211_mlme_event event = { 17964 .cmd = NL80211_CMD_DEAUTHENTICATE, 17965 .buf = buf, 17966 .buf_len = len, 17967 .reconnect = reconnect, 17968 .uapsd_queues = -1, 17969 }; 17970 17971 nl80211_send_mlme_event(rdev, netdev, &event, gfp); 17972 } 17973 17974 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev, 17975 struct net_device *netdev, const u8 *buf, 17976 size_t len, bool reconnect, gfp_t gfp) 17977 { 17978 struct nl80211_mlme_event event = { 17979 .cmd = NL80211_CMD_DISASSOCIATE, 17980 .buf = buf, 17981 .buf_len = len, 17982 .reconnect = reconnect, 17983 .uapsd_queues = -1, 17984 }; 17985 17986 nl80211_send_mlme_event(rdev, netdev, &event, gfp); 17987 } 17988 17989 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf, 17990 size_t len) 17991 { 17992 struct wireless_dev *wdev = dev->ieee80211_ptr; 17993 struct wiphy *wiphy = wdev->wiphy; 17994 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 17995 const struct ieee80211_mgmt *mgmt = (void *)buf; 17996 struct nl80211_mlme_event event = { 17997 .buf = buf, 17998 .buf_len = len, 17999 .uapsd_queues = -1, 18000 }; 18001 18002 if (WARN_ON(len < 2)) 18003 return; 18004 18005 if (ieee80211_is_deauth(mgmt->frame_control)) { 18006 event.cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE; 18007 } else if (ieee80211_is_disassoc(mgmt->frame_control)) { 18008 event.cmd = NL80211_CMD_UNPROT_DISASSOCIATE; 18009 } else if (ieee80211_is_beacon(mgmt->frame_control)) { 18010 if (wdev->unprot_beacon_reported && 18011 elapsed_jiffies_msecs(wdev->unprot_beacon_reported) < 10000) 18012 return; 18013 event.cmd = NL80211_CMD_UNPROT_BEACON; 18014 wdev->unprot_beacon_reported = jiffies; 18015 } else { 18016 return; 18017 } 18018 18019 trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len); 18020 nl80211_send_mlme_event(rdev, dev, &event, GFP_ATOMIC); 18021 } 18022 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt); 18023 18024 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev, 18025 struct net_device *netdev, int cmd, 18026 const u8 *addr, gfp_t gfp) 18027 { 18028 struct sk_buff *msg; 18029 void *hdr; 18030 18031 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 18032 if (!msg) 18033 return; 18034 18035 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 18036 if (!hdr) { 18037 nlmsg_free(msg); 18038 return; 18039 } 18040 18041 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 18042 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 18043 nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 18044 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) 18045 goto nla_put_failure; 18046 18047 genlmsg_end(msg, hdr); 18048 18049 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 18050 NL80211_MCGRP_MLME, gfp); 18051 return; 18052 18053 nla_put_failure: 18054 nlmsg_free(msg); 18055 } 18056 18057 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev, 18058 struct net_device *netdev, const u8 *addr, 18059 gfp_t gfp) 18060 { 18061 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE, 18062 addr, gfp); 18063 } 18064 18065 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev, 18066 struct net_device *netdev, const u8 *addr, 18067 gfp_t gfp) 18068 { 18069 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE, 18070 addr, gfp); 18071 } 18072 18073 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev, 18074 struct net_device *netdev, 18075 struct cfg80211_connect_resp_params *cr, 18076 gfp_t gfp) 18077 { 18078 struct sk_buff *msg; 18079 void *hdr; 18080 unsigned int link; 18081 size_t link_info_size = 0; 18082 const u8 *connected_addr = cr->valid_links ? 18083 cr->ap_mld_addr : cr->links[0].bssid; 18084 18085 if (cr->valid_links) { 18086 for_each_valid_link(cr, link) { 18087 /* Nested attribute header */ 18088 link_info_size += NLA_HDRLEN; 18089 /* Link ID */ 18090 link_info_size += nla_total_size(sizeof(u8)); 18091 link_info_size += cr->links[link].addr ? 18092 nla_total_size(ETH_ALEN) : 0; 18093 link_info_size += (cr->links[link].bssid || 18094 cr->links[link].bss) ? 18095 nla_total_size(ETH_ALEN) : 0; 18096 link_info_size += nla_total_size(sizeof(u16)); 18097 } 18098 } 18099 18100 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len + 18101 cr->fils.kek_len + cr->fils.pmk_len + 18102 (cr->fils.pmkid ? WLAN_PMKID_LEN : 0) + link_info_size, 18103 gfp); 18104 if (!msg) 18105 return; 18106 18107 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT); 18108 if (!hdr) { 18109 nlmsg_free(msg); 18110 return; 18111 } 18112 18113 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 18114 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 18115 (connected_addr && 18116 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, connected_addr)) || 18117 nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, 18118 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE : 18119 cr->status) || 18120 (cr->status < 0 && 18121 (nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 18122 nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON, 18123 cr->timeout_reason))) || 18124 (cr->req_ie && 18125 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) || 18126 (cr->resp_ie && 18127 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len, 18128 cr->resp_ie)) || 18129 (cr->fils.update_erp_next_seq_num && 18130 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM, 18131 cr->fils.erp_next_seq_num)) || 18132 (cr->status == WLAN_STATUS_SUCCESS && 18133 ((cr->fils.kek && 18134 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len, 18135 cr->fils.kek)) || 18136 (cr->fils.pmk && 18137 nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) || 18138 (cr->fils.pmkid && 18139 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid))))) 18140 goto nla_put_failure; 18141 18142 if (cr->valid_links) { 18143 int i = 1; 18144 struct nlattr *nested; 18145 18146 nested = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 18147 if (!nested) 18148 goto nla_put_failure; 18149 18150 for_each_valid_link(cr, link) { 18151 struct nlattr *nested_mlo_links; 18152 const u8 *bssid = cr->links[link].bss ? 18153 cr->links[link].bss->bssid : 18154 cr->links[link].bssid; 18155 18156 nested_mlo_links = nla_nest_start(msg, i); 18157 if (!nested_mlo_links) 18158 goto nla_put_failure; 18159 18160 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link) || 18161 (bssid && 18162 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, bssid)) || 18163 (cr->links[link].addr && 18164 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 18165 cr->links[link].addr)) || 18166 nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, 18167 cr->links[link].status)) 18168 goto nla_put_failure; 18169 18170 nla_nest_end(msg, nested_mlo_links); 18171 i++; 18172 } 18173 nla_nest_end(msg, nested); 18174 } 18175 18176 genlmsg_end(msg, hdr); 18177 18178 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 18179 NL80211_MCGRP_MLME, gfp); 18180 return; 18181 18182 nla_put_failure: 18183 nlmsg_free(msg); 18184 } 18185 18186 void nl80211_send_roamed(struct cfg80211_registered_device *rdev, 18187 struct net_device *netdev, 18188 struct cfg80211_roam_info *info, gfp_t gfp) 18189 { 18190 struct sk_buff *msg; 18191 void *hdr; 18192 size_t link_info_size = 0; 18193 unsigned int link; 18194 const u8 *connected_addr = info->ap_mld_addr ? 18195 info->ap_mld_addr : 18196 (info->links[0].bss ? 18197 info->links[0].bss->bssid : 18198 info->links[0].bssid); 18199 18200 if (info->valid_links) { 18201 for_each_valid_link(info, link) { 18202 /* Nested attribute header */ 18203 link_info_size += NLA_HDRLEN; 18204 /* Link ID */ 18205 link_info_size += nla_total_size(sizeof(u8)); 18206 link_info_size += info->links[link].addr ? 18207 nla_total_size(ETH_ALEN) : 0; 18208 link_info_size += (info->links[link].bssid || 18209 info->links[link].bss) ? 18210 nla_total_size(ETH_ALEN) : 0; 18211 } 18212 } 18213 18214 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len + 18215 info->fils.kek_len + info->fils.pmk_len + 18216 (info->fils.pmkid ? WLAN_PMKID_LEN : 0) + 18217 link_info_size, gfp); 18218 if (!msg) 18219 return; 18220 18221 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM); 18222 if (!hdr) { 18223 nlmsg_free(msg); 18224 return; 18225 } 18226 18227 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 18228 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 18229 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, connected_addr) || 18230 (info->req_ie && 18231 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len, 18232 info->req_ie)) || 18233 (info->resp_ie && 18234 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len, 18235 info->resp_ie)) || 18236 (info->fils.update_erp_next_seq_num && 18237 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM, 18238 info->fils.erp_next_seq_num)) || 18239 (info->fils.kek && 18240 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len, 18241 info->fils.kek)) || 18242 (info->fils.pmk && 18243 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) || 18244 (info->fils.pmkid && 18245 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid))) 18246 goto nla_put_failure; 18247 18248 if (info->valid_links) { 18249 int i = 1; 18250 struct nlattr *nested; 18251 18252 nested = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 18253 if (!nested) 18254 goto nla_put_failure; 18255 18256 for_each_valid_link(info, link) { 18257 struct nlattr *nested_mlo_links; 18258 const u8 *bssid = info->links[link].bss ? 18259 info->links[link].bss->bssid : 18260 info->links[link].bssid; 18261 18262 nested_mlo_links = nla_nest_start(msg, i); 18263 if (!nested_mlo_links) 18264 goto nla_put_failure; 18265 18266 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link) || 18267 (bssid && 18268 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, bssid)) || 18269 (info->links[link].addr && 18270 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 18271 info->links[link].addr))) 18272 goto nla_put_failure; 18273 18274 nla_nest_end(msg, nested_mlo_links); 18275 i++; 18276 } 18277 nla_nest_end(msg, nested); 18278 } 18279 18280 genlmsg_end(msg, hdr); 18281 18282 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 18283 NL80211_MCGRP_MLME, gfp); 18284 return; 18285 18286 nla_put_failure: 18287 nlmsg_free(msg); 18288 } 18289 18290 void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev, 18291 struct net_device *netdev, const u8 *peer_addr, 18292 const u8 *td_bitmap, u8 td_bitmap_len) 18293 { 18294 struct sk_buff *msg; 18295 void *hdr; 18296 18297 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 18298 if (!msg) 18299 return; 18300 18301 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PORT_AUTHORIZED); 18302 if (!hdr) { 18303 nlmsg_free(msg); 18304 return; 18305 } 18306 18307 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 18308 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 18309 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer_addr)) 18310 goto nla_put_failure; 18311 18312 if ((td_bitmap_len > 0) && td_bitmap) 18313 if (nla_put(msg, NL80211_ATTR_TD_BITMAP, 18314 td_bitmap_len, td_bitmap)) 18315 goto nla_put_failure; 18316 18317 genlmsg_end(msg, hdr); 18318 18319 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 18320 NL80211_MCGRP_MLME, GFP_KERNEL); 18321 return; 18322 18323 nla_put_failure: 18324 nlmsg_free(msg); 18325 } 18326 18327 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev, 18328 struct net_device *netdev, u16 reason, 18329 const u8 *ie, size_t ie_len, bool from_ap) 18330 { 18331 struct sk_buff *msg; 18332 void *hdr; 18333 18334 msg = nlmsg_new(100 + ie_len, GFP_KERNEL); 18335 if (!msg) 18336 return; 18337 18338 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT); 18339 if (!hdr) { 18340 nlmsg_free(msg); 18341 return; 18342 } 18343 18344 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 18345 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 18346 (reason && 18347 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) || 18348 (from_ap && 18349 nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) || 18350 (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie))) 18351 goto nla_put_failure; 18352 18353 genlmsg_end(msg, hdr); 18354 18355 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 18356 NL80211_MCGRP_MLME, GFP_KERNEL); 18357 return; 18358 18359 nla_put_failure: 18360 nlmsg_free(msg); 18361 } 18362 18363 void cfg80211_links_removed(struct net_device *dev, u16 link_mask) 18364 { 18365 struct wireless_dev *wdev = dev->ieee80211_ptr; 18366 struct wiphy *wiphy = wdev->wiphy; 18367 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 18368 struct sk_buff *msg; 18369 struct nlattr *links; 18370 void *hdr; 18371 18372 lockdep_assert_wiphy(wdev->wiphy); 18373 trace_cfg80211_links_removed(dev, link_mask); 18374 18375 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION && 18376 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)) 18377 return; 18378 18379 if (WARN_ON(!wdev->valid_links || !link_mask || 18380 (wdev->valid_links & link_mask) != link_mask || 18381 wdev->valid_links == link_mask)) 18382 return; 18383 18384 cfg80211_wdev_release_link_bsses(wdev, link_mask); 18385 wdev->valid_links &= ~link_mask; 18386 18387 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 18388 if (!msg) 18389 return; 18390 18391 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_LINKS_REMOVED); 18392 if (!hdr) { 18393 nlmsg_free(msg); 18394 return; 18395 } 18396 18397 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 18398 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 18399 goto nla_put_failure; 18400 18401 links = nla_nest_start(msg, NL80211_ATTR_MLO_LINKS); 18402 if (!links) 18403 goto nla_put_failure; 18404 18405 while (link_mask) { 18406 struct nlattr *link; 18407 int link_id = __ffs(link_mask); 18408 18409 link = nla_nest_start(msg, link_id + 1); 18410 if (!link) 18411 goto nla_put_failure; 18412 18413 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 18414 goto nla_put_failure; 18415 18416 nla_nest_end(msg, link); 18417 link_mask &= ~(1 << link_id); 18418 } 18419 18420 nla_nest_end(msg, links); 18421 18422 genlmsg_end(msg, hdr); 18423 18424 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 18425 NL80211_MCGRP_MLME, GFP_KERNEL); 18426 return; 18427 18428 nla_put_failure: 18429 nlmsg_free(msg); 18430 } 18431 EXPORT_SYMBOL(cfg80211_links_removed); 18432 18433 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev, 18434 struct net_device *netdev, const u8 *bssid, 18435 gfp_t gfp) 18436 { 18437 struct sk_buff *msg; 18438 void *hdr; 18439 18440 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 18441 if (!msg) 18442 return; 18443 18444 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS); 18445 if (!hdr) { 18446 nlmsg_free(msg); 18447 return; 18448 } 18449 18450 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 18451 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 18452 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 18453 goto nla_put_failure; 18454 18455 genlmsg_end(msg, hdr); 18456 18457 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 18458 NL80211_MCGRP_MLME, gfp); 18459 return; 18460 18461 nla_put_failure: 18462 nlmsg_free(msg); 18463 } 18464 18465 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr, 18466 const u8 *ie, u8 ie_len, 18467 int sig_dbm, gfp_t gfp) 18468 { 18469 struct wireless_dev *wdev = dev->ieee80211_ptr; 18470 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 18471 struct sk_buff *msg; 18472 void *hdr; 18473 18474 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) 18475 return; 18476 18477 trace_cfg80211_notify_new_peer_candidate(dev, addr); 18478 18479 msg = nlmsg_new(100 + ie_len, gfp); 18480 if (!msg) 18481 return; 18482 18483 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE); 18484 if (!hdr) { 18485 nlmsg_free(msg); 18486 return; 18487 } 18488 18489 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 18490 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 18491 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 18492 (ie_len && ie && 18493 nla_put(msg, NL80211_ATTR_IE, ie_len, ie)) || 18494 (sig_dbm && 18495 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm))) 18496 goto nla_put_failure; 18497 18498 genlmsg_end(msg, hdr); 18499 18500 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 18501 NL80211_MCGRP_MLME, gfp); 18502 return; 18503 18504 nla_put_failure: 18505 nlmsg_free(msg); 18506 } 18507 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate); 18508 18509 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev, 18510 struct net_device *netdev, const u8 *addr, 18511 enum nl80211_key_type key_type, int key_id, 18512 const u8 *tsc, gfp_t gfp) 18513 { 18514 struct sk_buff *msg; 18515 void *hdr; 18516 18517 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 18518 if (!msg) 18519 return; 18520 18521 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE); 18522 if (!hdr) { 18523 nlmsg_free(msg); 18524 return; 18525 } 18526 18527 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 18528 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 18529 (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) || 18530 nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) || 18531 (key_id != -1 && 18532 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) || 18533 (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc))) 18534 goto nla_put_failure; 18535 18536 genlmsg_end(msg, hdr); 18537 18538 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 18539 NL80211_MCGRP_MLME, gfp); 18540 return; 18541 18542 nla_put_failure: 18543 nlmsg_free(msg); 18544 } 18545 18546 void nl80211_send_beacon_hint_event(struct wiphy *wiphy, 18547 struct ieee80211_channel *channel_before, 18548 struct ieee80211_channel *channel_after) 18549 { 18550 struct sk_buff *msg; 18551 void *hdr; 18552 struct nlattr *nl_freq; 18553 18554 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); 18555 if (!msg) 18556 return; 18557 18558 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT); 18559 if (!hdr) { 18560 nlmsg_free(msg); 18561 return; 18562 } 18563 18564 /* 18565 * Since we are applying the beacon hint to a wiphy we know its 18566 * wiphy_idx is valid 18567 */ 18568 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 18569 goto nla_put_failure; 18570 18571 /* Before */ 18572 nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_BEFORE); 18573 if (!nl_freq) 18574 goto nla_put_failure; 18575 18576 if (nl80211_msg_put_channel(msg, wiphy, channel_before, false)) 18577 goto nla_put_failure; 18578 nla_nest_end(msg, nl_freq); 18579 18580 /* After */ 18581 nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_AFTER); 18582 if (!nl_freq) 18583 goto nla_put_failure; 18584 18585 if (nl80211_msg_put_channel(msg, wiphy, channel_after, false)) 18586 goto nla_put_failure; 18587 nla_nest_end(msg, nl_freq); 18588 18589 genlmsg_end(msg, hdr); 18590 18591 rcu_read_lock(); 18592 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 18593 NL80211_MCGRP_REGULATORY, GFP_ATOMIC); 18594 rcu_read_unlock(); 18595 18596 return; 18597 18598 nla_put_failure: 18599 nlmsg_free(msg); 18600 } 18601 18602 static void nl80211_send_remain_on_chan_event( 18603 int cmd, struct cfg80211_registered_device *rdev, 18604 struct wireless_dev *wdev, u64 cookie, 18605 struct ieee80211_channel *chan, 18606 unsigned int duration, gfp_t gfp) 18607 { 18608 struct sk_buff *msg; 18609 void *hdr; 18610 18611 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 18612 if (!msg) 18613 return; 18614 18615 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 18616 if (!hdr) { 18617 nlmsg_free(msg); 18618 return; 18619 } 18620 18621 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 18622 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 18623 wdev->netdev->ifindex)) || 18624 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 18625 NL80211_ATTR_PAD) || 18626 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || 18627 nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 18628 NL80211_CHAN_NO_HT) || 18629 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 18630 NL80211_ATTR_PAD)) 18631 goto nla_put_failure; 18632 18633 if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL && 18634 nla_put_u32(msg, NL80211_ATTR_DURATION, duration)) 18635 goto nla_put_failure; 18636 18637 genlmsg_end(msg, hdr); 18638 18639 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 18640 NL80211_MCGRP_MLME, gfp); 18641 return; 18642 18643 nla_put_failure: 18644 nlmsg_free(msg); 18645 } 18646 18647 void cfg80211_assoc_comeback(struct net_device *netdev, 18648 const u8 *ap_addr, u32 timeout) 18649 { 18650 struct wireless_dev *wdev = netdev->ieee80211_ptr; 18651 struct wiphy *wiphy = wdev->wiphy; 18652 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 18653 struct sk_buff *msg; 18654 void *hdr; 18655 18656 trace_cfg80211_assoc_comeback(wdev, ap_addr, timeout); 18657 18658 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 18659 if (!msg) 18660 return; 18661 18662 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ASSOC_COMEBACK); 18663 if (!hdr) { 18664 nlmsg_free(msg); 18665 return; 18666 } 18667 18668 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 18669 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 18670 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ap_addr) || 18671 nla_put_u32(msg, NL80211_ATTR_TIMEOUT, timeout)) 18672 goto nla_put_failure; 18673 18674 genlmsg_end(msg, hdr); 18675 18676 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 18677 NL80211_MCGRP_MLME, GFP_KERNEL); 18678 return; 18679 18680 nla_put_failure: 18681 nlmsg_free(msg); 18682 } 18683 EXPORT_SYMBOL(cfg80211_assoc_comeback); 18684 18685 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie, 18686 struct ieee80211_channel *chan, 18687 unsigned int duration, gfp_t gfp) 18688 { 18689 struct wiphy *wiphy = wdev->wiphy; 18690 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 18691 18692 trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration); 18693 nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL, 18694 rdev, wdev, cookie, chan, 18695 duration, gfp); 18696 } 18697 EXPORT_SYMBOL(cfg80211_ready_on_channel); 18698 18699 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie, 18700 struct ieee80211_channel *chan, 18701 gfp_t gfp) 18702 { 18703 struct wiphy *wiphy = wdev->wiphy; 18704 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 18705 18706 trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan); 18707 nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 18708 rdev, wdev, cookie, chan, 0, gfp); 18709 } 18710 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired); 18711 18712 void cfg80211_tx_mgmt_expired(struct wireless_dev *wdev, u64 cookie, 18713 struct ieee80211_channel *chan, 18714 gfp_t gfp) 18715 { 18716 struct wiphy *wiphy = wdev->wiphy; 18717 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 18718 18719 trace_cfg80211_tx_mgmt_expired(wdev, cookie, chan); 18720 nl80211_send_remain_on_chan_event(NL80211_CMD_FRAME_WAIT_CANCEL, 18721 rdev, wdev, cookie, chan, 0, gfp); 18722 } 18723 EXPORT_SYMBOL(cfg80211_tx_mgmt_expired); 18724 18725 void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr, 18726 struct station_info *sinfo, gfp_t gfp) 18727 { 18728 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 18729 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 18730 struct sk_buff *msg; 18731 18732 trace_cfg80211_new_sta(dev, mac_addr, sinfo); 18733 18734 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 18735 if (!msg) 18736 return; 18737 18738 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 0, 0, 0, 18739 rdev, dev, mac_addr, sinfo) < 0) { 18740 nlmsg_free(msg); 18741 return; 18742 } 18743 18744 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 18745 NL80211_MCGRP_MLME, gfp); 18746 } 18747 EXPORT_SYMBOL(cfg80211_new_sta); 18748 18749 void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr, 18750 struct station_info *sinfo, gfp_t gfp) 18751 { 18752 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 18753 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 18754 struct sk_buff *msg; 18755 struct station_info empty_sinfo = {}; 18756 18757 if (!sinfo) 18758 sinfo = &empty_sinfo; 18759 18760 trace_cfg80211_del_sta(dev, mac_addr); 18761 18762 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 18763 if (!msg) { 18764 cfg80211_sinfo_release_content(sinfo); 18765 return; 18766 } 18767 18768 if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0, 18769 rdev, dev, mac_addr, sinfo) < 0) { 18770 nlmsg_free(msg); 18771 return; 18772 } 18773 18774 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 18775 NL80211_MCGRP_MLME, gfp); 18776 } 18777 EXPORT_SYMBOL(cfg80211_del_sta_sinfo); 18778 18779 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr, 18780 enum nl80211_connect_failed_reason reason, 18781 gfp_t gfp) 18782 { 18783 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 18784 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 18785 struct sk_buff *msg; 18786 void *hdr; 18787 18788 msg = nlmsg_new(NLMSG_GOODSIZE, gfp); 18789 if (!msg) 18790 return; 18791 18792 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED); 18793 if (!hdr) { 18794 nlmsg_free(msg); 18795 return; 18796 } 18797 18798 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 18799 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 18800 nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason)) 18801 goto nla_put_failure; 18802 18803 genlmsg_end(msg, hdr); 18804 18805 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 18806 NL80211_MCGRP_MLME, gfp); 18807 return; 18808 18809 nla_put_failure: 18810 nlmsg_free(msg); 18811 } 18812 EXPORT_SYMBOL(cfg80211_conn_failed); 18813 18814 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd, 18815 const u8 *addr, gfp_t gfp) 18816 { 18817 struct wireless_dev *wdev = dev->ieee80211_ptr; 18818 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 18819 struct sk_buff *msg; 18820 void *hdr; 18821 u32 nlportid = READ_ONCE(wdev->ap_unexpected_nlportid); 18822 18823 if (!nlportid) 18824 return false; 18825 18826 msg = nlmsg_new(100, gfp); 18827 if (!msg) 18828 return true; 18829 18830 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 18831 if (!hdr) { 18832 nlmsg_free(msg); 18833 return true; 18834 } 18835 18836 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 18837 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 18838 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) 18839 goto nla_put_failure; 18840 18841 genlmsg_end(msg, hdr); 18842 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 18843 return true; 18844 18845 nla_put_failure: 18846 nlmsg_free(msg); 18847 return true; 18848 } 18849 18850 bool cfg80211_rx_spurious_frame(struct net_device *dev, 18851 const u8 *addr, gfp_t gfp) 18852 { 18853 struct wireless_dev *wdev = dev->ieee80211_ptr; 18854 bool ret; 18855 18856 trace_cfg80211_rx_spurious_frame(dev, addr); 18857 18858 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 18859 wdev->iftype != NL80211_IFTYPE_P2P_GO)) { 18860 trace_cfg80211_return_bool(false); 18861 return false; 18862 } 18863 ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME, 18864 addr, gfp); 18865 trace_cfg80211_return_bool(ret); 18866 return ret; 18867 } 18868 EXPORT_SYMBOL(cfg80211_rx_spurious_frame); 18869 18870 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev, 18871 const u8 *addr, gfp_t gfp) 18872 { 18873 struct wireless_dev *wdev = dev->ieee80211_ptr; 18874 bool ret; 18875 18876 trace_cfg80211_rx_unexpected_4addr_frame(dev, addr); 18877 18878 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 18879 wdev->iftype != NL80211_IFTYPE_P2P_GO && 18880 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { 18881 trace_cfg80211_return_bool(false); 18882 return false; 18883 } 18884 ret = __nl80211_unexpected_frame(dev, 18885 NL80211_CMD_UNEXPECTED_4ADDR_FRAME, 18886 addr, gfp); 18887 trace_cfg80211_return_bool(ret); 18888 return ret; 18889 } 18890 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame); 18891 18892 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, 18893 struct wireless_dev *wdev, u32 nlportid, 18894 struct cfg80211_rx_info *info, gfp_t gfp) 18895 { 18896 struct net_device *netdev = wdev->netdev; 18897 struct sk_buff *msg; 18898 void *hdr; 18899 18900 msg = nlmsg_new(100 + info->len, gfp); 18901 if (!msg) 18902 return -ENOMEM; 18903 18904 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 18905 if (!hdr) { 18906 nlmsg_free(msg); 18907 return -ENOMEM; 18908 } 18909 18910 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 18911 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 18912 netdev->ifindex)) || 18913 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 18914 NL80211_ATTR_PAD) || 18915 (info->have_link_id && 18916 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, info->link_id)) || 18917 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, KHZ_TO_MHZ(info->freq)) || 18918 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, info->freq % 1000) || 18919 (info->sig_dbm && 18920 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, info->sig_dbm)) || 18921 nla_put(msg, NL80211_ATTR_FRAME, info->len, info->buf) || 18922 (info->flags && 18923 nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, info->flags)) || 18924 (info->rx_tstamp && nla_put_u64_64bit(msg, 18925 NL80211_ATTR_RX_HW_TIMESTAMP, 18926 info->rx_tstamp, 18927 NL80211_ATTR_PAD)) || 18928 (info->ack_tstamp && nla_put_u64_64bit(msg, 18929 NL80211_ATTR_TX_HW_TIMESTAMP, 18930 info->ack_tstamp, 18931 NL80211_ATTR_PAD))) 18932 goto nla_put_failure; 18933 18934 genlmsg_end(msg, hdr); 18935 18936 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 18937 18938 nla_put_failure: 18939 nlmsg_free(msg); 18940 return -ENOBUFS; 18941 } 18942 18943 static void nl80211_frame_tx_status(struct wireless_dev *wdev, 18944 struct cfg80211_tx_status *status, 18945 gfp_t gfp, enum nl80211_commands command) 18946 { 18947 struct wiphy *wiphy = wdev->wiphy; 18948 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 18949 struct net_device *netdev = wdev->netdev; 18950 struct sk_buff *msg; 18951 void *hdr; 18952 18953 if (command == NL80211_CMD_FRAME_TX_STATUS) 18954 trace_cfg80211_mgmt_tx_status(wdev, status->cookie, 18955 status->ack); 18956 else 18957 trace_cfg80211_control_port_tx_status(wdev, status->cookie, 18958 status->ack); 18959 18960 msg = nlmsg_new(100 + status->len, gfp); 18961 if (!msg) 18962 return; 18963 18964 hdr = nl80211hdr_put(msg, 0, 0, 0, command); 18965 if (!hdr) { 18966 nlmsg_free(msg); 18967 return; 18968 } 18969 18970 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 18971 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 18972 netdev->ifindex)) || 18973 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 18974 NL80211_ATTR_PAD) || 18975 nla_put(msg, NL80211_ATTR_FRAME, status->len, status->buf) || 18976 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, status->cookie, 18977 NL80211_ATTR_PAD) || 18978 (status->ack && nla_put_flag(msg, NL80211_ATTR_ACK)) || 18979 (status->tx_tstamp && 18980 nla_put_u64_64bit(msg, NL80211_ATTR_TX_HW_TIMESTAMP, 18981 status->tx_tstamp, NL80211_ATTR_PAD)) || 18982 (status->ack_tstamp && 18983 nla_put_u64_64bit(msg, NL80211_ATTR_RX_HW_TIMESTAMP, 18984 status->ack_tstamp, NL80211_ATTR_PAD))) 18985 goto nla_put_failure; 18986 18987 genlmsg_end(msg, hdr); 18988 18989 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 18990 NL80211_MCGRP_MLME, gfp); 18991 return; 18992 18993 nla_put_failure: 18994 nlmsg_free(msg); 18995 } 18996 18997 void cfg80211_control_port_tx_status(struct wireless_dev *wdev, u64 cookie, 18998 const u8 *buf, size_t len, bool ack, 18999 gfp_t gfp) 19000 { 19001 struct cfg80211_tx_status status = { 19002 .cookie = cookie, 19003 .buf = buf, 19004 .len = len, 19005 .ack = ack 19006 }; 19007 19008 nl80211_frame_tx_status(wdev, &status, gfp, 19009 NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS); 19010 } 19011 EXPORT_SYMBOL(cfg80211_control_port_tx_status); 19012 19013 void cfg80211_mgmt_tx_status_ext(struct wireless_dev *wdev, 19014 struct cfg80211_tx_status *status, gfp_t gfp) 19015 { 19016 nl80211_frame_tx_status(wdev, status, gfp, NL80211_CMD_FRAME_TX_STATUS); 19017 } 19018 EXPORT_SYMBOL(cfg80211_mgmt_tx_status_ext); 19019 19020 static int __nl80211_rx_control_port(struct net_device *dev, 19021 struct sk_buff *skb, 19022 bool unencrypted, 19023 int link_id, 19024 gfp_t gfp) 19025 { 19026 struct wireless_dev *wdev = dev->ieee80211_ptr; 19027 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 19028 struct ethhdr *ehdr = eth_hdr(skb); 19029 const u8 *addr = ehdr->h_source; 19030 u16 proto = be16_to_cpu(skb->protocol); 19031 struct sk_buff *msg; 19032 void *hdr; 19033 struct nlattr *frame; 19034 19035 u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); 19036 19037 if (!nlportid) 19038 return -ENOENT; 19039 19040 msg = nlmsg_new(100 + skb->len, gfp); 19041 if (!msg) 19042 return -ENOMEM; 19043 19044 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONTROL_PORT_FRAME); 19045 if (!hdr) { 19046 nlmsg_free(msg); 19047 return -ENOBUFS; 19048 } 19049 19050 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 19051 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 19052 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 19053 NL80211_ATTR_PAD) || 19054 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 19055 nla_put_u16(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE, proto) || 19056 (link_id >= 0 && 19057 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) || 19058 (unencrypted && nla_put_flag(msg, 19059 NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT))) 19060 goto nla_put_failure; 19061 19062 frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len); 19063 if (!frame) 19064 goto nla_put_failure; 19065 19066 skb_copy_bits(skb, 0, nla_data(frame), skb->len); 19067 genlmsg_end(msg, hdr); 19068 19069 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 19070 19071 nla_put_failure: 19072 nlmsg_free(msg); 19073 return -ENOBUFS; 19074 } 19075 19076 bool cfg80211_rx_control_port(struct net_device *dev, struct sk_buff *skb, 19077 bool unencrypted, int link_id) 19078 { 19079 int ret; 19080 19081 trace_cfg80211_rx_control_port(dev, skb, unencrypted, link_id); 19082 ret = __nl80211_rx_control_port(dev, skb, unencrypted, link_id, 19083 GFP_ATOMIC); 19084 trace_cfg80211_return_bool(ret == 0); 19085 return ret == 0; 19086 } 19087 EXPORT_SYMBOL(cfg80211_rx_control_port); 19088 19089 static struct sk_buff *cfg80211_prepare_cqm(struct net_device *dev, 19090 const char *mac, gfp_t gfp) 19091 { 19092 struct wireless_dev *wdev = dev->ieee80211_ptr; 19093 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 19094 struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 19095 void **cb; 19096 19097 if (!msg) 19098 return NULL; 19099 19100 cb = (void **)msg->cb; 19101 19102 cb[0] = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM); 19103 if (!cb[0]) { 19104 nlmsg_free(msg); 19105 return NULL; 19106 } 19107 19108 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 19109 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 19110 goto nla_put_failure; 19111 19112 if (mac && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac)) 19113 goto nla_put_failure; 19114 19115 cb[1] = nla_nest_start_noflag(msg, NL80211_ATTR_CQM); 19116 if (!cb[1]) 19117 goto nla_put_failure; 19118 19119 cb[2] = rdev; 19120 19121 return msg; 19122 nla_put_failure: 19123 nlmsg_free(msg); 19124 return NULL; 19125 } 19126 19127 static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp) 19128 { 19129 void **cb = (void **)msg->cb; 19130 struct cfg80211_registered_device *rdev = cb[2]; 19131 19132 nla_nest_end(msg, cb[1]); 19133 genlmsg_end(msg, cb[0]); 19134 19135 memset(msg->cb, 0, sizeof(msg->cb)); 19136 19137 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 19138 NL80211_MCGRP_MLME, gfp); 19139 } 19140 19141 void cfg80211_cqm_rssi_notify(struct net_device *dev, 19142 enum nl80211_cqm_rssi_threshold_event rssi_event, 19143 s32 rssi_level, gfp_t gfp) 19144 { 19145 struct wireless_dev *wdev = dev->ieee80211_ptr; 19146 struct cfg80211_cqm_config *cqm_config; 19147 19148 trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level); 19149 19150 if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW && 19151 rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH)) 19152 return; 19153 19154 rcu_read_lock(); 19155 cqm_config = rcu_dereference(wdev->cqm_config); 19156 if (cqm_config) { 19157 cqm_config->last_rssi_event_value = rssi_level; 19158 cqm_config->last_rssi_event_type = rssi_event; 19159 wiphy_work_queue(wdev->wiphy, &wdev->cqm_rssi_work); 19160 } 19161 rcu_read_unlock(); 19162 } 19163 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify); 19164 19165 void cfg80211_cqm_rssi_notify_work(struct wiphy *wiphy, struct wiphy_work *work) 19166 { 19167 struct wireless_dev *wdev = container_of(work, struct wireless_dev, 19168 cqm_rssi_work); 19169 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 19170 enum nl80211_cqm_rssi_threshold_event rssi_event; 19171 struct cfg80211_cqm_config *cqm_config; 19172 struct sk_buff *msg; 19173 s32 rssi_level; 19174 19175 cqm_config = wiphy_dereference(wdev->wiphy, wdev->cqm_config); 19176 if (!cqm_config) 19177 return; 19178 19179 if (cqm_config->use_range_api) 19180 cfg80211_cqm_rssi_update(rdev, wdev->netdev, cqm_config); 19181 19182 rssi_level = cqm_config->last_rssi_event_value; 19183 rssi_event = cqm_config->last_rssi_event_type; 19184 19185 msg = cfg80211_prepare_cqm(wdev->netdev, NULL, GFP_KERNEL); 19186 if (!msg) 19187 return; 19188 19189 if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT, 19190 rssi_event)) 19191 goto nla_put_failure; 19192 19193 if (rssi_level && nla_put_s32(msg, NL80211_ATTR_CQM_RSSI_LEVEL, 19194 rssi_level)) 19195 goto nla_put_failure; 19196 19197 cfg80211_send_cqm(msg, GFP_KERNEL); 19198 19199 return; 19200 19201 nla_put_failure: 19202 nlmsg_free(msg); 19203 } 19204 19205 void cfg80211_cqm_txe_notify(struct net_device *dev, 19206 const u8 *peer, u32 num_packets, 19207 u32 rate, u32 intvl, gfp_t gfp) 19208 { 19209 struct sk_buff *msg; 19210 19211 msg = cfg80211_prepare_cqm(dev, peer, gfp); 19212 if (!msg) 19213 return; 19214 19215 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets)) 19216 goto nla_put_failure; 19217 19218 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate)) 19219 goto nla_put_failure; 19220 19221 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl)) 19222 goto nla_put_failure; 19223 19224 cfg80211_send_cqm(msg, gfp); 19225 return; 19226 19227 nla_put_failure: 19228 nlmsg_free(msg); 19229 } 19230 EXPORT_SYMBOL(cfg80211_cqm_txe_notify); 19231 19232 void cfg80211_cqm_pktloss_notify(struct net_device *dev, 19233 const u8 *peer, u32 num_packets, gfp_t gfp) 19234 { 19235 struct sk_buff *msg; 19236 19237 trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets); 19238 19239 msg = cfg80211_prepare_cqm(dev, peer, gfp); 19240 if (!msg) 19241 return; 19242 19243 if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets)) 19244 goto nla_put_failure; 19245 19246 cfg80211_send_cqm(msg, gfp); 19247 return; 19248 19249 nla_put_failure: 19250 nlmsg_free(msg); 19251 } 19252 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify); 19253 19254 void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp) 19255 { 19256 struct sk_buff *msg; 19257 19258 msg = cfg80211_prepare_cqm(dev, NULL, gfp); 19259 if (!msg) 19260 return; 19261 19262 if (nla_put_flag(msg, NL80211_ATTR_CQM_BEACON_LOSS_EVENT)) 19263 goto nla_put_failure; 19264 19265 cfg80211_send_cqm(msg, gfp); 19266 return; 19267 19268 nla_put_failure: 19269 nlmsg_free(msg); 19270 } 19271 EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify); 19272 19273 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev, 19274 struct net_device *netdev, const u8 *bssid, 19275 const u8 *replay_ctr, gfp_t gfp) 19276 { 19277 struct sk_buff *msg; 19278 struct nlattr *rekey_attr; 19279 void *hdr; 19280 19281 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 19282 if (!msg) 19283 return; 19284 19285 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD); 19286 if (!hdr) { 19287 nlmsg_free(msg); 19288 return; 19289 } 19290 19291 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 19292 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 19293 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 19294 goto nla_put_failure; 19295 19296 rekey_attr = nla_nest_start_noflag(msg, NL80211_ATTR_REKEY_DATA); 19297 if (!rekey_attr) 19298 goto nla_put_failure; 19299 19300 if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR, 19301 NL80211_REPLAY_CTR_LEN, replay_ctr)) 19302 goto nla_put_failure; 19303 19304 nla_nest_end(msg, rekey_attr); 19305 19306 genlmsg_end(msg, hdr); 19307 19308 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 19309 NL80211_MCGRP_MLME, gfp); 19310 return; 19311 19312 nla_put_failure: 19313 nlmsg_free(msg); 19314 } 19315 19316 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid, 19317 const u8 *replay_ctr, gfp_t gfp) 19318 { 19319 struct wireless_dev *wdev = dev->ieee80211_ptr; 19320 struct wiphy *wiphy = wdev->wiphy; 19321 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 19322 19323 trace_cfg80211_gtk_rekey_notify(dev, bssid); 19324 nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp); 19325 } 19326 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify); 19327 19328 static void 19329 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev, 19330 struct net_device *netdev, int index, 19331 const u8 *bssid, bool preauth, gfp_t gfp) 19332 { 19333 struct sk_buff *msg; 19334 struct nlattr *attr; 19335 void *hdr; 19336 19337 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 19338 if (!msg) 19339 return; 19340 19341 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE); 19342 if (!hdr) { 19343 nlmsg_free(msg); 19344 return; 19345 } 19346 19347 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 19348 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 19349 goto nla_put_failure; 19350 19351 attr = nla_nest_start_noflag(msg, NL80211_ATTR_PMKSA_CANDIDATE); 19352 if (!attr) 19353 goto nla_put_failure; 19354 19355 if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) || 19356 nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) || 19357 (preauth && 19358 nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH))) 19359 goto nla_put_failure; 19360 19361 nla_nest_end(msg, attr); 19362 19363 genlmsg_end(msg, hdr); 19364 19365 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 19366 NL80211_MCGRP_MLME, gfp); 19367 return; 19368 19369 nla_put_failure: 19370 nlmsg_free(msg); 19371 } 19372 19373 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index, 19374 const u8 *bssid, bool preauth, gfp_t gfp) 19375 { 19376 struct wireless_dev *wdev = dev->ieee80211_ptr; 19377 struct wiphy *wiphy = wdev->wiphy; 19378 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 19379 19380 trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth); 19381 nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp); 19382 } 19383 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify); 19384 19385 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev, 19386 struct net_device *netdev, 19387 unsigned int link_id, 19388 struct cfg80211_chan_def *chandef, 19389 gfp_t gfp, 19390 enum nl80211_commands notif, 19391 u8 count, bool quiet, u16 punct_bitmap) 19392 { 19393 struct wireless_dev *wdev = netdev->ieee80211_ptr; 19394 struct sk_buff *msg; 19395 void *hdr; 19396 19397 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 19398 if (!msg) 19399 return; 19400 19401 hdr = nl80211hdr_put(msg, 0, 0, 0, notif); 19402 if (!hdr) { 19403 nlmsg_free(msg); 19404 return; 19405 } 19406 19407 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 19408 goto nla_put_failure; 19409 19410 if (wdev->valid_links && 19411 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id)) 19412 goto nla_put_failure; 19413 19414 if (nl80211_send_chandef(msg, chandef)) 19415 goto nla_put_failure; 19416 19417 if (notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) { 19418 if (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count)) 19419 goto nla_put_failure; 19420 if (quiet && 19421 nla_put_flag(msg, NL80211_ATTR_CH_SWITCH_BLOCK_TX)) 19422 goto nla_put_failure; 19423 } 19424 19425 if (nla_put_u32(msg, NL80211_ATTR_PUNCT_BITMAP, punct_bitmap)) 19426 goto nla_put_failure; 19427 19428 genlmsg_end(msg, hdr); 19429 19430 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 19431 NL80211_MCGRP_MLME, gfp); 19432 return; 19433 19434 nla_put_failure: 19435 nlmsg_free(msg); 19436 } 19437 19438 void cfg80211_ch_switch_notify(struct net_device *dev, 19439 struct cfg80211_chan_def *chandef, 19440 unsigned int link_id, u16 punct_bitmap) 19441 { 19442 struct wireless_dev *wdev = dev->ieee80211_ptr; 19443 struct wiphy *wiphy = wdev->wiphy; 19444 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 19445 19446 lockdep_assert_wiphy(wdev->wiphy); 19447 WARN_INVALID_LINK_ID(wdev, link_id); 19448 19449 trace_cfg80211_ch_switch_notify(dev, chandef, link_id, punct_bitmap); 19450 19451 switch (wdev->iftype) { 19452 case NL80211_IFTYPE_STATION: 19453 case NL80211_IFTYPE_P2P_CLIENT: 19454 if (!WARN_ON(!wdev->links[link_id].client.current_bss)) 19455 cfg80211_update_assoc_bss_entry(wdev, link_id, 19456 chandef->chan); 19457 break; 19458 case NL80211_IFTYPE_MESH_POINT: 19459 wdev->u.mesh.chandef = *chandef; 19460 wdev->u.mesh.preset_chandef = *chandef; 19461 break; 19462 case NL80211_IFTYPE_AP: 19463 case NL80211_IFTYPE_P2P_GO: 19464 wdev->links[link_id].ap.chandef = *chandef; 19465 break; 19466 case NL80211_IFTYPE_ADHOC: 19467 wdev->u.ibss.chandef = *chandef; 19468 break; 19469 default: 19470 WARN_ON(1); 19471 break; 19472 } 19473 19474 cfg80211_sched_dfs_chan_update(rdev); 19475 19476 nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL, 19477 NL80211_CMD_CH_SWITCH_NOTIFY, 0, false, 19478 punct_bitmap); 19479 } 19480 EXPORT_SYMBOL(cfg80211_ch_switch_notify); 19481 19482 void cfg80211_ch_switch_started_notify(struct net_device *dev, 19483 struct cfg80211_chan_def *chandef, 19484 unsigned int link_id, u8 count, 19485 bool quiet, u16 punct_bitmap) 19486 { 19487 struct wireless_dev *wdev = dev->ieee80211_ptr; 19488 struct wiphy *wiphy = wdev->wiphy; 19489 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 19490 19491 lockdep_assert_wiphy(wdev->wiphy); 19492 WARN_INVALID_LINK_ID(wdev, link_id); 19493 19494 trace_cfg80211_ch_switch_started_notify(dev, chandef, link_id, 19495 punct_bitmap); 19496 19497 19498 nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL, 19499 NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, 19500 count, quiet, punct_bitmap); 19501 } 19502 EXPORT_SYMBOL(cfg80211_ch_switch_started_notify); 19503 19504 int cfg80211_bss_color_notify(struct net_device *dev, 19505 enum nl80211_commands cmd, u8 count, 19506 u64 color_bitmap) 19507 { 19508 struct wireless_dev *wdev = dev->ieee80211_ptr; 19509 struct wiphy *wiphy = wdev->wiphy; 19510 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 19511 struct sk_buff *msg; 19512 void *hdr; 19513 19514 lockdep_assert_wiphy(wdev->wiphy); 19515 19516 trace_cfg80211_bss_color_notify(dev, cmd, count, color_bitmap); 19517 19518 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 19519 if (!msg) 19520 return -ENOMEM; 19521 19522 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 19523 if (!hdr) 19524 goto nla_put_failure; 19525 19526 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 19527 goto nla_put_failure; 19528 19529 if (cmd == NL80211_CMD_COLOR_CHANGE_STARTED && 19530 nla_put_u32(msg, NL80211_ATTR_COLOR_CHANGE_COUNT, count)) 19531 goto nla_put_failure; 19532 19533 if (cmd == NL80211_CMD_OBSS_COLOR_COLLISION && 19534 nla_put_u64_64bit(msg, NL80211_ATTR_OBSS_COLOR_BITMAP, 19535 color_bitmap, NL80211_ATTR_PAD)) 19536 goto nla_put_failure; 19537 19538 genlmsg_end(msg, hdr); 19539 19540 return genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 19541 msg, 0, NL80211_MCGRP_MLME, GFP_KERNEL); 19542 19543 nla_put_failure: 19544 nlmsg_free(msg); 19545 return -EINVAL; 19546 } 19547 EXPORT_SYMBOL(cfg80211_bss_color_notify); 19548 19549 void 19550 nl80211_radar_notify(struct cfg80211_registered_device *rdev, 19551 const struct cfg80211_chan_def *chandef, 19552 enum nl80211_radar_event event, 19553 struct net_device *netdev, gfp_t gfp) 19554 { 19555 struct sk_buff *msg; 19556 void *hdr; 19557 19558 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 19559 if (!msg) 19560 return; 19561 19562 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT); 19563 if (!hdr) { 19564 nlmsg_free(msg); 19565 return; 19566 } 19567 19568 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 19569 goto nla_put_failure; 19570 19571 /* NOP and radar events don't need a netdev parameter */ 19572 if (netdev) { 19573 struct wireless_dev *wdev = netdev->ieee80211_ptr; 19574 19575 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 19576 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 19577 NL80211_ATTR_PAD)) 19578 goto nla_put_failure; 19579 } 19580 19581 if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event)) 19582 goto nla_put_failure; 19583 19584 if (nl80211_send_chandef(msg, chandef)) 19585 goto nla_put_failure; 19586 19587 genlmsg_end(msg, hdr); 19588 19589 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 19590 NL80211_MCGRP_MLME, gfp); 19591 return; 19592 19593 nla_put_failure: 19594 nlmsg_free(msg); 19595 } 19596 19597 void cfg80211_sta_opmode_change_notify(struct net_device *dev, const u8 *mac, 19598 struct sta_opmode_info *sta_opmode, 19599 gfp_t gfp) 19600 { 19601 struct sk_buff *msg; 19602 struct wireless_dev *wdev = dev->ieee80211_ptr; 19603 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 19604 void *hdr; 19605 19606 if (WARN_ON(!mac)) 19607 return; 19608 19609 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 19610 if (!msg) 19611 return; 19612 19613 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STA_OPMODE_CHANGED); 19614 if (!hdr) { 19615 nlmsg_free(msg); 19616 return; 19617 } 19618 19619 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 19620 goto nla_put_failure; 19621 19622 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 19623 goto nla_put_failure; 19624 19625 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac)) 19626 goto nla_put_failure; 19627 19628 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) && 19629 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode)) 19630 goto nla_put_failure; 19631 19632 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && 19633 nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) 19634 goto nla_put_failure; 19635 19636 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && 19637 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss)) 19638 goto nla_put_failure; 19639 19640 genlmsg_end(msg, hdr); 19641 19642 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 19643 NL80211_MCGRP_MLME, gfp); 19644 19645 return; 19646 19647 nla_put_failure: 19648 nlmsg_free(msg); 19649 } 19650 EXPORT_SYMBOL(cfg80211_sta_opmode_change_notify); 19651 19652 void cfg80211_probe_status(struct net_device *dev, const u8 *addr, 19653 u64 cookie, bool acked, s32 ack_signal, 19654 bool is_valid_ack_signal, gfp_t gfp) 19655 { 19656 struct wireless_dev *wdev = dev->ieee80211_ptr; 19657 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 19658 struct sk_buff *msg; 19659 void *hdr; 19660 19661 trace_cfg80211_probe_status(dev, addr, cookie, acked); 19662 19663 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 19664 19665 if (!msg) 19666 return; 19667 19668 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_CLIENT); 19669 if (!hdr) { 19670 nlmsg_free(msg); 19671 return; 19672 } 19673 19674 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 19675 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 19676 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 19677 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 19678 NL80211_ATTR_PAD) || 19679 (acked && nla_put_flag(msg, NL80211_ATTR_ACK)) || 19680 (is_valid_ack_signal && nla_put_s32(msg, NL80211_ATTR_ACK_SIGNAL, 19681 ack_signal))) 19682 goto nla_put_failure; 19683 19684 genlmsg_end(msg, hdr); 19685 19686 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 19687 NL80211_MCGRP_MLME, gfp); 19688 return; 19689 19690 nla_put_failure: 19691 nlmsg_free(msg); 19692 } 19693 EXPORT_SYMBOL(cfg80211_probe_status); 19694 19695 void cfg80211_report_obss_beacon_khz(struct wiphy *wiphy, const u8 *frame, 19696 size_t len, int freq, int sig_dbm) 19697 { 19698 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 19699 struct sk_buff *msg; 19700 void *hdr; 19701 struct cfg80211_beacon_registration *reg; 19702 19703 trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm); 19704 19705 spin_lock_bh(&rdev->beacon_registrations_lock); 19706 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 19707 msg = nlmsg_new(len + 100, GFP_ATOMIC); 19708 if (!msg) { 19709 spin_unlock_bh(&rdev->beacon_registrations_lock); 19710 return; 19711 } 19712 19713 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 19714 if (!hdr) 19715 goto nla_put_failure; 19716 19717 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 19718 (freq && 19719 (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, 19720 KHZ_TO_MHZ(freq)) || 19721 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, 19722 freq % 1000))) || 19723 (sig_dbm && 19724 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) || 19725 nla_put(msg, NL80211_ATTR_FRAME, len, frame)) 19726 goto nla_put_failure; 19727 19728 genlmsg_end(msg, hdr); 19729 19730 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); 19731 } 19732 spin_unlock_bh(&rdev->beacon_registrations_lock); 19733 return; 19734 19735 nla_put_failure: 19736 spin_unlock_bh(&rdev->beacon_registrations_lock); 19737 nlmsg_free(msg); 19738 } 19739 EXPORT_SYMBOL(cfg80211_report_obss_beacon_khz); 19740 19741 #ifdef CONFIG_PM 19742 static int cfg80211_net_detect_results(struct sk_buff *msg, 19743 struct cfg80211_wowlan_wakeup *wakeup) 19744 { 19745 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect; 19746 struct nlattr *nl_results, *nl_match, *nl_freqs; 19747 int i, j; 19748 19749 nl_results = nla_nest_start_noflag(msg, 19750 NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS); 19751 if (!nl_results) 19752 return -EMSGSIZE; 19753 19754 for (i = 0; i < nd->n_matches; i++) { 19755 struct cfg80211_wowlan_nd_match *match = nd->matches[i]; 19756 19757 nl_match = nla_nest_start_noflag(msg, i); 19758 if (!nl_match) 19759 break; 19760 19761 /* The SSID attribute is optional in nl80211, but for 19762 * simplicity reasons it's always present in the 19763 * cfg80211 structure. If a driver can't pass the 19764 * SSID, that needs to be changed. A zero length SSID 19765 * is still a valid SSID (wildcard), so it cannot be 19766 * used for this purpose. 19767 */ 19768 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len, 19769 match->ssid.ssid)) { 19770 nla_nest_cancel(msg, nl_match); 19771 goto out; 19772 } 19773 19774 if (match->n_channels) { 19775 nl_freqs = nla_nest_start_noflag(msg, 19776 NL80211_ATTR_SCAN_FREQUENCIES); 19777 if (!nl_freqs) { 19778 nla_nest_cancel(msg, nl_match); 19779 goto out; 19780 } 19781 19782 for (j = 0; j < match->n_channels; j++) { 19783 if (nla_put_u32(msg, j, match->channels[j])) { 19784 nla_nest_cancel(msg, nl_freqs); 19785 nla_nest_cancel(msg, nl_match); 19786 goto out; 19787 } 19788 } 19789 19790 nla_nest_end(msg, nl_freqs); 19791 } 19792 19793 nla_nest_end(msg, nl_match); 19794 } 19795 19796 out: 19797 nla_nest_end(msg, nl_results); 19798 return 0; 19799 } 19800 19801 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev, 19802 struct cfg80211_wowlan_wakeup *wakeup, 19803 gfp_t gfp) 19804 { 19805 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 19806 struct sk_buff *msg; 19807 void *hdr; 19808 int size = 200; 19809 19810 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); 19811 19812 if (wakeup) 19813 size += wakeup->packet_present_len; 19814 19815 msg = nlmsg_new(size, gfp); 19816 if (!msg) 19817 return; 19818 19819 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN); 19820 if (!hdr) 19821 goto free_msg; 19822 19823 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 19824 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 19825 NL80211_ATTR_PAD)) 19826 goto free_msg; 19827 19828 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 19829 wdev->netdev->ifindex)) 19830 goto free_msg; 19831 19832 if (wakeup) { 19833 struct nlattr *reasons; 19834 19835 reasons = nla_nest_start_noflag(msg, 19836 NL80211_ATTR_WOWLAN_TRIGGERS); 19837 if (!reasons) 19838 goto free_msg; 19839 19840 if (wakeup->disconnect && 19841 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) 19842 goto free_msg; 19843 if (wakeup->magic_pkt && 19844 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) 19845 goto free_msg; 19846 if (wakeup->gtk_rekey_failure && 19847 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) 19848 goto free_msg; 19849 if (wakeup->eap_identity_req && 19850 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) 19851 goto free_msg; 19852 if (wakeup->four_way_handshake && 19853 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) 19854 goto free_msg; 19855 if (wakeup->rfkill_release && 19856 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)) 19857 goto free_msg; 19858 19859 if (wakeup->pattern_idx >= 0 && 19860 nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN, 19861 wakeup->pattern_idx)) 19862 goto free_msg; 19863 19864 if (wakeup->tcp_match && 19865 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH)) 19866 goto free_msg; 19867 19868 if (wakeup->tcp_connlost && 19869 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST)) 19870 goto free_msg; 19871 19872 if (wakeup->tcp_nomoretokens && 19873 nla_put_flag(msg, 19874 NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS)) 19875 goto free_msg; 19876 19877 if (wakeup->packet) { 19878 u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211; 19879 u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN; 19880 19881 if (!wakeup->packet_80211) { 19882 pkt_attr = 19883 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023; 19884 len_attr = 19885 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN; 19886 } 19887 19888 if (wakeup->packet_len && 19889 nla_put_u32(msg, len_attr, wakeup->packet_len)) 19890 goto free_msg; 19891 19892 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, 19893 wakeup->packet)) 19894 goto free_msg; 19895 } 19896 19897 if (wakeup->net_detect && 19898 cfg80211_net_detect_results(msg, wakeup)) 19899 goto free_msg; 19900 19901 nla_nest_end(msg, reasons); 19902 } 19903 19904 genlmsg_end(msg, hdr); 19905 19906 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 19907 NL80211_MCGRP_MLME, gfp); 19908 return; 19909 19910 free_msg: 19911 nlmsg_free(msg); 19912 } 19913 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup); 19914 #endif 19915 19916 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer, 19917 enum nl80211_tdls_operation oper, 19918 u16 reason_code, gfp_t gfp) 19919 { 19920 struct wireless_dev *wdev = dev->ieee80211_ptr; 19921 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 19922 struct sk_buff *msg; 19923 void *hdr; 19924 19925 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, 19926 reason_code); 19927 19928 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 19929 if (!msg) 19930 return; 19931 19932 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER); 19933 if (!hdr) { 19934 nlmsg_free(msg); 19935 return; 19936 } 19937 19938 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 19939 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 19940 nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) || 19941 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) || 19942 (reason_code > 0 && 19943 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code))) 19944 goto nla_put_failure; 19945 19946 genlmsg_end(msg, hdr); 19947 19948 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 19949 NL80211_MCGRP_MLME, gfp); 19950 return; 19951 19952 nla_put_failure: 19953 nlmsg_free(msg); 19954 } 19955 EXPORT_SYMBOL(cfg80211_tdls_oper_request); 19956 19957 static int nl80211_netlink_notify(struct notifier_block * nb, 19958 unsigned long state, 19959 void *_notify) 19960 { 19961 struct netlink_notify *notify = _notify; 19962 struct cfg80211_registered_device *rdev; 19963 struct wireless_dev *wdev; 19964 struct cfg80211_beacon_registration *reg, *tmp; 19965 19966 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC) 19967 return NOTIFY_DONE; 19968 19969 rcu_read_lock(); 19970 19971 list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) { 19972 struct cfg80211_sched_scan_request *sched_scan_req; 19973 19974 list_for_each_entry_rcu(sched_scan_req, 19975 &rdev->sched_scan_req_list, 19976 list) { 19977 if (sched_scan_req->owner_nlportid == notify->portid) { 19978 sched_scan_req->nl_owner_dead = true; 19979 wiphy_work_queue(&rdev->wiphy, 19980 &rdev->sched_scan_stop_wk); 19981 } 19982 } 19983 19984 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) { 19985 cfg80211_mlme_unregister_socket(wdev, notify->portid); 19986 19987 if (wdev->owner_nlportid == notify->portid) { 19988 wdev->nl_owner_dead = true; 19989 schedule_work(&rdev->destroy_work); 19990 } else if (wdev->conn_owner_nlportid == notify->portid) { 19991 schedule_work(&wdev->disconnect_wk); 19992 } 19993 19994 cfg80211_release_pmsr(wdev, notify->portid); 19995 } 19996 19997 spin_lock_bh(&rdev->beacon_registrations_lock); 19998 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, 19999 list) { 20000 if (reg->nlportid == notify->portid) { 20001 list_del(®->list); 20002 kfree(reg); 20003 break; 20004 } 20005 } 20006 spin_unlock_bh(&rdev->beacon_registrations_lock); 20007 } 20008 20009 rcu_read_unlock(); 20010 20011 /* 20012 * It is possible that the user space process that is controlling the 20013 * indoor setting disappeared, so notify the regulatory core. 20014 */ 20015 regulatory_netlink_notify(notify->portid); 20016 return NOTIFY_OK; 20017 } 20018 20019 static struct notifier_block nl80211_netlink_notifier = { 20020 .notifier_call = nl80211_netlink_notify, 20021 }; 20022 20023 void cfg80211_ft_event(struct net_device *netdev, 20024 struct cfg80211_ft_event_params *ft_event) 20025 { 20026 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; 20027 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 20028 struct sk_buff *msg; 20029 void *hdr; 20030 20031 trace_cfg80211_ft_event(wiphy, netdev, ft_event); 20032 20033 if (!ft_event->target_ap) 20034 return; 20035 20036 msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len, 20037 GFP_KERNEL); 20038 if (!msg) 20039 return; 20040 20041 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT); 20042 if (!hdr) 20043 goto out; 20044 20045 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20046 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 20047 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) 20048 goto out; 20049 20050 if (ft_event->ies && 20051 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) 20052 goto out; 20053 if (ft_event->ric_ies && 20054 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, 20055 ft_event->ric_ies)) 20056 goto out; 20057 20058 genlmsg_end(msg, hdr); 20059 20060 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20061 NL80211_MCGRP_MLME, GFP_KERNEL); 20062 return; 20063 out: 20064 nlmsg_free(msg); 20065 } 20066 EXPORT_SYMBOL(cfg80211_ft_event); 20067 20068 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp) 20069 { 20070 struct cfg80211_registered_device *rdev; 20071 struct sk_buff *msg; 20072 void *hdr; 20073 u32 nlportid; 20074 20075 rdev = wiphy_to_rdev(wdev->wiphy); 20076 if (!rdev->crit_proto_nlportid) 20077 return; 20078 20079 nlportid = rdev->crit_proto_nlportid; 20080 rdev->crit_proto_nlportid = 0; 20081 20082 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 20083 if (!msg) 20084 return; 20085 20086 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP); 20087 if (!hdr) 20088 goto nla_put_failure; 20089 20090 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20091 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 20092 NL80211_ATTR_PAD)) 20093 goto nla_put_failure; 20094 20095 genlmsg_end(msg, hdr); 20096 20097 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 20098 return; 20099 20100 nla_put_failure: 20101 nlmsg_free(msg); 20102 } 20103 EXPORT_SYMBOL(cfg80211_crit_proto_stopped); 20104 20105 void nl80211_send_ap_stopped(struct wireless_dev *wdev, unsigned int link_id) 20106 { 20107 struct wiphy *wiphy = wdev->wiphy; 20108 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 20109 struct sk_buff *msg; 20110 void *hdr; 20111 20112 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 20113 if (!msg) 20114 return; 20115 20116 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP); 20117 if (!hdr) 20118 goto out; 20119 20120 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20121 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || 20122 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 20123 NL80211_ATTR_PAD) || 20124 (wdev->valid_links && 20125 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))) 20126 goto out; 20127 20128 genlmsg_end(msg, hdr); 20129 20130 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0, 20131 NL80211_MCGRP_MLME, GFP_KERNEL); 20132 return; 20133 out: 20134 nlmsg_free(msg); 20135 } 20136 20137 int cfg80211_external_auth_request(struct net_device *dev, 20138 struct cfg80211_external_auth_params *params, 20139 gfp_t gfp) 20140 { 20141 struct wireless_dev *wdev = dev->ieee80211_ptr; 20142 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 20143 struct sk_buff *msg; 20144 void *hdr; 20145 20146 if (!wdev->conn_owner_nlportid) 20147 return -EINVAL; 20148 20149 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 20150 if (!msg) 20151 return -ENOMEM; 20152 20153 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EXTERNAL_AUTH); 20154 if (!hdr) 20155 goto nla_put_failure; 20156 20157 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20158 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 20159 nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, params->key_mgmt_suite) || 20160 nla_put_u32(msg, NL80211_ATTR_EXTERNAL_AUTH_ACTION, 20161 params->action) || 20162 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) || 20163 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len, 20164 params->ssid.ssid) || 20165 (!is_zero_ether_addr(params->mld_addr) && 20166 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, params->mld_addr))) 20167 goto nla_put_failure; 20168 20169 genlmsg_end(msg, hdr); 20170 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 20171 wdev->conn_owner_nlportid); 20172 return 0; 20173 20174 nla_put_failure: 20175 nlmsg_free(msg); 20176 return -ENOBUFS; 20177 } 20178 EXPORT_SYMBOL(cfg80211_external_auth_request); 20179 20180 void cfg80211_update_owe_info_event(struct net_device *netdev, 20181 struct cfg80211_update_owe_info *owe_info, 20182 gfp_t gfp) 20183 { 20184 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; 20185 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 20186 struct sk_buff *msg; 20187 void *hdr; 20188 20189 trace_cfg80211_update_owe_info_event(wiphy, netdev, owe_info); 20190 20191 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 20192 if (!msg) 20193 return; 20194 20195 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_UPDATE_OWE_INFO); 20196 if (!hdr) 20197 goto nla_put_failure; 20198 20199 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 20200 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 20201 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer)) 20202 goto nla_put_failure; 20203 20204 if (!owe_info->ie_len || 20205 nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie)) 20206 goto nla_put_failure; 20207 20208 if (owe_info->assoc_link_id != -1) { 20209 if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, 20210 owe_info->assoc_link_id)) 20211 goto nla_put_failure; 20212 20213 if (!is_zero_ether_addr(owe_info->peer_mld_addr) && 20214 nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, 20215 owe_info->peer_mld_addr)) 20216 goto nla_put_failure; 20217 } 20218 20219 genlmsg_end(msg, hdr); 20220 20221 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 20222 NL80211_MCGRP_MLME, gfp); 20223 return; 20224 20225 nla_put_failure: 20226 genlmsg_cancel(msg, hdr); 20227 nlmsg_free(msg); 20228 } 20229 EXPORT_SYMBOL(cfg80211_update_owe_info_event); 20230 20231 /* initialisation/exit functions */ 20232 20233 int __init nl80211_init(void) 20234 { 20235 int err; 20236 20237 err = genl_register_family(&nl80211_fam); 20238 if (err) 20239 return err; 20240 20241 err = netlink_register_notifier(&nl80211_netlink_notifier); 20242 if (err) 20243 goto err_out; 20244 20245 return 0; 20246 err_out: 20247 genl_unregister_family(&nl80211_fam); 20248 return err; 20249 } 20250 20251 void nl80211_exit(void) 20252 { 20253 netlink_unregister_notifier(&nl80211_netlink_notifier); 20254 genl_unregister_family(&nl80211_fam); 20255 } 20256