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-2019 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 <net/net_namespace.h> 24 #include <net/genetlink.h> 25 #include <net/cfg80211.h> 26 #include <net/sock.h> 27 #include <net/inet_connection_sock.h> 28 #include "core.h" 29 #include "nl80211.h" 30 #include "reg.h" 31 #include "rdev-ops.h" 32 33 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, 34 struct genl_info *info, 35 struct cfg80211_crypto_settings *settings, 36 int cipher_limit); 37 38 /* the netlink family */ 39 static struct genl_family nl80211_fam; 40 41 /* multicast groups */ 42 enum nl80211_multicast_groups { 43 NL80211_MCGRP_CONFIG, 44 NL80211_MCGRP_SCAN, 45 NL80211_MCGRP_REGULATORY, 46 NL80211_MCGRP_MLME, 47 NL80211_MCGRP_VENDOR, 48 NL80211_MCGRP_NAN, 49 NL80211_MCGRP_TESTMODE /* keep last - ifdef! */ 50 }; 51 52 static const struct genl_multicast_group nl80211_mcgrps[] = { 53 [NL80211_MCGRP_CONFIG] = { .name = NL80211_MULTICAST_GROUP_CONFIG }, 54 [NL80211_MCGRP_SCAN] = { .name = NL80211_MULTICAST_GROUP_SCAN }, 55 [NL80211_MCGRP_REGULATORY] = { .name = NL80211_MULTICAST_GROUP_REG }, 56 [NL80211_MCGRP_MLME] = { .name = NL80211_MULTICAST_GROUP_MLME }, 57 [NL80211_MCGRP_VENDOR] = { .name = NL80211_MULTICAST_GROUP_VENDOR }, 58 [NL80211_MCGRP_NAN] = { .name = NL80211_MULTICAST_GROUP_NAN }, 59 #ifdef CONFIG_NL80211_TESTMODE 60 [NL80211_MCGRP_TESTMODE] = { .name = NL80211_MULTICAST_GROUP_TESTMODE } 61 #endif 62 }; 63 64 /* returns ERR_PTR values */ 65 static struct wireless_dev * 66 __cfg80211_wdev_from_attrs(struct net *netns, struct nlattr **attrs) 67 { 68 struct cfg80211_registered_device *rdev; 69 struct wireless_dev *result = NULL; 70 bool have_ifidx = attrs[NL80211_ATTR_IFINDEX]; 71 bool have_wdev_id = attrs[NL80211_ATTR_WDEV]; 72 u64 wdev_id; 73 int wiphy_idx = -1; 74 int ifidx = -1; 75 76 ASSERT_RTNL(); 77 78 if (!have_ifidx && !have_wdev_id) 79 return ERR_PTR(-EINVAL); 80 81 if (have_ifidx) 82 ifidx = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]); 83 if (have_wdev_id) { 84 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]); 85 wiphy_idx = wdev_id >> 32; 86 } 87 88 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 89 struct wireless_dev *wdev; 90 91 if (wiphy_net(&rdev->wiphy) != netns) 92 continue; 93 94 if (have_wdev_id && rdev->wiphy_idx != wiphy_idx) 95 continue; 96 97 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 98 if (have_ifidx && wdev->netdev && 99 wdev->netdev->ifindex == ifidx) { 100 result = wdev; 101 break; 102 } 103 if (have_wdev_id && wdev->identifier == (u32)wdev_id) { 104 result = wdev; 105 break; 106 } 107 } 108 109 if (result) 110 break; 111 } 112 113 if (result) 114 return result; 115 return ERR_PTR(-ENODEV); 116 } 117 118 static struct cfg80211_registered_device * 119 __cfg80211_rdev_from_attrs(struct net *netns, struct nlattr **attrs) 120 { 121 struct cfg80211_registered_device *rdev = NULL, *tmp; 122 struct net_device *netdev; 123 124 ASSERT_RTNL(); 125 126 if (!attrs[NL80211_ATTR_WIPHY] && 127 !attrs[NL80211_ATTR_IFINDEX] && 128 !attrs[NL80211_ATTR_WDEV]) 129 return ERR_PTR(-EINVAL); 130 131 if (attrs[NL80211_ATTR_WIPHY]) 132 rdev = cfg80211_rdev_by_wiphy_idx( 133 nla_get_u32(attrs[NL80211_ATTR_WIPHY])); 134 135 if (attrs[NL80211_ATTR_WDEV]) { 136 u64 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]); 137 struct wireless_dev *wdev; 138 bool found = false; 139 140 tmp = cfg80211_rdev_by_wiphy_idx(wdev_id >> 32); 141 if (tmp) { 142 /* make sure wdev exists */ 143 list_for_each_entry(wdev, &tmp->wiphy.wdev_list, list) { 144 if (wdev->identifier != (u32)wdev_id) 145 continue; 146 found = true; 147 break; 148 } 149 150 if (!found) 151 tmp = NULL; 152 153 if (rdev && tmp != rdev) 154 return ERR_PTR(-EINVAL); 155 rdev = tmp; 156 } 157 } 158 159 if (attrs[NL80211_ATTR_IFINDEX]) { 160 int ifindex = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]); 161 162 netdev = __dev_get_by_index(netns, ifindex); 163 if (netdev) { 164 if (netdev->ieee80211_ptr) 165 tmp = wiphy_to_rdev( 166 netdev->ieee80211_ptr->wiphy); 167 else 168 tmp = NULL; 169 170 /* not wireless device -- return error */ 171 if (!tmp) 172 return ERR_PTR(-EINVAL); 173 174 /* mismatch -- return error */ 175 if (rdev && tmp != rdev) 176 return ERR_PTR(-EINVAL); 177 178 rdev = tmp; 179 } 180 } 181 182 if (!rdev) 183 return ERR_PTR(-ENODEV); 184 185 if (netns != wiphy_net(&rdev->wiphy)) 186 return ERR_PTR(-ENODEV); 187 188 return rdev; 189 } 190 191 /* 192 * This function returns a pointer to the driver 193 * that the genl_info item that is passed refers to. 194 * 195 * The result of this can be a PTR_ERR and hence must 196 * be checked with IS_ERR() for errors. 197 */ 198 static struct cfg80211_registered_device * 199 cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info) 200 { 201 return __cfg80211_rdev_from_attrs(netns, info->attrs); 202 } 203 204 static int validate_beacon_head(const struct nlattr *attr, 205 struct netlink_ext_ack *extack) 206 { 207 const u8 *data = nla_data(attr); 208 unsigned int len = nla_len(attr); 209 const struct element *elem; 210 const struct ieee80211_mgmt *mgmt = (void *)data; 211 unsigned int fixedlen = offsetof(struct ieee80211_mgmt, 212 u.beacon.variable); 213 214 if (len < fixedlen) 215 goto err; 216 217 if (ieee80211_hdrlen(mgmt->frame_control) != 218 offsetof(struct ieee80211_mgmt, u.beacon)) 219 goto err; 220 221 data += fixedlen; 222 len -= fixedlen; 223 224 for_each_element(elem, data, len) { 225 /* nothing */ 226 } 227 228 if (for_each_element_completed(elem, data, len)) 229 return 0; 230 231 err: 232 NL_SET_ERR_MSG_ATTR(extack, attr, "malformed beacon head"); 233 return -EINVAL; 234 } 235 236 static int validate_ie_attr(const struct nlattr *attr, 237 struct netlink_ext_ack *extack) 238 { 239 const u8 *data = nla_data(attr); 240 unsigned int len = nla_len(attr); 241 const struct element *elem; 242 243 for_each_element(elem, data, len) { 244 /* nothing */ 245 } 246 247 if (for_each_element_completed(elem, data, len)) 248 return 0; 249 250 NL_SET_ERR_MSG_ATTR(extack, attr, "malformed information elements"); 251 return -EINVAL; 252 } 253 254 /* policy for the attributes */ 255 static const struct nla_policy 256 nl80211_ftm_responder_policy[NL80211_FTM_RESP_ATTR_MAX + 1] = { 257 [NL80211_FTM_RESP_ATTR_ENABLED] = { .type = NLA_FLAG, }, 258 [NL80211_FTM_RESP_ATTR_LCI] = { .type = NLA_BINARY, 259 .len = U8_MAX }, 260 [NL80211_FTM_RESP_ATTR_CIVICLOC] = { .type = NLA_BINARY, 261 .len = U8_MAX }, 262 }; 263 264 static const struct nla_policy 265 nl80211_pmsr_ftm_req_attr_policy[NL80211_PMSR_FTM_REQ_ATTR_MAX + 1] = { 266 [NL80211_PMSR_FTM_REQ_ATTR_ASAP] = { .type = NLA_FLAG }, 267 [NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE] = { .type = NLA_U32 }, 268 [NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP] = 269 NLA_POLICY_MAX(NLA_U8, 15), 270 [NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD] = { .type = NLA_U16 }, 271 [NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION] = 272 NLA_POLICY_MAX(NLA_U8, 15), 273 [NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST] = 274 NLA_POLICY_MAX(NLA_U8, 31), 275 [NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES] = { .type = NLA_U8 }, 276 [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI] = { .type = NLA_FLAG }, 277 [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC] = { .type = NLA_FLAG }, 278 }; 279 280 static const struct nla_policy 281 nl80211_pmsr_req_data_policy[NL80211_PMSR_TYPE_MAX + 1] = { 282 [NL80211_PMSR_TYPE_FTM] = 283 NLA_POLICY_NESTED(nl80211_pmsr_ftm_req_attr_policy), 284 }; 285 286 static const struct nla_policy 287 nl80211_pmsr_req_attr_policy[NL80211_PMSR_REQ_ATTR_MAX + 1] = { 288 [NL80211_PMSR_REQ_ATTR_DATA] = 289 NLA_POLICY_NESTED(nl80211_pmsr_req_data_policy), 290 [NL80211_PMSR_REQ_ATTR_GET_AP_TSF] = { .type = NLA_FLAG }, 291 }; 292 293 static const struct nla_policy 294 nl80211_psmr_peer_attr_policy[NL80211_PMSR_PEER_ATTR_MAX + 1] = { 295 [NL80211_PMSR_PEER_ATTR_ADDR] = NLA_POLICY_ETH_ADDR, 296 /* 297 * we could specify this again to be the top-level policy, 298 * but that would open us up to recursion problems ... 299 */ 300 [NL80211_PMSR_PEER_ATTR_CHAN] = { .type = NLA_NESTED }, 301 [NL80211_PMSR_PEER_ATTR_REQ] = 302 NLA_POLICY_NESTED(nl80211_pmsr_req_attr_policy), 303 [NL80211_PMSR_PEER_ATTR_RESP] = { .type = NLA_REJECT }, 304 }; 305 306 static const struct nla_policy 307 nl80211_pmsr_attr_policy[NL80211_PMSR_ATTR_MAX + 1] = { 308 [NL80211_PMSR_ATTR_MAX_PEERS] = { .type = NLA_REJECT }, 309 [NL80211_PMSR_ATTR_REPORT_AP_TSF] = { .type = NLA_REJECT }, 310 [NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR] = { .type = NLA_REJECT }, 311 [NL80211_PMSR_ATTR_TYPE_CAPA] = { .type = NLA_REJECT }, 312 [NL80211_PMSR_ATTR_PEERS] = 313 NLA_POLICY_NESTED_ARRAY(nl80211_psmr_peer_attr_policy), 314 }; 315 316 static const struct nla_policy 317 he_obss_pd_policy[NL80211_HE_OBSS_PD_ATTR_MAX + 1] = { 318 [NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET] = 319 NLA_POLICY_RANGE(NLA_U8, 1, 20), 320 [NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET] = 321 NLA_POLICY_RANGE(NLA_U8, 1, 20), 322 }; 323 324 const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { 325 [0] = { .strict_start_type = NL80211_ATTR_HE_OBSS_PD }, 326 [NL80211_ATTR_WIPHY] = { .type = NLA_U32 }, 327 [NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING, 328 .len = 20-1 }, 329 [NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED }, 330 331 [NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 }, 332 [NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 }, 333 [NL80211_ATTR_WIPHY_EDMG_CHANNELS] = NLA_POLICY_RANGE(NLA_U8, 334 NL80211_EDMG_CHANNELS_MIN, 335 NL80211_EDMG_CHANNELS_MAX), 336 [NL80211_ATTR_WIPHY_EDMG_BW_CONFIG] = NLA_POLICY_RANGE(NLA_U8, 337 NL80211_EDMG_BW_CONFIG_MIN, 338 NL80211_EDMG_BW_CONFIG_MAX), 339 340 [NL80211_ATTR_CHANNEL_WIDTH] = { .type = NLA_U32 }, 341 [NL80211_ATTR_CENTER_FREQ1] = { .type = NLA_U32 }, 342 [NL80211_ATTR_CENTER_FREQ2] = { .type = NLA_U32 }, 343 344 [NL80211_ATTR_WIPHY_RETRY_SHORT] = NLA_POLICY_MIN(NLA_U8, 1), 345 [NL80211_ATTR_WIPHY_RETRY_LONG] = NLA_POLICY_MIN(NLA_U8, 1), 346 [NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 }, 347 [NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 }, 348 [NL80211_ATTR_WIPHY_COVERAGE_CLASS] = { .type = NLA_U8 }, 349 [NL80211_ATTR_WIPHY_DYN_ACK] = { .type = NLA_FLAG }, 350 351 [NL80211_ATTR_IFTYPE] = NLA_POLICY_MAX(NLA_U32, NL80211_IFTYPE_MAX), 352 [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 }, 353 [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 }, 354 355 [NL80211_ATTR_MAC] = { .type = NLA_EXACT_LEN_WARN, .len = ETH_ALEN }, 356 [NL80211_ATTR_PREV_BSSID] = { 357 .type = NLA_EXACT_LEN_WARN, 358 .len = ETH_ALEN 359 }, 360 361 [NL80211_ATTR_KEY] = { .type = NLA_NESTED, }, 362 [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY, 363 .len = WLAN_MAX_KEY_LEN }, 364 [NL80211_ATTR_KEY_IDX] = NLA_POLICY_MAX(NLA_U8, 5), 365 [NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 }, 366 [NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG }, 367 [NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 }, 368 [NL80211_ATTR_KEY_TYPE] = 369 NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES), 370 371 [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 }, 372 [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 }, 373 [NL80211_ATTR_BEACON_HEAD] = 374 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_beacon_head, 375 IEEE80211_MAX_DATA_LEN), 376 [NL80211_ATTR_BEACON_TAIL] = 377 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 378 IEEE80211_MAX_DATA_LEN), 379 [NL80211_ATTR_STA_AID] = 380 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), 381 [NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED }, 382 [NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 }, 383 [NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY, 384 .len = NL80211_MAX_SUPP_RATES }, 385 [NL80211_ATTR_STA_PLINK_ACTION] = 386 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_ACTIONS - 1), 387 [NL80211_ATTR_STA_TX_POWER_SETTING] = 388 NLA_POLICY_RANGE(NLA_U8, 389 NL80211_TX_POWER_AUTOMATIC, 390 NL80211_TX_POWER_FIXED), 391 [NL80211_ATTR_STA_TX_POWER] = { .type = NLA_S16 }, 392 [NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 }, 393 [NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ }, 394 [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY, 395 .len = IEEE80211_MAX_MESH_ID_LEN }, 396 [NL80211_ATTR_MPATH_NEXT_HOP] = NLA_POLICY_ETH_ADDR_COMPAT, 397 398 [NL80211_ATTR_REG_ALPHA2] = { .type = NLA_STRING, .len = 2 }, 399 [NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED }, 400 401 [NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 }, 402 [NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 }, 403 [NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 }, 404 [NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY, 405 .len = NL80211_MAX_SUPP_RATES }, 406 [NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 }, 407 408 [NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED }, 409 [NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG }, 410 411 [NL80211_ATTR_HT_CAPABILITY] = { 412 .type = NLA_EXACT_LEN_WARN, 413 .len = NL80211_HT_CAPABILITY_LEN 414 }, 415 416 [NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 }, 417 [NL80211_ATTR_IE] = NLA_POLICY_VALIDATE_FN(NLA_BINARY, 418 validate_ie_attr, 419 IEEE80211_MAX_DATA_LEN), 420 [NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED }, 421 [NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED }, 422 423 [NL80211_ATTR_SSID] = { .type = NLA_BINARY, 424 .len = IEEE80211_MAX_SSID_LEN }, 425 [NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 }, 426 [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 }, 427 [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG }, 428 [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG }, 429 [NL80211_ATTR_USE_MFP] = NLA_POLICY_RANGE(NLA_U32, 430 NL80211_MFP_NO, 431 NL80211_MFP_OPTIONAL), 432 [NL80211_ATTR_STA_FLAGS2] = { 433 .len = sizeof(struct nl80211_sta_flag_update), 434 }, 435 [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG }, 436 [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 }, 437 [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG }, 438 [NL80211_ATTR_CONTROL_PORT_OVER_NL80211] = { .type = NLA_FLAG }, 439 [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG }, 440 [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 }, 441 [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 }, 442 [NL80211_ATTR_PID] = { .type = NLA_U32 }, 443 [NL80211_ATTR_4ADDR] = { .type = NLA_U8 }, 444 [NL80211_ATTR_PMKID] = { 445 .type = NLA_EXACT_LEN_WARN, 446 .len = WLAN_PMKID_LEN 447 }, 448 [NL80211_ATTR_DURATION] = { .type = NLA_U32 }, 449 [NL80211_ATTR_COOKIE] = { .type = NLA_U64 }, 450 [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED }, 451 [NL80211_ATTR_FRAME] = { .type = NLA_BINARY, 452 .len = IEEE80211_MAX_DATA_LEN }, 453 [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, }, 454 [NL80211_ATTR_PS_STATE] = NLA_POLICY_RANGE(NLA_U32, 455 NL80211_PS_DISABLED, 456 NL80211_PS_ENABLED), 457 [NL80211_ATTR_CQM] = { .type = NLA_NESTED, }, 458 [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG }, 459 [NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 }, 460 [NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 }, 461 [NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 }, 462 [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 }, 463 [NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 }, 464 [NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 }, 465 [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 }, 466 [NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG }, 467 [NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED }, 468 [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED }, 469 [NL80211_ATTR_STA_PLINK_STATE] = 470 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1), 471 [NL80211_ATTR_MESH_PEER_AID] = 472 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), 473 [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 }, 474 [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED }, 475 [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED }, 476 [NL80211_ATTR_HIDDEN_SSID] = 477 NLA_POLICY_RANGE(NLA_U32, 478 NL80211_HIDDEN_SSID_NOT_IN_USE, 479 NL80211_HIDDEN_SSID_ZERO_CONTENTS), 480 [NL80211_ATTR_IE_PROBE_RESP] = 481 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 482 IEEE80211_MAX_DATA_LEN), 483 [NL80211_ATTR_IE_ASSOC_RESP] = 484 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 485 IEEE80211_MAX_DATA_LEN), 486 [NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG }, 487 [NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED }, 488 [NL80211_ATTR_TX_NO_CCK_RATE] = { .type = NLA_FLAG }, 489 [NL80211_ATTR_TDLS_ACTION] = { .type = NLA_U8 }, 490 [NL80211_ATTR_TDLS_DIALOG_TOKEN] = { .type = NLA_U8 }, 491 [NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 }, 492 [NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG }, 493 [NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG }, 494 [NL80211_ATTR_TDLS_INITIATOR] = { .type = NLA_FLAG }, 495 [NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG }, 496 [NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY, 497 .len = IEEE80211_MAX_DATA_LEN }, 498 [NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 }, 499 [NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG }, 500 [NL80211_ATTR_HT_CAPABILITY_MASK] = { 501 .len = NL80211_HT_CAPABILITY_LEN 502 }, 503 [NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 }, 504 [NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 }, 505 [NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 }, 506 [NL80211_ATTR_WDEV] = { .type = NLA_U64 }, 507 [NL80211_ATTR_USER_REG_HINT_TYPE] = { .type = NLA_U32 }, 508 [NL80211_ATTR_AUTH_DATA] = { .type = NLA_BINARY, }, 509 [NL80211_ATTR_VHT_CAPABILITY] = { 510 .type = NLA_EXACT_LEN_WARN, 511 .len = NL80211_VHT_CAPABILITY_LEN 512 }, 513 [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 }, 514 [NL80211_ATTR_P2P_CTWINDOW] = NLA_POLICY_MAX(NLA_U8, 127), 515 [NL80211_ATTR_P2P_OPPPS] = NLA_POLICY_MAX(NLA_U8, 1), 516 [NL80211_ATTR_LOCAL_MESH_POWER_MODE] = 517 NLA_POLICY_RANGE(NLA_U32, 518 NL80211_MESH_POWER_UNKNOWN + 1, 519 NL80211_MESH_POWER_MAX), 520 [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 }, 521 [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED }, 522 [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 }, 523 [NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, }, 524 [NL80211_ATTR_SPLIT_WIPHY_DUMP] = { .type = NLA_FLAG, }, 525 [NL80211_ATTR_DISABLE_VHT] = { .type = NLA_FLAG }, 526 [NL80211_ATTR_VHT_CAPABILITY_MASK] = { 527 .len = NL80211_VHT_CAPABILITY_LEN, 528 }, 529 [NL80211_ATTR_MDID] = { .type = NLA_U16 }, 530 [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY, 531 .len = IEEE80211_MAX_DATA_LEN }, 532 [NL80211_ATTR_PEER_AID] = 533 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), 534 [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 }, 535 [NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG }, 536 [NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED }, 537 [NL80211_ATTR_CSA_C_OFF_BEACON] = { .type = NLA_BINARY }, 538 [NL80211_ATTR_CSA_C_OFF_PRESP] = { .type = NLA_BINARY }, 539 [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = { .type = NLA_BINARY }, 540 [NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = { .type = NLA_BINARY }, 541 [NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG }, 542 [NL80211_ATTR_OPMODE_NOTIF] = { .type = NLA_U8 }, 543 [NL80211_ATTR_VENDOR_ID] = { .type = NLA_U32 }, 544 [NL80211_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 }, 545 [NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY }, 546 [NL80211_ATTR_QOS_MAP] = { .type = NLA_BINARY, 547 .len = IEEE80211_QOS_MAP_LEN_MAX }, 548 [NL80211_ATTR_MAC_HINT] = { 549 .type = NLA_EXACT_LEN_WARN, 550 .len = ETH_ALEN 551 }, 552 [NL80211_ATTR_WIPHY_FREQ_HINT] = { .type = NLA_U32 }, 553 [NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 }, 554 [NL80211_ATTR_SOCKET_OWNER] = { .type = NLA_FLAG }, 555 [NL80211_ATTR_CSA_C_OFFSETS_TX] = { .type = NLA_BINARY }, 556 [NL80211_ATTR_USE_RRM] = { .type = NLA_FLAG }, 557 [NL80211_ATTR_TSID] = NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_TIDS - 1), 558 [NL80211_ATTR_USER_PRIO] = 559 NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1), 560 [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 }, 561 [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 }, 562 [NL80211_ATTR_MAC_MASK] = { 563 .type = NLA_EXACT_LEN_WARN, 564 .len = ETH_ALEN 565 }, 566 [NL80211_ATTR_WIPHY_SELF_MANAGED_REG] = { .type = NLA_FLAG }, 567 [NL80211_ATTR_NETNS_FD] = { .type = NLA_U32 }, 568 [NL80211_ATTR_SCHED_SCAN_DELAY] = { .type = NLA_U32 }, 569 [NL80211_ATTR_REG_INDOOR] = { .type = NLA_FLAG }, 570 [NL80211_ATTR_PBSS] = { .type = NLA_FLAG }, 571 [NL80211_ATTR_BSS_SELECT] = { .type = NLA_NESTED }, 572 [NL80211_ATTR_STA_SUPPORT_P2P_PS] = 573 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_P2P_PS_STATUS - 1), 574 [NL80211_ATTR_MU_MIMO_GROUP_DATA] = { 575 .len = VHT_MUMIMO_GROUPS_DATA_LEN 576 }, 577 [NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR] = { 578 .type = NLA_EXACT_LEN_WARN, 579 .len = ETH_ALEN 580 }, 581 [NL80211_ATTR_NAN_MASTER_PREF] = NLA_POLICY_MIN(NLA_U8, 1), 582 [NL80211_ATTR_BANDS] = { .type = NLA_U32 }, 583 [NL80211_ATTR_NAN_FUNC] = { .type = NLA_NESTED }, 584 [NL80211_ATTR_FILS_KEK] = { .type = NLA_BINARY, 585 .len = FILS_MAX_KEK_LEN }, 586 [NL80211_ATTR_FILS_NONCES] = { 587 .type = NLA_EXACT_LEN_WARN, 588 .len = 2 * FILS_NONCE_LEN 589 }, 590 [NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED] = { .type = NLA_FLAG, }, 591 [NL80211_ATTR_BSSID] = { .type = NLA_EXACT_LEN_WARN, .len = ETH_ALEN }, 592 [NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] = { .type = NLA_S8 }, 593 [NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST] = { 594 .len = sizeof(struct nl80211_bss_select_rssi_adjust) 595 }, 596 [NL80211_ATTR_TIMEOUT_REASON] = { .type = NLA_U32 }, 597 [NL80211_ATTR_FILS_ERP_USERNAME] = { .type = NLA_BINARY, 598 .len = FILS_ERP_MAX_USERNAME_LEN }, 599 [NL80211_ATTR_FILS_ERP_REALM] = { .type = NLA_BINARY, 600 .len = FILS_ERP_MAX_REALM_LEN }, 601 [NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] = { .type = NLA_U16 }, 602 [NL80211_ATTR_FILS_ERP_RRK] = { .type = NLA_BINARY, 603 .len = FILS_ERP_MAX_RRK_LEN }, 604 [NL80211_ATTR_FILS_CACHE_ID] = { .type = NLA_EXACT_LEN_WARN, .len = 2 }, 605 [NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN }, 606 [NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG }, 607 [NL80211_ATTR_EXTERNAL_AUTH_SUPPORT] = { .type = NLA_FLAG }, 608 609 [NL80211_ATTR_TXQ_LIMIT] = { .type = NLA_U32 }, 610 [NL80211_ATTR_TXQ_MEMORY_LIMIT] = { .type = NLA_U32 }, 611 [NL80211_ATTR_TXQ_QUANTUM] = { .type = NLA_U32 }, 612 [NL80211_ATTR_HE_CAPABILITY] = { .type = NLA_BINARY, 613 .len = NL80211_HE_MAX_CAPABILITY_LEN }, 614 615 [NL80211_ATTR_FTM_RESPONDER] = { 616 .type = NLA_NESTED, 617 .validation_data = nl80211_ftm_responder_policy, 618 }, 619 [NL80211_ATTR_TIMEOUT] = NLA_POLICY_MIN(NLA_U32, 1), 620 [NL80211_ATTR_PEER_MEASUREMENTS] = 621 NLA_POLICY_NESTED(nl80211_pmsr_attr_policy), 622 [NL80211_ATTR_AIRTIME_WEIGHT] = NLA_POLICY_MIN(NLA_U16, 1), 623 [NL80211_ATTR_SAE_PASSWORD] = { .type = NLA_BINARY, 624 .len = SAE_PASSWORD_MAX_LEN }, 625 [NL80211_ATTR_TWT_RESPONDER] = { .type = NLA_FLAG }, 626 [NL80211_ATTR_HE_OBSS_PD] = NLA_POLICY_NESTED(he_obss_pd_policy), 627 [NL80211_ATTR_VLAN_ID] = NLA_POLICY_RANGE(NLA_U16, 1, VLAN_N_VID - 2), 628 }; 629 630 /* policy for the key attributes */ 631 static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = { 632 [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN }, 633 [NL80211_KEY_IDX] = { .type = NLA_U8 }, 634 [NL80211_KEY_CIPHER] = { .type = NLA_U32 }, 635 [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 }, 636 [NL80211_KEY_DEFAULT] = { .type = NLA_FLAG }, 637 [NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG }, 638 [NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1), 639 [NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED }, 640 [NL80211_KEY_MODE] = NLA_POLICY_RANGE(NLA_U8, 0, NL80211_KEY_SET_TX), 641 }; 642 643 /* policy for the key default flags */ 644 static const struct nla_policy 645 nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = { 646 [NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG }, 647 [NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG }, 648 }; 649 650 #ifdef CONFIG_PM 651 /* policy for WoWLAN attributes */ 652 static const struct nla_policy 653 nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = { 654 [NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG }, 655 [NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG }, 656 [NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG }, 657 [NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED }, 658 [NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE] = { .type = NLA_FLAG }, 659 [NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST] = { .type = NLA_FLAG }, 660 [NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE] = { .type = NLA_FLAG }, 661 [NL80211_WOWLAN_TRIG_RFKILL_RELEASE] = { .type = NLA_FLAG }, 662 [NL80211_WOWLAN_TRIG_TCP_CONNECTION] = { .type = NLA_NESTED }, 663 [NL80211_WOWLAN_TRIG_NET_DETECT] = { .type = NLA_NESTED }, 664 }; 665 666 static const struct nla_policy 667 nl80211_wowlan_tcp_policy[NUM_NL80211_WOWLAN_TCP] = { 668 [NL80211_WOWLAN_TCP_SRC_IPV4] = { .type = NLA_U32 }, 669 [NL80211_WOWLAN_TCP_DST_IPV4] = { .type = NLA_U32 }, 670 [NL80211_WOWLAN_TCP_DST_MAC] = { 671 .type = NLA_EXACT_LEN_WARN, 672 .len = ETH_ALEN 673 }, 674 [NL80211_WOWLAN_TCP_SRC_PORT] = { .type = NLA_U16 }, 675 [NL80211_WOWLAN_TCP_DST_PORT] = { .type = NLA_U16 }, 676 [NL80211_WOWLAN_TCP_DATA_PAYLOAD] = { .type = NLA_MIN_LEN, .len = 1 }, 677 [NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ] = { 678 .len = sizeof(struct nl80211_wowlan_tcp_data_seq) 679 }, 680 [NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN] = { 681 .len = sizeof(struct nl80211_wowlan_tcp_data_token) 682 }, 683 [NL80211_WOWLAN_TCP_DATA_INTERVAL] = { .type = NLA_U32 }, 684 [NL80211_WOWLAN_TCP_WAKE_PAYLOAD] = { .type = NLA_MIN_LEN, .len = 1 }, 685 [NL80211_WOWLAN_TCP_WAKE_MASK] = { .type = NLA_MIN_LEN, .len = 1 }, 686 }; 687 #endif /* CONFIG_PM */ 688 689 /* policy for coalesce rule attributes */ 690 static const struct nla_policy 691 nl80211_coalesce_policy[NUM_NL80211_ATTR_COALESCE_RULE] = { 692 [NL80211_ATTR_COALESCE_RULE_DELAY] = { .type = NLA_U32 }, 693 [NL80211_ATTR_COALESCE_RULE_CONDITION] = 694 NLA_POLICY_RANGE(NLA_U32, 695 NL80211_COALESCE_CONDITION_MATCH, 696 NL80211_COALESCE_CONDITION_NO_MATCH), 697 [NL80211_ATTR_COALESCE_RULE_PKT_PATTERN] = { .type = NLA_NESTED }, 698 }; 699 700 /* policy for GTK rekey offload attributes */ 701 static const struct nla_policy 702 nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = { 703 [NL80211_REKEY_DATA_KEK] = { 704 .type = NLA_EXACT_LEN_WARN, 705 .len = NL80211_KEK_LEN, 706 }, 707 [NL80211_REKEY_DATA_KCK] = { 708 .type = NLA_EXACT_LEN_WARN, 709 .len = NL80211_KCK_LEN, 710 }, 711 [NL80211_REKEY_DATA_REPLAY_CTR] = { 712 .type = NLA_EXACT_LEN_WARN, 713 .len = NL80211_REPLAY_CTR_LEN 714 }, 715 }; 716 717 static const struct nla_policy 718 nl80211_match_band_rssi_policy[NUM_NL80211_BANDS] = { 719 [NL80211_BAND_2GHZ] = { .type = NLA_S32 }, 720 [NL80211_BAND_5GHZ] = { .type = NLA_S32 }, 721 [NL80211_BAND_6GHZ] = { .type = NLA_S32 }, 722 [NL80211_BAND_60GHZ] = { .type = NLA_S32 }, 723 }; 724 725 static const struct nla_policy 726 nl80211_match_policy[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1] = { 727 [NL80211_SCHED_SCAN_MATCH_ATTR_SSID] = { .type = NLA_BINARY, 728 .len = IEEE80211_MAX_SSID_LEN }, 729 [NL80211_SCHED_SCAN_MATCH_ATTR_BSSID] = { 730 .type = NLA_EXACT_LEN_WARN, 731 .len = ETH_ALEN 732 }, 733 [NL80211_SCHED_SCAN_MATCH_ATTR_RSSI] = { .type = NLA_U32 }, 734 [NL80211_SCHED_SCAN_MATCH_PER_BAND_RSSI] = 735 NLA_POLICY_NESTED(nl80211_match_band_rssi_policy), 736 }; 737 738 static const struct nla_policy 739 nl80211_plan_policy[NL80211_SCHED_SCAN_PLAN_MAX + 1] = { 740 [NL80211_SCHED_SCAN_PLAN_INTERVAL] = { .type = NLA_U32 }, 741 [NL80211_SCHED_SCAN_PLAN_ITERATIONS] = { .type = NLA_U32 }, 742 }; 743 744 static const struct nla_policy 745 nl80211_bss_select_policy[NL80211_BSS_SELECT_ATTR_MAX + 1] = { 746 [NL80211_BSS_SELECT_ATTR_RSSI] = { .type = NLA_FLAG }, 747 [NL80211_BSS_SELECT_ATTR_BAND_PREF] = { .type = NLA_U32 }, 748 [NL80211_BSS_SELECT_ATTR_RSSI_ADJUST] = { 749 .len = sizeof(struct nl80211_bss_select_rssi_adjust) 750 }, 751 }; 752 753 /* policy for NAN function attributes */ 754 static const struct nla_policy 755 nl80211_nan_func_policy[NL80211_NAN_FUNC_ATTR_MAX + 1] = { 756 [NL80211_NAN_FUNC_TYPE] = { .type = NLA_U8 }, 757 [NL80211_NAN_FUNC_SERVICE_ID] = { 758 .len = NL80211_NAN_FUNC_SERVICE_ID_LEN }, 759 [NL80211_NAN_FUNC_PUBLISH_TYPE] = { .type = NLA_U8 }, 760 [NL80211_NAN_FUNC_PUBLISH_BCAST] = { .type = NLA_FLAG }, 761 [NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE] = { .type = NLA_FLAG }, 762 [NL80211_NAN_FUNC_FOLLOW_UP_ID] = { .type = NLA_U8 }, 763 [NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] = { .type = NLA_U8 }, 764 [NL80211_NAN_FUNC_FOLLOW_UP_DEST] = { 765 .type = NLA_EXACT_LEN_WARN, 766 .len = ETH_ALEN 767 }, 768 [NL80211_NAN_FUNC_CLOSE_RANGE] = { .type = NLA_FLAG }, 769 [NL80211_NAN_FUNC_TTL] = { .type = NLA_U32 }, 770 [NL80211_NAN_FUNC_SERVICE_INFO] = { .type = NLA_BINARY, 771 .len = NL80211_NAN_FUNC_SERVICE_SPEC_INFO_MAX_LEN }, 772 [NL80211_NAN_FUNC_SRF] = { .type = NLA_NESTED }, 773 [NL80211_NAN_FUNC_RX_MATCH_FILTER] = { .type = NLA_NESTED }, 774 [NL80211_NAN_FUNC_TX_MATCH_FILTER] = { .type = NLA_NESTED }, 775 [NL80211_NAN_FUNC_INSTANCE_ID] = { .type = NLA_U8 }, 776 [NL80211_NAN_FUNC_TERM_REASON] = { .type = NLA_U8 }, 777 }; 778 779 /* policy for Service Response Filter attributes */ 780 static const struct nla_policy 781 nl80211_nan_srf_policy[NL80211_NAN_SRF_ATTR_MAX + 1] = { 782 [NL80211_NAN_SRF_INCLUDE] = { .type = NLA_FLAG }, 783 [NL80211_NAN_SRF_BF] = { .type = NLA_BINARY, 784 .len = NL80211_NAN_FUNC_SRF_MAX_LEN }, 785 [NL80211_NAN_SRF_BF_IDX] = { .type = NLA_U8 }, 786 [NL80211_NAN_SRF_MAC_ADDRS] = { .type = NLA_NESTED }, 787 }; 788 789 /* policy for packet pattern attributes */ 790 static const struct nla_policy 791 nl80211_packet_pattern_policy[MAX_NL80211_PKTPAT + 1] = { 792 [NL80211_PKTPAT_MASK] = { .type = NLA_BINARY, }, 793 [NL80211_PKTPAT_PATTERN] = { .type = NLA_BINARY, }, 794 [NL80211_PKTPAT_OFFSET] = { .type = NLA_U32 }, 795 }; 796 797 int nl80211_prepare_wdev_dump(struct netlink_callback *cb, 798 struct cfg80211_registered_device **rdev, 799 struct wireless_dev **wdev) 800 { 801 int err; 802 803 if (!cb->args[0]) { 804 struct nlattr **attrbuf; 805 806 attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf), 807 GFP_KERNEL); 808 if (!attrbuf) 809 return -ENOMEM; 810 811 err = nlmsg_parse_deprecated(cb->nlh, 812 GENL_HDRLEN + nl80211_fam.hdrsize, 813 attrbuf, nl80211_fam.maxattr, 814 nl80211_policy, NULL); 815 if (err) { 816 kfree(attrbuf); 817 return err; 818 } 819 820 *wdev = __cfg80211_wdev_from_attrs(sock_net(cb->skb->sk), 821 attrbuf); 822 kfree(attrbuf); 823 if (IS_ERR(*wdev)) 824 return PTR_ERR(*wdev); 825 *rdev = wiphy_to_rdev((*wdev)->wiphy); 826 /* 0 is the first index - add 1 to parse only once */ 827 cb->args[0] = (*rdev)->wiphy_idx + 1; 828 cb->args[1] = (*wdev)->identifier; 829 } else { 830 /* subtract the 1 again here */ 831 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); 832 struct wireless_dev *tmp; 833 834 if (!wiphy) 835 return -ENODEV; 836 *rdev = wiphy_to_rdev(wiphy); 837 *wdev = NULL; 838 839 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) { 840 if (tmp->identifier == cb->args[1]) { 841 *wdev = tmp; 842 break; 843 } 844 } 845 846 if (!*wdev) 847 return -ENODEV; 848 } 849 850 return 0; 851 } 852 853 /* message building helper */ 854 void *nl80211hdr_put(struct sk_buff *skb, u32 portid, u32 seq, 855 int flags, u8 cmd) 856 { 857 /* since there is no private header just add the generic one */ 858 return genlmsg_put(skb, portid, seq, &nl80211_fam, flags, cmd); 859 } 860 861 static int nl80211_msg_put_wmm_rules(struct sk_buff *msg, 862 const struct ieee80211_reg_rule *rule) 863 { 864 int j; 865 struct nlattr *nl_wmm_rules = 866 nla_nest_start_noflag(msg, NL80211_FREQUENCY_ATTR_WMM); 867 868 if (!nl_wmm_rules) 869 goto nla_put_failure; 870 871 for (j = 0; j < IEEE80211_NUM_ACS; j++) { 872 struct nlattr *nl_wmm_rule = nla_nest_start_noflag(msg, j); 873 874 if (!nl_wmm_rule) 875 goto nla_put_failure; 876 877 if (nla_put_u16(msg, NL80211_WMMR_CW_MIN, 878 rule->wmm_rule.client[j].cw_min) || 879 nla_put_u16(msg, NL80211_WMMR_CW_MAX, 880 rule->wmm_rule.client[j].cw_max) || 881 nla_put_u8(msg, NL80211_WMMR_AIFSN, 882 rule->wmm_rule.client[j].aifsn) || 883 nla_put_u16(msg, NL80211_WMMR_TXOP, 884 rule->wmm_rule.client[j].cot)) 885 goto nla_put_failure; 886 887 nla_nest_end(msg, nl_wmm_rule); 888 } 889 nla_nest_end(msg, nl_wmm_rules); 890 891 return 0; 892 893 nla_put_failure: 894 return -ENOBUFS; 895 } 896 897 static int nl80211_msg_put_channel(struct sk_buff *msg, struct wiphy *wiphy, 898 struct ieee80211_channel *chan, 899 bool large) 900 { 901 /* Some channels must be completely excluded from the 902 * list to protect old user-space tools from breaking 903 */ 904 if (!large && chan->flags & 905 (IEEE80211_CHAN_NO_10MHZ | IEEE80211_CHAN_NO_20MHZ)) 906 return 0; 907 908 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ, 909 chan->center_freq)) 910 goto nla_put_failure; 911 912 if ((chan->flags & IEEE80211_CHAN_DISABLED) && 913 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DISABLED)) 914 goto nla_put_failure; 915 if (chan->flags & IEEE80211_CHAN_NO_IR) { 916 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IR)) 917 goto nla_put_failure; 918 if (nla_put_flag(msg, __NL80211_FREQUENCY_ATTR_NO_IBSS)) 919 goto nla_put_failure; 920 } 921 if (chan->flags & IEEE80211_CHAN_RADAR) { 922 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR)) 923 goto nla_put_failure; 924 if (large) { 925 u32 time; 926 927 time = elapsed_jiffies_msecs(chan->dfs_state_entered); 928 929 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE, 930 chan->dfs_state)) 931 goto nla_put_failure; 932 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME, 933 time)) 934 goto nla_put_failure; 935 if (nla_put_u32(msg, 936 NL80211_FREQUENCY_ATTR_DFS_CAC_TIME, 937 chan->dfs_cac_ms)) 938 goto nla_put_failure; 939 } 940 } 941 942 if (large) { 943 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) && 944 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS)) 945 goto nla_put_failure; 946 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) && 947 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS)) 948 goto nla_put_failure; 949 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) && 950 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ)) 951 goto nla_put_failure; 952 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) && 953 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ)) 954 goto nla_put_failure; 955 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) && 956 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_INDOOR_ONLY)) 957 goto nla_put_failure; 958 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) && 959 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_IR_CONCURRENT)) 960 goto nla_put_failure; 961 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) && 962 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_20MHZ)) 963 goto nla_put_failure; 964 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) && 965 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_10MHZ)) 966 goto nla_put_failure; 967 } 968 969 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER, 970 DBM_TO_MBM(chan->max_power))) 971 goto nla_put_failure; 972 973 if (large) { 974 const struct ieee80211_reg_rule *rule = 975 freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq)); 976 977 if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) { 978 if (nl80211_msg_put_wmm_rules(msg, rule)) 979 goto nla_put_failure; 980 } 981 } 982 983 return 0; 984 985 nla_put_failure: 986 return -ENOBUFS; 987 } 988 989 static bool nl80211_put_txq_stats(struct sk_buff *msg, 990 struct cfg80211_txq_stats *txqstats, 991 int attrtype) 992 { 993 struct nlattr *txqattr; 994 995 #define PUT_TXQVAL_U32(attr, memb) do { \ 996 if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) && \ 997 nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \ 998 return false; \ 999 } while (0) 1000 1001 txqattr = nla_nest_start_noflag(msg, attrtype); 1002 if (!txqattr) 1003 return false; 1004 1005 PUT_TXQVAL_U32(BACKLOG_BYTES, backlog_bytes); 1006 PUT_TXQVAL_U32(BACKLOG_PACKETS, backlog_packets); 1007 PUT_TXQVAL_U32(FLOWS, flows); 1008 PUT_TXQVAL_U32(DROPS, drops); 1009 PUT_TXQVAL_U32(ECN_MARKS, ecn_marks); 1010 PUT_TXQVAL_U32(OVERLIMIT, overlimit); 1011 PUT_TXQVAL_U32(OVERMEMORY, overmemory); 1012 PUT_TXQVAL_U32(COLLISIONS, collisions); 1013 PUT_TXQVAL_U32(TX_BYTES, tx_bytes); 1014 PUT_TXQVAL_U32(TX_PACKETS, tx_packets); 1015 PUT_TXQVAL_U32(MAX_FLOWS, max_flows); 1016 nla_nest_end(msg, txqattr); 1017 1018 #undef PUT_TXQVAL_U32 1019 return true; 1020 } 1021 1022 /* netlink command implementations */ 1023 1024 struct key_parse { 1025 struct key_params p; 1026 int idx; 1027 int type; 1028 bool def, defmgmt; 1029 bool def_uni, def_multi; 1030 }; 1031 1032 static int nl80211_parse_key_new(struct genl_info *info, struct nlattr *key, 1033 struct key_parse *k) 1034 { 1035 struct nlattr *tb[NL80211_KEY_MAX + 1]; 1036 int err = nla_parse_nested_deprecated(tb, NL80211_KEY_MAX, key, 1037 nl80211_key_policy, 1038 info->extack); 1039 if (err) 1040 return err; 1041 1042 k->def = !!tb[NL80211_KEY_DEFAULT]; 1043 k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT]; 1044 1045 if (k->def) { 1046 k->def_uni = true; 1047 k->def_multi = true; 1048 } 1049 if (k->defmgmt) 1050 k->def_multi = true; 1051 1052 if (tb[NL80211_KEY_IDX]) 1053 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]); 1054 1055 if (tb[NL80211_KEY_DATA]) { 1056 k->p.key = nla_data(tb[NL80211_KEY_DATA]); 1057 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]); 1058 } 1059 1060 if (tb[NL80211_KEY_SEQ]) { 1061 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]); 1062 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]); 1063 } 1064 1065 if (tb[NL80211_KEY_CIPHER]) 1066 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]); 1067 1068 if (tb[NL80211_KEY_TYPE]) 1069 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]); 1070 1071 if (tb[NL80211_KEY_DEFAULT_TYPES]) { 1072 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES]; 1073 1074 err = nla_parse_nested_deprecated(kdt, 1075 NUM_NL80211_KEY_DEFAULT_TYPES - 1, 1076 tb[NL80211_KEY_DEFAULT_TYPES], 1077 nl80211_key_default_policy, 1078 info->extack); 1079 if (err) 1080 return err; 1081 1082 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; 1083 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; 1084 } 1085 1086 if (tb[NL80211_KEY_MODE]) 1087 k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]); 1088 1089 return 0; 1090 } 1091 1092 static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k) 1093 { 1094 if (info->attrs[NL80211_ATTR_KEY_DATA]) { 1095 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]); 1096 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]); 1097 } 1098 1099 if (info->attrs[NL80211_ATTR_KEY_SEQ]) { 1100 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]); 1101 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]); 1102 } 1103 1104 if (info->attrs[NL80211_ATTR_KEY_IDX]) 1105 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); 1106 1107 if (info->attrs[NL80211_ATTR_KEY_CIPHER]) 1108 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]); 1109 1110 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT]; 1111 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT]; 1112 1113 if (k->def) { 1114 k->def_uni = true; 1115 k->def_multi = true; 1116 } 1117 if (k->defmgmt) 1118 k->def_multi = true; 1119 1120 if (info->attrs[NL80211_ATTR_KEY_TYPE]) 1121 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); 1122 1123 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) { 1124 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES]; 1125 int err = nla_parse_nested_deprecated(kdt, 1126 NUM_NL80211_KEY_DEFAULT_TYPES - 1, 1127 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES], 1128 nl80211_key_default_policy, 1129 info->extack); 1130 if (err) 1131 return err; 1132 1133 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; 1134 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; 1135 } 1136 1137 return 0; 1138 } 1139 1140 static int nl80211_parse_key(struct genl_info *info, struct key_parse *k) 1141 { 1142 int err; 1143 1144 memset(k, 0, sizeof(*k)); 1145 k->idx = -1; 1146 k->type = -1; 1147 1148 if (info->attrs[NL80211_ATTR_KEY]) 1149 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k); 1150 else 1151 err = nl80211_parse_key_old(info, k); 1152 1153 if (err) 1154 return err; 1155 1156 if (k->def && k->defmgmt) { 1157 GENL_SET_ERR_MSG(info, "key with def && defmgmt is invalid"); 1158 return -EINVAL; 1159 } 1160 1161 if (k->defmgmt) { 1162 if (k->def_uni || !k->def_multi) { 1163 GENL_SET_ERR_MSG(info, "defmgmt key must be mcast"); 1164 return -EINVAL; 1165 } 1166 } 1167 1168 if (k->idx != -1) { 1169 if (k->defmgmt) { 1170 if (k->idx < 4 || k->idx > 5) { 1171 GENL_SET_ERR_MSG(info, 1172 "defmgmt key idx not 4 or 5"); 1173 return -EINVAL; 1174 } 1175 } else if (k->def) { 1176 if (k->idx < 0 || k->idx > 3) { 1177 GENL_SET_ERR_MSG(info, "def key idx not 0-3"); 1178 return -EINVAL; 1179 } 1180 } else { 1181 if (k->idx < 0 || k->idx > 5) { 1182 GENL_SET_ERR_MSG(info, "key idx not 0-5"); 1183 return -EINVAL; 1184 } 1185 } 1186 } 1187 1188 return 0; 1189 } 1190 1191 static struct cfg80211_cached_keys * 1192 nl80211_parse_connkeys(struct cfg80211_registered_device *rdev, 1193 struct genl_info *info, bool *no_ht) 1194 { 1195 struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS]; 1196 struct key_parse parse; 1197 struct nlattr *key; 1198 struct cfg80211_cached_keys *result; 1199 int rem, err, def = 0; 1200 bool have_key = false; 1201 1202 nla_for_each_nested(key, keys, rem) { 1203 have_key = true; 1204 break; 1205 } 1206 1207 if (!have_key) 1208 return NULL; 1209 1210 result = kzalloc(sizeof(*result), GFP_KERNEL); 1211 if (!result) 1212 return ERR_PTR(-ENOMEM); 1213 1214 result->def = -1; 1215 1216 nla_for_each_nested(key, keys, rem) { 1217 memset(&parse, 0, sizeof(parse)); 1218 parse.idx = -1; 1219 1220 err = nl80211_parse_key_new(info, key, &parse); 1221 if (err) 1222 goto error; 1223 err = -EINVAL; 1224 if (!parse.p.key) 1225 goto error; 1226 if (parse.idx < 0 || parse.idx > 3) { 1227 GENL_SET_ERR_MSG(info, "key index out of range [0-3]"); 1228 goto error; 1229 } 1230 if (parse.def) { 1231 if (def) { 1232 GENL_SET_ERR_MSG(info, 1233 "only one key can be default"); 1234 goto error; 1235 } 1236 def = 1; 1237 result->def = parse.idx; 1238 if (!parse.def_uni || !parse.def_multi) 1239 goto error; 1240 } else if (parse.defmgmt) 1241 goto error; 1242 err = cfg80211_validate_key_settings(rdev, &parse.p, 1243 parse.idx, false, NULL); 1244 if (err) 1245 goto error; 1246 if (parse.p.cipher != WLAN_CIPHER_SUITE_WEP40 && 1247 parse.p.cipher != WLAN_CIPHER_SUITE_WEP104) { 1248 GENL_SET_ERR_MSG(info, "connect key must be WEP"); 1249 err = -EINVAL; 1250 goto error; 1251 } 1252 result->params[parse.idx].cipher = parse.p.cipher; 1253 result->params[parse.idx].key_len = parse.p.key_len; 1254 result->params[parse.idx].key = result->data[parse.idx]; 1255 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len); 1256 1257 /* must be WEP key if we got here */ 1258 if (no_ht) 1259 *no_ht = true; 1260 } 1261 1262 if (result->def < 0) { 1263 err = -EINVAL; 1264 GENL_SET_ERR_MSG(info, "need a default/TX key"); 1265 goto error; 1266 } 1267 1268 return result; 1269 error: 1270 kfree(result); 1271 return ERR_PTR(err); 1272 } 1273 1274 static int nl80211_key_allowed(struct wireless_dev *wdev) 1275 { 1276 ASSERT_WDEV_LOCK(wdev); 1277 1278 switch (wdev->iftype) { 1279 case NL80211_IFTYPE_AP: 1280 case NL80211_IFTYPE_AP_VLAN: 1281 case NL80211_IFTYPE_P2P_GO: 1282 case NL80211_IFTYPE_MESH_POINT: 1283 break; 1284 case NL80211_IFTYPE_ADHOC: 1285 case NL80211_IFTYPE_STATION: 1286 case NL80211_IFTYPE_P2P_CLIENT: 1287 if (!wdev->current_bss) 1288 return -ENOLINK; 1289 break; 1290 case NL80211_IFTYPE_UNSPECIFIED: 1291 case NL80211_IFTYPE_OCB: 1292 case NL80211_IFTYPE_MONITOR: 1293 case NL80211_IFTYPE_NAN: 1294 case NL80211_IFTYPE_P2P_DEVICE: 1295 case NL80211_IFTYPE_WDS: 1296 case NUM_NL80211_IFTYPES: 1297 return -EINVAL; 1298 } 1299 1300 return 0; 1301 } 1302 1303 static struct ieee80211_channel *nl80211_get_valid_chan(struct wiphy *wiphy, 1304 struct nlattr *tb) 1305 { 1306 struct ieee80211_channel *chan; 1307 1308 if (tb == NULL) 1309 return NULL; 1310 chan = ieee80211_get_channel(wiphy, nla_get_u32(tb)); 1311 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) 1312 return NULL; 1313 return chan; 1314 } 1315 1316 static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes) 1317 { 1318 struct nlattr *nl_modes = nla_nest_start_noflag(msg, attr); 1319 int i; 1320 1321 if (!nl_modes) 1322 goto nla_put_failure; 1323 1324 i = 0; 1325 while (ifmodes) { 1326 if ((ifmodes & 1) && nla_put_flag(msg, i)) 1327 goto nla_put_failure; 1328 ifmodes >>= 1; 1329 i++; 1330 } 1331 1332 nla_nest_end(msg, nl_modes); 1333 return 0; 1334 1335 nla_put_failure: 1336 return -ENOBUFS; 1337 } 1338 1339 static int nl80211_put_iface_combinations(struct wiphy *wiphy, 1340 struct sk_buff *msg, 1341 bool large) 1342 { 1343 struct nlattr *nl_combis; 1344 int i, j; 1345 1346 nl_combis = nla_nest_start_noflag(msg, 1347 NL80211_ATTR_INTERFACE_COMBINATIONS); 1348 if (!nl_combis) 1349 goto nla_put_failure; 1350 1351 for (i = 0; i < wiphy->n_iface_combinations; i++) { 1352 const struct ieee80211_iface_combination *c; 1353 struct nlattr *nl_combi, *nl_limits; 1354 1355 c = &wiphy->iface_combinations[i]; 1356 1357 nl_combi = nla_nest_start_noflag(msg, i + 1); 1358 if (!nl_combi) 1359 goto nla_put_failure; 1360 1361 nl_limits = nla_nest_start_noflag(msg, 1362 NL80211_IFACE_COMB_LIMITS); 1363 if (!nl_limits) 1364 goto nla_put_failure; 1365 1366 for (j = 0; j < c->n_limits; j++) { 1367 struct nlattr *nl_limit; 1368 1369 nl_limit = nla_nest_start_noflag(msg, j + 1); 1370 if (!nl_limit) 1371 goto nla_put_failure; 1372 if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX, 1373 c->limits[j].max)) 1374 goto nla_put_failure; 1375 if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES, 1376 c->limits[j].types)) 1377 goto nla_put_failure; 1378 nla_nest_end(msg, nl_limit); 1379 } 1380 1381 nla_nest_end(msg, nl_limits); 1382 1383 if (c->beacon_int_infra_match && 1384 nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH)) 1385 goto nla_put_failure; 1386 if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS, 1387 c->num_different_channels) || 1388 nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM, 1389 c->max_interfaces)) 1390 goto nla_put_failure; 1391 if (large && 1392 (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS, 1393 c->radar_detect_widths) || 1394 nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS, 1395 c->radar_detect_regions))) 1396 goto nla_put_failure; 1397 if (c->beacon_int_min_gcd && 1398 nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD, 1399 c->beacon_int_min_gcd)) 1400 goto nla_put_failure; 1401 1402 nla_nest_end(msg, nl_combi); 1403 } 1404 1405 nla_nest_end(msg, nl_combis); 1406 1407 return 0; 1408 nla_put_failure: 1409 return -ENOBUFS; 1410 } 1411 1412 #ifdef CONFIG_PM 1413 static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev, 1414 struct sk_buff *msg) 1415 { 1416 const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp; 1417 struct nlattr *nl_tcp; 1418 1419 if (!tcp) 1420 return 0; 1421 1422 nl_tcp = nla_nest_start_noflag(msg, 1423 NL80211_WOWLAN_TRIG_TCP_CONNECTION); 1424 if (!nl_tcp) 1425 return -ENOBUFS; 1426 1427 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 1428 tcp->data_payload_max)) 1429 return -ENOBUFS; 1430 1431 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 1432 tcp->data_payload_max)) 1433 return -ENOBUFS; 1434 1435 if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ)) 1436 return -ENOBUFS; 1437 1438 if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 1439 sizeof(*tcp->tok), tcp->tok)) 1440 return -ENOBUFS; 1441 1442 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 1443 tcp->data_interval_max)) 1444 return -ENOBUFS; 1445 1446 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 1447 tcp->wake_payload_max)) 1448 return -ENOBUFS; 1449 1450 nla_nest_end(msg, nl_tcp); 1451 return 0; 1452 } 1453 1454 static int nl80211_send_wowlan(struct sk_buff *msg, 1455 struct cfg80211_registered_device *rdev, 1456 bool large) 1457 { 1458 struct nlattr *nl_wowlan; 1459 1460 if (!rdev->wiphy.wowlan) 1461 return 0; 1462 1463 nl_wowlan = nla_nest_start_noflag(msg, 1464 NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED); 1465 if (!nl_wowlan) 1466 return -ENOBUFS; 1467 1468 if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) && 1469 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 1470 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) && 1471 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 1472 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) && 1473 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 1474 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) && 1475 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED)) || 1476 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && 1477 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 1478 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) && 1479 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 1480 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) && 1481 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 1482 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) && 1483 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 1484 return -ENOBUFS; 1485 1486 if (rdev->wiphy.wowlan->n_patterns) { 1487 struct nl80211_pattern_support pat = { 1488 .max_patterns = rdev->wiphy.wowlan->n_patterns, 1489 .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len, 1490 .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len, 1491 .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset, 1492 }; 1493 1494 if (nla_put(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN, 1495 sizeof(pat), &pat)) 1496 return -ENOBUFS; 1497 } 1498 1499 if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) && 1500 nla_put_u32(msg, NL80211_WOWLAN_TRIG_NET_DETECT, 1501 rdev->wiphy.wowlan->max_nd_match_sets)) 1502 return -ENOBUFS; 1503 1504 if (large && nl80211_send_wowlan_tcp_caps(rdev, msg)) 1505 return -ENOBUFS; 1506 1507 nla_nest_end(msg, nl_wowlan); 1508 1509 return 0; 1510 } 1511 #endif 1512 1513 static int nl80211_send_coalesce(struct sk_buff *msg, 1514 struct cfg80211_registered_device *rdev) 1515 { 1516 struct nl80211_coalesce_rule_support rule; 1517 1518 if (!rdev->wiphy.coalesce) 1519 return 0; 1520 1521 rule.max_rules = rdev->wiphy.coalesce->n_rules; 1522 rule.max_delay = rdev->wiphy.coalesce->max_delay; 1523 rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns; 1524 rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len; 1525 rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len; 1526 rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset; 1527 1528 if (nla_put(msg, NL80211_ATTR_COALESCE_RULE, sizeof(rule), &rule)) 1529 return -ENOBUFS; 1530 1531 return 0; 1532 } 1533 1534 static int 1535 nl80211_send_iftype_data(struct sk_buff *msg, 1536 const struct ieee80211_sband_iftype_data *iftdata) 1537 { 1538 const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap; 1539 1540 if (nl80211_put_iftypes(msg, NL80211_BAND_IFTYPE_ATTR_IFTYPES, 1541 iftdata->types_mask)) 1542 return -ENOBUFS; 1543 1544 if (he_cap->has_he) { 1545 if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC, 1546 sizeof(he_cap->he_cap_elem.mac_cap_info), 1547 he_cap->he_cap_elem.mac_cap_info) || 1548 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY, 1549 sizeof(he_cap->he_cap_elem.phy_cap_info), 1550 he_cap->he_cap_elem.phy_cap_info) || 1551 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET, 1552 sizeof(he_cap->he_mcs_nss_supp), 1553 &he_cap->he_mcs_nss_supp) || 1554 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE, 1555 sizeof(he_cap->ppe_thres), he_cap->ppe_thres)) 1556 return -ENOBUFS; 1557 } 1558 1559 return 0; 1560 } 1561 1562 static int nl80211_send_band_rateinfo(struct sk_buff *msg, 1563 struct ieee80211_supported_band *sband) 1564 { 1565 struct nlattr *nl_rates, *nl_rate; 1566 struct ieee80211_rate *rate; 1567 int i; 1568 1569 /* add HT info */ 1570 if (sband->ht_cap.ht_supported && 1571 (nla_put(msg, NL80211_BAND_ATTR_HT_MCS_SET, 1572 sizeof(sband->ht_cap.mcs), 1573 &sband->ht_cap.mcs) || 1574 nla_put_u16(msg, NL80211_BAND_ATTR_HT_CAPA, 1575 sband->ht_cap.cap) || 1576 nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR, 1577 sband->ht_cap.ampdu_factor) || 1578 nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY, 1579 sband->ht_cap.ampdu_density))) 1580 return -ENOBUFS; 1581 1582 /* add VHT info */ 1583 if (sband->vht_cap.vht_supported && 1584 (nla_put(msg, NL80211_BAND_ATTR_VHT_MCS_SET, 1585 sizeof(sband->vht_cap.vht_mcs), 1586 &sband->vht_cap.vht_mcs) || 1587 nla_put_u32(msg, NL80211_BAND_ATTR_VHT_CAPA, 1588 sband->vht_cap.cap))) 1589 return -ENOBUFS; 1590 1591 if (sband->n_iftype_data) { 1592 struct nlattr *nl_iftype_data = 1593 nla_nest_start_noflag(msg, 1594 NL80211_BAND_ATTR_IFTYPE_DATA); 1595 int err; 1596 1597 if (!nl_iftype_data) 1598 return -ENOBUFS; 1599 1600 for (i = 0; i < sband->n_iftype_data; i++) { 1601 struct nlattr *iftdata; 1602 1603 iftdata = nla_nest_start_noflag(msg, i + 1); 1604 if (!iftdata) 1605 return -ENOBUFS; 1606 1607 err = nl80211_send_iftype_data(msg, 1608 &sband->iftype_data[i]); 1609 if (err) 1610 return err; 1611 1612 nla_nest_end(msg, iftdata); 1613 } 1614 1615 nla_nest_end(msg, nl_iftype_data); 1616 } 1617 1618 /* add EDMG info */ 1619 if (sband->edmg_cap.channels && 1620 (nla_put_u8(msg, NL80211_BAND_ATTR_EDMG_CHANNELS, 1621 sband->edmg_cap.channels) || 1622 nla_put_u8(msg, NL80211_BAND_ATTR_EDMG_BW_CONFIG, 1623 sband->edmg_cap.bw_config))) 1624 1625 return -ENOBUFS; 1626 1627 /* add bitrates */ 1628 nl_rates = nla_nest_start_noflag(msg, NL80211_BAND_ATTR_RATES); 1629 if (!nl_rates) 1630 return -ENOBUFS; 1631 1632 for (i = 0; i < sband->n_bitrates; i++) { 1633 nl_rate = nla_nest_start_noflag(msg, i); 1634 if (!nl_rate) 1635 return -ENOBUFS; 1636 1637 rate = &sband->bitrates[i]; 1638 if (nla_put_u32(msg, NL80211_BITRATE_ATTR_RATE, 1639 rate->bitrate)) 1640 return -ENOBUFS; 1641 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && 1642 nla_put_flag(msg, 1643 NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE)) 1644 return -ENOBUFS; 1645 1646 nla_nest_end(msg, nl_rate); 1647 } 1648 1649 nla_nest_end(msg, nl_rates); 1650 1651 return 0; 1652 } 1653 1654 static int 1655 nl80211_send_mgmt_stypes(struct sk_buff *msg, 1656 const struct ieee80211_txrx_stypes *mgmt_stypes) 1657 { 1658 u16 stypes; 1659 struct nlattr *nl_ftypes, *nl_ifs; 1660 enum nl80211_iftype ift; 1661 int i; 1662 1663 if (!mgmt_stypes) 1664 return 0; 1665 1666 nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_TX_FRAME_TYPES); 1667 if (!nl_ifs) 1668 return -ENOBUFS; 1669 1670 for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) { 1671 nl_ftypes = nla_nest_start_noflag(msg, ift); 1672 if (!nl_ftypes) 1673 return -ENOBUFS; 1674 i = 0; 1675 stypes = mgmt_stypes[ift].tx; 1676 while (stypes) { 1677 if ((stypes & 1) && 1678 nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE, 1679 (i << 4) | IEEE80211_FTYPE_MGMT)) 1680 return -ENOBUFS; 1681 stypes >>= 1; 1682 i++; 1683 } 1684 nla_nest_end(msg, nl_ftypes); 1685 } 1686 1687 nla_nest_end(msg, nl_ifs); 1688 1689 nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_RX_FRAME_TYPES); 1690 if (!nl_ifs) 1691 return -ENOBUFS; 1692 1693 for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) { 1694 nl_ftypes = nla_nest_start_noflag(msg, ift); 1695 if (!nl_ftypes) 1696 return -ENOBUFS; 1697 i = 0; 1698 stypes = mgmt_stypes[ift].rx; 1699 while (stypes) { 1700 if ((stypes & 1) && 1701 nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE, 1702 (i << 4) | IEEE80211_FTYPE_MGMT)) 1703 return -ENOBUFS; 1704 stypes >>= 1; 1705 i++; 1706 } 1707 nla_nest_end(msg, nl_ftypes); 1708 } 1709 nla_nest_end(msg, nl_ifs); 1710 1711 return 0; 1712 } 1713 1714 #define CMD(op, n) \ 1715 do { \ 1716 if (rdev->ops->op) { \ 1717 i++; \ 1718 if (nla_put_u32(msg, i, NL80211_CMD_ ## n)) \ 1719 goto nla_put_failure; \ 1720 } \ 1721 } while (0) 1722 1723 static int nl80211_add_commands_unsplit(struct cfg80211_registered_device *rdev, 1724 struct sk_buff *msg) 1725 { 1726 int i = 0; 1727 1728 /* 1729 * do *NOT* add anything into this function, new things need to be 1730 * advertised only to new versions of userspace that can deal with 1731 * the split (and they can't possibly care about new features... 1732 */ 1733 CMD(add_virtual_intf, NEW_INTERFACE); 1734 CMD(change_virtual_intf, SET_INTERFACE); 1735 CMD(add_key, NEW_KEY); 1736 CMD(start_ap, START_AP); 1737 CMD(add_station, NEW_STATION); 1738 CMD(add_mpath, NEW_MPATH); 1739 CMD(update_mesh_config, SET_MESH_CONFIG); 1740 CMD(change_bss, SET_BSS); 1741 CMD(auth, AUTHENTICATE); 1742 CMD(assoc, ASSOCIATE); 1743 CMD(deauth, DEAUTHENTICATE); 1744 CMD(disassoc, DISASSOCIATE); 1745 CMD(join_ibss, JOIN_IBSS); 1746 CMD(join_mesh, JOIN_MESH); 1747 CMD(set_pmksa, SET_PMKSA); 1748 CMD(del_pmksa, DEL_PMKSA); 1749 CMD(flush_pmksa, FLUSH_PMKSA); 1750 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) 1751 CMD(remain_on_channel, REMAIN_ON_CHANNEL); 1752 CMD(set_bitrate_mask, SET_TX_BITRATE_MASK); 1753 CMD(mgmt_tx, FRAME); 1754 CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL); 1755 if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) { 1756 i++; 1757 if (nla_put_u32(msg, i, NL80211_CMD_SET_WIPHY_NETNS)) 1758 goto nla_put_failure; 1759 } 1760 if (rdev->ops->set_monitor_channel || rdev->ops->start_ap || 1761 rdev->ops->join_mesh) { 1762 i++; 1763 if (nla_put_u32(msg, i, NL80211_CMD_SET_CHANNEL)) 1764 goto nla_put_failure; 1765 } 1766 CMD(set_wds_peer, SET_WDS_PEER); 1767 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) { 1768 CMD(tdls_mgmt, TDLS_MGMT); 1769 CMD(tdls_oper, TDLS_OPER); 1770 } 1771 if (rdev->wiphy.max_sched_scan_reqs) 1772 CMD(sched_scan_start, START_SCHED_SCAN); 1773 CMD(probe_client, PROBE_CLIENT); 1774 CMD(set_noack_map, SET_NOACK_MAP); 1775 if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) { 1776 i++; 1777 if (nla_put_u32(msg, i, NL80211_CMD_REGISTER_BEACONS)) 1778 goto nla_put_failure; 1779 } 1780 CMD(start_p2p_device, START_P2P_DEVICE); 1781 CMD(set_mcast_rate, SET_MCAST_RATE); 1782 #ifdef CONFIG_NL80211_TESTMODE 1783 CMD(testmode_cmd, TESTMODE); 1784 #endif 1785 1786 if (rdev->ops->connect || rdev->ops->auth) { 1787 i++; 1788 if (nla_put_u32(msg, i, NL80211_CMD_CONNECT)) 1789 goto nla_put_failure; 1790 } 1791 1792 if (rdev->ops->disconnect || rdev->ops->deauth) { 1793 i++; 1794 if (nla_put_u32(msg, i, NL80211_CMD_DISCONNECT)) 1795 goto nla_put_failure; 1796 } 1797 1798 return i; 1799 nla_put_failure: 1800 return -ENOBUFS; 1801 } 1802 1803 static int 1804 nl80211_send_pmsr_ftm_capa(const struct cfg80211_pmsr_capabilities *cap, 1805 struct sk_buff *msg) 1806 { 1807 struct nlattr *ftm; 1808 1809 if (!cap->ftm.supported) 1810 return 0; 1811 1812 ftm = nla_nest_start_noflag(msg, NL80211_PMSR_TYPE_FTM); 1813 if (!ftm) 1814 return -ENOBUFS; 1815 1816 if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP)) 1817 return -ENOBUFS; 1818 if (cap->ftm.non_asap && 1819 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP)) 1820 return -ENOBUFS; 1821 if (cap->ftm.request_lci && 1822 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI)) 1823 return -ENOBUFS; 1824 if (cap->ftm.request_civicloc && 1825 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_CIVICLOC)) 1826 return -ENOBUFS; 1827 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES, 1828 cap->ftm.preambles)) 1829 return -ENOBUFS; 1830 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS, 1831 cap->ftm.bandwidths)) 1832 return -ENOBUFS; 1833 if (cap->ftm.max_bursts_exponent >= 0 && 1834 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT, 1835 cap->ftm.max_bursts_exponent)) 1836 return -ENOBUFS; 1837 if (cap->ftm.max_ftms_per_burst && 1838 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST, 1839 cap->ftm.max_ftms_per_burst)) 1840 return -ENOBUFS; 1841 1842 nla_nest_end(msg, ftm); 1843 return 0; 1844 } 1845 1846 static int nl80211_send_pmsr_capa(struct cfg80211_registered_device *rdev, 1847 struct sk_buff *msg) 1848 { 1849 const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa; 1850 struct nlattr *pmsr, *caps; 1851 1852 if (!cap) 1853 return 0; 1854 1855 /* 1856 * we don't need to clean up anything here since the caller 1857 * will genlmsg_cancel() if we fail 1858 */ 1859 1860 pmsr = nla_nest_start_noflag(msg, NL80211_ATTR_PEER_MEASUREMENTS); 1861 if (!pmsr) 1862 return -ENOBUFS; 1863 1864 if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers)) 1865 return -ENOBUFS; 1866 1867 if (cap->report_ap_tsf && 1868 nla_put_flag(msg, NL80211_PMSR_ATTR_REPORT_AP_TSF)) 1869 return -ENOBUFS; 1870 1871 if (cap->randomize_mac_addr && 1872 nla_put_flag(msg, NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR)) 1873 return -ENOBUFS; 1874 1875 caps = nla_nest_start_noflag(msg, NL80211_PMSR_ATTR_TYPE_CAPA); 1876 if (!caps) 1877 return -ENOBUFS; 1878 1879 if (nl80211_send_pmsr_ftm_capa(cap, msg)) 1880 return -ENOBUFS; 1881 1882 nla_nest_end(msg, caps); 1883 nla_nest_end(msg, pmsr); 1884 1885 return 0; 1886 } 1887 1888 struct nl80211_dump_wiphy_state { 1889 s64 filter_wiphy; 1890 long start; 1891 long split_start, band_start, chan_start, capa_start; 1892 bool split; 1893 }; 1894 1895 static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, 1896 enum nl80211_commands cmd, 1897 struct sk_buff *msg, u32 portid, u32 seq, 1898 int flags, struct nl80211_dump_wiphy_state *state) 1899 { 1900 void *hdr; 1901 struct nlattr *nl_bands, *nl_band; 1902 struct nlattr *nl_freqs, *nl_freq; 1903 struct nlattr *nl_cmds; 1904 enum nl80211_band band; 1905 struct ieee80211_channel *chan; 1906 int i; 1907 const struct ieee80211_txrx_stypes *mgmt_stypes = 1908 rdev->wiphy.mgmt_stypes; 1909 u32 features; 1910 1911 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 1912 if (!hdr) 1913 return -ENOBUFS; 1914 1915 if (WARN_ON(!state)) 1916 return -EINVAL; 1917 1918 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 1919 nla_put_string(msg, NL80211_ATTR_WIPHY_NAME, 1920 wiphy_name(&rdev->wiphy)) || 1921 nla_put_u32(msg, NL80211_ATTR_GENERATION, 1922 cfg80211_rdev_list_generation)) 1923 goto nla_put_failure; 1924 1925 if (cmd != NL80211_CMD_NEW_WIPHY) 1926 goto finish; 1927 1928 switch (state->split_start) { 1929 case 0: 1930 if (nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT, 1931 rdev->wiphy.retry_short) || 1932 nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_LONG, 1933 rdev->wiphy.retry_long) || 1934 nla_put_u32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD, 1935 rdev->wiphy.frag_threshold) || 1936 nla_put_u32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD, 1937 rdev->wiphy.rts_threshold) || 1938 nla_put_u8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS, 1939 rdev->wiphy.coverage_class) || 1940 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS, 1941 rdev->wiphy.max_scan_ssids) || 1942 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS, 1943 rdev->wiphy.max_sched_scan_ssids) || 1944 nla_put_u16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN, 1945 rdev->wiphy.max_scan_ie_len) || 1946 nla_put_u16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN, 1947 rdev->wiphy.max_sched_scan_ie_len) || 1948 nla_put_u8(msg, NL80211_ATTR_MAX_MATCH_SETS, 1949 rdev->wiphy.max_match_sets) || 1950 nla_put_u32(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS, 1951 rdev->wiphy.max_sched_scan_plans) || 1952 nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL, 1953 rdev->wiphy.max_sched_scan_plan_interval) || 1954 nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS, 1955 rdev->wiphy.max_sched_scan_plan_iterations)) 1956 goto nla_put_failure; 1957 1958 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) && 1959 nla_put_flag(msg, NL80211_ATTR_SUPPORT_IBSS_RSN)) 1960 goto nla_put_failure; 1961 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) && 1962 nla_put_flag(msg, NL80211_ATTR_SUPPORT_MESH_AUTH)) 1963 goto nla_put_failure; 1964 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) && 1965 nla_put_flag(msg, NL80211_ATTR_SUPPORT_AP_UAPSD)) 1966 goto nla_put_failure; 1967 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) && 1968 nla_put_flag(msg, NL80211_ATTR_ROAM_SUPPORT)) 1969 goto nla_put_failure; 1970 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) && 1971 nla_put_flag(msg, NL80211_ATTR_TDLS_SUPPORT)) 1972 goto nla_put_failure; 1973 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) && 1974 nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP)) 1975 goto nla_put_failure; 1976 state->split_start++; 1977 if (state->split) 1978 break; 1979 /* fall through */ 1980 case 1: 1981 if (nla_put(msg, NL80211_ATTR_CIPHER_SUITES, 1982 sizeof(u32) * rdev->wiphy.n_cipher_suites, 1983 rdev->wiphy.cipher_suites)) 1984 goto nla_put_failure; 1985 1986 if (nla_put_u8(msg, NL80211_ATTR_MAX_NUM_PMKIDS, 1987 rdev->wiphy.max_num_pmkids)) 1988 goto nla_put_failure; 1989 1990 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && 1991 nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE)) 1992 goto nla_put_failure; 1993 1994 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX, 1995 rdev->wiphy.available_antennas_tx) || 1996 nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX, 1997 rdev->wiphy.available_antennas_rx)) 1998 goto nla_put_failure; 1999 2000 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) && 2001 nla_put_u32(msg, NL80211_ATTR_PROBE_RESP_OFFLOAD, 2002 rdev->wiphy.probe_resp_offload)) 2003 goto nla_put_failure; 2004 2005 if ((rdev->wiphy.available_antennas_tx || 2006 rdev->wiphy.available_antennas_rx) && 2007 rdev->ops->get_antenna) { 2008 u32 tx_ant = 0, rx_ant = 0; 2009 int res; 2010 2011 res = rdev_get_antenna(rdev, &tx_ant, &rx_ant); 2012 if (!res) { 2013 if (nla_put_u32(msg, 2014 NL80211_ATTR_WIPHY_ANTENNA_TX, 2015 tx_ant) || 2016 nla_put_u32(msg, 2017 NL80211_ATTR_WIPHY_ANTENNA_RX, 2018 rx_ant)) 2019 goto nla_put_failure; 2020 } 2021 } 2022 2023 state->split_start++; 2024 if (state->split) 2025 break; 2026 /* fall through */ 2027 case 2: 2028 if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES, 2029 rdev->wiphy.interface_modes)) 2030 goto nla_put_failure; 2031 state->split_start++; 2032 if (state->split) 2033 break; 2034 /* fall through */ 2035 case 3: 2036 nl_bands = nla_nest_start_noflag(msg, 2037 NL80211_ATTR_WIPHY_BANDS); 2038 if (!nl_bands) 2039 goto nla_put_failure; 2040 2041 for (band = state->band_start; 2042 band < NUM_NL80211_BANDS; band++) { 2043 struct ieee80211_supported_band *sband; 2044 2045 sband = rdev->wiphy.bands[band]; 2046 2047 if (!sband) 2048 continue; 2049 2050 nl_band = nla_nest_start_noflag(msg, band); 2051 if (!nl_band) 2052 goto nla_put_failure; 2053 2054 switch (state->chan_start) { 2055 case 0: 2056 if (nl80211_send_band_rateinfo(msg, sband)) 2057 goto nla_put_failure; 2058 state->chan_start++; 2059 if (state->split) 2060 break; 2061 /* fall through */ 2062 default: 2063 /* add frequencies */ 2064 nl_freqs = nla_nest_start_noflag(msg, 2065 NL80211_BAND_ATTR_FREQS); 2066 if (!nl_freqs) 2067 goto nla_put_failure; 2068 2069 for (i = state->chan_start - 1; 2070 i < sband->n_channels; 2071 i++) { 2072 nl_freq = nla_nest_start_noflag(msg, 2073 i); 2074 if (!nl_freq) 2075 goto nla_put_failure; 2076 2077 chan = &sband->channels[i]; 2078 2079 if (nl80211_msg_put_channel( 2080 msg, &rdev->wiphy, chan, 2081 state->split)) 2082 goto nla_put_failure; 2083 2084 nla_nest_end(msg, nl_freq); 2085 if (state->split) 2086 break; 2087 } 2088 if (i < sband->n_channels) 2089 state->chan_start = i + 2; 2090 else 2091 state->chan_start = 0; 2092 nla_nest_end(msg, nl_freqs); 2093 } 2094 2095 nla_nest_end(msg, nl_band); 2096 2097 if (state->split) { 2098 /* start again here */ 2099 if (state->chan_start) 2100 band--; 2101 break; 2102 } 2103 } 2104 nla_nest_end(msg, nl_bands); 2105 2106 if (band < NUM_NL80211_BANDS) 2107 state->band_start = band + 1; 2108 else 2109 state->band_start = 0; 2110 2111 /* if bands & channels are done, continue outside */ 2112 if (state->band_start == 0 && state->chan_start == 0) 2113 state->split_start++; 2114 if (state->split) 2115 break; 2116 /* fall through */ 2117 case 4: 2118 nl_cmds = nla_nest_start_noflag(msg, 2119 NL80211_ATTR_SUPPORTED_COMMANDS); 2120 if (!nl_cmds) 2121 goto nla_put_failure; 2122 2123 i = nl80211_add_commands_unsplit(rdev, msg); 2124 if (i < 0) 2125 goto nla_put_failure; 2126 if (state->split) { 2127 CMD(crit_proto_start, CRIT_PROTOCOL_START); 2128 CMD(crit_proto_stop, CRIT_PROTOCOL_STOP); 2129 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) 2130 CMD(channel_switch, CHANNEL_SWITCH); 2131 CMD(set_qos_map, SET_QOS_MAP); 2132 if (rdev->wiphy.features & 2133 NL80211_FEATURE_SUPPORTS_WMM_ADMISSION) 2134 CMD(add_tx_ts, ADD_TX_TS); 2135 CMD(set_multicast_to_unicast, SET_MULTICAST_TO_UNICAST); 2136 CMD(update_connect_params, UPDATE_CONNECT_PARAMS); 2137 CMD(update_ft_ies, UPDATE_FT_IES); 2138 } 2139 #undef CMD 2140 2141 nla_nest_end(msg, nl_cmds); 2142 state->split_start++; 2143 if (state->split) 2144 break; 2145 /* fall through */ 2146 case 5: 2147 if (rdev->ops->remain_on_channel && 2148 (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) && 2149 nla_put_u32(msg, 2150 NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION, 2151 rdev->wiphy.max_remain_on_channel_duration)) 2152 goto nla_put_failure; 2153 2154 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) && 2155 nla_put_flag(msg, NL80211_ATTR_OFFCHANNEL_TX_OK)) 2156 goto nla_put_failure; 2157 2158 if (nl80211_send_mgmt_stypes(msg, mgmt_stypes)) 2159 goto nla_put_failure; 2160 state->split_start++; 2161 if (state->split) 2162 break; 2163 /* fall through */ 2164 case 6: 2165 #ifdef CONFIG_PM 2166 if (nl80211_send_wowlan(msg, rdev, state->split)) 2167 goto nla_put_failure; 2168 state->split_start++; 2169 if (state->split) 2170 break; 2171 #else 2172 state->split_start++; 2173 #endif 2174 /* fall through */ 2175 case 7: 2176 if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES, 2177 rdev->wiphy.software_iftypes)) 2178 goto nla_put_failure; 2179 2180 if (nl80211_put_iface_combinations(&rdev->wiphy, msg, 2181 state->split)) 2182 goto nla_put_failure; 2183 2184 state->split_start++; 2185 if (state->split) 2186 break; 2187 /* fall through */ 2188 case 8: 2189 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) && 2190 nla_put_u32(msg, NL80211_ATTR_DEVICE_AP_SME, 2191 rdev->wiphy.ap_sme_capa)) 2192 goto nla_put_failure; 2193 2194 features = rdev->wiphy.features; 2195 /* 2196 * We can only add the per-channel limit information if the 2197 * dump is split, otherwise it makes it too big. Therefore 2198 * only advertise it in that case. 2199 */ 2200 if (state->split) 2201 features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS; 2202 if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features)) 2203 goto nla_put_failure; 2204 2205 if (rdev->wiphy.ht_capa_mod_mask && 2206 nla_put(msg, NL80211_ATTR_HT_CAPABILITY_MASK, 2207 sizeof(*rdev->wiphy.ht_capa_mod_mask), 2208 rdev->wiphy.ht_capa_mod_mask)) 2209 goto nla_put_failure; 2210 2211 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME && 2212 rdev->wiphy.max_acl_mac_addrs && 2213 nla_put_u32(msg, NL80211_ATTR_MAC_ACL_MAX, 2214 rdev->wiphy.max_acl_mac_addrs)) 2215 goto nla_put_failure; 2216 2217 /* 2218 * Any information below this point is only available to 2219 * applications that can deal with it being split. This 2220 * helps ensure that newly added capabilities don't break 2221 * older tools by overrunning their buffers. 2222 * 2223 * We still increment split_start so that in the split 2224 * case we'll continue with more data in the next round, 2225 * but break unconditionally so unsplit data stops here. 2226 */ 2227 state->split_start++; 2228 break; 2229 case 9: 2230 if (rdev->wiphy.extended_capabilities && 2231 (nla_put(msg, NL80211_ATTR_EXT_CAPA, 2232 rdev->wiphy.extended_capabilities_len, 2233 rdev->wiphy.extended_capabilities) || 2234 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK, 2235 rdev->wiphy.extended_capabilities_len, 2236 rdev->wiphy.extended_capabilities_mask))) 2237 goto nla_put_failure; 2238 2239 if (rdev->wiphy.vht_capa_mod_mask && 2240 nla_put(msg, NL80211_ATTR_VHT_CAPABILITY_MASK, 2241 sizeof(*rdev->wiphy.vht_capa_mod_mask), 2242 rdev->wiphy.vht_capa_mod_mask)) 2243 goto nla_put_failure; 2244 2245 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 2246 rdev->wiphy.perm_addr)) 2247 goto nla_put_failure; 2248 2249 if (!is_zero_ether_addr(rdev->wiphy.addr_mask) && 2250 nla_put(msg, NL80211_ATTR_MAC_MASK, ETH_ALEN, 2251 rdev->wiphy.addr_mask)) 2252 goto nla_put_failure; 2253 2254 if (rdev->wiphy.n_addresses > 1) { 2255 void *attr; 2256 2257 attr = nla_nest_start(msg, NL80211_ATTR_MAC_ADDRS); 2258 if (!attr) 2259 goto nla_put_failure; 2260 2261 for (i = 0; i < rdev->wiphy.n_addresses; i++) 2262 if (nla_put(msg, i + 1, ETH_ALEN, 2263 rdev->wiphy.addresses[i].addr)) 2264 goto nla_put_failure; 2265 2266 nla_nest_end(msg, attr); 2267 } 2268 2269 state->split_start++; 2270 break; 2271 case 10: 2272 if (nl80211_send_coalesce(msg, rdev)) 2273 goto nla_put_failure; 2274 2275 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) && 2276 (nla_put_flag(msg, NL80211_ATTR_SUPPORT_5_MHZ) || 2277 nla_put_flag(msg, NL80211_ATTR_SUPPORT_10_MHZ))) 2278 goto nla_put_failure; 2279 2280 if (rdev->wiphy.max_ap_assoc_sta && 2281 nla_put_u32(msg, NL80211_ATTR_MAX_AP_ASSOC_STA, 2282 rdev->wiphy.max_ap_assoc_sta)) 2283 goto nla_put_failure; 2284 2285 state->split_start++; 2286 break; 2287 case 11: 2288 if (rdev->wiphy.n_vendor_commands) { 2289 const struct nl80211_vendor_cmd_info *info; 2290 struct nlattr *nested; 2291 2292 nested = nla_nest_start_noflag(msg, 2293 NL80211_ATTR_VENDOR_DATA); 2294 if (!nested) 2295 goto nla_put_failure; 2296 2297 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { 2298 info = &rdev->wiphy.vendor_commands[i].info; 2299 if (nla_put(msg, i + 1, sizeof(*info), info)) 2300 goto nla_put_failure; 2301 } 2302 nla_nest_end(msg, nested); 2303 } 2304 2305 if (rdev->wiphy.n_vendor_events) { 2306 const struct nl80211_vendor_cmd_info *info; 2307 struct nlattr *nested; 2308 2309 nested = nla_nest_start_noflag(msg, 2310 NL80211_ATTR_VENDOR_EVENTS); 2311 if (!nested) 2312 goto nla_put_failure; 2313 2314 for (i = 0; i < rdev->wiphy.n_vendor_events; i++) { 2315 info = &rdev->wiphy.vendor_events[i]; 2316 if (nla_put(msg, i + 1, sizeof(*info), info)) 2317 goto nla_put_failure; 2318 } 2319 nla_nest_end(msg, nested); 2320 } 2321 state->split_start++; 2322 break; 2323 case 12: 2324 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH && 2325 nla_put_u8(msg, NL80211_ATTR_MAX_CSA_COUNTERS, 2326 rdev->wiphy.max_num_csa_counters)) 2327 goto nla_put_failure; 2328 2329 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 2330 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 2331 goto nla_put_failure; 2332 2333 if (rdev->wiphy.max_sched_scan_reqs && 2334 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_MAX_REQS, 2335 rdev->wiphy.max_sched_scan_reqs)) 2336 goto nla_put_failure; 2337 2338 if (nla_put(msg, NL80211_ATTR_EXT_FEATURES, 2339 sizeof(rdev->wiphy.ext_features), 2340 rdev->wiphy.ext_features)) 2341 goto nla_put_failure; 2342 2343 if (rdev->wiphy.bss_select_support) { 2344 struct nlattr *nested; 2345 u32 bss_select_support = rdev->wiphy.bss_select_support; 2346 2347 nested = nla_nest_start_noflag(msg, 2348 NL80211_ATTR_BSS_SELECT); 2349 if (!nested) 2350 goto nla_put_failure; 2351 2352 i = 0; 2353 while (bss_select_support) { 2354 if ((bss_select_support & 1) && 2355 nla_put_flag(msg, i)) 2356 goto nla_put_failure; 2357 i++; 2358 bss_select_support >>= 1; 2359 } 2360 nla_nest_end(msg, nested); 2361 } 2362 2363 state->split_start++; 2364 break; 2365 case 13: 2366 if (rdev->wiphy.num_iftype_ext_capab && 2367 rdev->wiphy.iftype_ext_capab) { 2368 struct nlattr *nested_ext_capab, *nested; 2369 2370 nested = nla_nest_start_noflag(msg, 2371 NL80211_ATTR_IFTYPE_EXT_CAPA); 2372 if (!nested) 2373 goto nla_put_failure; 2374 2375 for (i = state->capa_start; 2376 i < rdev->wiphy.num_iftype_ext_capab; i++) { 2377 const struct wiphy_iftype_ext_capab *capab; 2378 2379 capab = &rdev->wiphy.iftype_ext_capab[i]; 2380 2381 nested_ext_capab = nla_nest_start_noflag(msg, 2382 i); 2383 if (!nested_ext_capab || 2384 nla_put_u32(msg, NL80211_ATTR_IFTYPE, 2385 capab->iftype) || 2386 nla_put(msg, NL80211_ATTR_EXT_CAPA, 2387 capab->extended_capabilities_len, 2388 capab->extended_capabilities) || 2389 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK, 2390 capab->extended_capabilities_len, 2391 capab->extended_capabilities_mask)) 2392 goto nla_put_failure; 2393 2394 nla_nest_end(msg, nested_ext_capab); 2395 if (state->split) 2396 break; 2397 } 2398 nla_nest_end(msg, nested); 2399 if (i < rdev->wiphy.num_iftype_ext_capab) { 2400 state->capa_start = i + 1; 2401 break; 2402 } 2403 } 2404 2405 if (nla_put_u32(msg, NL80211_ATTR_BANDS, 2406 rdev->wiphy.nan_supported_bands)) 2407 goto nla_put_failure; 2408 2409 if (wiphy_ext_feature_isset(&rdev->wiphy, 2410 NL80211_EXT_FEATURE_TXQS)) { 2411 struct cfg80211_txq_stats txqstats = {}; 2412 int res; 2413 2414 res = rdev_get_txq_stats(rdev, NULL, &txqstats); 2415 if (!res && 2416 !nl80211_put_txq_stats(msg, &txqstats, 2417 NL80211_ATTR_TXQ_STATS)) 2418 goto nla_put_failure; 2419 2420 if (nla_put_u32(msg, NL80211_ATTR_TXQ_LIMIT, 2421 rdev->wiphy.txq_limit)) 2422 goto nla_put_failure; 2423 if (nla_put_u32(msg, NL80211_ATTR_TXQ_MEMORY_LIMIT, 2424 rdev->wiphy.txq_memory_limit)) 2425 goto nla_put_failure; 2426 if (nla_put_u32(msg, NL80211_ATTR_TXQ_QUANTUM, 2427 rdev->wiphy.txq_quantum)) 2428 goto nla_put_failure; 2429 } 2430 2431 state->split_start++; 2432 break; 2433 case 14: 2434 if (nl80211_send_pmsr_capa(rdev, msg)) 2435 goto nla_put_failure; 2436 2437 state->split_start++; 2438 break; 2439 case 15: 2440 if (rdev->wiphy.akm_suites && 2441 nla_put(msg, NL80211_ATTR_AKM_SUITES, 2442 sizeof(u32) * rdev->wiphy.n_akm_suites, 2443 rdev->wiphy.akm_suites)) 2444 goto nla_put_failure; 2445 2446 /* done */ 2447 state->split_start = 0; 2448 break; 2449 } 2450 finish: 2451 genlmsg_end(msg, hdr); 2452 return 0; 2453 2454 nla_put_failure: 2455 genlmsg_cancel(msg, hdr); 2456 return -EMSGSIZE; 2457 } 2458 2459 static int nl80211_dump_wiphy_parse(struct sk_buff *skb, 2460 struct netlink_callback *cb, 2461 struct nl80211_dump_wiphy_state *state) 2462 { 2463 struct nlattr **tb = kcalloc(NUM_NL80211_ATTR, sizeof(*tb), GFP_KERNEL); 2464 int ret; 2465 2466 if (!tb) 2467 return -ENOMEM; 2468 2469 ret = nlmsg_parse_deprecated(cb->nlh, 2470 GENL_HDRLEN + nl80211_fam.hdrsize, 2471 tb, nl80211_fam.maxattr, 2472 nl80211_policy, NULL); 2473 /* ignore parse errors for backward compatibility */ 2474 if (ret) { 2475 ret = 0; 2476 goto out; 2477 } 2478 2479 state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; 2480 if (tb[NL80211_ATTR_WIPHY]) 2481 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]); 2482 if (tb[NL80211_ATTR_WDEV]) 2483 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32; 2484 if (tb[NL80211_ATTR_IFINDEX]) { 2485 struct net_device *netdev; 2486 struct cfg80211_registered_device *rdev; 2487 int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]); 2488 2489 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx); 2490 if (!netdev) { 2491 ret = -ENODEV; 2492 goto out; 2493 } 2494 if (netdev->ieee80211_ptr) { 2495 rdev = wiphy_to_rdev( 2496 netdev->ieee80211_ptr->wiphy); 2497 state->filter_wiphy = rdev->wiphy_idx; 2498 } 2499 } 2500 2501 ret = 0; 2502 out: 2503 kfree(tb); 2504 return ret; 2505 } 2506 2507 static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb) 2508 { 2509 int idx = 0, ret; 2510 struct nl80211_dump_wiphy_state *state = (void *)cb->args[0]; 2511 struct cfg80211_registered_device *rdev; 2512 2513 rtnl_lock(); 2514 if (!state) { 2515 state = kzalloc(sizeof(*state), GFP_KERNEL); 2516 if (!state) { 2517 rtnl_unlock(); 2518 return -ENOMEM; 2519 } 2520 state->filter_wiphy = -1; 2521 ret = nl80211_dump_wiphy_parse(skb, cb, state); 2522 if (ret) { 2523 kfree(state); 2524 rtnl_unlock(); 2525 return ret; 2526 } 2527 cb->args[0] = (long)state; 2528 } 2529 2530 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 2531 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) 2532 continue; 2533 if (++idx <= state->start) 2534 continue; 2535 if (state->filter_wiphy != -1 && 2536 state->filter_wiphy != rdev->wiphy_idx) 2537 continue; 2538 /* attempt to fit multiple wiphy data chunks into the skb */ 2539 do { 2540 ret = nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, 2541 skb, 2542 NETLINK_CB(cb->skb).portid, 2543 cb->nlh->nlmsg_seq, 2544 NLM_F_MULTI, state); 2545 if (ret < 0) { 2546 /* 2547 * If sending the wiphy data didn't fit (ENOBUFS 2548 * or EMSGSIZE returned), this SKB is still 2549 * empty (so it's not too big because another 2550 * wiphy dataset is already in the skb) and 2551 * we've not tried to adjust the dump allocation 2552 * yet ... then adjust the alloc size to be 2553 * bigger, and return 1 but with the empty skb. 2554 * This results in an empty message being RX'ed 2555 * in userspace, but that is ignored. 2556 * 2557 * We can then retry with the larger buffer. 2558 */ 2559 if ((ret == -ENOBUFS || ret == -EMSGSIZE) && 2560 !skb->len && !state->split && 2561 cb->min_dump_alloc < 4096) { 2562 cb->min_dump_alloc = 4096; 2563 state->split_start = 0; 2564 rtnl_unlock(); 2565 return 1; 2566 } 2567 idx--; 2568 break; 2569 } 2570 } while (state->split_start > 0); 2571 break; 2572 } 2573 rtnl_unlock(); 2574 2575 state->start = idx; 2576 2577 return skb->len; 2578 } 2579 2580 static int nl80211_dump_wiphy_done(struct netlink_callback *cb) 2581 { 2582 kfree((void *)cb->args[0]); 2583 return 0; 2584 } 2585 2586 static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info) 2587 { 2588 struct sk_buff *msg; 2589 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2590 struct nl80211_dump_wiphy_state state = {}; 2591 2592 msg = nlmsg_new(4096, GFP_KERNEL); 2593 if (!msg) 2594 return -ENOMEM; 2595 2596 if (nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, msg, 2597 info->snd_portid, info->snd_seq, 0, 2598 &state) < 0) { 2599 nlmsg_free(msg); 2600 return -ENOBUFS; 2601 } 2602 2603 return genlmsg_reply(msg, info); 2604 } 2605 2606 static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = { 2607 [NL80211_TXQ_ATTR_QUEUE] = { .type = NLA_U8 }, 2608 [NL80211_TXQ_ATTR_TXOP] = { .type = NLA_U16 }, 2609 [NL80211_TXQ_ATTR_CWMIN] = { .type = NLA_U16 }, 2610 [NL80211_TXQ_ATTR_CWMAX] = { .type = NLA_U16 }, 2611 [NL80211_TXQ_ATTR_AIFS] = { .type = NLA_U8 }, 2612 }; 2613 2614 static int parse_txq_params(struct nlattr *tb[], 2615 struct ieee80211_txq_params *txq_params) 2616 { 2617 u8 ac; 2618 2619 if (!tb[NL80211_TXQ_ATTR_AC] || !tb[NL80211_TXQ_ATTR_TXOP] || 2620 !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] || 2621 !tb[NL80211_TXQ_ATTR_AIFS]) 2622 return -EINVAL; 2623 2624 ac = nla_get_u8(tb[NL80211_TXQ_ATTR_AC]); 2625 txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]); 2626 txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]); 2627 txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]); 2628 txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]); 2629 2630 if (ac >= NL80211_NUM_ACS) 2631 return -EINVAL; 2632 txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS); 2633 return 0; 2634 } 2635 2636 static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev) 2637 { 2638 /* 2639 * You can only set the channel explicitly for WDS interfaces, 2640 * all others have their channel managed via their respective 2641 * "establish a connection" command (connect, join, ...) 2642 * 2643 * For AP/GO and mesh mode, the channel can be set with the 2644 * channel userspace API, but is only stored and passed to the 2645 * low-level driver when the AP starts or the mesh is joined. 2646 * This is for backward compatibility, userspace can also give 2647 * the channel in the start-ap or join-mesh commands instead. 2648 * 2649 * Monitors are special as they are normally slaved to 2650 * whatever else is going on, so they have their own special 2651 * operation to set the monitor channel if possible. 2652 */ 2653 return !wdev || 2654 wdev->iftype == NL80211_IFTYPE_AP || 2655 wdev->iftype == NL80211_IFTYPE_MESH_POINT || 2656 wdev->iftype == NL80211_IFTYPE_MONITOR || 2657 wdev->iftype == NL80211_IFTYPE_P2P_GO; 2658 } 2659 2660 int nl80211_parse_chandef(struct cfg80211_registered_device *rdev, 2661 struct genl_info *info, 2662 struct cfg80211_chan_def *chandef) 2663 { 2664 struct netlink_ext_ack *extack = info->extack; 2665 struct nlattr **attrs = info->attrs; 2666 u32 control_freq; 2667 2668 if (!attrs[NL80211_ATTR_WIPHY_FREQ]) 2669 return -EINVAL; 2670 2671 control_freq = nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ]); 2672 2673 memset(chandef, 0, sizeof(*chandef)); 2674 2675 chandef->chan = ieee80211_get_channel(&rdev->wiphy, control_freq); 2676 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; 2677 chandef->center_freq1 = control_freq; 2678 chandef->center_freq2 = 0; 2679 2680 /* Primary channel not allowed */ 2681 if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED) { 2682 NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ], 2683 "Channel is disabled"); 2684 return -EINVAL; 2685 } 2686 2687 if (attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) { 2688 enum nl80211_channel_type chantype; 2689 2690 chantype = nla_get_u32(attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]); 2691 2692 switch (chantype) { 2693 case NL80211_CHAN_NO_HT: 2694 case NL80211_CHAN_HT20: 2695 case NL80211_CHAN_HT40PLUS: 2696 case NL80211_CHAN_HT40MINUS: 2697 cfg80211_chandef_create(chandef, chandef->chan, 2698 chantype); 2699 /* user input for center_freq is incorrect */ 2700 if (attrs[NL80211_ATTR_CENTER_FREQ1] && 2701 chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) { 2702 NL_SET_ERR_MSG_ATTR(extack, 2703 attrs[NL80211_ATTR_CENTER_FREQ1], 2704 "bad center frequency 1"); 2705 return -EINVAL; 2706 } 2707 /* center_freq2 must be zero */ 2708 if (attrs[NL80211_ATTR_CENTER_FREQ2] && 2709 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2])) { 2710 NL_SET_ERR_MSG_ATTR(extack, 2711 attrs[NL80211_ATTR_CENTER_FREQ2], 2712 "center frequency 2 can't be used"); 2713 return -EINVAL; 2714 } 2715 break; 2716 default: 2717 NL_SET_ERR_MSG_ATTR(extack, 2718 attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE], 2719 "invalid channel type"); 2720 return -EINVAL; 2721 } 2722 } else if (attrs[NL80211_ATTR_CHANNEL_WIDTH]) { 2723 chandef->width = 2724 nla_get_u32(attrs[NL80211_ATTR_CHANNEL_WIDTH]); 2725 if (attrs[NL80211_ATTR_CENTER_FREQ1]) 2726 chandef->center_freq1 = 2727 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1]); 2728 if (attrs[NL80211_ATTR_CENTER_FREQ2]) 2729 chandef->center_freq2 = 2730 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2]); 2731 } 2732 2733 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { 2734 chandef->edmg.channels = 2735 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); 2736 2737 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) 2738 chandef->edmg.bw_config = 2739 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); 2740 } else { 2741 chandef->edmg.bw_config = 0; 2742 chandef->edmg.channels = 0; 2743 } 2744 2745 if (!cfg80211_chandef_valid(chandef)) { 2746 NL_SET_ERR_MSG(extack, "invalid channel definition"); 2747 return -EINVAL; 2748 } 2749 2750 if (!cfg80211_chandef_usable(&rdev->wiphy, chandef, 2751 IEEE80211_CHAN_DISABLED)) { 2752 NL_SET_ERR_MSG(extack, "(extension) channel is disabled"); 2753 return -EINVAL; 2754 } 2755 2756 if ((chandef->width == NL80211_CHAN_WIDTH_5 || 2757 chandef->width == NL80211_CHAN_WIDTH_10) && 2758 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) { 2759 NL_SET_ERR_MSG(extack, "5/10 MHz not supported"); 2760 return -EINVAL; 2761 } 2762 2763 return 0; 2764 } 2765 2766 static int __nl80211_set_channel(struct cfg80211_registered_device *rdev, 2767 struct net_device *dev, 2768 struct genl_info *info) 2769 { 2770 struct cfg80211_chan_def chandef; 2771 int result; 2772 enum nl80211_iftype iftype = NL80211_IFTYPE_MONITOR; 2773 struct wireless_dev *wdev = NULL; 2774 2775 if (dev) 2776 wdev = dev->ieee80211_ptr; 2777 if (!nl80211_can_set_dev_channel(wdev)) 2778 return -EOPNOTSUPP; 2779 if (wdev) 2780 iftype = wdev->iftype; 2781 2782 result = nl80211_parse_chandef(rdev, info, &chandef); 2783 if (result) 2784 return result; 2785 2786 switch (iftype) { 2787 case NL80211_IFTYPE_AP: 2788 case NL80211_IFTYPE_P2P_GO: 2789 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, 2790 iftype)) { 2791 result = -EINVAL; 2792 break; 2793 } 2794 if (wdev->beacon_interval) { 2795 if (!dev || !rdev->ops->set_ap_chanwidth || 2796 !(rdev->wiphy.features & 2797 NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE)) { 2798 result = -EBUSY; 2799 break; 2800 } 2801 2802 /* Only allow dynamic channel width changes */ 2803 if (chandef.chan != wdev->preset_chandef.chan) { 2804 result = -EBUSY; 2805 break; 2806 } 2807 result = rdev_set_ap_chanwidth(rdev, dev, &chandef); 2808 if (result) 2809 break; 2810 } 2811 wdev->preset_chandef = chandef; 2812 result = 0; 2813 break; 2814 case NL80211_IFTYPE_MESH_POINT: 2815 result = cfg80211_set_mesh_channel(rdev, wdev, &chandef); 2816 break; 2817 case NL80211_IFTYPE_MONITOR: 2818 result = cfg80211_set_monitor_channel(rdev, &chandef); 2819 break; 2820 default: 2821 result = -EINVAL; 2822 } 2823 2824 return result; 2825 } 2826 2827 static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info) 2828 { 2829 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2830 struct net_device *netdev = info->user_ptr[1]; 2831 2832 return __nl80211_set_channel(rdev, netdev, info); 2833 } 2834 2835 static int nl80211_set_wds_peer(struct sk_buff *skb, struct genl_info *info) 2836 { 2837 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2838 struct net_device *dev = info->user_ptr[1]; 2839 struct wireless_dev *wdev = dev->ieee80211_ptr; 2840 const u8 *bssid; 2841 2842 if (!info->attrs[NL80211_ATTR_MAC]) 2843 return -EINVAL; 2844 2845 if (netif_running(dev)) 2846 return -EBUSY; 2847 2848 if (!rdev->ops->set_wds_peer) 2849 return -EOPNOTSUPP; 2850 2851 if (wdev->iftype != NL80211_IFTYPE_WDS) 2852 return -EOPNOTSUPP; 2853 2854 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 2855 return rdev_set_wds_peer(rdev, dev, bssid); 2856 } 2857 2858 static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) 2859 { 2860 struct cfg80211_registered_device *rdev; 2861 struct net_device *netdev = NULL; 2862 struct wireless_dev *wdev; 2863 int result = 0, rem_txq_params = 0; 2864 struct nlattr *nl_txq_params; 2865 u32 changed; 2866 u8 retry_short = 0, retry_long = 0; 2867 u32 frag_threshold = 0, rts_threshold = 0; 2868 u8 coverage_class = 0; 2869 u32 txq_limit = 0, txq_memory_limit = 0, txq_quantum = 0; 2870 2871 ASSERT_RTNL(); 2872 2873 /* 2874 * Try to find the wiphy and netdev. Normally this 2875 * function shouldn't need the netdev, but this is 2876 * done for backward compatibility -- previously 2877 * setting the channel was done per wiphy, but now 2878 * it is per netdev. Previous userland like hostapd 2879 * also passed a netdev to set_wiphy, so that it is 2880 * possible to let that go to the right netdev! 2881 */ 2882 2883 if (info->attrs[NL80211_ATTR_IFINDEX]) { 2884 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); 2885 2886 netdev = __dev_get_by_index(genl_info_net(info), ifindex); 2887 if (netdev && netdev->ieee80211_ptr) 2888 rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy); 2889 else 2890 netdev = NULL; 2891 } 2892 2893 if (!netdev) { 2894 rdev = __cfg80211_rdev_from_attrs(genl_info_net(info), 2895 info->attrs); 2896 if (IS_ERR(rdev)) 2897 return PTR_ERR(rdev); 2898 wdev = NULL; 2899 netdev = NULL; 2900 result = 0; 2901 } else 2902 wdev = netdev->ieee80211_ptr; 2903 2904 /* 2905 * end workaround code, by now the rdev is available 2906 * and locked, and wdev may or may not be NULL. 2907 */ 2908 2909 if (info->attrs[NL80211_ATTR_WIPHY_NAME]) 2910 result = cfg80211_dev_rename( 2911 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME])); 2912 2913 if (result) 2914 return result; 2915 2916 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) { 2917 struct ieee80211_txq_params txq_params; 2918 struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1]; 2919 2920 if (!rdev->ops->set_txq_params) 2921 return -EOPNOTSUPP; 2922 2923 if (!netdev) 2924 return -EINVAL; 2925 2926 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 2927 netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 2928 return -EINVAL; 2929 2930 if (!netif_running(netdev)) 2931 return -ENETDOWN; 2932 2933 nla_for_each_nested(nl_txq_params, 2934 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], 2935 rem_txq_params) { 2936 result = nla_parse_nested_deprecated(tb, 2937 NL80211_TXQ_ATTR_MAX, 2938 nl_txq_params, 2939 txq_params_policy, 2940 info->extack); 2941 if (result) 2942 return result; 2943 result = parse_txq_params(tb, &txq_params); 2944 if (result) 2945 return result; 2946 2947 result = rdev_set_txq_params(rdev, netdev, 2948 &txq_params); 2949 if (result) 2950 return result; 2951 } 2952 } 2953 2954 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 2955 result = __nl80211_set_channel( 2956 rdev, 2957 nl80211_can_set_dev_channel(wdev) ? netdev : NULL, 2958 info); 2959 if (result) 2960 return result; 2961 } 2962 2963 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) { 2964 struct wireless_dev *txp_wdev = wdev; 2965 enum nl80211_tx_power_setting type; 2966 int idx, mbm = 0; 2967 2968 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER)) 2969 txp_wdev = NULL; 2970 2971 if (!rdev->ops->set_tx_power) 2972 return -EOPNOTSUPP; 2973 2974 idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING; 2975 type = nla_get_u32(info->attrs[idx]); 2976 2977 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] && 2978 (type != NL80211_TX_POWER_AUTOMATIC)) 2979 return -EINVAL; 2980 2981 if (type != NL80211_TX_POWER_AUTOMATIC) { 2982 idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL; 2983 mbm = nla_get_u32(info->attrs[idx]); 2984 } 2985 2986 result = rdev_set_tx_power(rdev, txp_wdev, type, mbm); 2987 if (result) 2988 return result; 2989 } 2990 2991 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && 2992 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { 2993 u32 tx_ant, rx_ant; 2994 2995 if ((!rdev->wiphy.available_antennas_tx && 2996 !rdev->wiphy.available_antennas_rx) || 2997 !rdev->ops->set_antenna) 2998 return -EOPNOTSUPP; 2999 3000 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]); 3001 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]); 3002 3003 /* reject antenna configurations which don't match the 3004 * available antenna masks, except for the "all" mask */ 3005 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) || 3006 (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) 3007 return -EINVAL; 3008 3009 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx; 3010 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx; 3011 3012 result = rdev_set_antenna(rdev, tx_ant, rx_ant); 3013 if (result) 3014 return result; 3015 } 3016 3017 changed = 0; 3018 3019 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) { 3020 retry_short = nla_get_u8( 3021 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]); 3022 3023 changed |= WIPHY_PARAM_RETRY_SHORT; 3024 } 3025 3026 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) { 3027 retry_long = nla_get_u8( 3028 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]); 3029 3030 changed |= WIPHY_PARAM_RETRY_LONG; 3031 } 3032 3033 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) { 3034 frag_threshold = nla_get_u32( 3035 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]); 3036 if (frag_threshold < 256) 3037 return -EINVAL; 3038 3039 if (frag_threshold != (u32) -1) { 3040 /* 3041 * Fragments (apart from the last one) are required to 3042 * have even length. Make the fragmentation code 3043 * simpler by stripping LSB should someone try to use 3044 * odd threshold value. 3045 */ 3046 frag_threshold &= ~0x1; 3047 } 3048 changed |= WIPHY_PARAM_FRAG_THRESHOLD; 3049 } 3050 3051 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { 3052 rts_threshold = nla_get_u32( 3053 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); 3054 changed |= WIPHY_PARAM_RTS_THRESHOLD; 3055 } 3056 3057 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) { 3058 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) 3059 return -EINVAL; 3060 3061 coverage_class = nla_get_u8( 3062 info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]); 3063 changed |= WIPHY_PARAM_COVERAGE_CLASS; 3064 } 3065 3066 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { 3067 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION)) 3068 return -EOPNOTSUPP; 3069 3070 changed |= WIPHY_PARAM_DYN_ACK; 3071 } 3072 3073 if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) { 3074 if (!wiphy_ext_feature_isset(&rdev->wiphy, 3075 NL80211_EXT_FEATURE_TXQS)) 3076 return -EOPNOTSUPP; 3077 txq_limit = nla_get_u32( 3078 info->attrs[NL80211_ATTR_TXQ_LIMIT]); 3079 changed |= WIPHY_PARAM_TXQ_LIMIT; 3080 } 3081 3082 if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) { 3083 if (!wiphy_ext_feature_isset(&rdev->wiphy, 3084 NL80211_EXT_FEATURE_TXQS)) 3085 return -EOPNOTSUPP; 3086 txq_memory_limit = nla_get_u32( 3087 info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]); 3088 changed |= WIPHY_PARAM_TXQ_MEMORY_LIMIT; 3089 } 3090 3091 if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) { 3092 if (!wiphy_ext_feature_isset(&rdev->wiphy, 3093 NL80211_EXT_FEATURE_TXQS)) 3094 return -EOPNOTSUPP; 3095 txq_quantum = nla_get_u32( 3096 info->attrs[NL80211_ATTR_TXQ_QUANTUM]); 3097 changed |= WIPHY_PARAM_TXQ_QUANTUM; 3098 } 3099 3100 if (changed) { 3101 u8 old_retry_short, old_retry_long; 3102 u32 old_frag_threshold, old_rts_threshold; 3103 u8 old_coverage_class; 3104 u32 old_txq_limit, old_txq_memory_limit, old_txq_quantum; 3105 3106 if (!rdev->ops->set_wiphy_params) 3107 return -EOPNOTSUPP; 3108 3109 old_retry_short = rdev->wiphy.retry_short; 3110 old_retry_long = rdev->wiphy.retry_long; 3111 old_frag_threshold = rdev->wiphy.frag_threshold; 3112 old_rts_threshold = rdev->wiphy.rts_threshold; 3113 old_coverage_class = rdev->wiphy.coverage_class; 3114 old_txq_limit = rdev->wiphy.txq_limit; 3115 old_txq_memory_limit = rdev->wiphy.txq_memory_limit; 3116 old_txq_quantum = rdev->wiphy.txq_quantum; 3117 3118 if (changed & WIPHY_PARAM_RETRY_SHORT) 3119 rdev->wiphy.retry_short = retry_short; 3120 if (changed & WIPHY_PARAM_RETRY_LONG) 3121 rdev->wiphy.retry_long = retry_long; 3122 if (changed & WIPHY_PARAM_FRAG_THRESHOLD) 3123 rdev->wiphy.frag_threshold = frag_threshold; 3124 if (changed & WIPHY_PARAM_RTS_THRESHOLD) 3125 rdev->wiphy.rts_threshold = rts_threshold; 3126 if (changed & WIPHY_PARAM_COVERAGE_CLASS) 3127 rdev->wiphy.coverage_class = coverage_class; 3128 if (changed & WIPHY_PARAM_TXQ_LIMIT) 3129 rdev->wiphy.txq_limit = txq_limit; 3130 if (changed & WIPHY_PARAM_TXQ_MEMORY_LIMIT) 3131 rdev->wiphy.txq_memory_limit = txq_memory_limit; 3132 if (changed & WIPHY_PARAM_TXQ_QUANTUM) 3133 rdev->wiphy.txq_quantum = txq_quantum; 3134 3135 result = rdev_set_wiphy_params(rdev, changed); 3136 if (result) { 3137 rdev->wiphy.retry_short = old_retry_short; 3138 rdev->wiphy.retry_long = old_retry_long; 3139 rdev->wiphy.frag_threshold = old_frag_threshold; 3140 rdev->wiphy.rts_threshold = old_rts_threshold; 3141 rdev->wiphy.coverage_class = old_coverage_class; 3142 rdev->wiphy.txq_limit = old_txq_limit; 3143 rdev->wiphy.txq_memory_limit = old_txq_memory_limit; 3144 rdev->wiphy.txq_quantum = old_txq_quantum; 3145 return result; 3146 } 3147 } 3148 return 0; 3149 } 3150 3151 static int nl80211_send_chandef(struct sk_buff *msg, 3152 const struct cfg80211_chan_def *chandef) 3153 { 3154 if (WARN_ON(!cfg80211_chandef_valid(chandef))) 3155 return -EINVAL; 3156 3157 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, 3158 chandef->chan->center_freq)) 3159 return -ENOBUFS; 3160 switch (chandef->width) { 3161 case NL80211_CHAN_WIDTH_20_NOHT: 3162 case NL80211_CHAN_WIDTH_20: 3163 case NL80211_CHAN_WIDTH_40: 3164 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 3165 cfg80211_get_chandef_type(chandef))) 3166 return -ENOBUFS; 3167 break; 3168 default: 3169 break; 3170 } 3171 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width)) 3172 return -ENOBUFS; 3173 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1)) 3174 return -ENOBUFS; 3175 if (chandef->center_freq2 && 3176 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2)) 3177 return -ENOBUFS; 3178 return 0; 3179 } 3180 3181 static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags, 3182 struct cfg80211_registered_device *rdev, 3183 struct wireless_dev *wdev, 3184 enum nl80211_commands cmd) 3185 { 3186 struct net_device *dev = wdev->netdev; 3187 void *hdr; 3188 3189 WARN_ON(cmd != NL80211_CMD_NEW_INTERFACE && 3190 cmd != NL80211_CMD_DEL_INTERFACE && 3191 cmd != NL80211_CMD_SET_INTERFACE); 3192 3193 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 3194 if (!hdr) 3195 return -1; 3196 3197 if (dev && 3198 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 3199 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name))) 3200 goto nla_put_failure; 3201 3202 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 3203 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || 3204 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 3205 NL80211_ATTR_PAD) || 3206 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, wdev_address(wdev)) || 3207 nla_put_u32(msg, NL80211_ATTR_GENERATION, 3208 rdev->devlist_generation ^ 3209 (cfg80211_rdev_list_generation << 2)) || 3210 nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr)) 3211 goto nla_put_failure; 3212 3213 if (rdev->ops->get_channel) { 3214 int ret; 3215 struct cfg80211_chan_def chandef = {}; 3216 3217 ret = rdev_get_channel(rdev, wdev, &chandef); 3218 if (ret == 0) { 3219 if (nl80211_send_chandef(msg, &chandef)) 3220 goto nla_put_failure; 3221 } 3222 } 3223 3224 if (rdev->ops->get_tx_power) { 3225 int dbm, ret; 3226 3227 ret = rdev_get_tx_power(rdev, wdev, &dbm); 3228 if (ret == 0 && 3229 nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL, 3230 DBM_TO_MBM(dbm))) 3231 goto nla_put_failure; 3232 } 3233 3234 wdev_lock(wdev); 3235 switch (wdev->iftype) { 3236 case NL80211_IFTYPE_AP: 3237 if (wdev->ssid_len && 3238 nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid)) 3239 goto nla_put_failure_locked; 3240 break; 3241 case NL80211_IFTYPE_STATION: 3242 case NL80211_IFTYPE_P2P_CLIENT: 3243 case NL80211_IFTYPE_ADHOC: { 3244 const u8 *ssid_ie; 3245 if (!wdev->current_bss) 3246 break; 3247 rcu_read_lock(); 3248 ssid_ie = ieee80211_bss_get_ie(&wdev->current_bss->pub, 3249 WLAN_EID_SSID); 3250 if (ssid_ie && 3251 nla_put(msg, NL80211_ATTR_SSID, ssid_ie[1], ssid_ie + 2)) 3252 goto nla_put_failure_rcu_locked; 3253 rcu_read_unlock(); 3254 break; 3255 } 3256 default: 3257 /* nothing */ 3258 break; 3259 } 3260 wdev_unlock(wdev); 3261 3262 if (rdev->ops->get_txq_stats) { 3263 struct cfg80211_txq_stats txqstats = {}; 3264 int ret = rdev_get_txq_stats(rdev, wdev, &txqstats); 3265 3266 if (ret == 0 && 3267 !nl80211_put_txq_stats(msg, &txqstats, 3268 NL80211_ATTR_TXQ_STATS)) 3269 goto nla_put_failure; 3270 } 3271 3272 genlmsg_end(msg, hdr); 3273 return 0; 3274 3275 nla_put_failure_rcu_locked: 3276 rcu_read_unlock(); 3277 nla_put_failure_locked: 3278 wdev_unlock(wdev); 3279 nla_put_failure: 3280 genlmsg_cancel(msg, hdr); 3281 return -EMSGSIZE; 3282 } 3283 3284 static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb) 3285 { 3286 int wp_idx = 0; 3287 int if_idx = 0; 3288 int wp_start = cb->args[0]; 3289 int if_start = cb->args[1]; 3290 int filter_wiphy = -1; 3291 struct cfg80211_registered_device *rdev; 3292 struct wireless_dev *wdev; 3293 int ret; 3294 3295 rtnl_lock(); 3296 if (!cb->args[2]) { 3297 struct nl80211_dump_wiphy_state state = { 3298 .filter_wiphy = -1, 3299 }; 3300 3301 ret = nl80211_dump_wiphy_parse(skb, cb, &state); 3302 if (ret) 3303 goto out_unlock; 3304 3305 filter_wiphy = state.filter_wiphy; 3306 3307 /* 3308 * if filtering, set cb->args[2] to +1 since 0 is the default 3309 * value needed to determine that parsing is necessary. 3310 */ 3311 if (filter_wiphy >= 0) 3312 cb->args[2] = filter_wiphy + 1; 3313 else 3314 cb->args[2] = -1; 3315 } else if (cb->args[2] > 0) { 3316 filter_wiphy = cb->args[2] - 1; 3317 } 3318 3319 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 3320 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) 3321 continue; 3322 if (wp_idx < wp_start) { 3323 wp_idx++; 3324 continue; 3325 } 3326 3327 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx) 3328 continue; 3329 3330 if_idx = 0; 3331 3332 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 3333 if (if_idx < if_start) { 3334 if_idx++; 3335 continue; 3336 } 3337 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, 3338 cb->nlh->nlmsg_seq, NLM_F_MULTI, 3339 rdev, wdev, 3340 NL80211_CMD_NEW_INTERFACE) < 0) { 3341 goto out; 3342 } 3343 if_idx++; 3344 } 3345 3346 wp_idx++; 3347 } 3348 out: 3349 cb->args[0] = wp_idx; 3350 cb->args[1] = if_idx; 3351 3352 ret = skb->len; 3353 out_unlock: 3354 rtnl_unlock(); 3355 3356 return ret; 3357 } 3358 3359 static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info) 3360 { 3361 struct sk_buff *msg; 3362 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3363 struct wireless_dev *wdev = info->user_ptr[1]; 3364 3365 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 3366 if (!msg) 3367 return -ENOMEM; 3368 3369 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, 3370 rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) { 3371 nlmsg_free(msg); 3372 return -ENOBUFS; 3373 } 3374 3375 return genlmsg_reply(msg, info); 3376 } 3377 3378 static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = { 3379 [NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG }, 3380 [NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG }, 3381 [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG }, 3382 [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG }, 3383 [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG }, 3384 [NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG }, 3385 }; 3386 3387 static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags) 3388 { 3389 struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1]; 3390 int flag; 3391 3392 *mntrflags = 0; 3393 3394 if (!nla) 3395 return -EINVAL; 3396 3397 if (nla_parse_nested_deprecated(flags, NL80211_MNTR_FLAG_MAX, nla, mntr_flags_policy, NULL)) 3398 return -EINVAL; 3399 3400 for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++) 3401 if (flags[flag]) 3402 *mntrflags |= (1<<flag); 3403 3404 *mntrflags |= MONITOR_FLAG_CHANGED; 3405 3406 return 0; 3407 } 3408 3409 static int nl80211_parse_mon_options(struct cfg80211_registered_device *rdev, 3410 enum nl80211_iftype type, 3411 struct genl_info *info, 3412 struct vif_params *params) 3413 { 3414 bool change = false; 3415 int err; 3416 3417 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { 3418 if (type != NL80211_IFTYPE_MONITOR) 3419 return -EINVAL; 3420 3421 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], 3422 ¶ms->flags); 3423 if (err) 3424 return err; 3425 3426 change = true; 3427 } 3428 3429 if (params->flags & MONITOR_FLAG_ACTIVE && 3430 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) 3431 return -EOPNOTSUPP; 3432 3433 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) { 3434 const u8 *mumimo_groups; 3435 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER; 3436 3437 if (type != NL80211_IFTYPE_MONITOR) 3438 return -EINVAL; 3439 3440 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) 3441 return -EOPNOTSUPP; 3442 3443 mumimo_groups = 3444 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); 3445 3446 /* bits 0 and 63 are reserved and must be zero */ 3447 if ((mumimo_groups[0] & BIT(0)) || 3448 (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7))) 3449 return -EINVAL; 3450 3451 params->vht_mumimo_groups = mumimo_groups; 3452 change = true; 3453 } 3454 3455 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) { 3456 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER; 3457 3458 if (type != NL80211_IFTYPE_MONITOR) 3459 return -EINVAL; 3460 3461 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) 3462 return -EOPNOTSUPP; 3463 3464 params->vht_mumimo_follow_addr = 3465 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]); 3466 change = true; 3467 } 3468 3469 return change ? 1 : 0; 3470 } 3471 3472 static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev, 3473 struct net_device *netdev, u8 use_4addr, 3474 enum nl80211_iftype iftype) 3475 { 3476 if (!use_4addr) { 3477 if (netdev && (netdev->priv_flags & IFF_BRIDGE_PORT)) 3478 return -EBUSY; 3479 return 0; 3480 } 3481 3482 switch (iftype) { 3483 case NL80211_IFTYPE_AP_VLAN: 3484 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP) 3485 return 0; 3486 break; 3487 case NL80211_IFTYPE_STATION: 3488 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION) 3489 return 0; 3490 break; 3491 default: 3492 break; 3493 } 3494 3495 return -EOPNOTSUPP; 3496 } 3497 3498 static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info) 3499 { 3500 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3501 struct vif_params params; 3502 int err; 3503 enum nl80211_iftype otype, ntype; 3504 struct net_device *dev = info->user_ptr[1]; 3505 bool change = false; 3506 3507 memset(¶ms, 0, sizeof(params)); 3508 3509 otype = ntype = dev->ieee80211_ptr->iftype; 3510 3511 if (info->attrs[NL80211_ATTR_IFTYPE]) { 3512 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); 3513 if (otype != ntype) 3514 change = true; 3515 } 3516 3517 if (info->attrs[NL80211_ATTR_MESH_ID]) { 3518 struct wireless_dev *wdev = dev->ieee80211_ptr; 3519 3520 if (ntype != NL80211_IFTYPE_MESH_POINT) 3521 return -EINVAL; 3522 if (netif_running(dev)) 3523 return -EBUSY; 3524 3525 wdev_lock(wdev); 3526 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN != 3527 IEEE80211_MAX_MESH_ID_LEN); 3528 wdev->mesh_id_up_len = 3529 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 3530 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]), 3531 wdev->mesh_id_up_len); 3532 wdev_unlock(wdev); 3533 } 3534 3535 if (info->attrs[NL80211_ATTR_4ADDR]) { 3536 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); 3537 change = true; 3538 err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype); 3539 if (err) 3540 return err; 3541 } else { 3542 params.use_4addr = -1; 3543 } 3544 3545 err = nl80211_parse_mon_options(rdev, ntype, info, ¶ms); 3546 if (err < 0) 3547 return err; 3548 if (err > 0) 3549 change = true; 3550 3551 if (change) 3552 err = cfg80211_change_iface(rdev, dev, ntype, ¶ms); 3553 else 3554 err = 0; 3555 3556 if (!err && params.use_4addr != -1) 3557 dev->ieee80211_ptr->use_4addr = params.use_4addr; 3558 3559 if (change && !err) { 3560 struct wireless_dev *wdev = dev->ieee80211_ptr; 3561 3562 nl80211_notify_iface(rdev, wdev, NL80211_CMD_SET_INTERFACE); 3563 } 3564 3565 return err; 3566 } 3567 3568 static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) 3569 { 3570 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3571 struct vif_params params; 3572 struct wireless_dev *wdev; 3573 struct sk_buff *msg; 3574 int err; 3575 enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED; 3576 3577 /* to avoid failing a new interface creation due to pending removal */ 3578 cfg80211_destroy_ifaces(rdev); 3579 3580 memset(¶ms, 0, sizeof(params)); 3581 3582 if (!info->attrs[NL80211_ATTR_IFNAME]) 3583 return -EINVAL; 3584 3585 if (info->attrs[NL80211_ATTR_IFTYPE]) 3586 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); 3587 3588 if (!rdev->ops->add_virtual_intf) 3589 return -EOPNOTSUPP; 3590 3591 if ((type == NL80211_IFTYPE_P2P_DEVICE || type == NL80211_IFTYPE_NAN || 3592 rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) && 3593 info->attrs[NL80211_ATTR_MAC]) { 3594 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], 3595 ETH_ALEN); 3596 if (!is_valid_ether_addr(params.macaddr)) 3597 return -EADDRNOTAVAIL; 3598 } 3599 3600 if (info->attrs[NL80211_ATTR_4ADDR]) { 3601 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); 3602 err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type); 3603 if (err) 3604 return err; 3605 } 3606 3607 if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0)) 3608 return -EOPNOTSUPP; 3609 3610 err = nl80211_parse_mon_options(rdev, type, info, ¶ms); 3611 if (err < 0) 3612 return err; 3613 3614 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 3615 if (!msg) 3616 return -ENOMEM; 3617 3618 wdev = rdev_add_virtual_intf(rdev, 3619 nla_data(info->attrs[NL80211_ATTR_IFNAME]), 3620 NET_NAME_USER, type, ¶ms); 3621 if (WARN_ON(!wdev)) { 3622 nlmsg_free(msg); 3623 return -EPROTO; 3624 } else if (IS_ERR(wdev)) { 3625 nlmsg_free(msg); 3626 return PTR_ERR(wdev); 3627 } 3628 3629 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 3630 wdev->owner_nlportid = info->snd_portid; 3631 3632 switch (type) { 3633 case NL80211_IFTYPE_MESH_POINT: 3634 if (!info->attrs[NL80211_ATTR_MESH_ID]) 3635 break; 3636 wdev_lock(wdev); 3637 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN != 3638 IEEE80211_MAX_MESH_ID_LEN); 3639 wdev->mesh_id_up_len = 3640 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 3641 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]), 3642 wdev->mesh_id_up_len); 3643 wdev_unlock(wdev); 3644 break; 3645 case NL80211_IFTYPE_NAN: 3646 case NL80211_IFTYPE_P2P_DEVICE: 3647 /* 3648 * P2P Device and NAN do not have a netdev, so don't go 3649 * through the netdev notifier and must be added here 3650 */ 3651 cfg80211_init_wdev(rdev, wdev); 3652 break; 3653 default: 3654 break; 3655 } 3656 3657 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, 3658 rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) { 3659 nlmsg_free(msg); 3660 return -ENOBUFS; 3661 } 3662 3663 return genlmsg_reply(msg, info); 3664 } 3665 3666 static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info) 3667 { 3668 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3669 struct wireless_dev *wdev = info->user_ptr[1]; 3670 3671 if (!rdev->ops->del_virtual_intf) 3672 return -EOPNOTSUPP; 3673 3674 /* 3675 * If we remove a wireless device without a netdev then clear 3676 * user_ptr[1] so that nl80211_post_doit won't dereference it 3677 * to check if it needs to do dev_put(). Otherwise it crashes 3678 * since the wdev has been freed, unlike with a netdev where 3679 * we need the dev_put() for the netdev to really be freed. 3680 */ 3681 if (!wdev->netdev) 3682 info->user_ptr[1] = NULL; 3683 3684 return rdev_del_virtual_intf(rdev, wdev); 3685 } 3686 3687 static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info) 3688 { 3689 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3690 struct net_device *dev = info->user_ptr[1]; 3691 u16 noack_map; 3692 3693 if (!info->attrs[NL80211_ATTR_NOACK_MAP]) 3694 return -EINVAL; 3695 3696 if (!rdev->ops->set_noack_map) 3697 return -EOPNOTSUPP; 3698 3699 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]); 3700 3701 return rdev_set_noack_map(rdev, dev, noack_map); 3702 } 3703 3704 struct get_key_cookie { 3705 struct sk_buff *msg; 3706 int error; 3707 int idx; 3708 }; 3709 3710 static void get_key_callback(void *c, struct key_params *params) 3711 { 3712 struct nlattr *key; 3713 struct get_key_cookie *cookie = c; 3714 3715 if ((params->key && 3716 nla_put(cookie->msg, NL80211_ATTR_KEY_DATA, 3717 params->key_len, params->key)) || 3718 (params->seq && 3719 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ, 3720 params->seq_len, params->seq)) || 3721 (params->cipher && 3722 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER, 3723 params->cipher))) 3724 goto nla_put_failure; 3725 3726 key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY); 3727 if (!key) 3728 goto nla_put_failure; 3729 3730 if ((params->key && 3731 nla_put(cookie->msg, NL80211_KEY_DATA, 3732 params->key_len, params->key)) || 3733 (params->seq && 3734 nla_put(cookie->msg, NL80211_KEY_SEQ, 3735 params->seq_len, params->seq)) || 3736 (params->cipher && 3737 nla_put_u32(cookie->msg, NL80211_KEY_CIPHER, 3738 params->cipher))) 3739 goto nla_put_failure; 3740 3741 if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx)) 3742 goto nla_put_failure; 3743 3744 nla_nest_end(cookie->msg, key); 3745 3746 return; 3747 nla_put_failure: 3748 cookie->error = 1; 3749 } 3750 3751 static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) 3752 { 3753 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3754 int err; 3755 struct net_device *dev = info->user_ptr[1]; 3756 u8 key_idx = 0; 3757 const u8 *mac_addr = NULL; 3758 bool pairwise; 3759 struct get_key_cookie cookie = { 3760 .error = 0, 3761 }; 3762 void *hdr; 3763 struct sk_buff *msg; 3764 3765 if (info->attrs[NL80211_ATTR_KEY_IDX]) 3766 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); 3767 3768 if (info->attrs[NL80211_ATTR_MAC]) 3769 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 3770 3771 pairwise = !!mac_addr; 3772 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { 3773 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); 3774 3775 if (kt != NL80211_KEYTYPE_GROUP && 3776 kt != NL80211_KEYTYPE_PAIRWISE) 3777 return -EINVAL; 3778 pairwise = kt == NL80211_KEYTYPE_PAIRWISE; 3779 } 3780 3781 if (!rdev->ops->get_key) 3782 return -EOPNOTSUPP; 3783 3784 if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) 3785 return -ENOENT; 3786 3787 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 3788 if (!msg) 3789 return -ENOMEM; 3790 3791 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 3792 NL80211_CMD_NEW_KEY); 3793 if (!hdr) 3794 goto nla_put_failure; 3795 3796 cookie.msg = msg; 3797 cookie.idx = key_idx; 3798 3799 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 3800 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_idx)) 3801 goto nla_put_failure; 3802 if (mac_addr && 3803 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr)) 3804 goto nla_put_failure; 3805 3806 err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie, 3807 get_key_callback); 3808 3809 if (err) 3810 goto free_msg; 3811 3812 if (cookie.error) 3813 goto nla_put_failure; 3814 3815 genlmsg_end(msg, hdr); 3816 return genlmsg_reply(msg, info); 3817 3818 nla_put_failure: 3819 err = -ENOBUFS; 3820 free_msg: 3821 nlmsg_free(msg); 3822 return err; 3823 } 3824 3825 static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info) 3826 { 3827 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3828 struct key_parse key; 3829 int err; 3830 struct net_device *dev = info->user_ptr[1]; 3831 3832 err = nl80211_parse_key(info, &key); 3833 if (err) 3834 return err; 3835 3836 if (key.idx < 0) 3837 return -EINVAL; 3838 3839 /* Only support setting default key and 3840 * Extended Key ID action NL80211_KEY_SET_TX. 3841 */ 3842 if (!key.def && !key.defmgmt && 3843 !(key.p.mode == NL80211_KEY_SET_TX)) 3844 return -EINVAL; 3845 3846 wdev_lock(dev->ieee80211_ptr); 3847 3848 if (key.def) { 3849 if (!rdev->ops->set_default_key) { 3850 err = -EOPNOTSUPP; 3851 goto out; 3852 } 3853 3854 err = nl80211_key_allowed(dev->ieee80211_ptr); 3855 if (err) 3856 goto out; 3857 3858 err = rdev_set_default_key(rdev, dev, key.idx, 3859 key.def_uni, key.def_multi); 3860 3861 if (err) 3862 goto out; 3863 3864 #ifdef CONFIG_CFG80211_WEXT 3865 dev->ieee80211_ptr->wext.default_key = key.idx; 3866 #endif 3867 } else if (key.defmgmt) { 3868 if (key.def_uni || !key.def_multi) { 3869 err = -EINVAL; 3870 goto out; 3871 } 3872 3873 if (!rdev->ops->set_default_mgmt_key) { 3874 err = -EOPNOTSUPP; 3875 goto out; 3876 } 3877 3878 err = nl80211_key_allowed(dev->ieee80211_ptr); 3879 if (err) 3880 goto out; 3881 3882 err = rdev_set_default_mgmt_key(rdev, dev, key.idx); 3883 if (err) 3884 goto out; 3885 3886 #ifdef CONFIG_CFG80211_WEXT 3887 dev->ieee80211_ptr->wext.default_mgmt_key = key.idx; 3888 #endif 3889 } else if (key.p.mode == NL80211_KEY_SET_TX && 3890 wiphy_ext_feature_isset(&rdev->wiphy, 3891 NL80211_EXT_FEATURE_EXT_KEY_ID)) { 3892 u8 *mac_addr = NULL; 3893 3894 if (info->attrs[NL80211_ATTR_MAC]) 3895 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 3896 3897 if (!mac_addr || key.idx < 0 || key.idx > 1) { 3898 err = -EINVAL; 3899 goto out; 3900 } 3901 3902 err = rdev_add_key(rdev, dev, key.idx, 3903 NL80211_KEYTYPE_PAIRWISE, 3904 mac_addr, &key.p); 3905 } else { 3906 err = -EINVAL; 3907 } 3908 out: 3909 wdev_unlock(dev->ieee80211_ptr); 3910 3911 return err; 3912 } 3913 3914 static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info) 3915 { 3916 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3917 int err; 3918 struct net_device *dev = info->user_ptr[1]; 3919 struct key_parse key; 3920 const u8 *mac_addr = NULL; 3921 3922 err = nl80211_parse_key(info, &key); 3923 if (err) 3924 return err; 3925 3926 if (!key.p.key) 3927 return -EINVAL; 3928 3929 if (info->attrs[NL80211_ATTR_MAC]) 3930 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 3931 3932 if (key.type == -1) { 3933 if (mac_addr) 3934 key.type = NL80211_KEYTYPE_PAIRWISE; 3935 else 3936 key.type = NL80211_KEYTYPE_GROUP; 3937 } 3938 3939 /* for now */ 3940 if (key.type != NL80211_KEYTYPE_PAIRWISE && 3941 key.type != NL80211_KEYTYPE_GROUP) 3942 return -EINVAL; 3943 3944 if (key.type == NL80211_KEYTYPE_GROUP && 3945 info->attrs[NL80211_ATTR_VLAN_ID]) 3946 key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 3947 3948 if (!rdev->ops->add_key) 3949 return -EOPNOTSUPP; 3950 3951 if (cfg80211_validate_key_settings(rdev, &key.p, key.idx, 3952 key.type == NL80211_KEYTYPE_PAIRWISE, 3953 mac_addr)) 3954 return -EINVAL; 3955 3956 wdev_lock(dev->ieee80211_ptr); 3957 err = nl80211_key_allowed(dev->ieee80211_ptr); 3958 if (!err) 3959 err = rdev_add_key(rdev, dev, key.idx, 3960 key.type == NL80211_KEYTYPE_PAIRWISE, 3961 mac_addr, &key.p); 3962 wdev_unlock(dev->ieee80211_ptr); 3963 3964 return err; 3965 } 3966 3967 static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info) 3968 { 3969 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3970 int err; 3971 struct net_device *dev = info->user_ptr[1]; 3972 u8 *mac_addr = NULL; 3973 struct key_parse key; 3974 3975 err = nl80211_parse_key(info, &key); 3976 if (err) 3977 return err; 3978 3979 if (info->attrs[NL80211_ATTR_MAC]) 3980 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 3981 3982 if (key.type == -1) { 3983 if (mac_addr) 3984 key.type = NL80211_KEYTYPE_PAIRWISE; 3985 else 3986 key.type = NL80211_KEYTYPE_GROUP; 3987 } 3988 3989 /* for now */ 3990 if (key.type != NL80211_KEYTYPE_PAIRWISE && 3991 key.type != NL80211_KEYTYPE_GROUP) 3992 return -EINVAL; 3993 3994 if (!rdev->ops->del_key) 3995 return -EOPNOTSUPP; 3996 3997 wdev_lock(dev->ieee80211_ptr); 3998 err = nl80211_key_allowed(dev->ieee80211_ptr); 3999 4000 if (key.type == NL80211_KEYTYPE_GROUP && mac_addr && 4001 !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) 4002 err = -ENOENT; 4003 4004 if (!err) 4005 err = rdev_del_key(rdev, dev, key.idx, 4006 key.type == NL80211_KEYTYPE_PAIRWISE, 4007 mac_addr); 4008 4009 #ifdef CONFIG_CFG80211_WEXT 4010 if (!err) { 4011 if (key.idx == dev->ieee80211_ptr->wext.default_key) 4012 dev->ieee80211_ptr->wext.default_key = -1; 4013 else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key) 4014 dev->ieee80211_ptr->wext.default_mgmt_key = -1; 4015 } 4016 #endif 4017 wdev_unlock(dev->ieee80211_ptr); 4018 4019 return err; 4020 } 4021 4022 /* This function returns an error or the number of nested attributes */ 4023 static int validate_acl_mac_addrs(struct nlattr *nl_attr) 4024 { 4025 struct nlattr *attr; 4026 int n_entries = 0, tmp; 4027 4028 nla_for_each_nested(attr, nl_attr, tmp) { 4029 if (nla_len(attr) != ETH_ALEN) 4030 return -EINVAL; 4031 4032 n_entries++; 4033 } 4034 4035 return n_entries; 4036 } 4037 4038 /* 4039 * This function parses ACL information and allocates memory for ACL data. 4040 * On successful return, the calling function is responsible to free the 4041 * ACL buffer returned by this function. 4042 */ 4043 static struct cfg80211_acl_data *parse_acl_data(struct wiphy *wiphy, 4044 struct genl_info *info) 4045 { 4046 enum nl80211_acl_policy acl_policy; 4047 struct nlattr *attr; 4048 struct cfg80211_acl_data *acl; 4049 int i = 0, n_entries, tmp; 4050 4051 if (!wiphy->max_acl_mac_addrs) 4052 return ERR_PTR(-EOPNOTSUPP); 4053 4054 if (!info->attrs[NL80211_ATTR_ACL_POLICY]) 4055 return ERR_PTR(-EINVAL); 4056 4057 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]); 4058 if (acl_policy != NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED && 4059 acl_policy != NL80211_ACL_POLICY_DENY_UNLESS_LISTED) 4060 return ERR_PTR(-EINVAL); 4061 4062 if (!info->attrs[NL80211_ATTR_MAC_ADDRS]) 4063 return ERR_PTR(-EINVAL); 4064 4065 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]); 4066 if (n_entries < 0) 4067 return ERR_PTR(n_entries); 4068 4069 if (n_entries > wiphy->max_acl_mac_addrs) 4070 return ERR_PTR(-ENOTSUPP); 4071 4072 acl = kzalloc(struct_size(acl, mac_addrs, n_entries), GFP_KERNEL); 4073 if (!acl) 4074 return ERR_PTR(-ENOMEM); 4075 4076 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { 4077 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); 4078 i++; 4079 } 4080 4081 acl->n_acl_entries = n_entries; 4082 acl->acl_policy = acl_policy; 4083 4084 return acl; 4085 } 4086 4087 static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info) 4088 { 4089 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4090 struct net_device *dev = info->user_ptr[1]; 4091 struct cfg80211_acl_data *acl; 4092 int err; 4093 4094 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 4095 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4096 return -EOPNOTSUPP; 4097 4098 if (!dev->ieee80211_ptr->beacon_interval) 4099 return -EINVAL; 4100 4101 acl = parse_acl_data(&rdev->wiphy, info); 4102 if (IS_ERR(acl)) 4103 return PTR_ERR(acl); 4104 4105 err = rdev_set_mac_acl(rdev, dev, acl); 4106 4107 kfree(acl); 4108 4109 return err; 4110 } 4111 4112 static u32 rateset_to_mask(struct ieee80211_supported_band *sband, 4113 u8 *rates, u8 rates_len) 4114 { 4115 u8 i; 4116 u32 mask = 0; 4117 4118 for (i = 0; i < rates_len; i++) { 4119 int rate = (rates[i] & 0x7f) * 5; 4120 int ridx; 4121 4122 for (ridx = 0; ridx < sband->n_bitrates; ridx++) { 4123 struct ieee80211_rate *srate = 4124 &sband->bitrates[ridx]; 4125 if (rate == srate->bitrate) { 4126 mask |= 1 << ridx; 4127 break; 4128 } 4129 } 4130 if (ridx == sband->n_bitrates) 4131 return 0; /* rate not found */ 4132 } 4133 4134 return mask; 4135 } 4136 4137 static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband, 4138 u8 *rates, u8 rates_len, 4139 u8 mcs[IEEE80211_HT_MCS_MASK_LEN]) 4140 { 4141 u8 i; 4142 4143 memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN); 4144 4145 for (i = 0; i < rates_len; i++) { 4146 int ridx, rbit; 4147 4148 ridx = rates[i] / 8; 4149 rbit = BIT(rates[i] % 8); 4150 4151 /* check validity */ 4152 if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN)) 4153 return false; 4154 4155 /* check availability */ 4156 ridx = array_index_nospec(ridx, IEEE80211_HT_MCS_MASK_LEN); 4157 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) 4158 mcs[ridx] |= rbit; 4159 else 4160 return false; 4161 } 4162 4163 return true; 4164 } 4165 4166 static u16 vht_mcs_map_to_mcs_mask(u8 vht_mcs_map) 4167 { 4168 u16 mcs_mask = 0; 4169 4170 switch (vht_mcs_map) { 4171 case IEEE80211_VHT_MCS_NOT_SUPPORTED: 4172 break; 4173 case IEEE80211_VHT_MCS_SUPPORT_0_7: 4174 mcs_mask = 0x00FF; 4175 break; 4176 case IEEE80211_VHT_MCS_SUPPORT_0_8: 4177 mcs_mask = 0x01FF; 4178 break; 4179 case IEEE80211_VHT_MCS_SUPPORT_0_9: 4180 mcs_mask = 0x03FF; 4181 break; 4182 default: 4183 break; 4184 } 4185 4186 return mcs_mask; 4187 } 4188 4189 static void vht_build_mcs_mask(u16 vht_mcs_map, 4190 u16 vht_mcs_mask[NL80211_VHT_NSS_MAX]) 4191 { 4192 u8 nss; 4193 4194 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) { 4195 vht_mcs_mask[nss] = vht_mcs_map_to_mcs_mask(vht_mcs_map & 0x03); 4196 vht_mcs_map >>= 2; 4197 } 4198 } 4199 4200 static bool vht_set_mcs_mask(struct ieee80211_supported_band *sband, 4201 struct nl80211_txrate_vht *txrate, 4202 u16 mcs[NL80211_VHT_NSS_MAX]) 4203 { 4204 u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 4205 u16 tx_mcs_mask[NL80211_VHT_NSS_MAX] = {}; 4206 u8 i; 4207 4208 if (!sband->vht_cap.vht_supported) 4209 return false; 4210 4211 memset(mcs, 0, sizeof(u16) * NL80211_VHT_NSS_MAX); 4212 4213 /* Build vht_mcs_mask from VHT capabilities */ 4214 vht_build_mcs_mask(tx_mcs_map, tx_mcs_mask); 4215 4216 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 4217 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) 4218 mcs[i] = txrate->mcs[i]; 4219 else 4220 return false; 4221 } 4222 4223 return true; 4224 } 4225 4226 static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = { 4227 [NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY, 4228 .len = NL80211_MAX_SUPP_RATES }, 4229 [NL80211_TXRATE_HT] = { .type = NLA_BINARY, 4230 .len = NL80211_MAX_SUPP_HT_RATES }, 4231 [NL80211_TXRATE_VHT] = { 4232 .type = NLA_EXACT_LEN_WARN, 4233 .len = sizeof(struct nl80211_txrate_vht), 4234 }, 4235 [NL80211_TXRATE_GI] = { .type = NLA_U8 }, 4236 }; 4237 4238 static int nl80211_parse_tx_bitrate_mask(struct genl_info *info, 4239 struct cfg80211_bitrate_mask *mask) 4240 { 4241 struct nlattr *tb[NL80211_TXRATE_MAX + 1]; 4242 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4243 int rem, i; 4244 struct nlattr *tx_rates; 4245 struct ieee80211_supported_band *sband; 4246 u16 vht_tx_mcs_map; 4247 4248 memset(mask, 0, sizeof(*mask)); 4249 /* Default to all rates enabled */ 4250 for (i = 0; i < NUM_NL80211_BANDS; i++) { 4251 sband = rdev->wiphy.bands[i]; 4252 4253 if (!sband) 4254 continue; 4255 4256 mask->control[i].legacy = (1 << sband->n_bitrates) - 1; 4257 memcpy(mask->control[i].ht_mcs, 4258 sband->ht_cap.mcs.rx_mask, 4259 sizeof(mask->control[i].ht_mcs)); 4260 4261 if (!sband->vht_cap.vht_supported) 4262 continue; 4263 4264 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 4265 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs); 4266 } 4267 4268 /* if no rates are given set it back to the defaults */ 4269 if (!info->attrs[NL80211_ATTR_TX_RATES]) 4270 goto out; 4271 4272 /* The nested attribute uses enum nl80211_band as the index. This maps 4273 * directly to the enum nl80211_band values used in cfg80211. 4274 */ 4275 BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8); 4276 nla_for_each_nested(tx_rates, info->attrs[NL80211_ATTR_TX_RATES], rem) { 4277 enum nl80211_band band = nla_type(tx_rates); 4278 int err; 4279 4280 if (band < 0 || band >= NUM_NL80211_BANDS) 4281 return -EINVAL; 4282 sband = rdev->wiphy.bands[band]; 4283 if (sband == NULL) 4284 return -EINVAL; 4285 err = nla_parse_nested_deprecated(tb, NL80211_TXRATE_MAX, 4286 tx_rates, 4287 nl80211_txattr_policy, 4288 info->extack); 4289 if (err) 4290 return err; 4291 if (tb[NL80211_TXRATE_LEGACY]) { 4292 mask->control[band].legacy = rateset_to_mask( 4293 sband, 4294 nla_data(tb[NL80211_TXRATE_LEGACY]), 4295 nla_len(tb[NL80211_TXRATE_LEGACY])); 4296 if ((mask->control[band].legacy == 0) && 4297 nla_len(tb[NL80211_TXRATE_LEGACY])) 4298 return -EINVAL; 4299 } 4300 if (tb[NL80211_TXRATE_HT]) { 4301 if (!ht_rateset_to_mask( 4302 sband, 4303 nla_data(tb[NL80211_TXRATE_HT]), 4304 nla_len(tb[NL80211_TXRATE_HT]), 4305 mask->control[band].ht_mcs)) 4306 return -EINVAL; 4307 } 4308 if (tb[NL80211_TXRATE_VHT]) { 4309 if (!vht_set_mcs_mask( 4310 sband, 4311 nla_data(tb[NL80211_TXRATE_VHT]), 4312 mask->control[band].vht_mcs)) 4313 return -EINVAL; 4314 } 4315 if (tb[NL80211_TXRATE_GI]) { 4316 mask->control[band].gi = 4317 nla_get_u8(tb[NL80211_TXRATE_GI]); 4318 if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI) 4319 return -EINVAL; 4320 } 4321 4322 if (mask->control[band].legacy == 0) { 4323 /* don't allow empty legacy rates if HT or VHT 4324 * are not even supported. 4325 */ 4326 if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported || 4327 rdev->wiphy.bands[band]->vht_cap.vht_supported)) 4328 return -EINVAL; 4329 4330 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) 4331 if (mask->control[band].ht_mcs[i]) 4332 goto out; 4333 4334 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) 4335 if (mask->control[band].vht_mcs[i]) 4336 goto out; 4337 4338 /* legacy and mcs rates may not be both empty */ 4339 return -EINVAL; 4340 } 4341 } 4342 4343 out: 4344 return 0; 4345 } 4346 4347 static int validate_beacon_tx_rate(struct cfg80211_registered_device *rdev, 4348 enum nl80211_band band, 4349 struct cfg80211_bitrate_mask *beacon_rate) 4350 { 4351 u32 count_ht, count_vht, i; 4352 u32 rate = beacon_rate->control[band].legacy; 4353 4354 /* Allow only one rate */ 4355 if (hweight32(rate) > 1) 4356 return -EINVAL; 4357 4358 count_ht = 0; 4359 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) { 4360 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) { 4361 return -EINVAL; 4362 } else if (beacon_rate->control[band].ht_mcs[i]) { 4363 count_ht++; 4364 if (count_ht > 1) 4365 return -EINVAL; 4366 } 4367 if (count_ht && rate) 4368 return -EINVAL; 4369 } 4370 4371 count_vht = 0; 4372 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 4373 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) { 4374 return -EINVAL; 4375 } else if (beacon_rate->control[band].vht_mcs[i]) { 4376 count_vht++; 4377 if (count_vht > 1) 4378 return -EINVAL; 4379 } 4380 if (count_vht && rate) 4381 return -EINVAL; 4382 } 4383 4384 if ((count_ht && count_vht) || (!rate && !count_ht && !count_vht)) 4385 return -EINVAL; 4386 4387 if (rate && 4388 !wiphy_ext_feature_isset(&rdev->wiphy, 4389 NL80211_EXT_FEATURE_BEACON_RATE_LEGACY)) 4390 return -EINVAL; 4391 if (count_ht && 4392 !wiphy_ext_feature_isset(&rdev->wiphy, 4393 NL80211_EXT_FEATURE_BEACON_RATE_HT)) 4394 return -EINVAL; 4395 if (count_vht && 4396 !wiphy_ext_feature_isset(&rdev->wiphy, 4397 NL80211_EXT_FEATURE_BEACON_RATE_VHT)) 4398 return -EINVAL; 4399 4400 return 0; 4401 } 4402 4403 static int nl80211_parse_beacon(struct cfg80211_registered_device *rdev, 4404 struct nlattr *attrs[], 4405 struct cfg80211_beacon_data *bcn) 4406 { 4407 bool haveinfo = false; 4408 int err; 4409 4410 memset(bcn, 0, sizeof(*bcn)); 4411 4412 if (attrs[NL80211_ATTR_BEACON_HEAD]) { 4413 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); 4414 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); 4415 if (!bcn->head_len) 4416 return -EINVAL; 4417 haveinfo = true; 4418 } 4419 4420 if (attrs[NL80211_ATTR_BEACON_TAIL]) { 4421 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]); 4422 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]); 4423 haveinfo = true; 4424 } 4425 4426 if (!haveinfo) 4427 return -EINVAL; 4428 4429 if (attrs[NL80211_ATTR_IE]) { 4430 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]); 4431 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]); 4432 } 4433 4434 if (attrs[NL80211_ATTR_IE_PROBE_RESP]) { 4435 bcn->proberesp_ies = 4436 nla_data(attrs[NL80211_ATTR_IE_PROBE_RESP]); 4437 bcn->proberesp_ies_len = 4438 nla_len(attrs[NL80211_ATTR_IE_PROBE_RESP]); 4439 } 4440 4441 if (attrs[NL80211_ATTR_IE_ASSOC_RESP]) { 4442 bcn->assocresp_ies = 4443 nla_data(attrs[NL80211_ATTR_IE_ASSOC_RESP]); 4444 bcn->assocresp_ies_len = 4445 nla_len(attrs[NL80211_ATTR_IE_ASSOC_RESP]); 4446 } 4447 4448 if (attrs[NL80211_ATTR_PROBE_RESP]) { 4449 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]); 4450 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]); 4451 } 4452 4453 if (attrs[NL80211_ATTR_FTM_RESPONDER]) { 4454 struct nlattr *tb[NL80211_FTM_RESP_ATTR_MAX + 1]; 4455 4456 err = nla_parse_nested_deprecated(tb, 4457 NL80211_FTM_RESP_ATTR_MAX, 4458 attrs[NL80211_ATTR_FTM_RESPONDER], 4459 NULL, NULL); 4460 if (err) 4461 return err; 4462 4463 if (tb[NL80211_FTM_RESP_ATTR_ENABLED] && 4464 wiphy_ext_feature_isset(&rdev->wiphy, 4465 NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER)) 4466 bcn->ftm_responder = 1; 4467 else 4468 return -EOPNOTSUPP; 4469 4470 if (tb[NL80211_FTM_RESP_ATTR_LCI]) { 4471 bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]); 4472 bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]); 4473 } 4474 4475 if (tb[NL80211_FTM_RESP_ATTR_CIVICLOC]) { 4476 bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); 4477 bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); 4478 } 4479 } else { 4480 bcn->ftm_responder = -1; 4481 } 4482 4483 return 0; 4484 } 4485 4486 static int nl80211_parse_he_obss_pd(struct nlattr *attrs, 4487 struct ieee80211_he_obss_pd *he_obss_pd) 4488 { 4489 struct nlattr *tb[NL80211_HE_OBSS_PD_ATTR_MAX + 1]; 4490 int err; 4491 4492 err = nla_parse_nested(tb, NL80211_HE_OBSS_PD_ATTR_MAX, attrs, 4493 he_obss_pd_policy, NULL); 4494 if (err) 4495 return err; 4496 4497 if (!tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET] || 4498 !tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]) 4499 return -EINVAL; 4500 4501 he_obss_pd->min_offset = 4502 nla_get_u32(tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET]); 4503 he_obss_pd->max_offset = 4504 nla_get_u32(tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]); 4505 4506 if (he_obss_pd->min_offset >= he_obss_pd->max_offset) 4507 return -EINVAL; 4508 4509 he_obss_pd->enable = true; 4510 4511 return 0; 4512 } 4513 4514 static void nl80211_check_ap_rate_selectors(struct cfg80211_ap_settings *params, 4515 const u8 *rates) 4516 { 4517 int i; 4518 4519 if (!rates) 4520 return; 4521 4522 for (i = 0; i < rates[1]; i++) { 4523 if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY) 4524 params->ht_required = true; 4525 if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY) 4526 params->vht_required = true; 4527 } 4528 } 4529 4530 /* 4531 * Since the nl80211 API didn't include, from the beginning, attributes about 4532 * HT/VHT requirements/capabilities, we parse them out of the IEs for the 4533 * benefit of drivers that rebuild IEs in the firmware. 4534 */ 4535 static void nl80211_calculate_ap_params(struct cfg80211_ap_settings *params) 4536 { 4537 const struct cfg80211_beacon_data *bcn = ¶ms->beacon; 4538 size_t ies_len = bcn->tail_len; 4539 const u8 *ies = bcn->tail; 4540 const u8 *rates; 4541 const u8 *cap; 4542 4543 rates = cfg80211_find_ie(WLAN_EID_SUPP_RATES, ies, ies_len); 4544 nl80211_check_ap_rate_selectors(params, rates); 4545 4546 rates = cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES, ies, ies_len); 4547 nl80211_check_ap_rate_selectors(params, rates); 4548 4549 cap = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, ies, ies_len); 4550 if (cap && cap[1] >= sizeof(*params->ht_cap)) 4551 params->ht_cap = (void *)(cap + 2); 4552 cap = cfg80211_find_ie(WLAN_EID_VHT_CAPABILITY, ies, ies_len); 4553 if (cap && cap[1] >= sizeof(*params->vht_cap)) 4554 params->vht_cap = (void *)(cap + 2); 4555 cap = cfg80211_find_ext_ie(WLAN_EID_EXT_HE_CAPABILITY, ies, ies_len); 4556 if (cap && cap[1] >= sizeof(*params->he_cap) + 1) 4557 params->he_cap = (void *)(cap + 3); 4558 } 4559 4560 static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev, 4561 struct cfg80211_ap_settings *params) 4562 { 4563 struct wireless_dev *wdev; 4564 bool ret = false; 4565 4566 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 4567 if (wdev->iftype != NL80211_IFTYPE_AP && 4568 wdev->iftype != NL80211_IFTYPE_P2P_GO) 4569 continue; 4570 4571 if (!wdev->preset_chandef.chan) 4572 continue; 4573 4574 params->chandef = wdev->preset_chandef; 4575 ret = true; 4576 break; 4577 } 4578 4579 return ret; 4580 } 4581 4582 static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev, 4583 enum nl80211_auth_type auth_type, 4584 enum nl80211_commands cmd) 4585 { 4586 if (auth_type > NL80211_AUTHTYPE_MAX) 4587 return false; 4588 4589 switch (cmd) { 4590 case NL80211_CMD_AUTHENTICATE: 4591 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && 4592 auth_type == NL80211_AUTHTYPE_SAE) 4593 return false; 4594 if (!wiphy_ext_feature_isset(&rdev->wiphy, 4595 NL80211_EXT_FEATURE_FILS_STA) && 4596 (auth_type == NL80211_AUTHTYPE_FILS_SK || 4597 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 4598 auth_type == NL80211_AUTHTYPE_FILS_PK)) 4599 return false; 4600 return true; 4601 case NL80211_CMD_CONNECT: 4602 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && 4603 !wiphy_ext_feature_isset(&rdev->wiphy, 4604 NL80211_EXT_FEATURE_SAE_OFFLOAD) && 4605 auth_type == NL80211_AUTHTYPE_SAE) 4606 return false; 4607 4608 /* FILS with SK PFS or PK not supported yet */ 4609 if (auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 4610 auth_type == NL80211_AUTHTYPE_FILS_PK) 4611 return false; 4612 if (!wiphy_ext_feature_isset( 4613 &rdev->wiphy, 4614 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) && 4615 auth_type == NL80211_AUTHTYPE_FILS_SK) 4616 return false; 4617 return true; 4618 case NL80211_CMD_START_AP: 4619 /* SAE not supported yet */ 4620 if (auth_type == NL80211_AUTHTYPE_SAE) 4621 return false; 4622 /* FILS not supported yet */ 4623 if (auth_type == NL80211_AUTHTYPE_FILS_SK || 4624 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 4625 auth_type == NL80211_AUTHTYPE_FILS_PK) 4626 return false; 4627 return true; 4628 default: 4629 return false; 4630 } 4631 } 4632 4633 static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) 4634 { 4635 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4636 struct net_device *dev = info->user_ptr[1]; 4637 struct wireless_dev *wdev = dev->ieee80211_ptr; 4638 struct cfg80211_ap_settings params; 4639 int err; 4640 4641 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 4642 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4643 return -EOPNOTSUPP; 4644 4645 if (!rdev->ops->start_ap) 4646 return -EOPNOTSUPP; 4647 4648 if (wdev->beacon_interval) 4649 return -EALREADY; 4650 4651 memset(¶ms, 0, sizeof(params)); 4652 4653 /* these are required for START_AP */ 4654 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] || 4655 !info->attrs[NL80211_ATTR_DTIM_PERIOD] || 4656 !info->attrs[NL80211_ATTR_BEACON_HEAD]) 4657 return -EINVAL; 4658 4659 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon); 4660 if (err) 4661 return err; 4662 4663 params.beacon_interval = 4664 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 4665 params.dtim_period = 4666 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 4667 4668 err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype, 4669 params.beacon_interval); 4670 if (err) 4671 return err; 4672 4673 /* 4674 * In theory, some of these attributes should be required here 4675 * but since they were not used when the command was originally 4676 * added, keep them optional for old user space programs to let 4677 * them continue to work with drivers that do not need the 4678 * additional information -- drivers must check! 4679 */ 4680 if (info->attrs[NL80211_ATTR_SSID]) { 4681 params.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 4682 params.ssid_len = 4683 nla_len(info->attrs[NL80211_ATTR_SSID]); 4684 if (params.ssid_len == 0 || 4685 params.ssid_len > IEEE80211_MAX_SSID_LEN) 4686 return -EINVAL; 4687 } 4688 4689 if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) 4690 params.hidden_ssid = nla_get_u32( 4691 info->attrs[NL80211_ATTR_HIDDEN_SSID]); 4692 4693 params.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 4694 4695 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 4696 params.auth_type = nla_get_u32( 4697 info->attrs[NL80211_ATTR_AUTH_TYPE]); 4698 if (!nl80211_valid_auth_type(rdev, params.auth_type, 4699 NL80211_CMD_START_AP)) 4700 return -EINVAL; 4701 } else 4702 params.auth_type = NL80211_AUTHTYPE_AUTOMATIC; 4703 4704 err = nl80211_crypto_settings(rdev, info, ¶ms.crypto, 4705 NL80211_MAX_NR_CIPHER_SUITES); 4706 if (err) 4707 return err; 4708 4709 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) { 4710 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) 4711 return -EOPNOTSUPP; 4712 params.inactivity_timeout = nla_get_u16( 4713 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]); 4714 } 4715 4716 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 4717 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4718 return -EINVAL; 4719 params.p2p_ctwindow = 4720 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 4721 if (params.p2p_ctwindow != 0 && 4722 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) 4723 return -EINVAL; 4724 } 4725 4726 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 4727 u8 tmp; 4728 4729 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4730 return -EINVAL; 4731 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 4732 params.p2p_opp_ps = tmp; 4733 if (params.p2p_opp_ps != 0 && 4734 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) 4735 return -EINVAL; 4736 } 4737 4738 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 4739 err = nl80211_parse_chandef(rdev, info, ¶ms.chandef); 4740 if (err) 4741 return err; 4742 } else if (wdev->preset_chandef.chan) { 4743 params.chandef = wdev->preset_chandef; 4744 } else if (!nl80211_get_ap_channel(rdev, ¶ms)) 4745 return -EINVAL; 4746 4747 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, 4748 wdev->iftype)) 4749 return -EINVAL; 4750 4751 if (info->attrs[NL80211_ATTR_TX_RATES]) { 4752 err = nl80211_parse_tx_bitrate_mask(info, ¶ms.beacon_rate); 4753 if (err) 4754 return err; 4755 4756 err = validate_beacon_tx_rate(rdev, params.chandef.chan->band, 4757 ¶ms.beacon_rate); 4758 if (err) 4759 return err; 4760 } 4761 4762 if (info->attrs[NL80211_ATTR_SMPS_MODE]) { 4763 params.smps_mode = 4764 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]); 4765 switch (params.smps_mode) { 4766 case NL80211_SMPS_OFF: 4767 break; 4768 case NL80211_SMPS_STATIC: 4769 if (!(rdev->wiphy.features & 4770 NL80211_FEATURE_STATIC_SMPS)) 4771 return -EINVAL; 4772 break; 4773 case NL80211_SMPS_DYNAMIC: 4774 if (!(rdev->wiphy.features & 4775 NL80211_FEATURE_DYNAMIC_SMPS)) 4776 return -EINVAL; 4777 break; 4778 default: 4779 return -EINVAL; 4780 } 4781 } else { 4782 params.smps_mode = NL80211_SMPS_OFF; 4783 } 4784 4785 params.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); 4786 if (params.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) 4787 return -EOPNOTSUPP; 4788 4789 if (info->attrs[NL80211_ATTR_ACL_POLICY]) { 4790 params.acl = parse_acl_data(&rdev->wiphy, info); 4791 if (IS_ERR(params.acl)) 4792 return PTR_ERR(params.acl); 4793 } 4794 4795 params.twt_responder = 4796 nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]); 4797 4798 if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) { 4799 err = nl80211_parse_he_obss_pd( 4800 info->attrs[NL80211_ATTR_HE_OBSS_PD], 4801 ¶ms.he_obss_pd); 4802 if (err) 4803 return err; 4804 } 4805 4806 nl80211_calculate_ap_params(¶ms); 4807 4808 if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT]) 4809 params.flags |= AP_SETTINGS_EXTERNAL_AUTH_SUPPORT; 4810 4811 wdev_lock(wdev); 4812 err = rdev_start_ap(rdev, dev, ¶ms); 4813 if (!err) { 4814 wdev->preset_chandef = params.chandef; 4815 wdev->beacon_interval = params.beacon_interval; 4816 wdev->chandef = params.chandef; 4817 wdev->ssid_len = params.ssid_len; 4818 memcpy(wdev->ssid, params.ssid, wdev->ssid_len); 4819 4820 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 4821 wdev->conn_owner_nlportid = info->snd_portid; 4822 } 4823 wdev_unlock(wdev); 4824 4825 kfree(params.acl); 4826 4827 return err; 4828 } 4829 4830 static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info) 4831 { 4832 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4833 struct net_device *dev = info->user_ptr[1]; 4834 struct wireless_dev *wdev = dev->ieee80211_ptr; 4835 struct cfg80211_beacon_data params; 4836 int err; 4837 4838 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 4839 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4840 return -EOPNOTSUPP; 4841 4842 if (!rdev->ops->change_beacon) 4843 return -EOPNOTSUPP; 4844 4845 if (!wdev->beacon_interval) 4846 return -EINVAL; 4847 4848 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms); 4849 if (err) 4850 return err; 4851 4852 wdev_lock(wdev); 4853 err = rdev_change_beacon(rdev, dev, ¶ms); 4854 wdev_unlock(wdev); 4855 4856 return err; 4857 } 4858 4859 static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info) 4860 { 4861 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4862 struct net_device *dev = info->user_ptr[1]; 4863 4864 return cfg80211_stop_ap(rdev, dev, false); 4865 } 4866 4867 static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = { 4868 [NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG }, 4869 [NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG }, 4870 [NL80211_STA_FLAG_WME] = { .type = NLA_FLAG }, 4871 [NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG }, 4872 [NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG }, 4873 [NL80211_STA_FLAG_TDLS_PEER] = { .type = NLA_FLAG }, 4874 }; 4875 4876 static int parse_station_flags(struct genl_info *info, 4877 enum nl80211_iftype iftype, 4878 struct station_parameters *params) 4879 { 4880 struct nlattr *flags[NL80211_STA_FLAG_MAX + 1]; 4881 struct nlattr *nla; 4882 int flag; 4883 4884 /* 4885 * Try parsing the new attribute first so userspace 4886 * can specify both for older kernels. 4887 */ 4888 nla = info->attrs[NL80211_ATTR_STA_FLAGS2]; 4889 if (nla) { 4890 struct nl80211_sta_flag_update *sta_flags; 4891 4892 sta_flags = nla_data(nla); 4893 params->sta_flags_mask = sta_flags->mask; 4894 params->sta_flags_set = sta_flags->set; 4895 params->sta_flags_set &= params->sta_flags_mask; 4896 if ((params->sta_flags_mask | 4897 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID)) 4898 return -EINVAL; 4899 return 0; 4900 } 4901 4902 /* if present, parse the old attribute */ 4903 4904 nla = info->attrs[NL80211_ATTR_STA_FLAGS]; 4905 if (!nla) 4906 return 0; 4907 4908 if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack)) 4909 return -EINVAL; 4910 4911 /* 4912 * Only allow certain flags for interface types so that 4913 * other attributes are silently ignored. Remember that 4914 * this is backward compatibility code with old userspace 4915 * and shouldn't be hit in other cases anyway. 4916 */ 4917 switch (iftype) { 4918 case NL80211_IFTYPE_AP: 4919 case NL80211_IFTYPE_AP_VLAN: 4920 case NL80211_IFTYPE_P2P_GO: 4921 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 4922 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 4923 BIT(NL80211_STA_FLAG_WME) | 4924 BIT(NL80211_STA_FLAG_MFP); 4925 break; 4926 case NL80211_IFTYPE_P2P_CLIENT: 4927 case NL80211_IFTYPE_STATION: 4928 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 4929 BIT(NL80211_STA_FLAG_TDLS_PEER); 4930 break; 4931 case NL80211_IFTYPE_MESH_POINT: 4932 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | 4933 BIT(NL80211_STA_FLAG_MFP) | 4934 BIT(NL80211_STA_FLAG_AUTHORIZED); 4935 break; 4936 default: 4937 return -EINVAL; 4938 } 4939 4940 for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++) { 4941 if (flags[flag]) { 4942 params->sta_flags_set |= (1<<flag); 4943 4944 /* no longer support new API additions in old API */ 4945 if (flag > NL80211_STA_FLAG_MAX_OLD_API) 4946 return -EINVAL; 4947 } 4948 } 4949 4950 return 0; 4951 } 4952 4953 bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info, int attr) 4954 { 4955 struct nlattr *rate; 4956 u32 bitrate; 4957 u16 bitrate_compat; 4958 enum nl80211_rate_info rate_flg; 4959 4960 rate = nla_nest_start_noflag(msg, attr); 4961 if (!rate) 4962 return false; 4963 4964 /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */ 4965 bitrate = cfg80211_calculate_bitrate(info); 4966 /* report 16-bit bitrate only if we can */ 4967 bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0; 4968 if (bitrate > 0 && 4969 nla_put_u32(msg, NL80211_RATE_INFO_BITRATE32, bitrate)) 4970 return false; 4971 if (bitrate_compat > 0 && 4972 nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat)) 4973 return false; 4974 4975 switch (info->bw) { 4976 case RATE_INFO_BW_5: 4977 rate_flg = NL80211_RATE_INFO_5_MHZ_WIDTH; 4978 break; 4979 case RATE_INFO_BW_10: 4980 rate_flg = NL80211_RATE_INFO_10_MHZ_WIDTH; 4981 break; 4982 default: 4983 WARN_ON(1); 4984 /* fall through */ 4985 case RATE_INFO_BW_20: 4986 rate_flg = 0; 4987 break; 4988 case RATE_INFO_BW_40: 4989 rate_flg = NL80211_RATE_INFO_40_MHZ_WIDTH; 4990 break; 4991 case RATE_INFO_BW_80: 4992 rate_flg = NL80211_RATE_INFO_80_MHZ_WIDTH; 4993 break; 4994 case RATE_INFO_BW_160: 4995 rate_flg = NL80211_RATE_INFO_160_MHZ_WIDTH; 4996 break; 4997 case RATE_INFO_BW_HE_RU: 4998 rate_flg = 0; 4999 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS)); 5000 } 5001 5002 if (rate_flg && nla_put_flag(msg, rate_flg)) 5003 return false; 5004 5005 if (info->flags & RATE_INFO_FLAGS_MCS) { 5006 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) 5007 return false; 5008 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 5009 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 5010 return false; 5011 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) { 5012 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs)) 5013 return false; 5014 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) 5015 return false; 5016 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 5017 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 5018 return false; 5019 } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) { 5020 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs)) 5021 return false; 5022 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss)) 5023 return false; 5024 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi)) 5025 return false; 5026 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm)) 5027 return false; 5028 if (info->bw == RATE_INFO_BW_HE_RU && 5029 nla_put_u8(msg, NL80211_RATE_INFO_HE_RU_ALLOC, 5030 info->he_ru_alloc)) 5031 return false; 5032 } 5033 5034 nla_nest_end(msg, rate); 5035 return true; 5036 } 5037 5038 static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal, 5039 int id) 5040 { 5041 void *attr; 5042 int i = 0; 5043 5044 if (!mask) 5045 return true; 5046 5047 attr = nla_nest_start_noflag(msg, id); 5048 if (!attr) 5049 return false; 5050 5051 for (i = 0; i < IEEE80211_MAX_CHAINS; i++) { 5052 if (!(mask & BIT(i))) 5053 continue; 5054 5055 if (nla_put_u8(msg, i, signal[i])) 5056 return false; 5057 } 5058 5059 nla_nest_end(msg, attr); 5060 5061 return true; 5062 } 5063 5064 static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid, 5065 u32 seq, int flags, 5066 struct cfg80211_registered_device *rdev, 5067 struct net_device *dev, 5068 const u8 *mac_addr, struct station_info *sinfo) 5069 { 5070 void *hdr; 5071 struct nlattr *sinfoattr, *bss_param; 5072 5073 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 5074 if (!hdr) { 5075 cfg80211_sinfo_release_content(sinfo); 5076 return -1; 5077 } 5078 5079 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 5080 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 5081 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation)) 5082 goto nla_put_failure; 5083 5084 sinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_STA_INFO); 5085 if (!sinfoattr) 5086 goto nla_put_failure; 5087 5088 #define PUT_SINFO(attr, memb, type) do { \ 5089 BUILD_BUG_ON(sizeof(type) == sizeof(u64)); \ 5090 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 5091 nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr, \ 5092 sinfo->memb)) \ 5093 goto nla_put_failure; \ 5094 } while (0) 5095 #define PUT_SINFO_U64(attr, memb) do { \ 5096 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 5097 nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr, \ 5098 sinfo->memb, NL80211_STA_INFO_PAD)) \ 5099 goto nla_put_failure; \ 5100 } while (0) 5101 5102 PUT_SINFO(CONNECTED_TIME, connected_time, u32); 5103 PUT_SINFO(INACTIVE_TIME, inactive_time, u32); 5104 PUT_SINFO_U64(ASSOC_AT_BOOTTIME, assoc_at); 5105 5106 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | 5107 BIT_ULL(NL80211_STA_INFO_RX_BYTES64)) && 5108 nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES, 5109 (u32)sinfo->rx_bytes)) 5110 goto nla_put_failure; 5111 5112 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | 5113 BIT_ULL(NL80211_STA_INFO_TX_BYTES64)) && 5114 nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES, 5115 (u32)sinfo->tx_bytes)) 5116 goto nla_put_failure; 5117 5118 PUT_SINFO_U64(RX_BYTES64, rx_bytes); 5119 PUT_SINFO_U64(TX_BYTES64, tx_bytes); 5120 PUT_SINFO(LLID, llid, u16); 5121 PUT_SINFO(PLID, plid, u16); 5122 PUT_SINFO(PLINK_STATE, plink_state, u8); 5123 PUT_SINFO_U64(RX_DURATION, rx_duration); 5124 PUT_SINFO_U64(TX_DURATION, tx_duration); 5125 5126 if (wiphy_ext_feature_isset(&rdev->wiphy, 5127 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 5128 PUT_SINFO(AIRTIME_WEIGHT, airtime_weight, u16); 5129 5130 switch (rdev->wiphy.signal_type) { 5131 case CFG80211_SIGNAL_TYPE_MBM: 5132 PUT_SINFO(SIGNAL, signal, u8); 5133 PUT_SINFO(SIGNAL_AVG, signal_avg, u8); 5134 break; 5135 default: 5136 break; 5137 } 5138 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { 5139 if (!nl80211_put_signal(msg, sinfo->chains, 5140 sinfo->chain_signal, 5141 NL80211_STA_INFO_CHAIN_SIGNAL)) 5142 goto nla_put_failure; 5143 } 5144 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { 5145 if (!nl80211_put_signal(msg, sinfo->chains, 5146 sinfo->chain_signal_avg, 5147 NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) 5148 goto nla_put_failure; 5149 } 5150 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { 5151 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, 5152 NL80211_STA_INFO_TX_BITRATE)) 5153 goto nla_put_failure; 5154 } 5155 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { 5156 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, 5157 NL80211_STA_INFO_RX_BITRATE)) 5158 goto nla_put_failure; 5159 } 5160 5161 PUT_SINFO(RX_PACKETS, rx_packets, u32); 5162 PUT_SINFO(TX_PACKETS, tx_packets, u32); 5163 PUT_SINFO(TX_RETRIES, tx_retries, u32); 5164 PUT_SINFO(TX_FAILED, tx_failed, u32); 5165 PUT_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32); 5166 PUT_SINFO(AIRTIME_LINK_METRIC, airtime_link_metric, u32); 5167 PUT_SINFO(BEACON_LOSS, beacon_loss_count, u32); 5168 PUT_SINFO(LOCAL_PM, local_pm, u32); 5169 PUT_SINFO(PEER_PM, peer_pm, u32); 5170 PUT_SINFO(NONPEER_PM, nonpeer_pm, u32); 5171 PUT_SINFO(CONNECTED_TO_GATE, connected_to_gate, u8); 5172 5173 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { 5174 bss_param = nla_nest_start_noflag(msg, 5175 NL80211_STA_INFO_BSS_PARAM); 5176 if (!bss_param) 5177 goto nla_put_failure; 5178 5179 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) && 5180 nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) || 5181 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) && 5182 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) || 5183 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && 5184 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) || 5185 nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD, 5186 sinfo->bss_param.dtim_period) || 5187 nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL, 5188 sinfo->bss_param.beacon_interval)) 5189 goto nla_put_failure; 5190 5191 nla_nest_end(msg, bss_param); 5192 } 5193 if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) && 5194 nla_put(msg, NL80211_STA_INFO_STA_FLAGS, 5195 sizeof(struct nl80211_sta_flag_update), 5196 &sinfo->sta_flags)) 5197 goto nla_put_failure; 5198 5199 PUT_SINFO_U64(T_OFFSET, t_offset); 5200 PUT_SINFO_U64(RX_DROP_MISC, rx_dropped_misc); 5201 PUT_SINFO_U64(BEACON_RX, rx_beacon); 5202 PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8); 5203 PUT_SINFO(RX_MPDUS, rx_mpdu_count, u32); 5204 PUT_SINFO(FCS_ERROR_COUNT, fcs_err_count, u32); 5205 if (wiphy_ext_feature_isset(&rdev->wiphy, 5206 NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT)) { 5207 PUT_SINFO(ACK_SIGNAL, ack_signal, u8); 5208 PUT_SINFO(ACK_SIGNAL_AVG, avg_ack_signal, s8); 5209 } 5210 5211 #undef PUT_SINFO 5212 #undef PUT_SINFO_U64 5213 5214 if (sinfo->pertid) { 5215 struct nlattr *tidsattr; 5216 int tid; 5217 5218 tidsattr = nla_nest_start_noflag(msg, 5219 NL80211_STA_INFO_TID_STATS); 5220 if (!tidsattr) 5221 goto nla_put_failure; 5222 5223 for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) { 5224 struct cfg80211_tid_stats *tidstats; 5225 struct nlattr *tidattr; 5226 5227 tidstats = &sinfo->pertid[tid]; 5228 5229 if (!tidstats->filled) 5230 continue; 5231 5232 tidattr = nla_nest_start_noflag(msg, tid + 1); 5233 if (!tidattr) 5234 goto nla_put_failure; 5235 5236 #define PUT_TIDVAL_U64(attr, memb) do { \ 5237 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ 5238 nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr, \ 5239 tidstats->memb, NL80211_TID_STATS_PAD)) \ 5240 goto nla_put_failure; \ 5241 } while (0) 5242 5243 PUT_TIDVAL_U64(RX_MSDU, rx_msdu); 5244 PUT_TIDVAL_U64(TX_MSDU, tx_msdu); 5245 PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries); 5246 PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed); 5247 5248 #undef PUT_TIDVAL_U64 5249 if ((tidstats->filled & 5250 BIT(NL80211_TID_STATS_TXQ_STATS)) && 5251 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, 5252 NL80211_TID_STATS_TXQ_STATS)) 5253 goto nla_put_failure; 5254 5255 nla_nest_end(msg, tidattr); 5256 } 5257 5258 nla_nest_end(msg, tidsattr); 5259 } 5260 5261 nla_nest_end(msg, sinfoattr); 5262 5263 if (sinfo->assoc_req_ies_len && 5264 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, 5265 sinfo->assoc_req_ies)) 5266 goto nla_put_failure; 5267 5268 cfg80211_sinfo_release_content(sinfo); 5269 genlmsg_end(msg, hdr); 5270 return 0; 5271 5272 nla_put_failure: 5273 cfg80211_sinfo_release_content(sinfo); 5274 genlmsg_cancel(msg, hdr); 5275 return -EMSGSIZE; 5276 } 5277 5278 static int nl80211_dump_station(struct sk_buff *skb, 5279 struct netlink_callback *cb) 5280 { 5281 struct station_info sinfo; 5282 struct cfg80211_registered_device *rdev; 5283 struct wireless_dev *wdev; 5284 u8 mac_addr[ETH_ALEN]; 5285 int sta_idx = cb->args[2]; 5286 int err; 5287 5288 rtnl_lock(); 5289 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev); 5290 if (err) 5291 goto out_err; 5292 5293 if (!wdev->netdev) { 5294 err = -EINVAL; 5295 goto out_err; 5296 } 5297 5298 if (!rdev->ops->dump_station) { 5299 err = -EOPNOTSUPP; 5300 goto out_err; 5301 } 5302 5303 while (1) { 5304 memset(&sinfo, 0, sizeof(sinfo)); 5305 err = rdev_dump_station(rdev, wdev->netdev, sta_idx, 5306 mac_addr, &sinfo); 5307 if (err == -ENOENT) 5308 break; 5309 if (err) 5310 goto out_err; 5311 5312 if (nl80211_send_station(skb, NL80211_CMD_NEW_STATION, 5313 NETLINK_CB(cb->skb).portid, 5314 cb->nlh->nlmsg_seq, NLM_F_MULTI, 5315 rdev, wdev->netdev, mac_addr, 5316 &sinfo) < 0) 5317 goto out; 5318 5319 sta_idx++; 5320 } 5321 5322 out: 5323 cb->args[2] = sta_idx; 5324 err = skb->len; 5325 out_err: 5326 rtnl_unlock(); 5327 5328 return err; 5329 } 5330 5331 static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info) 5332 { 5333 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5334 struct net_device *dev = info->user_ptr[1]; 5335 struct station_info sinfo; 5336 struct sk_buff *msg; 5337 u8 *mac_addr = NULL; 5338 int err; 5339 5340 memset(&sinfo, 0, sizeof(sinfo)); 5341 5342 if (!info->attrs[NL80211_ATTR_MAC]) 5343 return -EINVAL; 5344 5345 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5346 5347 if (!rdev->ops->get_station) 5348 return -EOPNOTSUPP; 5349 5350 err = rdev_get_station(rdev, dev, mac_addr, &sinfo); 5351 if (err) 5352 return err; 5353 5354 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 5355 if (!msg) { 5356 cfg80211_sinfo_release_content(&sinfo); 5357 return -ENOMEM; 5358 } 5359 5360 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 5361 info->snd_portid, info->snd_seq, 0, 5362 rdev, dev, mac_addr, &sinfo) < 0) { 5363 nlmsg_free(msg); 5364 return -ENOBUFS; 5365 } 5366 5367 return genlmsg_reply(msg, info); 5368 } 5369 5370 int cfg80211_check_station_change(struct wiphy *wiphy, 5371 struct station_parameters *params, 5372 enum cfg80211_station_type statype) 5373 { 5374 if (params->listen_interval != -1 && 5375 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 5376 return -EINVAL; 5377 5378 if (params->support_p2p_ps != -1 && 5379 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 5380 return -EINVAL; 5381 5382 if (params->aid && 5383 !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) && 5384 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 5385 return -EINVAL; 5386 5387 /* When you run into this, adjust the code below for the new flag */ 5388 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7); 5389 5390 switch (statype) { 5391 case CFG80211_STA_MESH_PEER_KERNEL: 5392 case CFG80211_STA_MESH_PEER_USER: 5393 /* 5394 * No ignoring the TDLS flag here -- the userspace mesh 5395 * code doesn't have the bug of including TDLS in the 5396 * mask everywhere. 5397 */ 5398 if (params->sta_flags_mask & 5399 ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) | 5400 BIT(NL80211_STA_FLAG_MFP) | 5401 BIT(NL80211_STA_FLAG_AUTHORIZED))) 5402 return -EINVAL; 5403 break; 5404 case CFG80211_STA_TDLS_PEER_SETUP: 5405 case CFG80211_STA_TDLS_PEER_ACTIVE: 5406 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 5407 return -EINVAL; 5408 /* ignore since it can't change */ 5409 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 5410 break; 5411 default: 5412 /* disallow mesh-specific things */ 5413 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) 5414 return -EINVAL; 5415 if (params->local_pm) 5416 return -EINVAL; 5417 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) 5418 return -EINVAL; 5419 } 5420 5421 if (statype != CFG80211_STA_TDLS_PEER_SETUP && 5422 statype != CFG80211_STA_TDLS_PEER_ACTIVE) { 5423 /* TDLS can't be set, ... */ 5424 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) 5425 return -EINVAL; 5426 /* 5427 * ... but don't bother the driver with it. This works around 5428 * a hostapd/wpa_supplicant issue -- it always includes the 5429 * TLDS_PEER flag in the mask even for AP mode. 5430 */ 5431 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 5432 } 5433 5434 if (statype != CFG80211_STA_TDLS_PEER_SETUP && 5435 statype != CFG80211_STA_AP_CLIENT_UNASSOC) { 5436 /* reject other things that can't change */ 5437 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) 5438 return -EINVAL; 5439 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) 5440 return -EINVAL; 5441 if (params->supported_rates) 5442 return -EINVAL; 5443 if (params->ext_capab || params->ht_capa || params->vht_capa || 5444 params->he_capa) 5445 return -EINVAL; 5446 } 5447 5448 if (statype != CFG80211_STA_AP_CLIENT && 5449 statype != CFG80211_STA_AP_CLIENT_UNASSOC) { 5450 if (params->vlan) 5451 return -EINVAL; 5452 } 5453 5454 switch (statype) { 5455 case CFG80211_STA_AP_MLME_CLIENT: 5456 /* Use this only for authorizing/unauthorizing a station */ 5457 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) 5458 return -EOPNOTSUPP; 5459 break; 5460 case CFG80211_STA_AP_CLIENT: 5461 case CFG80211_STA_AP_CLIENT_UNASSOC: 5462 /* accept only the listed bits */ 5463 if (params->sta_flags_mask & 5464 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 5465 BIT(NL80211_STA_FLAG_AUTHENTICATED) | 5466 BIT(NL80211_STA_FLAG_ASSOCIATED) | 5467 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 5468 BIT(NL80211_STA_FLAG_WME) | 5469 BIT(NL80211_STA_FLAG_MFP))) 5470 return -EINVAL; 5471 5472 /* but authenticated/associated only if driver handles it */ 5473 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 5474 params->sta_flags_mask & 5475 (BIT(NL80211_STA_FLAG_AUTHENTICATED) | 5476 BIT(NL80211_STA_FLAG_ASSOCIATED))) 5477 return -EINVAL; 5478 break; 5479 case CFG80211_STA_IBSS: 5480 case CFG80211_STA_AP_STA: 5481 /* reject any changes other than AUTHORIZED */ 5482 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) 5483 return -EINVAL; 5484 break; 5485 case CFG80211_STA_TDLS_PEER_SETUP: 5486 /* reject any changes other than AUTHORIZED or WME */ 5487 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 5488 BIT(NL80211_STA_FLAG_WME))) 5489 return -EINVAL; 5490 /* force (at least) rates when authorizing */ 5491 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) && 5492 !params->supported_rates) 5493 return -EINVAL; 5494 break; 5495 case CFG80211_STA_TDLS_PEER_ACTIVE: 5496 /* reject any changes */ 5497 return -EINVAL; 5498 case CFG80211_STA_MESH_PEER_KERNEL: 5499 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) 5500 return -EINVAL; 5501 break; 5502 case CFG80211_STA_MESH_PEER_USER: 5503 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION && 5504 params->plink_action != NL80211_PLINK_ACTION_BLOCK) 5505 return -EINVAL; 5506 break; 5507 } 5508 5509 /* 5510 * Older kernel versions ignored this attribute entirely, so don't 5511 * reject attempts to update it but mark it as unused instead so the 5512 * driver won't look at the data. 5513 */ 5514 if (statype != CFG80211_STA_AP_CLIENT_UNASSOC && 5515 statype != CFG80211_STA_TDLS_PEER_SETUP) 5516 params->opmode_notif_used = false; 5517 5518 return 0; 5519 } 5520 EXPORT_SYMBOL(cfg80211_check_station_change); 5521 5522 /* 5523 * Get vlan interface making sure it is running and on the right wiphy. 5524 */ 5525 static struct net_device *get_vlan(struct genl_info *info, 5526 struct cfg80211_registered_device *rdev) 5527 { 5528 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; 5529 struct net_device *v; 5530 int ret; 5531 5532 if (!vlanattr) 5533 return NULL; 5534 5535 v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr)); 5536 if (!v) 5537 return ERR_PTR(-ENODEV); 5538 5539 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { 5540 ret = -EINVAL; 5541 goto error; 5542 } 5543 5544 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && 5545 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 5546 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 5547 ret = -EINVAL; 5548 goto error; 5549 } 5550 5551 if (!netif_running(v)) { 5552 ret = -ENETDOWN; 5553 goto error; 5554 } 5555 5556 return v; 5557 error: 5558 dev_put(v); 5559 return ERR_PTR(ret); 5560 } 5561 5562 static const struct nla_policy 5563 nl80211_sta_wme_policy[NL80211_STA_WME_MAX + 1] = { 5564 [NL80211_STA_WME_UAPSD_QUEUES] = { .type = NLA_U8 }, 5565 [NL80211_STA_WME_MAX_SP] = { .type = NLA_U8 }, 5566 }; 5567 5568 static int nl80211_parse_sta_wme(struct genl_info *info, 5569 struct station_parameters *params) 5570 { 5571 struct nlattr *tb[NL80211_STA_WME_MAX + 1]; 5572 struct nlattr *nla; 5573 int err; 5574 5575 /* parse WME attributes if present */ 5576 if (!info->attrs[NL80211_ATTR_STA_WME]) 5577 return 0; 5578 5579 nla = info->attrs[NL80211_ATTR_STA_WME]; 5580 err = nla_parse_nested_deprecated(tb, NL80211_STA_WME_MAX, nla, 5581 nl80211_sta_wme_policy, 5582 info->extack); 5583 if (err) 5584 return err; 5585 5586 if (tb[NL80211_STA_WME_UAPSD_QUEUES]) 5587 params->uapsd_queues = nla_get_u8( 5588 tb[NL80211_STA_WME_UAPSD_QUEUES]); 5589 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) 5590 return -EINVAL; 5591 5592 if (tb[NL80211_STA_WME_MAX_SP]) 5593 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); 5594 5595 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) 5596 return -EINVAL; 5597 5598 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; 5599 5600 return 0; 5601 } 5602 5603 static int nl80211_parse_sta_channel_info(struct genl_info *info, 5604 struct station_parameters *params) 5605 { 5606 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { 5607 params->supported_channels = 5608 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 5609 params->supported_channels_len = 5610 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 5611 /* 5612 * Need to include at least one (first channel, number of 5613 * channels) tuple for each subband, and must have proper 5614 * tuples for the rest of the data as well. 5615 */ 5616 if (params->supported_channels_len < 2) 5617 return -EINVAL; 5618 if (params->supported_channels_len % 2) 5619 return -EINVAL; 5620 } 5621 5622 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { 5623 params->supported_oper_classes = 5624 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 5625 params->supported_oper_classes_len = 5626 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 5627 /* 5628 * The value of the Length field of the Supported Operating 5629 * Classes element is between 2 and 253. 5630 */ 5631 if (params->supported_oper_classes_len < 2 || 5632 params->supported_oper_classes_len > 253) 5633 return -EINVAL; 5634 } 5635 return 0; 5636 } 5637 5638 static int nl80211_set_station_tdls(struct genl_info *info, 5639 struct station_parameters *params) 5640 { 5641 int err; 5642 /* Dummy STA entry gets updated once the peer capabilities are known */ 5643 if (info->attrs[NL80211_ATTR_PEER_AID]) 5644 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 5645 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 5646 params->ht_capa = 5647 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 5648 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 5649 params->vht_capa = 5650 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 5651 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 5652 params->he_capa = 5653 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 5654 params->he_capa_len = 5655 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 5656 5657 if (params->he_capa_len < NL80211_HE_MIN_CAPABILITY_LEN) 5658 return -EINVAL; 5659 } 5660 5661 err = nl80211_parse_sta_channel_info(info, params); 5662 if (err) 5663 return err; 5664 5665 return nl80211_parse_sta_wme(info, params); 5666 } 5667 5668 static int nl80211_parse_sta_txpower_setting(struct genl_info *info, 5669 struct station_parameters *params) 5670 { 5671 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5672 int idx; 5673 5674 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) { 5675 if (!rdev->ops->set_tx_power || 5676 !wiphy_ext_feature_isset(&rdev->wiphy, 5677 NL80211_EXT_FEATURE_STA_TX_PWR)) 5678 return -EOPNOTSUPP; 5679 5680 idx = NL80211_ATTR_STA_TX_POWER_SETTING; 5681 params->txpwr.type = nla_get_u8(info->attrs[idx]); 5682 5683 if (params->txpwr.type == NL80211_TX_POWER_LIMITED) { 5684 idx = NL80211_ATTR_STA_TX_POWER; 5685 5686 if (info->attrs[idx]) 5687 params->txpwr.power = 5688 nla_get_s16(info->attrs[idx]); 5689 else 5690 return -EINVAL; 5691 } 5692 params->sta_modify_mask |= STATION_PARAM_APPLY_STA_TXPOWER; 5693 } 5694 5695 return 0; 5696 } 5697 5698 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) 5699 { 5700 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5701 struct net_device *dev = info->user_ptr[1]; 5702 struct station_parameters params; 5703 u8 *mac_addr; 5704 int err; 5705 5706 memset(¶ms, 0, sizeof(params)); 5707 5708 if (!rdev->ops->change_station) 5709 return -EOPNOTSUPP; 5710 5711 /* 5712 * AID and listen_interval properties can be set only for unassociated 5713 * station. Include these parameters here and will check them in 5714 * cfg80211_check_station_change(). 5715 */ 5716 if (info->attrs[NL80211_ATTR_STA_AID]) 5717 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 5718 5719 if (info->attrs[NL80211_ATTR_VLAN_ID]) 5720 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 5721 5722 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 5723 params.listen_interval = 5724 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 5725 else 5726 params.listen_interval = -1; 5727 5728 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) 5729 params.support_p2p_ps = 5730 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); 5731 else 5732 params.support_p2p_ps = -1; 5733 5734 if (!info->attrs[NL80211_ATTR_MAC]) 5735 return -EINVAL; 5736 5737 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5738 5739 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 5740 params.supported_rates = 5741 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 5742 params.supported_rates_len = 5743 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 5744 } 5745 5746 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 5747 params.capability = 5748 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 5749 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 5750 } 5751 5752 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 5753 params.ext_capab = 5754 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 5755 params.ext_capab_len = 5756 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 5757 } 5758 5759 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) 5760 return -EINVAL; 5761 5762 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) 5763 params.plink_action = 5764 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 5765 5766 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { 5767 params.plink_state = 5768 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); 5769 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) 5770 params.peer_aid = nla_get_u16( 5771 info->attrs[NL80211_ATTR_MESH_PEER_AID]); 5772 params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE; 5773 } 5774 5775 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) 5776 params.local_pm = nla_get_u32( 5777 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); 5778 5779 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 5780 params.opmode_notif_used = true; 5781 params.opmode_notif = 5782 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 5783 } 5784 5785 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) 5786 params.airtime_weight = 5787 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); 5788 5789 if (params.airtime_weight && 5790 !wiphy_ext_feature_isset(&rdev->wiphy, 5791 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 5792 return -EOPNOTSUPP; 5793 5794 err = nl80211_parse_sta_txpower_setting(info, ¶ms); 5795 if (err) 5796 return err; 5797 5798 /* Include parameters for TDLS peer (will check later) */ 5799 err = nl80211_set_station_tdls(info, ¶ms); 5800 if (err) 5801 return err; 5802 5803 params.vlan = get_vlan(info, rdev); 5804 if (IS_ERR(params.vlan)) 5805 return PTR_ERR(params.vlan); 5806 5807 switch (dev->ieee80211_ptr->iftype) { 5808 case NL80211_IFTYPE_AP: 5809 case NL80211_IFTYPE_AP_VLAN: 5810 case NL80211_IFTYPE_P2P_GO: 5811 case NL80211_IFTYPE_P2P_CLIENT: 5812 case NL80211_IFTYPE_STATION: 5813 case NL80211_IFTYPE_ADHOC: 5814 case NL80211_IFTYPE_MESH_POINT: 5815 break; 5816 default: 5817 err = -EOPNOTSUPP; 5818 goto out_put_vlan; 5819 } 5820 5821 /* driver will call cfg80211_check_station_change() */ 5822 err = rdev_change_station(rdev, dev, mac_addr, ¶ms); 5823 5824 out_put_vlan: 5825 if (params.vlan) 5826 dev_put(params.vlan); 5827 5828 return err; 5829 } 5830 5831 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info) 5832 { 5833 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5834 int err; 5835 struct net_device *dev = info->user_ptr[1]; 5836 struct station_parameters params; 5837 u8 *mac_addr = NULL; 5838 u32 auth_assoc = BIT(NL80211_STA_FLAG_AUTHENTICATED) | 5839 BIT(NL80211_STA_FLAG_ASSOCIATED); 5840 5841 memset(¶ms, 0, sizeof(params)); 5842 5843 if (!rdev->ops->add_station) 5844 return -EOPNOTSUPP; 5845 5846 if (!info->attrs[NL80211_ATTR_MAC]) 5847 return -EINVAL; 5848 5849 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 5850 return -EINVAL; 5851 5852 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 5853 return -EINVAL; 5854 5855 if (!info->attrs[NL80211_ATTR_STA_AID] && 5856 !info->attrs[NL80211_ATTR_PEER_AID]) 5857 return -EINVAL; 5858 5859 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5860 params.supported_rates = 5861 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 5862 params.supported_rates_len = 5863 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 5864 params.listen_interval = 5865 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 5866 5867 if (info->attrs[NL80211_ATTR_VLAN_ID]) 5868 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 5869 5870 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { 5871 params.support_p2p_ps = 5872 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); 5873 } else { 5874 /* 5875 * if not specified, assume it's supported for P2P GO interface, 5876 * and is NOT supported for AP interface 5877 */ 5878 params.support_p2p_ps = 5879 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO; 5880 } 5881 5882 if (info->attrs[NL80211_ATTR_PEER_AID]) 5883 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 5884 else 5885 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 5886 5887 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 5888 params.capability = 5889 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 5890 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 5891 } 5892 5893 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 5894 params.ext_capab = 5895 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 5896 params.ext_capab_len = 5897 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 5898 } 5899 5900 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 5901 params.ht_capa = 5902 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 5903 5904 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 5905 params.vht_capa = 5906 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 5907 5908 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 5909 params.he_capa = 5910 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 5911 params.he_capa_len = 5912 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 5913 5914 /* max len is validated in nla policy */ 5915 if (params.he_capa_len < NL80211_HE_MIN_CAPABILITY_LEN) 5916 return -EINVAL; 5917 } 5918 5919 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 5920 params.opmode_notif_used = true; 5921 params.opmode_notif = 5922 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 5923 } 5924 5925 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) 5926 params.plink_action = 5927 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 5928 5929 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) 5930 params.airtime_weight = 5931 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); 5932 5933 if (params.airtime_weight && 5934 !wiphy_ext_feature_isset(&rdev->wiphy, 5935 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 5936 return -EOPNOTSUPP; 5937 5938 err = nl80211_parse_sta_txpower_setting(info, ¶ms); 5939 if (err) 5940 return err; 5941 5942 err = nl80211_parse_sta_channel_info(info, ¶ms); 5943 if (err) 5944 return err; 5945 5946 err = nl80211_parse_sta_wme(info, ¶ms); 5947 if (err) 5948 return err; 5949 5950 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) 5951 return -EINVAL; 5952 5953 /* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT 5954 * as userspace might just pass through the capabilities from the IEs 5955 * directly, rather than enforcing this restriction and returning an 5956 * error in this case. 5957 */ 5958 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) { 5959 params.ht_capa = NULL; 5960 params.vht_capa = NULL; 5961 5962 /* HE requires WME */ 5963 if (params.he_capa_len) 5964 return -EINVAL; 5965 } 5966 5967 /* When you run into this, adjust the code below for the new flag */ 5968 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7); 5969 5970 switch (dev->ieee80211_ptr->iftype) { 5971 case NL80211_IFTYPE_AP: 5972 case NL80211_IFTYPE_AP_VLAN: 5973 case NL80211_IFTYPE_P2P_GO: 5974 /* ignore WME attributes if iface/sta is not capable */ 5975 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || 5976 !(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) 5977 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 5978 5979 /* TDLS peers cannot be added */ 5980 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 5981 info->attrs[NL80211_ATTR_PEER_AID]) 5982 return -EINVAL; 5983 /* but don't bother the driver with it */ 5984 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 5985 5986 /* allow authenticated/associated only if driver handles it */ 5987 if (!(rdev->wiphy.features & 5988 NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 5989 params.sta_flags_mask & auth_assoc) 5990 return -EINVAL; 5991 5992 /* Older userspace, or userspace wanting to be compatible with 5993 * !NL80211_FEATURE_FULL_AP_CLIENT_STATE, will not set the auth 5994 * and assoc flags in the mask, but assumes the station will be 5995 * added as associated anyway since this was the required driver 5996 * behaviour before NL80211_FEATURE_FULL_AP_CLIENT_STATE was 5997 * introduced. 5998 * In order to not bother drivers with this quirk in the API 5999 * set the flags in both the mask and set for new stations in 6000 * this case. 6001 */ 6002 if (!(params.sta_flags_mask & auth_assoc)) { 6003 params.sta_flags_mask |= auth_assoc; 6004 params.sta_flags_set |= auth_assoc; 6005 } 6006 6007 /* must be last in here for error handling */ 6008 params.vlan = get_vlan(info, rdev); 6009 if (IS_ERR(params.vlan)) 6010 return PTR_ERR(params.vlan); 6011 break; 6012 case NL80211_IFTYPE_MESH_POINT: 6013 /* ignore uAPSD data */ 6014 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 6015 6016 /* associated is disallowed */ 6017 if (params.sta_flags_mask & BIT(NL80211_STA_FLAG_ASSOCIATED)) 6018 return -EINVAL; 6019 /* TDLS peers cannot be added */ 6020 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 6021 info->attrs[NL80211_ATTR_PEER_AID]) 6022 return -EINVAL; 6023 break; 6024 case NL80211_IFTYPE_STATION: 6025 case NL80211_IFTYPE_P2P_CLIENT: 6026 /* ignore uAPSD data */ 6027 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 6028 6029 /* these are disallowed */ 6030 if (params.sta_flags_mask & 6031 (BIT(NL80211_STA_FLAG_ASSOCIATED) | 6032 BIT(NL80211_STA_FLAG_AUTHENTICATED))) 6033 return -EINVAL; 6034 /* Only TDLS peers can be added */ 6035 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 6036 return -EINVAL; 6037 /* Can only add if TDLS ... */ 6038 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) 6039 return -EOPNOTSUPP; 6040 /* ... with external setup is supported */ 6041 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) 6042 return -EOPNOTSUPP; 6043 /* 6044 * Older wpa_supplicant versions always mark the TDLS peer 6045 * as authorized, but it shouldn't yet be. 6046 */ 6047 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_AUTHORIZED); 6048 break; 6049 default: 6050 return -EOPNOTSUPP; 6051 } 6052 6053 /* be aware of params.vlan when changing code here */ 6054 6055 err = rdev_add_station(rdev, dev, mac_addr, ¶ms); 6056 6057 if (params.vlan) 6058 dev_put(params.vlan); 6059 return err; 6060 } 6061 6062 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info) 6063 { 6064 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6065 struct net_device *dev = info->user_ptr[1]; 6066 struct station_del_parameters params; 6067 6068 memset(¶ms, 0, sizeof(params)); 6069 6070 if (info->attrs[NL80211_ATTR_MAC]) 6071 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]); 6072 6073 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 6074 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && 6075 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && 6076 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 6077 return -EINVAL; 6078 6079 if (!rdev->ops->del_station) 6080 return -EOPNOTSUPP; 6081 6082 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) { 6083 params.subtype = 6084 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]); 6085 if (params.subtype != IEEE80211_STYPE_DISASSOC >> 4 && 6086 params.subtype != IEEE80211_STYPE_DEAUTH >> 4) 6087 return -EINVAL; 6088 } else { 6089 /* Default to Deauthentication frame */ 6090 params.subtype = IEEE80211_STYPE_DEAUTH >> 4; 6091 } 6092 6093 if (info->attrs[NL80211_ATTR_REASON_CODE]) { 6094 params.reason_code = 6095 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 6096 if (params.reason_code == 0) 6097 return -EINVAL; /* 0 is reserved */ 6098 } else { 6099 /* Default to reason code 2 */ 6100 params.reason_code = WLAN_REASON_PREV_AUTH_NOT_VALID; 6101 } 6102 6103 return rdev_del_station(rdev, dev, ¶ms); 6104 } 6105 6106 static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq, 6107 int flags, struct net_device *dev, 6108 u8 *dst, u8 *next_hop, 6109 struct mpath_info *pinfo) 6110 { 6111 void *hdr; 6112 struct nlattr *pinfoattr; 6113 6114 hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_MPATH); 6115 if (!hdr) 6116 return -1; 6117 6118 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 6119 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dst) || 6120 nla_put(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop) || 6121 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) 6122 goto nla_put_failure; 6123 6124 pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MPATH_INFO); 6125 if (!pinfoattr) 6126 goto nla_put_failure; 6127 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && 6128 nla_put_u32(msg, NL80211_MPATH_INFO_FRAME_QLEN, 6129 pinfo->frame_qlen)) 6130 goto nla_put_failure; 6131 if (((pinfo->filled & MPATH_INFO_SN) && 6132 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || 6133 ((pinfo->filled & MPATH_INFO_METRIC) && 6134 nla_put_u32(msg, NL80211_MPATH_INFO_METRIC, 6135 pinfo->metric)) || 6136 ((pinfo->filled & MPATH_INFO_EXPTIME) && 6137 nla_put_u32(msg, NL80211_MPATH_INFO_EXPTIME, 6138 pinfo->exptime)) || 6139 ((pinfo->filled & MPATH_INFO_FLAGS) && 6140 nla_put_u8(msg, NL80211_MPATH_INFO_FLAGS, 6141 pinfo->flags)) || 6142 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && 6143 nla_put_u32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT, 6144 pinfo->discovery_timeout)) || 6145 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && 6146 nla_put_u8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES, 6147 pinfo->discovery_retries)) || 6148 ((pinfo->filled & MPATH_INFO_HOP_COUNT) && 6149 nla_put_u8(msg, NL80211_MPATH_INFO_HOP_COUNT, 6150 pinfo->hop_count)) || 6151 ((pinfo->filled & MPATH_INFO_PATH_CHANGE) && 6152 nla_put_u32(msg, NL80211_MPATH_INFO_PATH_CHANGE, 6153 pinfo->path_change_count))) 6154 goto nla_put_failure; 6155 6156 nla_nest_end(msg, pinfoattr); 6157 6158 genlmsg_end(msg, hdr); 6159 return 0; 6160 6161 nla_put_failure: 6162 genlmsg_cancel(msg, hdr); 6163 return -EMSGSIZE; 6164 } 6165 6166 static int nl80211_dump_mpath(struct sk_buff *skb, 6167 struct netlink_callback *cb) 6168 { 6169 struct mpath_info pinfo; 6170 struct cfg80211_registered_device *rdev; 6171 struct wireless_dev *wdev; 6172 u8 dst[ETH_ALEN]; 6173 u8 next_hop[ETH_ALEN]; 6174 int path_idx = cb->args[2]; 6175 int err; 6176 6177 rtnl_lock(); 6178 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev); 6179 if (err) 6180 goto out_err; 6181 6182 if (!rdev->ops->dump_mpath) { 6183 err = -EOPNOTSUPP; 6184 goto out_err; 6185 } 6186 6187 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 6188 err = -EOPNOTSUPP; 6189 goto out_err; 6190 } 6191 6192 while (1) { 6193 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst, 6194 next_hop, &pinfo); 6195 if (err == -ENOENT) 6196 break; 6197 if (err) 6198 goto out_err; 6199 6200 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 6201 cb->nlh->nlmsg_seq, NLM_F_MULTI, 6202 wdev->netdev, dst, next_hop, 6203 &pinfo) < 0) 6204 goto out; 6205 6206 path_idx++; 6207 } 6208 6209 out: 6210 cb->args[2] = path_idx; 6211 err = skb->len; 6212 out_err: 6213 rtnl_unlock(); 6214 return err; 6215 } 6216 6217 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info) 6218 { 6219 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6220 int err; 6221 struct net_device *dev = info->user_ptr[1]; 6222 struct mpath_info pinfo; 6223 struct sk_buff *msg; 6224 u8 *dst = NULL; 6225 u8 next_hop[ETH_ALEN]; 6226 6227 memset(&pinfo, 0, sizeof(pinfo)); 6228 6229 if (!info->attrs[NL80211_ATTR_MAC]) 6230 return -EINVAL; 6231 6232 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 6233 6234 if (!rdev->ops->get_mpath) 6235 return -EOPNOTSUPP; 6236 6237 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 6238 return -EOPNOTSUPP; 6239 6240 err = rdev_get_mpath(rdev, dev, dst, next_hop, &pinfo); 6241 if (err) 6242 return err; 6243 6244 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 6245 if (!msg) 6246 return -ENOMEM; 6247 6248 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 6249 dev, dst, next_hop, &pinfo) < 0) { 6250 nlmsg_free(msg); 6251 return -ENOBUFS; 6252 } 6253 6254 return genlmsg_reply(msg, info); 6255 } 6256 6257 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info) 6258 { 6259 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6260 struct net_device *dev = info->user_ptr[1]; 6261 u8 *dst = NULL; 6262 u8 *next_hop = NULL; 6263 6264 if (!info->attrs[NL80211_ATTR_MAC]) 6265 return -EINVAL; 6266 6267 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 6268 return -EINVAL; 6269 6270 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 6271 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 6272 6273 if (!rdev->ops->change_mpath) 6274 return -EOPNOTSUPP; 6275 6276 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 6277 return -EOPNOTSUPP; 6278 6279 return rdev_change_mpath(rdev, dev, dst, next_hop); 6280 } 6281 6282 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info) 6283 { 6284 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6285 struct net_device *dev = info->user_ptr[1]; 6286 u8 *dst = NULL; 6287 u8 *next_hop = NULL; 6288 6289 if (!info->attrs[NL80211_ATTR_MAC]) 6290 return -EINVAL; 6291 6292 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 6293 return -EINVAL; 6294 6295 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 6296 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 6297 6298 if (!rdev->ops->add_mpath) 6299 return -EOPNOTSUPP; 6300 6301 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 6302 return -EOPNOTSUPP; 6303 6304 return rdev_add_mpath(rdev, dev, dst, next_hop); 6305 } 6306 6307 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info) 6308 { 6309 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6310 struct net_device *dev = info->user_ptr[1]; 6311 u8 *dst = NULL; 6312 6313 if (info->attrs[NL80211_ATTR_MAC]) 6314 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 6315 6316 if (!rdev->ops->del_mpath) 6317 return -EOPNOTSUPP; 6318 6319 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 6320 return -EOPNOTSUPP; 6321 6322 return rdev_del_mpath(rdev, dev, dst); 6323 } 6324 6325 static int nl80211_get_mpp(struct sk_buff *skb, struct genl_info *info) 6326 { 6327 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6328 int err; 6329 struct net_device *dev = info->user_ptr[1]; 6330 struct mpath_info pinfo; 6331 struct sk_buff *msg; 6332 u8 *dst = NULL; 6333 u8 mpp[ETH_ALEN]; 6334 6335 memset(&pinfo, 0, sizeof(pinfo)); 6336 6337 if (!info->attrs[NL80211_ATTR_MAC]) 6338 return -EINVAL; 6339 6340 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 6341 6342 if (!rdev->ops->get_mpp) 6343 return -EOPNOTSUPP; 6344 6345 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 6346 return -EOPNOTSUPP; 6347 6348 err = rdev_get_mpp(rdev, dev, dst, mpp, &pinfo); 6349 if (err) 6350 return err; 6351 6352 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 6353 if (!msg) 6354 return -ENOMEM; 6355 6356 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 6357 dev, dst, mpp, &pinfo) < 0) { 6358 nlmsg_free(msg); 6359 return -ENOBUFS; 6360 } 6361 6362 return genlmsg_reply(msg, info); 6363 } 6364 6365 static int nl80211_dump_mpp(struct sk_buff *skb, 6366 struct netlink_callback *cb) 6367 { 6368 struct mpath_info pinfo; 6369 struct cfg80211_registered_device *rdev; 6370 struct wireless_dev *wdev; 6371 u8 dst[ETH_ALEN]; 6372 u8 mpp[ETH_ALEN]; 6373 int path_idx = cb->args[2]; 6374 int err; 6375 6376 rtnl_lock(); 6377 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev); 6378 if (err) 6379 goto out_err; 6380 6381 if (!rdev->ops->dump_mpp) { 6382 err = -EOPNOTSUPP; 6383 goto out_err; 6384 } 6385 6386 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 6387 err = -EOPNOTSUPP; 6388 goto out_err; 6389 } 6390 6391 while (1) { 6392 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst, 6393 mpp, &pinfo); 6394 if (err == -ENOENT) 6395 break; 6396 if (err) 6397 goto out_err; 6398 6399 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 6400 cb->nlh->nlmsg_seq, NLM_F_MULTI, 6401 wdev->netdev, dst, mpp, 6402 &pinfo) < 0) 6403 goto out; 6404 6405 path_idx++; 6406 } 6407 6408 out: 6409 cb->args[2] = path_idx; 6410 err = skb->len; 6411 out_err: 6412 rtnl_unlock(); 6413 return err; 6414 } 6415 6416 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info) 6417 { 6418 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6419 struct net_device *dev = info->user_ptr[1]; 6420 struct wireless_dev *wdev = dev->ieee80211_ptr; 6421 struct bss_parameters params; 6422 int err; 6423 6424 memset(¶ms, 0, sizeof(params)); 6425 /* default to not changing parameters */ 6426 params.use_cts_prot = -1; 6427 params.use_short_preamble = -1; 6428 params.use_short_slot_time = -1; 6429 params.ap_isolate = -1; 6430 params.ht_opmode = -1; 6431 params.p2p_ctwindow = -1; 6432 params.p2p_opp_ps = -1; 6433 6434 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) 6435 params.use_cts_prot = 6436 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); 6437 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) 6438 params.use_short_preamble = 6439 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); 6440 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) 6441 params.use_short_slot_time = 6442 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); 6443 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 6444 params.basic_rates = 6445 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 6446 params.basic_rates_len = 6447 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 6448 } 6449 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) 6450 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); 6451 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) 6452 params.ht_opmode = 6453 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); 6454 6455 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 6456 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 6457 return -EINVAL; 6458 params.p2p_ctwindow = 6459 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 6460 if (params.p2p_ctwindow != 0 && 6461 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) 6462 return -EINVAL; 6463 } 6464 6465 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 6466 u8 tmp; 6467 6468 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 6469 return -EINVAL; 6470 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 6471 params.p2p_opp_ps = tmp; 6472 if (params.p2p_opp_ps && 6473 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) 6474 return -EINVAL; 6475 } 6476 6477 if (!rdev->ops->change_bss) 6478 return -EOPNOTSUPP; 6479 6480 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 6481 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 6482 return -EOPNOTSUPP; 6483 6484 wdev_lock(wdev); 6485 err = rdev_change_bss(rdev, dev, ¶ms); 6486 wdev_unlock(wdev); 6487 6488 return err; 6489 } 6490 6491 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info) 6492 { 6493 char *data = NULL; 6494 bool is_indoor; 6495 enum nl80211_user_reg_hint_type user_reg_hint_type; 6496 u32 owner_nlportid; 6497 6498 /* 6499 * You should only get this when cfg80211 hasn't yet initialized 6500 * completely when built-in to the kernel right between the time 6501 * window between nl80211_init() and regulatory_init(), if that is 6502 * even possible. 6503 */ 6504 if (unlikely(!rcu_access_pointer(cfg80211_regdomain))) 6505 return -EINPROGRESS; 6506 6507 if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]) 6508 user_reg_hint_type = 6509 nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]); 6510 else 6511 user_reg_hint_type = NL80211_USER_REG_HINT_USER; 6512 6513 switch (user_reg_hint_type) { 6514 case NL80211_USER_REG_HINT_USER: 6515 case NL80211_USER_REG_HINT_CELL_BASE: 6516 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 6517 return -EINVAL; 6518 6519 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 6520 return regulatory_hint_user(data, user_reg_hint_type); 6521 case NL80211_USER_REG_HINT_INDOOR: 6522 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 6523 owner_nlportid = info->snd_portid; 6524 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR]; 6525 } else { 6526 owner_nlportid = 0; 6527 is_indoor = true; 6528 } 6529 6530 return regulatory_hint_indoor(is_indoor, owner_nlportid); 6531 default: 6532 return -EINVAL; 6533 } 6534 } 6535 6536 static int nl80211_reload_regdb(struct sk_buff *skb, struct genl_info *info) 6537 { 6538 return reg_reload_regdb(); 6539 } 6540 6541 static int nl80211_get_mesh_config(struct sk_buff *skb, 6542 struct genl_info *info) 6543 { 6544 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6545 struct net_device *dev = info->user_ptr[1]; 6546 struct wireless_dev *wdev = dev->ieee80211_ptr; 6547 struct mesh_config cur_params; 6548 int err = 0; 6549 void *hdr; 6550 struct nlattr *pinfoattr; 6551 struct sk_buff *msg; 6552 6553 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 6554 return -EOPNOTSUPP; 6555 6556 if (!rdev->ops->get_mesh_config) 6557 return -EOPNOTSUPP; 6558 6559 wdev_lock(wdev); 6560 /* If not connected, get default parameters */ 6561 if (!wdev->mesh_id_len) 6562 memcpy(&cur_params, &default_mesh_config, sizeof(cur_params)); 6563 else 6564 err = rdev_get_mesh_config(rdev, dev, &cur_params); 6565 wdev_unlock(wdev); 6566 6567 if (err) 6568 return err; 6569 6570 /* Draw up a netlink message to send back */ 6571 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 6572 if (!msg) 6573 return -ENOMEM; 6574 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 6575 NL80211_CMD_GET_MESH_CONFIG); 6576 if (!hdr) 6577 goto out; 6578 pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MESH_CONFIG); 6579 if (!pinfoattr) 6580 goto nla_put_failure; 6581 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 6582 nla_put_u16(msg, NL80211_MESHCONF_RETRY_TIMEOUT, 6583 cur_params.dot11MeshRetryTimeout) || 6584 nla_put_u16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT, 6585 cur_params.dot11MeshConfirmTimeout) || 6586 nla_put_u16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT, 6587 cur_params.dot11MeshHoldingTimeout) || 6588 nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS, 6589 cur_params.dot11MeshMaxPeerLinks) || 6590 nla_put_u8(msg, NL80211_MESHCONF_MAX_RETRIES, 6591 cur_params.dot11MeshMaxRetries) || 6592 nla_put_u8(msg, NL80211_MESHCONF_TTL, 6593 cur_params.dot11MeshTTL) || 6594 nla_put_u8(msg, NL80211_MESHCONF_ELEMENT_TTL, 6595 cur_params.element_ttl) || 6596 nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS, 6597 cur_params.auto_open_plinks) || 6598 nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 6599 cur_params.dot11MeshNbrOffsetMaxNeighbor) || 6600 nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 6601 cur_params.dot11MeshHWMPmaxPREQretries) || 6602 nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME, 6603 cur_params.path_refresh_time) || 6604 nla_put_u16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 6605 cur_params.min_discovery_timeout) || 6606 nla_put_u32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 6607 cur_params.dot11MeshHWMPactivePathTimeout) || 6608 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 6609 cur_params.dot11MeshHWMPpreqMinInterval) || 6610 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 6611 cur_params.dot11MeshHWMPperrMinInterval) || 6612 nla_put_u16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 6613 cur_params.dot11MeshHWMPnetDiameterTraversalTime) || 6614 nla_put_u8(msg, NL80211_MESHCONF_HWMP_ROOTMODE, 6615 cur_params.dot11MeshHWMPRootMode) || 6616 nla_put_u16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL, 6617 cur_params.dot11MeshHWMPRannInterval) || 6618 nla_put_u8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 6619 cur_params.dot11MeshGateAnnouncementProtocol) || 6620 nla_put_u8(msg, NL80211_MESHCONF_FORWARDING, 6621 cur_params.dot11MeshForwarding) || 6622 nla_put_s32(msg, NL80211_MESHCONF_RSSI_THRESHOLD, 6623 cur_params.rssi_threshold) || 6624 nla_put_u32(msg, NL80211_MESHCONF_HT_OPMODE, 6625 cur_params.ht_opmode) || 6626 nla_put_u32(msg, NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 6627 cur_params.dot11MeshHWMPactivePathToRootTimeout) || 6628 nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 6629 cur_params.dot11MeshHWMProotInterval) || 6630 nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 6631 cur_params.dot11MeshHWMPconfirmationInterval) || 6632 nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE, 6633 cur_params.power_mode) || 6634 nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW, 6635 cur_params.dot11MeshAwakeWindowDuration) || 6636 nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT, 6637 cur_params.plink_timeout) || 6638 nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_GATE, 6639 cur_params.dot11MeshConnectedToMeshGate)) 6640 goto nla_put_failure; 6641 nla_nest_end(msg, pinfoattr); 6642 genlmsg_end(msg, hdr); 6643 return genlmsg_reply(msg, info); 6644 6645 nla_put_failure: 6646 out: 6647 nlmsg_free(msg); 6648 return -ENOBUFS; 6649 } 6650 6651 static const struct nla_policy 6652 nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = { 6653 [NL80211_MESHCONF_RETRY_TIMEOUT] = 6654 NLA_POLICY_RANGE(NLA_U16, 1, 255), 6655 [NL80211_MESHCONF_CONFIRM_TIMEOUT] = 6656 NLA_POLICY_RANGE(NLA_U16, 1, 255), 6657 [NL80211_MESHCONF_HOLDING_TIMEOUT] = 6658 NLA_POLICY_RANGE(NLA_U16, 1, 255), 6659 [NL80211_MESHCONF_MAX_PEER_LINKS] = 6660 NLA_POLICY_RANGE(NLA_U16, 0, 255), 6661 [NL80211_MESHCONF_MAX_RETRIES] = NLA_POLICY_MAX(NLA_U8, 16), 6662 [NL80211_MESHCONF_TTL] = NLA_POLICY_MIN(NLA_U8, 1), 6663 [NL80211_MESHCONF_ELEMENT_TTL] = NLA_POLICY_MIN(NLA_U8, 1), 6664 [NL80211_MESHCONF_AUTO_OPEN_PLINKS] = NLA_POLICY_MAX(NLA_U8, 1), 6665 [NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] = 6666 NLA_POLICY_RANGE(NLA_U32, 1, 255), 6667 [NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 }, 6668 [NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 }, 6669 [NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = NLA_POLICY_MIN(NLA_U16, 1), 6670 [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 }, 6671 [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = 6672 NLA_POLICY_MIN(NLA_U16, 1), 6673 [NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] = 6674 NLA_POLICY_MIN(NLA_U16, 1), 6675 [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = 6676 NLA_POLICY_MIN(NLA_U16, 1), 6677 [NL80211_MESHCONF_HWMP_ROOTMODE] = NLA_POLICY_MAX(NLA_U8, 4), 6678 [NL80211_MESHCONF_HWMP_RANN_INTERVAL] = 6679 NLA_POLICY_MIN(NLA_U16, 1), 6680 [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = NLA_POLICY_MAX(NLA_U8, 1), 6681 [NL80211_MESHCONF_FORWARDING] = NLA_POLICY_MAX(NLA_U8, 1), 6682 [NL80211_MESHCONF_RSSI_THRESHOLD] = 6683 NLA_POLICY_RANGE(NLA_S32, -255, 0), 6684 [NL80211_MESHCONF_HT_OPMODE] = { .type = NLA_U16 }, 6685 [NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 }, 6686 [NL80211_MESHCONF_HWMP_ROOT_INTERVAL] = 6687 NLA_POLICY_MIN(NLA_U16, 1), 6688 [NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] = 6689 NLA_POLICY_MIN(NLA_U16, 1), 6690 [NL80211_MESHCONF_POWER_MODE] = 6691 NLA_POLICY_RANGE(NLA_U32, 6692 NL80211_MESH_POWER_ACTIVE, 6693 NL80211_MESH_POWER_MAX), 6694 [NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 }, 6695 [NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 }, 6696 [NL80211_MESHCONF_CONNECTED_TO_GATE] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 6697 }; 6698 6699 static const struct nla_policy 6700 nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = { 6701 [NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 }, 6702 [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 }, 6703 [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 }, 6704 [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG }, 6705 [NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 }, 6706 [NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG }, 6707 [NL80211_MESH_SETUP_IE] = 6708 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 6709 IEEE80211_MAX_DATA_LEN), 6710 [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG }, 6711 }; 6712 6713 static int nl80211_parse_mesh_config(struct genl_info *info, 6714 struct mesh_config *cfg, 6715 u32 *mask_out) 6716 { 6717 struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1]; 6718 u32 mask = 0; 6719 u16 ht_opmode; 6720 6721 #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, mask, attr, fn) \ 6722 do { \ 6723 if (tb[attr]) { \ 6724 cfg->param = fn(tb[attr]); \ 6725 mask |= BIT((attr) - 1); \ 6726 } \ 6727 } while (0) 6728 6729 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) 6730 return -EINVAL; 6731 if (nla_parse_nested_deprecated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params_policy, info->extack)) 6732 return -EINVAL; 6733 6734 /* This makes sure that there aren't more than 32 mesh config 6735 * parameters (otherwise our bitfield scheme would not work.) */ 6736 BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32); 6737 6738 /* Fill in the params struct */ 6739 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout, mask, 6740 NL80211_MESHCONF_RETRY_TIMEOUT, nla_get_u16); 6741 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout, mask, 6742 NL80211_MESHCONF_CONFIRM_TIMEOUT, 6743 nla_get_u16); 6744 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout, mask, 6745 NL80211_MESHCONF_HOLDING_TIMEOUT, 6746 nla_get_u16); 6747 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks, mask, 6748 NL80211_MESHCONF_MAX_PEER_LINKS, 6749 nla_get_u16); 6750 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries, mask, 6751 NL80211_MESHCONF_MAX_RETRIES, nla_get_u8); 6752 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL, mask, 6753 NL80211_MESHCONF_TTL, nla_get_u8); 6754 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl, mask, 6755 NL80211_MESHCONF_ELEMENT_TTL, nla_get_u8); 6756 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks, mask, 6757 NL80211_MESHCONF_AUTO_OPEN_PLINKS, 6758 nla_get_u8); 6759 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor, 6760 mask, 6761 NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 6762 nla_get_u32); 6763 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries, mask, 6764 NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 6765 nla_get_u8); 6766 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time, mask, 6767 NL80211_MESHCONF_PATH_REFRESH_TIME, 6768 nla_get_u32); 6769 if (mask & BIT(NL80211_MESHCONF_PATH_REFRESH_TIME) && 6770 (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535)) 6771 return -EINVAL; 6772 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout, mask, 6773 NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 6774 nla_get_u16); 6775 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout, 6776 mask, 6777 NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 6778 nla_get_u32); 6779 if (mask & BIT(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT) && 6780 (cfg->dot11MeshHWMPactivePathTimeout < 1 || 6781 cfg->dot11MeshHWMPactivePathTimeout > 65535)) 6782 return -EINVAL; 6783 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval, mask, 6784 NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 6785 nla_get_u16); 6786 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPperrMinInterval, mask, 6787 NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 6788 nla_get_u16); 6789 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 6790 dot11MeshHWMPnetDiameterTraversalTime, mask, 6791 NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 6792 nla_get_u16); 6793 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRootMode, mask, 6794 NL80211_MESHCONF_HWMP_ROOTMODE, nla_get_u8); 6795 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRannInterval, mask, 6796 NL80211_MESHCONF_HWMP_RANN_INTERVAL, 6797 nla_get_u16); 6798 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshGateAnnouncementProtocol, 6799 mask, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 6800 nla_get_u8); 6801 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, mask, 6802 NL80211_MESHCONF_FORWARDING, nla_get_u8); 6803 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, mask, 6804 NL80211_MESHCONF_RSSI_THRESHOLD, 6805 nla_get_s32); 6806 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToMeshGate, mask, 6807 NL80211_MESHCONF_CONNECTED_TO_GATE, 6808 nla_get_u8); 6809 /* 6810 * Check HT operation mode based on 6811 * IEEE 802.11-2016 9.4.2.57 HT Operation element. 6812 */ 6813 if (tb[NL80211_MESHCONF_HT_OPMODE]) { 6814 ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]); 6815 6816 if (ht_opmode & ~(IEEE80211_HT_OP_MODE_PROTECTION | 6817 IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT | 6818 IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)) 6819 return -EINVAL; 6820 6821 /* NON_HT_STA bit is reserved, but some programs set it */ 6822 ht_opmode &= ~IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT; 6823 6824 cfg->ht_opmode = ht_opmode; 6825 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); 6826 } 6827 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 6828 dot11MeshHWMPactivePathToRootTimeout, mask, 6829 NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 6830 nla_get_u32); 6831 if (mask & BIT(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT) && 6832 (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 || 6833 cfg->dot11MeshHWMPactivePathToRootTimeout > 65535)) 6834 return -EINVAL; 6835 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMProotInterval, mask, 6836 NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 6837 nla_get_u16); 6838 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPconfirmationInterval, 6839 mask, 6840 NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 6841 nla_get_u16); 6842 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode, mask, 6843 NL80211_MESHCONF_POWER_MODE, nla_get_u32); 6844 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration, mask, 6845 NL80211_MESHCONF_AWAKE_WINDOW, nla_get_u16); 6846 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, plink_timeout, mask, 6847 NL80211_MESHCONF_PLINK_TIMEOUT, nla_get_u32); 6848 if (mask_out) 6849 *mask_out = mask; 6850 6851 return 0; 6852 6853 #undef FILL_IN_MESH_PARAM_IF_SET 6854 } 6855 6856 static int nl80211_parse_mesh_setup(struct genl_info *info, 6857 struct mesh_setup *setup) 6858 { 6859 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6860 struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1]; 6861 6862 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) 6863 return -EINVAL; 6864 if (nla_parse_nested_deprecated(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_params_policy, info->extack)) 6865 return -EINVAL; 6866 6867 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC]) 6868 setup->sync_method = 6869 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ? 6870 IEEE80211_SYNC_METHOD_VENDOR : 6871 IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET; 6872 6873 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL]) 6874 setup->path_sel_proto = 6875 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ? 6876 IEEE80211_PATH_PROTOCOL_VENDOR : 6877 IEEE80211_PATH_PROTOCOL_HWMP; 6878 6879 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC]) 6880 setup->path_metric = 6881 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ? 6882 IEEE80211_PATH_METRIC_VENDOR : 6883 IEEE80211_PATH_METRIC_AIRTIME; 6884 6885 if (tb[NL80211_MESH_SETUP_IE]) { 6886 struct nlattr *ieattr = 6887 tb[NL80211_MESH_SETUP_IE]; 6888 setup->ie = nla_data(ieattr); 6889 setup->ie_len = nla_len(ieattr); 6890 } 6891 if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] && 6892 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) 6893 return -EINVAL; 6894 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); 6895 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); 6896 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); 6897 if (setup->is_secure) 6898 setup->user_mpm = true; 6899 6900 if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) { 6901 if (!setup->user_mpm) 6902 return -EINVAL; 6903 setup->auth_id = 6904 nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]); 6905 } 6906 6907 return 0; 6908 } 6909 6910 static int nl80211_update_mesh_config(struct sk_buff *skb, 6911 struct genl_info *info) 6912 { 6913 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6914 struct net_device *dev = info->user_ptr[1]; 6915 struct wireless_dev *wdev = dev->ieee80211_ptr; 6916 struct mesh_config cfg; 6917 u32 mask; 6918 int err; 6919 6920 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 6921 return -EOPNOTSUPP; 6922 6923 if (!rdev->ops->update_mesh_config) 6924 return -EOPNOTSUPP; 6925 6926 err = nl80211_parse_mesh_config(info, &cfg, &mask); 6927 if (err) 6928 return err; 6929 6930 wdev_lock(wdev); 6931 if (!wdev->mesh_id_len) 6932 err = -ENOLINK; 6933 6934 if (!err) 6935 err = rdev_update_mesh_config(rdev, dev, mask, &cfg); 6936 6937 wdev_unlock(wdev); 6938 6939 return err; 6940 } 6941 6942 static int nl80211_put_regdom(const struct ieee80211_regdomain *regdom, 6943 struct sk_buff *msg) 6944 { 6945 struct nlattr *nl_reg_rules; 6946 unsigned int i; 6947 6948 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || 6949 (regdom->dfs_region && 6950 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) 6951 goto nla_put_failure; 6952 6953 nl_reg_rules = nla_nest_start_noflag(msg, NL80211_ATTR_REG_RULES); 6954 if (!nl_reg_rules) 6955 goto nla_put_failure; 6956 6957 for (i = 0; i < regdom->n_reg_rules; i++) { 6958 struct nlattr *nl_reg_rule; 6959 const struct ieee80211_reg_rule *reg_rule; 6960 const struct ieee80211_freq_range *freq_range; 6961 const struct ieee80211_power_rule *power_rule; 6962 unsigned int max_bandwidth_khz; 6963 6964 reg_rule = ®dom->reg_rules[i]; 6965 freq_range = ®_rule->freq_range; 6966 power_rule = ®_rule->power_rule; 6967 6968 nl_reg_rule = nla_nest_start_noflag(msg, i); 6969 if (!nl_reg_rule) 6970 goto nla_put_failure; 6971 6972 max_bandwidth_khz = freq_range->max_bandwidth_khz; 6973 if (!max_bandwidth_khz) 6974 max_bandwidth_khz = reg_get_max_bandwidth(regdom, 6975 reg_rule); 6976 6977 if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS, 6978 reg_rule->flags) || 6979 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START, 6980 freq_range->start_freq_khz) || 6981 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END, 6982 freq_range->end_freq_khz) || 6983 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW, 6984 max_bandwidth_khz) || 6985 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN, 6986 power_rule->max_antenna_gain) || 6987 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP, 6988 power_rule->max_eirp) || 6989 nla_put_u32(msg, NL80211_ATTR_DFS_CAC_TIME, 6990 reg_rule->dfs_cac_ms)) 6991 goto nla_put_failure; 6992 6993 nla_nest_end(msg, nl_reg_rule); 6994 } 6995 6996 nla_nest_end(msg, nl_reg_rules); 6997 return 0; 6998 6999 nla_put_failure: 7000 return -EMSGSIZE; 7001 } 7002 7003 static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info) 7004 { 7005 const struct ieee80211_regdomain *regdom = NULL; 7006 struct cfg80211_registered_device *rdev; 7007 struct wiphy *wiphy = NULL; 7008 struct sk_buff *msg; 7009 void *hdr; 7010 7011 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 7012 if (!msg) 7013 return -ENOBUFS; 7014 7015 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 7016 NL80211_CMD_GET_REG); 7017 if (!hdr) 7018 goto put_failure; 7019 7020 if (info->attrs[NL80211_ATTR_WIPHY]) { 7021 bool self_managed; 7022 7023 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 7024 if (IS_ERR(rdev)) { 7025 nlmsg_free(msg); 7026 return PTR_ERR(rdev); 7027 } 7028 7029 wiphy = &rdev->wiphy; 7030 self_managed = wiphy->regulatory_flags & 7031 REGULATORY_WIPHY_SELF_MANAGED; 7032 regdom = get_wiphy_regdom(wiphy); 7033 7034 /* a self-managed-reg device must have a private regdom */ 7035 if (WARN_ON(!regdom && self_managed)) { 7036 nlmsg_free(msg); 7037 return -EINVAL; 7038 } 7039 7040 if (regdom && 7041 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 7042 goto nla_put_failure; 7043 } 7044 7045 if (!wiphy && reg_last_request_cell_base() && 7046 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 7047 NL80211_USER_REG_HINT_CELL_BASE)) 7048 goto nla_put_failure; 7049 7050 rcu_read_lock(); 7051 7052 if (!regdom) 7053 regdom = rcu_dereference(cfg80211_regdomain); 7054 7055 if (nl80211_put_regdom(regdom, msg)) 7056 goto nla_put_failure_rcu; 7057 7058 rcu_read_unlock(); 7059 7060 genlmsg_end(msg, hdr); 7061 return genlmsg_reply(msg, info); 7062 7063 nla_put_failure_rcu: 7064 rcu_read_unlock(); 7065 nla_put_failure: 7066 put_failure: 7067 nlmsg_free(msg); 7068 return -EMSGSIZE; 7069 } 7070 7071 static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb, 7072 u32 seq, int flags, struct wiphy *wiphy, 7073 const struct ieee80211_regdomain *regdom) 7074 { 7075 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 7076 NL80211_CMD_GET_REG); 7077 7078 if (!hdr) 7079 return -1; 7080 7081 genl_dump_check_consistent(cb, hdr); 7082 7083 if (nl80211_put_regdom(regdom, msg)) 7084 goto nla_put_failure; 7085 7086 if (!wiphy && reg_last_request_cell_base() && 7087 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 7088 NL80211_USER_REG_HINT_CELL_BASE)) 7089 goto nla_put_failure; 7090 7091 if (wiphy && 7092 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 7093 goto nla_put_failure; 7094 7095 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 7096 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 7097 goto nla_put_failure; 7098 7099 genlmsg_end(msg, hdr); 7100 return 0; 7101 7102 nla_put_failure: 7103 genlmsg_cancel(msg, hdr); 7104 return -EMSGSIZE; 7105 } 7106 7107 static int nl80211_get_reg_dump(struct sk_buff *skb, 7108 struct netlink_callback *cb) 7109 { 7110 const struct ieee80211_regdomain *regdom = NULL; 7111 struct cfg80211_registered_device *rdev; 7112 int err, reg_idx, start = cb->args[2]; 7113 7114 rtnl_lock(); 7115 7116 if (cfg80211_regdomain && start == 0) { 7117 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, 7118 NLM_F_MULTI, NULL, 7119 rtnl_dereference(cfg80211_regdomain)); 7120 if (err < 0) 7121 goto out_err; 7122 } 7123 7124 /* the global regdom is idx 0 */ 7125 reg_idx = 1; 7126 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 7127 regdom = get_wiphy_regdom(&rdev->wiphy); 7128 if (!regdom) 7129 continue; 7130 7131 if (++reg_idx <= start) 7132 continue; 7133 7134 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, 7135 NLM_F_MULTI, &rdev->wiphy, regdom); 7136 if (err < 0) { 7137 reg_idx--; 7138 break; 7139 } 7140 } 7141 7142 cb->args[2] = reg_idx; 7143 err = skb->len; 7144 out_err: 7145 rtnl_unlock(); 7146 return err; 7147 } 7148 7149 #ifdef CONFIG_CFG80211_CRDA_SUPPORT 7150 static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = { 7151 [NL80211_ATTR_REG_RULE_FLAGS] = { .type = NLA_U32 }, 7152 [NL80211_ATTR_FREQ_RANGE_START] = { .type = NLA_U32 }, 7153 [NL80211_ATTR_FREQ_RANGE_END] = { .type = NLA_U32 }, 7154 [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 }, 7155 [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 }, 7156 [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 }, 7157 [NL80211_ATTR_DFS_CAC_TIME] = { .type = NLA_U32 }, 7158 }; 7159 7160 static int parse_reg_rule(struct nlattr *tb[], 7161 struct ieee80211_reg_rule *reg_rule) 7162 { 7163 struct ieee80211_freq_range *freq_range = ®_rule->freq_range; 7164 struct ieee80211_power_rule *power_rule = ®_rule->power_rule; 7165 7166 if (!tb[NL80211_ATTR_REG_RULE_FLAGS]) 7167 return -EINVAL; 7168 if (!tb[NL80211_ATTR_FREQ_RANGE_START]) 7169 return -EINVAL; 7170 if (!tb[NL80211_ATTR_FREQ_RANGE_END]) 7171 return -EINVAL; 7172 if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]) 7173 return -EINVAL; 7174 if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]) 7175 return -EINVAL; 7176 7177 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); 7178 7179 freq_range->start_freq_khz = 7180 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]); 7181 freq_range->end_freq_khz = 7182 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]); 7183 freq_range->max_bandwidth_khz = 7184 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]); 7185 7186 power_rule->max_eirp = 7187 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]); 7188 7189 if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]) 7190 power_rule->max_antenna_gain = 7191 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]); 7192 7193 if (tb[NL80211_ATTR_DFS_CAC_TIME]) 7194 reg_rule->dfs_cac_ms = 7195 nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]); 7196 7197 return 0; 7198 } 7199 7200 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info) 7201 { 7202 struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1]; 7203 struct nlattr *nl_reg_rule; 7204 char *alpha2; 7205 int rem_reg_rules, r; 7206 u32 num_rules = 0, rule_idx = 0; 7207 enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET; 7208 struct ieee80211_regdomain *rd; 7209 7210 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 7211 return -EINVAL; 7212 7213 if (!info->attrs[NL80211_ATTR_REG_RULES]) 7214 return -EINVAL; 7215 7216 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 7217 7218 if (info->attrs[NL80211_ATTR_DFS_REGION]) 7219 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); 7220 7221 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 7222 rem_reg_rules) { 7223 num_rules++; 7224 if (num_rules > NL80211_MAX_SUPP_REG_RULES) 7225 return -EINVAL; 7226 } 7227 7228 if (!reg_is_valid_request(alpha2)) 7229 return -EINVAL; 7230 7231 rd = kzalloc(struct_size(rd, reg_rules, num_rules), GFP_KERNEL); 7232 if (!rd) 7233 return -ENOMEM; 7234 7235 rd->n_reg_rules = num_rules; 7236 rd->alpha2[0] = alpha2[0]; 7237 rd->alpha2[1] = alpha2[1]; 7238 7239 /* 7240 * Disable DFS master mode if the DFS region was 7241 * not supported or known on this kernel. 7242 */ 7243 if (reg_supported_dfs_region(dfs_region)) 7244 rd->dfs_region = dfs_region; 7245 7246 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 7247 rem_reg_rules) { 7248 r = nla_parse_nested_deprecated(tb, NL80211_REG_RULE_ATTR_MAX, 7249 nl_reg_rule, reg_rule_policy, 7250 info->extack); 7251 if (r) 7252 goto bad_reg; 7253 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); 7254 if (r) 7255 goto bad_reg; 7256 7257 rule_idx++; 7258 7259 if (rule_idx > NL80211_MAX_SUPP_REG_RULES) { 7260 r = -EINVAL; 7261 goto bad_reg; 7262 } 7263 } 7264 7265 /* set_regdom takes ownership of rd */ 7266 return set_regdom(rd, REGD_SOURCE_CRDA); 7267 bad_reg: 7268 kfree(rd); 7269 return r; 7270 } 7271 #endif /* CONFIG_CFG80211_CRDA_SUPPORT */ 7272 7273 static int validate_scan_freqs(struct nlattr *freqs) 7274 { 7275 struct nlattr *attr1, *attr2; 7276 int n_channels = 0, tmp1, tmp2; 7277 7278 nla_for_each_nested(attr1, freqs, tmp1) 7279 if (nla_len(attr1) != sizeof(u32)) 7280 return 0; 7281 7282 nla_for_each_nested(attr1, freqs, tmp1) { 7283 n_channels++; 7284 /* 7285 * Some hardware has a limited channel list for 7286 * scanning, and it is pretty much nonsensical 7287 * to scan for a channel twice, so disallow that 7288 * and don't require drivers to check that the 7289 * channel list they get isn't longer than what 7290 * they can scan, as long as they can scan all 7291 * the channels they registered at once. 7292 */ 7293 nla_for_each_nested(attr2, freqs, tmp2) 7294 if (attr1 != attr2 && 7295 nla_get_u32(attr1) == nla_get_u32(attr2)) 7296 return 0; 7297 } 7298 7299 return n_channels; 7300 } 7301 7302 static bool is_band_valid(struct wiphy *wiphy, enum nl80211_band b) 7303 { 7304 return b < NUM_NL80211_BANDS && wiphy->bands[b]; 7305 } 7306 7307 static int parse_bss_select(struct nlattr *nla, struct wiphy *wiphy, 7308 struct cfg80211_bss_selection *bss_select) 7309 { 7310 struct nlattr *attr[NL80211_BSS_SELECT_ATTR_MAX + 1]; 7311 struct nlattr *nest; 7312 int err; 7313 bool found = false; 7314 int i; 7315 7316 /* only process one nested attribute */ 7317 nest = nla_data(nla); 7318 if (!nla_ok(nest, nla_len(nest))) 7319 return -EINVAL; 7320 7321 err = nla_parse_nested_deprecated(attr, NL80211_BSS_SELECT_ATTR_MAX, 7322 nest, nl80211_bss_select_policy, 7323 NULL); 7324 if (err) 7325 return err; 7326 7327 /* only one attribute may be given */ 7328 for (i = 0; i <= NL80211_BSS_SELECT_ATTR_MAX; i++) { 7329 if (attr[i]) { 7330 if (found) 7331 return -EINVAL; 7332 found = true; 7333 } 7334 } 7335 7336 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID; 7337 7338 if (attr[NL80211_BSS_SELECT_ATTR_RSSI]) 7339 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI; 7340 7341 if (attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]) { 7342 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF; 7343 bss_select->param.band_pref = 7344 nla_get_u32(attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]); 7345 if (!is_band_valid(wiphy, bss_select->param.band_pref)) 7346 return -EINVAL; 7347 } 7348 7349 if (attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]) { 7350 struct nl80211_bss_select_rssi_adjust *adj_param; 7351 7352 adj_param = nla_data(attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]); 7353 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST; 7354 bss_select->param.adjust.band = adj_param->band; 7355 bss_select->param.adjust.delta = adj_param->delta; 7356 if (!is_band_valid(wiphy, bss_select->param.adjust.band)) 7357 return -EINVAL; 7358 } 7359 7360 /* user-space did not provide behaviour attribute */ 7361 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID) 7362 return -EINVAL; 7363 7364 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour))) 7365 return -EINVAL; 7366 7367 return 0; 7368 } 7369 7370 int nl80211_parse_random_mac(struct nlattr **attrs, 7371 u8 *mac_addr, u8 *mac_addr_mask) 7372 { 7373 int i; 7374 7375 if (!attrs[NL80211_ATTR_MAC] && !attrs[NL80211_ATTR_MAC_MASK]) { 7376 eth_zero_addr(mac_addr); 7377 eth_zero_addr(mac_addr_mask); 7378 mac_addr[0] = 0x2; 7379 mac_addr_mask[0] = 0x3; 7380 7381 return 0; 7382 } 7383 7384 /* need both or none */ 7385 if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_MAC_MASK]) 7386 return -EINVAL; 7387 7388 memcpy(mac_addr, nla_data(attrs[NL80211_ATTR_MAC]), ETH_ALEN); 7389 memcpy(mac_addr_mask, nla_data(attrs[NL80211_ATTR_MAC_MASK]), ETH_ALEN); 7390 7391 /* don't allow or configure an mcast address */ 7392 if (!is_multicast_ether_addr(mac_addr_mask) || 7393 is_multicast_ether_addr(mac_addr)) 7394 return -EINVAL; 7395 7396 /* 7397 * allow users to pass a MAC address that has bits set outside 7398 * of the mask, but don't bother drivers with having to deal 7399 * with such bits 7400 */ 7401 for (i = 0; i < ETH_ALEN; i++) 7402 mac_addr[i] &= mac_addr_mask[i]; 7403 7404 return 0; 7405 } 7406 7407 static bool cfg80211_off_channel_oper_allowed(struct wireless_dev *wdev) 7408 { 7409 ASSERT_WDEV_LOCK(wdev); 7410 7411 if (!cfg80211_beaconing_iface_active(wdev)) 7412 return true; 7413 7414 if (!(wdev->chandef.chan->flags & IEEE80211_CHAN_RADAR)) 7415 return true; 7416 7417 return regulatory_pre_cac_allowed(wdev->wiphy); 7418 } 7419 7420 static bool nl80211_check_scan_feat(struct wiphy *wiphy, u32 flags, u32 flag, 7421 enum nl80211_ext_feature_index feat) 7422 { 7423 if (!(flags & flag)) 7424 return true; 7425 if (wiphy_ext_feature_isset(wiphy, feat)) 7426 return true; 7427 return false; 7428 } 7429 7430 static int 7431 nl80211_check_scan_flags(struct wiphy *wiphy, struct wireless_dev *wdev, 7432 void *request, struct nlattr **attrs, 7433 bool is_sched_scan) 7434 { 7435 u8 *mac_addr, *mac_addr_mask; 7436 u32 *flags; 7437 enum nl80211_feature_flags randomness_flag; 7438 7439 if (!attrs[NL80211_ATTR_SCAN_FLAGS]) 7440 return 0; 7441 7442 if (is_sched_scan) { 7443 struct cfg80211_sched_scan_request *req = request; 7444 7445 randomness_flag = wdev ? 7446 NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR : 7447 NL80211_FEATURE_ND_RANDOM_MAC_ADDR; 7448 flags = &req->flags; 7449 mac_addr = req->mac_addr; 7450 mac_addr_mask = req->mac_addr_mask; 7451 } else { 7452 struct cfg80211_scan_request *req = request; 7453 7454 randomness_flag = NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR; 7455 flags = &req->flags; 7456 mac_addr = req->mac_addr; 7457 mac_addr_mask = req->mac_addr_mask; 7458 } 7459 7460 *flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]); 7461 7462 if (((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) && 7463 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) || 7464 !nl80211_check_scan_feat(wiphy, *flags, 7465 NL80211_SCAN_FLAG_LOW_SPAN, 7466 NL80211_EXT_FEATURE_LOW_SPAN_SCAN) || 7467 !nl80211_check_scan_feat(wiphy, *flags, 7468 NL80211_SCAN_FLAG_LOW_POWER, 7469 NL80211_EXT_FEATURE_LOW_POWER_SCAN) || 7470 !nl80211_check_scan_feat(wiphy, *flags, 7471 NL80211_SCAN_FLAG_HIGH_ACCURACY, 7472 NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN) || 7473 !nl80211_check_scan_feat(wiphy, *flags, 7474 NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME, 7475 NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME) || 7476 !nl80211_check_scan_feat(wiphy, *flags, 7477 NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP, 7478 NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP) || 7479 !nl80211_check_scan_feat(wiphy, *flags, 7480 NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION, 7481 NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION) || 7482 !nl80211_check_scan_feat(wiphy, *flags, 7483 NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE, 7484 NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE) || 7485 !nl80211_check_scan_feat(wiphy, *flags, 7486 NL80211_SCAN_FLAG_RANDOM_SN, 7487 NL80211_EXT_FEATURE_SCAN_RANDOM_SN) || 7488 !nl80211_check_scan_feat(wiphy, *flags, 7489 NL80211_SCAN_FLAG_MIN_PREQ_CONTENT, 7490 NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT)) 7491 return -EOPNOTSUPP; 7492 7493 if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { 7494 int err; 7495 7496 if (!(wiphy->features & randomness_flag) || 7497 (wdev && wdev->current_bss)) 7498 return -EOPNOTSUPP; 7499 7500 err = nl80211_parse_random_mac(attrs, mac_addr, mac_addr_mask); 7501 if (err) 7502 return err; 7503 } 7504 7505 return 0; 7506 } 7507 7508 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) 7509 { 7510 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7511 struct wireless_dev *wdev = info->user_ptr[1]; 7512 struct cfg80211_scan_request *request; 7513 struct nlattr *attr; 7514 struct wiphy *wiphy; 7515 int err, tmp, n_ssids = 0, n_channels, i; 7516 size_t ie_len; 7517 7518 wiphy = &rdev->wiphy; 7519 7520 if (wdev->iftype == NL80211_IFTYPE_NAN) 7521 return -EOPNOTSUPP; 7522 7523 if (!rdev->ops->scan) 7524 return -EOPNOTSUPP; 7525 7526 if (rdev->scan_req || rdev->scan_msg) { 7527 err = -EBUSY; 7528 goto unlock; 7529 } 7530 7531 if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 7532 n_channels = validate_scan_freqs( 7533 info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]); 7534 if (!n_channels) { 7535 err = -EINVAL; 7536 goto unlock; 7537 } 7538 } else { 7539 n_channels = ieee80211_get_num_supported_channels(wiphy); 7540 } 7541 7542 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) 7543 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) 7544 n_ssids++; 7545 7546 if (n_ssids > wiphy->max_scan_ssids) { 7547 err = -EINVAL; 7548 goto unlock; 7549 } 7550 7551 if (info->attrs[NL80211_ATTR_IE]) 7552 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 7553 else 7554 ie_len = 0; 7555 7556 if (ie_len > wiphy->max_scan_ie_len) { 7557 err = -EINVAL; 7558 goto unlock; 7559 } 7560 7561 request = kzalloc(sizeof(*request) 7562 + sizeof(*request->ssids) * n_ssids 7563 + sizeof(*request->channels) * n_channels 7564 + ie_len, GFP_KERNEL); 7565 if (!request) { 7566 err = -ENOMEM; 7567 goto unlock; 7568 } 7569 7570 if (n_ssids) 7571 request->ssids = (void *)&request->channels[n_channels]; 7572 request->n_ssids = n_ssids; 7573 if (ie_len) { 7574 if (n_ssids) 7575 request->ie = (void *)(request->ssids + n_ssids); 7576 else 7577 request->ie = (void *)(request->channels + n_channels); 7578 } 7579 7580 i = 0; 7581 if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 7582 /* user specified, bail out if channel not found */ 7583 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_FREQUENCIES], tmp) { 7584 struct ieee80211_channel *chan; 7585 7586 chan = ieee80211_get_channel(wiphy, nla_get_u32(attr)); 7587 7588 if (!chan) { 7589 err = -EINVAL; 7590 goto out_free; 7591 } 7592 7593 /* ignore disabled channels */ 7594 if (chan->flags & IEEE80211_CHAN_DISABLED) 7595 continue; 7596 7597 request->channels[i] = chan; 7598 i++; 7599 } 7600 } else { 7601 enum nl80211_band band; 7602 7603 /* all channels */ 7604 for (band = 0; band < NUM_NL80211_BANDS; band++) { 7605 int j; 7606 7607 if (!wiphy->bands[band]) 7608 continue; 7609 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 7610 struct ieee80211_channel *chan; 7611 7612 chan = &wiphy->bands[band]->channels[j]; 7613 7614 if (chan->flags & IEEE80211_CHAN_DISABLED) 7615 continue; 7616 7617 request->channels[i] = chan; 7618 i++; 7619 } 7620 } 7621 } 7622 7623 if (!i) { 7624 err = -EINVAL; 7625 goto out_free; 7626 } 7627 7628 request->n_channels = i; 7629 7630 wdev_lock(wdev); 7631 if (!cfg80211_off_channel_oper_allowed(wdev)) { 7632 struct ieee80211_channel *chan; 7633 7634 if (request->n_channels != 1) { 7635 wdev_unlock(wdev); 7636 err = -EBUSY; 7637 goto out_free; 7638 } 7639 7640 chan = request->channels[0]; 7641 if (chan->center_freq != wdev->chandef.chan->center_freq) { 7642 wdev_unlock(wdev); 7643 err = -EBUSY; 7644 goto out_free; 7645 } 7646 } 7647 wdev_unlock(wdev); 7648 7649 i = 0; 7650 if (n_ssids) { 7651 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { 7652 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 7653 err = -EINVAL; 7654 goto out_free; 7655 } 7656 request->ssids[i].ssid_len = nla_len(attr); 7657 memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr)); 7658 i++; 7659 } 7660 } 7661 7662 if (info->attrs[NL80211_ATTR_IE]) { 7663 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 7664 memcpy((void *)request->ie, 7665 nla_data(info->attrs[NL80211_ATTR_IE]), 7666 request->ie_len); 7667 } 7668 7669 for (i = 0; i < NUM_NL80211_BANDS; i++) 7670 if (wiphy->bands[i]) 7671 request->rates[i] = 7672 (1 << wiphy->bands[i]->n_bitrates) - 1; 7673 7674 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { 7675 nla_for_each_nested(attr, 7676 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], 7677 tmp) { 7678 enum nl80211_band band = nla_type(attr); 7679 7680 if (band < 0 || band >= NUM_NL80211_BANDS) { 7681 err = -EINVAL; 7682 goto out_free; 7683 } 7684 7685 if (!wiphy->bands[band]) 7686 continue; 7687 7688 err = ieee80211_get_ratemask(wiphy->bands[band], 7689 nla_data(attr), 7690 nla_len(attr), 7691 &request->rates[band]); 7692 if (err) 7693 goto out_free; 7694 } 7695 } 7696 7697 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { 7698 if (!wiphy_ext_feature_isset(wiphy, 7699 NL80211_EXT_FEATURE_SET_SCAN_DWELL)) { 7700 err = -EOPNOTSUPP; 7701 goto out_free; 7702 } 7703 7704 request->duration = 7705 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); 7706 request->duration_mandatory = 7707 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); 7708 } 7709 7710 err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs, 7711 false); 7712 if (err) 7713 goto out_free; 7714 7715 request->no_cck = 7716 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 7717 7718 /* Initial implementation used NL80211_ATTR_MAC to set the specific 7719 * BSSID to scan for. This was problematic because that same attribute 7720 * was already used for another purpose (local random MAC address). The 7721 * NL80211_ATTR_BSSID attribute was added to fix this. For backwards 7722 * compatibility with older userspace components, also use the 7723 * NL80211_ATTR_MAC value here if it can be determined to be used for 7724 * the specific BSSID use case instead of the random MAC address 7725 * (NL80211_ATTR_SCAN_FLAGS is used to enable random MAC address use). 7726 */ 7727 if (info->attrs[NL80211_ATTR_BSSID]) 7728 memcpy(request->bssid, 7729 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); 7730 else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && 7731 info->attrs[NL80211_ATTR_MAC]) 7732 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]), 7733 ETH_ALEN); 7734 else 7735 eth_broadcast_addr(request->bssid); 7736 7737 request->wdev = wdev; 7738 request->wiphy = &rdev->wiphy; 7739 request->scan_start = jiffies; 7740 7741 rdev->scan_req = request; 7742 err = rdev_scan(rdev, request); 7743 7744 if (!err) { 7745 nl80211_send_scan_start(rdev, wdev); 7746 if (wdev->netdev) 7747 dev_hold(wdev->netdev); 7748 } else { 7749 out_free: 7750 rdev->scan_req = NULL; 7751 kfree(request); 7752 } 7753 7754 unlock: 7755 return err; 7756 } 7757 7758 static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info) 7759 { 7760 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7761 struct wireless_dev *wdev = info->user_ptr[1]; 7762 7763 if (!rdev->ops->abort_scan) 7764 return -EOPNOTSUPP; 7765 7766 if (rdev->scan_msg) 7767 return 0; 7768 7769 if (!rdev->scan_req) 7770 return -ENOENT; 7771 7772 rdev_abort_scan(rdev, wdev); 7773 return 0; 7774 } 7775 7776 static int 7777 nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans, 7778 struct cfg80211_sched_scan_request *request, 7779 struct nlattr **attrs) 7780 { 7781 int tmp, err, i = 0; 7782 struct nlattr *attr; 7783 7784 if (!attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) { 7785 u32 interval; 7786 7787 /* 7788 * If scan plans are not specified, 7789 * %NL80211_ATTR_SCHED_SCAN_INTERVAL will be specified. In this 7790 * case one scan plan will be set with the specified scan 7791 * interval and infinite number of iterations. 7792 */ 7793 interval = nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]); 7794 if (!interval) 7795 return -EINVAL; 7796 7797 request->scan_plans[0].interval = 7798 DIV_ROUND_UP(interval, MSEC_PER_SEC); 7799 if (!request->scan_plans[0].interval) 7800 return -EINVAL; 7801 7802 if (request->scan_plans[0].interval > 7803 wiphy->max_sched_scan_plan_interval) 7804 request->scan_plans[0].interval = 7805 wiphy->max_sched_scan_plan_interval; 7806 7807 return 0; 7808 } 7809 7810 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) { 7811 struct nlattr *plan[NL80211_SCHED_SCAN_PLAN_MAX + 1]; 7812 7813 if (WARN_ON(i >= n_plans)) 7814 return -EINVAL; 7815 7816 err = nla_parse_nested_deprecated(plan, 7817 NL80211_SCHED_SCAN_PLAN_MAX, 7818 attr, nl80211_plan_policy, 7819 NULL); 7820 if (err) 7821 return err; 7822 7823 if (!plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]) 7824 return -EINVAL; 7825 7826 request->scan_plans[i].interval = 7827 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]); 7828 if (!request->scan_plans[i].interval || 7829 request->scan_plans[i].interval > 7830 wiphy->max_sched_scan_plan_interval) 7831 return -EINVAL; 7832 7833 if (plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]) { 7834 request->scan_plans[i].iterations = 7835 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]); 7836 if (!request->scan_plans[i].iterations || 7837 (request->scan_plans[i].iterations > 7838 wiphy->max_sched_scan_plan_iterations)) 7839 return -EINVAL; 7840 } else if (i < n_plans - 1) { 7841 /* 7842 * All scan plans but the last one must specify 7843 * a finite number of iterations 7844 */ 7845 return -EINVAL; 7846 } 7847 7848 i++; 7849 } 7850 7851 /* 7852 * The last scan plan must not specify the number of 7853 * iterations, it is supposed to run infinitely 7854 */ 7855 if (request->scan_plans[n_plans - 1].iterations) 7856 return -EINVAL; 7857 7858 return 0; 7859 } 7860 7861 static int 7862 nl80211_parse_sched_scan_per_band_rssi(struct wiphy *wiphy, 7863 struct cfg80211_match_set *match_sets, 7864 struct nlattr *tb_band_rssi, 7865 s32 rssi_thold) 7866 { 7867 struct nlattr *attr; 7868 int i, tmp, ret = 0; 7869 7870 if (!wiphy_ext_feature_isset(wiphy, 7871 NL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD)) { 7872 if (tb_band_rssi) 7873 ret = -EOPNOTSUPP; 7874 else 7875 for (i = 0; i < NUM_NL80211_BANDS; i++) 7876 match_sets->per_band_rssi_thold[i] = 7877 NL80211_SCAN_RSSI_THOLD_OFF; 7878 return ret; 7879 } 7880 7881 for (i = 0; i < NUM_NL80211_BANDS; i++) 7882 match_sets->per_band_rssi_thold[i] = rssi_thold; 7883 7884 nla_for_each_nested(attr, tb_band_rssi, tmp) { 7885 enum nl80211_band band = nla_type(attr); 7886 7887 if (band < 0 || band >= NUM_NL80211_BANDS) 7888 return -EINVAL; 7889 7890 match_sets->per_band_rssi_thold[band] = nla_get_s32(attr); 7891 } 7892 7893 return 0; 7894 } 7895 7896 static struct cfg80211_sched_scan_request * 7897 nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev, 7898 struct nlattr **attrs, int max_match_sets) 7899 { 7900 struct cfg80211_sched_scan_request *request; 7901 struct nlattr *attr; 7902 int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i, n_plans = 0; 7903 enum nl80211_band band; 7904 size_t ie_len; 7905 struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1]; 7906 s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF; 7907 7908 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 7909 n_channels = validate_scan_freqs( 7910 attrs[NL80211_ATTR_SCAN_FREQUENCIES]); 7911 if (!n_channels) 7912 return ERR_PTR(-EINVAL); 7913 } else { 7914 n_channels = ieee80211_get_num_supported_channels(wiphy); 7915 } 7916 7917 if (attrs[NL80211_ATTR_SCAN_SSIDS]) 7918 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS], 7919 tmp) 7920 n_ssids++; 7921 7922 if (n_ssids > wiphy->max_sched_scan_ssids) 7923 return ERR_PTR(-EINVAL); 7924 7925 /* 7926 * First, count the number of 'real' matchsets. Due to an issue with 7927 * the old implementation, matchsets containing only the RSSI attribute 7928 * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default' 7929 * RSSI for all matchsets, rather than their own matchset for reporting 7930 * all APs with a strong RSSI. This is needed to be compatible with 7931 * older userspace that treated a matchset with only the RSSI as the 7932 * global RSSI for all other matchsets - if there are other matchsets. 7933 */ 7934 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 7935 nla_for_each_nested(attr, 7936 attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 7937 tmp) { 7938 struct nlattr *rssi; 7939 7940 err = nla_parse_nested_deprecated(tb, 7941 NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 7942 attr, 7943 nl80211_match_policy, 7944 NULL); 7945 if (err) 7946 return ERR_PTR(err); 7947 7948 /* SSID and BSSID are mutually exclusive */ 7949 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] && 7950 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) 7951 return ERR_PTR(-EINVAL); 7952 7953 /* add other standalone attributes here */ 7954 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] || 7955 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) { 7956 n_match_sets++; 7957 continue; 7958 } 7959 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 7960 if (rssi) 7961 default_match_rssi = nla_get_s32(rssi); 7962 } 7963 } 7964 7965 /* However, if there's no other matchset, add the RSSI one */ 7966 if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF) 7967 n_match_sets = 1; 7968 7969 if (n_match_sets > max_match_sets) 7970 return ERR_PTR(-EINVAL); 7971 7972 if (attrs[NL80211_ATTR_IE]) 7973 ie_len = nla_len(attrs[NL80211_ATTR_IE]); 7974 else 7975 ie_len = 0; 7976 7977 if (ie_len > wiphy->max_sched_scan_ie_len) 7978 return ERR_PTR(-EINVAL); 7979 7980 if (attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) { 7981 /* 7982 * NL80211_ATTR_SCHED_SCAN_INTERVAL must not be specified since 7983 * each scan plan already specifies its own interval 7984 */ 7985 if (attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 7986 return ERR_PTR(-EINVAL); 7987 7988 nla_for_each_nested(attr, 7989 attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) 7990 n_plans++; 7991 } else { 7992 /* 7993 * The scan interval attribute is kept for backward 7994 * compatibility. If no scan plans are specified and sched scan 7995 * interval is specified, one scan plan will be set with this 7996 * scan interval and infinite number of iterations. 7997 */ 7998 if (!attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 7999 return ERR_PTR(-EINVAL); 8000 8001 n_plans = 1; 8002 } 8003 8004 if (!n_plans || n_plans > wiphy->max_sched_scan_plans) 8005 return ERR_PTR(-EINVAL); 8006 8007 if (!wiphy_ext_feature_isset( 8008 wiphy, NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI) && 8009 (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] || 8010 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST])) 8011 return ERR_PTR(-EINVAL); 8012 8013 request = kzalloc(sizeof(*request) 8014 + sizeof(*request->ssids) * n_ssids 8015 + sizeof(*request->match_sets) * n_match_sets 8016 + sizeof(*request->scan_plans) * n_plans 8017 + sizeof(*request->channels) * n_channels 8018 + ie_len, GFP_KERNEL); 8019 if (!request) 8020 return ERR_PTR(-ENOMEM); 8021 8022 if (n_ssids) 8023 request->ssids = (void *)&request->channels[n_channels]; 8024 request->n_ssids = n_ssids; 8025 if (ie_len) { 8026 if (n_ssids) 8027 request->ie = (void *)(request->ssids + n_ssids); 8028 else 8029 request->ie = (void *)(request->channels + n_channels); 8030 } 8031 8032 if (n_match_sets) { 8033 if (request->ie) 8034 request->match_sets = (void *)(request->ie + ie_len); 8035 else if (n_ssids) 8036 request->match_sets = 8037 (void *)(request->ssids + n_ssids); 8038 else 8039 request->match_sets = 8040 (void *)(request->channels + n_channels); 8041 } 8042 request->n_match_sets = n_match_sets; 8043 8044 if (n_match_sets) 8045 request->scan_plans = (void *)(request->match_sets + 8046 n_match_sets); 8047 else if (request->ie) 8048 request->scan_plans = (void *)(request->ie + ie_len); 8049 else if (n_ssids) 8050 request->scan_plans = (void *)(request->ssids + n_ssids); 8051 else 8052 request->scan_plans = (void *)(request->channels + n_channels); 8053 8054 request->n_scan_plans = n_plans; 8055 8056 i = 0; 8057 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 8058 /* user specified, bail out if channel not found */ 8059 nla_for_each_nested(attr, 8060 attrs[NL80211_ATTR_SCAN_FREQUENCIES], 8061 tmp) { 8062 struct ieee80211_channel *chan; 8063 8064 chan = ieee80211_get_channel(wiphy, nla_get_u32(attr)); 8065 8066 if (!chan) { 8067 err = -EINVAL; 8068 goto out_free; 8069 } 8070 8071 /* ignore disabled channels */ 8072 if (chan->flags & IEEE80211_CHAN_DISABLED) 8073 continue; 8074 8075 request->channels[i] = chan; 8076 i++; 8077 } 8078 } else { 8079 /* all channels */ 8080 for (band = 0; band < NUM_NL80211_BANDS; band++) { 8081 int j; 8082 8083 if (!wiphy->bands[band]) 8084 continue; 8085 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 8086 struct ieee80211_channel *chan; 8087 8088 chan = &wiphy->bands[band]->channels[j]; 8089 8090 if (chan->flags & IEEE80211_CHAN_DISABLED) 8091 continue; 8092 8093 request->channels[i] = chan; 8094 i++; 8095 } 8096 } 8097 } 8098 8099 if (!i) { 8100 err = -EINVAL; 8101 goto out_free; 8102 } 8103 8104 request->n_channels = i; 8105 8106 i = 0; 8107 if (n_ssids) { 8108 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS], 8109 tmp) { 8110 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 8111 err = -EINVAL; 8112 goto out_free; 8113 } 8114 request->ssids[i].ssid_len = nla_len(attr); 8115 memcpy(request->ssids[i].ssid, nla_data(attr), 8116 nla_len(attr)); 8117 i++; 8118 } 8119 } 8120 8121 i = 0; 8122 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 8123 nla_for_each_nested(attr, 8124 attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 8125 tmp) { 8126 struct nlattr *ssid, *bssid, *rssi; 8127 8128 err = nla_parse_nested_deprecated(tb, 8129 NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 8130 attr, 8131 nl80211_match_policy, 8132 NULL); 8133 if (err) 8134 goto out_free; 8135 ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID]; 8136 bssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]; 8137 8138 if (!ssid && !bssid) { 8139 i++; 8140 continue; 8141 } 8142 8143 if (WARN_ON(i >= n_match_sets)) { 8144 /* this indicates a programming error, 8145 * the loop above should have verified 8146 * things properly 8147 */ 8148 err = -EINVAL; 8149 goto out_free; 8150 } 8151 8152 if (ssid) { 8153 if (nla_len(ssid) > IEEE80211_MAX_SSID_LEN) { 8154 err = -EINVAL; 8155 goto out_free; 8156 } 8157 memcpy(request->match_sets[i].ssid.ssid, 8158 nla_data(ssid), nla_len(ssid)); 8159 request->match_sets[i].ssid.ssid_len = 8160 nla_len(ssid); 8161 } 8162 if (bssid) { 8163 if (nla_len(bssid) != ETH_ALEN) { 8164 err = -EINVAL; 8165 goto out_free; 8166 } 8167 memcpy(request->match_sets[i].bssid, 8168 nla_data(bssid), ETH_ALEN); 8169 } 8170 8171 /* special attribute - old implementation w/a */ 8172 request->match_sets[i].rssi_thold = default_match_rssi; 8173 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 8174 if (rssi) 8175 request->match_sets[i].rssi_thold = 8176 nla_get_s32(rssi); 8177 8178 /* Parse per band RSSI attribute */ 8179 err = nl80211_parse_sched_scan_per_band_rssi(wiphy, 8180 &request->match_sets[i], 8181 tb[NL80211_SCHED_SCAN_MATCH_PER_BAND_RSSI], 8182 request->match_sets[i].rssi_thold); 8183 if (err) 8184 goto out_free; 8185 8186 i++; 8187 } 8188 8189 /* there was no other matchset, so the RSSI one is alone */ 8190 if (i == 0 && n_match_sets) 8191 request->match_sets[0].rssi_thold = default_match_rssi; 8192 8193 request->min_rssi_thold = INT_MAX; 8194 for (i = 0; i < n_match_sets; i++) 8195 request->min_rssi_thold = 8196 min(request->match_sets[i].rssi_thold, 8197 request->min_rssi_thold); 8198 } else { 8199 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF; 8200 } 8201 8202 if (ie_len) { 8203 request->ie_len = ie_len; 8204 memcpy((void *)request->ie, 8205 nla_data(attrs[NL80211_ATTR_IE]), 8206 request->ie_len); 8207 } 8208 8209 err = nl80211_check_scan_flags(wiphy, wdev, request, attrs, true); 8210 if (err) 8211 goto out_free; 8212 8213 if (attrs[NL80211_ATTR_SCHED_SCAN_DELAY]) 8214 request->delay = 8215 nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_DELAY]); 8216 8217 if (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]) { 8218 request->relative_rssi = nla_get_s8( 8219 attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]); 8220 request->relative_rssi_set = true; 8221 } 8222 8223 if (request->relative_rssi_set && 8224 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]) { 8225 struct nl80211_bss_select_rssi_adjust *rssi_adjust; 8226 8227 rssi_adjust = nla_data( 8228 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]); 8229 request->rssi_adjust.band = rssi_adjust->band; 8230 request->rssi_adjust.delta = rssi_adjust->delta; 8231 if (!is_band_valid(wiphy, request->rssi_adjust.band)) { 8232 err = -EINVAL; 8233 goto out_free; 8234 } 8235 } 8236 8237 err = nl80211_parse_sched_scan_plans(wiphy, n_plans, request, attrs); 8238 if (err) 8239 goto out_free; 8240 8241 request->scan_start = jiffies; 8242 8243 return request; 8244 8245 out_free: 8246 kfree(request); 8247 return ERR_PTR(err); 8248 } 8249 8250 static int nl80211_start_sched_scan(struct sk_buff *skb, 8251 struct genl_info *info) 8252 { 8253 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8254 struct net_device *dev = info->user_ptr[1]; 8255 struct wireless_dev *wdev = dev->ieee80211_ptr; 8256 struct cfg80211_sched_scan_request *sched_scan_req; 8257 bool want_multi; 8258 int err; 8259 8260 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start) 8261 return -EOPNOTSUPP; 8262 8263 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI]; 8264 err = cfg80211_sched_scan_req_possible(rdev, want_multi); 8265 if (err) 8266 return err; 8267 8268 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev, 8269 info->attrs, 8270 rdev->wiphy.max_match_sets); 8271 8272 err = PTR_ERR_OR_ZERO(sched_scan_req); 8273 if (err) 8274 goto out_err; 8275 8276 /* leave request id zero for legacy request 8277 * or if driver does not support multi-scheduled scan 8278 */ 8279 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) 8280 sched_scan_req->reqid = cfg80211_assign_cookie(rdev); 8281 8282 err = rdev_sched_scan_start(rdev, dev, sched_scan_req); 8283 if (err) 8284 goto out_free; 8285 8286 sched_scan_req->dev = dev; 8287 sched_scan_req->wiphy = &rdev->wiphy; 8288 8289 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 8290 sched_scan_req->owner_nlportid = info->snd_portid; 8291 8292 cfg80211_add_sched_scan_req(rdev, sched_scan_req); 8293 8294 nl80211_send_sched_scan(sched_scan_req, NL80211_CMD_START_SCHED_SCAN); 8295 return 0; 8296 8297 out_free: 8298 kfree(sched_scan_req); 8299 out_err: 8300 return err; 8301 } 8302 8303 static int nl80211_stop_sched_scan(struct sk_buff *skb, 8304 struct genl_info *info) 8305 { 8306 struct cfg80211_sched_scan_request *req; 8307 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8308 u64 cookie; 8309 8310 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop) 8311 return -EOPNOTSUPP; 8312 8313 if (info->attrs[NL80211_ATTR_COOKIE]) { 8314 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 8315 return __cfg80211_stop_sched_scan(rdev, cookie, false); 8316 } 8317 8318 req = list_first_or_null_rcu(&rdev->sched_scan_req_list, 8319 struct cfg80211_sched_scan_request, 8320 list); 8321 if (!req || req->reqid || 8322 (req->owner_nlportid && 8323 req->owner_nlportid != info->snd_portid)) 8324 return -ENOENT; 8325 8326 return cfg80211_stop_sched_scan_req(rdev, req, false); 8327 } 8328 8329 static int nl80211_start_radar_detection(struct sk_buff *skb, 8330 struct genl_info *info) 8331 { 8332 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8333 struct net_device *dev = info->user_ptr[1]; 8334 struct wireless_dev *wdev = dev->ieee80211_ptr; 8335 struct wiphy *wiphy = wdev->wiphy; 8336 struct cfg80211_chan_def chandef; 8337 enum nl80211_dfs_regions dfs_region; 8338 unsigned int cac_time_ms; 8339 int err; 8340 8341 dfs_region = reg_get_dfs_region(wiphy); 8342 if (dfs_region == NL80211_DFS_UNSET) 8343 return -EINVAL; 8344 8345 err = nl80211_parse_chandef(rdev, info, &chandef); 8346 if (err) 8347 return err; 8348 8349 if (netif_carrier_ok(dev)) 8350 return -EBUSY; 8351 8352 if (wdev->cac_started) 8353 return -EBUSY; 8354 8355 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); 8356 if (err < 0) 8357 return err; 8358 8359 if (err == 0) 8360 return -EINVAL; 8361 8362 if (!cfg80211_chandef_dfs_usable(wiphy, &chandef)) 8363 return -EINVAL; 8364 8365 /* CAC start is offloaded to HW and can't be started manually */ 8366 if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD)) 8367 return -EOPNOTSUPP; 8368 8369 if (!rdev->ops->start_radar_detection) 8370 return -EOPNOTSUPP; 8371 8372 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); 8373 if (WARN_ON(!cac_time_ms)) 8374 cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS; 8375 8376 err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms); 8377 if (!err) { 8378 wdev->chandef = chandef; 8379 wdev->cac_started = true; 8380 wdev->cac_start_time = jiffies; 8381 wdev->cac_time_ms = cac_time_ms; 8382 } 8383 return err; 8384 } 8385 8386 static int nl80211_notify_radar_detection(struct sk_buff *skb, 8387 struct genl_info *info) 8388 { 8389 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8390 struct net_device *dev = info->user_ptr[1]; 8391 struct wireless_dev *wdev = dev->ieee80211_ptr; 8392 struct wiphy *wiphy = wdev->wiphy; 8393 struct cfg80211_chan_def chandef; 8394 enum nl80211_dfs_regions dfs_region; 8395 int err; 8396 8397 dfs_region = reg_get_dfs_region(wiphy); 8398 if (dfs_region == NL80211_DFS_UNSET) { 8399 GENL_SET_ERR_MSG(info, 8400 "DFS Region is not set. Unexpected Radar indication"); 8401 return -EINVAL; 8402 } 8403 8404 err = nl80211_parse_chandef(rdev, info, &chandef); 8405 if (err) { 8406 GENL_SET_ERR_MSG(info, "Unable to extract chandef info"); 8407 return err; 8408 } 8409 8410 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); 8411 if (err < 0) { 8412 GENL_SET_ERR_MSG(info, "chandef is invalid"); 8413 return err; 8414 } 8415 8416 if (err == 0) { 8417 GENL_SET_ERR_MSG(info, 8418 "Unexpected Radar indication for chandef/iftype"); 8419 return -EINVAL; 8420 } 8421 8422 /* Do not process this notification if radar is already detected 8423 * by kernel on this channel, and return success. 8424 */ 8425 if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE) 8426 return 0; 8427 8428 cfg80211_set_dfs_state(wiphy, &chandef, NL80211_DFS_UNAVAILABLE); 8429 8430 cfg80211_sched_dfs_chan_update(rdev); 8431 8432 rdev->radar_chandef = chandef; 8433 8434 /* Propagate this notification to other radios as well */ 8435 queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); 8436 8437 return 0; 8438 } 8439 8440 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info) 8441 { 8442 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8443 struct net_device *dev = info->user_ptr[1]; 8444 struct wireless_dev *wdev = dev->ieee80211_ptr; 8445 struct cfg80211_csa_settings params; 8446 /* csa_attrs is defined static to avoid waste of stack size - this 8447 * function is called under RTNL lock, so this should not be a problem. 8448 */ 8449 static struct nlattr *csa_attrs[NL80211_ATTR_MAX+1]; 8450 int err; 8451 bool need_new_beacon = false; 8452 bool need_handle_dfs_flag = true; 8453 int len, i; 8454 u32 cs_count; 8455 8456 if (!rdev->ops->channel_switch || 8457 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) 8458 return -EOPNOTSUPP; 8459 8460 switch (dev->ieee80211_ptr->iftype) { 8461 case NL80211_IFTYPE_AP: 8462 case NL80211_IFTYPE_P2P_GO: 8463 need_new_beacon = true; 8464 /* For all modes except AP the handle_dfs flag needs to be 8465 * supplied to tell the kernel that userspace will handle radar 8466 * events when they happen. Otherwise a switch to a channel 8467 * requiring DFS will be rejected. 8468 */ 8469 need_handle_dfs_flag = false; 8470 8471 /* useless if AP is not running */ 8472 if (!wdev->beacon_interval) 8473 return -ENOTCONN; 8474 break; 8475 case NL80211_IFTYPE_ADHOC: 8476 if (!wdev->ssid_len) 8477 return -ENOTCONN; 8478 break; 8479 case NL80211_IFTYPE_MESH_POINT: 8480 if (!wdev->mesh_id_len) 8481 return -ENOTCONN; 8482 break; 8483 default: 8484 return -EOPNOTSUPP; 8485 } 8486 8487 memset(¶ms, 0, sizeof(params)); 8488 params.beacon_csa.ftm_responder = -1; 8489 8490 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 8491 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) 8492 return -EINVAL; 8493 8494 /* only important for AP, IBSS and mesh create IEs internally */ 8495 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) 8496 return -EINVAL; 8497 8498 /* Even though the attribute is u32, the specification says 8499 * u8, so let's make sure we don't overflow. 8500 */ 8501 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); 8502 if (cs_count > 255) 8503 return -EINVAL; 8504 8505 params.count = cs_count; 8506 8507 if (!need_new_beacon) 8508 goto skip_beacons; 8509 8510 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_after); 8511 if (err) 8512 return err; 8513 8514 err = nla_parse_nested_deprecated(csa_attrs, NL80211_ATTR_MAX, 8515 info->attrs[NL80211_ATTR_CSA_IES], 8516 nl80211_policy, info->extack); 8517 if (err) 8518 return err; 8519 8520 err = nl80211_parse_beacon(rdev, csa_attrs, ¶ms.beacon_csa); 8521 if (err) 8522 return err; 8523 8524 if (!csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]) 8525 return -EINVAL; 8526 8527 len = nla_len(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]); 8528 if (!len || (len % sizeof(u16))) 8529 return -EINVAL; 8530 8531 params.n_counter_offsets_beacon = len / sizeof(u16); 8532 if (rdev->wiphy.max_num_csa_counters && 8533 (params.n_counter_offsets_beacon > 8534 rdev->wiphy.max_num_csa_counters)) 8535 return -EINVAL; 8536 8537 params.counter_offsets_beacon = 8538 nla_data(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]); 8539 8540 /* sanity checks - counters should fit and be the same */ 8541 for (i = 0; i < params.n_counter_offsets_beacon; i++) { 8542 u16 offset = params.counter_offsets_beacon[i]; 8543 8544 if (offset >= params.beacon_csa.tail_len) 8545 return -EINVAL; 8546 8547 if (params.beacon_csa.tail[offset] != params.count) 8548 return -EINVAL; 8549 } 8550 8551 if (csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]) { 8552 len = nla_len(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]); 8553 if (!len || (len % sizeof(u16))) 8554 return -EINVAL; 8555 8556 params.n_counter_offsets_presp = len / sizeof(u16); 8557 if (rdev->wiphy.max_num_csa_counters && 8558 (params.n_counter_offsets_presp > 8559 rdev->wiphy.max_num_csa_counters)) 8560 return -EINVAL; 8561 8562 params.counter_offsets_presp = 8563 nla_data(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]); 8564 8565 /* sanity checks - counters should fit and be the same */ 8566 for (i = 0; i < params.n_counter_offsets_presp; i++) { 8567 u16 offset = params.counter_offsets_presp[i]; 8568 8569 if (offset >= params.beacon_csa.probe_resp_len) 8570 return -EINVAL; 8571 8572 if (params.beacon_csa.probe_resp[offset] != 8573 params.count) 8574 return -EINVAL; 8575 } 8576 } 8577 8578 skip_beacons: 8579 err = nl80211_parse_chandef(rdev, info, ¶ms.chandef); 8580 if (err) 8581 return err; 8582 8583 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, 8584 wdev->iftype)) 8585 return -EINVAL; 8586 8587 err = cfg80211_chandef_dfs_required(wdev->wiphy, 8588 ¶ms.chandef, 8589 wdev->iftype); 8590 if (err < 0) 8591 return err; 8592 8593 if (err > 0) { 8594 params.radar_required = true; 8595 if (need_handle_dfs_flag && 8596 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) { 8597 return -EINVAL; 8598 } 8599 } 8600 8601 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) 8602 params.block_tx = true; 8603 8604 wdev_lock(wdev); 8605 err = rdev_channel_switch(rdev, dev, ¶ms); 8606 wdev_unlock(wdev); 8607 8608 return err; 8609 } 8610 8611 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb, 8612 u32 seq, int flags, 8613 struct cfg80211_registered_device *rdev, 8614 struct wireless_dev *wdev, 8615 struct cfg80211_internal_bss *intbss) 8616 { 8617 struct cfg80211_bss *res = &intbss->pub; 8618 const struct cfg80211_bss_ies *ies; 8619 void *hdr; 8620 struct nlattr *bss; 8621 8622 ASSERT_WDEV_LOCK(wdev); 8623 8624 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 8625 NL80211_CMD_NEW_SCAN_RESULTS); 8626 if (!hdr) 8627 return -1; 8628 8629 genl_dump_check_consistent(cb, hdr); 8630 8631 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) 8632 goto nla_put_failure; 8633 if (wdev->netdev && 8634 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) 8635 goto nla_put_failure; 8636 if (nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 8637 NL80211_ATTR_PAD)) 8638 goto nla_put_failure; 8639 8640 bss = nla_nest_start_noflag(msg, NL80211_ATTR_BSS); 8641 if (!bss) 8642 goto nla_put_failure; 8643 if ((!is_zero_ether_addr(res->bssid) && 8644 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) 8645 goto nla_put_failure; 8646 8647 rcu_read_lock(); 8648 /* indicate whether we have probe response data or not */ 8649 if (rcu_access_pointer(res->proberesp_ies) && 8650 nla_put_flag(msg, NL80211_BSS_PRESP_DATA)) 8651 goto fail_unlock_rcu; 8652 8653 /* this pointer prefers to be pointed to probe response data 8654 * but is always valid 8655 */ 8656 ies = rcu_dereference(res->ies); 8657 if (ies) { 8658 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf, 8659 NL80211_BSS_PAD)) 8660 goto fail_unlock_rcu; 8661 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, 8662 ies->len, ies->data)) 8663 goto fail_unlock_rcu; 8664 } 8665 8666 /* and this pointer is always (unless driver didn't know) beacon data */ 8667 ies = rcu_dereference(res->beacon_ies); 8668 if (ies && ies->from_beacon) { 8669 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf, 8670 NL80211_BSS_PAD)) 8671 goto fail_unlock_rcu; 8672 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, 8673 ies->len, ies->data)) 8674 goto fail_unlock_rcu; 8675 } 8676 rcu_read_unlock(); 8677 8678 if (res->beacon_interval && 8679 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) 8680 goto nla_put_failure; 8681 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || 8682 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || 8683 nla_put_u32(msg, NL80211_BSS_CHAN_WIDTH, res->scan_width) || 8684 nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO, 8685 jiffies_to_msecs(jiffies - intbss->ts))) 8686 goto nla_put_failure; 8687 8688 if (intbss->parent_tsf && 8689 (nla_put_u64_64bit(msg, NL80211_BSS_PARENT_TSF, 8690 intbss->parent_tsf, NL80211_BSS_PAD) || 8691 nla_put(msg, NL80211_BSS_PARENT_BSSID, ETH_ALEN, 8692 intbss->parent_bssid))) 8693 goto nla_put_failure; 8694 8695 if (intbss->ts_boottime && 8696 nla_put_u64_64bit(msg, NL80211_BSS_LAST_SEEN_BOOTTIME, 8697 intbss->ts_boottime, NL80211_BSS_PAD)) 8698 goto nla_put_failure; 8699 8700 if (!nl80211_put_signal(msg, intbss->pub.chains, 8701 intbss->pub.chain_signal, 8702 NL80211_BSS_CHAIN_SIGNAL)) 8703 goto nla_put_failure; 8704 8705 switch (rdev->wiphy.signal_type) { 8706 case CFG80211_SIGNAL_TYPE_MBM: 8707 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal)) 8708 goto nla_put_failure; 8709 break; 8710 case CFG80211_SIGNAL_TYPE_UNSPEC: 8711 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal)) 8712 goto nla_put_failure; 8713 break; 8714 default: 8715 break; 8716 } 8717 8718 switch (wdev->iftype) { 8719 case NL80211_IFTYPE_P2P_CLIENT: 8720 case NL80211_IFTYPE_STATION: 8721 if (intbss == wdev->current_bss && 8722 nla_put_u32(msg, NL80211_BSS_STATUS, 8723 NL80211_BSS_STATUS_ASSOCIATED)) 8724 goto nla_put_failure; 8725 break; 8726 case NL80211_IFTYPE_ADHOC: 8727 if (intbss == wdev->current_bss && 8728 nla_put_u32(msg, NL80211_BSS_STATUS, 8729 NL80211_BSS_STATUS_IBSS_JOINED)) 8730 goto nla_put_failure; 8731 break; 8732 default: 8733 break; 8734 } 8735 8736 nla_nest_end(msg, bss); 8737 8738 genlmsg_end(msg, hdr); 8739 return 0; 8740 8741 fail_unlock_rcu: 8742 rcu_read_unlock(); 8743 nla_put_failure: 8744 genlmsg_cancel(msg, hdr); 8745 return -EMSGSIZE; 8746 } 8747 8748 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb) 8749 { 8750 struct cfg80211_registered_device *rdev; 8751 struct cfg80211_internal_bss *scan; 8752 struct wireless_dev *wdev; 8753 int start = cb->args[2], idx = 0; 8754 int err; 8755 8756 rtnl_lock(); 8757 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev); 8758 if (err) { 8759 rtnl_unlock(); 8760 return err; 8761 } 8762 8763 wdev_lock(wdev); 8764 spin_lock_bh(&rdev->bss_lock); 8765 8766 /* 8767 * dump_scan will be called multiple times to break up the scan results 8768 * into multiple messages. It is unlikely that any more bss-es will be 8769 * expired after the first call, so only call only call this on the 8770 * first dump_scan invocation. 8771 */ 8772 if (start == 0) 8773 cfg80211_bss_expire(rdev); 8774 8775 cb->seq = rdev->bss_generation; 8776 8777 list_for_each_entry(scan, &rdev->bss_list, list) { 8778 if (++idx <= start) 8779 continue; 8780 if (nl80211_send_bss(skb, cb, 8781 cb->nlh->nlmsg_seq, NLM_F_MULTI, 8782 rdev, wdev, scan) < 0) { 8783 idx--; 8784 break; 8785 } 8786 } 8787 8788 spin_unlock_bh(&rdev->bss_lock); 8789 wdev_unlock(wdev); 8790 8791 cb->args[2] = idx; 8792 rtnl_unlock(); 8793 8794 return skb->len; 8795 } 8796 8797 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq, 8798 int flags, struct net_device *dev, 8799 bool allow_radio_stats, 8800 struct survey_info *survey) 8801 { 8802 void *hdr; 8803 struct nlattr *infoattr; 8804 8805 /* skip radio stats if userspace didn't request them */ 8806 if (!survey->channel && !allow_radio_stats) 8807 return 0; 8808 8809 hdr = nl80211hdr_put(msg, portid, seq, flags, 8810 NL80211_CMD_NEW_SURVEY_RESULTS); 8811 if (!hdr) 8812 return -ENOMEM; 8813 8814 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 8815 goto nla_put_failure; 8816 8817 infoattr = nla_nest_start_noflag(msg, NL80211_ATTR_SURVEY_INFO); 8818 if (!infoattr) 8819 goto nla_put_failure; 8820 8821 if (survey->channel && 8822 nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY, 8823 survey->channel->center_freq)) 8824 goto nla_put_failure; 8825 8826 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && 8827 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) 8828 goto nla_put_failure; 8829 if ((survey->filled & SURVEY_INFO_IN_USE) && 8830 nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE)) 8831 goto nla_put_failure; 8832 if ((survey->filled & SURVEY_INFO_TIME) && 8833 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME, 8834 survey->time, NL80211_SURVEY_INFO_PAD)) 8835 goto nla_put_failure; 8836 if ((survey->filled & SURVEY_INFO_TIME_BUSY) && 8837 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BUSY, 8838 survey->time_busy, NL80211_SURVEY_INFO_PAD)) 8839 goto nla_put_failure; 8840 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) && 8841 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_EXT_BUSY, 8842 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD)) 8843 goto nla_put_failure; 8844 if ((survey->filled & SURVEY_INFO_TIME_RX) && 8845 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_RX, 8846 survey->time_rx, NL80211_SURVEY_INFO_PAD)) 8847 goto nla_put_failure; 8848 if ((survey->filled & SURVEY_INFO_TIME_TX) && 8849 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_TX, 8850 survey->time_tx, NL80211_SURVEY_INFO_PAD)) 8851 goto nla_put_failure; 8852 if ((survey->filled & SURVEY_INFO_TIME_SCAN) && 8853 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_SCAN, 8854 survey->time_scan, NL80211_SURVEY_INFO_PAD)) 8855 goto nla_put_failure; 8856 if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) && 8857 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BSS_RX, 8858 survey->time_bss_rx, NL80211_SURVEY_INFO_PAD)) 8859 goto nla_put_failure; 8860 8861 nla_nest_end(msg, infoattr); 8862 8863 genlmsg_end(msg, hdr); 8864 return 0; 8865 8866 nla_put_failure: 8867 genlmsg_cancel(msg, hdr); 8868 return -EMSGSIZE; 8869 } 8870 8871 static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb) 8872 { 8873 struct nlattr **attrbuf; 8874 struct survey_info survey; 8875 struct cfg80211_registered_device *rdev; 8876 struct wireless_dev *wdev; 8877 int survey_idx = cb->args[2]; 8878 int res; 8879 bool radio_stats; 8880 8881 attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf), GFP_KERNEL); 8882 if (!attrbuf) 8883 return -ENOMEM; 8884 8885 rtnl_lock(); 8886 res = nl80211_prepare_wdev_dump(cb, &rdev, &wdev); 8887 if (res) 8888 goto out_err; 8889 8890 /* prepare_wdev_dump parsed the attributes */ 8891 radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS]; 8892 8893 if (!wdev->netdev) { 8894 res = -EINVAL; 8895 goto out_err; 8896 } 8897 8898 if (!rdev->ops->dump_survey) { 8899 res = -EOPNOTSUPP; 8900 goto out_err; 8901 } 8902 8903 while (1) { 8904 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey); 8905 if (res == -ENOENT) 8906 break; 8907 if (res) 8908 goto out_err; 8909 8910 /* don't send disabled channels, but do send non-channel data */ 8911 if (survey.channel && 8912 survey.channel->flags & IEEE80211_CHAN_DISABLED) { 8913 survey_idx++; 8914 continue; 8915 } 8916 8917 if (nl80211_send_survey(skb, 8918 NETLINK_CB(cb->skb).portid, 8919 cb->nlh->nlmsg_seq, NLM_F_MULTI, 8920 wdev->netdev, radio_stats, &survey) < 0) 8921 goto out; 8922 survey_idx++; 8923 } 8924 8925 out: 8926 cb->args[2] = survey_idx; 8927 res = skb->len; 8928 out_err: 8929 kfree(attrbuf); 8930 rtnl_unlock(); 8931 return res; 8932 } 8933 8934 static bool nl80211_valid_wpa_versions(u32 wpa_versions) 8935 { 8936 return !(wpa_versions & ~(NL80211_WPA_VERSION_1 | 8937 NL80211_WPA_VERSION_2 | 8938 NL80211_WPA_VERSION_3)); 8939 } 8940 8941 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info) 8942 { 8943 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8944 struct net_device *dev = info->user_ptr[1]; 8945 struct ieee80211_channel *chan; 8946 const u8 *bssid, *ssid, *ie = NULL, *auth_data = NULL; 8947 int err, ssid_len, ie_len = 0, auth_data_len = 0; 8948 enum nl80211_auth_type auth_type; 8949 struct key_parse key; 8950 bool local_state_change; 8951 8952 if (!info->attrs[NL80211_ATTR_MAC]) 8953 return -EINVAL; 8954 8955 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) 8956 return -EINVAL; 8957 8958 if (!info->attrs[NL80211_ATTR_SSID]) 8959 return -EINVAL; 8960 8961 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 8962 return -EINVAL; 8963 8964 err = nl80211_parse_key(info, &key); 8965 if (err) 8966 return err; 8967 8968 if (key.idx >= 0) { 8969 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) 8970 return -EINVAL; 8971 if (!key.p.key || !key.p.key_len) 8972 return -EINVAL; 8973 if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 || 8974 key.p.key_len != WLAN_KEY_LEN_WEP40) && 8975 (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 || 8976 key.p.key_len != WLAN_KEY_LEN_WEP104)) 8977 return -EINVAL; 8978 if (key.idx > 3) 8979 return -EINVAL; 8980 } else { 8981 key.p.key_len = 0; 8982 key.p.key = NULL; 8983 } 8984 8985 if (key.idx >= 0) { 8986 int i; 8987 bool ok = false; 8988 8989 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { 8990 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { 8991 ok = true; 8992 break; 8993 } 8994 } 8995 if (!ok) 8996 return -EINVAL; 8997 } 8998 8999 if (!rdev->ops->auth) 9000 return -EOPNOTSUPP; 9001 9002 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 9003 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 9004 return -EOPNOTSUPP; 9005 9006 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 9007 chan = nl80211_get_valid_chan(&rdev->wiphy, 9008 info->attrs[NL80211_ATTR_WIPHY_FREQ]); 9009 if (!chan) 9010 return -EINVAL; 9011 9012 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 9013 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 9014 9015 if (info->attrs[NL80211_ATTR_IE]) { 9016 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 9017 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 9018 } 9019 9020 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 9021 if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE)) 9022 return -EINVAL; 9023 9024 if ((auth_type == NL80211_AUTHTYPE_SAE || 9025 auth_type == NL80211_AUTHTYPE_FILS_SK || 9026 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 9027 auth_type == NL80211_AUTHTYPE_FILS_PK) && 9028 !info->attrs[NL80211_ATTR_AUTH_DATA]) 9029 return -EINVAL; 9030 9031 if (info->attrs[NL80211_ATTR_AUTH_DATA]) { 9032 if (auth_type != NL80211_AUTHTYPE_SAE && 9033 auth_type != NL80211_AUTHTYPE_FILS_SK && 9034 auth_type != NL80211_AUTHTYPE_FILS_SK_PFS && 9035 auth_type != NL80211_AUTHTYPE_FILS_PK) 9036 return -EINVAL; 9037 auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]); 9038 auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]); 9039 /* need to include at least Auth Transaction and Status Code */ 9040 if (auth_data_len < 4) 9041 return -EINVAL; 9042 } 9043 9044 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 9045 9046 /* 9047 * Since we no longer track auth state, ignore 9048 * requests to only change local state. 9049 */ 9050 if (local_state_change) 9051 return 0; 9052 9053 wdev_lock(dev->ieee80211_ptr); 9054 err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, 9055 ssid, ssid_len, ie, ie_len, 9056 key.p.key, key.p.key_len, key.idx, 9057 auth_data, auth_data_len); 9058 wdev_unlock(dev->ieee80211_ptr); 9059 return err; 9060 } 9061 9062 static int validate_pae_over_nl80211(struct cfg80211_registered_device *rdev, 9063 struct genl_info *info) 9064 { 9065 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 9066 GENL_SET_ERR_MSG(info, "SOCKET_OWNER not set"); 9067 return -EINVAL; 9068 } 9069 9070 if (!rdev->ops->tx_control_port || 9071 !wiphy_ext_feature_isset(&rdev->wiphy, 9072 NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211)) 9073 return -EOPNOTSUPP; 9074 9075 return 0; 9076 } 9077 9078 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, 9079 struct genl_info *info, 9080 struct cfg80211_crypto_settings *settings, 9081 int cipher_limit) 9082 { 9083 memset(settings, 0, sizeof(*settings)); 9084 9085 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; 9086 9087 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { 9088 u16 proto; 9089 9090 proto = nla_get_u16( 9091 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); 9092 settings->control_port_ethertype = cpu_to_be16(proto); 9093 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && 9094 proto != ETH_P_PAE) 9095 return -EINVAL; 9096 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) 9097 settings->control_port_no_encrypt = true; 9098 } else 9099 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); 9100 9101 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 9102 int r = validate_pae_over_nl80211(rdev, info); 9103 9104 if (r < 0) 9105 return r; 9106 9107 settings->control_port_over_nl80211 = true; 9108 } 9109 9110 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { 9111 void *data; 9112 int len, i; 9113 9114 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 9115 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 9116 settings->n_ciphers_pairwise = len / sizeof(u32); 9117 9118 if (len % sizeof(u32)) 9119 return -EINVAL; 9120 9121 if (settings->n_ciphers_pairwise > cipher_limit) 9122 return -EINVAL; 9123 9124 memcpy(settings->ciphers_pairwise, data, len); 9125 9126 for (i = 0; i < settings->n_ciphers_pairwise; i++) 9127 if (!cfg80211_supported_cipher_suite( 9128 &rdev->wiphy, 9129 settings->ciphers_pairwise[i])) 9130 return -EINVAL; 9131 } 9132 9133 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { 9134 settings->cipher_group = 9135 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); 9136 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, 9137 settings->cipher_group)) 9138 return -EINVAL; 9139 } 9140 9141 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) { 9142 settings->wpa_versions = 9143 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); 9144 if (!nl80211_valid_wpa_versions(settings->wpa_versions)) 9145 return -EINVAL; 9146 } 9147 9148 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { 9149 void *data; 9150 int len; 9151 9152 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); 9153 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); 9154 settings->n_akm_suites = len / sizeof(u32); 9155 9156 if (len % sizeof(u32)) 9157 return -EINVAL; 9158 9159 if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES) 9160 return -EINVAL; 9161 9162 memcpy(settings->akm_suites, data, len); 9163 } 9164 9165 if (info->attrs[NL80211_ATTR_PMK]) { 9166 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN) 9167 return -EINVAL; 9168 if (!wiphy_ext_feature_isset(&rdev->wiphy, 9169 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK)) 9170 return -EINVAL; 9171 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]); 9172 } 9173 9174 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) { 9175 if (!wiphy_ext_feature_isset(&rdev->wiphy, 9176 NL80211_EXT_FEATURE_SAE_OFFLOAD)) 9177 return -EINVAL; 9178 settings->sae_pwd = 9179 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]); 9180 settings->sae_pwd_len = 9181 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); 9182 } 9183 9184 return 0; 9185 } 9186 9187 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info) 9188 { 9189 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9190 struct net_device *dev = info->user_ptr[1]; 9191 struct ieee80211_channel *chan; 9192 struct cfg80211_assoc_request req = {}; 9193 const u8 *bssid, *ssid; 9194 int err, ssid_len = 0; 9195 9196 if (dev->ieee80211_ptr->conn_owner_nlportid && 9197 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 9198 return -EPERM; 9199 9200 if (!info->attrs[NL80211_ATTR_MAC] || 9201 !info->attrs[NL80211_ATTR_SSID] || 9202 !info->attrs[NL80211_ATTR_WIPHY_FREQ]) 9203 return -EINVAL; 9204 9205 if (!rdev->ops->assoc) 9206 return -EOPNOTSUPP; 9207 9208 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 9209 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 9210 return -EOPNOTSUPP; 9211 9212 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 9213 9214 chan = nl80211_get_valid_chan(&rdev->wiphy, 9215 info->attrs[NL80211_ATTR_WIPHY_FREQ]); 9216 if (!chan) 9217 return -EINVAL; 9218 9219 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 9220 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 9221 9222 if (info->attrs[NL80211_ATTR_IE]) { 9223 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 9224 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 9225 } 9226 9227 if (info->attrs[NL80211_ATTR_USE_MFP]) { 9228 enum nl80211_mfp mfp = 9229 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 9230 if (mfp == NL80211_MFP_REQUIRED) 9231 req.use_mfp = true; 9232 else if (mfp != NL80211_MFP_NO) 9233 return -EINVAL; 9234 } 9235 9236 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 9237 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 9238 9239 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 9240 req.flags |= ASSOC_REQ_DISABLE_HT; 9241 9242 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 9243 memcpy(&req.ht_capa_mask, 9244 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 9245 sizeof(req.ht_capa_mask)); 9246 9247 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 9248 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 9249 return -EINVAL; 9250 memcpy(&req.ht_capa, 9251 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 9252 sizeof(req.ht_capa)); 9253 } 9254 9255 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 9256 req.flags |= ASSOC_REQ_DISABLE_VHT; 9257 9258 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 9259 memcpy(&req.vht_capa_mask, 9260 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 9261 sizeof(req.vht_capa_mask)); 9262 9263 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 9264 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 9265 return -EINVAL; 9266 memcpy(&req.vht_capa, 9267 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 9268 sizeof(req.vht_capa)); 9269 } 9270 9271 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { 9272 if (!((rdev->wiphy.features & 9273 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) && 9274 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && 9275 !wiphy_ext_feature_isset(&rdev->wiphy, 9276 NL80211_EXT_FEATURE_RRM)) 9277 return -EINVAL; 9278 req.flags |= ASSOC_REQ_USE_RRM; 9279 } 9280 9281 if (info->attrs[NL80211_ATTR_FILS_KEK]) { 9282 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); 9283 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); 9284 if (!info->attrs[NL80211_ATTR_FILS_NONCES]) 9285 return -EINVAL; 9286 req.fils_nonces = 9287 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); 9288 } 9289 9290 err = nl80211_crypto_settings(rdev, info, &req.crypto, 1); 9291 if (!err) { 9292 wdev_lock(dev->ieee80211_ptr); 9293 9294 err = cfg80211_mlme_assoc(rdev, dev, chan, bssid, 9295 ssid, ssid_len, &req); 9296 9297 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 9298 dev->ieee80211_ptr->conn_owner_nlportid = 9299 info->snd_portid; 9300 memcpy(dev->ieee80211_ptr->disconnect_bssid, 9301 bssid, ETH_ALEN); 9302 } 9303 9304 wdev_unlock(dev->ieee80211_ptr); 9305 } 9306 9307 return err; 9308 } 9309 9310 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info) 9311 { 9312 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9313 struct net_device *dev = info->user_ptr[1]; 9314 const u8 *ie = NULL, *bssid; 9315 int ie_len = 0, err; 9316 u16 reason_code; 9317 bool local_state_change; 9318 9319 if (dev->ieee80211_ptr->conn_owner_nlportid && 9320 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 9321 return -EPERM; 9322 9323 if (!info->attrs[NL80211_ATTR_MAC]) 9324 return -EINVAL; 9325 9326 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 9327 return -EINVAL; 9328 9329 if (!rdev->ops->deauth) 9330 return -EOPNOTSUPP; 9331 9332 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 9333 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 9334 return -EOPNOTSUPP; 9335 9336 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 9337 9338 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 9339 if (reason_code == 0) { 9340 /* Reason Code 0 is reserved */ 9341 return -EINVAL; 9342 } 9343 9344 if (info->attrs[NL80211_ATTR_IE]) { 9345 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 9346 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 9347 } 9348 9349 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 9350 9351 wdev_lock(dev->ieee80211_ptr); 9352 err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code, 9353 local_state_change); 9354 wdev_unlock(dev->ieee80211_ptr); 9355 return err; 9356 } 9357 9358 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) 9359 { 9360 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9361 struct net_device *dev = info->user_ptr[1]; 9362 const u8 *ie = NULL, *bssid; 9363 int ie_len = 0, err; 9364 u16 reason_code; 9365 bool local_state_change; 9366 9367 if (dev->ieee80211_ptr->conn_owner_nlportid && 9368 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 9369 return -EPERM; 9370 9371 if (!info->attrs[NL80211_ATTR_MAC]) 9372 return -EINVAL; 9373 9374 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 9375 return -EINVAL; 9376 9377 if (!rdev->ops->disassoc) 9378 return -EOPNOTSUPP; 9379 9380 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 9381 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 9382 return -EOPNOTSUPP; 9383 9384 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 9385 9386 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 9387 if (reason_code == 0) { 9388 /* Reason Code 0 is reserved */ 9389 return -EINVAL; 9390 } 9391 9392 if (info->attrs[NL80211_ATTR_IE]) { 9393 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 9394 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 9395 } 9396 9397 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 9398 9399 wdev_lock(dev->ieee80211_ptr); 9400 err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code, 9401 local_state_change); 9402 wdev_unlock(dev->ieee80211_ptr); 9403 return err; 9404 } 9405 9406 static bool 9407 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev, 9408 int mcast_rate[NUM_NL80211_BANDS], 9409 int rateval) 9410 { 9411 struct wiphy *wiphy = &rdev->wiphy; 9412 bool found = false; 9413 int band, i; 9414 9415 for (band = 0; band < NUM_NL80211_BANDS; band++) { 9416 struct ieee80211_supported_band *sband; 9417 9418 sband = wiphy->bands[band]; 9419 if (!sband) 9420 continue; 9421 9422 for (i = 0; i < sband->n_bitrates; i++) { 9423 if (sband->bitrates[i].bitrate == rateval) { 9424 mcast_rate[band] = i + 1; 9425 found = true; 9426 break; 9427 } 9428 } 9429 } 9430 9431 return found; 9432 } 9433 9434 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info) 9435 { 9436 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9437 struct net_device *dev = info->user_ptr[1]; 9438 struct cfg80211_ibss_params ibss; 9439 struct wiphy *wiphy; 9440 struct cfg80211_cached_keys *connkeys = NULL; 9441 int err; 9442 9443 memset(&ibss, 0, sizeof(ibss)); 9444 9445 if (!info->attrs[NL80211_ATTR_SSID] || 9446 !nla_len(info->attrs[NL80211_ATTR_SSID])) 9447 return -EINVAL; 9448 9449 ibss.beacon_interval = 100; 9450 9451 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) 9452 ibss.beacon_interval = 9453 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 9454 9455 err = cfg80211_validate_beacon_int(rdev, NL80211_IFTYPE_ADHOC, 9456 ibss.beacon_interval); 9457 if (err) 9458 return err; 9459 9460 if (!rdev->ops->join_ibss) 9461 return -EOPNOTSUPP; 9462 9463 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 9464 return -EOPNOTSUPP; 9465 9466 wiphy = &rdev->wiphy; 9467 9468 if (info->attrs[NL80211_ATTR_MAC]) { 9469 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 9470 9471 if (!is_valid_ether_addr(ibss.bssid)) 9472 return -EINVAL; 9473 } 9474 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 9475 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 9476 9477 if (info->attrs[NL80211_ATTR_IE]) { 9478 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 9479 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 9480 } 9481 9482 err = nl80211_parse_chandef(rdev, info, &ibss.chandef); 9483 if (err) 9484 return err; 9485 9486 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef, 9487 NL80211_IFTYPE_ADHOC)) 9488 return -EINVAL; 9489 9490 switch (ibss.chandef.width) { 9491 case NL80211_CHAN_WIDTH_5: 9492 case NL80211_CHAN_WIDTH_10: 9493 case NL80211_CHAN_WIDTH_20_NOHT: 9494 break; 9495 case NL80211_CHAN_WIDTH_20: 9496 case NL80211_CHAN_WIDTH_40: 9497 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) 9498 return -EINVAL; 9499 break; 9500 case NL80211_CHAN_WIDTH_80: 9501 case NL80211_CHAN_WIDTH_80P80: 9502 case NL80211_CHAN_WIDTH_160: 9503 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) 9504 return -EINVAL; 9505 if (!wiphy_ext_feature_isset(&rdev->wiphy, 9506 NL80211_EXT_FEATURE_VHT_IBSS)) 9507 return -EINVAL; 9508 break; 9509 default: 9510 return -EINVAL; 9511 } 9512 9513 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; 9514 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 9515 9516 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 9517 u8 *rates = 9518 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 9519 int n_rates = 9520 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 9521 struct ieee80211_supported_band *sband = 9522 wiphy->bands[ibss.chandef.chan->band]; 9523 9524 err = ieee80211_get_ratemask(sband, rates, n_rates, 9525 &ibss.basic_rates); 9526 if (err) 9527 return err; 9528 } 9529 9530 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 9531 memcpy(&ibss.ht_capa_mask, 9532 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 9533 sizeof(ibss.ht_capa_mask)); 9534 9535 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 9536 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 9537 return -EINVAL; 9538 memcpy(&ibss.ht_capa, 9539 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 9540 sizeof(ibss.ht_capa)); 9541 } 9542 9543 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 9544 !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate, 9545 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 9546 return -EINVAL; 9547 9548 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { 9549 bool no_ht = false; 9550 9551 connkeys = nl80211_parse_connkeys(rdev, info, &no_ht); 9552 if (IS_ERR(connkeys)) 9553 return PTR_ERR(connkeys); 9554 9555 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) && 9556 no_ht) { 9557 kzfree(connkeys); 9558 return -EINVAL; 9559 } 9560 } 9561 9562 ibss.control_port = 9563 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); 9564 9565 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 9566 int r = validate_pae_over_nl80211(rdev, info); 9567 9568 if (r < 0) { 9569 kzfree(connkeys); 9570 return r; 9571 } 9572 9573 ibss.control_port_over_nl80211 = true; 9574 } 9575 9576 ibss.userspace_handles_dfs = 9577 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 9578 9579 wdev_lock(dev->ieee80211_ptr); 9580 err = __cfg80211_join_ibss(rdev, dev, &ibss, connkeys); 9581 if (err) 9582 kzfree(connkeys); 9583 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 9584 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 9585 wdev_unlock(dev->ieee80211_ptr); 9586 9587 return err; 9588 } 9589 9590 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info) 9591 { 9592 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9593 struct net_device *dev = info->user_ptr[1]; 9594 9595 if (!rdev->ops->leave_ibss) 9596 return -EOPNOTSUPP; 9597 9598 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 9599 return -EOPNOTSUPP; 9600 9601 return cfg80211_leave_ibss(rdev, dev, false); 9602 } 9603 9604 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info) 9605 { 9606 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9607 struct net_device *dev = info->user_ptr[1]; 9608 int mcast_rate[NUM_NL80211_BANDS]; 9609 u32 nla_rate; 9610 int err; 9611 9612 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && 9613 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && 9614 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) 9615 return -EOPNOTSUPP; 9616 9617 if (!rdev->ops->set_mcast_rate) 9618 return -EOPNOTSUPP; 9619 9620 memset(mcast_rate, 0, sizeof(mcast_rate)); 9621 9622 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) 9623 return -EINVAL; 9624 9625 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); 9626 if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate)) 9627 return -EINVAL; 9628 9629 err = rdev_set_mcast_rate(rdev, dev, mcast_rate); 9630 9631 return err; 9632 } 9633 9634 static struct sk_buff * 9635 __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev, 9636 struct wireless_dev *wdev, int approxlen, 9637 u32 portid, u32 seq, enum nl80211_commands cmd, 9638 enum nl80211_attrs attr, 9639 const struct nl80211_vendor_cmd_info *info, 9640 gfp_t gfp) 9641 { 9642 struct sk_buff *skb; 9643 void *hdr; 9644 struct nlattr *data; 9645 9646 skb = nlmsg_new(approxlen + 100, gfp); 9647 if (!skb) 9648 return NULL; 9649 9650 hdr = nl80211hdr_put(skb, portid, seq, 0, cmd); 9651 if (!hdr) { 9652 kfree_skb(skb); 9653 return NULL; 9654 } 9655 9656 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 9657 goto nla_put_failure; 9658 9659 if (info) { 9660 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID, 9661 info->vendor_id)) 9662 goto nla_put_failure; 9663 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD, 9664 info->subcmd)) 9665 goto nla_put_failure; 9666 } 9667 9668 if (wdev) { 9669 if (nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 9670 wdev_id(wdev), NL80211_ATTR_PAD)) 9671 goto nla_put_failure; 9672 if (wdev->netdev && 9673 nla_put_u32(skb, NL80211_ATTR_IFINDEX, 9674 wdev->netdev->ifindex)) 9675 goto nla_put_failure; 9676 } 9677 9678 data = nla_nest_start_noflag(skb, attr); 9679 if (!data) 9680 goto nla_put_failure; 9681 9682 ((void **)skb->cb)[0] = rdev; 9683 ((void **)skb->cb)[1] = hdr; 9684 ((void **)skb->cb)[2] = data; 9685 9686 return skb; 9687 9688 nla_put_failure: 9689 kfree_skb(skb); 9690 return NULL; 9691 } 9692 9693 struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy, 9694 struct wireless_dev *wdev, 9695 enum nl80211_commands cmd, 9696 enum nl80211_attrs attr, 9697 unsigned int portid, 9698 int vendor_event_idx, 9699 int approxlen, gfp_t gfp) 9700 { 9701 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 9702 const struct nl80211_vendor_cmd_info *info; 9703 9704 switch (cmd) { 9705 case NL80211_CMD_TESTMODE: 9706 if (WARN_ON(vendor_event_idx != -1)) 9707 return NULL; 9708 info = NULL; 9709 break; 9710 case NL80211_CMD_VENDOR: 9711 if (WARN_ON(vendor_event_idx < 0 || 9712 vendor_event_idx >= wiphy->n_vendor_events)) 9713 return NULL; 9714 info = &wiphy->vendor_events[vendor_event_idx]; 9715 break; 9716 default: 9717 WARN_ON(1); 9718 return NULL; 9719 } 9720 9721 return __cfg80211_alloc_vendor_skb(rdev, wdev, approxlen, portid, 0, 9722 cmd, attr, info, gfp); 9723 } 9724 EXPORT_SYMBOL(__cfg80211_alloc_event_skb); 9725 9726 void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp) 9727 { 9728 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 9729 void *hdr = ((void **)skb->cb)[1]; 9730 struct nlmsghdr *nlhdr = nlmsg_hdr(skb); 9731 struct nlattr *data = ((void **)skb->cb)[2]; 9732 enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE; 9733 9734 /* clear CB data for netlink core to own from now on */ 9735 memset(skb->cb, 0, sizeof(skb->cb)); 9736 9737 nla_nest_end(skb, data); 9738 genlmsg_end(skb, hdr); 9739 9740 if (nlhdr->nlmsg_pid) { 9741 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb, 9742 nlhdr->nlmsg_pid); 9743 } else { 9744 if (data->nla_type == NL80211_ATTR_VENDOR_DATA) 9745 mcgrp = NL80211_MCGRP_VENDOR; 9746 9747 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 9748 skb, 0, mcgrp, gfp); 9749 } 9750 } 9751 EXPORT_SYMBOL(__cfg80211_send_event_skb); 9752 9753 #ifdef CONFIG_NL80211_TESTMODE 9754 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) 9755 { 9756 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9757 struct wireless_dev *wdev = 9758 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs); 9759 int err; 9760 9761 if (!rdev->ops->testmode_cmd) 9762 return -EOPNOTSUPP; 9763 9764 if (IS_ERR(wdev)) { 9765 err = PTR_ERR(wdev); 9766 if (err != -EINVAL) 9767 return err; 9768 wdev = NULL; 9769 } else if (wdev->wiphy != &rdev->wiphy) { 9770 return -EINVAL; 9771 } 9772 9773 if (!info->attrs[NL80211_ATTR_TESTDATA]) 9774 return -EINVAL; 9775 9776 rdev->cur_cmd_info = info; 9777 err = rdev_testmode_cmd(rdev, wdev, 9778 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), 9779 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); 9780 rdev->cur_cmd_info = NULL; 9781 9782 return err; 9783 } 9784 9785 static int nl80211_testmode_dump(struct sk_buff *skb, 9786 struct netlink_callback *cb) 9787 { 9788 struct cfg80211_registered_device *rdev; 9789 struct nlattr **attrbuf = NULL; 9790 int err; 9791 long phy_idx; 9792 void *data = NULL; 9793 int data_len = 0; 9794 9795 rtnl_lock(); 9796 9797 if (cb->args[0]) { 9798 /* 9799 * 0 is a valid index, but not valid for args[0], 9800 * so we need to offset by 1. 9801 */ 9802 phy_idx = cb->args[0] - 1; 9803 9804 rdev = cfg80211_rdev_by_wiphy_idx(phy_idx); 9805 if (!rdev) { 9806 err = -ENOENT; 9807 goto out_err; 9808 } 9809 } else { 9810 attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf), 9811 GFP_KERNEL); 9812 if (!attrbuf) { 9813 err = -ENOMEM; 9814 goto out_err; 9815 } 9816 9817 err = nlmsg_parse_deprecated(cb->nlh, 9818 GENL_HDRLEN + nl80211_fam.hdrsize, 9819 attrbuf, nl80211_fam.maxattr, 9820 nl80211_policy, NULL); 9821 if (err) 9822 goto out_err; 9823 9824 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); 9825 if (IS_ERR(rdev)) { 9826 err = PTR_ERR(rdev); 9827 goto out_err; 9828 } 9829 phy_idx = rdev->wiphy_idx; 9830 9831 if (attrbuf[NL80211_ATTR_TESTDATA]) 9832 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; 9833 } 9834 9835 if (cb->args[1]) { 9836 data = nla_data((void *)cb->args[1]); 9837 data_len = nla_len((void *)cb->args[1]); 9838 } 9839 9840 if (!rdev->ops->testmode_dump) { 9841 err = -EOPNOTSUPP; 9842 goto out_err; 9843 } 9844 9845 while (1) { 9846 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 9847 cb->nlh->nlmsg_seq, NLM_F_MULTI, 9848 NL80211_CMD_TESTMODE); 9849 struct nlattr *tmdata; 9850 9851 if (!hdr) 9852 break; 9853 9854 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) { 9855 genlmsg_cancel(skb, hdr); 9856 break; 9857 } 9858 9859 tmdata = nla_nest_start_noflag(skb, NL80211_ATTR_TESTDATA); 9860 if (!tmdata) { 9861 genlmsg_cancel(skb, hdr); 9862 break; 9863 } 9864 err = rdev_testmode_dump(rdev, skb, cb, data, data_len); 9865 nla_nest_end(skb, tmdata); 9866 9867 if (err == -ENOBUFS || err == -ENOENT) { 9868 genlmsg_cancel(skb, hdr); 9869 break; 9870 } else if (err) { 9871 genlmsg_cancel(skb, hdr); 9872 goto out_err; 9873 } 9874 9875 genlmsg_end(skb, hdr); 9876 } 9877 9878 err = skb->len; 9879 /* see above */ 9880 cb->args[0] = phy_idx + 1; 9881 out_err: 9882 kfree(attrbuf); 9883 rtnl_unlock(); 9884 return err; 9885 } 9886 #endif 9887 9888 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info) 9889 { 9890 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9891 struct net_device *dev = info->user_ptr[1]; 9892 struct cfg80211_connect_params connect; 9893 struct wiphy *wiphy; 9894 struct cfg80211_cached_keys *connkeys = NULL; 9895 int err; 9896 9897 memset(&connect, 0, sizeof(connect)); 9898 9899 if (!info->attrs[NL80211_ATTR_SSID] || 9900 !nla_len(info->attrs[NL80211_ATTR_SSID])) 9901 return -EINVAL; 9902 9903 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 9904 connect.auth_type = 9905 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 9906 if (!nl80211_valid_auth_type(rdev, connect.auth_type, 9907 NL80211_CMD_CONNECT)) 9908 return -EINVAL; 9909 } else 9910 connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC; 9911 9912 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; 9913 9914 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] && 9915 !wiphy_ext_feature_isset(&rdev->wiphy, 9916 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 9917 return -EINVAL; 9918 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS]; 9919 9920 err = nl80211_crypto_settings(rdev, info, &connect.crypto, 9921 NL80211_MAX_NR_CIPHER_SUITES); 9922 if (err) 9923 return err; 9924 9925 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 9926 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 9927 return -EOPNOTSUPP; 9928 9929 wiphy = &rdev->wiphy; 9930 9931 connect.bg_scan_period = -1; 9932 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && 9933 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { 9934 connect.bg_scan_period = 9935 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); 9936 } 9937 9938 if (info->attrs[NL80211_ATTR_MAC]) 9939 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 9940 else if (info->attrs[NL80211_ATTR_MAC_HINT]) 9941 connect.bssid_hint = 9942 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]); 9943 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 9944 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 9945 9946 if (info->attrs[NL80211_ATTR_IE]) { 9947 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 9948 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 9949 } 9950 9951 if (info->attrs[NL80211_ATTR_USE_MFP]) { 9952 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 9953 if (connect.mfp == NL80211_MFP_OPTIONAL && 9954 !wiphy_ext_feature_isset(&rdev->wiphy, 9955 NL80211_EXT_FEATURE_MFP_OPTIONAL)) 9956 return -EOPNOTSUPP; 9957 } else { 9958 connect.mfp = NL80211_MFP_NO; 9959 } 9960 9961 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 9962 connect.prev_bssid = 9963 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 9964 9965 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 9966 connect.channel = nl80211_get_valid_chan( 9967 wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ]); 9968 if (!connect.channel) 9969 return -EINVAL; 9970 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) { 9971 connect.channel_hint = nl80211_get_valid_chan( 9972 wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]); 9973 if (!connect.channel_hint) 9974 return -EINVAL; 9975 } 9976 9977 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { 9978 connect.edmg.channels = 9979 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); 9980 9981 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) 9982 connect.edmg.bw_config = 9983 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); 9984 } 9985 9986 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { 9987 connkeys = nl80211_parse_connkeys(rdev, info, NULL); 9988 if (IS_ERR(connkeys)) 9989 return PTR_ERR(connkeys); 9990 } 9991 9992 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 9993 connect.flags |= ASSOC_REQ_DISABLE_HT; 9994 9995 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 9996 memcpy(&connect.ht_capa_mask, 9997 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 9998 sizeof(connect.ht_capa_mask)); 9999 10000 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 10001 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { 10002 kzfree(connkeys); 10003 return -EINVAL; 10004 } 10005 memcpy(&connect.ht_capa, 10006 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 10007 sizeof(connect.ht_capa)); 10008 } 10009 10010 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 10011 connect.flags |= ASSOC_REQ_DISABLE_VHT; 10012 10013 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 10014 memcpy(&connect.vht_capa_mask, 10015 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 10016 sizeof(connect.vht_capa_mask)); 10017 10018 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 10019 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { 10020 kzfree(connkeys); 10021 return -EINVAL; 10022 } 10023 memcpy(&connect.vht_capa, 10024 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 10025 sizeof(connect.vht_capa)); 10026 } 10027 10028 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { 10029 if (!((rdev->wiphy.features & 10030 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) && 10031 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && 10032 !wiphy_ext_feature_isset(&rdev->wiphy, 10033 NL80211_EXT_FEATURE_RRM)) { 10034 kzfree(connkeys); 10035 return -EINVAL; 10036 } 10037 connect.flags |= ASSOC_REQ_USE_RRM; 10038 } 10039 10040 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); 10041 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { 10042 kzfree(connkeys); 10043 return -EOPNOTSUPP; 10044 } 10045 10046 if (info->attrs[NL80211_ATTR_BSS_SELECT]) { 10047 /* bss selection makes no sense if bssid is set */ 10048 if (connect.bssid) { 10049 kzfree(connkeys); 10050 return -EINVAL; 10051 } 10052 10053 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT], 10054 wiphy, &connect.bss_select); 10055 if (err) { 10056 kzfree(connkeys); 10057 return err; 10058 } 10059 } 10060 10061 if (wiphy_ext_feature_isset(&rdev->wiphy, 10062 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) && 10063 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && 10064 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && 10065 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && 10066 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 10067 connect.fils_erp_username = 10068 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 10069 connect.fils_erp_username_len = 10070 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 10071 connect.fils_erp_realm = 10072 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 10073 connect.fils_erp_realm_len = 10074 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 10075 connect.fils_erp_next_seq_num = 10076 nla_get_u16( 10077 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); 10078 connect.fils_erp_rrk = 10079 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 10080 connect.fils_erp_rrk_len = 10081 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 10082 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || 10083 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || 10084 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || 10085 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 10086 kzfree(connkeys); 10087 return -EINVAL; 10088 } 10089 10090 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) { 10091 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 10092 kzfree(connkeys); 10093 GENL_SET_ERR_MSG(info, 10094 "external auth requires connection ownership"); 10095 return -EINVAL; 10096 } 10097 connect.flags |= CONNECT_REQ_EXTERNAL_AUTH_SUPPORT; 10098 } 10099 10100 wdev_lock(dev->ieee80211_ptr); 10101 10102 err = cfg80211_connect(rdev, dev, &connect, connkeys, 10103 connect.prev_bssid); 10104 if (err) 10105 kzfree(connkeys); 10106 10107 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 10108 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 10109 if (connect.bssid) 10110 memcpy(dev->ieee80211_ptr->disconnect_bssid, 10111 connect.bssid, ETH_ALEN); 10112 else 10113 memset(dev->ieee80211_ptr->disconnect_bssid, 10114 0, ETH_ALEN); 10115 } 10116 10117 wdev_unlock(dev->ieee80211_ptr); 10118 10119 return err; 10120 } 10121 10122 static int nl80211_update_connect_params(struct sk_buff *skb, 10123 struct genl_info *info) 10124 { 10125 struct cfg80211_connect_params connect = {}; 10126 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10127 struct net_device *dev = info->user_ptr[1]; 10128 struct wireless_dev *wdev = dev->ieee80211_ptr; 10129 bool fils_sk_offload; 10130 u32 auth_type; 10131 u32 changed = 0; 10132 int ret; 10133 10134 if (!rdev->ops->update_connect_params) 10135 return -EOPNOTSUPP; 10136 10137 if (info->attrs[NL80211_ATTR_IE]) { 10138 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 10139 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 10140 changed |= UPDATE_ASSOC_IES; 10141 } 10142 10143 fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy, 10144 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD); 10145 10146 /* 10147 * when driver supports fils-sk offload all attributes must be 10148 * provided. So the else covers "fils-sk-not-all" and 10149 * "no-fils-sk-any". 10150 */ 10151 if (fils_sk_offload && 10152 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && 10153 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && 10154 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && 10155 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 10156 connect.fils_erp_username = 10157 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 10158 connect.fils_erp_username_len = 10159 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 10160 connect.fils_erp_realm = 10161 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 10162 connect.fils_erp_realm_len = 10163 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 10164 connect.fils_erp_next_seq_num = 10165 nla_get_u16( 10166 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); 10167 connect.fils_erp_rrk = 10168 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 10169 connect.fils_erp_rrk_len = 10170 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 10171 changed |= UPDATE_FILS_ERP_INFO; 10172 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || 10173 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || 10174 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || 10175 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 10176 return -EINVAL; 10177 } 10178 10179 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 10180 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 10181 if (!nl80211_valid_auth_type(rdev, auth_type, 10182 NL80211_CMD_CONNECT)) 10183 return -EINVAL; 10184 10185 if (auth_type == NL80211_AUTHTYPE_FILS_SK && 10186 fils_sk_offload && !(changed & UPDATE_FILS_ERP_INFO)) 10187 return -EINVAL; 10188 10189 connect.auth_type = auth_type; 10190 changed |= UPDATE_AUTH_TYPE; 10191 } 10192 10193 wdev_lock(dev->ieee80211_ptr); 10194 if (!wdev->current_bss) 10195 ret = -ENOLINK; 10196 else 10197 ret = rdev_update_connect_params(rdev, dev, &connect, changed); 10198 wdev_unlock(dev->ieee80211_ptr); 10199 10200 return ret; 10201 } 10202 10203 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info) 10204 { 10205 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10206 struct net_device *dev = info->user_ptr[1]; 10207 u16 reason; 10208 int ret; 10209 10210 if (dev->ieee80211_ptr->conn_owner_nlportid && 10211 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 10212 return -EPERM; 10213 10214 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 10215 reason = WLAN_REASON_DEAUTH_LEAVING; 10216 else 10217 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 10218 10219 if (reason == 0) 10220 return -EINVAL; 10221 10222 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 10223 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 10224 return -EOPNOTSUPP; 10225 10226 wdev_lock(dev->ieee80211_ptr); 10227 ret = cfg80211_disconnect(rdev, dev, reason, true); 10228 wdev_unlock(dev->ieee80211_ptr); 10229 return ret; 10230 } 10231 10232 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info) 10233 { 10234 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10235 struct net *net; 10236 int err; 10237 10238 if (info->attrs[NL80211_ATTR_PID]) { 10239 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); 10240 10241 net = get_net_ns_by_pid(pid); 10242 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) { 10243 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]); 10244 10245 net = get_net_ns_by_fd(fd); 10246 } else { 10247 return -EINVAL; 10248 } 10249 10250 if (IS_ERR(net)) 10251 return PTR_ERR(net); 10252 10253 err = 0; 10254 10255 /* check if anything to do */ 10256 if (!net_eq(wiphy_net(&rdev->wiphy), net)) 10257 err = cfg80211_switch_netns(rdev, net); 10258 10259 put_net(net); 10260 return err; 10261 } 10262 10263 static int nl80211_setdel_pmksa(struct sk_buff *skb, struct genl_info *info) 10264 { 10265 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10266 int (*rdev_ops)(struct wiphy *wiphy, struct net_device *dev, 10267 struct cfg80211_pmksa *pmksa) = NULL; 10268 struct net_device *dev = info->user_ptr[1]; 10269 struct cfg80211_pmksa pmksa; 10270 10271 memset(&pmksa, 0, sizeof(struct cfg80211_pmksa)); 10272 10273 if (!info->attrs[NL80211_ATTR_PMKID]) 10274 return -EINVAL; 10275 10276 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 10277 10278 if (info->attrs[NL80211_ATTR_MAC]) { 10279 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 10280 } else if (info->attrs[NL80211_ATTR_SSID] && 10281 info->attrs[NL80211_ATTR_FILS_CACHE_ID] && 10282 (info->genlhdr->cmd == NL80211_CMD_DEL_PMKSA || 10283 info->attrs[NL80211_ATTR_PMK])) { 10284 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 10285 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 10286 pmksa.cache_id = 10287 nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); 10288 } else { 10289 return -EINVAL; 10290 } 10291 if (info->attrs[NL80211_ATTR_PMK]) { 10292 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); 10293 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); 10294 } 10295 10296 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 10297 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && 10298 !(dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP && 10299 wiphy_ext_feature_isset(&rdev->wiphy, 10300 NL80211_EXT_FEATURE_AP_PMKSA_CACHING))) 10301 return -EOPNOTSUPP; 10302 10303 switch (info->genlhdr->cmd) { 10304 case NL80211_CMD_SET_PMKSA: 10305 rdev_ops = rdev->ops->set_pmksa; 10306 break; 10307 case NL80211_CMD_DEL_PMKSA: 10308 rdev_ops = rdev->ops->del_pmksa; 10309 break; 10310 default: 10311 WARN_ON(1); 10312 break; 10313 } 10314 10315 if (!rdev_ops) 10316 return -EOPNOTSUPP; 10317 10318 return rdev_ops(&rdev->wiphy, dev, &pmksa); 10319 } 10320 10321 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info) 10322 { 10323 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10324 struct net_device *dev = info->user_ptr[1]; 10325 10326 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 10327 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 10328 return -EOPNOTSUPP; 10329 10330 if (!rdev->ops->flush_pmksa) 10331 return -EOPNOTSUPP; 10332 10333 return rdev_flush_pmksa(rdev, dev); 10334 } 10335 10336 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info) 10337 { 10338 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10339 struct net_device *dev = info->user_ptr[1]; 10340 u8 action_code, dialog_token; 10341 u32 peer_capability = 0; 10342 u16 status_code; 10343 u8 *peer; 10344 bool initiator; 10345 10346 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 10347 !rdev->ops->tdls_mgmt) 10348 return -EOPNOTSUPP; 10349 10350 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || 10351 !info->attrs[NL80211_ATTR_STATUS_CODE] || 10352 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || 10353 !info->attrs[NL80211_ATTR_IE] || 10354 !info->attrs[NL80211_ATTR_MAC]) 10355 return -EINVAL; 10356 10357 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 10358 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); 10359 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 10360 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); 10361 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]); 10362 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]) 10363 peer_capability = 10364 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]); 10365 10366 return rdev_tdls_mgmt(rdev, dev, peer, action_code, 10367 dialog_token, status_code, peer_capability, 10368 initiator, 10369 nla_data(info->attrs[NL80211_ATTR_IE]), 10370 nla_len(info->attrs[NL80211_ATTR_IE])); 10371 } 10372 10373 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info) 10374 { 10375 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10376 struct net_device *dev = info->user_ptr[1]; 10377 enum nl80211_tdls_operation operation; 10378 u8 *peer; 10379 10380 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 10381 !rdev->ops->tdls_oper) 10382 return -EOPNOTSUPP; 10383 10384 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || 10385 !info->attrs[NL80211_ATTR_MAC]) 10386 return -EINVAL; 10387 10388 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); 10389 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 10390 10391 return rdev_tdls_oper(rdev, dev, peer, operation); 10392 } 10393 10394 static int nl80211_remain_on_channel(struct sk_buff *skb, 10395 struct genl_info *info) 10396 { 10397 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10398 struct wireless_dev *wdev = info->user_ptr[1]; 10399 struct cfg80211_chan_def chandef; 10400 const struct cfg80211_chan_def *compat_chandef; 10401 struct sk_buff *msg; 10402 void *hdr; 10403 u64 cookie; 10404 u32 duration; 10405 int err; 10406 10407 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 10408 !info->attrs[NL80211_ATTR_DURATION]) 10409 return -EINVAL; 10410 10411 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 10412 10413 if (!rdev->ops->remain_on_channel || 10414 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) 10415 return -EOPNOTSUPP; 10416 10417 /* 10418 * We should be on that channel for at least a minimum amount of 10419 * time (10ms) but no longer than the driver supports. 10420 */ 10421 if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 10422 duration > rdev->wiphy.max_remain_on_channel_duration) 10423 return -EINVAL; 10424 10425 err = nl80211_parse_chandef(rdev, info, &chandef); 10426 if (err) 10427 return err; 10428 10429 wdev_lock(wdev); 10430 if (!cfg80211_off_channel_oper_allowed(wdev) && 10431 !cfg80211_chandef_identical(&wdev->chandef, &chandef)) { 10432 compat_chandef = cfg80211_chandef_compatible(&wdev->chandef, 10433 &chandef); 10434 if (compat_chandef != &chandef) { 10435 wdev_unlock(wdev); 10436 return -EBUSY; 10437 } 10438 } 10439 wdev_unlock(wdev); 10440 10441 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 10442 if (!msg) 10443 return -ENOMEM; 10444 10445 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 10446 NL80211_CMD_REMAIN_ON_CHANNEL); 10447 if (!hdr) { 10448 err = -ENOBUFS; 10449 goto free_msg; 10450 } 10451 10452 err = rdev_remain_on_channel(rdev, wdev, chandef.chan, 10453 duration, &cookie); 10454 10455 if (err) 10456 goto free_msg; 10457 10458 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 10459 NL80211_ATTR_PAD)) 10460 goto nla_put_failure; 10461 10462 genlmsg_end(msg, hdr); 10463 10464 return genlmsg_reply(msg, info); 10465 10466 nla_put_failure: 10467 err = -ENOBUFS; 10468 free_msg: 10469 nlmsg_free(msg); 10470 return err; 10471 } 10472 10473 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb, 10474 struct genl_info *info) 10475 { 10476 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10477 struct wireless_dev *wdev = info->user_ptr[1]; 10478 u64 cookie; 10479 10480 if (!info->attrs[NL80211_ATTR_COOKIE]) 10481 return -EINVAL; 10482 10483 if (!rdev->ops->cancel_remain_on_channel) 10484 return -EOPNOTSUPP; 10485 10486 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 10487 10488 return rdev_cancel_remain_on_channel(rdev, wdev, cookie); 10489 } 10490 10491 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb, 10492 struct genl_info *info) 10493 { 10494 struct cfg80211_bitrate_mask mask; 10495 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10496 struct net_device *dev = info->user_ptr[1]; 10497 int err; 10498 10499 if (!rdev->ops->set_bitrate_mask) 10500 return -EOPNOTSUPP; 10501 10502 err = nl80211_parse_tx_bitrate_mask(info, &mask); 10503 if (err) 10504 return err; 10505 10506 return rdev_set_bitrate_mask(rdev, dev, NULL, &mask); 10507 } 10508 10509 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info) 10510 { 10511 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10512 struct wireless_dev *wdev = info->user_ptr[1]; 10513 u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION; 10514 10515 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) 10516 return -EINVAL; 10517 10518 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) 10519 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); 10520 10521 switch (wdev->iftype) { 10522 case NL80211_IFTYPE_STATION: 10523 case NL80211_IFTYPE_ADHOC: 10524 case NL80211_IFTYPE_P2P_CLIENT: 10525 case NL80211_IFTYPE_AP: 10526 case NL80211_IFTYPE_AP_VLAN: 10527 case NL80211_IFTYPE_MESH_POINT: 10528 case NL80211_IFTYPE_P2P_GO: 10529 case NL80211_IFTYPE_P2P_DEVICE: 10530 break; 10531 case NL80211_IFTYPE_NAN: 10532 default: 10533 return -EOPNOTSUPP; 10534 } 10535 10536 /* not much point in registering if we can't reply */ 10537 if (!rdev->ops->mgmt_tx) 10538 return -EOPNOTSUPP; 10539 10540 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, 10541 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), 10542 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH])); 10543 } 10544 10545 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info) 10546 { 10547 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10548 struct wireless_dev *wdev = info->user_ptr[1]; 10549 struct cfg80211_chan_def chandef; 10550 int err; 10551 void *hdr = NULL; 10552 u64 cookie; 10553 struct sk_buff *msg = NULL; 10554 struct cfg80211_mgmt_tx_params params = { 10555 .dont_wait_for_ack = 10556 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], 10557 }; 10558 10559 if (!info->attrs[NL80211_ATTR_FRAME]) 10560 return -EINVAL; 10561 10562 if (!rdev->ops->mgmt_tx) 10563 return -EOPNOTSUPP; 10564 10565 switch (wdev->iftype) { 10566 case NL80211_IFTYPE_P2P_DEVICE: 10567 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 10568 return -EINVAL; 10569 case NL80211_IFTYPE_STATION: 10570 case NL80211_IFTYPE_ADHOC: 10571 case NL80211_IFTYPE_P2P_CLIENT: 10572 case NL80211_IFTYPE_AP: 10573 case NL80211_IFTYPE_AP_VLAN: 10574 case NL80211_IFTYPE_MESH_POINT: 10575 case NL80211_IFTYPE_P2P_GO: 10576 break; 10577 case NL80211_IFTYPE_NAN: 10578 default: 10579 return -EOPNOTSUPP; 10580 } 10581 10582 if (info->attrs[NL80211_ATTR_DURATION]) { 10583 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 10584 return -EINVAL; 10585 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 10586 10587 /* 10588 * We should wait on the channel for at least a minimum amount 10589 * of time (10ms) but no longer than the driver supports. 10590 */ 10591 if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 10592 params.wait > rdev->wiphy.max_remain_on_channel_duration) 10593 return -EINVAL; 10594 } 10595 10596 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; 10597 10598 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 10599 return -EINVAL; 10600 10601 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 10602 10603 /* get the channel if any has been specified, otherwise pass NULL to 10604 * the driver. The latter will use the current one 10605 */ 10606 chandef.chan = NULL; 10607 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 10608 err = nl80211_parse_chandef(rdev, info, &chandef); 10609 if (err) 10610 return err; 10611 } 10612 10613 if (!chandef.chan && params.offchan) 10614 return -EINVAL; 10615 10616 wdev_lock(wdev); 10617 if (params.offchan && !cfg80211_off_channel_oper_allowed(wdev)) { 10618 wdev_unlock(wdev); 10619 return -EBUSY; 10620 } 10621 wdev_unlock(wdev); 10622 10623 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 10624 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 10625 10626 if (info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]) { 10627 int len = nla_len(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); 10628 int i; 10629 10630 if (len % sizeof(u16)) 10631 return -EINVAL; 10632 10633 params.n_csa_offsets = len / sizeof(u16); 10634 params.csa_offsets = 10635 nla_data(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); 10636 10637 /* check that all the offsets fit the frame */ 10638 for (i = 0; i < params.n_csa_offsets; i++) { 10639 if (params.csa_offsets[i] >= params.len) 10640 return -EINVAL; 10641 } 10642 } 10643 10644 if (!params.dont_wait_for_ack) { 10645 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 10646 if (!msg) 10647 return -ENOMEM; 10648 10649 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 10650 NL80211_CMD_FRAME); 10651 if (!hdr) { 10652 err = -ENOBUFS; 10653 goto free_msg; 10654 } 10655 } 10656 10657 params.chan = chandef.chan; 10658 err = cfg80211_mlme_mgmt_tx(rdev, wdev, ¶ms, &cookie); 10659 if (err) 10660 goto free_msg; 10661 10662 if (msg) { 10663 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 10664 NL80211_ATTR_PAD)) 10665 goto nla_put_failure; 10666 10667 genlmsg_end(msg, hdr); 10668 return genlmsg_reply(msg, info); 10669 } 10670 10671 return 0; 10672 10673 nla_put_failure: 10674 err = -ENOBUFS; 10675 free_msg: 10676 nlmsg_free(msg); 10677 return err; 10678 } 10679 10680 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info) 10681 { 10682 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10683 struct wireless_dev *wdev = info->user_ptr[1]; 10684 u64 cookie; 10685 10686 if (!info->attrs[NL80211_ATTR_COOKIE]) 10687 return -EINVAL; 10688 10689 if (!rdev->ops->mgmt_tx_cancel_wait) 10690 return -EOPNOTSUPP; 10691 10692 switch (wdev->iftype) { 10693 case NL80211_IFTYPE_STATION: 10694 case NL80211_IFTYPE_ADHOC: 10695 case NL80211_IFTYPE_P2P_CLIENT: 10696 case NL80211_IFTYPE_AP: 10697 case NL80211_IFTYPE_AP_VLAN: 10698 case NL80211_IFTYPE_P2P_GO: 10699 case NL80211_IFTYPE_P2P_DEVICE: 10700 break; 10701 case NL80211_IFTYPE_NAN: 10702 default: 10703 return -EOPNOTSUPP; 10704 } 10705 10706 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 10707 10708 return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie); 10709 } 10710 10711 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info) 10712 { 10713 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10714 struct wireless_dev *wdev; 10715 struct net_device *dev = info->user_ptr[1]; 10716 u8 ps_state; 10717 bool state; 10718 int err; 10719 10720 if (!info->attrs[NL80211_ATTR_PS_STATE]) 10721 return -EINVAL; 10722 10723 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); 10724 10725 wdev = dev->ieee80211_ptr; 10726 10727 if (!rdev->ops->set_power_mgmt) 10728 return -EOPNOTSUPP; 10729 10730 state = (ps_state == NL80211_PS_ENABLED) ? true : false; 10731 10732 if (state == wdev->ps) 10733 return 0; 10734 10735 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); 10736 if (!err) 10737 wdev->ps = state; 10738 return err; 10739 } 10740 10741 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info) 10742 { 10743 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10744 enum nl80211_ps_state ps_state; 10745 struct wireless_dev *wdev; 10746 struct net_device *dev = info->user_ptr[1]; 10747 struct sk_buff *msg; 10748 void *hdr; 10749 int err; 10750 10751 wdev = dev->ieee80211_ptr; 10752 10753 if (!rdev->ops->set_power_mgmt) 10754 return -EOPNOTSUPP; 10755 10756 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 10757 if (!msg) 10758 return -ENOMEM; 10759 10760 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 10761 NL80211_CMD_GET_POWER_SAVE); 10762 if (!hdr) { 10763 err = -ENOBUFS; 10764 goto free_msg; 10765 } 10766 10767 if (wdev->ps) 10768 ps_state = NL80211_PS_ENABLED; 10769 else 10770 ps_state = NL80211_PS_DISABLED; 10771 10772 if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state)) 10773 goto nla_put_failure; 10774 10775 genlmsg_end(msg, hdr); 10776 return genlmsg_reply(msg, info); 10777 10778 nla_put_failure: 10779 err = -ENOBUFS; 10780 free_msg: 10781 nlmsg_free(msg); 10782 return err; 10783 } 10784 10785 static const struct nla_policy 10786 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = { 10787 [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_BINARY }, 10788 [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 }, 10789 [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 }, 10790 [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 }, 10791 [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 }, 10792 [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 }, 10793 [NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_S32 }, 10794 }; 10795 10796 static int nl80211_set_cqm_txe(struct genl_info *info, 10797 u32 rate, u32 pkts, u32 intvl) 10798 { 10799 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10800 struct net_device *dev = info->user_ptr[1]; 10801 struct wireless_dev *wdev = dev->ieee80211_ptr; 10802 10803 if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL) 10804 return -EINVAL; 10805 10806 if (!rdev->ops->set_cqm_txe_config) 10807 return -EOPNOTSUPP; 10808 10809 if (wdev->iftype != NL80211_IFTYPE_STATION && 10810 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 10811 return -EOPNOTSUPP; 10812 10813 return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl); 10814 } 10815 10816 static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev, 10817 struct net_device *dev) 10818 { 10819 struct wireless_dev *wdev = dev->ieee80211_ptr; 10820 s32 last, low, high; 10821 u32 hyst; 10822 int i, n, low_index; 10823 int err; 10824 10825 /* RSSI reporting disabled? */ 10826 if (!wdev->cqm_config) 10827 return rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0); 10828 10829 /* 10830 * Obtain current RSSI value if possible, if not and no RSSI threshold 10831 * event has been received yet, we should receive an event after a 10832 * connection is established and enough beacons received to calculate 10833 * the average. 10834 */ 10835 if (!wdev->cqm_config->last_rssi_event_value && wdev->current_bss && 10836 rdev->ops->get_station) { 10837 struct station_info sinfo = {}; 10838 u8 *mac_addr; 10839 10840 mac_addr = wdev->current_bss->pub.bssid; 10841 10842 err = rdev_get_station(rdev, dev, mac_addr, &sinfo); 10843 if (err) 10844 return err; 10845 10846 if (sinfo.filled & BIT_ULL(NL80211_STA_INFO_BEACON_SIGNAL_AVG)) 10847 wdev->cqm_config->last_rssi_event_value = 10848 (s8) sinfo.rx_beacon_signal_avg; 10849 } 10850 10851 last = wdev->cqm_config->last_rssi_event_value; 10852 hyst = wdev->cqm_config->rssi_hyst; 10853 n = wdev->cqm_config->n_rssi_thresholds; 10854 10855 for (i = 0; i < n; i++) { 10856 i = array_index_nospec(i, n); 10857 if (last < wdev->cqm_config->rssi_thresholds[i]) 10858 break; 10859 } 10860 10861 low_index = i - 1; 10862 if (low_index >= 0) { 10863 low_index = array_index_nospec(low_index, n); 10864 low = wdev->cqm_config->rssi_thresholds[low_index] - hyst; 10865 } else { 10866 low = S32_MIN; 10867 } 10868 if (i < n) { 10869 i = array_index_nospec(i, n); 10870 high = wdev->cqm_config->rssi_thresholds[i] + hyst - 1; 10871 } else { 10872 high = S32_MAX; 10873 } 10874 10875 return rdev_set_cqm_rssi_range_config(rdev, dev, low, high); 10876 } 10877 10878 static int nl80211_set_cqm_rssi(struct genl_info *info, 10879 const s32 *thresholds, int n_thresholds, 10880 u32 hysteresis) 10881 { 10882 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10883 struct net_device *dev = info->user_ptr[1]; 10884 struct wireless_dev *wdev = dev->ieee80211_ptr; 10885 int i, err; 10886 s32 prev = S32_MIN; 10887 10888 /* Check all values negative and sorted */ 10889 for (i = 0; i < n_thresholds; i++) { 10890 if (thresholds[i] > 0 || thresholds[i] <= prev) 10891 return -EINVAL; 10892 10893 prev = thresholds[i]; 10894 } 10895 10896 if (wdev->iftype != NL80211_IFTYPE_STATION && 10897 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 10898 return -EOPNOTSUPP; 10899 10900 wdev_lock(wdev); 10901 cfg80211_cqm_config_free(wdev); 10902 wdev_unlock(wdev); 10903 10904 if (n_thresholds <= 1 && rdev->ops->set_cqm_rssi_config) { 10905 if (n_thresholds == 0 || thresholds[0] == 0) /* Disabling */ 10906 return rdev_set_cqm_rssi_config(rdev, dev, 0, 0); 10907 10908 return rdev_set_cqm_rssi_config(rdev, dev, 10909 thresholds[0], hysteresis); 10910 } 10911 10912 if (!wiphy_ext_feature_isset(&rdev->wiphy, 10913 NL80211_EXT_FEATURE_CQM_RSSI_LIST)) 10914 return -EOPNOTSUPP; 10915 10916 if (n_thresholds == 1 && thresholds[0] == 0) /* Disabling */ 10917 n_thresholds = 0; 10918 10919 wdev_lock(wdev); 10920 if (n_thresholds) { 10921 struct cfg80211_cqm_config *cqm_config; 10922 10923 cqm_config = kzalloc(sizeof(struct cfg80211_cqm_config) + 10924 n_thresholds * sizeof(s32), GFP_KERNEL); 10925 if (!cqm_config) { 10926 err = -ENOMEM; 10927 goto unlock; 10928 } 10929 10930 cqm_config->rssi_hyst = hysteresis; 10931 cqm_config->n_rssi_thresholds = n_thresholds; 10932 memcpy(cqm_config->rssi_thresholds, thresholds, 10933 n_thresholds * sizeof(s32)); 10934 10935 wdev->cqm_config = cqm_config; 10936 } 10937 10938 err = cfg80211_cqm_rssi_update(rdev, dev); 10939 10940 unlock: 10941 wdev_unlock(wdev); 10942 10943 return err; 10944 } 10945 10946 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info) 10947 { 10948 struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1]; 10949 struct nlattr *cqm; 10950 int err; 10951 10952 cqm = info->attrs[NL80211_ATTR_CQM]; 10953 if (!cqm) 10954 return -EINVAL; 10955 10956 err = nla_parse_nested_deprecated(attrs, NL80211_ATTR_CQM_MAX, cqm, 10957 nl80211_attr_cqm_policy, 10958 info->extack); 10959 if (err) 10960 return err; 10961 10962 if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] && 10963 attrs[NL80211_ATTR_CQM_RSSI_HYST]) { 10964 const s32 *thresholds = 10965 nla_data(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 10966 int len = nla_len(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 10967 u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]); 10968 10969 if (len % 4) 10970 return -EINVAL; 10971 10972 return nl80211_set_cqm_rssi(info, thresholds, len / 4, 10973 hysteresis); 10974 } 10975 10976 if (attrs[NL80211_ATTR_CQM_TXE_RATE] && 10977 attrs[NL80211_ATTR_CQM_TXE_PKTS] && 10978 attrs[NL80211_ATTR_CQM_TXE_INTVL]) { 10979 u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]); 10980 u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]); 10981 u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]); 10982 10983 return nl80211_set_cqm_txe(info, rate, pkts, intvl); 10984 } 10985 10986 return -EINVAL; 10987 } 10988 10989 static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info) 10990 { 10991 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10992 struct net_device *dev = info->user_ptr[1]; 10993 struct ocb_setup setup = {}; 10994 int err; 10995 10996 err = nl80211_parse_chandef(rdev, info, &setup.chandef); 10997 if (err) 10998 return err; 10999 11000 return cfg80211_join_ocb(rdev, dev, &setup); 11001 } 11002 11003 static int nl80211_leave_ocb(struct sk_buff *skb, struct genl_info *info) 11004 { 11005 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11006 struct net_device *dev = info->user_ptr[1]; 11007 11008 return cfg80211_leave_ocb(rdev, dev); 11009 } 11010 11011 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info) 11012 { 11013 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11014 struct net_device *dev = info->user_ptr[1]; 11015 struct mesh_config cfg; 11016 struct mesh_setup setup; 11017 int err; 11018 11019 /* start with default */ 11020 memcpy(&cfg, &default_mesh_config, sizeof(cfg)); 11021 memcpy(&setup, &default_mesh_setup, sizeof(setup)); 11022 11023 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { 11024 /* and parse parameters if given */ 11025 err = nl80211_parse_mesh_config(info, &cfg, NULL); 11026 if (err) 11027 return err; 11028 } 11029 11030 if (!info->attrs[NL80211_ATTR_MESH_ID] || 11031 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) 11032 return -EINVAL; 11033 11034 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); 11035 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 11036 11037 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 11038 !nl80211_parse_mcast_rate(rdev, setup.mcast_rate, 11039 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 11040 return -EINVAL; 11041 11042 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { 11043 setup.beacon_interval = 11044 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 11045 11046 err = cfg80211_validate_beacon_int(rdev, 11047 NL80211_IFTYPE_MESH_POINT, 11048 setup.beacon_interval); 11049 if (err) 11050 return err; 11051 } 11052 11053 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { 11054 setup.dtim_period = 11055 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 11056 if (setup.dtim_period < 1 || setup.dtim_period > 100) 11057 return -EINVAL; 11058 } 11059 11060 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { 11061 /* parse additional setup parameters if given */ 11062 err = nl80211_parse_mesh_setup(info, &setup); 11063 if (err) 11064 return err; 11065 } 11066 11067 if (setup.user_mpm) 11068 cfg.auto_open_plinks = false; 11069 11070 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 11071 err = nl80211_parse_chandef(rdev, info, &setup.chandef); 11072 if (err) 11073 return err; 11074 } else { 11075 /* __cfg80211_join_mesh() will sort it out */ 11076 setup.chandef.chan = NULL; 11077 } 11078 11079 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 11080 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 11081 int n_rates = 11082 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 11083 struct ieee80211_supported_band *sband; 11084 11085 if (!setup.chandef.chan) 11086 return -EINVAL; 11087 11088 sband = rdev->wiphy.bands[setup.chandef.chan->band]; 11089 11090 err = ieee80211_get_ratemask(sband, rates, n_rates, 11091 &setup.basic_rates); 11092 if (err) 11093 return err; 11094 } 11095 11096 if (info->attrs[NL80211_ATTR_TX_RATES]) { 11097 err = nl80211_parse_tx_bitrate_mask(info, &setup.beacon_rate); 11098 if (err) 11099 return err; 11100 11101 if (!setup.chandef.chan) 11102 return -EINVAL; 11103 11104 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band, 11105 &setup.beacon_rate); 11106 if (err) 11107 return err; 11108 } 11109 11110 setup.userspace_handles_dfs = 11111 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 11112 11113 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 11114 int r = validate_pae_over_nl80211(rdev, info); 11115 11116 if (r < 0) 11117 return r; 11118 11119 setup.control_port_over_nl80211 = true; 11120 } 11121 11122 wdev_lock(dev->ieee80211_ptr); 11123 err = __cfg80211_join_mesh(rdev, dev, &setup, &cfg); 11124 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) 11125 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 11126 wdev_unlock(dev->ieee80211_ptr); 11127 11128 return err; 11129 } 11130 11131 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info) 11132 { 11133 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11134 struct net_device *dev = info->user_ptr[1]; 11135 11136 return cfg80211_leave_mesh(rdev, dev); 11137 } 11138 11139 #ifdef CONFIG_PM 11140 static int nl80211_send_wowlan_patterns(struct sk_buff *msg, 11141 struct cfg80211_registered_device *rdev) 11142 { 11143 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; 11144 struct nlattr *nl_pats, *nl_pat; 11145 int i, pat_len; 11146 11147 if (!wowlan->n_patterns) 11148 return 0; 11149 11150 nl_pats = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN); 11151 if (!nl_pats) 11152 return -ENOBUFS; 11153 11154 for (i = 0; i < wowlan->n_patterns; i++) { 11155 nl_pat = nla_nest_start_noflag(msg, i + 1); 11156 if (!nl_pat) 11157 return -ENOBUFS; 11158 pat_len = wowlan->patterns[i].pattern_len; 11159 if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8), 11160 wowlan->patterns[i].mask) || 11161 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 11162 wowlan->patterns[i].pattern) || 11163 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 11164 wowlan->patterns[i].pkt_offset)) 11165 return -ENOBUFS; 11166 nla_nest_end(msg, nl_pat); 11167 } 11168 nla_nest_end(msg, nl_pats); 11169 11170 return 0; 11171 } 11172 11173 static int nl80211_send_wowlan_tcp(struct sk_buff *msg, 11174 struct cfg80211_wowlan_tcp *tcp) 11175 { 11176 struct nlattr *nl_tcp; 11177 11178 if (!tcp) 11179 return 0; 11180 11181 nl_tcp = nla_nest_start_noflag(msg, 11182 NL80211_WOWLAN_TRIG_TCP_CONNECTION); 11183 if (!nl_tcp) 11184 return -ENOBUFS; 11185 11186 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || 11187 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || 11188 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || 11189 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || 11190 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || 11191 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 11192 tcp->payload_len, tcp->payload) || 11193 nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 11194 tcp->data_interval) || 11195 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 11196 tcp->wake_len, tcp->wake_data) || 11197 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK, 11198 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) 11199 return -ENOBUFS; 11200 11201 if (tcp->payload_seq.len && 11202 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ, 11203 sizeof(tcp->payload_seq), &tcp->payload_seq)) 11204 return -ENOBUFS; 11205 11206 if (tcp->payload_tok.len && 11207 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 11208 sizeof(tcp->payload_tok) + tcp->tokens_size, 11209 &tcp->payload_tok)) 11210 return -ENOBUFS; 11211 11212 nla_nest_end(msg, nl_tcp); 11213 11214 return 0; 11215 } 11216 11217 static int nl80211_send_wowlan_nd(struct sk_buff *msg, 11218 struct cfg80211_sched_scan_request *req) 11219 { 11220 struct nlattr *nd, *freqs, *matches, *match, *scan_plans, *scan_plan; 11221 int i; 11222 11223 if (!req) 11224 return 0; 11225 11226 nd = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_NET_DETECT); 11227 if (!nd) 11228 return -ENOBUFS; 11229 11230 if (req->n_scan_plans == 1 && 11231 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_INTERVAL, 11232 req->scan_plans[0].interval * 1000)) 11233 return -ENOBUFS; 11234 11235 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay)) 11236 return -ENOBUFS; 11237 11238 if (req->relative_rssi_set) { 11239 struct nl80211_bss_select_rssi_adjust rssi_adjust; 11240 11241 if (nla_put_s8(msg, NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI, 11242 req->relative_rssi)) 11243 return -ENOBUFS; 11244 11245 rssi_adjust.band = req->rssi_adjust.band; 11246 rssi_adjust.delta = req->rssi_adjust.delta; 11247 if (nla_put(msg, NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST, 11248 sizeof(rssi_adjust), &rssi_adjust)) 11249 return -ENOBUFS; 11250 } 11251 11252 freqs = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_FREQUENCIES); 11253 if (!freqs) 11254 return -ENOBUFS; 11255 11256 for (i = 0; i < req->n_channels; i++) { 11257 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) 11258 return -ENOBUFS; 11259 } 11260 11261 nla_nest_end(msg, freqs); 11262 11263 if (req->n_match_sets) { 11264 matches = nla_nest_start_noflag(msg, 11265 NL80211_ATTR_SCHED_SCAN_MATCH); 11266 if (!matches) 11267 return -ENOBUFS; 11268 11269 for (i = 0; i < req->n_match_sets; i++) { 11270 match = nla_nest_start_noflag(msg, i); 11271 if (!match) 11272 return -ENOBUFS; 11273 11274 if (nla_put(msg, NL80211_SCHED_SCAN_MATCH_ATTR_SSID, 11275 req->match_sets[i].ssid.ssid_len, 11276 req->match_sets[i].ssid.ssid)) 11277 return -ENOBUFS; 11278 nla_nest_end(msg, match); 11279 } 11280 nla_nest_end(msg, matches); 11281 } 11282 11283 scan_plans = nla_nest_start_noflag(msg, NL80211_ATTR_SCHED_SCAN_PLANS); 11284 if (!scan_plans) 11285 return -ENOBUFS; 11286 11287 for (i = 0; i < req->n_scan_plans; i++) { 11288 scan_plan = nla_nest_start_noflag(msg, i + 1); 11289 if (!scan_plan) 11290 return -ENOBUFS; 11291 11292 if (nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_INTERVAL, 11293 req->scan_plans[i].interval) || 11294 (req->scan_plans[i].iterations && 11295 nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_ITERATIONS, 11296 req->scan_plans[i].iterations))) 11297 return -ENOBUFS; 11298 nla_nest_end(msg, scan_plan); 11299 } 11300 nla_nest_end(msg, scan_plans); 11301 11302 nla_nest_end(msg, nd); 11303 11304 return 0; 11305 } 11306 11307 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info) 11308 { 11309 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11310 struct sk_buff *msg; 11311 void *hdr; 11312 u32 size = NLMSG_DEFAULT_SIZE; 11313 11314 if (!rdev->wiphy.wowlan) 11315 return -EOPNOTSUPP; 11316 11317 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { 11318 /* adjust size to have room for all the data */ 11319 size += rdev->wiphy.wowlan_config->tcp->tokens_size + 11320 rdev->wiphy.wowlan_config->tcp->payload_len + 11321 rdev->wiphy.wowlan_config->tcp->wake_len + 11322 rdev->wiphy.wowlan_config->tcp->wake_len / 8; 11323 } 11324 11325 msg = nlmsg_new(size, GFP_KERNEL); 11326 if (!msg) 11327 return -ENOMEM; 11328 11329 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 11330 NL80211_CMD_GET_WOWLAN); 11331 if (!hdr) 11332 goto nla_put_failure; 11333 11334 if (rdev->wiphy.wowlan_config) { 11335 struct nlattr *nl_wowlan; 11336 11337 nl_wowlan = nla_nest_start_noflag(msg, 11338 NL80211_ATTR_WOWLAN_TRIGGERS); 11339 if (!nl_wowlan) 11340 goto nla_put_failure; 11341 11342 if ((rdev->wiphy.wowlan_config->any && 11343 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 11344 (rdev->wiphy.wowlan_config->disconnect && 11345 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 11346 (rdev->wiphy.wowlan_config->magic_pkt && 11347 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 11348 (rdev->wiphy.wowlan_config->gtk_rekey_failure && 11349 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 11350 (rdev->wiphy.wowlan_config->eap_identity_req && 11351 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 11352 (rdev->wiphy.wowlan_config->four_way_handshake && 11353 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 11354 (rdev->wiphy.wowlan_config->rfkill_release && 11355 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 11356 goto nla_put_failure; 11357 11358 if (nl80211_send_wowlan_patterns(msg, rdev)) 11359 goto nla_put_failure; 11360 11361 if (nl80211_send_wowlan_tcp(msg, 11362 rdev->wiphy.wowlan_config->tcp)) 11363 goto nla_put_failure; 11364 11365 if (nl80211_send_wowlan_nd( 11366 msg, 11367 rdev->wiphy.wowlan_config->nd_config)) 11368 goto nla_put_failure; 11369 11370 nla_nest_end(msg, nl_wowlan); 11371 } 11372 11373 genlmsg_end(msg, hdr); 11374 return genlmsg_reply(msg, info); 11375 11376 nla_put_failure: 11377 nlmsg_free(msg); 11378 return -ENOBUFS; 11379 } 11380 11381 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev, 11382 struct nlattr *attr, 11383 struct cfg80211_wowlan *trig) 11384 { 11385 struct nlattr *tb[NUM_NL80211_WOWLAN_TCP]; 11386 struct cfg80211_wowlan_tcp *cfg; 11387 struct nl80211_wowlan_tcp_data_token *tok = NULL; 11388 struct nl80211_wowlan_tcp_data_seq *seq = NULL; 11389 u32 size; 11390 u32 data_size, wake_size, tokens_size = 0, wake_mask_size; 11391 int err, port; 11392 11393 if (!rdev->wiphy.wowlan->tcp) 11394 return -EINVAL; 11395 11396 err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TCP, attr, 11397 nl80211_wowlan_tcp_policy, NULL); 11398 if (err) 11399 return err; 11400 11401 if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] || 11402 !tb[NL80211_WOWLAN_TCP_DST_IPV4] || 11403 !tb[NL80211_WOWLAN_TCP_DST_MAC] || 11404 !tb[NL80211_WOWLAN_TCP_DST_PORT] || 11405 !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] || 11406 !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] || 11407 !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] || 11408 !tb[NL80211_WOWLAN_TCP_WAKE_MASK]) 11409 return -EINVAL; 11410 11411 data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]); 11412 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) 11413 return -EINVAL; 11414 11415 if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) > 11416 rdev->wiphy.wowlan->tcp->data_interval_max || 11417 nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0) 11418 return -EINVAL; 11419 11420 wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]); 11421 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) 11422 return -EINVAL; 11423 11424 wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]); 11425 if (wake_mask_size != DIV_ROUND_UP(wake_size, 8)) 11426 return -EINVAL; 11427 11428 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) { 11429 u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 11430 11431 tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 11432 tokens_size = tokln - sizeof(*tok); 11433 11434 if (!tok->len || tokens_size % tok->len) 11435 return -EINVAL; 11436 if (!rdev->wiphy.wowlan->tcp->tok) 11437 return -EINVAL; 11438 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) 11439 return -EINVAL; 11440 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) 11441 return -EINVAL; 11442 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) 11443 return -EINVAL; 11444 if (tok->offset + tok->len > data_size) 11445 return -EINVAL; 11446 } 11447 11448 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) { 11449 seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]); 11450 if (!rdev->wiphy.wowlan->tcp->seq) 11451 return -EINVAL; 11452 if (seq->len == 0 || seq->len > 4) 11453 return -EINVAL; 11454 if (seq->len + seq->offset > data_size) 11455 return -EINVAL; 11456 } 11457 11458 size = sizeof(*cfg); 11459 size += data_size; 11460 size += wake_size + wake_mask_size; 11461 size += tokens_size; 11462 11463 cfg = kzalloc(size, GFP_KERNEL); 11464 if (!cfg) 11465 return -ENOMEM; 11466 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); 11467 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]); 11468 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), 11469 ETH_ALEN); 11470 if (tb[NL80211_WOWLAN_TCP_SRC_PORT]) 11471 port = nla_get_u16(tb[NL80211_WOWLAN_TCP_SRC_PORT]); 11472 else 11473 port = 0; 11474 #ifdef CONFIG_INET 11475 /* allocate a socket and port for it and use it */ 11476 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, 11477 IPPROTO_TCP, &cfg->sock, 1); 11478 if (err) { 11479 kfree(cfg); 11480 return err; 11481 } 11482 if (inet_csk_get_port(cfg->sock->sk, port)) { 11483 sock_release(cfg->sock); 11484 kfree(cfg); 11485 return -EADDRINUSE; 11486 } 11487 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; 11488 #else 11489 if (!port) { 11490 kfree(cfg); 11491 return -EINVAL; 11492 } 11493 cfg->src_port = port; 11494 #endif 11495 11496 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); 11497 cfg->payload_len = data_size; 11498 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; 11499 memcpy((void *)cfg->payload, 11500 nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]), 11501 data_size); 11502 if (seq) 11503 cfg->payload_seq = *seq; 11504 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); 11505 cfg->wake_len = wake_size; 11506 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; 11507 memcpy((void *)cfg->wake_data, 11508 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]), 11509 wake_size); 11510 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + 11511 data_size + wake_size; 11512 memcpy((void *)cfg->wake_mask, 11513 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]), 11514 wake_mask_size); 11515 if (tok) { 11516 cfg->tokens_size = tokens_size; 11517 memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size); 11518 } 11519 11520 trig->tcp = cfg; 11521 11522 return 0; 11523 } 11524 11525 static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev, 11526 const struct wiphy_wowlan_support *wowlan, 11527 struct nlattr *attr, 11528 struct cfg80211_wowlan *trig) 11529 { 11530 struct nlattr **tb; 11531 int err; 11532 11533 tb = kcalloc(NUM_NL80211_ATTR, sizeof(*tb), GFP_KERNEL); 11534 if (!tb) 11535 return -ENOMEM; 11536 11537 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) { 11538 err = -EOPNOTSUPP; 11539 goto out; 11540 } 11541 11542 err = nla_parse_nested_deprecated(tb, NL80211_ATTR_MAX, attr, 11543 nl80211_policy, NULL); 11544 if (err) 11545 goto out; 11546 11547 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb, 11548 wowlan->max_nd_match_sets); 11549 err = PTR_ERR_OR_ZERO(trig->nd_config); 11550 if (err) 11551 trig->nd_config = NULL; 11552 11553 out: 11554 kfree(tb); 11555 return err; 11556 } 11557 11558 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info) 11559 { 11560 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11561 struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG]; 11562 struct cfg80211_wowlan new_triggers = {}; 11563 struct cfg80211_wowlan *ntrig; 11564 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; 11565 int err, i; 11566 bool prev_enabled = rdev->wiphy.wowlan_config; 11567 bool regular = false; 11568 11569 if (!wowlan) 11570 return -EOPNOTSUPP; 11571 11572 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { 11573 cfg80211_rdev_free_wowlan(rdev); 11574 rdev->wiphy.wowlan_config = NULL; 11575 goto set_wakeup; 11576 } 11577 11578 err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TRIG, 11579 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS], 11580 nl80211_wowlan_policy, info->extack); 11581 if (err) 11582 return err; 11583 11584 if (tb[NL80211_WOWLAN_TRIG_ANY]) { 11585 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) 11586 return -EINVAL; 11587 new_triggers.any = true; 11588 } 11589 11590 if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) { 11591 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) 11592 return -EINVAL; 11593 new_triggers.disconnect = true; 11594 regular = true; 11595 } 11596 11597 if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) { 11598 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) 11599 return -EINVAL; 11600 new_triggers.magic_pkt = true; 11601 regular = true; 11602 } 11603 11604 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED]) 11605 return -EINVAL; 11606 11607 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) { 11608 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) 11609 return -EINVAL; 11610 new_triggers.gtk_rekey_failure = true; 11611 regular = true; 11612 } 11613 11614 if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) { 11615 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) 11616 return -EINVAL; 11617 new_triggers.eap_identity_req = true; 11618 regular = true; 11619 } 11620 11621 if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) { 11622 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) 11623 return -EINVAL; 11624 new_triggers.four_way_handshake = true; 11625 regular = true; 11626 } 11627 11628 if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) { 11629 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) 11630 return -EINVAL; 11631 new_triggers.rfkill_release = true; 11632 regular = true; 11633 } 11634 11635 if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) { 11636 struct nlattr *pat; 11637 int n_patterns = 0; 11638 int rem, pat_len, mask_len, pkt_offset; 11639 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 11640 11641 regular = true; 11642 11643 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 11644 rem) 11645 n_patterns++; 11646 if (n_patterns > wowlan->n_patterns) 11647 return -EINVAL; 11648 11649 new_triggers.patterns = kcalloc(n_patterns, 11650 sizeof(new_triggers.patterns[0]), 11651 GFP_KERNEL); 11652 if (!new_triggers.patterns) 11653 return -ENOMEM; 11654 11655 new_triggers.n_patterns = n_patterns; 11656 i = 0; 11657 11658 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 11659 rem) { 11660 u8 *mask_pat; 11661 11662 err = nla_parse_nested_deprecated(pat_tb, 11663 MAX_NL80211_PKTPAT, 11664 pat, 11665 nl80211_packet_pattern_policy, 11666 info->extack); 11667 if (err) 11668 goto error; 11669 11670 err = -EINVAL; 11671 if (!pat_tb[NL80211_PKTPAT_MASK] || 11672 !pat_tb[NL80211_PKTPAT_PATTERN]) 11673 goto error; 11674 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 11675 mask_len = DIV_ROUND_UP(pat_len, 8); 11676 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 11677 goto error; 11678 if (pat_len > wowlan->pattern_max_len || 11679 pat_len < wowlan->pattern_min_len) 11680 goto error; 11681 11682 if (!pat_tb[NL80211_PKTPAT_OFFSET]) 11683 pkt_offset = 0; 11684 else 11685 pkt_offset = nla_get_u32( 11686 pat_tb[NL80211_PKTPAT_OFFSET]); 11687 if (pkt_offset > wowlan->max_pkt_offset) 11688 goto error; 11689 new_triggers.patterns[i].pkt_offset = pkt_offset; 11690 11691 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL); 11692 if (!mask_pat) { 11693 err = -ENOMEM; 11694 goto error; 11695 } 11696 new_triggers.patterns[i].mask = mask_pat; 11697 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]), 11698 mask_len); 11699 mask_pat += mask_len; 11700 new_triggers.patterns[i].pattern = mask_pat; 11701 new_triggers.patterns[i].pattern_len = pat_len; 11702 memcpy(mask_pat, 11703 nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 11704 pat_len); 11705 i++; 11706 } 11707 } 11708 11709 if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) { 11710 regular = true; 11711 err = nl80211_parse_wowlan_tcp( 11712 rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION], 11713 &new_triggers); 11714 if (err) 11715 goto error; 11716 } 11717 11718 if (tb[NL80211_WOWLAN_TRIG_NET_DETECT]) { 11719 regular = true; 11720 err = nl80211_parse_wowlan_nd( 11721 rdev, wowlan, tb[NL80211_WOWLAN_TRIG_NET_DETECT], 11722 &new_triggers); 11723 if (err) 11724 goto error; 11725 } 11726 11727 /* The 'any' trigger means the device continues operating more or less 11728 * as in its normal operation mode and wakes up the host on most of the 11729 * normal interrupts (like packet RX, ...) 11730 * It therefore makes little sense to combine with the more constrained 11731 * wakeup trigger modes. 11732 */ 11733 if (new_triggers.any && regular) { 11734 err = -EINVAL; 11735 goto error; 11736 } 11737 11738 ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL); 11739 if (!ntrig) { 11740 err = -ENOMEM; 11741 goto error; 11742 } 11743 cfg80211_rdev_free_wowlan(rdev); 11744 rdev->wiphy.wowlan_config = ntrig; 11745 11746 set_wakeup: 11747 if (rdev->ops->set_wakeup && 11748 prev_enabled != !!rdev->wiphy.wowlan_config) 11749 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); 11750 11751 return 0; 11752 error: 11753 for (i = 0; i < new_triggers.n_patterns; i++) 11754 kfree(new_triggers.patterns[i].mask); 11755 kfree(new_triggers.patterns); 11756 if (new_triggers.tcp && new_triggers.tcp->sock) 11757 sock_release(new_triggers.tcp->sock); 11758 kfree(new_triggers.tcp); 11759 kfree(new_triggers.nd_config); 11760 return err; 11761 } 11762 #endif 11763 11764 static int nl80211_send_coalesce_rules(struct sk_buff *msg, 11765 struct cfg80211_registered_device *rdev) 11766 { 11767 struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules; 11768 int i, j, pat_len; 11769 struct cfg80211_coalesce_rules *rule; 11770 11771 if (!rdev->coalesce->n_rules) 11772 return 0; 11773 11774 nl_rules = nla_nest_start_noflag(msg, NL80211_ATTR_COALESCE_RULE); 11775 if (!nl_rules) 11776 return -ENOBUFS; 11777 11778 for (i = 0; i < rdev->coalesce->n_rules; i++) { 11779 nl_rule = nla_nest_start_noflag(msg, i + 1); 11780 if (!nl_rule) 11781 return -ENOBUFS; 11782 11783 rule = &rdev->coalesce->rules[i]; 11784 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY, 11785 rule->delay)) 11786 return -ENOBUFS; 11787 11788 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION, 11789 rule->condition)) 11790 return -ENOBUFS; 11791 11792 nl_pats = nla_nest_start_noflag(msg, 11793 NL80211_ATTR_COALESCE_RULE_PKT_PATTERN); 11794 if (!nl_pats) 11795 return -ENOBUFS; 11796 11797 for (j = 0; j < rule->n_patterns; j++) { 11798 nl_pat = nla_nest_start_noflag(msg, j + 1); 11799 if (!nl_pat) 11800 return -ENOBUFS; 11801 pat_len = rule->patterns[j].pattern_len; 11802 if (nla_put(msg, NL80211_PKTPAT_MASK, 11803 DIV_ROUND_UP(pat_len, 8), 11804 rule->patterns[j].mask) || 11805 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 11806 rule->patterns[j].pattern) || 11807 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 11808 rule->patterns[j].pkt_offset)) 11809 return -ENOBUFS; 11810 nla_nest_end(msg, nl_pat); 11811 } 11812 nla_nest_end(msg, nl_pats); 11813 nla_nest_end(msg, nl_rule); 11814 } 11815 nla_nest_end(msg, nl_rules); 11816 11817 return 0; 11818 } 11819 11820 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info) 11821 { 11822 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11823 struct sk_buff *msg; 11824 void *hdr; 11825 11826 if (!rdev->wiphy.coalesce) 11827 return -EOPNOTSUPP; 11828 11829 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 11830 if (!msg) 11831 return -ENOMEM; 11832 11833 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 11834 NL80211_CMD_GET_COALESCE); 11835 if (!hdr) 11836 goto nla_put_failure; 11837 11838 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) 11839 goto nla_put_failure; 11840 11841 genlmsg_end(msg, hdr); 11842 return genlmsg_reply(msg, info); 11843 11844 nla_put_failure: 11845 nlmsg_free(msg); 11846 return -ENOBUFS; 11847 } 11848 11849 void cfg80211_rdev_free_coalesce(struct cfg80211_registered_device *rdev) 11850 { 11851 struct cfg80211_coalesce *coalesce = rdev->coalesce; 11852 int i, j; 11853 struct cfg80211_coalesce_rules *rule; 11854 11855 if (!coalesce) 11856 return; 11857 11858 for (i = 0; i < coalesce->n_rules; i++) { 11859 rule = &coalesce->rules[i]; 11860 for (j = 0; j < rule->n_patterns; j++) 11861 kfree(rule->patterns[j].mask); 11862 kfree(rule->patterns); 11863 } 11864 kfree(coalesce->rules); 11865 kfree(coalesce); 11866 rdev->coalesce = NULL; 11867 } 11868 11869 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev, 11870 struct nlattr *rule, 11871 struct cfg80211_coalesce_rules *new_rule) 11872 { 11873 int err, i; 11874 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 11875 struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat; 11876 int rem, pat_len, mask_len, pkt_offset, n_patterns = 0; 11877 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 11878 11879 err = nla_parse_nested_deprecated(tb, NL80211_ATTR_COALESCE_RULE_MAX, 11880 rule, nl80211_coalesce_policy, NULL); 11881 if (err) 11882 return err; 11883 11884 if (tb[NL80211_ATTR_COALESCE_RULE_DELAY]) 11885 new_rule->delay = 11886 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]); 11887 if (new_rule->delay > coalesce->max_delay) 11888 return -EINVAL; 11889 11890 if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION]) 11891 new_rule->condition = 11892 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]); 11893 11894 if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN]) 11895 return -EINVAL; 11896 11897 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 11898 rem) 11899 n_patterns++; 11900 if (n_patterns > coalesce->n_patterns) 11901 return -EINVAL; 11902 11903 new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]), 11904 GFP_KERNEL); 11905 if (!new_rule->patterns) 11906 return -ENOMEM; 11907 11908 new_rule->n_patterns = n_patterns; 11909 i = 0; 11910 11911 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 11912 rem) { 11913 u8 *mask_pat; 11914 11915 err = nla_parse_nested_deprecated(pat_tb, MAX_NL80211_PKTPAT, 11916 pat, 11917 nl80211_packet_pattern_policy, 11918 NULL); 11919 if (err) 11920 return err; 11921 11922 if (!pat_tb[NL80211_PKTPAT_MASK] || 11923 !pat_tb[NL80211_PKTPAT_PATTERN]) 11924 return -EINVAL; 11925 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 11926 mask_len = DIV_ROUND_UP(pat_len, 8); 11927 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 11928 return -EINVAL; 11929 if (pat_len > coalesce->pattern_max_len || 11930 pat_len < coalesce->pattern_min_len) 11931 return -EINVAL; 11932 11933 if (!pat_tb[NL80211_PKTPAT_OFFSET]) 11934 pkt_offset = 0; 11935 else 11936 pkt_offset = nla_get_u32(pat_tb[NL80211_PKTPAT_OFFSET]); 11937 if (pkt_offset > coalesce->max_pkt_offset) 11938 return -EINVAL; 11939 new_rule->patterns[i].pkt_offset = pkt_offset; 11940 11941 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL); 11942 if (!mask_pat) 11943 return -ENOMEM; 11944 11945 new_rule->patterns[i].mask = mask_pat; 11946 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]), 11947 mask_len); 11948 11949 mask_pat += mask_len; 11950 new_rule->patterns[i].pattern = mask_pat; 11951 new_rule->patterns[i].pattern_len = pat_len; 11952 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 11953 pat_len); 11954 i++; 11955 } 11956 11957 return 0; 11958 } 11959 11960 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info) 11961 { 11962 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11963 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 11964 struct cfg80211_coalesce new_coalesce = {}; 11965 struct cfg80211_coalesce *n_coalesce; 11966 int err, rem_rule, n_rules = 0, i, j; 11967 struct nlattr *rule; 11968 struct cfg80211_coalesce_rules *tmp_rule; 11969 11970 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) 11971 return -EOPNOTSUPP; 11972 11973 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { 11974 cfg80211_rdev_free_coalesce(rdev); 11975 rdev_set_coalesce(rdev, NULL); 11976 return 0; 11977 } 11978 11979 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 11980 rem_rule) 11981 n_rules++; 11982 if (n_rules > coalesce->n_rules) 11983 return -EINVAL; 11984 11985 new_coalesce.rules = kcalloc(n_rules, sizeof(new_coalesce.rules[0]), 11986 GFP_KERNEL); 11987 if (!new_coalesce.rules) 11988 return -ENOMEM; 11989 11990 new_coalesce.n_rules = n_rules; 11991 i = 0; 11992 11993 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 11994 rem_rule) { 11995 err = nl80211_parse_coalesce_rule(rdev, rule, 11996 &new_coalesce.rules[i]); 11997 if (err) 11998 goto error; 11999 12000 i++; 12001 } 12002 12003 err = rdev_set_coalesce(rdev, &new_coalesce); 12004 if (err) 12005 goto error; 12006 12007 n_coalesce = kmemdup(&new_coalesce, sizeof(new_coalesce), GFP_KERNEL); 12008 if (!n_coalesce) { 12009 err = -ENOMEM; 12010 goto error; 12011 } 12012 cfg80211_rdev_free_coalesce(rdev); 12013 rdev->coalesce = n_coalesce; 12014 12015 return 0; 12016 error: 12017 for (i = 0; i < new_coalesce.n_rules; i++) { 12018 tmp_rule = &new_coalesce.rules[i]; 12019 for (j = 0; j < tmp_rule->n_patterns; j++) 12020 kfree(tmp_rule->patterns[j].mask); 12021 kfree(tmp_rule->patterns); 12022 } 12023 kfree(new_coalesce.rules); 12024 12025 return err; 12026 } 12027 12028 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info) 12029 { 12030 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12031 struct net_device *dev = info->user_ptr[1]; 12032 struct wireless_dev *wdev = dev->ieee80211_ptr; 12033 struct nlattr *tb[NUM_NL80211_REKEY_DATA]; 12034 struct cfg80211_gtk_rekey_data rekey_data; 12035 int err; 12036 12037 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) 12038 return -EINVAL; 12039 12040 err = nla_parse_nested_deprecated(tb, MAX_NL80211_REKEY_DATA, 12041 info->attrs[NL80211_ATTR_REKEY_DATA], 12042 nl80211_rekey_policy, info->extack); 12043 if (err) 12044 return err; 12045 12046 if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] || 12047 !tb[NL80211_REKEY_DATA_KCK]) 12048 return -EINVAL; 12049 if (nla_len(tb[NL80211_REKEY_DATA_REPLAY_CTR]) != NL80211_REPLAY_CTR_LEN) 12050 return -ERANGE; 12051 if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN) 12052 return -ERANGE; 12053 if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN) 12054 return -ERANGE; 12055 12056 rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]); 12057 rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]); 12058 rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]); 12059 12060 wdev_lock(wdev); 12061 if (!wdev->current_bss) { 12062 err = -ENOTCONN; 12063 goto out; 12064 } 12065 12066 if (!rdev->ops->set_rekey_data) { 12067 err = -EOPNOTSUPP; 12068 goto out; 12069 } 12070 12071 err = rdev_set_rekey_data(rdev, dev, &rekey_data); 12072 out: 12073 wdev_unlock(wdev); 12074 return err; 12075 } 12076 12077 static int nl80211_register_unexpected_frame(struct sk_buff *skb, 12078 struct genl_info *info) 12079 { 12080 struct net_device *dev = info->user_ptr[1]; 12081 struct wireless_dev *wdev = dev->ieee80211_ptr; 12082 12083 if (wdev->iftype != NL80211_IFTYPE_AP && 12084 wdev->iftype != NL80211_IFTYPE_P2P_GO) 12085 return -EINVAL; 12086 12087 if (wdev->ap_unexpected_nlportid) 12088 return -EBUSY; 12089 12090 wdev->ap_unexpected_nlportid = info->snd_portid; 12091 return 0; 12092 } 12093 12094 static int nl80211_probe_client(struct sk_buff *skb, 12095 struct genl_info *info) 12096 { 12097 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12098 struct net_device *dev = info->user_ptr[1]; 12099 struct wireless_dev *wdev = dev->ieee80211_ptr; 12100 struct sk_buff *msg; 12101 void *hdr; 12102 const u8 *addr; 12103 u64 cookie; 12104 int err; 12105 12106 if (wdev->iftype != NL80211_IFTYPE_AP && 12107 wdev->iftype != NL80211_IFTYPE_P2P_GO) 12108 return -EOPNOTSUPP; 12109 12110 if (!info->attrs[NL80211_ATTR_MAC]) 12111 return -EINVAL; 12112 12113 if (!rdev->ops->probe_client) 12114 return -EOPNOTSUPP; 12115 12116 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 12117 if (!msg) 12118 return -ENOMEM; 12119 12120 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 12121 NL80211_CMD_PROBE_CLIENT); 12122 if (!hdr) { 12123 err = -ENOBUFS; 12124 goto free_msg; 12125 } 12126 12127 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 12128 12129 err = rdev_probe_client(rdev, dev, addr, &cookie); 12130 if (err) 12131 goto free_msg; 12132 12133 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 12134 NL80211_ATTR_PAD)) 12135 goto nla_put_failure; 12136 12137 genlmsg_end(msg, hdr); 12138 12139 return genlmsg_reply(msg, info); 12140 12141 nla_put_failure: 12142 err = -ENOBUFS; 12143 free_msg: 12144 nlmsg_free(msg); 12145 return err; 12146 } 12147 12148 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info) 12149 { 12150 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12151 struct cfg80211_beacon_registration *reg, *nreg; 12152 int rv; 12153 12154 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) 12155 return -EOPNOTSUPP; 12156 12157 nreg = kzalloc(sizeof(*nreg), GFP_KERNEL); 12158 if (!nreg) 12159 return -ENOMEM; 12160 12161 /* First, check if already registered. */ 12162 spin_lock_bh(&rdev->beacon_registrations_lock); 12163 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 12164 if (reg->nlportid == info->snd_portid) { 12165 rv = -EALREADY; 12166 goto out_err; 12167 } 12168 } 12169 /* Add it to the list */ 12170 nreg->nlportid = info->snd_portid; 12171 list_add(&nreg->list, &rdev->beacon_registrations); 12172 12173 spin_unlock_bh(&rdev->beacon_registrations_lock); 12174 12175 return 0; 12176 out_err: 12177 spin_unlock_bh(&rdev->beacon_registrations_lock); 12178 kfree(nreg); 12179 return rv; 12180 } 12181 12182 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info) 12183 { 12184 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12185 struct wireless_dev *wdev = info->user_ptr[1]; 12186 int err; 12187 12188 if (!rdev->ops->start_p2p_device) 12189 return -EOPNOTSUPP; 12190 12191 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 12192 return -EOPNOTSUPP; 12193 12194 if (wdev_running(wdev)) 12195 return 0; 12196 12197 if (rfkill_blocked(rdev->rfkill)) 12198 return -ERFKILL; 12199 12200 err = rdev_start_p2p_device(rdev, wdev); 12201 if (err) 12202 return err; 12203 12204 wdev->is_running = true; 12205 rdev->opencount++; 12206 12207 return 0; 12208 } 12209 12210 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info) 12211 { 12212 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12213 struct wireless_dev *wdev = info->user_ptr[1]; 12214 12215 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 12216 return -EOPNOTSUPP; 12217 12218 if (!rdev->ops->stop_p2p_device) 12219 return -EOPNOTSUPP; 12220 12221 cfg80211_stop_p2p_device(rdev, wdev); 12222 12223 return 0; 12224 } 12225 12226 static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info) 12227 { 12228 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12229 struct wireless_dev *wdev = info->user_ptr[1]; 12230 struct cfg80211_nan_conf conf = {}; 12231 int err; 12232 12233 if (wdev->iftype != NL80211_IFTYPE_NAN) 12234 return -EOPNOTSUPP; 12235 12236 if (wdev_running(wdev)) 12237 return -EEXIST; 12238 12239 if (rfkill_blocked(rdev->rfkill)) 12240 return -ERFKILL; 12241 12242 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) 12243 return -EINVAL; 12244 12245 conf.master_pref = 12246 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); 12247 12248 if (info->attrs[NL80211_ATTR_BANDS]) { 12249 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); 12250 12251 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) 12252 return -EOPNOTSUPP; 12253 12254 if (bands && !(bands & BIT(NL80211_BAND_2GHZ))) 12255 return -EINVAL; 12256 12257 conf.bands = bands; 12258 } 12259 12260 err = rdev_start_nan(rdev, wdev, &conf); 12261 if (err) 12262 return err; 12263 12264 wdev->is_running = true; 12265 rdev->opencount++; 12266 12267 return 0; 12268 } 12269 12270 static int nl80211_stop_nan(struct sk_buff *skb, struct genl_info *info) 12271 { 12272 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12273 struct wireless_dev *wdev = info->user_ptr[1]; 12274 12275 if (wdev->iftype != NL80211_IFTYPE_NAN) 12276 return -EOPNOTSUPP; 12277 12278 cfg80211_stop_nan(rdev, wdev); 12279 12280 return 0; 12281 } 12282 12283 static int validate_nan_filter(struct nlattr *filter_attr) 12284 { 12285 struct nlattr *attr; 12286 int len = 0, n_entries = 0, rem; 12287 12288 nla_for_each_nested(attr, filter_attr, rem) { 12289 len += nla_len(attr); 12290 n_entries++; 12291 } 12292 12293 if (len >= U8_MAX) 12294 return -EINVAL; 12295 12296 return n_entries; 12297 } 12298 12299 static int handle_nan_filter(struct nlattr *attr_filter, 12300 struct cfg80211_nan_func *func, 12301 bool tx) 12302 { 12303 struct nlattr *attr; 12304 int n_entries, rem, i; 12305 struct cfg80211_nan_func_filter *filter; 12306 12307 n_entries = validate_nan_filter(attr_filter); 12308 if (n_entries < 0) 12309 return n_entries; 12310 12311 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters)); 12312 12313 filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL); 12314 if (!filter) 12315 return -ENOMEM; 12316 12317 i = 0; 12318 nla_for_each_nested(attr, attr_filter, rem) { 12319 filter[i].filter = nla_memdup(attr, GFP_KERNEL); 12320 filter[i].len = nla_len(attr); 12321 i++; 12322 } 12323 if (tx) { 12324 func->num_tx_filters = n_entries; 12325 func->tx_filters = filter; 12326 } else { 12327 func->num_rx_filters = n_entries; 12328 func->rx_filters = filter; 12329 } 12330 12331 return 0; 12332 } 12333 12334 static int nl80211_nan_add_func(struct sk_buff *skb, 12335 struct genl_info *info) 12336 { 12337 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12338 struct wireless_dev *wdev = info->user_ptr[1]; 12339 struct nlattr *tb[NUM_NL80211_NAN_FUNC_ATTR], *func_attr; 12340 struct cfg80211_nan_func *func; 12341 struct sk_buff *msg = NULL; 12342 void *hdr = NULL; 12343 int err = 0; 12344 12345 if (wdev->iftype != NL80211_IFTYPE_NAN) 12346 return -EOPNOTSUPP; 12347 12348 if (!wdev_running(wdev)) 12349 return -ENOTCONN; 12350 12351 if (!info->attrs[NL80211_ATTR_NAN_FUNC]) 12352 return -EINVAL; 12353 12354 err = nla_parse_nested_deprecated(tb, NL80211_NAN_FUNC_ATTR_MAX, 12355 info->attrs[NL80211_ATTR_NAN_FUNC], 12356 nl80211_nan_func_policy, 12357 info->extack); 12358 if (err) 12359 return err; 12360 12361 func = kzalloc(sizeof(*func), GFP_KERNEL); 12362 if (!func) 12363 return -ENOMEM; 12364 12365 func->cookie = cfg80211_assign_cookie(rdev); 12366 12367 if (!tb[NL80211_NAN_FUNC_TYPE] || 12368 nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]) > NL80211_NAN_FUNC_MAX_TYPE) { 12369 err = -EINVAL; 12370 goto out; 12371 } 12372 12373 12374 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]); 12375 12376 if (!tb[NL80211_NAN_FUNC_SERVICE_ID]) { 12377 err = -EINVAL; 12378 goto out; 12379 } 12380 12381 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]), 12382 sizeof(func->service_id)); 12383 12384 func->close_range = 12385 nla_get_flag(tb[NL80211_NAN_FUNC_CLOSE_RANGE]); 12386 12387 if (tb[NL80211_NAN_FUNC_SERVICE_INFO]) { 12388 func->serv_spec_info_len = 12389 nla_len(tb[NL80211_NAN_FUNC_SERVICE_INFO]); 12390 func->serv_spec_info = 12391 kmemdup(nla_data(tb[NL80211_NAN_FUNC_SERVICE_INFO]), 12392 func->serv_spec_info_len, 12393 GFP_KERNEL); 12394 if (!func->serv_spec_info) { 12395 err = -ENOMEM; 12396 goto out; 12397 } 12398 } 12399 12400 if (tb[NL80211_NAN_FUNC_TTL]) 12401 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]); 12402 12403 switch (func->type) { 12404 case NL80211_NAN_FUNC_PUBLISH: 12405 if (!tb[NL80211_NAN_FUNC_PUBLISH_TYPE]) { 12406 err = -EINVAL; 12407 goto out; 12408 } 12409 12410 func->publish_type = 12411 nla_get_u8(tb[NL80211_NAN_FUNC_PUBLISH_TYPE]); 12412 func->publish_bcast = 12413 nla_get_flag(tb[NL80211_NAN_FUNC_PUBLISH_BCAST]); 12414 12415 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) && 12416 func->publish_bcast) { 12417 err = -EINVAL; 12418 goto out; 12419 } 12420 break; 12421 case NL80211_NAN_FUNC_SUBSCRIBE: 12422 func->subscribe_active = 12423 nla_get_flag(tb[NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE]); 12424 break; 12425 case NL80211_NAN_FUNC_FOLLOW_UP: 12426 if (!tb[NL80211_NAN_FUNC_FOLLOW_UP_ID] || 12427 !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] || 12428 !tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]) { 12429 err = -EINVAL; 12430 goto out; 12431 } 12432 12433 func->followup_id = 12434 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_ID]); 12435 func->followup_reqid = 12436 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]); 12437 memcpy(func->followup_dest.addr, 12438 nla_data(tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]), 12439 sizeof(func->followup_dest.addr)); 12440 if (func->ttl) { 12441 err = -EINVAL; 12442 goto out; 12443 } 12444 break; 12445 default: 12446 err = -EINVAL; 12447 goto out; 12448 } 12449 12450 if (tb[NL80211_NAN_FUNC_SRF]) { 12451 struct nlattr *srf_tb[NUM_NL80211_NAN_SRF_ATTR]; 12452 12453 err = nla_parse_nested_deprecated(srf_tb, 12454 NL80211_NAN_SRF_ATTR_MAX, 12455 tb[NL80211_NAN_FUNC_SRF], 12456 nl80211_nan_srf_policy, 12457 info->extack); 12458 if (err) 12459 goto out; 12460 12461 func->srf_include = 12462 nla_get_flag(srf_tb[NL80211_NAN_SRF_INCLUDE]); 12463 12464 if (srf_tb[NL80211_NAN_SRF_BF]) { 12465 if (srf_tb[NL80211_NAN_SRF_MAC_ADDRS] || 12466 !srf_tb[NL80211_NAN_SRF_BF_IDX]) { 12467 err = -EINVAL; 12468 goto out; 12469 } 12470 12471 func->srf_bf_len = 12472 nla_len(srf_tb[NL80211_NAN_SRF_BF]); 12473 func->srf_bf = 12474 kmemdup(nla_data(srf_tb[NL80211_NAN_SRF_BF]), 12475 func->srf_bf_len, GFP_KERNEL); 12476 if (!func->srf_bf) { 12477 err = -ENOMEM; 12478 goto out; 12479 } 12480 12481 func->srf_bf_idx = 12482 nla_get_u8(srf_tb[NL80211_NAN_SRF_BF_IDX]); 12483 } else { 12484 struct nlattr *attr, *mac_attr = 12485 srf_tb[NL80211_NAN_SRF_MAC_ADDRS]; 12486 int n_entries, rem, i = 0; 12487 12488 if (!mac_attr) { 12489 err = -EINVAL; 12490 goto out; 12491 } 12492 12493 n_entries = validate_acl_mac_addrs(mac_attr); 12494 if (n_entries <= 0) { 12495 err = -EINVAL; 12496 goto out; 12497 } 12498 12499 func->srf_num_macs = n_entries; 12500 func->srf_macs = 12501 kcalloc(n_entries, sizeof(*func->srf_macs), 12502 GFP_KERNEL); 12503 if (!func->srf_macs) { 12504 err = -ENOMEM; 12505 goto out; 12506 } 12507 12508 nla_for_each_nested(attr, mac_attr, rem) 12509 memcpy(func->srf_macs[i++].addr, nla_data(attr), 12510 sizeof(*func->srf_macs)); 12511 } 12512 } 12513 12514 if (tb[NL80211_NAN_FUNC_TX_MATCH_FILTER]) { 12515 err = handle_nan_filter(tb[NL80211_NAN_FUNC_TX_MATCH_FILTER], 12516 func, true); 12517 if (err) 12518 goto out; 12519 } 12520 12521 if (tb[NL80211_NAN_FUNC_RX_MATCH_FILTER]) { 12522 err = handle_nan_filter(tb[NL80211_NAN_FUNC_RX_MATCH_FILTER], 12523 func, false); 12524 if (err) 12525 goto out; 12526 } 12527 12528 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 12529 if (!msg) { 12530 err = -ENOMEM; 12531 goto out; 12532 } 12533 12534 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 12535 NL80211_CMD_ADD_NAN_FUNCTION); 12536 /* This can't really happen - we just allocated 4KB */ 12537 if (WARN_ON(!hdr)) { 12538 err = -ENOMEM; 12539 goto out; 12540 } 12541 12542 err = rdev_add_nan_func(rdev, wdev, func); 12543 out: 12544 if (err < 0) { 12545 cfg80211_free_nan_func(func); 12546 nlmsg_free(msg); 12547 return err; 12548 } 12549 12550 /* propagate the instance id and cookie to userspace */ 12551 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie, 12552 NL80211_ATTR_PAD)) 12553 goto nla_put_failure; 12554 12555 func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC); 12556 if (!func_attr) 12557 goto nla_put_failure; 12558 12559 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, 12560 func->instance_id)) 12561 goto nla_put_failure; 12562 12563 nla_nest_end(msg, func_attr); 12564 12565 genlmsg_end(msg, hdr); 12566 return genlmsg_reply(msg, info); 12567 12568 nla_put_failure: 12569 nlmsg_free(msg); 12570 return -ENOBUFS; 12571 } 12572 12573 static int nl80211_nan_del_func(struct sk_buff *skb, 12574 struct genl_info *info) 12575 { 12576 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12577 struct wireless_dev *wdev = info->user_ptr[1]; 12578 u64 cookie; 12579 12580 if (wdev->iftype != NL80211_IFTYPE_NAN) 12581 return -EOPNOTSUPP; 12582 12583 if (!wdev_running(wdev)) 12584 return -ENOTCONN; 12585 12586 if (!info->attrs[NL80211_ATTR_COOKIE]) 12587 return -EINVAL; 12588 12589 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 12590 12591 rdev_del_nan_func(rdev, wdev, cookie); 12592 12593 return 0; 12594 } 12595 12596 static int nl80211_nan_change_config(struct sk_buff *skb, 12597 struct genl_info *info) 12598 { 12599 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12600 struct wireless_dev *wdev = info->user_ptr[1]; 12601 struct cfg80211_nan_conf conf = {}; 12602 u32 changed = 0; 12603 12604 if (wdev->iftype != NL80211_IFTYPE_NAN) 12605 return -EOPNOTSUPP; 12606 12607 if (!wdev_running(wdev)) 12608 return -ENOTCONN; 12609 12610 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { 12611 conf.master_pref = 12612 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); 12613 if (conf.master_pref <= 1 || conf.master_pref == 255) 12614 return -EINVAL; 12615 12616 changed |= CFG80211_NAN_CONF_CHANGED_PREF; 12617 } 12618 12619 if (info->attrs[NL80211_ATTR_BANDS]) { 12620 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); 12621 12622 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) 12623 return -EOPNOTSUPP; 12624 12625 if (bands && !(bands & BIT(NL80211_BAND_2GHZ))) 12626 return -EINVAL; 12627 12628 conf.bands = bands; 12629 changed |= CFG80211_NAN_CONF_CHANGED_BANDS; 12630 } 12631 12632 if (!changed) 12633 return -EINVAL; 12634 12635 return rdev_nan_change_conf(rdev, wdev, &conf, changed); 12636 } 12637 12638 void cfg80211_nan_match(struct wireless_dev *wdev, 12639 struct cfg80211_nan_match_params *match, gfp_t gfp) 12640 { 12641 struct wiphy *wiphy = wdev->wiphy; 12642 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 12643 struct nlattr *match_attr, *local_func_attr, *peer_func_attr; 12644 struct sk_buff *msg; 12645 void *hdr; 12646 12647 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr)) 12648 return; 12649 12650 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 12651 if (!msg) 12652 return; 12653 12654 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_MATCH); 12655 if (!hdr) { 12656 nlmsg_free(msg); 12657 return; 12658 } 12659 12660 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 12661 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 12662 wdev->netdev->ifindex)) || 12663 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 12664 NL80211_ATTR_PAD)) 12665 goto nla_put_failure; 12666 12667 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie, 12668 NL80211_ATTR_PAD) || 12669 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr)) 12670 goto nla_put_failure; 12671 12672 match_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_MATCH); 12673 if (!match_attr) 12674 goto nla_put_failure; 12675 12676 local_func_attr = nla_nest_start_noflag(msg, 12677 NL80211_NAN_MATCH_FUNC_LOCAL); 12678 if (!local_func_attr) 12679 goto nla_put_failure; 12680 12681 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id)) 12682 goto nla_put_failure; 12683 12684 nla_nest_end(msg, local_func_attr); 12685 12686 peer_func_attr = nla_nest_start_noflag(msg, 12687 NL80211_NAN_MATCH_FUNC_PEER); 12688 if (!peer_func_attr) 12689 goto nla_put_failure; 12690 12691 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) || 12692 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id)) 12693 goto nla_put_failure; 12694 12695 if (match->info && match->info_len && 12696 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len, 12697 match->info)) 12698 goto nla_put_failure; 12699 12700 nla_nest_end(msg, peer_func_attr); 12701 nla_nest_end(msg, match_attr); 12702 genlmsg_end(msg, hdr); 12703 12704 if (!wdev->owner_nlportid) 12705 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 12706 msg, 0, NL80211_MCGRP_NAN, gfp); 12707 else 12708 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 12709 wdev->owner_nlportid); 12710 12711 return; 12712 12713 nla_put_failure: 12714 nlmsg_free(msg); 12715 } 12716 EXPORT_SYMBOL(cfg80211_nan_match); 12717 12718 void cfg80211_nan_func_terminated(struct wireless_dev *wdev, 12719 u8 inst_id, 12720 enum nl80211_nan_func_term_reason reason, 12721 u64 cookie, gfp_t gfp) 12722 { 12723 struct wiphy *wiphy = wdev->wiphy; 12724 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 12725 struct sk_buff *msg; 12726 struct nlattr *func_attr; 12727 void *hdr; 12728 12729 if (WARN_ON(!inst_id)) 12730 return; 12731 12732 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 12733 if (!msg) 12734 return; 12735 12736 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_NAN_FUNCTION); 12737 if (!hdr) { 12738 nlmsg_free(msg); 12739 return; 12740 } 12741 12742 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 12743 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 12744 wdev->netdev->ifindex)) || 12745 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 12746 NL80211_ATTR_PAD)) 12747 goto nla_put_failure; 12748 12749 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 12750 NL80211_ATTR_PAD)) 12751 goto nla_put_failure; 12752 12753 func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC); 12754 if (!func_attr) 12755 goto nla_put_failure; 12756 12757 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, inst_id) || 12758 nla_put_u8(msg, NL80211_NAN_FUNC_TERM_REASON, reason)) 12759 goto nla_put_failure; 12760 12761 nla_nest_end(msg, func_attr); 12762 genlmsg_end(msg, hdr); 12763 12764 if (!wdev->owner_nlportid) 12765 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 12766 msg, 0, NL80211_MCGRP_NAN, gfp); 12767 else 12768 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 12769 wdev->owner_nlportid); 12770 12771 return; 12772 12773 nla_put_failure: 12774 nlmsg_free(msg); 12775 } 12776 EXPORT_SYMBOL(cfg80211_nan_func_terminated); 12777 12778 static int nl80211_get_protocol_features(struct sk_buff *skb, 12779 struct genl_info *info) 12780 { 12781 void *hdr; 12782 struct sk_buff *msg; 12783 12784 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 12785 if (!msg) 12786 return -ENOMEM; 12787 12788 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 12789 NL80211_CMD_GET_PROTOCOL_FEATURES); 12790 if (!hdr) 12791 goto nla_put_failure; 12792 12793 if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES, 12794 NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP)) 12795 goto nla_put_failure; 12796 12797 genlmsg_end(msg, hdr); 12798 return genlmsg_reply(msg, info); 12799 12800 nla_put_failure: 12801 kfree_skb(msg); 12802 return -ENOBUFS; 12803 } 12804 12805 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info) 12806 { 12807 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12808 struct cfg80211_update_ft_ies_params ft_params; 12809 struct net_device *dev = info->user_ptr[1]; 12810 12811 if (!rdev->ops->update_ft_ies) 12812 return -EOPNOTSUPP; 12813 12814 if (!info->attrs[NL80211_ATTR_MDID] || 12815 !info->attrs[NL80211_ATTR_IE]) 12816 return -EINVAL; 12817 12818 memset(&ft_params, 0, sizeof(ft_params)); 12819 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); 12820 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 12821 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 12822 12823 return rdev_update_ft_ies(rdev, dev, &ft_params); 12824 } 12825 12826 static int nl80211_crit_protocol_start(struct sk_buff *skb, 12827 struct genl_info *info) 12828 { 12829 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12830 struct wireless_dev *wdev = info->user_ptr[1]; 12831 enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC; 12832 u16 duration; 12833 int ret; 12834 12835 if (!rdev->ops->crit_proto_start) 12836 return -EOPNOTSUPP; 12837 12838 if (WARN_ON(!rdev->ops->crit_proto_stop)) 12839 return -EINVAL; 12840 12841 if (rdev->crit_proto_nlportid) 12842 return -EBUSY; 12843 12844 /* determine protocol if provided */ 12845 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) 12846 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); 12847 12848 if (proto >= NUM_NL80211_CRIT_PROTO) 12849 return -EINVAL; 12850 12851 /* timeout must be provided */ 12852 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) 12853 return -EINVAL; 12854 12855 duration = 12856 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); 12857 12858 if (duration > NL80211_CRIT_PROTO_MAX_DURATION) 12859 return -ERANGE; 12860 12861 ret = rdev_crit_proto_start(rdev, wdev, proto, duration); 12862 if (!ret) 12863 rdev->crit_proto_nlportid = info->snd_portid; 12864 12865 return ret; 12866 } 12867 12868 static int nl80211_crit_protocol_stop(struct sk_buff *skb, 12869 struct genl_info *info) 12870 { 12871 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12872 struct wireless_dev *wdev = info->user_ptr[1]; 12873 12874 if (!rdev->ops->crit_proto_stop) 12875 return -EOPNOTSUPP; 12876 12877 if (rdev->crit_proto_nlportid) { 12878 rdev->crit_proto_nlportid = 0; 12879 rdev_crit_proto_stop(rdev, wdev); 12880 } 12881 return 0; 12882 } 12883 12884 static int nl80211_vendor_check_policy(const struct wiphy_vendor_command *vcmd, 12885 struct nlattr *attr, 12886 struct netlink_ext_ack *extack) 12887 { 12888 if (vcmd->policy == VENDOR_CMD_RAW_DATA) { 12889 if (attr->nla_type & NLA_F_NESTED) { 12890 NL_SET_ERR_MSG_ATTR(extack, attr, 12891 "unexpected nested data"); 12892 return -EINVAL; 12893 } 12894 12895 return 0; 12896 } 12897 12898 if (!(attr->nla_type & NLA_F_NESTED)) { 12899 NL_SET_ERR_MSG_ATTR(extack, attr, "expected nested data"); 12900 return -EINVAL; 12901 } 12902 12903 return nl80211_validate_nested(attr, vcmd->maxattr, vcmd->policy, 12904 extack); 12905 } 12906 12907 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info) 12908 { 12909 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12910 struct wireless_dev *wdev = 12911 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs); 12912 int i, err; 12913 u32 vid, subcmd; 12914 12915 if (!rdev->wiphy.vendor_commands) 12916 return -EOPNOTSUPP; 12917 12918 if (IS_ERR(wdev)) { 12919 err = PTR_ERR(wdev); 12920 if (err != -EINVAL) 12921 return err; 12922 wdev = NULL; 12923 } else if (wdev->wiphy != &rdev->wiphy) { 12924 return -EINVAL; 12925 } 12926 12927 if (!info->attrs[NL80211_ATTR_VENDOR_ID] || 12928 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD]) 12929 return -EINVAL; 12930 12931 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]); 12932 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]); 12933 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { 12934 const struct wiphy_vendor_command *vcmd; 12935 void *data = NULL; 12936 int len = 0; 12937 12938 vcmd = &rdev->wiphy.vendor_commands[i]; 12939 12940 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) 12941 continue; 12942 12943 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | 12944 WIPHY_VENDOR_CMD_NEED_NETDEV)) { 12945 if (!wdev) 12946 return -EINVAL; 12947 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && 12948 !wdev->netdev) 12949 return -EINVAL; 12950 12951 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { 12952 if (!wdev_running(wdev)) 12953 return -ENETDOWN; 12954 } 12955 12956 if (!vcmd->doit) 12957 return -EOPNOTSUPP; 12958 } else { 12959 wdev = NULL; 12960 } 12961 12962 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { 12963 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); 12964 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); 12965 12966 err = nl80211_vendor_check_policy(vcmd, 12967 info->attrs[NL80211_ATTR_VENDOR_DATA], 12968 info->extack); 12969 if (err) 12970 return err; 12971 } 12972 12973 rdev->cur_cmd_info = info; 12974 err = vcmd->doit(&rdev->wiphy, wdev, data, len); 12975 rdev->cur_cmd_info = NULL; 12976 return err; 12977 } 12978 12979 return -EOPNOTSUPP; 12980 } 12981 12982 static int nl80211_prepare_vendor_dump(struct sk_buff *skb, 12983 struct netlink_callback *cb, 12984 struct cfg80211_registered_device **rdev, 12985 struct wireless_dev **wdev) 12986 { 12987 struct nlattr **attrbuf; 12988 u32 vid, subcmd; 12989 unsigned int i; 12990 int vcmd_idx = -1; 12991 int err; 12992 void *data = NULL; 12993 unsigned int data_len = 0; 12994 12995 if (cb->args[0]) { 12996 /* subtract the 1 again here */ 12997 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); 12998 struct wireless_dev *tmp; 12999 13000 if (!wiphy) 13001 return -ENODEV; 13002 *rdev = wiphy_to_rdev(wiphy); 13003 *wdev = NULL; 13004 13005 if (cb->args[1]) { 13006 list_for_each_entry(tmp, &wiphy->wdev_list, list) { 13007 if (tmp->identifier == cb->args[1] - 1) { 13008 *wdev = tmp; 13009 break; 13010 } 13011 } 13012 } 13013 13014 /* keep rtnl locked in successful case */ 13015 return 0; 13016 } 13017 13018 attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf), GFP_KERNEL); 13019 if (!attrbuf) 13020 return -ENOMEM; 13021 13022 err = nlmsg_parse_deprecated(cb->nlh, 13023 GENL_HDRLEN + nl80211_fam.hdrsize, 13024 attrbuf, nl80211_fam.maxattr, 13025 nl80211_policy, NULL); 13026 if (err) 13027 goto out; 13028 13029 if (!attrbuf[NL80211_ATTR_VENDOR_ID] || 13030 !attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) { 13031 err = -EINVAL; 13032 goto out; 13033 } 13034 13035 *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), attrbuf); 13036 if (IS_ERR(*wdev)) 13037 *wdev = NULL; 13038 13039 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); 13040 if (IS_ERR(*rdev)) { 13041 err = PTR_ERR(*rdev); 13042 goto out; 13043 } 13044 13045 vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]); 13046 subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]); 13047 13048 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { 13049 const struct wiphy_vendor_command *vcmd; 13050 13051 vcmd = &(*rdev)->wiphy.vendor_commands[i]; 13052 13053 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) 13054 continue; 13055 13056 if (!vcmd->dumpit) { 13057 err = -EOPNOTSUPP; 13058 goto out; 13059 } 13060 13061 vcmd_idx = i; 13062 break; 13063 } 13064 13065 if (vcmd_idx < 0) { 13066 err = -EOPNOTSUPP; 13067 goto out; 13068 } 13069 13070 if (attrbuf[NL80211_ATTR_VENDOR_DATA]) { 13071 data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]); 13072 data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]); 13073 13074 err = nl80211_vendor_check_policy( 13075 &(*rdev)->wiphy.vendor_commands[vcmd_idx], 13076 attrbuf[NL80211_ATTR_VENDOR_DATA], 13077 cb->extack); 13078 if (err) 13079 goto out; 13080 } 13081 13082 /* 0 is the first index - add 1 to parse only once */ 13083 cb->args[0] = (*rdev)->wiphy_idx + 1; 13084 /* add 1 to know if it was NULL */ 13085 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0; 13086 cb->args[2] = vcmd_idx; 13087 cb->args[3] = (unsigned long)data; 13088 cb->args[4] = data_len; 13089 13090 /* keep rtnl locked in successful case */ 13091 err = 0; 13092 out: 13093 kfree(attrbuf); 13094 return err; 13095 } 13096 13097 static int nl80211_vendor_cmd_dump(struct sk_buff *skb, 13098 struct netlink_callback *cb) 13099 { 13100 struct cfg80211_registered_device *rdev; 13101 struct wireless_dev *wdev; 13102 unsigned int vcmd_idx; 13103 const struct wiphy_vendor_command *vcmd; 13104 void *data; 13105 int data_len; 13106 int err; 13107 struct nlattr *vendor_data; 13108 13109 rtnl_lock(); 13110 err = nl80211_prepare_vendor_dump(skb, cb, &rdev, &wdev); 13111 if (err) 13112 goto out; 13113 13114 vcmd_idx = cb->args[2]; 13115 data = (void *)cb->args[3]; 13116 data_len = cb->args[4]; 13117 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx]; 13118 13119 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | 13120 WIPHY_VENDOR_CMD_NEED_NETDEV)) { 13121 if (!wdev) { 13122 err = -EINVAL; 13123 goto out; 13124 } 13125 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && 13126 !wdev->netdev) { 13127 err = -EINVAL; 13128 goto out; 13129 } 13130 13131 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { 13132 if (!wdev_running(wdev)) { 13133 err = -ENETDOWN; 13134 goto out; 13135 } 13136 } 13137 } 13138 13139 while (1) { 13140 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 13141 cb->nlh->nlmsg_seq, NLM_F_MULTI, 13142 NL80211_CMD_VENDOR); 13143 if (!hdr) 13144 break; 13145 13146 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 13147 (wdev && nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 13148 wdev_id(wdev), 13149 NL80211_ATTR_PAD))) { 13150 genlmsg_cancel(skb, hdr); 13151 break; 13152 } 13153 13154 vendor_data = nla_nest_start_noflag(skb, 13155 NL80211_ATTR_VENDOR_DATA); 13156 if (!vendor_data) { 13157 genlmsg_cancel(skb, hdr); 13158 break; 13159 } 13160 13161 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len, 13162 (unsigned long *)&cb->args[5]); 13163 nla_nest_end(skb, vendor_data); 13164 13165 if (err == -ENOBUFS || err == -ENOENT) { 13166 genlmsg_cancel(skb, hdr); 13167 break; 13168 } else if (err) { 13169 genlmsg_cancel(skb, hdr); 13170 goto out; 13171 } 13172 13173 genlmsg_end(skb, hdr); 13174 } 13175 13176 err = skb->len; 13177 out: 13178 rtnl_unlock(); 13179 return err; 13180 } 13181 13182 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy, 13183 enum nl80211_commands cmd, 13184 enum nl80211_attrs attr, 13185 int approxlen) 13186 { 13187 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 13188 13189 if (WARN_ON(!rdev->cur_cmd_info)) 13190 return NULL; 13191 13192 return __cfg80211_alloc_vendor_skb(rdev, NULL, approxlen, 13193 rdev->cur_cmd_info->snd_portid, 13194 rdev->cur_cmd_info->snd_seq, 13195 cmd, attr, NULL, GFP_KERNEL); 13196 } 13197 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb); 13198 13199 int cfg80211_vendor_cmd_reply(struct sk_buff *skb) 13200 { 13201 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 13202 void *hdr = ((void **)skb->cb)[1]; 13203 struct nlattr *data = ((void **)skb->cb)[2]; 13204 13205 /* clear CB data for netlink core to own from now on */ 13206 memset(skb->cb, 0, sizeof(skb->cb)); 13207 13208 if (WARN_ON(!rdev->cur_cmd_info)) { 13209 kfree_skb(skb); 13210 return -EINVAL; 13211 } 13212 13213 nla_nest_end(skb, data); 13214 genlmsg_end(skb, hdr); 13215 return genlmsg_reply(skb, rdev->cur_cmd_info); 13216 } 13217 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply); 13218 13219 unsigned int cfg80211_vendor_cmd_get_sender(struct wiphy *wiphy) 13220 { 13221 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 13222 13223 if (WARN_ON(!rdev->cur_cmd_info)) 13224 return 0; 13225 13226 return rdev->cur_cmd_info->snd_portid; 13227 } 13228 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_get_sender); 13229 13230 static int nl80211_set_qos_map(struct sk_buff *skb, 13231 struct genl_info *info) 13232 { 13233 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13234 struct cfg80211_qos_map *qos_map = NULL; 13235 struct net_device *dev = info->user_ptr[1]; 13236 u8 *pos, len, num_des, des_len, des; 13237 int ret; 13238 13239 if (!rdev->ops->set_qos_map) 13240 return -EOPNOTSUPP; 13241 13242 if (info->attrs[NL80211_ATTR_QOS_MAP]) { 13243 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]); 13244 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]); 13245 13246 if (len % 2 || len < IEEE80211_QOS_MAP_LEN_MIN || 13247 len > IEEE80211_QOS_MAP_LEN_MAX) 13248 return -EINVAL; 13249 13250 qos_map = kzalloc(sizeof(struct cfg80211_qos_map), GFP_KERNEL); 13251 if (!qos_map) 13252 return -ENOMEM; 13253 13254 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1; 13255 if (num_des) { 13256 des_len = num_des * 13257 sizeof(struct cfg80211_dscp_exception); 13258 memcpy(qos_map->dscp_exception, pos, des_len); 13259 qos_map->num_des = num_des; 13260 for (des = 0; des < num_des; des++) { 13261 if (qos_map->dscp_exception[des].up > 7) { 13262 kfree(qos_map); 13263 return -EINVAL; 13264 } 13265 } 13266 pos += des_len; 13267 } 13268 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN); 13269 } 13270 13271 wdev_lock(dev->ieee80211_ptr); 13272 ret = nl80211_key_allowed(dev->ieee80211_ptr); 13273 if (!ret) 13274 ret = rdev_set_qos_map(rdev, dev, qos_map); 13275 wdev_unlock(dev->ieee80211_ptr); 13276 13277 kfree(qos_map); 13278 return ret; 13279 } 13280 13281 static int nl80211_add_tx_ts(struct sk_buff *skb, struct genl_info *info) 13282 { 13283 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13284 struct net_device *dev = info->user_ptr[1]; 13285 struct wireless_dev *wdev = dev->ieee80211_ptr; 13286 const u8 *peer; 13287 u8 tsid, up; 13288 u16 admitted_time = 0; 13289 int err; 13290 13291 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)) 13292 return -EOPNOTSUPP; 13293 13294 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] || 13295 !info->attrs[NL80211_ATTR_USER_PRIO]) 13296 return -EINVAL; 13297 13298 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); 13299 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]); 13300 13301 /* WMM uses TIDs 0-7 even for TSPEC */ 13302 if (tsid >= IEEE80211_FIRST_TSPEC_TSID) { 13303 /* TODO: handle 802.11 TSPEC/admission control 13304 * need more attributes for that (e.g. BA session requirement); 13305 * change the WMM adminssion test above to allow both then 13306 */ 13307 return -EINVAL; 13308 } 13309 13310 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 13311 13312 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) { 13313 admitted_time = 13314 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]); 13315 if (!admitted_time) 13316 return -EINVAL; 13317 } 13318 13319 wdev_lock(wdev); 13320 switch (wdev->iftype) { 13321 case NL80211_IFTYPE_STATION: 13322 case NL80211_IFTYPE_P2P_CLIENT: 13323 if (wdev->current_bss) 13324 break; 13325 err = -ENOTCONN; 13326 goto out; 13327 default: 13328 err = -EOPNOTSUPP; 13329 goto out; 13330 } 13331 13332 err = rdev_add_tx_ts(rdev, dev, tsid, peer, up, admitted_time); 13333 13334 out: 13335 wdev_unlock(wdev); 13336 return err; 13337 } 13338 13339 static int nl80211_del_tx_ts(struct sk_buff *skb, struct genl_info *info) 13340 { 13341 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13342 struct net_device *dev = info->user_ptr[1]; 13343 struct wireless_dev *wdev = dev->ieee80211_ptr; 13344 const u8 *peer; 13345 u8 tsid; 13346 int err; 13347 13348 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC]) 13349 return -EINVAL; 13350 13351 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); 13352 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 13353 13354 wdev_lock(wdev); 13355 err = rdev_del_tx_ts(rdev, dev, tsid, peer); 13356 wdev_unlock(wdev); 13357 13358 return err; 13359 } 13360 13361 static int nl80211_tdls_channel_switch(struct sk_buff *skb, 13362 struct genl_info *info) 13363 { 13364 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13365 struct net_device *dev = info->user_ptr[1]; 13366 struct wireless_dev *wdev = dev->ieee80211_ptr; 13367 struct cfg80211_chan_def chandef = {}; 13368 const u8 *addr; 13369 u8 oper_class; 13370 int err; 13371 13372 if (!rdev->ops->tdls_channel_switch || 13373 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) 13374 return -EOPNOTSUPP; 13375 13376 switch (dev->ieee80211_ptr->iftype) { 13377 case NL80211_IFTYPE_STATION: 13378 case NL80211_IFTYPE_P2P_CLIENT: 13379 break; 13380 default: 13381 return -EOPNOTSUPP; 13382 } 13383 13384 if (!info->attrs[NL80211_ATTR_MAC] || 13385 !info->attrs[NL80211_ATTR_OPER_CLASS]) 13386 return -EINVAL; 13387 13388 err = nl80211_parse_chandef(rdev, info, &chandef); 13389 if (err) 13390 return err; 13391 13392 /* 13393 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012 13394 * section 10.22.6.2.1. Disallow 5/10Mhz channels as well for now, the 13395 * specification is not defined for them. 13396 */ 13397 if (chandef.chan->band == NL80211_BAND_2GHZ && 13398 chandef.width != NL80211_CHAN_WIDTH_20_NOHT && 13399 chandef.width != NL80211_CHAN_WIDTH_20) 13400 return -EINVAL; 13401 13402 /* we will be active on the TDLS link */ 13403 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, 13404 wdev->iftype)) 13405 return -EINVAL; 13406 13407 /* don't allow switching to DFS channels */ 13408 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype)) 13409 return -EINVAL; 13410 13411 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 13412 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]); 13413 13414 wdev_lock(wdev); 13415 err = rdev_tdls_channel_switch(rdev, dev, addr, oper_class, &chandef); 13416 wdev_unlock(wdev); 13417 13418 return err; 13419 } 13420 13421 static int nl80211_tdls_cancel_channel_switch(struct sk_buff *skb, 13422 struct genl_info *info) 13423 { 13424 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13425 struct net_device *dev = info->user_ptr[1]; 13426 struct wireless_dev *wdev = dev->ieee80211_ptr; 13427 const u8 *addr; 13428 13429 if (!rdev->ops->tdls_channel_switch || 13430 !rdev->ops->tdls_cancel_channel_switch || 13431 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) 13432 return -EOPNOTSUPP; 13433 13434 switch (dev->ieee80211_ptr->iftype) { 13435 case NL80211_IFTYPE_STATION: 13436 case NL80211_IFTYPE_P2P_CLIENT: 13437 break; 13438 default: 13439 return -EOPNOTSUPP; 13440 } 13441 13442 if (!info->attrs[NL80211_ATTR_MAC]) 13443 return -EINVAL; 13444 13445 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 13446 13447 wdev_lock(wdev); 13448 rdev_tdls_cancel_channel_switch(rdev, dev, addr); 13449 wdev_unlock(wdev); 13450 13451 return 0; 13452 } 13453 13454 static int nl80211_set_multicast_to_unicast(struct sk_buff *skb, 13455 struct genl_info *info) 13456 { 13457 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13458 struct net_device *dev = info->user_ptr[1]; 13459 struct wireless_dev *wdev = dev->ieee80211_ptr; 13460 const struct nlattr *nla; 13461 bool enabled; 13462 13463 if (!rdev->ops->set_multicast_to_unicast) 13464 return -EOPNOTSUPP; 13465 13466 if (wdev->iftype != NL80211_IFTYPE_AP && 13467 wdev->iftype != NL80211_IFTYPE_P2P_GO) 13468 return -EOPNOTSUPP; 13469 13470 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED]; 13471 enabled = nla_get_flag(nla); 13472 13473 return rdev_set_multicast_to_unicast(rdev, dev, enabled); 13474 } 13475 13476 static int nl80211_set_pmk(struct sk_buff *skb, struct genl_info *info) 13477 { 13478 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13479 struct net_device *dev = info->user_ptr[1]; 13480 struct wireless_dev *wdev = dev->ieee80211_ptr; 13481 struct cfg80211_pmk_conf pmk_conf = {}; 13482 int ret; 13483 13484 if (wdev->iftype != NL80211_IFTYPE_STATION && 13485 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 13486 return -EOPNOTSUPP; 13487 13488 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13489 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 13490 return -EOPNOTSUPP; 13491 13492 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK]) 13493 return -EINVAL; 13494 13495 wdev_lock(wdev); 13496 if (!wdev->current_bss) { 13497 ret = -ENOTCONN; 13498 goto out; 13499 } 13500 13501 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]); 13502 if (memcmp(pmk_conf.aa, wdev->current_bss->pub.bssid, ETH_ALEN)) { 13503 ret = -EINVAL; 13504 goto out; 13505 } 13506 13507 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); 13508 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); 13509 if (pmk_conf.pmk_len != WLAN_PMK_LEN && 13510 pmk_conf.pmk_len != WLAN_PMK_LEN_SUITE_B_192) { 13511 ret = -EINVAL; 13512 goto out; 13513 } 13514 13515 if (info->attrs[NL80211_ATTR_PMKR0_NAME]) { 13516 int r0_name_len = nla_len(info->attrs[NL80211_ATTR_PMKR0_NAME]); 13517 13518 if (r0_name_len != WLAN_PMK_NAME_LEN) { 13519 ret = -EINVAL; 13520 goto out; 13521 } 13522 13523 pmk_conf.pmk_r0_name = 13524 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]); 13525 } 13526 13527 ret = rdev_set_pmk(rdev, dev, &pmk_conf); 13528 out: 13529 wdev_unlock(wdev); 13530 return ret; 13531 } 13532 13533 static int nl80211_del_pmk(struct sk_buff *skb, struct genl_info *info) 13534 { 13535 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13536 struct net_device *dev = info->user_ptr[1]; 13537 struct wireless_dev *wdev = dev->ieee80211_ptr; 13538 const u8 *aa; 13539 int ret; 13540 13541 if (wdev->iftype != NL80211_IFTYPE_STATION && 13542 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 13543 return -EOPNOTSUPP; 13544 13545 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13546 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 13547 return -EOPNOTSUPP; 13548 13549 if (!info->attrs[NL80211_ATTR_MAC]) 13550 return -EINVAL; 13551 13552 wdev_lock(wdev); 13553 aa = nla_data(info->attrs[NL80211_ATTR_MAC]); 13554 ret = rdev_del_pmk(rdev, dev, aa); 13555 wdev_unlock(wdev); 13556 13557 return ret; 13558 } 13559 13560 static int nl80211_external_auth(struct sk_buff *skb, struct genl_info *info) 13561 { 13562 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13563 struct net_device *dev = info->user_ptr[1]; 13564 struct cfg80211_external_auth_params params; 13565 13566 if (!rdev->ops->external_auth) 13567 return -EOPNOTSUPP; 13568 13569 if (!info->attrs[NL80211_ATTR_SSID] && 13570 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 13571 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 13572 return -EINVAL; 13573 13574 if (!info->attrs[NL80211_ATTR_BSSID]) 13575 return -EINVAL; 13576 13577 if (!info->attrs[NL80211_ATTR_STATUS_CODE]) 13578 return -EINVAL; 13579 13580 memset(¶ms, 0, sizeof(params)); 13581 13582 if (info->attrs[NL80211_ATTR_SSID]) { 13583 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 13584 if (params.ssid.ssid_len == 0 || 13585 params.ssid.ssid_len > IEEE80211_MAX_SSID_LEN) 13586 return -EINVAL; 13587 memcpy(params.ssid.ssid, 13588 nla_data(info->attrs[NL80211_ATTR_SSID]), 13589 params.ssid.ssid_len); 13590 } 13591 13592 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), 13593 ETH_ALEN); 13594 13595 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 13596 13597 if (info->attrs[NL80211_ATTR_PMKID]) 13598 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 13599 13600 return rdev_external_auth(rdev, dev, ¶ms); 13601 } 13602 13603 static int nl80211_tx_control_port(struct sk_buff *skb, struct genl_info *info) 13604 { 13605 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13606 struct net_device *dev = info->user_ptr[1]; 13607 struct wireless_dev *wdev = dev->ieee80211_ptr; 13608 const u8 *buf; 13609 size_t len; 13610 u8 *dest; 13611 u16 proto; 13612 bool noencrypt; 13613 int err; 13614 13615 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13616 NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211)) 13617 return -EOPNOTSUPP; 13618 13619 if (!rdev->ops->tx_control_port) 13620 return -EOPNOTSUPP; 13621 13622 if (!info->attrs[NL80211_ATTR_FRAME] || 13623 !info->attrs[NL80211_ATTR_MAC] || 13624 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { 13625 GENL_SET_ERR_MSG(info, "Frame, MAC or ethertype missing"); 13626 return -EINVAL; 13627 } 13628 13629 wdev_lock(wdev); 13630 13631 switch (wdev->iftype) { 13632 case NL80211_IFTYPE_AP: 13633 case NL80211_IFTYPE_P2P_GO: 13634 case NL80211_IFTYPE_MESH_POINT: 13635 break; 13636 case NL80211_IFTYPE_ADHOC: 13637 case NL80211_IFTYPE_STATION: 13638 case NL80211_IFTYPE_P2P_CLIENT: 13639 if (wdev->current_bss) 13640 break; 13641 err = -ENOTCONN; 13642 goto out; 13643 default: 13644 err = -EOPNOTSUPP; 13645 goto out; 13646 } 13647 13648 wdev_unlock(wdev); 13649 13650 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 13651 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 13652 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); 13653 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); 13654 noencrypt = 13655 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]); 13656 13657 return rdev_tx_control_port(rdev, dev, buf, len, 13658 dest, cpu_to_be16(proto), noencrypt); 13659 13660 out: 13661 wdev_unlock(wdev); 13662 return err; 13663 } 13664 13665 static int nl80211_get_ftm_responder_stats(struct sk_buff *skb, 13666 struct genl_info *info) 13667 { 13668 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13669 struct net_device *dev = info->user_ptr[1]; 13670 struct wireless_dev *wdev = dev->ieee80211_ptr; 13671 struct cfg80211_ftm_responder_stats ftm_stats = {}; 13672 struct sk_buff *msg; 13673 void *hdr; 13674 struct nlattr *ftm_stats_attr; 13675 int err; 13676 13677 if (wdev->iftype != NL80211_IFTYPE_AP || !wdev->beacon_interval) 13678 return -EOPNOTSUPP; 13679 13680 err = rdev_get_ftm_responder_stats(rdev, dev, &ftm_stats); 13681 if (err) 13682 return err; 13683 13684 if (!ftm_stats.filled) 13685 return -ENODATA; 13686 13687 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 13688 if (!msg) 13689 return -ENOMEM; 13690 13691 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 13692 NL80211_CMD_GET_FTM_RESPONDER_STATS); 13693 if (!hdr) 13694 goto nla_put_failure; 13695 13696 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 13697 goto nla_put_failure; 13698 13699 ftm_stats_attr = nla_nest_start_noflag(msg, 13700 NL80211_ATTR_FTM_RESPONDER_STATS); 13701 if (!ftm_stats_attr) 13702 goto nla_put_failure; 13703 13704 #define SET_FTM(field, name, type) \ 13705 do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \ 13706 nla_put_ ## type(msg, NL80211_FTM_STATS_ ## name, \ 13707 ftm_stats.field)) \ 13708 goto nla_put_failure; } while (0) 13709 #define SET_FTM_U64(field, name) \ 13710 do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \ 13711 nla_put_u64_64bit(msg, NL80211_FTM_STATS_ ## name, \ 13712 ftm_stats.field, NL80211_FTM_STATS_PAD)) \ 13713 goto nla_put_failure; } while (0) 13714 13715 SET_FTM(success_num, SUCCESS_NUM, u32); 13716 SET_FTM(partial_num, PARTIAL_NUM, u32); 13717 SET_FTM(failed_num, FAILED_NUM, u32); 13718 SET_FTM(asap_num, ASAP_NUM, u32); 13719 SET_FTM(non_asap_num, NON_ASAP_NUM, u32); 13720 SET_FTM_U64(total_duration_ms, TOTAL_DURATION_MSEC); 13721 SET_FTM(unknown_triggers_num, UNKNOWN_TRIGGERS_NUM, u32); 13722 SET_FTM(reschedule_requests_num, RESCHEDULE_REQUESTS_NUM, u32); 13723 SET_FTM(out_of_window_triggers_num, OUT_OF_WINDOW_TRIGGERS_NUM, u32); 13724 #undef SET_FTM 13725 13726 nla_nest_end(msg, ftm_stats_attr); 13727 13728 genlmsg_end(msg, hdr); 13729 return genlmsg_reply(msg, info); 13730 13731 nla_put_failure: 13732 nlmsg_free(msg); 13733 return -ENOBUFS; 13734 } 13735 13736 static int nl80211_update_owe_info(struct sk_buff *skb, struct genl_info *info) 13737 { 13738 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13739 struct cfg80211_update_owe_info owe_info; 13740 struct net_device *dev = info->user_ptr[1]; 13741 13742 if (!rdev->ops->update_owe_info) 13743 return -EOPNOTSUPP; 13744 13745 if (!info->attrs[NL80211_ATTR_STATUS_CODE] || 13746 !info->attrs[NL80211_ATTR_MAC]) 13747 return -EINVAL; 13748 13749 memset(&owe_info, 0, sizeof(owe_info)); 13750 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 13751 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); 13752 13753 if (info->attrs[NL80211_ATTR_IE]) { 13754 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13755 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13756 } 13757 13758 return rdev_update_owe_info(rdev, dev, &owe_info); 13759 } 13760 13761 static int nl80211_probe_mesh_link(struct sk_buff *skb, struct genl_info *info) 13762 { 13763 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13764 struct net_device *dev = info->user_ptr[1]; 13765 struct wireless_dev *wdev = dev->ieee80211_ptr; 13766 struct station_info sinfo = {}; 13767 const u8 *buf; 13768 size_t len; 13769 u8 *dest; 13770 int err; 13771 13772 if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station) 13773 return -EOPNOTSUPP; 13774 13775 if (!info->attrs[NL80211_ATTR_MAC] || 13776 !info->attrs[NL80211_ATTR_FRAME]) { 13777 GENL_SET_ERR_MSG(info, "Frame or MAC missing"); 13778 return -EINVAL; 13779 } 13780 13781 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 13782 return -EOPNOTSUPP; 13783 13784 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); 13785 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 13786 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 13787 13788 if (len < sizeof(struct ethhdr)) 13789 return -EINVAL; 13790 13791 if (!ether_addr_equal(buf, dest) || is_multicast_ether_addr(buf) || 13792 !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr)) 13793 return -EINVAL; 13794 13795 err = rdev_get_station(rdev, dev, dest, &sinfo); 13796 if (err) 13797 return err; 13798 13799 return rdev_probe_mesh_link(rdev, dev, dest, buf, len); 13800 } 13801 13802 #define NL80211_FLAG_NEED_WIPHY 0x01 13803 #define NL80211_FLAG_NEED_NETDEV 0x02 13804 #define NL80211_FLAG_NEED_RTNL 0x04 13805 #define NL80211_FLAG_CHECK_NETDEV_UP 0x08 13806 #define NL80211_FLAG_NEED_NETDEV_UP (NL80211_FLAG_NEED_NETDEV |\ 13807 NL80211_FLAG_CHECK_NETDEV_UP) 13808 #define NL80211_FLAG_NEED_WDEV 0x10 13809 /* If a netdev is associated, it must be UP, P2P must be started */ 13810 #define NL80211_FLAG_NEED_WDEV_UP (NL80211_FLAG_NEED_WDEV |\ 13811 NL80211_FLAG_CHECK_NETDEV_UP) 13812 #define NL80211_FLAG_CLEAR_SKB 0x20 13813 13814 static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, 13815 struct genl_info *info) 13816 { 13817 struct cfg80211_registered_device *rdev; 13818 struct wireless_dev *wdev; 13819 struct net_device *dev; 13820 bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL; 13821 13822 if (rtnl) 13823 rtnl_lock(); 13824 13825 if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) { 13826 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 13827 if (IS_ERR(rdev)) { 13828 if (rtnl) 13829 rtnl_unlock(); 13830 return PTR_ERR(rdev); 13831 } 13832 info->user_ptr[0] = rdev; 13833 } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV || 13834 ops->internal_flags & NL80211_FLAG_NEED_WDEV) { 13835 ASSERT_RTNL(); 13836 13837 wdev = __cfg80211_wdev_from_attrs(genl_info_net(info), 13838 info->attrs); 13839 if (IS_ERR(wdev)) { 13840 if (rtnl) 13841 rtnl_unlock(); 13842 return PTR_ERR(wdev); 13843 } 13844 13845 dev = wdev->netdev; 13846 rdev = wiphy_to_rdev(wdev->wiphy); 13847 13848 if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) { 13849 if (!dev) { 13850 if (rtnl) 13851 rtnl_unlock(); 13852 return -EINVAL; 13853 } 13854 13855 info->user_ptr[1] = dev; 13856 } else { 13857 info->user_ptr[1] = wdev; 13858 } 13859 13860 if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && 13861 !wdev_running(wdev)) { 13862 if (rtnl) 13863 rtnl_unlock(); 13864 return -ENETDOWN; 13865 } 13866 13867 if (dev) 13868 dev_hold(dev); 13869 13870 info->user_ptr[0] = rdev; 13871 } 13872 13873 return 0; 13874 } 13875 13876 static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb, 13877 struct genl_info *info) 13878 { 13879 if (info->user_ptr[1]) { 13880 if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) { 13881 struct wireless_dev *wdev = info->user_ptr[1]; 13882 13883 if (wdev->netdev) 13884 dev_put(wdev->netdev); 13885 } else { 13886 dev_put(info->user_ptr[1]); 13887 } 13888 } 13889 13890 if (ops->internal_flags & NL80211_FLAG_NEED_RTNL) 13891 rtnl_unlock(); 13892 13893 /* If needed, clear the netlink message payload from the SKB 13894 * as it might contain key data that shouldn't stick around on 13895 * the heap after the SKB is freed. The netlink message header 13896 * is still needed for further processing, so leave it intact. 13897 */ 13898 if (ops->internal_flags & NL80211_FLAG_CLEAR_SKB) { 13899 struct nlmsghdr *nlh = nlmsg_hdr(skb); 13900 13901 memset(nlmsg_data(nlh), 0, nlmsg_len(nlh)); 13902 } 13903 } 13904 13905 static const struct genl_ops nl80211_ops[] = { 13906 { 13907 .cmd = NL80211_CMD_GET_WIPHY, 13908 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 13909 .doit = nl80211_get_wiphy, 13910 .dumpit = nl80211_dump_wiphy, 13911 .done = nl80211_dump_wiphy_done, 13912 /* can be retrieved by unprivileged users */ 13913 .internal_flags = NL80211_FLAG_NEED_WIPHY | 13914 NL80211_FLAG_NEED_RTNL, 13915 }, 13916 { 13917 .cmd = NL80211_CMD_SET_WIPHY, 13918 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 13919 .doit = nl80211_set_wiphy, 13920 .flags = GENL_UNS_ADMIN_PERM, 13921 .internal_flags = NL80211_FLAG_NEED_RTNL, 13922 }, 13923 { 13924 .cmd = NL80211_CMD_GET_INTERFACE, 13925 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 13926 .doit = nl80211_get_interface, 13927 .dumpit = nl80211_dump_interface, 13928 /* can be retrieved by unprivileged users */ 13929 .internal_flags = NL80211_FLAG_NEED_WDEV | 13930 NL80211_FLAG_NEED_RTNL, 13931 }, 13932 { 13933 .cmd = NL80211_CMD_SET_INTERFACE, 13934 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 13935 .doit = nl80211_set_interface, 13936 .flags = GENL_UNS_ADMIN_PERM, 13937 .internal_flags = NL80211_FLAG_NEED_NETDEV | 13938 NL80211_FLAG_NEED_RTNL, 13939 }, 13940 { 13941 .cmd = NL80211_CMD_NEW_INTERFACE, 13942 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 13943 .doit = nl80211_new_interface, 13944 .flags = GENL_UNS_ADMIN_PERM, 13945 .internal_flags = NL80211_FLAG_NEED_WIPHY | 13946 NL80211_FLAG_NEED_RTNL, 13947 }, 13948 { 13949 .cmd = NL80211_CMD_DEL_INTERFACE, 13950 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 13951 .doit = nl80211_del_interface, 13952 .flags = GENL_UNS_ADMIN_PERM, 13953 .internal_flags = NL80211_FLAG_NEED_WDEV | 13954 NL80211_FLAG_NEED_RTNL, 13955 }, 13956 { 13957 .cmd = NL80211_CMD_GET_KEY, 13958 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 13959 .doit = nl80211_get_key, 13960 .flags = GENL_UNS_ADMIN_PERM, 13961 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13962 NL80211_FLAG_NEED_RTNL, 13963 }, 13964 { 13965 .cmd = NL80211_CMD_SET_KEY, 13966 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 13967 .doit = nl80211_set_key, 13968 .flags = GENL_UNS_ADMIN_PERM, 13969 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13970 NL80211_FLAG_NEED_RTNL | 13971 NL80211_FLAG_CLEAR_SKB, 13972 }, 13973 { 13974 .cmd = NL80211_CMD_NEW_KEY, 13975 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 13976 .doit = nl80211_new_key, 13977 .flags = GENL_UNS_ADMIN_PERM, 13978 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13979 NL80211_FLAG_NEED_RTNL | 13980 NL80211_FLAG_CLEAR_SKB, 13981 }, 13982 { 13983 .cmd = NL80211_CMD_DEL_KEY, 13984 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 13985 .doit = nl80211_del_key, 13986 .flags = GENL_UNS_ADMIN_PERM, 13987 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13988 NL80211_FLAG_NEED_RTNL, 13989 }, 13990 { 13991 .cmd = NL80211_CMD_SET_BEACON, 13992 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 13993 .flags = GENL_UNS_ADMIN_PERM, 13994 .doit = nl80211_set_beacon, 13995 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13996 NL80211_FLAG_NEED_RTNL, 13997 }, 13998 { 13999 .cmd = NL80211_CMD_START_AP, 14000 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14001 .flags = GENL_UNS_ADMIN_PERM, 14002 .doit = nl80211_start_ap, 14003 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14004 NL80211_FLAG_NEED_RTNL, 14005 }, 14006 { 14007 .cmd = NL80211_CMD_STOP_AP, 14008 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14009 .flags = GENL_UNS_ADMIN_PERM, 14010 .doit = nl80211_stop_ap, 14011 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14012 NL80211_FLAG_NEED_RTNL, 14013 }, 14014 { 14015 .cmd = NL80211_CMD_GET_STATION, 14016 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14017 .doit = nl80211_get_station, 14018 .dumpit = nl80211_dump_station, 14019 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14020 NL80211_FLAG_NEED_RTNL, 14021 }, 14022 { 14023 .cmd = NL80211_CMD_SET_STATION, 14024 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14025 .doit = nl80211_set_station, 14026 .flags = GENL_UNS_ADMIN_PERM, 14027 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14028 NL80211_FLAG_NEED_RTNL, 14029 }, 14030 { 14031 .cmd = NL80211_CMD_NEW_STATION, 14032 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14033 .doit = nl80211_new_station, 14034 .flags = GENL_UNS_ADMIN_PERM, 14035 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14036 NL80211_FLAG_NEED_RTNL, 14037 }, 14038 { 14039 .cmd = NL80211_CMD_DEL_STATION, 14040 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14041 .doit = nl80211_del_station, 14042 .flags = GENL_UNS_ADMIN_PERM, 14043 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14044 NL80211_FLAG_NEED_RTNL, 14045 }, 14046 { 14047 .cmd = NL80211_CMD_GET_MPATH, 14048 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14049 .doit = nl80211_get_mpath, 14050 .dumpit = nl80211_dump_mpath, 14051 .flags = GENL_UNS_ADMIN_PERM, 14052 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14053 NL80211_FLAG_NEED_RTNL, 14054 }, 14055 { 14056 .cmd = NL80211_CMD_GET_MPP, 14057 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14058 .doit = nl80211_get_mpp, 14059 .dumpit = nl80211_dump_mpp, 14060 .flags = GENL_UNS_ADMIN_PERM, 14061 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14062 NL80211_FLAG_NEED_RTNL, 14063 }, 14064 { 14065 .cmd = NL80211_CMD_SET_MPATH, 14066 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14067 .doit = nl80211_set_mpath, 14068 .flags = GENL_UNS_ADMIN_PERM, 14069 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14070 NL80211_FLAG_NEED_RTNL, 14071 }, 14072 { 14073 .cmd = NL80211_CMD_NEW_MPATH, 14074 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14075 .doit = nl80211_new_mpath, 14076 .flags = GENL_UNS_ADMIN_PERM, 14077 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14078 NL80211_FLAG_NEED_RTNL, 14079 }, 14080 { 14081 .cmd = NL80211_CMD_DEL_MPATH, 14082 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14083 .doit = nl80211_del_mpath, 14084 .flags = GENL_UNS_ADMIN_PERM, 14085 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14086 NL80211_FLAG_NEED_RTNL, 14087 }, 14088 { 14089 .cmd = NL80211_CMD_SET_BSS, 14090 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14091 .doit = nl80211_set_bss, 14092 .flags = GENL_UNS_ADMIN_PERM, 14093 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14094 NL80211_FLAG_NEED_RTNL, 14095 }, 14096 { 14097 .cmd = NL80211_CMD_GET_REG, 14098 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14099 .doit = nl80211_get_reg_do, 14100 .dumpit = nl80211_get_reg_dump, 14101 .internal_flags = NL80211_FLAG_NEED_RTNL, 14102 /* can be retrieved by unprivileged users */ 14103 }, 14104 #ifdef CONFIG_CFG80211_CRDA_SUPPORT 14105 { 14106 .cmd = NL80211_CMD_SET_REG, 14107 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14108 .doit = nl80211_set_reg, 14109 .flags = GENL_ADMIN_PERM, 14110 .internal_flags = NL80211_FLAG_NEED_RTNL, 14111 }, 14112 #endif 14113 { 14114 .cmd = NL80211_CMD_REQ_SET_REG, 14115 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14116 .doit = nl80211_req_set_reg, 14117 .flags = GENL_ADMIN_PERM, 14118 }, 14119 { 14120 .cmd = NL80211_CMD_RELOAD_REGDB, 14121 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14122 .doit = nl80211_reload_regdb, 14123 .flags = GENL_ADMIN_PERM, 14124 }, 14125 { 14126 .cmd = NL80211_CMD_GET_MESH_CONFIG, 14127 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14128 .doit = nl80211_get_mesh_config, 14129 /* can be retrieved by unprivileged users */ 14130 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14131 NL80211_FLAG_NEED_RTNL, 14132 }, 14133 { 14134 .cmd = NL80211_CMD_SET_MESH_CONFIG, 14135 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14136 .doit = nl80211_update_mesh_config, 14137 .flags = GENL_UNS_ADMIN_PERM, 14138 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14139 NL80211_FLAG_NEED_RTNL, 14140 }, 14141 { 14142 .cmd = NL80211_CMD_TRIGGER_SCAN, 14143 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14144 .doit = nl80211_trigger_scan, 14145 .flags = GENL_UNS_ADMIN_PERM, 14146 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14147 NL80211_FLAG_NEED_RTNL, 14148 }, 14149 { 14150 .cmd = NL80211_CMD_ABORT_SCAN, 14151 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14152 .doit = nl80211_abort_scan, 14153 .flags = GENL_UNS_ADMIN_PERM, 14154 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14155 NL80211_FLAG_NEED_RTNL, 14156 }, 14157 { 14158 .cmd = NL80211_CMD_GET_SCAN, 14159 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14160 .dumpit = nl80211_dump_scan, 14161 }, 14162 { 14163 .cmd = NL80211_CMD_START_SCHED_SCAN, 14164 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14165 .doit = nl80211_start_sched_scan, 14166 .flags = GENL_UNS_ADMIN_PERM, 14167 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14168 NL80211_FLAG_NEED_RTNL, 14169 }, 14170 { 14171 .cmd = NL80211_CMD_STOP_SCHED_SCAN, 14172 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14173 .doit = nl80211_stop_sched_scan, 14174 .flags = GENL_UNS_ADMIN_PERM, 14175 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14176 NL80211_FLAG_NEED_RTNL, 14177 }, 14178 { 14179 .cmd = NL80211_CMD_AUTHENTICATE, 14180 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14181 .doit = nl80211_authenticate, 14182 .flags = GENL_UNS_ADMIN_PERM, 14183 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14184 NL80211_FLAG_NEED_RTNL | 14185 NL80211_FLAG_CLEAR_SKB, 14186 }, 14187 { 14188 .cmd = NL80211_CMD_ASSOCIATE, 14189 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14190 .doit = nl80211_associate, 14191 .flags = GENL_UNS_ADMIN_PERM, 14192 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14193 NL80211_FLAG_NEED_RTNL | 14194 NL80211_FLAG_CLEAR_SKB, 14195 }, 14196 { 14197 .cmd = NL80211_CMD_DEAUTHENTICATE, 14198 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14199 .doit = nl80211_deauthenticate, 14200 .flags = GENL_UNS_ADMIN_PERM, 14201 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14202 NL80211_FLAG_NEED_RTNL, 14203 }, 14204 { 14205 .cmd = NL80211_CMD_DISASSOCIATE, 14206 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14207 .doit = nl80211_disassociate, 14208 .flags = GENL_UNS_ADMIN_PERM, 14209 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14210 NL80211_FLAG_NEED_RTNL, 14211 }, 14212 { 14213 .cmd = NL80211_CMD_JOIN_IBSS, 14214 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14215 .doit = nl80211_join_ibss, 14216 .flags = GENL_UNS_ADMIN_PERM, 14217 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14218 NL80211_FLAG_NEED_RTNL, 14219 }, 14220 { 14221 .cmd = NL80211_CMD_LEAVE_IBSS, 14222 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14223 .doit = nl80211_leave_ibss, 14224 .flags = GENL_UNS_ADMIN_PERM, 14225 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14226 NL80211_FLAG_NEED_RTNL, 14227 }, 14228 #ifdef CONFIG_NL80211_TESTMODE 14229 { 14230 .cmd = NL80211_CMD_TESTMODE, 14231 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14232 .doit = nl80211_testmode_do, 14233 .dumpit = nl80211_testmode_dump, 14234 .flags = GENL_UNS_ADMIN_PERM, 14235 .internal_flags = NL80211_FLAG_NEED_WIPHY | 14236 NL80211_FLAG_NEED_RTNL, 14237 }, 14238 #endif 14239 { 14240 .cmd = NL80211_CMD_CONNECT, 14241 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14242 .doit = nl80211_connect, 14243 .flags = GENL_UNS_ADMIN_PERM, 14244 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14245 NL80211_FLAG_NEED_RTNL | 14246 NL80211_FLAG_CLEAR_SKB, 14247 }, 14248 { 14249 .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS, 14250 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14251 .doit = nl80211_update_connect_params, 14252 .flags = GENL_ADMIN_PERM, 14253 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14254 NL80211_FLAG_NEED_RTNL | 14255 NL80211_FLAG_CLEAR_SKB, 14256 }, 14257 { 14258 .cmd = NL80211_CMD_DISCONNECT, 14259 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14260 .doit = nl80211_disconnect, 14261 .flags = GENL_UNS_ADMIN_PERM, 14262 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14263 NL80211_FLAG_NEED_RTNL, 14264 }, 14265 { 14266 .cmd = NL80211_CMD_SET_WIPHY_NETNS, 14267 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14268 .doit = nl80211_wiphy_netns, 14269 .flags = GENL_UNS_ADMIN_PERM, 14270 .internal_flags = NL80211_FLAG_NEED_WIPHY | 14271 NL80211_FLAG_NEED_RTNL, 14272 }, 14273 { 14274 .cmd = NL80211_CMD_GET_SURVEY, 14275 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14276 .dumpit = nl80211_dump_survey, 14277 }, 14278 { 14279 .cmd = NL80211_CMD_SET_PMKSA, 14280 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14281 .doit = nl80211_setdel_pmksa, 14282 .flags = GENL_UNS_ADMIN_PERM, 14283 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14284 NL80211_FLAG_NEED_RTNL | 14285 NL80211_FLAG_CLEAR_SKB, 14286 }, 14287 { 14288 .cmd = NL80211_CMD_DEL_PMKSA, 14289 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14290 .doit = nl80211_setdel_pmksa, 14291 .flags = GENL_UNS_ADMIN_PERM, 14292 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14293 NL80211_FLAG_NEED_RTNL, 14294 }, 14295 { 14296 .cmd = NL80211_CMD_FLUSH_PMKSA, 14297 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14298 .doit = nl80211_flush_pmksa, 14299 .flags = GENL_UNS_ADMIN_PERM, 14300 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14301 NL80211_FLAG_NEED_RTNL, 14302 }, 14303 { 14304 .cmd = NL80211_CMD_REMAIN_ON_CHANNEL, 14305 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14306 .doit = nl80211_remain_on_channel, 14307 .flags = GENL_UNS_ADMIN_PERM, 14308 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14309 NL80211_FLAG_NEED_RTNL, 14310 }, 14311 { 14312 .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 14313 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14314 .doit = nl80211_cancel_remain_on_channel, 14315 .flags = GENL_UNS_ADMIN_PERM, 14316 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14317 NL80211_FLAG_NEED_RTNL, 14318 }, 14319 { 14320 .cmd = NL80211_CMD_SET_TX_BITRATE_MASK, 14321 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14322 .doit = nl80211_set_tx_bitrate_mask, 14323 .flags = GENL_UNS_ADMIN_PERM, 14324 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14325 NL80211_FLAG_NEED_RTNL, 14326 }, 14327 { 14328 .cmd = NL80211_CMD_REGISTER_FRAME, 14329 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14330 .doit = nl80211_register_mgmt, 14331 .flags = GENL_UNS_ADMIN_PERM, 14332 .internal_flags = NL80211_FLAG_NEED_WDEV | 14333 NL80211_FLAG_NEED_RTNL, 14334 }, 14335 { 14336 .cmd = NL80211_CMD_FRAME, 14337 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14338 .doit = nl80211_tx_mgmt, 14339 .flags = GENL_UNS_ADMIN_PERM, 14340 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14341 NL80211_FLAG_NEED_RTNL, 14342 }, 14343 { 14344 .cmd = NL80211_CMD_FRAME_WAIT_CANCEL, 14345 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14346 .doit = nl80211_tx_mgmt_cancel_wait, 14347 .flags = GENL_UNS_ADMIN_PERM, 14348 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14349 NL80211_FLAG_NEED_RTNL, 14350 }, 14351 { 14352 .cmd = NL80211_CMD_SET_POWER_SAVE, 14353 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14354 .doit = nl80211_set_power_save, 14355 .flags = GENL_UNS_ADMIN_PERM, 14356 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14357 NL80211_FLAG_NEED_RTNL, 14358 }, 14359 { 14360 .cmd = NL80211_CMD_GET_POWER_SAVE, 14361 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14362 .doit = nl80211_get_power_save, 14363 /* can be retrieved by unprivileged users */ 14364 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14365 NL80211_FLAG_NEED_RTNL, 14366 }, 14367 { 14368 .cmd = NL80211_CMD_SET_CQM, 14369 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14370 .doit = nl80211_set_cqm, 14371 .flags = GENL_UNS_ADMIN_PERM, 14372 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14373 NL80211_FLAG_NEED_RTNL, 14374 }, 14375 { 14376 .cmd = NL80211_CMD_SET_CHANNEL, 14377 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14378 .doit = nl80211_set_channel, 14379 .flags = GENL_UNS_ADMIN_PERM, 14380 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14381 NL80211_FLAG_NEED_RTNL, 14382 }, 14383 { 14384 .cmd = NL80211_CMD_SET_WDS_PEER, 14385 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14386 .doit = nl80211_set_wds_peer, 14387 .flags = GENL_UNS_ADMIN_PERM, 14388 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14389 NL80211_FLAG_NEED_RTNL, 14390 }, 14391 { 14392 .cmd = NL80211_CMD_JOIN_MESH, 14393 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14394 .doit = nl80211_join_mesh, 14395 .flags = GENL_UNS_ADMIN_PERM, 14396 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14397 NL80211_FLAG_NEED_RTNL, 14398 }, 14399 { 14400 .cmd = NL80211_CMD_LEAVE_MESH, 14401 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14402 .doit = nl80211_leave_mesh, 14403 .flags = GENL_UNS_ADMIN_PERM, 14404 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14405 NL80211_FLAG_NEED_RTNL, 14406 }, 14407 { 14408 .cmd = NL80211_CMD_JOIN_OCB, 14409 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14410 .doit = nl80211_join_ocb, 14411 .flags = GENL_UNS_ADMIN_PERM, 14412 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14413 NL80211_FLAG_NEED_RTNL, 14414 }, 14415 { 14416 .cmd = NL80211_CMD_LEAVE_OCB, 14417 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14418 .doit = nl80211_leave_ocb, 14419 .flags = GENL_UNS_ADMIN_PERM, 14420 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14421 NL80211_FLAG_NEED_RTNL, 14422 }, 14423 #ifdef CONFIG_PM 14424 { 14425 .cmd = NL80211_CMD_GET_WOWLAN, 14426 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14427 .doit = nl80211_get_wowlan, 14428 /* can be retrieved by unprivileged users */ 14429 .internal_flags = NL80211_FLAG_NEED_WIPHY | 14430 NL80211_FLAG_NEED_RTNL, 14431 }, 14432 { 14433 .cmd = NL80211_CMD_SET_WOWLAN, 14434 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14435 .doit = nl80211_set_wowlan, 14436 .flags = GENL_UNS_ADMIN_PERM, 14437 .internal_flags = NL80211_FLAG_NEED_WIPHY | 14438 NL80211_FLAG_NEED_RTNL, 14439 }, 14440 #endif 14441 { 14442 .cmd = NL80211_CMD_SET_REKEY_OFFLOAD, 14443 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14444 .doit = nl80211_set_rekey_data, 14445 .flags = GENL_UNS_ADMIN_PERM, 14446 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14447 NL80211_FLAG_NEED_RTNL | 14448 NL80211_FLAG_CLEAR_SKB, 14449 }, 14450 { 14451 .cmd = NL80211_CMD_TDLS_MGMT, 14452 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14453 .doit = nl80211_tdls_mgmt, 14454 .flags = GENL_UNS_ADMIN_PERM, 14455 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14456 NL80211_FLAG_NEED_RTNL, 14457 }, 14458 { 14459 .cmd = NL80211_CMD_TDLS_OPER, 14460 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14461 .doit = nl80211_tdls_oper, 14462 .flags = GENL_UNS_ADMIN_PERM, 14463 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14464 NL80211_FLAG_NEED_RTNL, 14465 }, 14466 { 14467 .cmd = NL80211_CMD_UNEXPECTED_FRAME, 14468 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14469 .doit = nl80211_register_unexpected_frame, 14470 .flags = GENL_UNS_ADMIN_PERM, 14471 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14472 NL80211_FLAG_NEED_RTNL, 14473 }, 14474 { 14475 .cmd = NL80211_CMD_PROBE_CLIENT, 14476 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14477 .doit = nl80211_probe_client, 14478 .flags = GENL_UNS_ADMIN_PERM, 14479 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14480 NL80211_FLAG_NEED_RTNL, 14481 }, 14482 { 14483 .cmd = NL80211_CMD_REGISTER_BEACONS, 14484 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14485 .doit = nl80211_register_beacons, 14486 .flags = GENL_UNS_ADMIN_PERM, 14487 .internal_flags = NL80211_FLAG_NEED_WIPHY | 14488 NL80211_FLAG_NEED_RTNL, 14489 }, 14490 { 14491 .cmd = NL80211_CMD_SET_NOACK_MAP, 14492 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14493 .doit = nl80211_set_noack_map, 14494 .flags = GENL_UNS_ADMIN_PERM, 14495 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14496 NL80211_FLAG_NEED_RTNL, 14497 }, 14498 { 14499 .cmd = NL80211_CMD_START_P2P_DEVICE, 14500 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14501 .doit = nl80211_start_p2p_device, 14502 .flags = GENL_UNS_ADMIN_PERM, 14503 .internal_flags = NL80211_FLAG_NEED_WDEV | 14504 NL80211_FLAG_NEED_RTNL, 14505 }, 14506 { 14507 .cmd = NL80211_CMD_STOP_P2P_DEVICE, 14508 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14509 .doit = nl80211_stop_p2p_device, 14510 .flags = GENL_UNS_ADMIN_PERM, 14511 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14512 NL80211_FLAG_NEED_RTNL, 14513 }, 14514 { 14515 .cmd = NL80211_CMD_START_NAN, 14516 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14517 .doit = nl80211_start_nan, 14518 .flags = GENL_ADMIN_PERM, 14519 .internal_flags = NL80211_FLAG_NEED_WDEV | 14520 NL80211_FLAG_NEED_RTNL, 14521 }, 14522 { 14523 .cmd = NL80211_CMD_STOP_NAN, 14524 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14525 .doit = nl80211_stop_nan, 14526 .flags = GENL_ADMIN_PERM, 14527 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14528 NL80211_FLAG_NEED_RTNL, 14529 }, 14530 { 14531 .cmd = NL80211_CMD_ADD_NAN_FUNCTION, 14532 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14533 .doit = nl80211_nan_add_func, 14534 .flags = GENL_ADMIN_PERM, 14535 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14536 NL80211_FLAG_NEED_RTNL, 14537 }, 14538 { 14539 .cmd = NL80211_CMD_DEL_NAN_FUNCTION, 14540 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14541 .doit = nl80211_nan_del_func, 14542 .flags = GENL_ADMIN_PERM, 14543 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14544 NL80211_FLAG_NEED_RTNL, 14545 }, 14546 { 14547 .cmd = NL80211_CMD_CHANGE_NAN_CONFIG, 14548 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14549 .doit = nl80211_nan_change_config, 14550 .flags = GENL_ADMIN_PERM, 14551 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14552 NL80211_FLAG_NEED_RTNL, 14553 }, 14554 { 14555 .cmd = NL80211_CMD_SET_MCAST_RATE, 14556 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14557 .doit = nl80211_set_mcast_rate, 14558 .flags = GENL_UNS_ADMIN_PERM, 14559 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14560 NL80211_FLAG_NEED_RTNL, 14561 }, 14562 { 14563 .cmd = NL80211_CMD_SET_MAC_ACL, 14564 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14565 .doit = nl80211_set_mac_acl, 14566 .flags = GENL_UNS_ADMIN_PERM, 14567 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14568 NL80211_FLAG_NEED_RTNL, 14569 }, 14570 { 14571 .cmd = NL80211_CMD_RADAR_DETECT, 14572 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14573 .doit = nl80211_start_radar_detection, 14574 .flags = GENL_UNS_ADMIN_PERM, 14575 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14576 NL80211_FLAG_NEED_RTNL, 14577 }, 14578 { 14579 .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES, 14580 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14581 .doit = nl80211_get_protocol_features, 14582 }, 14583 { 14584 .cmd = NL80211_CMD_UPDATE_FT_IES, 14585 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14586 .doit = nl80211_update_ft_ies, 14587 .flags = GENL_UNS_ADMIN_PERM, 14588 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14589 NL80211_FLAG_NEED_RTNL, 14590 }, 14591 { 14592 .cmd = NL80211_CMD_CRIT_PROTOCOL_START, 14593 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14594 .doit = nl80211_crit_protocol_start, 14595 .flags = GENL_UNS_ADMIN_PERM, 14596 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14597 NL80211_FLAG_NEED_RTNL, 14598 }, 14599 { 14600 .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP, 14601 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14602 .doit = nl80211_crit_protocol_stop, 14603 .flags = GENL_UNS_ADMIN_PERM, 14604 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14605 NL80211_FLAG_NEED_RTNL, 14606 }, 14607 { 14608 .cmd = NL80211_CMD_GET_COALESCE, 14609 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14610 .doit = nl80211_get_coalesce, 14611 .internal_flags = NL80211_FLAG_NEED_WIPHY | 14612 NL80211_FLAG_NEED_RTNL, 14613 }, 14614 { 14615 .cmd = NL80211_CMD_SET_COALESCE, 14616 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14617 .doit = nl80211_set_coalesce, 14618 .flags = GENL_UNS_ADMIN_PERM, 14619 .internal_flags = NL80211_FLAG_NEED_WIPHY | 14620 NL80211_FLAG_NEED_RTNL, 14621 }, 14622 { 14623 .cmd = NL80211_CMD_CHANNEL_SWITCH, 14624 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14625 .doit = nl80211_channel_switch, 14626 .flags = GENL_UNS_ADMIN_PERM, 14627 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14628 NL80211_FLAG_NEED_RTNL, 14629 }, 14630 { 14631 .cmd = NL80211_CMD_VENDOR, 14632 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14633 .doit = nl80211_vendor_cmd, 14634 .dumpit = nl80211_vendor_cmd_dump, 14635 .flags = GENL_UNS_ADMIN_PERM, 14636 .internal_flags = NL80211_FLAG_NEED_WIPHY | 14637 NL80211_FLAG_NEED_RTNL | 14638 NL80211_FLAG_CLEAR_SKB, 14639 }, 14640 { 14641 .cmd = NL80211_CMD_SET_QOS_MAP, 14642 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14643 .doit = nl80211_set_qos_map, 14644 .flags = GENL_UNS_ADMIN_PERM, 14645 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14646 NL80211_FLAG_NEED_RTNL, 14647 }, 14648 { 14649 .cmd = NL80211_CMD_ADD_TX_TS, 14650 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14651 .doit = nl80211_add_tx_ts, 14652 .flags = GENL_UNS_ADMIN_PERM, 14653 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14654 NL80211_FLAG_NEED_RTNL, 14655 }, 14656 { 14657 .cmd = NL80211_CMD_DEL_TX_TS, 14658 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14659 .doit = nl80211_del_tx_ts, 14660 .flags = GENL_UNS_ADMIN_PERM, 14661 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14662 NL80211_FLAG_NEED_RTNL, 14663 }, 14664 { 14665 .cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH, 14666 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14667 .doit = nl80211_tdls_channel_switch, 14668 .flags = GENL_UNS_ADMIN_PERM, 14669 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14670 NL80211_FLAG_NEED_RTNL, 14671 }, 14672 { 14673 .cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, 14674 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14675 .doit = nl80211_tdls_cancel_channel_switch, 14676 .flags = GENL_UNS_ADMIN_PERM, 14677 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14678 NL80211_FLAG_NEED_RTNL, 14679 }, 14680 { 14681 .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST, 14682 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14683 .doit = nl80211_set_multicast_to_unicast, 14684 .flags = GENL_UNS_ADMIN_PERM, 14685 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14686 NL80211_FLAG_NEED_RTNL, 14687 }, 14688 { 14689 .cmd = NL80211_CMD_SET_PMK, 14690 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14691 .doit = nl80211_set_pmk, 14692 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14693 NL80211_FLAG_NEED_RTNL | 14694 NL80211_FLAG_CLEAR_SKB, 14695 }, 14696 { 14697 .cmd = NL80211_CMD_DEL_PMK, 14698 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14699 .doit = nl80211_del_pmk, 14700 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14701 NL80211_FLAG_NEED_RTNL, 14702 }, 14703 { 14704 .cmd = NL80211_CMD_EXTERNAL_AUTH, 14705 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14706 .doit = nl80211_external_auth, 14707 .flags = GENL_ADMIN_PERM, 14708 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14709 NL80211_FLAG_NEED_RTNL, 14710 }, 14711 { 14712 .cmd = NL80211_CMD_CONTROL_PORT_FRAME, 14713 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14714 .doit = nl80211_tx_control_port, 14715 .flags = GENL_UNS_ADMIN_PERM, 14716 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14717 NL80211_FLAG_NEED_RTNL, 14718 }, 14719 { 14720 .cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS, 14721 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14722 .doit = nl80211_get_ftm_responder_stats, 14723 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14724 NL80211_FLAG_NEED_RTNL, 14725 }, 14726 { 14727 .cmd = NL80211_CMD_PEER_MEASUREMENT_START, 14728 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14729 .doit = nl80211_pmsr_start, 14730 .flags = GENL_UNS_ADMIN_PERM, 14731 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14732 NL80211_FLAG_NEED_RTNL, 14733 }, 14734 { 14735 .cmd = NL80211_CMD_NOTIFY_RADAR, 14736 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14737 .doit = nl80211_notify_radar_detection, 14738 .flags = GENL_UNS_ADMIN_PERM, 14739 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14740 NL80211_FLAG_NEED_RTNL, 14741 }, 14742 { 14743 .cmd = NL80211_CMD_UPDATE_OWE_INFO, 14744 .doit = nl80211_update_owe_info, 14745 .flags = GENL_ADMIN_PERM, 14746 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14747 NL80211_FLAG_NEED_RTNL, 14748 }, 14749 { 14750 .cmd = NL80211_CMD_PROBE_MESH_LINK, 14751 .doit = nl80211_probe_mesh_link, 14752 .flags = GENL_UNS_ADMIN_PERM, 14753 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14754 NL80211_FLAG_NEED_RTNL, 14755 }, 14756 }; 14757 14758 static struct genl_family nl80211_fam __ro_after_init = { 14759 .name = NL80211_GENL_NAME, /* have users key off the name instead */ 14760 .hdrsize = 0, /* no private header */ 14761 .version = 1, /* no particular meaning now */ 14762 .maxattr = NL80211_ATTR_MAX, 14763 .policy = nl80211_policy, 14764 .netnsok = true, 14765 .pre_doit = nl80211_pre_doit, 14766 .post_doit = nl80211_post_doit, 14767 .module = THIS_MODULE, 14768 .ops = nl80211_ops, 14769 .n_ops = ARRAY_SIZE(nl80211_ops), 14770 .mcgrps = nl80211_mcgrps, 14771 .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps), 14772 .parallel_ops = true, 14773 }; 14774 14775 /* notification functions */ 14776 14777 void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev, 14778 enum nl80211_commands cmd) 14779 { 14780 struct sk_buff *msg; 14781 struct nl80211_dump_wiphy_state state = {}; 14782 14783 WARN_ON(cmd != NL80211_CMD_NEW_WIPHY && 14784 cmd != NL80211_CMD_DEL_WIPHY); 14785 14786 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14787 if (!msg) 14788 return; 14789 14790 if (nl80211_send_wiphy(rdev, cmd, msg, 0, 0, 0, &state) < 0) { 14791 nlmsg_free(msg); 14792 return; 14793 } 14794 14795 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14796 NL80211_MCGRP_CONFIG, GFP_KERNEL); 14797 } 14798 14799 void nl80211_notify_iface(struct cfg80211_registered_device *rdev, 14800 struct wireless_dev *wdev, 14801 enum nl80211_commands cmd) 14802 { 14803 struct sk_buff *msg; 14804 14805 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14806 if (!msg) 14807 return; 14808 14809 if (nl80211_send_iface(msg, 0, 0, 0, rdev, wdev, cmd) < 0) { 14810 nlmsg_free(msg); 14811 return; 14812 } 14813 14814 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14815 NL80211_MCGRP_CONFIG, GFP_KERNEL); 14816 } 14817 14818 static int nl80211_add_scan_req(struct sk_buff *msg, 14819 struct cfg80211_registered_device *rdev) 14820 { 14821 struct cfg80211_scan_request *req = rdev->scan_req; 14822 struct nlattr *nest; 14823 int i; 14824 14825 if (WARN_ON(!req)) 14826 return 0; 14827 14828 nest = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_SSIDS); 14829 if (!nest) 14830 goto nla_put_failure; 14831 for (i = 0; i < req->n_ssids; i++) { 14832 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid)) 14833 goto nla_put_failure; 14834 } 14835 nla_nest_end(msg, nest); 14836 14837 nest = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_FREQUENCIES); 14838 if (!nest) 14839 goto nla_put_failure; 14840 for (i = 0; i < req->n_channels; i++) { 14841 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) 14842 goto nla_put_failure; 14843 } 14844 nla_nest_end(msg, nest); 14845 14846 if (req->ie && 14847 nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie)) 14848 goto nla_put_failure; 14849 14850 if (req->flags && 14851 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags)) 14852 goto nla_put_failure; 14853 14854 if (req->info.scan_start_tsf && 14855 (nla_put_u64_64bit(msg, NL80211_ATTR_SCAN_START_TIME_TSF, 14856 req->info.scan_start_tsf, NL80211_BSS_PAD) || 14857 nla_put(msg, NL80211_ATTR_SCAN_START_TIME_TSF_BSSID, ETH_ALEN, 14858 req->info.tsf_bssid))) 14859 goto nla_put_failure; 14860 14861 return 0; 14862 nla_put_failure: 14863 return -ENOBUFS; 14864 } 14865 14866 static int nl80211_prep_scan_msg(struct sk_buff *msg, 14867 struct cfg80211_registered_device *rdev, 14868 struct wireless_dev *wdev, 14869 u32 portid, u32 seq, int flags, 14870 u32 cmd) 14871 { 14872 void *hdr; 14873 14874 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 14875 if (!hdr) 14876 return -1; 14877 14878 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 14879 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 14880 wdev->netdev->ifindex)) || 14881 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 14882 NL80211_ATTR_PAD)) 14883 goto nla_put_failure; 14884 14885 /* ignore errors and send incomplete event anyway */ 14886 nl80211_add_scan_req(msg, rdev); 14887 14888 genlmsg_end(msg, hdr); 14889 return 0; 14890 14891 nla_put_failure: 14892 genlmsg_cancel(msg, hdr); 14893 return -EMSGSIZE; 14894 } 14895 14896 static int 14897 nl80211_prep_sched_scan_msg(struct sk_buff *msg, 14898 struct cfg80211_sched_scan_request *req, u32 cmd) 14899 { 14900 void *hdr; 14901 14902 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 14903 if (!hdr) 14904 return -1; 14905 14906 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, 14907 wiphy_to_rdev(req->wiphy)->wiphy_idx) || 14908 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) || 14909 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid, 14910 NL80211_ATTR_PAD)) 14911 goto nla_put_failure; 14912 14913 genlmsg_end(msg, hdr); 14914 return 0; 14915 14916 nla_put_failure: 14917 genlmsg_cancel(msg, hdr); 14918 return -EMSGSIZE; 14919 } 14920 14921 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev, 14922 struct wireless_dev *wdev) 14923 { 14924 struct sk_buff *msg; 14925 14926 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14927 if (!msg) 14928 return; 14929 14930 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0, 14931 NL80211_CMD_TRIGGER_SCAN) < 0) { 14932 nlmsg_free(msg); 14933 return; 14934 } 14935 14936 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14937 NL80211_MCGRP_SCAN, GFP_KERNEL); 14938 } 14939 14940 struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev, 14941 struct wireless_dev *wdev, bool aborted) 14942 { 14943 struct sk_buff *msg; 14944 14945 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14946 if (!msg) 14947 return NULL; 14948 14949 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0, 14950 aborted ? NL80211_CMD_SCAN_ABORTED : 14951 NL80211_CMD_NEW_SCAN_RESULTS) < 0) { 14952 nlmsg_free(msg); 14953 return NULL; 14954 } 14955 14956 return msg; 14957 } 14958 14959 /* send message created by nl80211_build_scan_msg() */ 14960 void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev, 14961 struct sk_buff *msg) 14962 { 14963 if (!msg) 14964 return; 14965 14966 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14967 NL80211_MCGRP_SCAN, GFP_KERNEL); 14968 } 14969 14970 void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd) 14971 { 14972 struct sk_buff *msg; 14973 14974 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 14975 if (!msg) 14976 return; 14977 14978 if (nl80211_prep_sched_scan_msg(msg, req, cmd) < 0) { 14979 nlmsg_free(msg); 14980 return; 14981 } 14982 14983 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0, 14984 NL80211_MCGRP_SCAN, GFP_KERNEL); 14985 } 14986 14987 static bool nl80211_reg_change_event_fill(struct sk_buff *msg, 14988 struct regulatory_request *request) 14989 { 14990 /* Userspace can always count this one always being set */ 14991 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) 14992 goto nla_put_failure; 14993 14994 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { 14995 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 14996 NL80211_REGDOM_TYPE_WORLD)) 14997 goto nla_put_failure; 14998 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { 14999 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 15000 NL80211_REGDOM_TYPE_CUSTOM_WORLD)) 15001 goto nla_put_failure; 15002 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || 15003 request->intersect) { 15004 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 15005 NL80211_REGDOM_TYPE_INTERSECTION)) 15006 goto nla_put_failure; 15007 } else { 15008 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 15009 NL80211_REGDOM_TYPE_COUNTRY) || 15010 nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, 15011 request->alpha2)) 15012 goto nla_put_failure; 15013 } 15014 15015 if (request->wiphy_idx != WIPHY_IDX_INVALID) { 15016 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx); 15017 15018 if (wiphy && 15019 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) 15020 goto nla_put_failure; 15021 15022 if (wiphy && 15023 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 15024 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 15025 goto nla_put_failure; 15026 } 15027 15028 return true; 15029 15030 nla_put_failure: 15031 return false; 15032 } 15033 15034 /* 15035 * This can happen on global regulatory changes or device specific settings 15036 * based on custom regulatory domains. 15037 */ 15038 void nl80211_common_reg_change_event(enum nl80211_commands cmd_id, 15039 struct regulatory_request *request) 15040 { 15041 struct sk_buff *msg; 15042 void *hdr; 15043 15044 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 15045 if (!msg) 15046 return; 15047 15048 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd_id); 15049 if (!hdr) 15050 goto nla_put_failure; 15051 15052 if (!nl80211_reg_change_event_fill(msg, request)) 15053 goto nla_put_failure; 15054 15055 genlmsg_end(msg, hdr); 15056 15057 rcu_read_lock(); 15058 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 15059 NL80211_MCGRP_REGULATORY, GFP_ATOMIC); 15060 rcu_read_unlock(); 15061 15062 return; 15063 15064 nla_put_failure: 15065 nlmsg_free(msg); 15066 } 15067 15068 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev, 15069 struct net_device *netdev, 15070 const u8 *buf, size_t len, 15071 enum nl80211_commands cmd, gfp_t gfp, 15072 int uapsd_queues, const u8 *req_ies, 15073 size_t req_ies_len) 15074 { 15075 struct sk_buff *msg; 15076 void *hdr; 15077 15078 msg = nlmsg_new(100 + len + req_ies_len, gfp); 15079 if (!msg) 15080 return; 15081 15082 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 15083 if (!hdr) { 15084 nlmsg_free(msg); 15085 return; 15086 } 15087 15088 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15089 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 15090 nla_put(msg, NL80211_ATTR_FRAME, len, buf) || 15091 (req_ies && 15092 nla_put(msg, NL80211_ATTR_REQ_IE, req_ies_len, req_ies))) 15093 goto nla_put_failure; 15094 15095 if (uapsd_queues >= 0) { 15096 struct nlattr *nla_wmm = 15097 nla_nest_start_noflag(msg, NL80211_ATTR_STA_WME); 15098 if (!nla_wmm) 15099 goto nla_put_failure; 15100 15101 if (nla_put_u8(msg, NL80211_STA_WME_UAPSD_QUEUES, 15102 uapsd_queues)) 15103 goto nla_put_failure; 15104 15105 nla_nest_end(msg, nla_wmm); 15106 } 15107 15108 genlmsg_end(msg, hdr); 15109 15110 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15111 NL80211_MCGRP_MLME, gfp); 15112 return; 15113 15114 nla_put_failure: 15115 nlmsg_free(msg); 15116 } 15117 15118 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev, 15119 struct net_device *netdev, const u8 *buf, 15120 size_t len, gfp_t gfp) 15121 { 15122 nl80211_send_mlme_event(rdev, netdev, buf, len, 15123 NL80211_CMD_AUTHENTICATE, gfp, -1, NULL, 0); 15124 } 15125 15126 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev, 15127 struct net_device *netdev, const u8 *buf, 15128 size_t len, gfp_t gfp, int uapsd_queues, 15129 const u8 *req_ies, size_t req_ies_len) 15130 { 15131 nl80211_send_mlme_event(rdev, netdev, buf, len, 15132 NL80211_CMD_ASSOCIATE, gfp, uapsd_queues, 15133 req_ies, req_ies_len); 15134 } 15135 15136 void nl80211_send_deauth(struct cfg80211_registered_device *rdev, 15137 struct net_device *netdev, const u8 *buf, 15138 size_t len, gfp_t gfp) 15139 { 15140 nl80211_send_mlme_event(rdev, netdev, buf, len, 15141 NL80211_CMD_DEAUTHENTICATE, gfp, -1, NULL, 0); 15142 } 15143 15144 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev, 15145 struct net_device *netdev, const u8 *buf, 15146 size_t len, gfp_t gfp) 15147 { 15148 nl80211_send_mlme_event(rdev, netdev, buf, len, 15149 NL80211_CMD_DISASSOCIATE, gfp, -1, NULL, 0); 15150 } 15151 15152 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf, 15153 size_t len) 15154 { 15155 struct wireless_dev *wdev = dev->ieee80211_ptr; 15156 struct wiphy *wiphy = wdev->wiphy; 15157 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 15158 const struct ieee80211_mgmt *mgmt = (void *)buf; 15159 u32 cmd; 15160 15161 if (WARN_ON(len < 2)) 15162 return; 15163 15164 if (ieee80211_is_deauth(mgmt->frame_control)) 15165 cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE; 15166 else 15167 cmd = NL80211_CMD_UNPROT_DISASSOCIATE; 15168 15169 trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len); 15170 nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC, -1, 15171 NULL, 0); 15172 } 15173 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt); 15174 15175 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev, 15176 struct net_device *netdev, int cmd, 15177 const u8 *addr, gfp_t gfp) 15178 { 15179 struct sk_buff *msg; 15180 void *hdr; 15181 15182 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 15183 if (!msg) 15184 return; 15185 15186 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 15187 if (!hdr) { 15188 nlmsg_free(msg); 15189 return; 15190 } 15191 15192 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15193 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 15194 nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 15195 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) 15196 goto nla_put_failure; 15197 15198 genlmsg_end(msg, hdr); 15199 15200 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15201 NL80211_MCGRP_MLME, gfp); 15202 return; 15203 15204 nla_put_failure: 15205 nlmsg_free(msg); 15206 } 15207 15208 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev, 15209 struct net_device *netdev, const u8 *addr, 15210 gfp_t gfp) 15211 { 15212 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE, 15213 addr, gfp); 15214 } 15215 15216 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev, 15217 struct net_device *netdev, const u8 *addr, 15218 gfp_t gfp) 15219 { 15220 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE, 15221 addr, gfp); 15222 } 15223 15224 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev, 15225 struct net_device *netdev, 15226 struct cfg80211_connect_resp_params *cr, 15227 gfp_t gfp) 15228 { 15229 struct sk_buff *msg; 15230 void *hdr; 15231 15232 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len + 15233 cr->fils.kek_len + cr->fils.pmk_len + 15234 (cr->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp); 15235 if (!msg) 15236 return; 15237 15238 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT); 15239 if (!hdr) { 15240 nlmsg_free(msg); 15241 return; 15242 } 15243 15244 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15245 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 15246 (cr->bssid && 15247 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cr->bssid)) || 15248 nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, 15249 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE : 15250 cr->status) || 15251 (cr->status < 0 && 15252 (nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 15253 nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON, 15254 cr->timeout_reason))) || 15255 (cr->req_ie && 15256 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) || 15257 (cr->resp_ie && 15258 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len, 15259 cr->resp_ie)) || 15260 (cr->fils.update_erp_next_seq_num && 15261 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM, 15262 cr->fils.erp_next_seq_num)) || 15263 (cr->status == WLAN_STATUS_SUCCESS && 15264 ((cr->fils.kek && 15265 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len, 15266 cr->fils.kek)) || 15267 (cr->fils.pmk && 15268 nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) || 15269 (cr->fils.pmkid && 15270 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid))))) 15271 goto nla_put_failure; 15272 15273 genlmsg_end(msg, hdr); 15274 15275 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15276 NL80211_MCGRP_MLME, gfp); 15277 return; 15278 15279 nla_put_failure: 15280 nlmsg_free(msg); 15281 } 15282 15283 void nl80211_send_roamed(struct cfg80211_registered_device *rdev, 15284 struct net_device *netdev, 15285 struct cfg80211_roam_info *info, gfp_t gfp) 15286 { 15287 struct sk_buff *msg; 15288 void *hdr; 15289 const u8 *bssid = info->bss ? info->bss->bssid : info->bssid; 15290 15291 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len + 15292 info->fils.kek_len + info->fils.pmk_len + 15293 (info->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp); 15294 if (!msg) 15295 return; 15296 15297 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM); 15298 if (!hdr) { 15299 nlmsg_free(msg); 15300 return; 15301 } 15302 15303 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15304 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 15305 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid) || 15306 (info->req_ie && 15307 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len, 15308 info->req_ie)) || 15309 (info->resp_ie && 15310 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len, 15311 info->resp_ie)) || 15312 (info->fils.update_erp_next_seq_num && 15313 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM, 15314 info->fils.erp_next_seq_num)) || 15315 (info->fils.kek && 15316 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len, 15317 info->fils.kek)) || 15318 (info->fils.pmk && 15319 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) || 15320 (info->fils.pmkid && 15321 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid))) 15322 goto nla_put_failure; 15323 15324 genlmsg_end(msg, hdr); 15325 15326 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15327 NL80211_MCGRP_MLME, gfp); 15328 return; 15329 15330 nla_put_failure: 15331 nlmsg_free(msg); 15332 } 15333 15334 void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev, 15335 struct net_device *netdev, const u8 *bssid) 15336 { 15337 struct sk_buff *msg; 15338 void *hdr; 15339 15340 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 15341 if (!msg) 15342 return; 15343 15344 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PORT_AUTHORIZED); 15345 if (!hdr) { 15346 nlmsg_free(msg); 15347 return; 15348 } 15349 15350 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15351 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 15352 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 15353 goto nla_put_failure; 15354 15355 genlmsg_end(msg, hdr); 15356 15357 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15358 NL80211_MCGRP_MLME, GFP_KERNEL); 15359 return; 15360 15361 nla_put_failure: 15362 nlmsg_free(msg); 15363 } 15364 15365 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev, 15366 struct net_device *netdev, u16 reason, 15367 const u8 *ie, size_t ie_len, bool from_ap) 15368 { 15369 struct sk_buff *msg; 15370 void *hdr; 15371 15372 msg = nlmsg_new(100 + ie_len, GFP_KERNEL); 15373 if (!msg) 15374 return; 15375 15376 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT); 15377 if (!hdr) { 15378 nlmsg_free(msg); 15379 return; 15380 } 15381 15382 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15383 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 15384 (reason && 15385 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) || 15386 (from_ap && 15387 nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) || 15388 (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie))) 15389 goto nla_put_failure; 15390 15391 genlmsg_end(msg, hdr); 15392 15393 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15394 NL80211_MCGRP_MLME, GFP_KERNEL); 15395 return; 15396 15397 nla_put_failure: 15398 nlmsg_free(msg); 15399 } 15400 15401 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev, 15402 struct net_device *netdev, const u8 *bssid, 15403 gfp_t gfp) 15404 { 15405 struct sk_buff *msg; 15406 void *hdr; 15407 15408 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 15409 if (!msg) 15410 return; 15411 15412 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS); 15413 if (!hdr) { 15414 nlmsg_free(msg); 15415 return; 15416 } 15417 15418 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15419 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 15420 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 15421 goto nla_put_failure; 15422 15423 genlmsg_end(msg, hdr); 15424 15425 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15426 NL80211_MCGRP_MLME, gfp); 15427 return; 15428 15429 nla_put_failure: 15430 nlmsg_free(msg); 15431 } 15432 15433 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr, 15434 const u8 *ie, u8 ie_len, 15435 int sig_dbm, gfp_t gfp) 15436 { 15437 struct wireless_dev *wdev = dev->ieee80211_ptr; 15438 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 15439 struct sk_buff *msg; 15440 void *hdr; 15441 15442 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) 15443 return; 15444 15445 trace_cfg80211_notify_new_peer_candidate(dev, addr); 15446 15447 msg = nlmsg_new(100 + ie_len, gfp); 15448 if (!msg) 15449 return; 15450 15451 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE); 15452 if (!hdr) { 15453 nlmsg_free(msg); 15454 return; 15455 } 15456 15457 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15458 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 15459 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 15460 (ie_len && ie && 15461 nla_put(msg, NL80211_ATTR_IE, ie_len, ie)) || 15462 (sig_dbm && 15463 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm))) 15464 goto nla_put_failure; 15465 15466 genlmsg_end(msg, hdr); 15467 15468 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15469 NL80211_MCGRP_MLME, gfp); 15470 return; 15471 15472 nla_put_failure: 15473 nlmsg_free(msg); 15474 } 15475 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate); 15476 15477 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev, 15478 struct net_device *netdev, const u8 *addr, 15479 enum nl80211_key_type key_type, int key_id, 15480 const u8 *tsc, gfp_t gfp) 15481 { 15482 struct sk_buff *msg; 15483 void *hdr; 15484 15485 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 15486 if (!msg) 15487 return; 15488 15489 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE); 15490 if (!hdr) { 15491 nlmsg_free(msg); 15492 return; 15493 } 15494 15495 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15496 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 15497 (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) || 15498 nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) || 15499 (key_id != -1 && 15500 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) || 15501 (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc))) 15502 goto nla_put_failure; 15503 15504 genlmsg_end(msg, hdr); 15505 15506 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15507 NL80211_MCGRP_MLME, gfp); 15508 return; 15509 15510 nla_put_failure: 15511 nlmsg_free(msg); 15512 } 15513 15514 void nl80211_send_beacon_hint_event(struct wiphy *wiphy, 15515 struct ieee80211_channel *channel_before, 15516 struct ieee80211_channel *channel_after) 15517 { 15518 struct sk_buff *msg; 15519 void *hdr; 15520 struct nlattr *nl_freq; 15521 15522 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); 15523 if (!msg) 15524 return; 15525 15526 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT); 15527 if (!hdr) { 15528 nlmsg_free(msg); 15529 return; 15530 } 15531 15532 /* 15533 * Since we are applying the beacon hint to a wiphy we know its 15534 * wiphy_idx is valid 15535 */ 15536 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 15537 goto nla_put_failure; 15538 15539 /* Before */ 15540 nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_BEFORE); 15541 if (!nl_freq) 15542 goto nla_put_failure; 15543 15544 if (nl80211_msg_put_channel(msg, wiphy, channel_before, false)) 15545 goto nla_put_failure; 15546 nla_nest_end(msg, nl_freq); 15547 15548 /* After */ 15549 nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_AFTER); 15550 if (!nl_freq) 15551 goto nla_put_failure; 15552 15553 if (nl80211_msg_put_channel(msg, wiphy, channel_after, false)) 15554 goto nla_put_failure; 15555 nla_nest_end(msg, nl_freq); 15556 15557 genlmsg_end(msg, hdr); 15558 15559 rcu_read_lock(); 15560 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 15561 NL80211_MCGRP_REGULATORY, GFP_ATOMIC); 15562 rcu_read_unlock(); 15563 15564 return; 15565 15566 nla_put_failure: 15567 nlmsg_free(msg); 15568 } 15569 15570 static void nl80211_send_remain_on_chan_event( 15571 int cmd, struct cfg80211_registered_device *rdev, 15572 struct wireless_dev *wdev, u64 cookie, 15573 struct ieee80211_channel *chan, 15574 unsigned int duration, gfp_t gfp) 15575 { 15576 struct sk_buff *msg; 15577 void *hdr; 15578 15579 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 15580 if (!msg) 15581 return; 15582 15583 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 15584 if (!hdr) { 15585 nlmsg_free(msg); 15586 return; 15587 } 15588 15589 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15590 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 15591 wdev->netdev->ifindex)) || 15592 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 15593 NL80211_ATTR_PAD) || 15594 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || 15595 nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 15596 NL80211_CHAN_NO_HT) || 15597 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 15598 NL80211_ATTR_PAD)) 15599 goto nla_put_failure; 15600 15601 if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL && 15602 nla_put_u32(msg, NL80211_ATTR_DURATION, duration)) 15603 goto nla_put_failure; 15604 15605 genlmsg_end(msg, hdr); 15606 15607 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15608 NL80211_MCGRP_MLME, gfp); 15609 return; 15610 15611 nla_put_failure: 15612 nlmsg_free(msg); 15613 } 15614 15615 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie, 15616 struct ieee80211_channel *chan, 15617 unsigned int duration, gfp_t gfp) 15618 { 15619 struct wiphy *wiphy = wdev->wiphy; 15620 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 15621 15622 trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration); 15623 nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL, 15624 rdev, wdev, cookie, chan, 15625 duration, gfp); 15626 } 15627 EXPORT_SYMBOL(cfg80211_ready_on_channel); 15628 15629 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie, 15630 struct ieee80211_channel *chan, 15631 gfp_t gfp) 15632 { 15633 struct wiphy *wiphy = wdev->wiphy; 15634 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 15635 15636 trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan); 15637 nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 15638 rdev, wdev, cookie, chan, 0, gfp); 15639 } 15640 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired); 15641 15642 void cfg80211_tx_mgmt_expired(struct wireless_dev *wdev, u64 cookie, 15643 struct ieee80211_channel *chan, 15644 gfp_t gfp) 15645 { 15646 struct wiphy *wiphy = wdev->wiphy; 15647 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 15648 15649 trace_cfg80211_tx_mgmt_expired(wdev, cookie, chan); 15650 nl80211_send_remain_on_chan_event(NL80211_CMD_FRAME_WAIT_CANCEL, 15651 rdev, wdev, cookie, chan, 0, gfp); 15652 } 15653 EXPORT_SYMBOL(cfg80211_tx_mgmt_expired); 15654 15655 void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr, 15656 struct station_info *sinfo, gfp_t gfp) 15657 { 15658 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 15659 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 15660 struct sk_buff *msg; 15661 15662 trace_cfg80211_new_sta(dev, mac_addr, sinfo); 15663 15664 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 15665 if (!msg) 15666 return; 15667 15668 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 0, 0, 0, 15669 rdev, dev, mac_addr, sinfo) < 0) { 15670 nlmsg_free(msg); 15671 return; 15672 } 15673 15674 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15675 NL80211_MCGRP_MLME, gfp); 15676 } 15677 EXPORT_SYMBOL(cfg80211_new_sta); 15678 15679 void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr, 15680 struct station_info *sinfo, gfp_t gfp) 15681 { 15682 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 15683 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 15684 struct sk_buff *msg; 15685 struct station_info empty_sinfo = {}; 15686 15687 if (!sinfo) 15688 sinfo = &empty_sinfo; 15689 15690 trace_cfg80211_del_sta(dev, mac_addr); 15691 15692 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 15693 if (!msg) { 15694 cfg80211_sinfo_release_content(sinfo); 15695 return; 15696 } 15697 15698 if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0, 15699 rdev, dev, mac_addr, sinfo) < 0) { 15700 nlmsg_free(msg); 15701 return; 15702 } 15703 15704 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15705 NL80211_MCGRP_MLME, gfp); 15706 } 15707 EXPORT_SYMBOL(cfg80211_del_sta_sinfo); 15708 15709 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr, 15710 enum nl80211_connect_failed_reason reason, 15711 gfp_t gfp) 15712 { 15713 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 15714 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 15715 struct sk_buff *msg; 15716 void *hdr; 15717 15718 msg = nlmsg_new(NLMSG_GOODSIZE, gfp); 15719 if (!msg) 15720 return; 15721 15722 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED); 15723 if (!hdr) { 15724 nlmsg_free(msg); 15725 return; 15726 } 15727 15728 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 15729 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 15730 nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason)) 15731 goto nla_put_failure; 15732 15733 genlmsg_end(msg, hdr); 15734 15735 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15736 NL80211_MCGRP_MLME, gfp); 15737 return; 15738 15739 nla_put_failure: 15740 nlmsg_free(msg); 15741 } 15742 EXPORT_SYMBOL(cfg80211_conn_failed); 15743 15744 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd, 15745 const u8 *addr, gfp_t gfp) 15746 { 15747 struct wireless_dev *wdev = dev->ieee80211_ptr; 15748 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 15749 struct sk_buff *msg; 15750 void *hdr; 15751 u32 nlportid = READ_ONCE(wdev->ap_unexpected_nlportid); 15752 15753 if (!nlportid) 15754 return false; 15755 15756 msg = nlmsg_new(100, gfp); 15757 if (!msg) 15758 return true; 15759 15760 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 15761 if (!hdr) { 15762 nlmsg_free(msg); 15763 return true; 15764 } 15765 15766 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15767 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 15768 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) 15769 goto nla_put_failure; 15770 15771 genlmsg_end(msg, hdr); 15772 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 15773 return true; 15774 15775 nla_put_failure: 15776 nlmsg_free(msg); 15777 return true; 15778 } 15779 15780 bool cfg80211_rx_spurious_frame(struct net_device *dev, 15781 const u8 *addr, gfp_t gfp) 15782 { 15783 struct wireless_dev *wdev = dev->ieee80211_ptr; 15784 bool ret; 15785 15786 trace_cfg80211_rx_spurious_frame(dev, addr); 15787 15788 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 15789 wdev->iftype != NL80211_IFTYPE_P2P_GO)) { 15790 trace_cfg80211_return_bool(false); 15791 return false; 15792 } 15793 ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME, 15794 addr, gfp); 15795 trace_cfg80211_return_bool(ret); 15796 return ret; 15797 } 15798 EXPORT_SYMBOL(cfg80211_rx_spurious_frame); 15799 15800 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev, 15801 const u8 *addr, gfp_t gfp) 15802 { 15803 struct wireless_dev *wdev = dev->ieee80211_ptr; 15804 bool ret; 15805 15806 trace_cfg80211_rx_unexpected_4addr_frame(dev, addr); 15807 15808 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 15809 wdev->iftype != NL80211_IFTYPE_P2P_GO && 15810 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { 15811 trace_cfg80211_return_bool(false); 15812 return false; 15813 } 15814 ret = __nl80211_unexpected_frame(dev, 15815 NL80211_CMD_UNEXPECTED_4ADDR_FRAME, 15816 addr, gfp); 15817 trace_cfg80211_return_bool(ret); 15818 return ret; 15819 } 15820 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame); 15821 15822 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, 15823 struct wireless_dev *wdev, u32 nlportid, 15824 int freq, int sig_dbm, 15825 const u8 *buf, size_t len, u32 flags, gfp_t gfp) 15826 { 15827 struct net_device *netdev = wdev->netdev; 15828 struct sk_buff *msg; 15829 void *hdr; 15830 15831 msg = nlmsg_new(100 + len, gfp); 15832 if (!msg) 15833 return -ENOMEM; 15834 15835 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 15836 if (!hdr) { 15837 nlmsg_free(msg); 15838 return -ENOMEM; 15839 } 15840 15841 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15842 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 15843 netdev->ifindex)) || 15844 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 15845 NL80211_ATTR_PAD) || 15846 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) || 15847 (sig_dbm && 15848 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) || 15849 nla_put(msg, NL80211_ATTR_FRAME, len, buf) || 15850 (flags && 15851 nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, flags))) 15852 goto nla_put_failure; 15853 15854 genlmsg_end(msg, hdr); 15855 15856 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 15857 15858 nla_put_failure: 15859 nlmsg_free(msg); 15860 return -ENOBUFS; 15861 } 15862 15863 void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie, 15864 const u8 *buf, size_t len, bool ack, gfp_t gfp) 15865 { 15866 struct wiphy *wiphy = wdev->wiphy; 15867 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 15868 struct net_device *netdev = wdev->netdev; 15869 struct sk_buff *msg; 15870 void *hdr; 15871 15872 trace_cfg80211_mgmt_tx_status(wdev, cookie, ack); 15873 15874 msg = nlmsg_new(100 + len, gfp); 15875 if (!msg) 15876 return; 15877 15878 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME_TX_STATUS); 15879 if (!hdr) { 15880 nlmsg_free(msg); 15881 return; 15882 } 15883 15884 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15885 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 15886 netdev->ifindex)) || 15887 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 15888 NL80211_ATTR_PAD) || 15889 nla_put(msg, NL80211_ATTR_FRAME, len, buf) || 15890 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 15891 NL80211_ATTR_PAD) || 15892 (ack && nla_put_flag(msg, NL80211_ATTR_ACK))) 15893 goto nla_put_failure; 15894 15895 genlmsg_end(msg, hdr); 15896 15897 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15898 NL80211_MCGRP_MLME, gfp); 15899 return; 15900 15901 nla_put_failure: 15902 nlmsg_free(msg); 15903 } 15904 EXPORT_SYMBOL(cfg80211_mgmt_tx_status); 15905 15906 static int __nl80211_rx_control_port(struct net_device *dev, 15907 struct sk_buff *skb, 15908 bool unencrypted, gfp_t gfp) 15909 { 15910 struct wireless_dev *wdev = dev->ieee80211_ptr; 15911 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 15912 struct ethhdr *ehdr = eth_hdr(skb); 15913 const u8 *addr = ehdr->h_source; 15914 u16 proto = be16_to_cpu(skb->protocol); 15915 struct sk_buff *msg; 15916 void *hdr; 15917 struct nlattr *frame; 15918 15919 u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); 15920 15921 if (!nlportid) 15922 return -ENOENT; 15923 15924 msg = nlmsg_new(100 + skb->len, gfp); 15925 if (!msg) 15926 return -ENOMEM; 15927 15928 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONTROL_PORT_FRAME); 15929 if (!hdr) { 15930 nlmsg_free(msg); 15931 return -ENOBUFS; 15932 } 15933 15934 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15935 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 15936 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 15937 NL80211_ATTR_PAD) || 15938 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 15939 nla_put_u16(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE, proto) || 15940 (unencrypted && nla_put_flag(msg, 15941 NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT))) 15942 goto nla_put_failure; 15943 15944 frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len); 15945 if (!frame) 15946 goto nla_put_failure; 15947 15948 skb_copy_bits(skb, 0, nla_data(frame), skb->len); 15949 genlmsg_end(msg, hdr); 15950 15951 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 15952 15953 nla_put_failure: 15954 nlmsg_free(msg); 15955 return -ENOBUFS; 15956 } 15957 15958 bool cfg80211_rx_control_port(struct net_device *dev, 15959 struct sk_buff *skb, bool unencrypted) 15960 { 15961 int ret; 15962 15963 trace_cfg80211_rx_control_port(dev, skb, unencrypted); 15964 ret = __nl80211_rx_control_port(dev, skb, unencrypted, GFP_ATOMIC); 15965 trace_cfg80211_return_bool(ret == 0); 15966 return ret == 0; 15967 } 15968 EXPORT_SYMBOL(cfg80211_rx_control_port); 15969 15970 static struct sk_buff *cfg80211_prepare_cqm(struct net_device *dev, 15971 const char *mac, gfp_t gfp) 15972 { 15973 struct wireless_dev *wdev = dev->ieee80211_ptr; 15974 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 15975 struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 15976 void **cb; 15977 15978 if (!msg) 15979 return NULL; 15980 15981 cb = (void **)msg->cb; 15982 15983 cb[0] = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM); 15984 if (!cb[0]) { 15985 nlmsg_free(msg); 15986 return NULL; 15987 } 15988 15989 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15990 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 15991 goto nla_put_failure; 15992 15993 if (mac && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac)) 15994 goto nla_put_failure; 15995 15996 cb[1] = nla_nest_start_noflag(msg, NL80211_ATTR_CQM); 15997 if (!cb[1]) 15998 goto nla_put_failure; 15999 16000 cb[2] = rdev; 16001 16002 return msg; 16003 nla_put_failure: 16004 nlmsg_free(msg); 16005 return NULL; 16006 } 16007 16008 static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp) 16009 { 16010 void **cb = (void **)msg->cb; 16011 struct cfg80211_registered_device *rdev = cb[2]; 16012 16013 nla_nest_end(msg, cb[1]); 16014 genlmsg_end(msg, cb[0]); 16015 16016 memset(msg->cb, 0, sizeof(msg->cb)); 16017 16018 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16019 NL80211_MCGRP_MLME, gfp); 16020 } 16021 16022 void cfg80211_cqm_rssi_notify(struct net_device *dev, 16023 enum nl80211_cqm_rssi_threshold_event rssi_event, 16024 s32 rssi_level, gfp_t gfp) 16025 { 16026 struct sk_buff *msg; 16027 struct wireless_dev *wdev = dev->ieee80211_ptr; 16028 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 16029 16030 trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level); 16031 16032 if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW && 16033 rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH)) 16034 return; 16035 16036 if (wdev->cqm_config) { 16037 wdev->cqm_config->last_rssi_event_value = rssi_level; 16038 16039 cfg80211_cqm_rssi_update(rdev, dev); 16040 16041 if (rssi_level == 0) 16042 rssi_level = wdev->cqm_config->last_rssi_event_value; 16043 } 16044 16045 msg = cfg80211_prepare_cqm(dev, NULL, gfp); 16046 if (!msg) 16047 return; 16048 16049 if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT, 16050 rssi_event)) 16051 goto nla_put_failure; 16052 16053 if (rssi_level && nla_put_s32(msg, NL80211_ATTR_CQM_RSSI_LEVEL, 16054 rssi_level)) 16055 goto nla_put_failure; 16056 16057 cfg80211_send_cqm(msg, gfp); 16058 16059 return; 16060 16061 nla_put_failure: 16062 nlmsg_free(msg); 16063 } 16064 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify); 16065 16066 void cfg80211_cqm_txe_notify(struct net_device *dev, 16067 const u8 *peer, u32 num_packets, 16068 u32 rate, u32 intvl, gfp_t gfp) 16069 { 16070 struct sk_buff *msg; 16071 16072 msg = cfg80211_prepare_cqm(dev, peer, gfp); 16073 if (!msg) 16074 return; 16075 16076 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets)) 16077 goto nla_put_failure; 16078 16079 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate)) 16080 goto nla_put_failure; 16081 16082 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl)) 16083 goto nla_put_failure; 16084 16085 cfg80211_send_cqm(msg, gfp); 16086 return; 16087 16088 nla_put_failure: 16089 nlmsg_free(msg); 16090 } 16091 EXPORT_SYMBOL(cfg80211_cqm_txe_notify); 16092 16093 void cfg80211_cqm_pktloss_notify(struct net_device *dev, 16094 const u8 *peer, u32 num_packets, gfp_t gfp) 16095 { 16096 struct sk_buff *msg; 16097 16098 trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets); 16099 16100 msg = cfg80211_prepare_cqm(dev, peer, gfp); 16101 if (!msg) 16102 return; 16103 16104 if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets)) 16105 goto nla_put_failure; 16106 16107 cfg80211_send_cqm(msg, gfp); 16108 return; 16109 16110 nla_put_failure: 16111 nlmsg_free(msg); 16112 } 16113 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify); 16114 16115 void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp) 16116 { 16117 struct sk_buff *msg; 16118 16119 msg = cfg80211_prepare_cqm(dev, NULL, gfp); 16120 if (!msg) 16121 return; 16122 16123 if (nla_put_flag(msg, NL80211_ATTR_CQM_BEACON_LOSS_EVENT)) 16124 goto nla_put_failure; 16125 16126 cfg80211_send_cqm(msg, gfp); 16127 return; 16128 16129 nla_put_failure: 16130 nlmsg_free(msg); 16131 } 16132 EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify); 16133 16134 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev, 16135 struct net_device *netdev, const u8 *bssid, 16136 const u8 *replay_ctr, gfp_t gfp) 16137 { 16138 struct sk_buff *msg; 16139 struct nlattr *rekey_attr; 16140 void *hdr; 16141 16142 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16143 if (!msg) 16144 return; 16145 16146 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD); 16147 if (!hdr) { 16148 nlmsg_free(msg); 16149 return; 16150 } 16151 16152 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16153 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 16154 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 16155 goto nla_put_failure; 16156 16157 rekey_attr = nla_nest_start_noflag(msg, NL80211_ATTR_REKEY_DATA); 16158 if (!rekey_attr) 16159 goto nla_put_failure; 16160 16161 if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR, 16162 NL80211_REPLAY_CTR_LEN, replay_ctr)) 16163 goto nla_put_failure; 16164 16165 nla_nest_end(msg, rekey_attr); 16166 16167 genlmsg_end(msg, hdr); 16168 16169 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16170 NL80211_MCGRP_MLME, gfp); 16171 return; 16172 16173 nla_put_failure: 16174 nlmsg_free(msg); 16175 } 16176 16177 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid, 16178 const u8 *replay_ctr, gfp_t gfp) 16179 { 16180 struct wireless_dev *wdev = dev->ieee80211_ptr; 16181 struct wiphy *wiphy = wdev->wiphy; 16182 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16183 16184 trace_cfg80211_gtk_rekey_notify(dev, bssid); 16185 nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp); 16186 } 16187 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify); 16188 16189 static void 16190 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev, 16191 struct net_device *netdev, int index, 16192 const u8 *bssid, bool preauth, gfp_t gfp) 16193 { 16194 struct sk_buff *msg; 16195 struct nlattr *attr; 16196 void *hdr; 16197 16198 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16199 if (!msg) 16200 return; 16201 16202 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE); 16203 if (!hdr) { 16204 nlmsg_free(msg); 16205 return; 16206 } 16207 16208 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16209 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 16210 goto nla_put_failure; 16211 16212 attr = nla_nest_start_noflag(msg, NL80211_ATTR_PMKSA_CANDIDATE); 16213 if (!attr) 16214 goto nla_put_failure; 16215 16216 if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) || 16217 nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) || 16218 (preauth && 16219 nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH))) 16220 goto nla_put_failure; 16221 16222 nla_nest_end(msg, attr); 16223 16224 genlmsg_end(msg, hdr); 16225 16226 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16227 NL80211_MCGRP_MLME, gfp); 16228 return; 16229 16230 nla_put_failure: 16231 nlmsg_free(msg); 16232 } 16233 16234 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index, 16235 const u8 *bssid, bool preauth, gfp_t gfp) 16236 { 16237 struct wireless_dev *wdev = dev->ieee80211_ptr; 16238 struct wiphy *wiphy = wdev->wiphy; 16239 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16240 16241 trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth); 16242 nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp); 16243 } 16244 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify); 16245 16246 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev, 16247 struct net_device *netdev, 16248 struct cfg80211_chan_def *chandef, 16249 gfp_t gfp, 16250 enum nl80211_commands notif, 16251 u8 count) 16252 { 16253 struct sk_buff *msg; 16254 void *hdr; 16255 16256 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16257 if (!msg) 16258 return; 16259 16260 hdr = nl80211hdr_put(msg, 0, 0, 0, notif); 16261 if (!hdr) { 16262 nlmsg_free(msg); 16263 return; 16264 } 16265 16266 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 16267 goto nla_put_failure; 16268 16269 if (nl80211_send_chandef(msg, chandef)) 16270 goto nla_put_failure; 16271 16272 if ((notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) && 16273 (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count))) 16274 goto nla_put_failure; 16275 16276 genlmsg_end(msg, hdr); 16277 16278 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16279 NL80211_MCGRP_MLME, gfp); 16280 return; 16281 16282 nla_put_failure: 16283 nlmsg_free(msg); 16284 } 16285 16286 void cfg80211_ch_switch_notify(struct net_device *dev, 16287 struct cfg80211_chan_def *chandef) 16288 { 16289 struct wireless_dev *wdev = dev->ieee80211_ptr; 16290 struct wiphy *wiphy = wdev->wiphy; 16291 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16292 16293 ASSERT_WDEV_LOCK(wdev); 16294 16295 trace_cfg80211_ch_switch_notify(dev, chandef); 16296 16297 wdev->chandef = *chandef; 16298 wdev->preset_chandef = *chandef; 16299 16300 if (wdev->iftype == NL80211_IFTYPE_STATION && 16301 !WARN_ON(!wdev->current_bss)) 16302 cfg80211_update_assoc_bss_entry(wdev, chandef->chan); 16303 16304 cfg80211_sched_dfs_chan_update(rdev); 16305 16306 nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL, 16307 NL80211_CMD_CH_SWITCH_NOTIFY, 0); 16308 } 16309 EXPORT_SYMBOL(cfg80211_ch_switch_notify); 16310 16311 void cfg80211_ch_switch_started_notify(struct net_device *dev, 16312 struct cfg80211_chan_def *chandef, 16313 u8 count) 16314 { 16315 struct wireless_dev *wdev = dev->ieee80211_ptr; 16316 struct wiphy *wiphy = wdev->wiphy; 16317 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16318 16319 trace_cfg80211_ch_switch_started_notify(dev, chandef); 16320 16321 nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL, 16322 NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, count); 16323 } 16324 EXPORT_SYMBOL(cfg80211_ch_switch_started_notify); 16325 16326 void 16327 nl80211_radar_notify(struct cfg80211_registered_device *rdev, 16328 const struct cfg80211_chan_def *chandef, 16329 enum nl80211_radar_event event, 16330 struct net_device *netdev, gfp_t gfp) 16331 { 16332 struct sk_buff *msg; 16333 void *hdr; 16334 16335 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16336 if (!msg) 16337 return; 16338 16339 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT); 16340 if (!hdr) { 16341 nlmsg_free(msg); 16342 return; 16343 } 16344 16345 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 16346 goto nla_put_failure; 16347 16348 /* NOP and radar events don't need a netdev parameter */ 16349 if (netdev) { 16350 struct wireless_dev *wdev = netdev->ieee80211_ptr; 16351 16352 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 16353 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 16354 NL80211_ATTR_PAD)) 16355 goto nla_put_failure; 16356 } 16357 16358 if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event)) 16359 goto nla_put_failure; 16360 16361 if (nl80211_send_chandef(msg, chandef)) 16362 goto nla_put_failure; 16363 16364 genlmsg_end(msg, hdr); 16365 16366 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16367 NL80211_MCGRP_MLME, gfp); 16368 return; 16369 16370 nla_put_failure: 16371 nlmsg_free(msg); 16372 } 16373 16374 void cfg80211_sta_opmode_change_notify(struct net_device *dev, const u8 *mac, 16375 struct sta_opmode_info *sta_opmode, 16376 gfp_t gfp) 16377 { 16378 struct sk_buff *msg; 16379 struct wireless_dev *wdev = dev->ieee80211_ptr; 16380 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 16381 void *hdr; 16382 16383 if (WARN_ON(!mac)) 16384 return; 16385 16386 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16387 if (!msg) 16388 return; 16389 16390 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STA_OPMODE_CHANGED); 16391 if (!hdr) { 16392 nlmsg_free(msg); 16393 return; 16394 } 16395 16396 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 16397 goto nla_put_failure; 16398 16399 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 16400 goto nla_put_failure; 16401 16402 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac)) 16403 goto nla_put_failure; 16404 16405 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) && 16406 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode)) 16407 goto nla_put_failure; 16408 16409 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && 16410 nla_put_u8(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) 16411 goto nla_put_failure; 16412 16413 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && 16414 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss)) 16415 goto nla_put_failure; 16416 16417 genlmsg_end(msg, hdr); 16418 16419 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16420 NL80211_MCGRP_MLME, gfp); 16421 16422 return; 16423 16424 nla_put_failure: 16425 nlmsg_free(msg); 16426 } 16427 EXPORT_SYMBOL(cfg80211_sta_opmode_change_notify); 16428 16429 void cfg80211_probe_status(struct net_device *dev, const u8 *addr, 16430 u64 cookie, bool acked, s32 ack_signal, 16431 bool is_valid_ack_signal, gfp_t gfp) 16432 { 16433 struct wireless_dev *wdev = dev->ieee80211_ptr; 16434 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 16435 struct sk_buff *msg; 16436 void *hdr; 16437 16438 trace_cfg80211_probe_status(dev, addr, cookie, acked); 16439 16440 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16441 16442 if (!msg) 16443 return; 16444 16445 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_CLIENT); 16446 if (!hdr) { 16447 nlmsg_free(msg); 16448 return; 16449 } 16450 16451 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16452 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 16453 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 16454 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 16455 NL80211_ATTR_PAD) || 16456 (acked && nla_put_flag(msg, NL80211_ATTR_ACK)) || 16457 (is_valid_ack_signal && nla_put_s32(msg, NL80211_ATTR_ACK_SIGNAL, 16458 ack_signal))) 16459 goto nla_put_failure; 16460 16461 genlmsg_end(msg, hdr); 16462 16463 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16464 NL80211_MCGRP_MLME, gfp); 16465 return; 16466 16467 nla_put_failure: 16468 nlmsg_free(msg); 16469 } 16470 EXPORT_SYMBOL(cfg80211_probe_status); 16471 16472 void cfg80211_report_obss_beacon(struct wiphy *wiphy, 16473 const u8 *frame, size_t len, 16474 int freq, int sig_dbm) 16475 { 16476 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16477 struct sk_buff *msg; 16478 void *hdr; 16479 struct cfg80211_beacon_registration *reg; 16480 16481 trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm); 16482 16483 spin_lock_bh(&rdev->beacon_registrations_lock); 16484 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 16485 msg = nlmsg_new(len + 100, GFP_ATOMIC); 16486 if (!msg) { 16487 spin_unlock_bh(&rdev->beacon_registrations_lock); 16488 return; 16489 } 16490 16491 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 16492 if (!hdr) 16493 goto nla_put_failure; 16494 16495 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16496 (freq && 16497 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq)) || 16498 (sig_dbm && 16499 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) || 16500 nla_put(msg, NL80211_ATTR_FRAME, len, frame)) 16501 goto nla_put_failure; 16502 16503 genlmsg_end(msg, hdr); 16504 16505 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); 16506 } 16507 spin_unlock_bh(&rdev->beacon_registrations_lock); 16508 return; 16509 16510 nla_put_failure: 16511 spin_unlock_bh(&rdev->beacon_registrations_lock); 16512 nlmsg_free(msg); 16513 } 16514 EXPORT_SYMBOL(cfg80211_report_obss_beacon); 16515 16516 #ifdef CONFIG_PM 16517 static int cfg80211_net_detect_results(struct sk_buff *msg, 16518 struct cfg80211_wowlan_wakeup *wakeup) 16519 { 16520 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect; 16521 struct nlattr *nl_results, *nl_match, *nl_freqs; 16522 int i, j; 16523 16524 nl_results = nla_nest_start_noflag(msg, 16525 NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS); 16526 if (!nl_results) 16527 return -EMSGSIZE; 16528 16529 for (i = 0; i < nd->n_matches; i++) { 16530 struct cfg80211_wowlan_nd_match *match = nd->matches[i]; 16531 16532 nl_match = nla_nest_start_noflag(msg, i); 16533 if (!nl_match) 16534 break; 16535 16536 /* The SSID attribute is optional in nl80211, but for 16537 * simplicity reasons it's always present in the 16538 * cfg80211 structure. If a driver can't pass the 16539 * SSID, that needs to be changed. A zero length SSID 16540 * is still a valid SSID (wildcard), so it cannot be 16541 * used for this purpose. 16542 */ 16543 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len, 16544 match->ssid.ssid)) { 16545 nla_nest_cancel(msg, nl_match); 16546 goto out; 16547 } 16548 16549 if (match->n_channels) { 16550 nl_freqs = nla_nest_start_noflag(msg, 16551 NL80211_ATTR_SCAN_FREQUENCIES); 16552 if (!nl_freqs) { 16553 nla_nest_cancel(msg, nl_match); 16554 goto out; 16555 } 16556 16557 for (j = 0; j < match->n_channels; j++) { 16558 if (nla_put_u32(msg, j, match->channels[j])) { 16559 nla_nest_cancel(msg, nl_freqs); 16560 nla_nest_cancel(msg, nl_match); 16561 goto out; 16562 } 16563 } 16564 16565 nla_nest_end(msg, nl_freqs); 16566 } 16567 16568 nla_nest_end(msg, nl_match); 16569 } 16570 16571 out: 16572 nla_nest_end(msg, nl_results); 16573 return 0; 16574 } 16575 16576 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev, 16577 struct cfg80211_wowlan_wakeup *wakeup, 16578 gfp_t gfp) 16579 { 16580 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 16581 struct sk_buff *msg; 16582 void *hdr; 16583 int size = 200; 16584 16585 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); 16586 16587 if (wakeup) 16588 size += wakeup->packet_present_len; 16589 16590 msg = nlmsg_new(size, gfp); 16591 if (!msg) 16592 return; 16593 16594 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN); 16595 if (!hdr) 16596 goto free_msg; 16597 16598 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16599 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 16600 NL80211_ATTR_PAD)) 16601 goto free_msg; 16602 16603 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 16604 wdev->netdev->ifindex)) 16605 goto free_msg; 16606 16607 if (wakeup) { 16608 struct nlattr *reasons; 16609 16610 reasons = nla_nest_start_noflag(msg, 16611 NL80211_ATTR_WOWLAN_TRIGGERS); 16612 if (!reasons) 16613 goto free_msg; 16614 16615 if (wakeup->disconnect && 16616 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) 16617 goto free_msg; 16618 if (wakeup->magic_pkt && 16619 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) 16620 goto free_msg; 16621 if (wakeup->gtk_rekey_failure && 16622 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) 16623 goto free_msg; 16624 if (wakeup->eap_identity_req && 16625 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) 16626 goto free_msg; 16627 if (wakeup->four_way_handshake && 16628 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) 16629 goto free_msg; 16630 if (wakeup->rfkill_release && 16631 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)) 16632 goto free_msg; 16633 16634 if (wakeup->pattern_idx >= 0 && 16635 nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN, 16636 wakeup->pattern_idx)) 16637 goto free_msg; 16638 16639 if (wakeup->tcp_match && 16640 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH)) 16641 goto free_msg; 16642 16643 if (wakeup->tcp_connlost && 16644 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST)) 16645 goto free_msg; 16646 16647 if (wakeup->tcp_nomoretokens && 16648 nla_put_flag(msg, 16649 NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS)) 16650 goto free_msg; 16651 16652 if (wakeup->packet) { 16653 u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211; 16654 u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN; 16655 16656 if (!wakeup->packet_80211) { 16657 pkt_attr = 16658 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023; 16659 len_attr = 16660 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN; 16661 } 16662 16663 if (wakeup->packet_len && 16664 nla_put_u32(msg, len_attr, wakeup->packet_len)) 16665 goto free_msg; 16666 16667 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, 16668 wakeup->packet)) 16669 goto free_msg; 16670 } 16671 16672 if (wakeup->net_detect && 16673 cfg80211_net_detect_results(msg, wakeup)) 16674 goto free_msg; 16675 16676 nla_nest_end(msg, reasons); 16677 } 16678 16679 genlmsg_end(msg, hdr); 16680 16681 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16682 NL80211_MCGRP_MLME, gfp); 16683 return; 16684 16685 free_msg: 16686 nlmsg_free(msg); 16687 } 16688 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup); 16689 #endif 16690 16691 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer, 16692 enum nl80211_tdls_operation oper, 16693 u16 reason_code, gfp_t gfp) 16694 { 16695 struct wireless_dev *wdev = dev->ieee80211_ptr; 16696 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 16697 struct sk_buff *msg; 16698 void *hdr; 16699 16700 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, 16701 reason_code); 16702 16703 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16704 if (!msg) 16705 return; 16706 16707 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER); 16708 if (!hdr) { 16709 nlmsg_free(msg); 16710 return; 16711 } 16712 16713 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16714 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 16715 nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) || 16716 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) || 16717 (reason_code > 0 && 16718 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code))) 16719 goto nla_put_failure; 16720 16721 genlmsg_end(msg, hdr); 16722 16723 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16724 NL80211_MCGRP_MLME, gfp); 16725 return; 16726 16727 nla_put_failure: 16728 nlmsg_free(msg); 16729 } 16730 EXPORT_SYMBOL(cfg80211_tdls_oper_request); 16731 16732 static int nl80211_netlink_notify(struct notifier_block * nb, 16733 unsigned long state, 16734 void *_notify) 16735 { 16736 struct netlink_notify *notify = _notify; 16737 struct cfg80211_registered_device *rdev; 16738 struct wireless_dev *wdev; 16739 struct cfg80211_beacon_registration *reg, *tmp; 16740 16741 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC) 16742 return NOTIFY_DONE; 16743 16744 rcu_read_lock(); 16745 16746 list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) { 16747 struct cfg80211_sched_scan_request *sched_scan_req; 16748 16749 list_for_each_entry_rcu(sched_scan_req, 16750 &rdev->sched_scan_req_list, 16751 list) { 16752 if (sched_scan_req->owner_nlportid == notify->portid) { 16753 sched_scan_req->nl_owner_dead = true; 16754 schedule_work(&rdev->sched_scan_stop_wk); 16755 } 16756 } 16757 16758 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) { 16759 cfg80211_mlme_unregister_socket(wdev, notify->portid); 16760 16761 if (wdev->owner_nlportid == notify->portid) { 16762 wdev->nl_owner_dead = true; 16763 schedule_work(&rdev->destroy_work); 16764 } else if (wdev->conn_owner_nlportid == notify->portid) { 16765 schedule_work(&wdev->disconnect_wk); 16766 } 16767 16768 cfg80211_release_pmsr(wdev, notify->portid); 16769 } 16770 16771 spin_lock_bh(&rdev->beacon_registrations_lock); 16772 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, 16773 list) { 16774 if (reg->nlportid == notify->portid) { 16775 list_del(®->list); 16776 kfree(reg); 16777 break; 16778 } 16779 } 16780 spin_unlock_bh(&rdev->beacon_registrations_lock); 16781 } 16782 16783 rcu_read_unlock(); 16784 16785 /* 16786 * It is possible that the user space process that is controlling the 16787 * indoor setting disappeared, so notify the regulatory core. 16788 */ 16789 regulatory_netlink_notify(notify->portid); 16790 return NOTIFY_OK; 16791 } 16792 16793 static struct notifier_block nl80211_netlink_notifier = { 16794 .notifier_call = nl80211_netlink_notify, 16795 }; 16796 16797 void cfg80211_ft_event(struct net_device *netdev, 16798 struct cfg80211_ft_event_params *ft_event) 16799 { 16800 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; 16801 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16802 struct sk_buff *msg; 16803 void *hdr; 16804 16805 trace_cfg80211_ft_event(wiphy, netdev, ft_event); 16806 16807 if (!ft_event->target_ap) 16808 return; 16809 16810 msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len, 16811 GFP_KERNEL); 16812 if (!msg) 16813 return; 16814 16815 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT); 16816 if (!hdr) 16817 goto out; 16818 16819 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16820 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 16821 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) 16822 goto out; 16823 16824 if (ft_event->ies && 16825 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) 16826 goto out; 16827 if (ft_event->ric_ies && 16828 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, 16829 ft_event->ric_ies)) 16830 goto out; 16831 16832 genlmsg_end(msg, hdr); 16833 16834 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16835 NL80211_MCGRP_MLME, GFP_KERNEL); 16836 return; 16837 out: 16838 nlmsg_free(msg); 16839 } 16840 EXPORT_SYMBOL(cfg80211_ft_event); 16841 16842 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp) 16843 { 16844 struct cfg80211_registered_device *rdev; 16845 struct sk_buff *msg; 16846 void *hdr; 16847 u32 nlportid; 16848 16849 rdev = wiphy_to_rdev(wdev->wiphy); 16850 if (!rdev->crit_proto_nlportid) 16851 return; 16852 16853 nlportid = rdev->crit_proto_nlportid; 16854 rdev->crit_proto_nlportid = 0; 16855 16856 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16857 if (!msg) 16858 return; 16859 16860 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP); 16861 if (!hdr) 16862 goto nla_put_failure; 16863 16864 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16865 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 16866 NL80211_ATTR_PAD)) 16867 goto nla_put_failure; 16868 16869 genlmsg_end(msg, hdr); 16870 16871 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 16872 return; 16873 16874 nla_put_failure: 16875 nlmsg_free(msg); 16876 } 16877 EXPORT_SYMBOL(cfg80211_crit_proto_stopped); 16878 16879 void nl80211_send_ap_stopped(struct wireless_dev *wdev) 16880 { 16881 struct wiphy *wiphy = wdev->wiphy; 16882 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16883 struct sk_buff *msg; 16884 void *hdr; 16885 16886 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 16887 if (!msg) 16888 return; 16889 16890 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP); 16891 if (!hdr) 16892 goto out; 16893 16894 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16895 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || 16896 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 16897 NL80211_ATTR_PAD)) 16898 goto out; 16899 16900 genlmsg_end(msg, hdr); 16901 16902 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0, 16903 NL80211_MCGRP_MLME, GFP_KERNEL); 16904 return; 16905 out: 16906 nlmsg_free(msg); 16907 } 16908 16909 int cfg80211_external_auth_request(struct net_device *dev, 16910 struct cfg80211_external_auth_params *params, 16911 gfp_t gfp) 16912 { 16913 struct wireless_dev *wdev = dev->ieee80211_ptr; 16914 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 16915 struct sk_buff *msg; 16916 void *hdr; 16917 16918 if (!wdev->conn_owner_nlportid) 16919 return -EINVAL; 16920 16921 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16922 if (!msg) 16923 return -ENOMEM; 16924 16925 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EXTERNAL_AUTH); 16926 if (!hdr) 16927 goto nla_put_failure; 16928 16929 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16930 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 16931 nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, params->key_mgmt_suite) || 16932 nla_put_u32(msg, NL80211_ATTR_EXTERNAL_AUTH_ACTION, 16933 params->action) || 16934 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) || 16935 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len, 16936 params->ssid.ssid)) 16937 goto nla_put_failure; 16938 16939 genlmsg_end(msg, hdr); 16940 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 16941 wdev->conn_owner_nlportid); 16942 return 0; 16943 16944 nla_put_failure: 16945 nlmsg_free(msg); 16946 return -ENOBUFS; 16947 } 16948 EXPORT_SYMBOL(cfg80211_external_auth_request); 16949 16950 void cfg80211_update_owe_info_event(struct net_device *netdev, 16951 struct cfg80211_update_owe_info *owe_info, 16952 gfp_t gfp) 16953 { 16954 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; 16955 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16956 struct sk_buff *msg; 16957 void *hdr; 16958 16959 trace_cfg80211_update_owe_info_event(wiphy, netdev, owe_info); 16960 16961 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16962 if (!msg) 16963 return; 16964 16965 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_UPDATE_OWE_INFO); 16966 if (!hdr) 16967 goto nla_put_failure; 16968 16969 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16970 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 16971 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer)) 16972 goto nla_put_failure; 16973 16974 if (!owe_info->ie_len || 16975 nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie)) 16976 goto nla_put_failure; 16977 16978 genlmsg_end(msg, hdr); 16979 16980 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16981 NL80211_MCGRP_MLME, gfp); 16982 return; 16983 16984 nla_put_failure: 16985 genlmsg_cancel(msg, hdr); 16986 nlmsg_free(msg); 16987 } 16988 EXPORT_SYMBOL(cfg80211_update_owe_info_event); 16989 16990 /* initialisation/exit functions */ 16991 16992 int __init nl80211_init(void) 16993 { 16994 int err; 16995 16996 err = genl_register_family(&nl80211_fam); 16997 if (err) 16998 return err; 16999 17000 err = netlink_register_notifier(&nl80211_netlink_notifier); 17001 if (err) 17002 goto err_out; 17003 17004 return 0; 17005 err_out: 17006 genl_unregister_family(&nl80211_fam); 17007 return err; 17008 } 17009 17010 void nl80211_exit(void) 17011 { 17012 netlink_unregister_notifier(&nl80211_netlink_notifier); 17013 genl_unregister_family(&nl80211_fam); 17014 } 17015