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-2020 Intel Corporation 9 */ 10 11 #include <linux/if.h> 12 #include <linux/module.h> 13 #include <linux/err.h> 14 #include <linux/slab.h> 15 #include <linux/list.h> 16 #include <linux/if_ether.h> 17 #include <linux/ieee80211.h> 18 #include <linux/nl80211.h> 19 #include <linux/rtnetlink.h> 20 #include <linux/netlink.h> 21 #include <linux/nospec.h> 22 #include <linux/etherdevice.h> 23 #include <linux/if_vlan.h> 24 #include <net/net_namespace.h> 25 #include <net/genetlink.h> 26 #include <net/cfg80211.h> 27 #include <net/sock.h> 28 #include <net/inet_connection_sock.h> 29 #include "core.h" 30 #include "nl80211.h" 31 #include "reg.h" 32 #include "rdev-ops.h" 33 34 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, 35 struct genl_info *info, 36 struct cfg80211_crypto_settings *settings, 37 int cipher_limit); 38 39 /* the netlink family */ 40 static struct genl_family nl80211_fam; 41 42 /* multicast groups */ 43 enum nl80211_multicast_groups { 44 NL80211_MCGRP_CONFIG, 45 NL80211_MCGRP_SCAN, 46 NL80211_MCGRP_REGULATORY, 47 NL80211_MCGRP_MLME, 48 NL80211_MCGRP_VENDOR, 49 NL80211_MCGRP_NAN, 50 NL80211_MCGRP_TESTMODE /* keep last - ifdef! */ 51 }; 52 53 static const struct genl_multicast_group nl80211_mcgrps[] = { 54 [NL80211_MCGRP_CONFIG] = { .name = NL80211_MULTICAST_GROUP_CONFIG }, 55 [NL80211_MCGRP_SCAN] = { .name = NL80211_MULTICAST_GROUP_SCAN }, 56 [NL80211_MCGRP_REGULATORY] = { .name = NL80211_MULTICAST_GROUP_REG }, 57 [NL80211_MCGRP_MLME] = { .name = NL80211_MULTICAST_GROUP_MLME }, 58 [NL80211_MCGRP_VENDOR] = { .name = NL80211_MULTICAST_GROUP_VENDOR }, 59 [NL80211_MCGRP_NAN] = { .name = NL80211_MULTICAST_GROUP_NAN }, 60 #ifdef CONFIG_NL80211_TESTMODE 61 [NL80211_MCGRP_TESTMODE] = { .name = NL80211_MULTICAST_GROUP_TESTMODE } 62 #endif 63 }; 64 65 /* returns ERR_PTR values */ 66 static struct wireless_dev * 67 __cfg80211_wdev_from_attrs(struct net *netns, struct nlattr **attrs) 68 { 69 struct cfg80211_registered_device *rdev; 70 struct wireless_dev *result = NULL; 71 bool have_ifidx = attrs[NL80211_ATTR_IFINDEX]; 72 bool have_wdev_id = attrs[NL80211_ATTR_WDEV]; 73 u64 wdev_id; 74 int wiphy_idx = -1; 75 int ifidx = -1; 76 77 ASSERT_RTNL(); 78 79 if (!have_ifidx && !have_wdev_id) 80 return ERR_PTR(-EINVAL); 81 82 if (have_ifidx) 83 ifidx = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]); 84 if (have_wdev_id) { 85 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]); 86 wiphy_idx = wdev_id >> 32; 87 } 88 89 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 90 struct wireless_dev *wdev; 91 92 if (wiphy_net(&rdev->wiphy) != netns) 93 continue; 94 95 if (have_wdev_id && rdev->wiphy_idx != wiphy_idx) 96 continue; 97 98 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 99 if (have_ifidx && wdev->netdev && 100 wdev->netdev->ifindex == ifidx) { 101 result = wdev; 102 break; 103 } 104 if (have_wdev_id && wdev->identifier == (u32)wdev_id) { 105 result = wdev; 106 break; 107 } 108 } 109 110 if (result) 111 break; 112 } 113 114 if (result) 115 return result; 116 return ERR_PTR(-ENODEV); 117 } 118 119 static struct cfg80211_registered_device * 120 __cfg80211_rdev_from_attrs(struct net *netns, struct nlattr **attrs) 121 { 122 struct cfg80211_registered_device *rdev = NULL, *tmp; 123 struct net_device *netdev; 124 125 ASSERT_RTNL(); 126 127 if (!attrs[NL80211_ATTR_WIPHY] && 128 !attrs[NL80211_ATTR_IFINDEX] && 129 !attrs[NL80211_ATTR_WDEV]) 130 return ERR_PTR(-EINVAL); 131 132 if (attrs[NL80211_ATTR_WIPHY]) 133 rdev = cfg80211_rdev_by_wiphy_idx( 134 nla_get_u32(attrs[NL80211_ATTR_WIPHY])); 135 136 if (attrs[NL80211_ATTR_WDEV]) { 137 u64 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]); 138 struct wireless_dev *wdev; 139 bool found = false; 140 141 tmp = cfg80211_rdev_by_wiphy_idx(wdev_id >> 32); 142 if (tmp) { 143 /* make sure wdev exists */ 144 list_for_each_entry(wdev, &tmp->wiphy.wdev_list, list) { 145 if (wdev->identifier != (u32)wdev_id) 146 continue; 147 found = true; 148 break; 149 } 150 151 if (!found) 152 tmp = NULL; 153 154 if (rdev && tmp != rdev) 155 return ERR_PTR(-EINVAL); 156 rdev = tmp; 157 } 158 } 159 160 if (attrs[NL80211_ATTR_IFINDEX]) { 161 int ifindex = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]); 162 163 netdev = __dev_get_by_index(netns, ifindex); 164 if (netdev) { 165 if (netdev->ieee80211_ptr) 166 tmp = wiphy_to_rdev( 167 netdev->ieee80211_ptr->wiphy); 168 else 169 tmp = NULL; 170 171 /* not wireless device -- return error */ 172 if (!tmp) 173 return ERR_PTR(-EINVAL); 174 175 /* mismatch -- return error */ 176 if (rdev && tmp != rdev) 177 return ERR_PTR(-EINVAL); 178 179 rdev = tmp; 180 } 181 } 182 183 if (!rdev) 184 return ERR_PTR(-ENODEV); 185 186 if (netns != wiphy_net(&rdev->wiphy)) 187 return ERR_PTR(-ENODEV); 188 189 return rdev; 190 } 191 192 /* 193 * This function returns a pointer to the driver 194 * that the genl_info item that is passed refers to. 195 * 196 * The result of this can be a PTR_ERR and hence must 197 * be checked with IS_ERR() for errors. 198 */ 199 static struct cfg80211_registered_device * 200 cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info) 201 { 202 return __cfg80211_rdev_from_attrs(netns, info->attrs); 203 } 204 205 static int validate_beacon_head(const struct nlattr *attr, 206 struct netlink_ext_ack *extack) 207 { 208 const u8 *data = nla_data(attr); 209 unsigned int len = nla_len(attr); 210 const struct element *elem; 211 const struct ieee80211_mgmt *mgmt = (void *)data; 212 unsigned int fixedlen = offsetof(struct ieee80211_mgmt, 213 u.beacon.variable); 214 215 if (len < fixedlen) 216 goto err; 217 218 if (ieee80211_hdrlen(mgmt->frame_control) != 219 offsetof(struct ieee80211_mgmt, u.beacon)) 220 goto err; 221 222 data += fixedlen; 223 len -= fixedlen; 224 225 for_each_element(elem, data, len) { 226 /* nothing */ 227 } 228 229 if (for_each_element_completed(elem, data, len)) 230 return 0; 231 232 err: 233 NL_SET_ERR_MSG_ATTR(extack, attr, "malformed beacon head"); 234 return -EINVAL; 235 } 236 237 static int validate_ie_attr(const struct nlattr *attr, 238 struct netlink_ext_ack *extack) 239 { 240 const u8 *data = nla_data(attr); 241 unsigned int len = nla_len(attr); 242 const struct element *elem; 243 244 for_each_element(elem, data, len) { 245 /* nothing */ 246 } 247 248 if (for_each_element_completed(elem, data, len)) 249 return 0; 250 251 NL_SET_ERR_MSG_ATTR(extack, attr, "malformed information elements"); 252 return -EINVAL; 253 } 254 255 /* policy for the attributes */ 256 static const struct nla_policy 257 nl80211_ftm_responder_policy[NL80211_FTM_RESP_ATTR_MAX + 1] = { 258 [NL80211_FTM_RESP_ATTR_ENABLED] = { .type = NLA_FLAG, }, 259 [NL80211_FTM_RESP_ATTR_LCI] = { .type = NLA_BINARY, 260 .len = U8_MAX }, 261 [NL80211_FTM_RESP_ATTR_CIVICLOC] = { .type = NLA_BINARY, 262 .len = U8_MAX }, 263 }; 264 265 static const struct nla_policy 266 nl80211_pmsr_ftm_req_attr_policy[NL80211_PMSR_FTM_REQ_ATTR_MAX + 1] = { 267 [NL80211_PMSR_FTM_REQ_ATTR_ASAP] = { .type = NLA_FLAG }, 268 [NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE] = { .type = NLA_U32 }, 269 [NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP] = 270 NLA_POLICY_MAX(NLA_U8, 15), 271 [NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD] = { .type = NLA_U16 }, 272 [NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION] = 273 NLA_POLICY_MAX(NLA_U8, 15), 274 [NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST] = 275 NLA_POLICY_MAX(NLA_U8, 31), 276 [NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES] = { .type = NLA_U8 }, 277 [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI] = { .type = NLA_FLAG }, 278 [NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC] = { .type = NLA_FLAG }, 279 [NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED] = { .type = NLA_FLAG }, 280 [NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED] = { .type = NLA_FLAG }, 281 }; 282 283 static const struct nla_policy 284 nl80211_pmsr_req_data_policy[NL80211_PMSR_TYPE_MAX + 1] = { 285 [NL80211_PMSR_TYPE_FTM] = 286 NLA_POLICY_NESTED(nl80211_pmsr_ftm_req_attr_policy), 287 }; 288 289 static const struct nla_policy 290 nl80211_pmsr_req_attr_policy[NL80211_PMSR_REQ_ATTR_MAX + 1] = { 291 [NL80211_PMSR_REQ_ATTR_DATA] = 292 NLA_POLICY_NESTED(nl80211_pmsr_req_data_policy), 293 [NL80211_PMSR_REQ_ATTR_GET_AP_TSF] = { .type = NLA_FLAG }, 294 }; 295 296 static const struct nla_policy 297 nl80211_psmr_peer_attr_policy[NL80211_PMSR_PEER_ATTR_MAX + 1] = { 298 [NL80211_PMSR_PEER_ATTR_ADDR] = NLA_POLICY_ETH_ADDR, 299 /* 300 * we could specify this again to be the top-level policy, 301 * but that would open us up to recursion problems ... 302 */ 303 [NL80211_PMSR_PEER_ATTR_CHAN] = { .type = NLA_NESTED }, 304 [NL80211_PMSR_PEER_ATTR_REQ] = 305 NLA_POLICY_NESTED(nl80211_pmsr_req_attr_policy), 306 [NL80211_PMSR_PEER_ATTR_RESP] = { .type = NLA_REJECT }, 307 }; 308 309 static const struct nla_policy 310 nl80211_pmsr_attr_policy[NL80211_PMSR_ATTR_MAX + 1] = { 311 [NL80211_PMSR_ATTR_MAX_PEERS] = { .type = NLA_REJECT }, 312 [NL80211_PMSR_ATTR_REPORT_AP_TSF] = { .type = NLA_REJECT }, 313 [NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR] = { .type = NLA_REJECT }, 314 [NL80211_PMSR_ATTR_TYPE_CAPA] = { .type = NLA_REJECT }, 315 [NL80211_PMSR_ATTR_PEERS] = 316 NLA_POLICY_NESTED_ARRAY(nl80211_psmr_peer_attr_policy), 317 }; 318 319 static const struct nla_policy 320 he_obss_pd_policy[NL80211_HE_OBSS_PD_ATTR_MAX + 1] = { 321 [NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET] = 322 NLA_POLICY_RANGE(NLA_U8, 1, 20), 323 [NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET] = 324 NLA_POLICY_RANGE(NLA_U8, 1, 20), 325 }; 326 327 static const struct nla_policy 328 he_bss_color_policy[NL80211_HE_BSS_COLOR_ATTR_MAX + 1] = { 329 [NL80211_HE_BSS_COLOR_ATTR_COLOR] = NLA_POLICY_RANGE(NLA_U8, 1, 63), 330 [NL80211_HE_BSS_COLOR_ATTR_DISABLED] = { .type = NLA_FLAG }, 331 [NL80211_HE_BSS_COLOR_ATTR_PARTIAL] = { .type = NLA_FLAG }, 332 }; 333 334 static const struct nla_policy 335 nl80211_tid_config_attr_policy[NL80211_TID_CONFIG_ATTR_MAX + 1] = { 336 [NL80211_TID_CONFIG_ATTR_VIF_SUPP] = { .type = NLA_U64 }, 337 [NL80211_TID_CONFIG_ATTR_PEER_SUPP] = { .type = NLA_U64 }, 338 [NL80211_TID_CONFIG_ATTR_OVERRIDE] = { .type = NLA_FLAG }, 339 [NL80211_TID_CONFIG_ATTR_TIDS] = NLA_POLICY_RANGE(NLA_U16, 1, 0xff), 340 [NL80211_TID_CONFIG_ATTR_NOACK] = 341 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 342 [NL80211_TID_CONFIG_ATTR_RETRY_SHORT] = NLA_POLICY_MIN(NLA_U8, 1), 343 [NL80211_TID_CONFIG_ATTR_RETRY_LONG] = NLA_POLICY_MIN(NLA_U8, 1), 344 [NL80211_TID_CONFIG_ATTR_AMPDU_CTRL] = 345 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 346 [NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL] = 347 NLA_POLICY_MAX(NLA_U8, NL80211_TID_CONFIG_DISABLE), 348 }; 349 350 const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { 351 [0] = { .strict_start_type = NL80211_ATTR_HE_OBSS_PD }, 352 [NL80211_ATTR_WIPHY] = { .type = NLA_U32 }, 353 [NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING, 354 .len = 20-1 }, 355 [NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED }, 356 357 [NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 }, 358 [NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 }, 359 [NL80211_ATTR_WIPHY_EDMG_CHANNELS] = NLA_POLICY_RANGE(NLA_U8, 360 NL80211_EDMG_CHANNELS_MIN, 361 NL80211_EDMG_CHANNELS_MAX), 362 [NL80211_ATTR_WIPHY_EDMG_BW_CONFIG] = NLA_POLICY_RANGE(NLA_U8, 363 NL80211_EDMG_BW_CONFIG_MIN, 364 NL80211_EDMG_BW_CONFIG_MAX), 365 366 [NL80211_ATTR_CHANNEL_WIDTH] = { .type = NLA_U32 }, 367 [NL80211_ATTR_CENTER_FREQ1] = { .type = NLA_U32 }, 368 [NL80211_ATTR_CENTER_FREQ2] = { .type = NLA_U32 }, 369 370 [NL80211_ATTR_WIPHY_RETRY_SHORT] = NLA_POLICY_MIN(NLA_U8, 1), 371 [NL80211_ATTR_WIPHY_RETRY_LONG] = NLA_POLICY_MIN(NLA_U8, 1), 372 [NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 }, 373 [NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 }, 374 [NL80211_ATTR_WIPHY_COVERAGE_CLASS] = { .type = NLA_U8 }, 375 [NL80211_ATTR_WIPHY_DYN_ACK] = { .type = NLA_FLAG }, 376 377 [NL80211_ATTR_IFTYPE] = NLA_POLICY_MAX(NLA_U32, NL80211_IFTYPE_MAX), 378 [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 }, 379 [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 }, 380 381 [NL80211_ATTR_MAC] = { .type = NLA_EXACT_LEN_WARN, .len = ETH_ALEN }, 382 [NL80211_ATTR_PREV_BSSID] = { 383 .type = NLA_EXACT_LEN_WARN, 384 .len = ETH_ALEN 385 }, 386 387 [NL80211_ATTR_KEY] = { .type = NLA_NESTED, }, 388 [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY, 389 .len = WLAN_MAX_KEY_LEN }, 390 [NL80211_ATTR_KEY_IDX] = NLA_POLICY_MAX(NLA_U8, 7), 391 [NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 }, 392 [NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG }, 393 [NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 }, 394 [NL80211_ATTR_KEY_TYPE] = 395 NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES), 396 397 [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 }, 398 [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 }, 399 [NL80211_ATTR_BEACON_HEAD] = 400 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_beacon_head, 401 IEEE80211_MAX_DATA_LEN), 402 [NL80211_ATTR_BEACON_TAIL] = 403 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 404 IEEE80211_MAX_DATA_LEN), 405 [NL80211_ATTR_STA_AID] = 406 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), 407 [NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED }, 408 [NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 }, 409 [NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY, 410 .len = NL80211_MAX_SUPP_RATES }, 411 [NL80211_ATTR_STA_PLINK_ACTION] = 412 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_ACTIONS - 1), 413 [NL80211_ATTR_STA_TX_POWER_SETTING] = 414 NLA_POLICY_RANGE(NLA_U8, 415 NL80211_TX_POWER_AUTOMATIC, 416 NL80211_TX_POWER_FIXED), 417 [NL80211_ATTR_STA_TX_POWER] = { .type = NLA_S16 }, 418 [NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 }, 419 [NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ }, 420 [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY, 421 .len = IEEE80211_MAX_MESH_ID_LEN }, 422 [NL80211_ATTR_MPATH_NEXT_HOP] = NLA_POLICY_ETH_ADDR_COMPAT, 423 424 [NL80211_ATTR_REG_ALPHA2] = { .type = NLA_STRING, .len = 2 }, 425 [NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED }, 426 427 [NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 }, 428 [NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 }, 429 [NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 }, 430 [NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY, 431 .len = NL80211_MAX_SUPP_RATES }, 432 [NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 }, 433 434 [NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED }, 435 [NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG }, 436 437 [NL80211_ATTR_HT_CAPABILITY] = { 438 .type = NLA_EXACT_LEN_WARN, 439 .len = NL80211_HT_CAPABILITY_LEN 440 }, 441 442 [NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 }, 443 [NL80211_ATTR_IE] = NLA_POLICY_VALIDATE_FN(NLA_BINARY, 444 validate_ie_attr, 445 IEEE80211_MAX_DATA_LEN), 446 [NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED }, 447 [NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED }, 448 449 [NL80211_ATTR_SSID] = { .type = NLA_BINARY, 450 .len = IEEE80211_MAX_SSID_LEN }, 451 [NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 }, 452 [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 }, 453 [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG }, 454 [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG }, 455 [NL80211_ATTR_USE_MFP] = NLA_POLICY_RANGE(NLA_U32, 456 NL80211_MFP_NO, 457 NL80211_MFP_OPTIONAL), 458 [NL80211_ATTR_STA_FLAGS2] = { 459 .len = sizeof(struct nl80211_sta_flag_update), 460 }, 461 [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG }, 462 [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 }, 463 [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG }, 464 [NL80211_ATTR_CONTROL_PORT_OVER_NL80211] = { .type = NLA_FLAG }, 465 [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG }, 466 [NL80211_ATTR_STATUS_CODE] = { .type = NLA_U16 }, 467 [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 }, 468 [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 }, 469 [NL80211_ATTR_PID] = { .type = NLA_U32 }, 470 [NL80211_ATTR_4ADDR] = { .type = NLA_U8 }, 471 [NL80211_ATTR_PMKID] = { 472 .type = NLA_EXACT_LEN_WARN, 473 .len = WLAN_PMKID_LEN 474 }, 475 [NL80211_ATTR_DURATION] = { .type = NLA_U32 }, 476 [NL80211_ATTR_COOKIE] = { .type = NLA_U64 }, 477 [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED }, 478 [NL80211_ATTR_FRAME] = { .type = NLA_BINARY, 479 .len = IEEE80211_MAX_DATA_LEN }, 480 [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, }, 481 [NL80211_ATTR_PS_STATE] = NLA_POLICY_RANGE(NLA_U32, 482 NL80211_PS_DISABLED, 483 NL80211_PS_ENABLED), 484 [NL80211_ATTR_CQM] = { .type = NLA_NESTED, }, 485 [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG }, 486 [NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 }, 487 [NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 }, 488 [NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 }, 489 [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 }, 490 [NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 }, 491 [NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 }, 492 [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 }, 493 [NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG }, 494 [NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED }, 495 [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED }, 496 [NL80211_ATTR_STA_PLINK_STATE] = 497 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_PLINK_STATES - 1), 498 [NL80211_ATTR_MEASUREMENT_DURATION] = { .type = NLA_U16 }, 499 [NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY] = { .type = NLA_FLAG }, 500 [NL80211_ATTR_MESH_PEER_AID] = 501 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), 502 [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 }, 503 [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED }, 504 [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED }, 505 [NL80211_ATTR_HIDDEN_SSID] = 506 NLA_POLICY_RANGE(NLA_U32, 507 NL80211_HIDDEN_SSID_NOT_IN_USE, 508 NL80211_HIDDEN_SSID_ZERO_CONTENTS), 509 [NL80211_ATTR_IE_PROBE_RESP] = 510 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 511 IEEE80211_MAX_DATA_LEN), 512 [NL80211_ATTR_IE_ASSOC_RESP] = 513 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 514 IEEE80211_MAX_DATA_LEN), 515 [NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG }, 516 [NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED }, 517 [NL80211_ATTR_TX_NO_CCK_RATE] = { .type = NLA_FLAG }, 518 [NL80211_ATTR_TDLS_ACTION] = { .type = NLA_U8 }, 519 [NL80211_ATTR_TDLS_DIALOG_TOKEN] = { .type = NLA_U8 }, 520 [NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 }, 521 [NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG }, 522 [NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG }, 523 [NL80211_ATTR_TDLS_INITIATOR] = { .type = NLA_FLAG }, 524 [NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG }, 525 [NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY, 526 .len = IEEE80211_MAX_DATA_LEN }, 527 [NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 }, 528 [NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG }, 529 [NL80211_ATTR_HT_CAPABILITY_MASK] = { 530 .len = NL80211_HT_CAPABILITY_LEN 531 }, 532 [NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 }, 533 [NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 }, 534 [NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 }, 535 [NL80211_ATTR_WDEV] = { .type = NLA_U64 }, 536 [NL80211_ATTR_USER_REG_HINT_TYPE] = { .type = NLA_U32 }, 537 [NL80211_ATTR_AUTH_DATA] = { .type = NLA_BINARY, }, 538 [NL80211_ATTR_VHT_CAPABILITY] = { 539 .type = NLA_EXACT_LEN_WARN, 540 .len = NL80211_VHT_CAPABILITY_LEN 541 }, 542 [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 }, 543 [NL80211_ATTR_P2P_CTWINDOW] = NLA_POLICY_MAX(NLA_U8, 127), 544 [NL80211_ATTR_P2P_OPPPS] = NLA_POLICY_MAX(NLA_U8, 1), 545 [NL80211_ATTR_LOCAL_MESH_POWER_MODE] = 546 NLA_POLICY_RANGE(NLA_U32, 547 NL80211_MESH_POWER_UNKNOWN + 1, 548 NL80211_MESH_POWER_MAX), 549 [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 }, 550 [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED }, 551 [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 }, 552 [NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, }, 553 [NL80211_ATTR_SPLIT_WIPHY_DUMP] = { .type = NLA_FLAG, }, 554 [NL80211_ATTR_DISABLE_VHT] = { .type = NLA_FLAG }, 555 [NL80211_ATTR_VHT_CAPABILITY_MASK] = { 556 .len = NL80211_VHT_CAPABILITY_LEN, 557 }, 558 [NL80211_ATTR_MDID] = { .type = NLA_U16 }, 559 [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY, 560 .len = IEEE80211_MAX_DATA_LEN }, 561 [NL80211_ATTR_CRIT_PROT_ID] = { .type = NLA_U16 }, 562 [NL80211_ATTR_MAX_CRIT_PROT_DURATION] = { .type = NLA_U16 }, 563 [NL80211_ATTR_PEER_AID] = 564 NLA_POLICY_RANGE(NLA_U16, 1, IEEE80211_MAX_AID), 565 [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 }, 566 [NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG }, 567 [NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED }, 568 [NL80211_ATTR_CSA_C_OFF_BEACON] = { .type = NLA_BINARY }, 569 [NL80211_ATTR_CSA_C_OFF_PRESP] = { .type = NLA_BINARY }, 570 [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = { .type = NLA_BINARY }, 571 [NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = { .type = NLA_BINARY }, 572 [NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG }, 573 [NL80211_ATTR_OPMODE_NOTIF] = { .type = NLA_U8 }, 574 [NL80211_ATTR_VENDOR_ID] = { .type = NLA_U32 }, 575 [NL80211_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 }, 576 [NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY }, 577 [NL80211_ATTR_QOS_MAP] = { .type = NLA_BINARY, 578 .len = IEEE80211_QOS_MAP_LEN_MAX }, 579 [NL80211_ATTR_MAC_HINT] = { 580 .type = NLA_EXACT_LEN_WARN, 581 .len = ETH_ALEN 582 }, 583 [NL80211_ATTR_WIPHY_FREQ_HINT] = { .type = NLA_U32 }, 584 [NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 }, 585 [NL80211_ATTR_SOCKET_OWNER] = { .type = NLA_FLAG }, 586 [NL80211_ATTR_CSA_C_OFFSETS_TX] = { .type = NLA_BINARY }, 587 [NL80211_ATTR_USE_RRM] = { .type = NLA_FLAG }, 588 [NL80211_ATTR_TSID] = NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_TIDS - 1), 589 [NL80211_ATTR_USER_PRIO] = 590 NLA_POLICY_MAX(NLA_U8, IEEE80211_NUM_UPS - 1), 591 [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 }, 592 [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 }, 593 [NL80211_ATTR_OPER_CLASS] = { .type = NLA_U8 }, 594 [NL80211_ATTR_MAC_MASK] = { 595 .type = NLA_EXACT_LEN_WARN, 596 .len = ETH_ALEN 597 }, 598 [NL80211_ATTR_WIPHY_SELF_MANAGED_REG] = { .type = NLA_FLAG }, 599 [NL80211_ATTR_NETNS_FD] = { .type = NLA_U32 }, 600 [NL80211_ATTR_SCHED_SCAN_DELAY] = { .type = NLA_U32 }, 601 [NL80211_ATTR_REG_INDOOR] = { .type = NLA_FLAG }, 602 [NL80211_ATTR_PBSS] = { .type = NLA_FLAG }, 603 [NL80211_ATTR_BSS_SELECT] = { .type = NLA_NESTED }, 604 [NL80211_ATTR_STA_SUPPORT_P2P_PS] = 605 NLA_POLICY_MAX(NLA_U8, NUM_NL80211_P2P_PS_STATUS - 1), 606 [NL80211_ATTR_MU_MIMO_GROUP_DATA] = { 607 .len = VHT_MUMIMO_GROUPS_DATA_LEN 608 }, 609 [NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR] = { 610 .type = NLA_EXACT_LEN_WARN, 611 .len = ETH_ALEN 612 }, 613 [NL80211_ATTR_NAN_MASTER_PREF] = NLA_POLICY_MIN(NLA_U8, 1), 614 [NL80211_ATTR_BANDS] = { .type = NLA_U32 }, 615 [NL80211_ATTR_NAN_FUNC] = { .type = NLA_NESTED }, 616 [NL80211_ATTR_FILS_KEK] = { .type = NLA_BINARY, 617 .len = FILS_MAX_KEK_LEN }, 618 [NL80211_ATTR_FILS_NONCES] = { 619 .type = NLA_EXACT_LEN_WARN, 620 .len = 2 * FILS_NONCE_LEN 621 }, 622 [NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED] = { .type = NLA_FLAG, }, 623 [NL80211_ATTR_BSSID] = { .type = NLA_EXACT_LEN_WARN, .len = ETH_ALEN }, 624 [NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] = { .type = NLA_S8 }, 625 [NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST] = { 626 .len = sizeof(struct nl80211_bss_select_rssi_adjust) 627 }, 628 [NL80211_ATTR_TIMEOUT_REASON] = { .type = NLA_U32 }, 629 [NL80211_ATTR_FILS_ERP_USERNAME] = { .type = NLA_BINARY, 630 .len = FILS_ERP_MAX_USERNAME_LEN }, 631 [NL80211_ATTR_FILS_ERP_REALM] = { .type = NLA_BINARY, 632 .len = FILS_ERP_MAX_REALM_LEN }, 633 [NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] = { .type = NLA_U16 }, 634 [NL80211_ATTR_FILS_ERP_RRK] = { .type = NLA_BINARY, 635 .len = FILS_ERP_MAX_RRK_LEN }, 636 [NL80211_ATTR_FILS_CACHE_ID] = { .type = NLA_EXACT_LEN_WARN, .len = 2 }, 637 [NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN }, 638 [NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG }, 639 [NL80211_ATTR_EXTERNAL_AUTH_SUPPORT] = { .type = NLA_FLAG }, 640 641 [NL80211_ATTR_TXQ_LIMIT] = { .type = NLA_U32 }, 642 [NL80211_ATTR_TXQ_MEMORY_LIMIT] = { .type = NLA_U32 }, 643 [NL80211_ATTR_TXQ_QUANTUM] = { .type = NLA_U32 }, 644 [NL80211_ATTR_HE_CAPABILITY] = { .type = NLA_BINARY, 645 .len = NL80211_HE_MAX_CAPABILITY_LEN }, 646 647 [NL80211_ATTR_FTM_RESPONDER] = 648 NLA_POLICY_NESTED(nl80211_ftm_responder_policy), 649 [NL80211_ATTR_TIMEOUT] = NLA_POLICY_MIN(NLA_U32, 1), 650 [NL80211_ATTR_PEER_MEASUREMENTS] = 651 NLA_POLICY_NESTED(nl80211_pmsr_attr_policy), 652 [NL80211_ATTR_AIRTIME_WEIGHT] = NLA_POLICY_MIN(NLA_U16, 1), 653 [NL80211_ATTR_SAE_PASSWORD] = { .type = NLA_BINARY, 654 .len = SAE_PASSWORD_MAX_LEN }, 655 [NL80211_ATTR_TWT_RESPONDER] = { .type = NLA_FLAG }, 656 [NL80211_ATTR_HE_OBSS_PD] = NLA_POLICY_NESTED(he_obss_pd_policy), 657 [NL80211_ATTR_VLAN_ID] = NLA_POLICY_RANGE(NLA_U16, 1, VLAN_N_VID - 2), 658 [NL80211_ATTR_HE_BSS_COLOR] = NLA_POLICY_NESTED(he_bss_color_policy), 659 [NL80211_ATTR_TID_CONFIG] = 660 NLA_POLICY_NESTED_ARRAY(nl80211_tid_config_attr_policy), 661 [NL80211_ATTR_CONTROL_PORT_NO_PREAUTH] = { .type = NLA_FLAG }, 662 [NL80211_ATTR_PMK_LIFETIME] = NLA_POLICY_MIN(NLA_U32, 1), 663 [NL80211_ATTR_PMK_REAUTH_THRESHOLD] = NLA_POLICY_RANGE(NLA_U8, 1, 100), 664 }; 665 666 /* policy for the key attributes */ 667 static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = { 668 [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN }, 669 [NL80211_KEY_IDX] = { .type = NLA_U8 }, 670 [NL80211_KEY_CIPHER] = { .type = NLA_U32 }, 671 [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 }, 672 [NL80211_KEY_DEFAULT] = { .type = NLA_FLAG }, 673 [NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG }, 674 [NL80211_KEY_TYPE] = NLA_POLICY_MAX(NLA_U32, NUM_NL80211_KEYTYPES - 1), 675 [NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED }, 676 [NL80211_KEY_MODE] = NLA_POLICY_RANGE(NLA_U8, 0, NL80211_KEY_SET_TX), 677 }; 678 679 /* policy for the key default flags */ 680 static const struct nla_policy 681 nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = { 682 [NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG }, 683 [NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG }, 684 }; 685 686 #ifdef CONFIG_PM 687 /* policy for WoWLAN attributes */ 688 static const struct nla_policy 689 nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = { 690 [NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG }, 691 [NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG }, 692 [NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG }, 693 [NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED }, 694 [NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE] = { .type = NLA_FLAG }, 695 [NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST] = { .type = NLA_FLAG }, 696 [NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE] = { .type = NLA_FLAG }, 697 [NL80211_WOWLAN_TRIG_RFKILL_RELEASE] = { .type = NLA_FLAG }, 698 [NL80211_WOWLAN_TRIG_TCP_CONNECTION] = { .type = NLA_NESTED }, 699 [NL80211_WOWLAN_TRIG_NET_DETECT] = { .type = NLA_NESTED }, 700 }; 701 702 static const struct nla_policy 703 nl80211_wowlan_tcp_policy[NUM_NL80211_WOWLAN_TCP] = { 704 [NL80211_WOWLAN_TCP_SRC_IPV4] = { .type = NLA_U32 }, 705 [NL80211_WOWLAN_TCP_DST_IPV4] = { .type = NLA_U32 }, 706 [NL80211_WOWLAN_TCP_DST_MAC] = { 707 .type = NLA_EXACT_LEN_WARN, 708 .len = ETH_ALEN 709 }, 710 [NL80211_WOWLAN_TCP_SRC_PORT] = { .type = NLA_U16 }, 711 [NL80211_WOWLAN_TCP_DST_PORT] = { .type = NLA_U16 }, 712 [NL80211_WOWLAN_TCP_DATA_PAYLOAD] = { .type = NLA_MIN_LEN, .len = 1 }, 713 [NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ] = { 714 .len = sizeof(struct nl80211_wowlan_tcp_data_seq) 715 }, 716 [NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN] = { 717 .len = sizeof(struct nl80211_wowlan_tcp_data_token) 718 }, 719 [NL80211_WOWLAN_TCP_DATA_INTERVAL] = { .type = NLA_U32 }, 720 [NL80211_WOWLAN_TCP_WAKE_PAYLOAD] = { .type = NLA_MIN_LEN, .len = 1 }, 721 [NL80211_WOWLAN_TCP_WAKE_MASK] = { .type = NLA_MIN_LEN, .len = 1 }, 722 }; 723 #endif /* CONFIG_PM */ 724 725 /* policy for coalesce rule attributes */ 726 static const struct nla_policy 727 nl80211_coalesce_policy[NUM_NL80211_ATTR_COALESCE_RULE] = { 728 [NL80211_ATTR_COALESCE_RULE_DELAY] = { .type = NLA_U32 }, 729 [NL80211_ATTR_COALESCE_RULE_CONDITION] = 730 NLA_POLICY_RANGE(NLA_U32, 731 NL80211_COALESCE_CONDITION_MATCH, 732 NL80211_COALESCE_CONDITION_NO_MATCH), 733 [NL80211_ATTR_COALESCE_RULE_PKT_PATTERN] = { .type = NLA_NESTED }, 734 }; 735 736 /* policy for GTK rekey offload attributes */ 737 static const struct nla_policy 738 nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = { 739 [NL80211_REKEY_DATA_KEK] = { 740 .type = NLA_EXACT_LEN_WARN, 741 .len = NL80211_KEK_LEN, 742 }, 743 [NL80211_REKEY_DATA_KCK] = { 744 .type = NLA_EXACT_LEN_WARN, 745 .len = NL80211_KCK_LEN, 746 }, 747 [NL80211_REKEY_DATA_REPLAY_CTR] = { 748 .type = NLA_EXACT_LEN_WARN, 749 .len = NL80211_REPLAY_CTR_LEN 750 }, 751 }; 752 753 static const struct nla_policy 754 nl80211_match_band_rssi_policy[NUM_NL80211_BANDS] = { 755 [NL80211_BAND_2GHZ] = { .type = NLA_S32 }, 756 [NL80211_BAND_5GHZ] = { .type = NLA_S32 }, 757 [NL80211_BAND_6GHZ] = { .type = NLA_S32 }, 758 [NL80211_BAND_60GHZ] = { .type = NLA_S32 }, 759 }; 760 761 static const struct nla_policy 762 nl80211_match_policy[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1] = { 763 [NL80211_SCHED_SCAN_MATCH_ATTR_SSID] = { .type = NLA_BINARY, 764 .len = IEEE80211_MAX_SSID_LEN }, 765 [NL80211_SCHED_SCAN_MATCH_ATTR_BSSID] = { 766 .type = NLA_EXACT_LEN_WARN, 767 .len = ETH_ALEN 768 }, 769 [NL80211_SCHED_SCAN_MATCH_ATTR_RSSI] = { .type = NLA_U32 }, 770 [NL80211_SCHED_SCAN_MATCH_PER_BAND_RSSI] = 771 NLA_POLICY_NESTED(nl80211_match_band_rssi_policy), 772 }; 773 774 static const struct nla_policy 775 nl80211_plan_policy[NL80211_SCHED_SCAN_PLAN_MAX + 1] = { 776 [NL80211_SCHED_SCAN_PLAN_INTERVAL] = { .type = NLA_U32 }, 777 [NL80211_SCHED_SCAN_PLAN_ITERATIONS] = { .type = NLA_U32 }, 778 }; 779 780 static const struct nla_policy 781 nl80211_bss_select_policy[NL80211_BSS_SELECT_ATTR_MAX + 1] = { 782 [NL80211_BSS_SELECT_ATTR_RSSI] = { .type = NLA_FLAG }, 783 [NL80211_BSS_SELECT_ATTR_BAND_PREF] = { .type = NLA_U32 }, 784 [NL80211_BSS_SELECT_ATTR_RSSI_ADJUST] = { 785 .len = sizeof(struct nl80211_bss_select_rssi_adjust) 786 }, 787 }; 788 789 /* policy for NAN function attributes */ 790 static const struct nla_policy 791 nl80211_nan_func_policy[NL80211_NAN_FUNC_ATTR_MAX + 1] = { 792 [NL80211_NAN_FUNC_TYPE] = { .type = NLA_U8 }, 793 [NL80211_NAN_FUNC_SERVICE_ID] = { 794 .len = NL80211_NAN_FUNC_SERVICE_ID_LEN }, 795 [NL80211_NAN_FUNC_PUBLISH_TYPE] = { .type = NLA_U8 }, 796 [NL80211_NAN_FUNC_PUBLISH_BCAST] = { .type = NLA_FLAG }, 797 [NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE] = { .type = NLA_FLAG }, 798 [NL80211_NAN_FUNC_FOLLOW_UP_ID] = { .type = NLA_U8 }, 799 [NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] = { .type = NLA_U8 }, 800 [NL80211_NAN_FUNC_FOLLOW_UP_DEST] = { 801 .type = NLA_EXACT_LEN_WARN, 802 .len = ETH_ALEN 803 }, 804 [NL80211_NAN_FUNC_CLOSE_RANGE] = { .type = NLA_FLAG }, 805 [NL80211_NAN_FUNC_TTL] = { .type = NLA_U32 }, 806 [NL80211_NAN_FUNC_SERVICE_INFO] = { .type = NLA_BINARY, 807 .len = NL80211_NAN_FUNC_SERVICE_SPEC_INFO_MAX_LEN }, 808 [NL80211_NAN_FUNC_SRF] = { .type = NLA_NESTED }, 809 [NL80211_NAN_FUNC_RX_MATCH_FILTER] = { .type = NLA_NESTED }, 810 [NL80211_NAN_FUNC_TX_MATCH_FILTER] = { .type = NLA_NESTED }, 811 [NL80211_NAN_FUNC_INSTANCE_ID] = { .type = NLA_U8 }, 812 [NL80211_NAN_FUNC_TERM_REASON] = { .type = NLA_U8 }, 813 }; 814 815 /* policy for Service Response Filter attributes */ 816 static const struct nla_policy 817 nl80211_nan_srf_policy[NL80211_NAN_SRF_ATTR_MAX + 1] = { 818 [NL80211_NAN_SRF_INCLUDE] = { .type = NLA_FLAG }, 819 [NL80211_NAN_SRF_BF] = { .type = NLA_BINARY, 820 .len = NL80211_NAN_FUNC_SRF_MAX_LEN }, 821 [NL80211_NAN_SRF_BF_IDX] = { .type = NLA_U8 }, 822 [NL80211_NAN_SRF_MAC_ADDRS] = { .type = NLA_NESTED }, 823 }; 824 825 /* policy for packet pattern attributes */ 826 static const struct nla_policy 827 nl80211_packet_pattern_policy[MAX_NL80211_PKTPAT + 1] = { 828 [NL80211_PKTPAT_MASK] = { .type = NLA_BINARY, }, 829 [NL80211_PKTPAT_PATTERN] = { .type = NLA_BINARY, }, 830 [NL80211_PKTPAT_OFFSET] = { .type = NLA_U32 }, 831 }; 832 833 int nl80211_prepare_wdev_dump(struct netlink_callback *cb, 834 struct cfg80211_registered_device **rdev, 835 struct wireless_dev **wdev) 836 { 837 int err; 838 839 if (!cb->args[0]) { 840 struct nlattr **attrbuf; 841 842 attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf), 843 GFP_KERNEL); 844 if (!attrbuf) 845 return -ENOMEM; 846 847 err = nlmsg_parse_deprecated(cb->nlh, 848 GENL_HDRLEN + nl80211_fam.hdrsize, 849 attrbuf, nl80211_fam.maxattr, 850 nl80211_policy, NULL); 851 if (err) { 852 kfree(attrbuf); 853 return err; 854 } 855 856 *wdev = __cfg80211_wdev_from_attrs(sock_net(cb->skb->sk), 857 attrbuf); 858 kfree(attrbuf); 859 if (IS_ERR(*wdev)) 860 return PTR_ERR(*wdev); 861 *rdev = wiphy_to_rdev((*wdev)->wiphy); 862 /* 0 is the first index - add 1 to parse only once */ 863 cb->args[0] = (*rdev)->wiphy_idx + 1; 864 cb->args[1] = (*wdev)->identifier; 865 } else { 866 /* subtract the 1 again here */ 867 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); 868 struct wireless_dev *tmp; 869 870 if (!wiphy) 871 return -ENODEV; 872 *rdev = wiphy_to_rdev(wiphy); 873 *wdev = NULL; 874 875 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) { 876 if (tmp->identifier == cb->args[1]) { 877 *wdev = tmp; 878 break; 879 } 880 } 881 882 if (!*wdev) 883 return -ENODEV; 884 } 885 886 return 0; 887 } 888 889 /* message building helper */ 890 void *nl80211hdr_put(struct sk_buff *skb, u32 portid, u32 seq, 891 int flags, u8 cmd) 892 { 893 /* since there is no private header just add the generic one */ 894 return genlmsg_put(skb, portid, seq, &nl80211_fam, flags, cmd); 895 } 896 897 static int nl80211_msg_put_wmm_rules(struct sk_buff *msg, 898 const struct ieee80211_reg_rule *rule) 899 { 900 int j; 901 struct nlattr *nl_wmm_rules = 902 nla_nest_start_noflag(msg, NL80211_FREQUENCY_ATTR_WMM); 903 904 if (!nl_wmm_rules) 905 goto nla_put_failure; 906 907 for (j = 0; j < IEEE80211_NUM_ACS; j++) { 908 struct nlattr *nl_wmm_rule = nla_nest_start_noflag(msg, j); 909 910 if (!nl_wmm_rule) 911 goto nla_put_failure; 912 913 if (nla_put_u16(msg, NL80211_WMMR_CW_MIN, 914 rule->wmm_rule.client[j].cw_min) || 915 nla_put_u16(msg, NL80211_WMMR_CW_MAX, 916 rule->wmm_rule.client[j].cw_max) || 917 nla_put_u8(msg, NL80211_WMMR_AIFSN, 918 rule->wmm_rule.client[j].aifsn) || 919 nla_put_u16(msg, NL80211_WMMR_TXOP, 920 rule->wmm_rule.client[j].cot)) 921 goto nla_put_failure; 922 923 nla_nest_end(msg, nl_wmm_rule); 924 } 925 nla_nest_end(msg, nl_wmm_rules); 926 927 return 0; 928 929 nla_put_failure: 930 return -ENOBUFS; 931 } 932 933 static int nl80211_msg_put_channel(struct sk_buff *msg, struct wiphy *wiphy, 934 struct ieee80211_channel *chan, 935 bool large) 936 { 937 /* Some channels must be completely excluded from the 938 * list to protect old user-space tools from breaking 939 */ 940 if (!large && chan->flags & 941 (IEEE80211_CHAN_NO_10MHZ | IEEE80211_CHAN_NO_20MHZ)) 942 return 0; 943 944 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ, 945 chan->center_freq)) 946 goto nla_put_failure; 947 948 if ((chan->flags & IEEE80211_CHAN_DISABLED) && 949 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DISABLED)) 950 goto nla_put_failure; 951 if (chan->flags & IEEE80211_CHAN_NO_IR) { 952 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IR)) 953 goto nla_put_failure; 954 if (nla_put_flag(msg, __NL80211_FREQUENCY_ATTR_NO_IBSS)) 955 goto nla_put_failure; 956 } 957 if (chan->flags & IEEE80211_CHAN_RADAR) { 958 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR)) 959 goto nla_put_failure; 960 if (large) { 961 u32 time; 962 963 time = elapsed_jiffies_msecs(chan->dfs_state_entered); 964 965 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE, 966 chan->dfs_state)) 967 goto nla_put_failure; 968 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME, 969 time)) 970 goto nla_put_failure; 971 if (nla_put_u32(msg, 972 NL80211_FREQUENCY_ATTR_DFS_CAC_TIME, 973 chan->dfs_cac_ms)) 974 goto nla_put_failure; 975 } 976 } 977 978 if (large) { 979 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) && 980 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS)) 981 goto nla_put_failure; 982 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) && 983 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS)) 984 goto nla_put_failure; 985 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) && 986 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ)) 987 goto nla_put_failure; 988 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) && 989 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ)) 990 goto nla_put_failure; 991 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) && 992 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_INDOOR_ONLY)) 993 goto nla_put_failure; 994 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) && 995 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_IR_CONCURRENT)) 996 goto nla_put_failure; 997 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) && 998 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_20MHZ)) 999 goto nla_put_failure; 1000 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) && 1001 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_10MHZ)) 1002 goto nla_put_failure; 1003 if ((chan->flags & IEEE80211_CHAN_NO_HE) && 1004 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HE)) 1005 goto nla_put_failure; 1006 } 1007 1008 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER, 1009 DBM_TO_MBM(chan->max_power))) 1010 goto nla_put_failure; 1011 1012 if (large) { 1013 const struct ieee80211_reg_rule *rule = 1014 freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq)); 1015 1016 if (!IS_ERR_OR_NULL(rule) && rule->has_wmm) { 1017 if (nl80211_msg_put_wmm_rules(msg, rule)) 1018 goto nla_put_failure; 1019 } 1020 } 1021 1022 return 0; 1023 1024 nla_put_failure: 1025 return -ENOBUFS; 1026 } 1027 1028 static bool nl80211_put_txq_stats(struct sk_buff *msg, 1029 struct cfg80211_txq_stats *txqstats, 1030 int attrtype) 1031 { 1032 struct nlattr *txqattr; 1033 1034 #define PUT_TXQVAL_U32(attr, memb) do { \ 1035 if (txqstats->filled & BIT(NL80211_TXQ_STATS_ ## attr) && \ 1036 nla_put_u32(msg, NL80211_TXQ_STATS_ ## attr, txqstats->memb)) \ 1037 return false; \ 1038 } while (0) 1039 1040 txqattr = nla_nest_start_noflag(msg, attrtype); 1041 if (!txqattr) 1042 return false; 1043 1044 PUT_TXQVAL_U32(BACKLOG_BYTES, backlog_bytes); 1045 PUT_TXQVAL_U32(BACKLOG_PACKETS, backlog_packets); 1046 PUT_TXQVAL_U32(FLOWS, flows); 1047 PUT_TXQVAL_U32(DROPS, drops); 1048 PUT_TXQVAL_U32(ECN_MARKS, ecn_marks); 1049 PUT_TXQVAL_U32(OVERLIMIT, overlimit); 1050 PUT_TXQVAL_U32(OVERMEMORY, overmemory); 1051 PUT_TXQVAL_U32(COLLISIONS, collisions); 1052 PUT_TXQVAL_U32(TX_BYTES, tx_bytes); 1053 PUT_TXQVAL_U32(TX_PACKETS, tx_packets); 1054 PUT_TXQVAL_U32(MAX_FLOWS, max_flows); 1055 nla_nest_end(msg, txqattr); 1056 1057 #undef PUT_TXQVAL_U32 1058 return true; 1059 } 1060 1061 /* netlink command implementations */ 1062 1063 struct key_parse { 1064 struct key_params p; 1065 int idx; 1066 int type; 1067 bool def, defmgmt, defbeacon; 1068 bool def_uni, def_multi; 1069 }; 1070 1071 static int nl80211_parse_key_new(struct genl_info *info, struct nlattr *key, 1072 struct key_parse *k) 1073 { 1074 struct nlattr *tb[NL80211_KEY_MAX + 1]; 1075 int err = nla_parse_nested_deprecated(tb, NL80211_KEY_MAX, key, 1076 nl80211_key_policy, 1077 info->extack); 1078 if (err) 1079 return err; 1080 1081 k->def = !!tb[NL80211_KEY_DEFAULT]; 1082 k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT]; 1083 k->defbeacon = !!tb[NL80211_KEY_DEFAULT_BEACON]; 1084 1085 if (k->def) { 1086 k->def_uni = true; 1087 k->def_multi = true; 1088 } 1089 if (k->defmgmt || k->defbeacon) 1090 k->def_multi = true; 1091 1092 if (tb[NL80211_KEY_IDX]) 1093 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]); 1094 1095 if (tb[NL80211_KEY_DATA]) { 1096 k->p.key = nla_data(tb[NL80211_KEY_DATA]); 1097 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]); 1098 } 1099 1100 if (tb[NL80211_KEY_SEQ]) { 1101 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]); 1102 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]); 1103 } 1104 1105 if (tb[NL80211_KEY_CIPHER]) 1106 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]); 1107 1108 if (tb[NL80211_KEY_TYPE]) 1109 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]); 1110 1111 if (tb[NL80211_KEY_DEFAULT_TYPES]) { 1112 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES]; 1113 1114 err = nla_parse_nested_deprecated(kdt, 1115 NUM_NL80211_KEY_DEFAULT_TYPES - 1, 1116 tb[NL80211_KEY_DEFAULT_TYPES], 1117 nl80211_key_default_policy, 1118 info->extack); 1119 if (err) 1120 return err; 1121 1122 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; 1123 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; 1124 } 1125 1126 if (tb[NL80211_KEY_MODE]) 1127 k->p.mode = nla_get_u8(tb[NL80211_KEY_MODE]); 1128 1129 return 0; 1130 } 1131 1132 static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k) 1133 { 1134 if (info->attrs[NL80211_ATTR_KEY_DATA]) { 1135 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]); 1136 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]); 1137 } 1138 1139 if (info->attrs[NL80211_ATTR_KEY_SEQ]) { 1140 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]); 1141 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]); 1142 } 1143 1144 if (info->attrs[NL80211_ATTR_KEY_IDX]) 1145 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); 1146 1147 if (info->attrs[NL80211_ATTR_KEY_CIPHER]) 1148 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]); 1149 1150 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT]; 1151 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT]; 1152 1153 if (k->def) { 1154 k->def_uni = true; 1155 k->def_multi = true; 1156 } 1157 if (k->defmgmt) 1158 k->def_multi = true; 1159 1160 if (info->attrs[NL80211_ATTR_KEY_TYPE]) 1161 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); 1162 1163 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) { 1164 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES]; 1165 int err = nla_parse_nested_deprecated(kdt, 1166 NUM_NL80211_KEY_DEFAULT_TYPES - 1, 1167 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES], 1168 nl80211_key_default_policy, 1169 info->extack); 1170 if (err) 1171 return err; 1172 1173 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; 1174 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; 1175 } 1176 1177 return 0; 1178 } 1179 1180 static int nl80211_parse_key(struct genl_info *info, struct key_parse *k) 1181 { 1182 int err; 1183 1184 memset(k, 0, sizeof(*k)); 1185 k->idx = -1; 1186 k->type = -1; 1187 1188 if (info->attrs[NL80211_ATTR_KEY]) 1189 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k); 1190 else 1191 err = nl80211_parse_key_old(info, k); 1192 1193 if (err) 1194 return err; 1195 1196 if ((k->def ? 1 : 0) + (k->defmgmt ? 1 : 0) + 1197 (k->defbeacon ? 1 : 0) > 1) { 1198 GENL_SET_ERR_MSG(info, 1199 "key with multiple default flags is invalid"); 1200 return -EINVAL; 1201 } 1202 1203 if (k->defmgmt || k->defbeacon) { 1204 if (k->def_uni || !k->def_multi) { 1205 GENL_SET_ERR_MSG(info, 1206 "defmgmt/defbeacon key must be mcast"); 1207 return -EINVAL; 1208 } 1209 } 1210 1211 if (k->idx != -1) { 1212 if (k->defmgmt) { 1213 if (k->idx < 4 || k->idx > 5) { 1214 GENL_SET_ERR_MSG(info, 1215 "defmgmt key idx not 4 or 5"); 1216 return -EINVAL; 1217 } 1218 } else if (k->defbeacon) { 1219 if (k->idx < 6 || k->idx > 7) { 1220 GENL_SET_ERR_MSG(info, 1221 "defbeacon key idx not 6 or 7"); 1222 return -EINVAL; 1223 } 1224 } else if (k->def) { 1225 if (k->idx < 0 || k->idx > 3) { 1226 GENL_SET_ERR_MSG(info, "def key idx not 0-3"); 1227 return -EINVAL; 1228 } 1229 } else { 1230 if (k->idx < 0 || k->idx > 7) { 1231 GENL_SET_ERR_MSG(info, "key idx not 0-7"); 1232 return -EINVAL; 1233 } 1234 } 1235 } 1236 1237 return 0; 1238 } 1239 1240 static struct cfg80211_cached_keys * 1241 nl80211_parse_connkeys(struct cfg80211_registered_device *rdev, 1242 struct genl_info *info, bool *no_ht) 1243 { 1244 struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS]; 1245 struct key_parse parse; 1246 struct nlattr *key; 1247 struct cfg80211_cached_keys *result; 1248 int rem, err, def = 0; 1249 bool have_key = false; 1250 1251 nla_for_each_nested(key, keys, rem) { 1252 have_key = true; 1253 break; 1254 } 1255 1256 if (!have_key) 1257 return NULL; 1258 1259 result = kzalloc(sizeof(*result), GFP_KERNEL); 1260 if (!result) 1261 return ERR_PTR(-ENOMEM); 1262 1263 result->def = -1; 1264 1265 nla_for_each_nested(key, keys, rem) { 1266 memset(&parse, 0, sizeof(parse)); 1267 parse.idx = -1; 1268 1269 err = nl80211_parse_key_new(info, key, &parse); 1270 if (err) 1271 goto error; 1272 err = -EINVAL; 1273 if (!parse.p.key) 1274 goto error; 1275 if (parse.idx < 0 || parse.idx > 3) { 1276 GENL_SET_ERR_MSG(info, "key index out of range [0-3]"); 1277 goto error; 1278 } 1279 if (parse.def) { 1280 if (def) { 1281 GENL_SET_ERR_MSG(info, 1282 "only one key can be default"); 1283 goto error; 1284 } 1285 def = 1; 1286 result->def = parse.idx; 1287 if (!parse.def_uni || !parse.def_multi) 1288 goto error; 1289 } else if (parse.defmgmt) 1290 goto error; 1291 err = cfg80211_validate_key_settings(rdev, &parse.p, 1292 parse.idx, false, NULL); 1293 if (err) 1294 goto error; 1295 if (parse.p.cipher != WLAN_CIPHER_SUITE_WEP40 && 1296 parse.p.cipher != WLAN_CIPHER_SUITE_WEP104) { 1297 GENL_SET_ERR_MSG(info, "connect key must be WEP"); 1298 err = -EINVAL; 1299 goto error; 1300 } 1301 result->params[parse.idx].cipher = parse.p.cipher; 1302 result->params[parse.idx].key_len = parse.p.key_len; 1303 result->params[parse.idx].key = result->data[parse.idx]; 1304 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len); 1305 1306 /* must be WEP key if we got here */ 1307 if (no_ht) 1308 *no_ht = true; 1309 } 1310 1311 if (result->def < 0) { 1312 err = -EINVAL; 1313 GENL_SET_ERR_MSG(info, "need a default/TX key"); 1314 goto error; 1315 } 1316 1317 return result; 1318 error: 1319 kfree(result); 1320 return ERR_PTR(err); 1321 } 1322 1323 static int nl80211_key_allowed(struct wireless_dev *wdev) 1324 { 1325 ASSERT_WDEV_LOCK(wdev); 1326 1327 switch (wdev->iftype) { 1328 case NL80211_IFTYPE_AP: 1329 case NL80211_IFTYPE_AP_VLAN: 1330 case NL80211_IFTYPE_P2P_GO: 1331 case NL80211_IFTYPE_MESH_POINT: 1332 break; 1333 case NL80211_IFTYPE_ADHOC: 1334 case NL80211_IFTYPE_STATION: 1335 case NL80211_IFTYPE_P2P_CLIENT: 1336 if (!wdev->current_bss) 1337 return -ENOLINK; 1338 break; 1339 case NL80211_IFTYPE_UNSPECIFIED: 1340 case NL80211_IFTYPE_OCB: 1341 case NL80211_IFTYPE_MONITOR: 1342 case NL80211_IFTYPE_NAN: 1343 case NL80211_IFTYPE_P2P_DEVICE: 1344 case NL80211_IFTYPE_WDS: 1345 case NUM_NL80211_IFTYPES: 1346 return -EINVAL; 1347 } 1348 1349 return 0; 1350 } 1351 1352 static struct ieee80211_channel *nl80211_get_valid_chan(struct wiphy *wiphy, 1353 struct nlattr *tb) 1354 { 1355 struct ieee80211_channel *chan; 1356 1357 if (tb == NULL) 1358 return NULL; 1359 chan = ieee80211_get_channel(wiphy, nla_get_u32(tb)); 1360 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) 1361 return NULL; 1362 return chan; 1363 } 1364 1365 static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes) 1366 { 1367 struct nlattr *nl_modes = nla_nest_start_noflag(msg, attr); 1368 int i; 1369 1370 if (!nl_modes) 1371 goto nla_put_failure; 1372 1373 i = 0; 1374 while (ifmodes) { 1375 if ((ifmodes & 1) && nla_put_flag(msg, i)) 1376 goto nla_put_failure; 1377 ifmodes >>= 1; 1378 i++; 1379 } 1380 1381 nla_nest_end(msg, nl_modes); 1382 return 0; 1383 1384 nla_put_failure: 1385 return -ENOBUFS; 1386 } 1387 1388 static int nl80211_put_iface_combinations(struct wiphy *wiphy, 1389 struct sk_buff *msg, 1390 bool large) 1391 { 1392 struct nlattr *nl_combis; 1393 int i, j; 1394 1395 nl_combis = nla_nest_start_noflag(msg, 1396 NL80211_ATTR_INTERFACE_COMBINATIONS); 1397 if (!nl_combis) 1398 goto nla_put_failure; 1399 1400 for (i = 0; i < wiphy->n_iface_combinations; i++) { 1401 const struct ieee80211_iface_combination *c; 1402 struct nlattr *nl_combi, *nl_limits; 1403 1404 c = &wiphy->iface_combinations[i]; 1405 1406 nl_combi = nla_nest_start_noflag(msg, i + 1); 1407 if (!nl_combi) 1408 goto nla_put_failure; 1409 1410 nl_limits = nla_nest_start_noflag(msg, 1411 NL80211_IFACE_COMB_LIMITS); 1412 if (!nl_limits) 1413 goto nla_put_failure; 1414 1415 for (j = 0; j < c->n_limits; j++) { 1416 struct nlattr *nl_limit; 1417 1418 nl_limit = nla_nest_start_noflag(msg, j + 1); 1419 if (!nl_limit) 1420 goto nla_put_failure; 1421 if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX, 1422 c->limits[j].max)) 1423 goto nla_put_failure; 1424 if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES, 1425 c->limits[j].types)) 1426 goto nla_put_failure; 1427 nla_nest_end(msg, nl_limit); 1428 } 1429 1430 nla_nest_end(msg, nl_limits); 1431 1432 if (c->beacon_int_infra_match && 1433 nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH)) 1434 goto nla_put_failure; 1435 if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS, 1436 c->num_different_channels) || 1437 nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM, 1438 c->max_interfaces)) 1439 goto nla_put_failure; 1440 if (large && 1441 (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS, 1442 c->radar_detect_widths) || 1443 nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS, 1444 c->radar_detect_regions))) 1445 goto nla_put_failure; 1446 if (c->beacon_int_min_gcd && 1447 nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD, 1448 c->beacon_int_min_gcd)) 1449 goto nla_put_failure; 1450 1451 nla_nest_end(msg, nl_combi); 1452 } 1453 1454 nla_nest_end(msg, nl_combis); 1455 1456 return 0; 1457 nla_put_failure: 1458 return -ENOBUFS; 1459 } 1460 1461 #ifdef CONFIG_PM 1462 static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev, 1463 struct sk_buff *msg) 1464 { 1465 const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp; 1466 struct nlattr *nl_tcp; 1467 1468 if (!tcp) 1469 return 0; 1470 1471 nl_tcp = nla_nest_start_noflag(msg, 1472 NL80211_WOWLAN_TRIG_TCP_CONNECTION); 1473 if (!nl_tcp) 1474 return -ENOBUFS; 1475 1476 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 1477 tcp->data_payload_max)) 1478 return -ENOBUFS; 1479 1480 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 1481 tcp->data_payload_max)) 1482 return -ENOBUFS; 1483 1484 if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ)) 1485 return -ENOBUFS; 1486 1487 if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 1488 sizeof(*tcp->tok), tcp->tok)) 1489 return -ENOBUFS; 1490 1491 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 1492 tcp->data_interval_max)) 1493 return -ENOBUFS; 1494 1495 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 1496 tcp->wake_payload_max)) 1497 return -ENOBUFS; 1498 1499 nla_nest_end(msg, nl_tcp); 1500 return 0; 1501 } 1502 1503 static int nl80211_send_wowlan(struct sk_buff *msg, 1504 struct cfg80211_registered_device *rdev, 1505 bool large) 1506 { 1507 struct nlattr *nl_wowlan; 1508 1509 if (!rdev->wiphy.wowlan) 1510 return 0; 1511 1512 nl_wowlan = nla_nest_start_noflag(msg, 1513 NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED); 1514 if (!nl_wowlan) 1515 return -ENOBUFS; 1516 1517 if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) && 1518 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 1519 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) && 1520 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 1521 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) && 1522 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 1523 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) && 1524 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED)) || 1525 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && 1526 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 1527 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) && 1528 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 1529 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) && 1530 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 1531 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) && 1532 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 1533 return -ENOBUFS; 1534 1535 if (rdev->wiphy.wowlan->n_patterns) { 1536 struct nl80211_pattern_support pat = { 1537 .max_patterns = rdev->wiphy.wowlan->n_patterns, 1538 .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len, 1539 .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len, 1540 .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset, 1541 }; 1542 1543 if (nla_put(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN, 1544 sizeof(pat), &pat)) 1545 return -ENOBUFS; 1546 } 1547 1548 if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) && 1549 nla_put_u32(msg, NL80211_WOWLAN_TRIG_NET_DETECT, 1550 rdev->wiphy.wowlan->max_nd_match_sets)) 1551 return -ENOBUFS; 1552 1553 if (large && nl80211_send_wowlan_tcp_caps(rdev, msg)) 1554 return -ENOBUFS; 1555 1556 nla_nest_end(msg, nl_wowlan); 1557 1558 return 0; 1559 } 1560 #endif 1561 1562 static int nl80211_send_coalesce(struct sk_buff *msg, 1563 struct cfg80211_registered_device *rdev) 1564 { 1565 struct nl80211_coalesce_rule_support rule; 1566 1567 if (!rdev->wiphy.coalesce) 1568 return 0; 1569 1570 rule.max_rules = rdev->wiphy.coalesce->n_rules; 1571 rule.max_delay = rdev->wiphy.coalesce->max_delay; 1572 rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns; 1573 rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len; 1574 rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len; 1575 rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset; 1576 1577 if (nla_put(msg, NL80211_ATTR_COALESCE_RULE, sizeof(rule), &rule)) 1578 return -ENOBUFS; 1579 1580 return 0; 1581 } 1582 1583 static int 1584 nl80211_send_iftype_data(struct sk_buff *msg, 1585 const struct ieee80211_sband_iftype_data *iftdata) 1586 { 1587 const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap; 1588 1589 if (nl80211_put_iftypes(msg, NL80211_BAND_IFTYPE_ATTR_IFTYPES, 1590 iftdata->types_mask)) 1591 return -ENOBUFS; 1592 1593 if (he_cap->has_he) { 1594 if (nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MAC, 1595 sizeof(he_cap->he_cap_elem.mac_cap_info), 1596 he_cap->he_cap_elem.mac_cap_info) || 1597 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY, 1598 sizeof(he_cap->he_cap_elem.phy_cap_info), 1599 he_cap->he_cap_elem.phy_cap_info) || 1600 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET, 1601 sizeof(he_cap->he_mcs_nss_supp), 1602 &he_cap->he_mcs_nss_supp) || 1603 nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE, 1604 sizeof(he_cap->ppe_thres), he_cap->ppe_thres)) 1605 return -ENOBUFS; 1606 } 1607 1608 return 0; 1609 } 1610 1611 static int nl80211_send_band_rateinfo(struct sk_buff *msg, 1612 struct ieee80211_supported_band *sband) 1613 { 1614 struct nlattr *nl_rates, *nl_rate; 1615 struct ieee80211_rate *rate; 1616 int i; 1617 1618 /* add HT info */ 1619 if (sband->ht_cap.ht_supported && 1620 (nla_put(msg, NL80211_BAND_ATTR_HT_MCS_SET, 1621 sizeof(sband->ht_cap.mcs), 1622 &sband->ht_cap.mcs) || 1623 nla_put_u16(msg, NL80211_BAND_ATTR_HT_CAPA, 1624 sband->ht_cap.cap) || 1625 nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR, 1626 sband->ht_cap.ampdu_factor) || 1627 nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY, 1628 sband->ht_cap.ampdu_density))) 1629 return -ENOBUFS; 1630 1631 /* add VHT info */ 1632 if (sband->vht_cap.vht_supported && 1633 (nla_put(msg, NL80211_BAND_ATTR_VHT_MCS_SET, 1634 sizeof(sband->vht_cap.vht_mcs), 1635 &sband->vht_cap.vht_mcs) || 1636 nla_put_u32(msg, NL80211_BAND_ATTR_VHT_CAPA, 1637 sband->vht_cap.cap))) 1638 return -ENOBUFS; 1639 1640 if (sband->n_iftype_data) { 1641 struct nlattr *nl_iftype_data = 1642 nla_nest_start_noflag(msg, 1643 NL80211_BAND_ATTR_IFTYPE_DATA); 1644 int err; 1645 1646 if (!nl_iftype_data) 1647 return -ENOBUFS; 1648 1649 for (i = 0; i < sband->n_iftype_data; i++) { 1650 struct nlattr *iftdata; 1651 1652 iftdata = nla_nest_start_noflag(msg, i + 1); 1653 if (!iftdata) 1654 return -ENOBUFS; 1655 1656 err = nl80211_send_iftype_data(msg, 1657 &sband->iftype_data[i]); 1658 if (err) 1659 return err; 1660 1661 nla_nest_end(msg, iftdata); 1662 } 1663 1664 nla_nest_end(msg, nl_iftype_data); 1665 } 1666 1667 /* add EDMG info */ 1668 if (sband->edmg_cap.channels && 1669 (nla_put_u8(msg, NL80211_BAND_ATTR_EDMG_CHANNELS, 1670 sband->edmg_cap.channels) || 1671 nla_put_u8(msg, NL80211_BAND_ATTR_EDMG_BW_CONFIG, 1672 sband->edmg_cap.bw_config))) 1673 1674 return -ENOBUFS; 1675 1676 /* add bitrates */ 1677 nl_rates = nla_nest_start_noflag(msg, NL80211_BAND_ATTR_RATES); 1678 if (!nl_rates) 1679 return -ENOBUFS; 1680 1681 for (i = 0; i < sband->n_bitrates; i++) { 1682 nl_rate = nla_nest_start_noflag(msg, i); 1683 if (!nl_rate) 1684 return -ENOBUFS; 1685 1686 rate = &sband->bitrates[i]; 1687 if (nla_put_u32(msg, NL80211_BITRATE_ATTR_RATE, 1688 rate->bitrate)) 1689 return -ENOBUFS; 1690 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && 1691 nla_put_flag(msg, 1692 NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE)) 1693 return -ENOBUFS; 1694 1695 nla_nest_end(msg, nl_rate); 1696 } 1697 1698 nla_nest_end(msg, nl_rates); 1699 1700 return 0; 1701 } 1702 1703 static int 1704 nl80211_send_mgmt_stypes(struct sk_buff *msg, 1705 const struct ieee80211_txrx_stypes *mgmt_stypes) 1706 { 1707 u16 stypes; 1708 struct nlattr *nl_ftypes, *nl_ifs; 1709 enum nl80211_iftype ift; 1710 int i; 1711 1712 if (!mgmt_stypes) 1713 return 0; 1714 1715 nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_TX_FRAME_TYPES); 1716 if (!nl_ifs) 1717 return -ENOBUFS; 1718 1719 for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) { 1720 nl_ftypes = nla_nest_start_noflag(msg, ift); 1721 if (!nl_ftypes) 1722 return -ENOBUFS; 1723 i = 0; 1724 stypes = mgmt_stypes[ift].tx; 1725 while (stypes) { 1726 if ((stypes & 1) && 1727 nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE, 1728 (i << 4) | IEEE80211_FTYPE_MGMT)) 1729 return -ENOBUFS; 1730 stypes >>= 1; 1731 i++; 1732 } 1733 nla_nest_end(msg, nl_ftypes); 1734 } 1735 1736 nla_nest_end(msg, nl_ifs); 1737 1738 nl_ifs = nla_nest_start_noflag(msg, NL80211_ATTR_RX_FRAME_TYPES); 1739 if (!nl_ifs) 1740 return -ENOBUFS; 1741 1742 for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) { 1743 nl_ftypes = nla_nest_start_noflag(msg, ift); 1744 if (!nl_ftypes) 1745 return -ENOBUFS; 1746 i = 0; 1747 stypes = mgmt_stypes[ift].rx; 1748 while (stypes) { 1749 if ((stypes & 1) && 1750 nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE, 1751 (i << 4) | IEEE80211_FTYPE_MGMT)) 1752 return -ENOBUFS; 1753 stypes >>= 1; 1754 i++; 1755 } 1756 nla_nest_end(msg, nl_ftypes); 1757 } 1758 nla_nest_end(msg, nl_ifs); 1759 1760 return 0; 1761 } 1762 1763 #define CMD(op, n) \ 1764 do { \ 1765 if (rdev->ops->op) { \ 1766 i++; \ 1767 if (nla_put_u32(msg, i, NL80211_CMD_ ## n)) \ 1768 goto nla_put_failure; \ 1769 } \ 1770 } while (0) 1771 1772 static int nl80211_add_commands_unsplit(struct cfg80211_registered_device *rdev, 1773 struct sk_buff *msg) 1774 { 1775 int i = 0; 1776 1777 /* 1778 * do *NOT* add anything into this function, new things need to be 1779 * advertised only to new versions of userspace that can deal with 1780 * the split (and they can't possibly care about new features... 1781 */ 1782 CMD(add_virtual_intf, NEW_INTERFACE); 1783 CMD(change_virtual_intf, SET_INTERFACE); 1784 CMD(add_key, NEW_KEY); 1785 CMD(start_ap, START_AP); 1786 CMD(add_station, NEW_STATION); 1787 CMD(add_mpath, NEW_MPATH); 1788 CMD(update_mesh_config, SET_MESH_CONFIG); 1789 CMD(change_bss, SET_BSS); 1790 CMD(auth, AUTHENTICATE); 1791 CMD(assoc, ASSOCIATE); 1792 CMD(deauth, DEAUTHENTICATE); 1793 CMD(disassoc, DISASSOCIATE); 1794 CMD(join_ibss, JOIN_IBSS); 1795 CMD(join_mesh, JOIN_MESH); 1796 CMD(set_pmksa, SET_PMKSA); 1797 CMD(del_pmksa, DEL_PMKSA); 1798 CMD(flush_pmksa, FLUSH_PMKSA); 1799 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) 1800 CMD(remain_on_channel, REMAIN_ON_CHANNEL); 1801 CMD(set_bitrate_mask, SET_TX_BITRATE_MASK); 1802 CMD(mgmt_tx, FRAME); 1803 CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL); 1804 if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) { 1805 i++; 1806 if (nla_put_u32(msg, i, NL80211_CMD_SET_WIPHY_NETNS)) 1807 goto nla_put_failure; 1808 } 1809 if (rdev->ops->set_monitor_channel || rdev->ops->start_ap || 1810 rdev->ops->join_mesh) { 1811 i++; 1812 if (nla_put_u32(msg, i, NL80211_CMD_SET_CHANNEL)) 1813 goto nla_put_failure; 1814 } 1815 CMD(set_wds_peer, SET_WDS_PEER); 1816 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) { 1817 CMD(tdls_mgmt, TDLS_MGMT); 1818 CMD(tdls_oper, TDLS_OPER); 1819 } 1820 if (rdev->wiphy.max_sched_scan_reqs) 1821 CMD(sched_scan_start, START_SCHED_SCAN); 1822 CMD(probe_client, PROBE_CLIENT); 1823 CMD(set_noack_map, SET_NOACK_MAP); 1824 if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) { 1825 i++; 1826 if (nla_put_u32(msg, i, NL80211_CMD_REGISTER_BEACONS)) 1827 goto nla_put_failure; 1828 } 1829 CMD(start_p2p_device, START_P2P_DEVICE); 1830 CMD(set_mcast_rate, SET_MCAST_RATE); 1831 #ifdef CONFIG_NL80211_TESTMODE 1832 CMD(testmode_cmd, TESTMODE); 1833 #endif 1834 1835 if (rdev->ops->connect || rdev->ops->auth) { 1836 i++; 1837 if (nla_put_u32(msg, i, NL80211_CMD_CONNECT)) 1838 goto nla_put_failure; 1839 } 1840 1841 if (rdev->ops->disconnect || rdev->ops->deauth) { 1842 i++; 1843 if (nla_put_u32(msg, i, NL80211_CMD_DISCONNECT)) 1844 goto nla_put_failure; 1845 } 1846 1847 return i; 1848 nla_put_failure: 1849 return -ENOBUFS; 1850 } 1851 1852 static int 1853 nl80211_send_pmsr_ftm_capa(const struct cfg80211_pmsr_capabilities *cap, 1854 struct sk_buff *msg) 1855 { 1856 struct nlattr *ftm; 1857 1858 if (!cap->ftm.supported) 1859 return 0; 1860 1861 ftm = nla_nest_start_noflag(msg, NL80211_PMSR_TYPE_FTM); 1862 if (!ftm) 1863 return -ENOBUFS; 1864 1865 if (cap->ftm.asap && nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_ASAP)) 1866 return -ENOBUFS; 1867 if (cap->ftm.non_asap && 1868 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP)) 1869 return -ENOBUFS; 1870 if (cap->ftm.request_lci && 1871 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI)) 1872 return -ENOBUFS; 1873 if (cap->ftm.request_civicloc && 1874 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_REQ_CIVICLOC)) 1875 return -ENOBUFS; 1876 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES, 1877 cap->ftm.preambles)) 1878 return -ENOBUFS; 1879 if (nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS, 1880 cap->ftm.bandwidths)) 1881 return -ENOBUFS; 1882 if (cap->ftm.max_bursts_exponent >= 0 && 1883 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT, 1884 cap->ftm.max_bursts_exponent)) 1885 return -ENOBUFS; 1886 if (cap->ftm.max_ftms_per_burst && 1887 nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST, 1888 cap->ftm.max_ftms_per_burst)) 1889 return -ENOBUFS; 1890 if (cap->ftm.trigger_based && 1891 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED)) 1892 return -ENOBUFS; 1893 if (cap->ftm.non_trigger_based && 1894 nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED)) 1895 return -ENOBUFS; 1896 1897 nla_nest_end(msg, ftm); 1898 return 0; 1899 } 1900 1901 static int nl80211_send_pmsr_capa(struct cfg80211_registered_device *rdev, 1902 struct sk_buff *msg) 1903 { 1904 const struct cfg80211_pmsr_capabilities *cap = rdev->wiphy.pmsr_capa; 1905 struct nlattr *pmsr, *caps; 1906 1907 if (!cap) 1908 return 0; 1909 1910 /* 1911 * we don't need to clean up anything here since the caller 1912 * will genlmsg_cancel() if we fail 1913 */ 1914 1915 pmsr = nla_nest_start_noflag(msg, NL80211_ATTR_PEER_MEASUREMENTS); 1916 if (!pmsr) 1917 return -ENOBUFS; 1918 1919 if (nla_put_u32(msg, NL80211_PMSR_ATTR_MAX_PEERS, cap->max_peers)) 1920 return -ENOBUFS; 1921 1922 if (cap->report_ap_tsf && 1923 nla_put_flag(msg, NL80211_PMSR_ATTR_REPORT_AP_TSF)) 1924 return -ENOBUFS; 1925 1926 if (cap->randomize_mac_addr && 1927 nla_put_flag(msg, NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR)) 1928 return -ENOBUFS; 1929 1930 caps = nla_nest_start_noflag(msg, NL80211_PMSR_ATTR_TYPE_CAPA); 1931 if (!caps) 1932 return -ENOBUFS; 1933 1934 if (nl80211_send_pmsr_ftm_capa(cap, msg)) 1935 return -ENOBUFS; 1936 1937 nla_nest_end(msg, caps); 1938 nla_nest_end(msg, pmsr); 1939 1940 return 0; 1941 } 1942 1943 static int 1944 nl80211_put_iftype_akm_suites(struct cfg80211_registered_device *rdev, 1945 struct sk_buff *msg) 1946 { 1947 int i; 1948 struct nlattr *nested, *nested_akms; 1949 const struct wiphy_iftype_akm_suites *iftype_akms; 1950 1951 if (!rdev->wiphy.num_iftype_akm_suites || 1952 !rdev->wiphy.iftype_akm_suites) 1953 return 0; 1954 1955 nested = nla_nest_start(msg, NL80211_ATTR_IFTYPE_AKM_SUITES); 1956 if (!nested) 1957 return -ENOBUFS; 1958 1959 for (i = 0; i < rdev->wiphy.num_iftype_akm_suites; i++) { 1960 nested_akms = nla_nest_start(msg, i + 1); 1961 if (!nested_akms) 1962 return -ENOBUFS; 1963 1964 iftype_akms = &rdev->wiphy.iftype_akm_suites[i]; 1965 1966 if (nl80211_put_iftypes(msg, NL80211_IFTYPE_AKM_ATTR_IFTYPES, 1967 iftype_akms->iftypes_mask)) 1968 return -ENOBUFS; 1969 1970 if (nla_put(msg, NL80211_IFTYPE_AKM_ATTR_SUITES, 1971 sizeof(u32) * iftype_akms->n_akm_suites, 1972 iftype_akms->akm_suites)) { 1973 return -ENOBUFS; 1974 } 1975 nla_nest_end(msg, nested_akms); 1976 } 1977 1978 nla_nest_end(msg, nested); 1979 1980 return 0; 1981 } 1982 1983 static int 1984 nl80211_put_tid_config_support(struct cfg80211_registered_device *rdev, 1985 struct sk_buff *msg) 1986 { 1987 struct nlattr *supp; 1988 1989 if (!rdev->wiphy.tid_config_support.vif && 1990 !rdev->wiphy.tid_config_support.peer) 1991 return 0; 1992 1993 supp = nla_nest_start(msg, NL80211_ATTR_TID_CONFIG); 1994 if (!supp) 1995 return -ENOSPC; 1996 1997 if (rdev->wiphy.tid_config_support.vif && 1998 nla_put_u64_64bit(msg, NL80211_TID_CONFIG_ATTR_VIF_SUPP, 1999 rdev->wiphy.tid_config_support.vif, 2000 NL80211_TID_CONFIG_ATTR_PAD)) 2001 goto fail; 2002 2003 if (rdev->wiphy.tid_config_support.peer && 2004 nla_put_u64_64bit(msg, NL80211_TID_CONFIG_ATTR_PEER_SUPP, 2005 rdev->wiphy.tid_config_support.peer, 2006 NL80211_TID_CONFIG_ATTR_PAD)) 2007 goto fail; 2008 2009 /* for now we just use the same value ... makes more sense */ 2010 if (nla_put_u8(msg, NL80211_TID_CONFIG_ATTR_RETRY_SHORT, 2011 rdev->wiphy.tid_config_support.max_retry)) 2012 goto fail; 2013 if (nla_put_u8(msg, NL80211_TID_CONFIG_ATTR_RETRY_LONG, 2014 rdev->wiphy.tid_config_support.max_retry)) 2015 goto fail; 2016 2017 nla_nest_end(msg, supp); 2018 2019 return 0; 2020 fail: 2021 nla_nest_cancel(msg, supp); 2022 return -ENOBUFS; 2023 } 2024 2025 struct nl80211_dump_wiphy_state { 2026 s64 filter_wiphy; 2027 long start; 2028 long split_start, band_start, chan_start, capa_start; 2029 bool split; 2030 }; 2031 2032 static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, 2033 enum nl80211_commands cmd, 2034 struct sk_buff *msg, u32 portid, u32 seq, 2035 int flags, struct nl80211_dump_wiphy_state *state) 2036 { 2037 void *hdr; 2038 struct nlattr *nl_bands, *nl_band; 2039 struct nlattr *nl_freqs, *nl_freq; 2040 struct nlattr *nl_cmds; 2041 enum nl80211_band band; 2042 struct ieee80211_channel *chan; 2043 int i; 2044 const struct ieee80211_txrx_stypes *mgmt_stypes = 2045 rdev->wiphy.mgmt_stypes; 2046 u32 features; 2047 2048 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 2049 if (!hdr) 2050 return -ENOBUFS; 2051 2052 if (WARN_ON(!state)) 2053 return -EINVAL; 2054 2055 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 2056 nla_put_string(msg, NL80211_ATTR_WIPHY_NAME, 2057 wiphy_name(&rdev->wiphy)) || 2058 nla_put_u32(msg, NL80211_ATTR_GENERATION, 2059 cfg80211_rdev_list_generation)) 2060 goto nla_put_failure; 2061 2062 if (cmd != NL80211_CMD_NEW_WIPHY) 2063 goto finish; 2064 2065 switch (state->split_start) { 2066 case 0: 2067 if (nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT, 2068 rdev->wiphy.retry_short) || 2069 nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_LONG, 2070 rdev->wiphy.retry_long) || 2071 nla_put_u32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD, 2072 rdev->wiphy.frag_threshold) || 2073 nla_put_u32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD, 2074 rdev->wiphy.rts_threshold) || 2075 nla_put_u8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS, 2076 rdev->wiphy.coverage_class) || 2077 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS, 2078 rdev->wiphy.max_scan_ssids) || 2079 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS, 2080 rdev->wiphy.max_sched_scan_ssids) || 2081 nla_put_u16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN, 2082 rdev->wiphy.max_scan_ie_len) || 2083 nla_put_u16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN, 2084 rdev->wiphy.max_sched_scan_ie_len) || 2085 nla_put_u8(msg, NL80211_ATTR_MAX_MATCH_SETS, 2086 rdev->wiphy.max_match_sets) || 2087 nla_put_u32(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS, 2088 rdev->wiphy.max_sched_scan_plans) || 2089 nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL, 2090 rdev->wiphy.max_sched_scan_plan_interval) || 2091 nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS, 2092 rdev->wiphy.max_sched_scan_plan_iterations)) 2093 goto nla_put_failure; 2094 2095 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) && 2096 nla_put_flag(msg, NL80211_ATTR_SUPPORT_IBSS_RSN)) 2097 goto nla_put_failure; 2098 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) && 2099 nla_put_flag(msg, NL80211_ATTR_SUPPORT_MESH_AUTH)) 2100 goto nla_put_failure; 2101 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) && 2102 nla_put_flag(msg, NL80211_ATTR_SUPPORT_AP_UAPSD)) 2103 goto nla_put_failure; 2104 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) && 2105 nla_put_flag(msg, NL80211_ATTR_ROAM_SUPPORT)) 2106 goto nla_put_failure; 2107 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) && 2108 nla_put_flag(msg, NL80211_ATTR_TDLS_SUPPORT)) 2109 goto nla_put_failure; 2110 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) && 2111 nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP)) 2112 goto nla_put_failure; 2113 state->split_start++; 2114 if (state->split) 2115 break; 2116 /* fall through */ 2117 case 1: 2118 if (nla_put(msg, NL80211_ATTR_CIPHER_SUITES, 2119 sizeof(u32) * rdev->wiphy.n_cipher_suites, 2120 rdev->wiphy.cipher_suites)) 2121 goto nla_put_failure; 2122 2123 if (nla_put_u8(msg, NL80211_ATTR_MAX_NUM_PMKIDS, 2124 rdev->wiphy.max_num_pmkids)) 2125 goto nla_put_failure; 2126 2127 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && 2128 nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE)) 2129 goto nla_put_failure; 2130 2131 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX, 2132 rdev->wiphy.available_antennas_tx) || 2133 nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX, 2134 rdev->wiphy.available_antennas_rx)) 2135 goto nla_put_failure; 2136 2137 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) && 2138 nla_put_u32(msg, NL80211_ATTR_PROBE_RESP_OFFLOAD, 2139 rdev->wiphy.probe_resp_offload)) 2140 goto nla_put_failure; 2141 2142 if ((rdev->wiphy.available_antennas_tx || 2143 rdev->wiphy.available_antennas_rx) && 2144 rdev->ops->get_antenna) { 2145 u32 tx_ant = 0, rx_ant = 0; 2146 int res; 2147 2148 res = rdev_get_antenna(rdev, &tx_ant, &rx_ant); 2149 if (!res) { 2150 if (nla_put_u32(msg, 2151 NL80211_ATTR_WIPHY_ANTENNA_TX, 2152 tx_ant) || 2153 nla_put_u32(msg, 2154 NL80211_ATTR_WIPHY_ANTENNA_RX, 2155 rx_ant)) 2156 goto nla_put_failure; 2157 } 2158 } 2159 2160 state->split_start++; 2161 if (state->split) 2162 break; 2163 /* fall through */ 2164 case 2: 2165 if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES, 2166 rdev->wiphy.interface_modes)) 2167 goto nla_put_failure; 2168 state->split_start++; 2169 if (state->split) 2170 break; 2171 /* fall through */ 2172 case 3: 2173 nl_bands = nla_nest_start_noflag(msg, 2174 NL80211_ATTR_WIPHY_BANDS); 2175 if (!nl_bands) 2176 goto nla_put_failure; 2177 2178 for (band = state->band_start; 2179 band < NUM_NL80211_BANDS; band++) { 2180 struct ieee80211_supported_band *sband; 2181 2182 sband = rdev->wiphy.bands[band]; 2183 2184 if (!sband) 2185 continue; 2186 2187 nl_band = nla_nest_start_noflag(msg, band); 2188 if (!nl_band) 2189 goto nla_put_failure; 2190 2191 switch (state->chan_start) { 2192 case 0: 2193 if (nl80211_send_band_rateinfo(msg, sband)) 2194 goto nla_put_failure; 2195 state->chan_start++; 2196 if (state->split) 2197 break; 2198 /* fall through */ 2199 default: 2200 /* add frequencies */ 2201 nl_freqs = nla_nest_start_noflag(msg, 2202 NL80211_BAND_ATTR_FREQS); 2203 if (!nl_freqs) 2204 goto nla_put_failure; 2205 2206 for (i = state->chan_start - 1; 2207 i < sband->n_channels; 2208 i++) { 2209 nl_freq = nla_nest_start_noflag(msg, 2210 i); 2211 if (!nl_freq) 2212 goto nla_put_failure; 2213 2214 chan = &sband->channels[i]; 2215 2216 if (nl80211_msg_put_channel( 2217 msg, &rdev->wiphy, chan, 2218 state->split)) 2219 goto nla_put_failure; 2220 2221 nla_nest_end(msg, nl_freq); 2222 if (state->split) 2223 break; 2224 } 2225 if (i < sband->n_channels) 2226 state->chan_start = i + 2; 2227 else 2228 state->chan_start = 0; 2229 nla_nest_end(msg, nl_freqs); 2230 } 2231 2232 nla_nest_end(msg, nl_band); 2233 2234 if (state->split) { 2235 /* start again here */ 2236 if (state->chan_start) 2237 band--; 2238 break; 2239 } 2240 } 2241 nla_nest_end(msg, nl_bands); 2242 2243 if (band < NUM_NL80211_BANDS) 2244 state->band_start = band + 1; 2245 else 2246 state->band_start = 0; 2247 2248 /* if bands & channels are done, continue outside */ 2249 if (state->band_start == 0 && state->chan_start == 0) 2250 state->split_start++; 2251 if (state->split) 2252 break; 2253 /* fall through */ 2254 case 4: 2255 nl_cmds = nla_nest_start_noflag(msg, 2256 NL80211_ATTR_SUPPORTED_COMMANDS); 2257 if (!nl_cmds) 2258 goto nla_put_failure; 2259 2260 i = nl80211_add_commands_unsplit(rdev, msg); 2261 if (i < 0) 2262 goto nla_put_failure; 2263 if (state->split) { 2264 CMD(crit_proto_start, CRIT_PROTOCOL_START); 2265 CMD(crit_proto_stop, CRIT_PROTOCOL_STOP); 2266 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) 2267 CMD(channel_switch, CHANNEL_SWITCH); 2268 CMD(set_qos_map, SET_QOS_MAP); 2269 if (rdev->wiphy.features & 2270 NL80211_FEATURE_SUPPORTS_WMM_ADMISSION) 2271 CMD(add_tx_ts, ADD_TX_TS); 2272 CMD(set_multicast_to_unicast, SET_MULTICAST_TO_UNICAST); 2273 CMD(update_connect_params, UPDATE_CONNECT_PARAMS); 2274 CMD(update_ft_ies, UPDATE_FT_IES); 2275 } 2276 #undef CMD 2277 2278 nla_nest_end(msg, nl_cmds); 2279 state->split_start++; 2280 if (state->split) 2281 break; 2282 /* fall through */ 2283 case 5: 2284 if (rdev->ops->remain_on_channel && 2285 (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) && 2286 nla_put_u32(msg, 2287 NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION, 2288 rdev->wiphy.max_remain_on_channel_duration)) 2289 goto nla_put_failure; 2290 2291 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) && 2292 nla_put_flag(msg, NL80211_ATTR_OFFCHANNEL_TX_OK)) 2293 goto nla_put_failure; 2294 2295 if (nl80211_send_mgmt_stypes(msg, mgmt_stypes)) 2296 goto nla_put_failure; 2297 state->split_start++; 2298 if (state->split) 2299 break; 2300 /* fall through */ 2301 case 6: 2302 #ifdef CONFIG_PM 2303 if (nl80211_send_wowlan(msg, rdev, state->split)) 2304 goto nla_put_failure; 2305 state->split_start++; 2306 if (state->split) 2307 break; 2308 #else 2309 state->split_start++; 2310 #endif 2311 /* fall through */ 2312 case 7: 2313 if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES, 2314 rdev->wiphy.software_iftypes)) 2315 goto nla_put_failure; 2316 2317 if (nl80211_put_iface_combinations(&rdev->wiphy, msg, 2318 state->split)) 2319 goto nla_put_failure; 2320 2321 state->split_start++; 2322 if (state->split) 2323 break; 2324 /* fall through */ 2325 case 8: 2326 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) && 2327 nla_put_u32(msg, NL80211_ATTR_DEVICE_AP_SME, 2328 rdev->wiphy.ap_sme_capa)) 2329 goto nla_put_failure; 2330 2331 features = rdev->wiphy.features; 2332 /* 2333 * We can only add the per-channel limit information if the 2334 * dump is split, otherwise it makes it too big. Therefore 2335 * only advertise it in that case. 2336 */ 2337 if (state->split) 2338 features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS; 2339 if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features)) 2340 goto nla_put_failure; 2341 2342 if (rdev->wiphy.ht_capa_mod_mask && 2343 nla_put(msg, NL80211_ATTR_HT_CAPABILITY_MASK, 2344 sizeof(*rdev->wiphy.ht_capa_mod_mask), 2345 rdev->wiphy.ht_capa_mod_mask)) 2346 goto nla_put_failure; 2347 2348 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME && 2349 rdev->wiphy.max_acl_mac_addrs && 2350 nla_put_u32(msg, NL80211_ATTR_MAC_ACL_MAX, 2351 rdev->wiphy.max_acl_mac_addrs)) 2352 goto nla_put_failure; 2353 2354 /* 2355 * Any information below this point is only available to 2356 * applications that can deal with it being split. This 2357 * helps ensure that newly added capabilities don't break 2358 * older tools by overrunning their buffers. 2359 * 2360 * We still increment split_start so that in the split 2361 * case we'll continue with more data in the next round, 2362 * but break unconditionally so unsplit data stops here. 2363 */ 2364 state->split_start++; 2365 break; 2366 case 9: 2367 if (rdev->wiphy.extended_capabilities && 2368 (nla_put(msg, NL80211_ATTR_EXT_CAPA, 2369 rdev->wiphy.extended_capabilities_len, 2370 rdev->wiphy.extended_capabilities) || 2371 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK, 2372 rdev->wiphy.extended_capabilities_len, 2373 rdev->wiphy.extended_capabilities_mask))) 2374 goto nla_put_failure; 2375 2376 if (rdev->wiphy.vht_capa_mod_mask && 2377 nla_put(msg, NL80211_ATTR_VHT_CAPABILITY_MASK, 2378 sizeof(*rdev->wiphy.vht_capa_mod_mask), 2379 rdev->wiphy.vht_capa_mod_mask)) 2380 goto nla_put_failure; 2381 2382 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, 2383 rdev->wiphy.perm_addr)) 2384 goto nla_put_failure; 2385 2386 if (!is_zero_ether_addr(rdev->wiphy.addr_mask) && 2387 nla_put(msg, NL80211_ATTR_MAC_MASK, ETH_ALEN, 2388 rdev->wiphy.addr_mask)) 2389 goto nla_put_failure; 2390 2391 if (rdev->wiphy.n_addresses > 1) { 2392 void *attr; 2393 2394 attr = nla_nest_start(msg, NL80211_ATTR_MAC_ADDRS); 2395 if (!attr) 2396 goto nla_put_failure; 2397 2398 for (i = 0; i < rdev->wiphy.n_addresses; i++) 2399 if (nla_put(msg, i + 1, ETH_ALEN, 2400 rdev->wiphy.addresses[i].addr)) 2401 goto nla_put_failure; 2402 2403 nla_nest_end(msg, attr); 2404 } 2405 2406 state->split_start++; 2407 break; 2408 case 10: 2409 if (nl80211_send_coalesce(msg, rdev)) 2410 goto nla_put_failure; 2411 2412 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) && 2413 (nla_put_flag(msg, NL80211_ATTR_SUPPORT_5_MHZ) || 2414 nla_put_flag(msg, NL80211_ATTR_SUPPORT_10_MHZ))) 2415 goto nla_put_failure; 2416 2417 if (rdev->wiphy.max_ap_assoc_sta && 2418 nla_put_u32(msg, NL80211_ATTR_MAX_AP_ASSOC_STA, 2419 rdev->wiphy.max_ap_assoc_sta)) 2420 goto nla_put_failure; 2421 2422 state->split_start++; 2423 break; 2424 case 11: 2425 if (rdev->wiphy.n_vendor_commands) { 2426 const struct nl80211_vendor_cmd_info *info; 2427 struct nlattr *nested; 2428 2429 nested = nla_nest_start_noflag(msg, 2430 NL80211_ATTR_VENDOR_DATA); 2431 if (!nested) 2432 goto nla_put_failure; 2433 2434 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { 2435 info = &rdev->wiphy.vendor_commands[i].info; 2436 if (nla_put(msg, i + 1, sizeof(*info), info)) 2437 goto nla_put_failure; 2438 } 2439 nla_nest_end(msg, nested); 2440 } 2441 2442 if (rdev->wiphy.n_vendor_events) { 2443 const struct nl80211_vendor_cmd_info *info; 2444 struct nlattr *nested; 2445 2446 nested = nla_nest_start_noflag(msg, 2447 NL80211_ATTR_VENDOR_EVENTS); 2448 if (!nested) 2449 goto nla_put_failure; 2450 2451 for (i = 0; i < rdev->wiphy.n_vendor_events; i++) { 2452 info = &rdev->wiphy.vendor_events[i]; 2453 if (nla_put(msg, i + 1, sizeof(*info), info)) 2454 goto nla_put_failure; 2455 } 2456 nla_nest_end(msg, nested); 2457 } 2458 state->split_start++; 2459 break; 2460 case 12: 2461 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH && 2462 nla_put_u8(msg, NL80211_ATTR_MAX_CSA_COUNTERS, 2463 rdev->wiphy.max_num_csa_counters)) 2464 goto nla_put_failure; 2465 2466 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 2467 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 2468 goto nla_put_failure; 2469 2470 if (rdev->wiphy.max_sched_scan_reqs && 2471 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_MAX_REQS, 2472 rdev->wiphy.max_sched_scan_reqs)) 2473 goto nla_put_failure; 2474 2475 if (nla_put(msg, NL80211_ATTR_EXT_FEATURES, 2476 sizeof(rdev->wiphy.ext_features), 2477 rdev->wiphy.ext_features)) 2478 goto nla_put_failure; 2479 2480 if (rdev->wiphy.bss_select_support) { 2481 struct nlattr *nested; 2482 u32 bss_select_support = rdev->wiphy.bss_select_support; 2483 2484 nested = nla_nest_start_noflag(msg, 2485 NL80211_ATTR_BSS_SELECT); 2486 if (!nested) 2487 goto nla_put_failure; 2488 2489 i = 0; 2490 while (bss_select_support) { 2491 if ((bss_select_support & 1) && 2492 nla_put_flag(msg, i)) 2493 goto nla_put_failure; 2494 i++; 2495 bss_select_support >>= 1; 2496 } 2497 nla_nest_end(msg, nested); 2498 } 2499 2500 state->split_start++; 2501 break; 2502 case 13: 2503 if (rdev->wiphy.num_iftype_ext_capab && 2504 rdev->wiphy.iftype_ext_capab) { 2505 struct nlattr *nested_ext_capab, *nested; 2506 2507 nested = nla_nest_start_noflag(msg, 2508 NL80211_ATTR_IFTYPE_EXT_CAPA); 2509 if (!nested) 2510 goto nla_put_failure; 2511 2512 for (i = state->capa_start; 2513 i < rdev->wiphy.num_iftype_ext_capab; i++) { 2514 const struct wiphy_iftype_ext_capab *capab; 2515 2516 capab = &rdev->wiphy.iftype_ext_capab[i]; 2517 2518 nested_ext_capab = nla_nest_start_noflag(msg, 2519 i); 2520 if (!nested_ext_capab || 2521 nla_put_u32(msg, NL80211_ATTR_IFTYPE, 2522 capab->iftype) || 2523 nla_put(msg, NL80211_ATTR_EXT_CAPA, 2524 capab->extended_capabilities_len, 2525 capab->extended_capabilities) || 2526 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK, 2527 capab->extended_capabilities_len, 2528 capab->extended_capabilities_mask)) 2529 goto nla_put_failure; 2530 2531 nla_nest_end(msg, nested_ext_capab); 2532 if (state->split) 2533 break; 2534 } 2535 nla_nest_end(msg, nested); 2536 if (i < rdev->wiphy.num_iftype_ext_capab) { 2537 state->capa_start = i + 1; 2538 break; 2539 } 2540 } 2541 2542 if (nla_put_u32(msg, NL80211_ATTR_BANDS, 2543 rdev->wiphy.nan_supported_bands)) 2544 goto nla_put_failure; 2545 2546 if (wiphy_ext_feature_isset(&rdev->wiphy, 2547 NL80211_EXT_FEATURE_TXQS)) { 2548 struct cfg80211_txq_stats txqstats = {}; 2549 int res; 2550 2551 res = rdev_get_txq_stats(rdev, NULL, &txqstats); 2552 if (!res && 2553 !nl80211_put_txq_stats(msg, &txqstats, 2554 NL80211_ATTR_TXQ_STATS)) 2555 goto nla_put_failure; 2556 2557 if (nla_put_u32(msg, NL80211_ATTR_TXQ_LIMIT, 2558 rdev->wiphy.txq_limit)) 2559 goto nla_put_failure; 2560 if (nla_put_u32(msg, NL80211_ATTR_TXQ_MEMORY_LIMIT, 2561 rdev->wiphy.txq_memory_limit)) 2562 goto nla_put_failure; 2563 if (nla_put_u32(msg, NL80211_ATTR_TXQ_QUANTUM, 2564 rdev->wiphy.txq_quantum)) 2565 goto nla_put_failure; 2566 } 2567 2568 state->split_start++; 2569 break; 2570 case 14: 2571 if (nl80211_send_pmsr_capa(rdev, msg)) 2572 goto nla_put_failure; 2573 2574 state->split_start++; 2575 break; 2576 case 15: 2577 if (rdev->wiphy.akm_suites && 2578 nla_put(msg, NL80211_ATTR_AKM_SUITES, 2579 sizeof(u32) * rdev->wiphy.n_akm_suites, 2580 rdev->wiphy.akm_suites)) 2581 goto nla_put_failure; 2582 2583 if (nl80211_put_iftype_akm_suites(rdev, msg)) 2584 goto nla_put_failure; 2585 2586 if (nl80211_put_tid_config_support(rdev, msg)) 2587 goto nla_put_failure; 2588 2589 /* done */ 2590 state->split_start = 0; 2591 break; 2592 } 2593 finish: 2594 genlmsg_end(msg, hdr); 2595 return 0; 2596 2597 nla_put_failure: 2598 genlmsg_cancel(msg, hdr); 2599 return -EMSGSIZE; 2600 } 2601 2602 static int nl80211_dump_wiphy_parse(struct sk_buff *skb, 2603 struct netlink_callback *cb, 2604 struct nl80211_dump_wiphy_state *state) 2605 { 2606 struct nlattr **tb = kcalloc(NUM_NL80211_ATTR, sizeof(*tb), GFP_KERNEL); 2607 int ret; 2608 2609 if (!tb) 2610 return -ENOMEM; 2611 2612 ret = nlmsg_parse_deprecated(cb->nlh, 2613 GENL_HDRLEN + nl80211_fam.hdrsize, 2614 tb, nl80211_fam.maxattr, 2615 nl80211_policy, NULL); 2616 /* ignore parse errors for backward compatibility */ 2617 if (ret) { 2618 ret = 0; 2619 goto out; 2620 } 2621 2622 state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; 2623 if (tb[NL80211_ATTR_WIPHY]) 2624 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]); 2625 if (tb[NL80211_ATTR_WDEV]) 2626 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32; 2627 if (tb[NL80211_ATTR_IFINDEX]) { 2628 struct net_device *netdev; 2629 struct cfg80211_registered_device *rdev; 2630 int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]); 2631 2632 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx); 2633 if (!netdev) { 2634 ret = -ENODEV; 2635 goto out; 2636 } 2637 if (netdev->ieee80211_ptr) { 2638 rdev = wiphy_to_rdev( 2639 netdev->ieee80211_ptr->wiphy); 2640 state->filter_wiphy = rdev->wiphy_idx; 2641 } 2642 } 2643 2644 ret = 0; 2645 out: 2646 kfree(tb); 2647 return ret; 2648 } 2649 2650 static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb) 2651 { 2652 int idx = 0, ret; 2653 struct nl80211_dump_wiphy_state *state = (void *)cb->args[0]; 2654 struct cfg80211_registered_device *rdev; 2655 2656 rtnl_lock(); 2657 if (!state) { 2658 state = kzalloc(sizeof(*state), GFP_KERNEL); 2659 if (!state) { 2660 rtnl_unlock(); 2661 return -ENOMEM; 2662 } 2663 state->filter_wiphy = -1; 2664 ret = nl80211_dump_wiphy_parse(skb, cb, state); 2665 if (ret) { 2666 kfree(state); 2667 rtnl_unlock(); 2668 return ret; 2669 } 2670 cb->args[0] = (long)state; 2671 } 2672 2673 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 2674 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) 2675 continue; 2676 if (++idx <= state->start) 2677 continue; 2678 if (state->filter_wiphy != -1 && 2679 state->filter_wiphy != rdev->wiphy_idx) 2680 continue; 2681 /* attempt to fit multiple wiphy data chunks into the skb */ 2682 do { 2683 ret = nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, 2684 skb, 2685 NETLINK_CB(cb->skb).portid, 2686 cb->nlh->nlmsg_seq, 2687 NLM_F_MULTI, state); 2688 if (ret < 0) { 2689 /* 2690 * If sending the wiphy data didn't fit (ENOBUFS 2691 * or EMSGSIZE returned), this SKB is still 2692 * empty (so it's not too big because another 2693 * wiphy dataset is already in the skb) and 2694 * we've not tried to adjust the dump allocation 2695 * yet ... then adjust the alloc size to be 2696 * bigger, and return 1 but with the empty skb. 2697 * This results in an empty message being RX'ed 2698 * in userspace, but that is ignored. 2699 * 2700 * We can then retry with the larger buffer. 2701 */ 2702 if ((ret == -ENOBUFS || ret == -EMSGSIZE) && 2703 !skb->len && !state->split && 2704 cb->min_dump_alloc < 4096) { 2705 cb->min_dump_alloc = 4096; 2706 state->split_start = 0; 2707 rtnl_unlock(); 2708 return 1; 2709 } 2710 idx--; 2711 break; 2712 } 2713 } while (state->split_start > 0); 2714 break; 2715 } 2716 rtnl_unlock(); 2717 2718 state->start = idx; 2719 2720 return skb->len; 2721 } 2722 2723 static int nl80211_dump_wiphy_done(struct netlink_callback *cb) 2724 { 2725 kfree((void *)cb->args[0]); 2726 return 0; 2727 } 2728 2729 static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info) 2730 { 2731 struct sk_buff *msg; 2732 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2733 struct nl80211_dump_wiphy_state state = {}; 2734 2735 msg = nlmsg_new(4096, GFP_KERNEL); 2736 if (!msg) 2737 return -ENOMEM; 2738 2739 if (nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, msg, 2740 info->snd_portid, info->snd_seq, 0, 2741 &state) < 0) { 2742 nlmsg_free(msg); 2743 return -ENOBUFS; 2744 } 2745 2746 return genlmsg_reply(msg, info); 2747 } 2748 2749 static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = { 2750 [NL80211_TXQ_ATTR_QUEUE] = { .type = NLA_U8 }, 2751 [NL80211_TXQ_ATTR_TXOP] = { .type = NLA_U16 }, 2752 [NL80211_TXQ_ATTR_CWMIN] = { .type = NLA_U16 }, 2753 [NL80211_TXQ_ATTR_CWMAX] = { .type = NLA_U16 }, 2754 [NL80211_TXQ_ATTR_AIFS] = { .type = NLA_U8 }, 2755 }; 2756 2757 static int parse_txq_params(struct nlattr *tb[], 2758 struct ieee80211_txq_params *txq_params) 2759 { 2760 u8 ac; 2761 2762 if (!tb[NL80211_TXQ_ATTR_AC] || !tb[NL80211_TXQ_ATTR_TXOP] || 2763 !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] || 2764 !tb[NL80211_TXQ_ATTR_AIFS]) 2765 return -EINVAL; 2766 2767 ac = nla_get_u8(tb[NL80211_TXQ_ATTR_AC]); 2768 txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]); 2769 txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]); 2770 txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]); 2771 txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]); 2772 2773 if (ac >= NL80211_NUM_ACS) 2774 return -EINVAL; 2775 txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS); 2776 return 0; 2777 } 2778 2779 static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev) 2780 { 2781 /* 2782 * You can only set the channel explicitly for WDS interfaces, 2783 * all others have their channel managed via their respective 2784 * "establish a connection" command (connect, join, ...) 2785 * 2786 * For AP/GO and mesh mode, the channel can be set with the 2787 * channel userspace API, but is only stored and passed to the 2788 * low-level driver when the AP starts or the mesh is joined. 2789 * This is for backward compatibility, userspace can also give 2790 * the channel in the start-ap or join-mesh commands instead. 2791 * 2792 * Monitors are special as they are normally slaved to 2793 * whatever else is going on, so they have their own special 2794 * operation to set the monitor channel if possible. 2795 */ 2796 return !wdev || 2797 wdev->iftype == NL80211_IFTYPE_AP || 2798 wdev->iftype == NL80211_IFTYPE_MESH_POINT || 2799 wdev->iftype == NL80211_IFTYPE_MONITOR || 2800 wdev->iftype == NL80211_IFTYPE_P2P_GO; 2801 } 2802 2803 int nl80211_parse_chandef(struct cfg80211_registered_device *rdev, 2804 struct genl_info *info, 2805 struct cfg80211_chan_def *chandef) 2806 { 2807 struct netlink_ext_ack *extack = info->extack; 2808 struct nlattr **attrs = info->attrs; 2809 u32 control_freq; 2810 2811 if (!attrs[NL80211_ATTR_WIPHY_FREQ]) 2812 return -EINVAL; 2813 2814 control_freq = nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ]); 2815 2816 memset(chandef, 0, sizeof(*chandef)); 2817 2818 chandef->chan = ieee80211_get_channel(&rdev->wiphy, control_freq); 2819 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; 2820 chandef->center_freq1 = control_freq; 2821 chandef->center_freq2 = 0; 2822 2823 /* Primary channel not allowed */ 2824 if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED) { 2825 NL_SET_ERR_MSG_ATTR(extack, attrs[NL80211_ATTR_WIPHY_FREQ], 2826 "Channel is disabled"); 2827 return -EINVAL; 2828 } 2829 2830 if (attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) { 2831 enum nl80211_channel_type chantype; 2832 2833 chantype = nla_get_u32(attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]); 2834 2835 switch (chantype) { 2836 case NL80211_CHAN_NO_HT: 2837 case NL80211_CHAN_HT20: 2838 case NL80211_CHAN_HT40PLUS: 2839 case NL80211_CHAN_HT40MINUS: 2840 cfg80211_chandef_create(chandef, chandef->chan, 2841 chantype); 2842 /* user input for center_freq is incorrect */ 2843 if (attrs[NL80211_ATTR_CENTER_FREQ1] && 2844 chandef->center_freq1 != nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1])) { 2845 NL_SET_ERR_MSG_ATTR(extack, 2846 attrs[NL80211_ATTR_CENTER_FREQ1], 2847 "bad center frequency 1"); 2848 return -EINVAL; 2849 } 2850 /* center_freq2 must be zero */ 2851 if (attrs[NL80211_ATTR_CENTER_FREQ2] && 2852 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2])) { 2853 NL_SET_ERR_MSG_ATTR(extack, 2854 attrs[NL80211_ATTR_CENTER_FREQ2], 2855 "center frequency 2 can't be used"); 2856 return -EINVAL; 2857 } 2858 break; 2859 default: 2860 NL_SET_ERR_MSG_ATTR(extack, 2861 attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE], 2862 "invalid channel type"); 2863 return -EINVAL; 2864 } 2865 } else if (attrs[NL80211_ATTR_CHANNEL_WIDTH]) { 2866 chandef->width = 2867 nla_get_u32(attrs[NL80211_ATTR_CHANNEL_WIDTH]); 2868 if (attrs[NL80211_ATTR_CENTER_FREQ1]) 2869 chandef->center_freq1 = 2870 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ1]); 2871 if (attrs[NL80211_ATTR_CENTER_FREQ2]) 2872 chandef->center_freq2 = 2873 nla_get_u32(attrs[NL80211_ATTR_CENTER_FREQ2]); 2874 } 2875 2876 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { 2877 chandef->edmg.channels = 2878 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); 2879 2880 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) 2881 chandef->edmg.bw_config = 2882 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); 2883 } else { 2884 chandef->edmg.bw_config = 0; 2885 chandef->edmg.channels = 0; 2886 } 2887 2888 if (!cfg80211_chandef_valid(chandef)) { 2889 NL_SET_ERR_MSG(extack, "invalid channel definition"); 2890 return -EINVAL; 2891 } 2892 2893 if (!cfg80211_chandef_usable(&rdev->wiphy, chandef, 2894 IEEE80211_CHAN_DISABLED)) { 2895 NL_SET_ERR_MSG(extack, "(extension) channel is disabled"); 2896 return -EINVAL; 2897 } 2898 2899 if ((chandef->width == NL80211_CHAN_WIDTH_5 || 2900 chandef->width == NL80211_CHAN_WIDTH_10) && 2901 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) { 2902 NL_SET_ERR_MSG(extack, "5/10 MHz not supported"); 2903 return -EINVAL; 2904 } 2905 2906 return 0; 2907 } 2908 2909 static int __nl80211_set_channel(struct cfg80211_registered_device *rdev, 2910 struct net_device *dev, 2911 struct genl_info *info) 2912 { 2913 struct cfg80211_chan_def chandef; 2914 int result; 2915 enum nl80211_iftype iftype = NL80211_IFTYPE_MONITOR; 2916 struct wireless_dev *wdev = NULL; 2917 2918 if (dev) 2919 wdev = dev->ieee80211_ptr; 2920 if (!nl80211_can_set_dev_channel(wdev)) 2921 return -EOPNOTSUPP; 2922 if (wdev) 2923 iftype = wdev->iftype; 2924 2925 result = nl80211_parse_chandef(rdev, info, &chandef); 2926 if (result) 2927 return result; 2928 2929 switch (iftype) { 2930 case NL80211_IFTYPE_AP: 2931 case NL80211_IFTYPE_P2P_GO: 2932 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, 2933 iftype)) { 2934 result = -EINVAL; 2935 break; 2936 } 2937 if (wdev->beacon_interval) { 2938 if (!dev || !rdev->ops->set_ap_chanwidth || 2939 !(rdev->wiphy.features & 2940 NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE)) { 2941 result = -EBUSY; 2942 break; 2943 } 2944 2945 /* Only allow dynamic channel width changes */ 2946 if (chandef.chan != wdev->preset_chandef.chan) { 2947 result = -EBUSY; 2948 break; 2949 } 2950 result = rdev_set_ap_chanwidth(rdev, dev, &chandef); 2951 if (result) 2952 break; 2953 } 2954 wdev->preset_chandef = chandef; 2955 result = 0; 2956 break; 2957 case NL80211_IFTYPE_MESH_POINT: 2958 result = cfg80211_set_mesh_channel(rdev, wdev, &chandef); 2959 break; 2960 case NL80211_IFTYPE_MONITOR: 2961 result = cfg80211_set_monitor_channel(rdev, &chandef); 2962 break; 2963 default: 2964 result = -EINVAL; 2965 } 2966 2967 return result; 2968 } 2969 2970 static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info) 2971 { 2972 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2973 struct net_device *netdev = info->user_ptr[1]; 2974 2975 return __nl80211_set_channel(rdev, netdev, info); 2976 } 2977 2978 static int nl80211_set_wds_peer(struct sk_buff *skb, struct genl_info *info) 2979 { 2980 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2981 struct net_device *dev = info->user_ptr[1]; 2982 struct wireless_dev *wdev = dev->ieee80211_ptr; 2983 const u8 *bssid; 2984 2985 if (!info->attrs[NL80211_ATTR_MAC]) 2986 return -EINVAL; 2987 2988 if (netif_running(dev)) 2989 return -EBUSY; 2990 2991 if (!rdev->ops->set_wds_peer) 2992 return -EOPNOTSUPP; 2993 2994 if (wdev->iftype != NL80211_IFTYPE_WDS) 2995 return -EOPNOTSUPP; 2996 2997 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 2998 return rdev_set_wds_peer(rdev, dev, bssid); 2999 } 3000 3001 static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) 3002 { 3003 struct cfg80211_registered_device *rdev; 3004 struct net_device *netdev = NULL; 3005 struct wireless_dev *wdev; 3006 int result = 0, rem_txq_params = 0; 3007 struct nlattr *nl_txq_params; 3008 u32 changed; 3009 u8 retry_short = 0, retry_long = 0; 3010 u32 frag_threshold = 0, rts_threshold = 0; 3011 u8 coverage_class = 0; 3012 u32 txq_limit = 0, txq_memory_limit = 0, txq_quantum = 0; 3013 3014 ASSERT_RTNL(); 3015 3016 /* 3017 * Try to find the wiphy and netdev. Normally this 3018 * function shouldn't need the netdev, but this is 3019 * done for backward compatibility -- previously 3020 * setting the channel was done per wiphy, but now 3021 * it is per netdev. Previous userland like hostapd 3022 * also passed a netdev to set_wiphy, so that it is 3023 * possible to let that go to the right netdev! 3024 */ 3025 3026 if (info->attrs[NL80211_ATTR_IFINDEX]) { 3027 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); 3028 3029 netdev = __dev_get_by_index(genl_info_net(info), ifindex); 3030 if (netdev && netdev->ieee80211_ptr) 3031 rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy); 3032 else 3033 netdev = NULL; 3034 } 3035 3036 if (!netdev) { 3037 rdev = __cfg80211_rdev_from_attrs(genl_info_net(info), 3038 info->attrs); 3039 if (IS_ERR(rdev)) 3040 return PTR_ERR(rdev); 3041 wdev = NULL; 3042 netdev = NULL; 3043 result = 0; 3044 } else 3045 wdev = netdev->ieee80211_ptr; 3046 3047 /* 3048 * end workaround code, by now the rdev is available 3049 * and locked, and wdev may or may not be NULL. 3050 */ 3051 3052 if (info->attrs[NL80211_ATTR_WIPHY_NAME]) 3053 result = cfg80211_dev_rename( 3054 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME])); 3055 3056 if (result) 3057 return result; 3058 3059 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) { 3060 struct ieee80211_txq_params txq_params; 3061 struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1]; 3062 3063 if (!rdev->ops->set_txq_params) 3064 return -EOPNOTSUPP; 3065 3066 if (!netdev) 3067 return -EINVAL; 3068 3069 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 3070 netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 3071 return -EINVAL; 3072 3073 if (!netif_running(netdev)) 3074 return -ENETDOWN; 3075 3076 nla_for_each_nested(nl_txq_params, 3077 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], 3078 rem_txq_params) { 3079 result = nla_parse_nested_deprecated(tb, 3080 NL80211_TXQ_ATTR_MAX, 3081 nl_txq_params, 3082 txq_params_policy, 3083 info->extack); 3084 if (result) 3085 return result; 3086 result = parse_txq_params(tb, &txq_params); 3087 if (result) 3088 return result; 3089 3090 result = rdev_set_txq_params(rdev, netdev, 3091 &txq_params); 3092 if (result) 3093 return result; 3094 } 3095 } 3096 3097 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 3098 result = __nl80211_set_channel( 3099 rdev, 3100 nl80211_can_set_dev_channel(wdev) ? netdev : NULL, 3101 info); 3102 if (result) 3103 return result; 3104 } 3105 3106 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) { 3107 struct wireless_dev *txp_wdev = wdev; 3108 enum nl80211_tx_power_setting type; 3109 int idx, mbm = 0; 3110 3111 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER)) 3112 txp_wdev = NULL; 3113 3114 if (!rdev->ops->set_tx_power) 3115 return -EOPNOTSUPP; 3116 3117 idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING; 3118 type = nla_get_u32(info->attrs[idx]); 3119 3120 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] && 3121 (type != NL80211_TX_POWER_AUTOMATIC)) 3122 return -EINVAL; 3123 3124 if (type != NL80211_TX_POWER_AUTOMATIC) { 3125 idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL; 3126 mbm = nla_get_u32(info->attrs[idx]); 3127 } 3128 3129 result = rdev_set_tx_power(rdev, txp_wdev, type, mbm); 3130 if (result) 3131 return result; 3132 } 3133 3134 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && 3135 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { 3136 u32 tx_ant, rx_ant; 3137 3138 if ((!rdev->wiphy.available_antennas_tx && 3139 !rdev->wiphy.available_antennas_rx) || 3140 !rdev->ops->set_antenna) 3141 return -EOPNOTSUPP; 3142 3143 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]); 3144 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]); 3145 3146 /* reject antenna configurations which don't match the 3147 * available antenna masks, except for the "all" mask */ 3148 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) || 3149 (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) 3150 return -EINVAL; 3151 3152 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx; 3153 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx; 3154 3155 result = rdev_set_antenna(rdev, tx_ant, rx_ant); 3156 if (result) 3157 return result; 3158 } 3159 3160 changed = 0; 3161 3162 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) { 3163 retry_short = nla_get_u8( 3164 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]); 3165 3166 changed |= WIPHY_PARAM_RETRY_SHORT; 3167 } 3168 3169 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) { 3170 retry_long = nla_get_u8( 3171 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]); 3172 3173 changed |= WIPHY_PARAM_RETRY_LONG; 3174 } 3175 3176 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) { 3177 frag_threshold = nla_get_u32( 3178 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]); 3179 if (frag_threshold < 256) 3180 return -EINVAL; 3181 3182 if (frag_threshold != (u32) -1) { 3183 /* 3184 * Fragments (apart from the last one) are required to 3185 * have even length. Make the fragmentation code 3186 * simpler by stripping LSB should someone try to use 3187 * odd threshold value. 3188 */ 3189 frag_threshold &= ~0x1; 3190 } 3191 changed |= WIPHY_PARAM_FRAG_THRESHOLD; 3192 } 3193 3194 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { 3195 rts_threshold = nla_get_u32( 3196 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); 3197 changed |= WIPHY_PARAM_RTS_THRESHOLD; 3198 } 3199 3200 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) { 3201 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) 3202 return -EINVAL; 3203 3204 coverage_class = nla_get_u8( 3205 info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]); 3206 changed |= WIPHY_PARAM_COVERAGE_CLASS; 3207 } 3208 3209 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { 3210 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION)) 3211 return -EOPNOTSUPP; 3212 3213 changed |= WIPHY_PARAM_DYN_ACK; 3214 } 3215 3216 if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) { 3217 if (!wiphy_ext_feature_isset(&rdev->wiphy, 3218 NL80211_EXT_FEATURE_TXQS)) 3219 return -EOPNOTSUPP; 3220 txq_limit = nla_get_u32( 3221 info->attrs[NL80211_ATTR_TXQ_LIMIT]); 3222 changed |= WIPHY_PARAM_TXQ_LIMIT; 3223 } 3224 3225 if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) { 3226 if (!wiphy_ext_feature_isset(&rdev->wiphy, 3227 NL80211_EXT_FEATURE_TXQS)) 3228 return -EOPNOTSUPP; 3229 txq_memory_limit = nla_get_u32( 3230 info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]); 3231 changed |= WIPHY_PARAM_TXQ_MEMORY_LIMIT; 3232 } 3233 3234 if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) { 3235 if (!wiphy_ext_feature_isset(&rdev->wiphy, 3236 NL80211_EXT_FEATURE_TXQS)) 3237 return -EOPNOTSUPP; 3238 txq_quantum = nla_get_u32( 3239 info->attrs[NL80211_ATTR_TXQ_QUANTUM]); 3240 changed |= WIPHY_PARAM_TXQ_QUANTUM; 3241 } 3242 3243 if (changed) { 3244 u8 old_retry_short, old_retry_long; 3245 u32 old_frag_threshold, old_rts_threshold; 3246 u8 old_coverage_class; 3247 u32 old_txq_limit, old_txq_memory_limit, old_txq_quantum; 3248 3249 if (!rdev->ops->set_wiphy_params) 3250 return -EOPNOTSUPP; 3251 3252 old_retry_short = rdev->wiphy.retry_short; 3253 old_retry_long = rdev->wiphy.retry_long; 3254 old_frag_threshold = rdev->wiphy.frag_threshold; 3255 old_rts_threshold = rdev->wiphy.rts_threshold; 3256 old_coverage_class = rdev->wiphy.coverage_class; 3257 old_txq_limit = rdev->wiphy.txq_limit; 3258 old_txq_memory_limit = rdev->wiphy.txq_memory_limit; 3259 old_txq_quantum = rdev->wiphy.txq_quantum; 3260 3261 if (changed & WIPHY_PARAM_RETRY_SHORT) 3262 rdev->wiphy.retry_short = retry_short; 3263 if (changed & WIPHY_PARAM_RETRY_LONG) 3264 rdev->wiphy.retry_long = retry_long; 3265 if (changed & WIPHY_PARAM_FRAG_THRESHOLD) 3266 rdev->wiphy.frag_threshold = frag_threshold; 3267 if (changed & WIPHY_PARAM_RTS_THRESHOLD) 3268 rdev->wiphy.rts_threshold = rts_threshold; 3269 if (changed & WIPHY_PARAM_COVERAGE_CLASS) 3270 rdev->wiphy.coverage_class = coverage_class; 3271 if (changed & WIPHY_PARAM_TXQ_LIMIT) 3272 rdev->wiphy.txq_limit = txq_limit; 3273 if (changed & WIPHY_PARAM_TXQ_MEMORY_LIMIT) 3274 rdev->wiphy.txq_memory_limit = txq_memory_limit; 3275 if (changed & WIPHY_PARAM_TXQ_QUANTUM) 3276 rdev->wiphy.txq_quantum = txq_quantum; 3277 3278 result = rdev_set_wiphy_params(rdev, changed); 3279 if (result) { 3280 rdev->wiphy.retry_short = old_retry_short; 3281 rdev->wiphy.retry_long = old_retry_long; 3282 rdev->wiphy.frag_threshold = old_frag_threshold; 3283 rdev->wiphy.rts_threshold = old_rts_threshold; 3284 rdev->wiphy.coverage_class = old_coverage_class; 3285 rdev->wiphy.txq_limit = old_txq_limit; 3286 rdev->wiphy.txq_memory_limit = old_txq_memory_limit; 3287 rdev->wiphy.txq_quantum = old_txq_quantum; 3288 return result; 3289 } 3290 } 3291 return 0; 3292 } 3293 3294 static int nl80211_send_chandef(struct sk_buff *msg, 3295 const struct cfg80211_chan_def *chandef) 3296 { 3297 if (WARN_ON(!cfg80211_chandef_valid(chandef))) 3298 return -EINVAL; 3299 3300 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, 3301 chandef->chan->center_freq)) 3302 return -ENOBUFS; 3303 switch (chandef->width) { 3304 case NL80211_CHAN_WIDTH_20_NOHT: 3305 case NL80211_CHAN_WIDTH_20: 3306 case NL80211_CHAN_WIDTH_40: 3307 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 3308 cfg80211_get_chandef_type(chandef))) 3309 return -ENOBUFS; 3310 break; 3311 default: 3312 break; 3313 } 3314 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width)) 3315 return -ENOBUFS; 3316 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1)) 3317 return -ENOBUFS; 3318 if (chandef->center_freq2 && 3319 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2)) 3320 return -ENOBUFS; 3321 return 0; 3322 } 3323 3324 static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags, 3325 struct cfg80211_registered_device *rdev, 3326 struct wireless_dev *wdev, 3327 enum nl80211_commands cmd) 3328 { 3329 struct net_device *dev = wdev->netdev; 3330 void *hdr; 3331 3332 WARN_ON(cmd != NL80211_CMD_NEW_INTERFACE && 3333 cmd != NL80211_CMD_DEL_INTERFACE && 3334 cmd != NL80211_CMD_SET_INTERFACE); 3335 3336 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 3337 if (!hdr) 3338 return -1; 3339 3340 if (dev && 3341 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 3342 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name))) 3343 goto nla_put_failure; 3344 3345 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 3346 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || 3347 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 3348 NL80211_ATTR_PAD) || 3349 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, wdev_address(wdev)) || 3350 nla_put_u32(msg, NL80211_ATTR_GENERATION, 3351 rdev->devlist_generation ^ 3352 (cfg80211_rdev_list_generation << 2)) || 3353 nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr)) 3354 goto nla_put_failure; 3355 3356 if (rdev->ops->get_channel) { 3357 int ret; 3358 struct cfg80211_chan_def chandef = {}; 3359 3360 ret = rdev_get_channel(rdev, wdev, &chandef); 3361 if (ret == 0) { 3362 if (nl80211_send_chandef(msg, &chandef)) 3363 goto nla_put_failure; 3364 } 3365 } 3366 3367 if (rdev->ops->get_tx_power) { 3368 int dbm, ret; 3369 3370 ret = rdev_get_tx_power(rdev, wdev, &dbm); 3371 if (ret == 0 && 3372 nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL, 3373 DBM_TO_MBM(dbm))) 3374 goto nla_put_failure; 3375 } 3376 3377 wdev_lock(wdev); 3378 switch (wdev->iftype) { 3379 case NL80211_IFTYPE_AP: 3380 if (wdev->ssid_len && 3381 nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid)) 3382 goto nla_put_failure_locked; 3383 break; 3384 case NL80211_IFTYPE_STATION: 3385 case NL80211_IFTYPE_P2P_CLIENT: 3386 case NL80211_IFTYPE_ADHOC: { 3387 const u8 *ssid_ie; 3388 if (!wdev->current_bss) 3389 break; 3390 rcu_read_lock(); 3391 ssid_ie = ieee80211_bss_get_ie(&wdev->current_bss->pub, 3392 WLAN_EID_SSID); 3393 if (ssid_ie && 3394 nla_put(msg, NL80211_ATTR_SSID, ssid_ie[1], ssid_ie + 2)) 3395 goto nla_put_failure_rcu_locked; 3396 rcu_read_unlock(); 3397 break; 3398 } 3399 default: 3400 /* nothing */ 3401 break; 3402 } 3403 wdev_unlock(wdev); 3404 3405 if (rdev->ops->get_txq_stats) { 3406 struct cfg80211_txq_stats txqstats = {}; 3407 int ret = rdev_get_txq_stats(rdev, wdev, &txqstats); 3408 3409 if (ret == 0 && 3410 !nl80211_put_txq_stats(msg, &txqstats, 3411 NL80211_ATTR_TXQ_STATS)) 3412 goto nla_put_failure; 3413 } 3414 3415 genlmsg_end(msg, hdr); 3416 return 0; 3417 3418 nla_put_failure_rcu_locked: 3419 rcu_read_unlock(); 3420 nla_put_failure_locked: 3421 wdev_unlock(wdev); 3422 nla_put_failure: 3423 genlmsg_cancel(msg, hdr); 3424 return -EMSGSIZE; 3425 } 3426 3427 static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb) 3428 { 3429 int wp_idx = 0; 3430 int if_idx = 0; 3431 int wp_start = cb->args[0]; 3432 int if_start = cb->args[1]; 3433 int filter_wiphy = -1; 3434 struct cfg80211_registered_device *rdev; 3435 struct wireless_dev *wdev; 3436 int ret; 3437 3438 rtnl_lock(); 3439 if (!cb->args[2]) { 3440 struct nl80211_dump_wiphy_state state = { 3441 .filter_wiphy = -1, 3442 }; 3443 3444 ret = nl80211_dump_wiphy_parse(skb, cb, &state); 3445 if (ret) 3446 goto out_unlock; 3447 3448 filter_wiphy = state.filter_wiphy; 3449 3450 /* 3451 * if filtering, set cb->args[2] to +1 since 0 is the default 3452 * value needed to determine that parsing is necessary. 3453 */ 3454 if (filter_wiphy >= 0) 3455 cb->args[2] = filter_wiphy + 1; 3456 else 3457 cb->args[2] = -1; 3458 } else if (cb->args[2] > 0) { 3459 filter_wiphy = cb->args[2] - 1; 3460 } 3461 3462 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 3463 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) 3464 continue; 3465 if (wp_idx < wp_start) { 3466 wp_idx++; 3467 continue; 3468 } 3469 3470 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx) 3471 continue; 3472 3473 if_idx = 0; 3474 3475 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 3476 if (if_idx < if_start) { 3477 if_idx++; 3478 continue; 3479 } 3480 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, 3481 cb->nlh->nlmsg_seq, NLM_F_MULTI, 3482 rdev, wdev, 3483 NL80211_CMD_NEW_INTERFACE) < 0) { 3484 goto out; 3485 } 3486 if_idx++; 3487 } 3488 3489 wp_idx++; 3490 } 3491 out: 3492 cb->args[0] = wp_idx; 3493 cb->args[1] = if_idx; 3494 3495 ret = skb->len; 3496 out_unlock: 3497 rtnl_unlock(); 3498 3499 return ret; 3500 } 3501 3502 static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info) 3503 { 3504 struct sk_buff *msg; 3505 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3506 struct wireless_dev *wdev = info->user_ptr[1]; 3507 3508 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 3509 if (!msg) 3510 return -ENOMEM; 3511 3512 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, 3513 rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) { 3514 nlmsg_free(msg); 3515 return -ENOBUFS; 3516 } 3517 3518 return genlmsg_reply(msg, info); 3519 } 3520 3521 static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = { 3522 [NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG }, 3523 [NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG }, 3524 [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG }, 3525 [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG }, 3526 [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG }, 3527 [NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG }, 3528 }; 3529 3530 static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags) 3531 { 3532 struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1]; 3533 int flag; 3534 3535 *mntrflags = 0; 3536 3537 if (!nla) 3538 return -EINVAL; 3539 3540 if (nla_parse_nested_deprecated(flags, NL80211_MNTR_FLAG_MAX, nla, mntr_flags_policy, NULL)) 3541 return -EINVAL; 3542 3543 for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++) 3544 if (flags[flag]) 3545 *mntrflags |= (1<<flag); 3546 3547 *mntrflags |= MONITOR_FLAG_CHANGED; 3548 3549 return 0; 3550 } 3551 3552 static int nl80211_parse_mon_options(struct cfg80211_registered_device *rdev, 3553 enum nl80211_iftype type, 3554 struct genl_info *info, 3555 struct vif_params *params) 3556 { 3557 bool change = false; 3558 int err; 3559 3560 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { 3561 if (type != NL80211_IFTYPE_MONITOR) 3562 return -EINVAL; 3563 3564 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], 3565 ¶ms->flags); 3566 if (err) 3567 return err; 3568 3569 change = true; 3570 } 3571 3572 if (params->flags & MONITOR_FLAG_ACTIVE && 3573 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) 3574 return -EOPNOTSUPP; 3575 3576 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) { 3577 const u8 *mumimo_groups; 3578 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER; 3579 3580 if (type != NL80211_IFTYPE_MONITOR) 3581 return -EINVAL; 3582 3583 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) 3584 return -EOPNOTSUPP; 3585 3586 mumimo_groups = 3587 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); 3588 3589 /* bits 0 and 63 are reserved and must be zero */ 3590 if ((mumimo_groups[0] & BIT(0)) || 3591 (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7))) 3592 return -EINVAL; 3593 3594 params->vht_mumimo_groups = mumimo_groups; 3595 change = true; 3596 } 3597 3598 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) { 3599 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER; 3600 3601 if (type != NL80211_IFTYPE_MONITOR) 3602 return -EINVAL; 3603 3604 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) 3605 return -EOPNOTSUPP; 3606 3607 params->vht_mumimo_follow_addr = 3608 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]); 3609 change = true; 3610 } 3611 3612 return change ? 1 : 0; 3613 } 3614 3615 static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev, 3616 struct net_device *netdev, u8 use_4addr, 3617 enum nl80211_iftype iftype) 3618 { 3619 if (!use_4addr) { 3620 if (netdev && netif_is_bridge_port(netdev)) 3621 return -EBUSY; 3622 return 0; 3623 } 3624 3625 switch (iftype) { 3626 case NL80211_IFTYPE_AP_VLAN: 3627 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP) 3628 return 0; 3629 break; 3630 case NL80211_IFTYPE_STATION: 3631 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION) 3632 return 0; 3633 break; 3634 default: 3635 break; 3636 } 3637 3638 return -EOPNOTSUPP; 3639 } 3640 3641 static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info) 3642 { 3643 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3644 struct vif_params params; 3645 int err; 3646 enum nl80211_iftype otype, ntype; 3647 struct net_device *dev = info->user_ptr[1]; 3648 bool change = false; 3649 3650 memset(¶ms, 0, sizeof(params)); 3651 3652 otype = ntype = dev->ieee80211_ptr->iftype; 3653 3654 if (info->attrs[NL80211_ATTR_IFTYPE]) { 3655 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); 3656 if (otype != ntype) 3657 change = true; 3658 } 3659 3660 if (info->attrs[NL80211_ATTR_MESH_ID]) { 3661 struct wireless_dev *wdev = dev->ieee80211_ptr; 3662 3663 if (ntype != NL80211_IFTYPE_MESH_POINT) 3664 return -EINVAL; 3665 if (netif_running(dev)) 3666 return -EBUSY; 3667 3668 wdev_lock(wdev); 3669 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN != 3670 IEEE80211_MAX_MESH_ID_LEN); 3671 wdev->mesh_id_up_len = 3672 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 3673 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]), 3674 wdev->mesh_id_up_len); 3675 wdev_unlock(wdev); 3676 } 3677 3678 if (info->attrs[NL80211_ATTR_4ADDR]) { 3679 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); 3680 change = true; 3681 err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype); 3682 if (err) 3683 return err; 3684 } else { 3685 params.use_4addr = -1; 3686 } 3687 3688 err = nl80211_parse_mon_options(rdev, ntype, info, ¶ms); 3689 if (err < 0) 3690 return err; 3691 if (err > 0) 3692 change = true; 3693 3694 if (change) 3695 err = cfg80211_change_iface(rdev, dev, ntype, ¶ms); 3696 else 3697 err = 0; 3698 3699 if (!err && params.use_4addr != -1) 3700 dev->ieee80211_ptr->use_4addr = params.use_4addr; 3701 3702 if (change && !err) { 3703 struct wireless_dev *wdev = dev->ieee80211_ptr; 3704 3705 nl80211_notify_iface(rdev, wdev, NL80211_CMD_SET_INTERFACE); 3706 } 3707 3708 return err; 3709 } 3710 3711 static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) 3712 { 3713 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3714 struct vif_params params; 3715 struct wireless_dev *wdev; 3716 struct sk_buff *msg; 3717 int err; 3718 enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED; 3719 3720 /* to avoid failing a new interface creation due to pending removal */ 3721 cfg80211_destroy_ifaces(rdev); 3722 3723 memset(¶ms, 0, sizeof(params)); 3724 3725 if (!info->attrs[NL80211_ATTR_IFNAME]) 3726 return -EINVAL; 3727 3728 if (info->attrs[NL80211_ATTR_IFTYPE]) 3729 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); 3730 3731 if (!rdev->ops->add_virtual_intf) 3732 return -EOPNOTSUPP; 3733 3734 if ((type == NL80211_IFTYPE_P2P_DEVICE || type == NL80211_IFTYPE_NAN || 3735 rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) && 3736 info->attrs[NL80211_ATTR_MAC]) { 3737 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], 3738 ETH_ALEN); 3739 if (!is_valid_ether_addr(params.macaddr)) 3740 return -EADDRNOTAVAIL; 3741 } 3742 3743 if (info->attrs[NL80211_ATTR_4ADDR]) { 3744 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); 3745 err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type); 3746 if (err) 3747 return err; 3748 } 3749 3750 if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0)) 3751 return -EOPNOTSUPP; 3752 3753 err = nl80211_parse_mon_options(rdev, type, info, ¶ms); 3754 if (err < 0) 3755 return err; 3756 3757 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 3758 if (!msg) 3759 return -ENOMEM; 3760 3761 wdev = rdev_add_virtual_intf(rdev, 3762 nla_data(info->attrs[NL80211_ATTR_IFNAME]), 3763 NET_NAME_USER, type, ¶ms); 3764 if (WARN_ON(!wdev)) { 3765 nlmsg_free(msg); 3766 return -EPROTO; 3767 } else if (IS_ERR(wdev)) { 3768 nlmsg_free(msg); 3769 return PTR_ERR(wdev); 3770 } 3771 3772 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 3773 wdev->owner_nlportid = info->snd_portid; 3774 3775 switch (type) { 3776 case NL80211_IFTYPE_MESH_POINT: 3777 if (!info->attrs[NL80211_ATTR_MESH_ID]) 3778 break; 3779 wdev_lock(wdev); 3780 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN != 3781 IEEE80211_MAX_MESH_ID_LEN); 3782 wdev->mesh_id_up_len = 3783 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 3784 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]), 3785 wdev->mesh_id_up_len); 3786 wdev_unlock(wdev); 3787 break; 3788 case NL80211_IFTYPE_NAN: 3789 case NL80211_IFTYPE_P2P_DEVICE: 3790 /* 3791 * P2P Device and NAN do not have a netdev, so don't go 3792 * through the netdev notifier and must be added here 3793 */ 3794 cfg80211_init_wdev(rdev, wdev); 3795 break; 3796 default: 3797 break; 3798 } 3799 3800 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, 3801 rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) { 3802 nlmsg_free(msg); 3803 return -ENOBUFS; 3804 } 3805 3806 return genlmsg_reply(msg, info); 3807 } 3808 3809 static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info) 3810 { 3811 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3812 struct wireless_dev *wdev = info->user_ptr[1]; 3813 3814 if (!rdev->ops->del_virtual_intf) 3815 return -EOPNOTSUPP; 3816 3817 /* 3818 * If we remove a wireless device without a netdev then clear 3819 * user_ptr[1] so that nl80211_post_doit won't dereference it 3820 * to check if it needs to do dev_put(). Otherwise it crashes 3821 * since the wdev has been freed, unlike with a netdev where 3822 * we need the dev_put() for the netdev to really be freed. 3823 */ 3824 if (!wdev->netdev) 3825 info->user_ptr[1] = NULL; 3826 3827 return rdev_del_virtual_intf(rdev, wdev); 3828 } 3829 3830 static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info) 3831 { 3832 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3833 struct net_device *dev = info->user_ptr[1]; 3834 u16 noack_map; 3835 3836 if (!info->attrs[NL80211_ATTR_NOACK_MAP]) 3837 return -EINVAL; 3838 3839 if (!rdev->ops->set_noack_map) 3840 return -EOPNOTSUPP; 3841 3842 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]); 3843 3844 return rdev_set_noack_map(rdev, dev, noack_map); 3845 } 3846 3847 struct get_key_cookie { 3848 struct sk_buff *msg; 3849 int error; 3850 int idx; 3851 }; 3852 3853 static void get_key_callback(void *c, struct key_params *params) 3854 { 3855 struct nlattr *key; 3856 struct get_key_cookie *cookie = c; 3857 3858 if ((params->key && 3859 nla_put(cookie->msg, NL80211_ATTR_KEY_DATA, 3860 params->key_len, params->key)) || 3861 (params->seq && 3862 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ, 3863 params->seq_len, params->seq)) || 3864 (params->cipher && 3865 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER, 3866 params->cipher))) 3867 goto nla_put_failure; 3868 3869 key = nla_nest_start_noflag(cookie->msg, NL80211_ATTR_KEY); 3870 if (!key) 3871 goto nla_put_failure; 3872 3873 if ((params->key && 3874 nla_put(cookie->msg, NL80211_KEY_DATA, 3875 params->key_len, params->key)) || 3876 (params->seq && 3877 nla_put(cookie->msg, NL80211_KEY_SEQ, 3878 params->seq_len, params->seq)) || 3879 (params->cipher && 3880 nla_put_u32(cookie->msg, NL80211_KEY_CIPHER, 3881 params->cipher))) 3882 goto nla_put_failure; 3883 3884 if (nla_put_u8(cookie->msg, NL80211_KEY_IDX, cookie->idx)) 3885 goto nla_put_failure; 3886 3887 nla_nest_end(cookie->msg, key); 3888 3889 return; 3890 nla_put_failure: 3891 cookie->error = 1; 3892 } 3893 3894 static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) 3895 { 3896 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3897 int err; 3898 struct net_device *dev = info->user_ptr[1]; 3899 u8 key_idx = 0; 3900 const u8 *mac_addr = NULL; 3901 bool pairwise; 3902 struct get_key_cookie cookie = { 3903 .error = 0, 3904 }; 3905 void *hdr; 3906 struct sk_buff *msg; 3907 3908 if (info->attrs[NL80211_ATTR_KEY_IDX]) { 3909 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); 3910 if (key_idx > 5 && 3911 !wiphy_ext_feature_isset( 3912 &rdev->wiphy, 3913 NL80211_EXT_FEATURE_BEACON_PROTECTION)) 3914 return -EINVAL; 3915 } 3916 3917 if (info->attrs[NL80211_ATTR_MAC]) 3918 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 3919 3920 pairwise = !!mac_addr; 3921 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { 3922 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); 3923 3924 if (kt != NL80211_KEYTYPE_GROUP && 3925 kt != NL80211_KEYTYPE_PAIRWISE) 3926 return -EINVAL; 3927 pairwise = kt == NL80211_KEYTYPE_PAIRWISE; 3928 } 3929 3930 if (!rdev->ops->get_key) 3931 return -EOPNOTSUPP; 3932 3933 if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) 3934 return -ENOENT; 3935 3936 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 3937 if (!msg) 3938 return -ENOMEM; 3939 3940 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 3941 NL80211_CMD_NEW_KEY); 3942 if (!hdr) 3943 goto nla_put_failure; 3944 3945 cookie.msg = msg; 3946 cookie.idx = key_idx; 3947 3948 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 3949 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_idx)) 3950 goto nla_put_failure; 3951 if (mac_addr && 3952 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr)) 3953 goto nla_put_failure; 3954 3955 err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie, 3956 get_key_callback); 3957 3958 if (err) 3959 goto free_msg; 3960 3961 if (cookie.error) 3962 goto nla_put_failure; 3963 3964 genlmsg_end(msg, hdr); 3965 return genlmsg_reply(msg, info); 3966 3967 nla_put_failure: 3968 err = -ENOBUFS; 3969 free_msg: 3970 nlmsg_free(msg); 3971 return err; 3972 } 3973 3974 static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info) 3975 { 3976 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3977 struct key_parse key; 3978 int err; 3979 struct net_device *dev = info->user_ptr[1]; 3980 3981 err = nl80211_parse_key(info, &key); 3982 if (err) 3983 return err; 3984 3985 if (key.idx < 0) 3986 return -EINVAL; 3987 3988 /* Only support setting default key and 3989 * Extended Key ID action NL80211_KEY_SET_TX. 3990 */ 3991 if (!key.def && !key.defmgmt && !key.defbeacon && 3992 !(key.p.mode == NL80211_KEY_SET_TX)) 3993 return -EINVAL; 3994 3995 wdev_lock(dev->ieee80211_ptr); 3996 3997 if (key.def) { 3998 if (!rdev->ops->set_default_key) { 3999 err = -EOPNOTSUPP; 4000 goto out; 4001 } 4002 4003 err = nl80211_key_allowed(dev->ieee80211_ptr); 4004 if (err) 4005 goto out; 4006 4007 err = rdev_set_default_key(rdev, dev, key.idx, 4008 key.def_uni, key.def_multi); 4009 4010 if (err) 4011 goto out; 4012 4013 #ifdef CONFIG_CFG80211_WEXT 4014 dev->ieee80211_ptr->wext.default_key = key.idx; 4015 #endif 4016 } else if (key.defmgmt) { 4017 if (key.def_uni || !key.def_multi) { 4018 err = -EINVAL; 4019 goto out; 4020 } 4021 4022 if (!rdev->ops->set_default_mgmt_key) { 4023 err = -EOPNOTSUPP; 4024 goto out; 4025 } 4026 4027 err = nl80211_key_allowed(dev->ieee80211_ptr); 4028 if (err) 4029 goto out; 4030 4031 err = rdev_set_default_mgmt_key(rdev, dev, key.idx); 4032 if (err) 4033 goto out; 4034 4035 #ifdef CONFIG_CFG80211_WEXT 4036 dev->ieee80211_ptr->wext.default_mgmt_key = key.idx; 4037 #endif 4038 } else if (key.defbeacon) { 4039 if (key.def_uni || !key.def_multi) { 4040 err = -EINVAL; 4041 goto out; 4042 } 4043 4044 if (!rdev->ops->set_default_beacon_key) { 4045 err = -EOPNOTSUPP; 4046 goto out; 4047 } 4048 4049 err = nl80211_key_allowed(dev->ieee80211_ptr); 4050 if (err) 4051 goto out; 4052 4053 err = rdev_set_default_beacon_key(rdev, dev, key.idx); 4054 if (err) 4055 goto out; 4056 } else if (key.p.mode == NL80211_KEY_SET_TX && 4057 wiphy_ext_feature_isset(&rdev->wiphy, 4058 NL80211_EXT_FEATURE_EXT_KEY_ID)) { 4059 u8 *mac_addr = NULL; 4060 4061 if (info->attrs[NL80211_ATTR_MAC]) 4062 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 4063 4064 if (!mac_addr || key.idx < 0 || key.idx > 1) { 4065 err = -EINVAL; 4066 goto out; 4067 } 4068 4069 err = rdev_add_key(rdev, dev, key.idx, 4070 NL80211_KEYTYPE_PAIRWISE, 4071 mac_addr, &key.p); 4072 } else { 4073 err = -EINVAL; 4074 } 4075 out: 4076 wdev_unlock(dev->ieee80211_ptr); 4077 4078 return err; 4079 } 4080 4081 static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info) 4082 { 4083 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4084 int err; 4085 struct net_device *dev = info->user_ptr[1]; 4086 struct key_parse key; 4087 const u8 *mac_addr = NULL; 4088 4089 err = nl80211_parse_key(info, &key); 4090 if (err) 4091 return err; 4092 4093 if (!key.p.key) { 4094 GENL_SET_ERR_MSG(info, "no key"); 4095 return -EINVAL; 4096 } 4097 4098 if (info->attrs[NL80211_ATTR_MAC]) 4099 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 4100 4101 if (key.type == -1) { 4102 if (mac_addr) 4103 key.type = NL80211_KEYTYPE_PAIRWISE; 4104 else 4105 key.type = NL80211_KEYTYPE_GROUP; 4106 } 4107 4108 /* for now */ 4109 if (key.type != NL80211_KEYTYPE_PAIRWISE && 4110 key.type != NL80211_KEYTYPE_GROUP) { 4111 GENL_SET_ERR_MSG(info, "key type not pairwise or group"); 4112 return -EINVAL; 4113 } 4114 4115 if (key.type == NL80211_KEYTYPE_GROUP && 4116 info->attrs[NL80211_ATTR_VLAN_ID]) 4117 key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 4118 4119 if (!rdev->ops->add_key) 4120 return -EOPNOTSUPP; 4121 4122 if (cfg80211_validate_key_settings(rdev, &key.p, key.idx, 4123 key.type == NL80211_KEYTYPE_PAIRWISE, 4124 mac_addr)) { 4125 GENL_SET_ERR_MSG(info, "key setting validation failed"); 4126 return -EINVAL; 4127 } 4128 4129 wdev_lock(dev->ieee80211_ptr); 4130 err = nl80211_key_allowed(dev->ieee80211_ptr); 4131 if (err) 4132 GENL_SET_ERR_MSG(info, "key not allowed"); 4133 if (!err) { 4134 err = rdev_add_key(rdev, dev, key.idx, 4135 key.type == NL80211_KEYTYPE_PAIRWISE, 4136 mac_addr, &key.p); 4137 if (err) 4138 GENL_SET_ERR_MSG(info, "key addition failed"); 4139 } 4140 wdev_unlock(dev->ieee80211_ptr); 4141 4142 return err; 4143 } 4144 4145 static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info) 4146 { 4147 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4148 int err; 4149 struct net_device *dev = info->user_ptr[1]; 4150 u8 *mac_addr = NULL; 4151 struct key_parse key; 4152 4153 err = nl80211_parse_key(info, &key); 4154 if (err) 4155 return err; 4156 4157 if (info->attrs[NL80211_ATTR_MAC]) 4158 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 4159 4160 if (key.type == -1) { 4161 if (mac_addr) 4162 key.type = NL80211_KEYTYPE_PAIRWISE; 4163 else 4164 key.type = NL80211_KEYTYPE_GROUP; 4165 } 4166 4167 /* for now */ 4168 if (key.type != NL80211_KEYTYPE_PAIRWISE && 4169 key.type != NL80211_KEYTYPE_GROUP) 4170 return -EINVAL; 4171 4172 if (!rdev->ops->del_key) 4173 return -EOPNOTSUPP; 4174 4175 wdev_lock(dev->ieee80211_ptr); 4176 err = nl80211_key_allowed(dev->ieee80211_ptr); 4177 4178 if (key.type == NL80211_KEYTYPE_GROUP && mac_addr && 4179 !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) 4180 err = -ENOENT; 4181 4182 if (!err) 4183 err = rdev_del_key(rdev, dev, key.idx, 4184 key.type == NL80211_KEYTYPE_PAIRWISE, 4185 mac_addr); 4186 4187 #ifdef CONFIG_CFG80211_WEXT 4188 if (!err) { 4189 if (key.idx == dev->ieee80211_ptr->wext.default_key) 4190 dev->ieee80211_ptr->wext.default_key = -1; 4191 else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key) 4192 dev->ieee80211_ptr->wext.default_mgmt_key = -1; 4193 } 4194 #endif 4195 wdev_unlock(dev->ieee80211_ptr); 4196 4197 return err; 4198 } 4199 4200 /* This function returns an error or the number of nested attributes */ 4201 static int validate_acl_mac_addrs(struct nlattr *nl_attr) 4202 { 4203 struct nlattr *attr; 4204 int n_entries = 0, tmp; 4205 4206 nla_for_each_nested(attr, nl_attr, tmp) { 4207 if (nla_len(attr) != ETH_ALEN) 4208 return -EINVAL; 4209 4210 n_entries++; 4211 } 4212 4213 return n_entries; 4214 } 4215 4216 /* 4217 * This function parses ACL information and allocates memory for ACL data. 4218 * On successful return, the calling function is responsible to free the 4219 * ACL buffer returned by this function. 4220 */ 4221 static struct cfg80211_acl_data *parse_acl_data(struct wiphy *wiphy, 4222 struct genl_info *info) 4223 { 4224 enum nl80211_acl_policy acl_policy; 4225 struct nlattr *attr; 4226 struct cfg80211_acl_data *acl; 4227 int i = 0, n_entries, tmp; 4228 4229 if (!wiphy->max_acl_mac_addrs) 4230 return ERR_PTR(-EOPNOTSUPP); 4231 4232 if (!info->attrs[NL80211_ATTR_ACL_POLICY]) 4233 return ERR_PTR(-EINVAL); 4234 4235 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]); 4236 if (acl_policy != NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED && 4237 acl_policy != NL80211_ACL_POLICY_DENY_UNLESS_LISTED) 4238 return ERR_PTR(-EINVAL); 4239 4240 if (!info->attrs[NL80211_ATTR_MAC_ADDRS]) 4241 return ERR_PTR(-EINVAL); 4242 4243 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]); 4244 if (n_entries < 0) 4245 return ERR_PTR(n_entries); 4246 4247 if (n_entries > wiphy->max_acl_mac_addrs) 4248 return ERR_PTR(-ENOTSUPP); 4249 4250 acl = kzalloc(struct_size(acl, mac_addrs, n_entries), GFP_KERNEL); 4251 if (!acl) 4252 return ERR_PTR(-ENOMEM); 4253 4254 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { 4255 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); 4256 i++; 4257 } 4258 4259 acl->n_acl_entries = n_entries; 4260 acl->acl_policy = acl_policy; 4261 4262 return acl; 4263 } 4264 4265 static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info) 4266 { 4267 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4268 struct net_device *dev = info->user_ptr[1]; 4269 struct cfg80211_acl_data *acl; 4270 int err; 4271 4272 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 4273 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4274 return -EOPNOTSUPP; 4275 4276 if (!dev->ieee80211_ptr->beacon_interval) 4277 return -EINVAL; 4278 4279 acl = parse_acl_data(&rdev->wiphy, info); 4280 if (IS_ERR(acl)) 4281 return PTR_ERR(acl); 4282 4283 err = rdev_set_mac_acl(rdev, dev, acl); 4284 4285 kfree(acl); 4286 4287 return err; 4288 } 4289 4290 static u32 rateset_to_mask(struct ieee80211_supported_band *sband, 4291 u8 *rates, u8 rates_len) 4292 { 4293 u8 i; 4294 u32 mask = 0; 4295 4296 for (i = 0; i < rates_len; i++) { 4297 int rate = (rates[i] & 0x7f) * 5; 4298 int ridx; 4299 4300 for (ridx = 0; ridx < sband->n_bitrates; ridx++) { 4301 struct ieee80211_rate *srate = 4302 &sband->bitrates[ridx]; 4303 if (rate == srate->bitrate) { 4304 mask |= 1 << ridx; 4305 break; 4306 } 4307 } 4308 if (ridx == sband->n_bitrates) 4309 return 0; /* rate not found */ 4310 } 4311 4312 return mask; 4313 } 4314 4315 static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband, 4316 u8 *rates, u8 rates_len, 4317 u8 mcs[IEEE80211_HT_MCS_MASK_LEN]) 4318 { 4319 u8 i; 4320 4321 memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN); 4322 4323 for (i = 0; i < rates_len; i++) { 4324 int ridx, rbit; 4325 4326 ridx = rates[i] / 8; 4327 rbit = BIT(rates[i] % 8); 4328 4329 /* check validity */ 4330 if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN)) 4331 return false; 4332 4333 /* check availability */ 4334 ridx = array_index_nospec(ridx, IEEE80211_HT_MCS_MASK_LEN); 4335 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) 4336 mcs[ridx] |= rbit; 4337 else 4338 return false; 4339 } 4340 4341 return true; 4342 } 4343 4344 static u16 vht_mcs_map_to_mcs_mask(u8 vht_mcs_map) 4345 { 4346 u16 mcs_mask = 0; 4347 4348 switch (vht_mcs_map) { 4349 case IEEE80211_VHT_MCS_NOT_SUPPORTED: 4350 break; 4351 case IEEE80211_VHT_MCS_SUPPORT_0_7: 4352 mcs_mask = 0x00FF; 4353 break; 4354 case IEEE80211_VHT_MCS_SUPPORT_0_8: 4355 mcs_mask = 0x01FF; 4356 break; 4357 case IEEE80211_VHT_MCS_SUPPORT_0_9: 4358 mcs_mask = 0x03FF; 4359 break; 4360 default: 4361 break; 4362 } 4363 4364 return mcs_mask; 4365 } 4366 4367 static void vht_build_mcs_mask(u16 vht_mcs_map, 4368 u16 vht_mcs_mask[NL80211_VHT_NSS_MAX]) 4369 { 4370 u8 nss; 4371 4372 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) { 4373 vht_mcs_mask[nss] = vht_mcs_map_to_mcs_mask(vht_mcs_map & 0x03); 4374 vht_mcs_map >>= 2; 4375 } 4376 } 4377 4378 static bool vht_set_mcs_mask(struct ieee80211_supported_band *sband, 4379 struct nl80211_txrate_vht *txrate, 4380 u16 mcs[NL80211_VHT_NSS_MAX]) 4381 { 4382 u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 4383 u16 tx_mcs_mask[NL80211_VHT_NSS_MAX] = {}; 4384 u8 i; 4385 4386 if (!sband->vht_cap.vht_supported) 4387 return false; 4388 4389 memset(mcs, 0, sizeof(u16) * NL80211_VHT_NSS_MAX); 4390 4391 /* Build vht_mcs_mask from VHT capabilities */ 4392 vht_build_mcs_mask(tx_mcs_map, tx_mcs_mask); 4393 4394 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 4395 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) 4396 mcs[i] = txrate->mcs[i]; 4397 else 4398 return false; 4399 } 4400 4401 return true; 4402 } 4403 4404 static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = { 4405 [NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY, 4406 .len = NL80211_MAX_SUPP_RATES }, 4407 [NL80211_TXRATE_HT] = { .type = NLA_BINARY, 4408 .len = NL80211_MAX_SUPP_HT_RATES }, 4409 [NL80211_TXRATE_VHT] = { 4410 .type = NLA_EXACT_LEN_WARN, 4411 .len = sizeof(struct nl80211_txrate_vht), 4412 }, 4413 [NL80211_TXRATE_GI] = { .type = NLA_U8 }, 4414 }; 4415 4416 static int nl80211_parse_tx_bitrate_mask(struct genl_info *info, 4417 struct cfg80211_bitrate_mask *mask) 4418 { 4419 struct nlattr *tb[NL80211_TXRATE_MAX + 1]; 4420 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4421 int rem, i; 4422 struct nlattr *tx_rates; 4423 struct ieee80211_supported_band *sband; 4424 u16 vht_tx_mcs_map; 4425 4426 memset(mask, 0, sizeof(*mask)); 4427 /* Default to all rates enabled */ 4428 for (i = 0; i < NUM_NL80211_BANDS; i++) { 4429 sband = rdev->wiphy.bands[i]; 4430 4431 if (!sband) 4432 continue; 4433 4434 mask->control[i].legacy = (1 << sband->n_bitrates) - 1; 4435 memcpy(mask->control[i].ht_mcs, 4436 sband->ht_cap.mcs.rx_mask, 4437 sizeof(mask->control[i].ht_mcs)); 4438 4439 if (!sband->vht_cap.vht_supported) 4440 continue; 4441 4442 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 4443 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs); 4444 } 4445 4446 /* if no rates are given set it back to the defaults */ 4447 if (!info->attrs[NL80211_ATTR_TX_RATES]) 4448 goto out; 4449 4450 /* The nested attribute uses enum nl80211_band as the index. This maps 4451 * directly to the enum nl80211_band values used in cfg80211. 4452 */ 4453 BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8); 4454 nla_for_each_nested(tx_rates, info->attrs[NL80211_ATTR_TX_RATES], rem) { 4455 enum nl80211_band band = nla_type(tx_rates); 4456 int err; 4457 4458 if (band < 0 || band >= NUM_NL80211_BANDS) 4459 return -EINVAL; 4460 sband = rdev->wiphy.bands[band]; 4461 if (sband == NULL) 4462 return -EINVAL; 4463 err = nla_parse_nested_deprecated(tb, NL80211_TXRATE_MAX, 4464 tx_rates, 4465 nl80211_txattr_policy, 4466 info->extack); 4467 if (err) 4468 return err; 4469 if (tb[NL80211_TXRATE_LEGACY]) { 4470 mask->control[band].legacy = rateset_to_mask( 4471 sband, 4472 nla_data(tb[NL80211_TXRATE_LEGACY]), 4473 nla_len(tb[NL80211_TXRATE_LEGACY])); 4474 if ((mask->control[band].legacy == 0) && 4475 nla_len(tb[NL80211_TXRATE_LEGACY])) 4476 return -EINVAL; 4477 } 4478 if (tb[NL80211_TXRATE_HT]) { 4479 if (!ht_rateset_to_mask( 4480 sband, 4481 nla_data(tb[NL80211_TXRATE_HT]), 4482 nla_len(tb[NL80211_TXRATE_HT]), 4483 mask->control[band].ht_mcs)) 4484 return -EINVAL; 4485 } 4486 if (tb[NL80211_TXRATE_VHT]) { 4487 if (!vht_set_mcs_mask( 4488 sband, 4489 nla_data(tb[NL80211_TXRATE_VHT]), 4490 mask->control[band].vht_mcs)) 4491 return -EINVAL; 4492 } 4493 if (tb[NL80211_TXRATE_GI]) { 4494 mask->control[band].gi = 4495 nla_get_u8(tb[NL80211_TXRATE_GI]); 4496 if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI) 4497 return -EINVAL; 4498 } 4499 4500 if (mask->control[band].legacy == 0) { 4501 /* don't allow empty legacy rates if HT or VHT 4502 * are not even supported. 4503 */ 4504 if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported || 4505 rdev->wiphy.bands[band]->vht_cap.vht_supported)) 4506 return -EINVAL; 4507 4508 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) 4509 if (mask->control[band].ht_mcs[i]) 4510 goto out; 4511 4512 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) 4513 if (mask->control[band].vht_mcs[i]) 4514 goto out; 4515 4516 /* legacy and mcs rates may not be both empty */ 4517 return -EINVAL; 4518 } 4519 } 4520 4521 out: 4522 return 0; 4523 } 4524 4525 static int validate_beacon_tx_rate(struct cfg80211_registered_device *rdev, 4526 enum nl80211_band band, 4527 struct cfg80211_bitrate_mask *beacon_rate) 4528 { 4529 u32 count_ht, count_vht, i; 4530 u32 rate = beacon_rate->control[band].legacy; 4531 4532 /* Allow only one rate */ 4533 if (hweight32(rate) > 1) 4534 return -EINVAL; 4535 4536 count_ht = 0; 4537 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) { 4538 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) { 4539 return -EINVAL; 4540 } else if (beacon_rate->control[band].ht_mcs[i]) { 4541 count_ht++; 4542 if (count_ht > 1) 4543 return -EINVAL; 4544 } 4545 if (count_ht && rate) 4546 return -EINVAL; 4547 } 4548 4549 count_vht = 0; 4550 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 4551 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) { 4552 return -EINVAL; 4553 } else if (beacon_rate->control[band].vht_mcs[i]) { 4554 count_vht++; 4555 if (count_vht > 1) 4556 return -EINVAL; 4557 } 4558 if (count_vht && rate) 4559 return -EINVAL; 4560 } 4561 4562 if ((count_ht && count_vht) || (!rate && !count_ht && !count_vht)) 4563 return -EINVAL; 4564 4565 if (rate && 4566 !wiphy_ext_feature_isset(&rdev->wiphy, 4567 NL80211_EXT_FEATURE_BEACON_RATE_LEGACY)) 4568 return -EINVAL; 4569 if (count_ht && 4570 !wiphy_ext_feature_isset(&rdev->wiphy, 4571 NL80211_EXT_FEATURE_BEACON_RATE_HT)) 4572 return -EINVAL; 4573 if (count_vht && 4574 !wiphy_ext_feature_isset(&rdev->wiphy, 4575 NL80211_EXT_FEATURE_BEACON_RATE_VHT)) 4576 return -EINVAL; 4577 4578 return 0; 4579 } 4580 4581 static int nl80211_parse_beacon(struct cfg80211_registered_device *rdev, 4582 struct nlattr *attrs[], 4583 struct cfg80211_beacon_data *bcn) 4584 { 4585 bool haveinfo = false; 4586 int err; 4587 4588 memset(bcn, 0, sizeof(*bcn)); 4589 4590 if (attrs[NL80211_ATTR_BEACON_HEAD]) { 4591 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); 4592 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); 4593 if (!bcn->head_len) 4594 return -EINVAL; 4595 haveinfo = true; 4596 } 4597 4598 if (attrs[NL80211_ATTR_BEACON_TAIL]) { 4599 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]); 4600 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]); 4601 haveinfo = true; 4602 } 4603 4604 if (!haveinfo) 4605 return -EINVAL; 4606 4607 if (attrs[NL80211_ATTR_IE]) { 4608 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]); 4609 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]); 4610 } 4611 4612 if (attrs[NL80211_ATTR_IE_PROBE_RESP]) { 4613 bcn->proberesp_ies = 4614 nla_data(attrs[NL80211_ATTR_IE_PROBE_RESP]); 4615 bcn->proberesp_ies_len = 4616 nla_len(attrs[NL80211_ATTR_IE_PROBE_RESP]); 4617 } 4618 4619 if (attrs[NL80211_ATTR_IE_ASSOC_RESP]) { 4620 bcn->assocresp_ies = 4621 nla_data(attrs[NL80211_ATTR_IE_ASSOC_RESP]); 4622 bcn->assocresp_ies_len = 4623 nla_len(attrs[NL80211_ATTR_IE_ASSOC_RESP]); 4624 } 4625 4626 if (attrs[NL80211_ATTR_PROBE_RESP]) { 4627 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]); 4628 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]); 4629 } 4630 4631 if (attrs[NL80211_ATTR_FTM_RESPONDER]) { 4632 struct nlattr *tb[NL80211_FTM_RESP_ATTR_MAX + 1]; 4633 4634 err = nla_parse_nested_deprecated(tb, 4635 NL80211_FTM_RESP_ATTR_MAX, 4636 attrs[NL80211_ATTR_FTM_RESPONDER], 4637 NULL, NULL); 4638 if (err) 4639 return err; 4640 4641 if (tb[NL80211_FTM_RESP_ATTR_ENABLED] && 4642 wiphy_ext_feature_isset(&rdev->wiphy, 4643 NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER)) 4644 bcn->ftm_responder = 1; 4645 else 4646 return -EOPNOTSUPP; 4647 4648 if (tb[NL80211_FTM_RESP_ATTR_LCI]) { 4649 bcn->lci = nla_data(tb[NL80211_FTM_RESP_ATTR_LCI]); 4650 bcn->lci_len = nla_len(tb[NL80211_FTM_RESP_ATTR_LCI]); 4651 } 4652 4653 if (tb[NL80211_FTM_RESP_ATTR_CIVICLOC]) { 4654 bcn->civicloc = nla_data(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); 4655 bcn->civicloc_len = nla_len(tb[NL80211_FTM_RESP_ATTR_CIVICLOC]); 4656 } 4657 } else { 4658 bcn->ftm_responder = -1; 4659 } 4660 4661 return 0; 4662 } 4663 4664 static int nl80211_parse_he_obss_pd(struct nlattr *attrs, 4665 struct ieee80211_he_obss_pd *he_obss_pd) 4666 { 4667 struct nlattr *tb[NL80211_HE_OBSS_PD_ATTR_MAX + 1]; 4668 int err; 4669 4670 err = nla_parse_nested(tb, NL80211_HE_OBSS_PD_ATTR_MAX, attrs, 4671 he_obss_pd_policy, NULL); 4672 if (err) 4673 return err; 4674 4675 if (!tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET] || 4676 !tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]) 4677 return -EINVAL; 4678 4679 he_obss_pd->min_offset = 4680 nla_get_u32(tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET]); 4681 he_obss_pd->max_offset = 4682 nla_get_u32(tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET]); 4683 4684 if (he_obss_pd->min_offset >= he_obss_pd->max_offset) 4685 return -EINVAL; 4686 4687 he_obss_pd->enable = true; 4688 4689 return 0; 4690 } 4691 4692 static int nl80211_parse_he_bss_color(struct nlattr *attrs, 4693 struct cfg80211_he_bss_color *he_bss_color) 4694 { 4695 struct nlattr *tb[NL80211_HE_BSS_COLOR_ATTR_MAX + 1]; 4696 int err; 4697 4698 err = nla_parse_nested(tb, NL80211_HE_BSS_COLOR_ATTR_MAX, attrs, 4699 he_bss_color_policy, NULL); 4700 if (err) 4701 return err; 4702 4703 if (!tb[NL80211_HE_BSS_COLOR_ATTR_COLOR]) 4704 return -EINVAL; 4705 4706 he_bss_color->color = 4707 nla_get_u8(tb[NL80211_HE_BSS_COLOR_ATTR_COLOR]); 4708 he_bss_color->disabled = 4709 nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_DISABLED]); 4710 he_bss_color->partial = 4711 nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_PARTIAL]); 4712 4713 return 0; 4714 } 4715 4716 static void nl80211_check_ap_rate_selectors(struct cfg80211_ap_settings *params, 4717 const u8 *rates) 4718 { 4719 int i; 4720 4721 if (!rates) 4722 return; 4723 4724 for (i = 0; i < rates[1]; i++) { 4725 if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY) 4726 params->ht_required = true; 4727 if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY) 4728 params->vht_required = true; 4729 } 4730 } 4731 4732 /* 4733 * Since the nl80211 API didn't include, from the beginning, attributes about 4734 * HT/VHT requirements/capabilities, we parse them out of the IEs for the 4735 * benefit of drivers that rebuild IEs in the firmware. 4736 */ 4737 static void nl80211_calculate_ap_params(struct cfg80211_ap_settings *params) 4738 { 4739 const struct cfg80211_beacon_data *bcn = ¶ms->beacon; 4740 size_t ies_len = bcn->tail_len; 4741 const u8 *ies = bcn->tail; 4742 const u8 *rates; 4743 const u8 *cap; 4744 4745 rates = cfg80211_find_ie(WLAN_EID_SUPP_RATES, ies, ies_len); 4746 nl80211_check_ap_rate_selectors(params, rates); 4747 4748 rates = cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES, ies, ies_len); 4749 nl80211_check_ap_rate_selectors(params, rates); 4750 4751 cap = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, ies, ies_len); 4752 if (cap && cap[1] >= sizeof(*params->ht_cap)) 4753 params->ht_cap = (void *)(cap + 2); 4754 cap = cfg80211_find_ie(WLAN_EID_VHT_CAPABILITY, ies, ies_len); 4755 if (cap && cap[1] >= sizeof(*params->vht_cap)) 4756 params->vht_cap = (void *)(cap + 2); 4757 cap = cfg80211_find_ext_ie(WLAN_EID_EXT_HE_CAPABILITY, ies, ies_len); 4758 if (cap && cap[1] >= sizeof(*params->he_cap) + 1) 4759 params->he_cap = (void *)(cap + 3); 4760 cap = cfg80211_find_ext_ie(WLAN_EID_EXT_HE_OPERATION, ies, ies_len); 4761 if (cap && cap[1] >= sizeof(*params->he_oper) + 1) 4762 params->he_oper = (void *)(cap + 3); 4763 } 4764 4765 static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev, 4766 struct cfg80211_ap_settings *params) 4767 { 4768 struct wireless_dev *wdev; 4769 bool ret = false; 4770 4771 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 4772 if (wdev->iftype != NL80211_IFTYPE_AP && 4773 wdev->iftype != NL80211_IFTYPE_P2P_GO) 4774 continue; 4775 4776 if (!wdev->preset_chandef.chan) 4777 continue; 4778 4779 params->chandef = wdev->preset_chandef; 4780 ret = true; 4781 break; 4782 } 4783 4784 return ret; 4785 } 4786 4787 static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev, 4788 enum nl80211_auth_type auth_type, 4789 enum nl80211_commands cmd) 4790 { 4791 if (auth_type > NL80211_AUTHTYPE_MAX) 4792 return false; 4793 4794 switch (cmd) { 4795 case NL80211_CMD_AUTHENTICATE: 4796 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && 4797 auth_type == NL80211_AUTHTYPE_SAE) 4798 return false; 4799 if (!wiphy_ext_feature_isset(&rdev->wiphy, 4800 NL80211_EXT_FEATURE_FILS_STA) && 4801 (auth_type == NL80211_AUTHTYPE_FILS_SK || 4802 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 4803 auth_type == NL80211_AUTHTYPE_FILS_PK)) 4804 return false; 4805 return true; 4806 case NL80211_CMD_CONNECT: 4807 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && 4808 !wiphy_ext_feature_isset(&rdev->wiphy, 4809 NL80211_EXT_FEATURE_SAE_OFFLOAD) && 4810 auth_type == NL80211_AUTHTYPE_SAE) 4811 return false; 4812 4813 /* FILS with SK PFS or PK not supported yet */ 4814 if (auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 4815 auth_type == NL80211_AUTHTYPE_FILS_PK) 4816 return false; 4817 if (!wiphy_ext_feature_isset( 4818 &rdev->wiphy, 4819 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) && 4820 auth_type == NL80211_AUTHTYPE_FILS_SK) 4821 return false; 4822 return true; 4823 case NL80211_CMD_START_AP: 4824 /* SAE not supported yet */ 4825 if (auth_type == NL80211_AUTHTYPE_SAE) 4826 return false; 4827 /* FILS not supported yet */ 4828 if (auth_type == NL80211_AUTHTYPE_FILS_SK || 4829 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 4830 auth_type == NL80211_AUTHTYPE_FILS_PK) 4831 return false; 4832 return true; 4833 default: 4834 return false; 4835 } 4836 } 4837 4838 static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) 4839 { 4840 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4841 struct net_device *dev = info->user_ptr[1]; 4842 struct wireless_dev *wdev = dev->ieee80211_ptr; 4843 struct cfg80211_ap_settings params; 4844 int err; 4845 4846 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 4847 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4848 return -EOPNOTSUPP; 4849 4850 if (!rdev->ops->start_ap) 4851 return -EOPNOTSUPP; 4852 4853 if (wdev->beacon_interval) 4854 return -EALREADY; 4855 4856 memset(¶ms, 0, sizeof(params)); 4857 4858 /* these are required for START_AP */ 4859 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] || 4860 !info->attrs[NL80211_ATTR_DTIM_PERIOD] || 4861 !info->attrs[NL80211_ATTR_BEACON_HEAD]) 4862 return -EINVAL; 4863 4864 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon); 4865 if (err) 4866 return err; 4867 4868 params.beacon_interval = 4869 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 4870 params.dtim_period = 4871 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 4872 4873 err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype, 4874 params.beacon_interval); 4875 if (err) 4876 return err; 4877 4878 /* 4879 * In theory, some of these attributes should be required here 4880 * but since they were not used when the command was originally 4881 * added, keep them optional for old user space programs to let 4882 * them continue to work with drivers that do not need the 4883 * additional information -- drivers must check! 4884 */ 4885 if (info->attrs[NL80211_ATTR_SSID]) { 4886 params.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 4887 params.ssid_len = 4888 nla_len(info->attrs[NL80211_ATTR_SSID]); 4889 if (params.ssid_len == 0 || 4890 params.ssid_len > IEEE80211_MAX_SSID_LEN) 4891 return -EINVAL; 4892 } 4893 4894 if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) 4895 params.hidden_ssid = nla_get_u32( 4896 info->attrs[NL80211_ATTR_HIDDEN_SSID]); 4897 4898 params.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 4899 4900 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 4901 params.auth_type = nla_get_u32( 4902 info->attrs[NL80211_ATTR_AUTH_TYPE]); 4903 if (!nl80211_valid_auth_type(rdev, params.auth_type, 4904 NL80211_CMD_START_AP)) 4905 return -EINVAL; 4906 } else 4907 params.auth_type = NL80211_AUTHTYPE_AUTOMATIC; 4908 4909 err = nl80211_crypto_settings(rdev, info, ¶ms.crypto, 4910 NL80211_MAX_NR_CIPHER_SUITES); 4911 if (err) 4912 return err; 4913 4914 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) { 4915 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) 4916 return -EOPNOTSUPP; 4917 params.inactivity_timeout = nla_get_u16( 4918 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]); 4919 } 4920 4921 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 4922 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4923 return -EINVAL; 4924 params.p2p_ctwindow = 4925 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 4926 if (params.p2p_ctwindow != 0 && 4927 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) 4928 return -EINVAL; 4929 } 4930 4931 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 4932 u8 tmp; 4933 4934 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4935 return -EINVAL; 4936 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 4937 params.p2p_opp_ps = tmp; 4938 if (params.p2p_opp_ps != 0 && 4939 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) 4940 return -EINVAL; 4941 } 4942 4943 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 4944 err = nl80211_parse_chandef(rdev, info, ¶ms.chandef); 4945 if (err) 4946 return err; 4947 } else if (wdev->preset_chandef.chan) { 4948 params.chandef = wdev->preset_chandef; 4949 } else if (!nl80211_get_ap_channel(rdev, ¶ms)) 4950 return -EINVAL; 4951 4952 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, 4953 wdev->iftype)) 4954 return -EINVAL; 4955 4956 if (info->attrs[NL80211_ATTR_TX_RATES]) { 4957 err = nl80211_parse_tx_bitrate_mask(info, ¶ms.beacon_rate); 4958 if (err) 4959 return err; 4960 4961 err = validate_beacon_tx_rate(rdev, params.chandef.chan->band, 4962 ¶ms.beacon_rate); 4963 if (err) 4964 return err; 4965 } 4966 4967 if (info->attrs[NL80211_ATTR_SMPS_MODE]) { 4968 params.smps_mode = 4969 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]); 4970 switch (params.smps_mode) { 4971 case NL80211_SMPS_OFF: 4972 break; 4973 case NL80211_SMPS_STATIC: 4974 if (!(rdev->wiphy.features & 4975 NL80211_FEATURE_STATIC_SMPS)) 4976 return -EINVAL; 4977 break; 4978 case NL80211_SMPS_DYNAMIC: 4979 if (!(rdev->wiphy.features & 4980 NL80211_FEATURE_DYNAMIC_SMPS)) 4981 return -EINVAL; 4982 break; 4983 default: 4984 return -EINVAL; 4985 } 4986 } else { 4987 params.smps_mode = NL80211_SMPS_OFF; 4988 } 4989 4990 params.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); 4991 if (params.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) 4992 return -EOPNOTSUPP; 4993 4994 if (info->attrs[NL80211_ATTR_ACL_POLICY]) { 4995 params.acl = parse_acl_data(&rdev->wiphy, info); 4996 if (IS_ERR(params.acl)) 4997 return PTR_ERR(params.acl); 4998 } 4999 5000 params.twt_responder = 5001 nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]); 5002 5003 if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) { 5004 err = nl80211_parse_he_obss_pd( 5005 info->attrs[NL80211_ATTR_HE_OBSS_PD], 5006 ¶ms.he_obss_pd); 5007 goto out; 5008 } 5009 5010 if (info->attrs[NL80211_ATTR_HE_BSS_COLOR]) { 5011 err = nl80211_parse_he_bss_color( 5012 info->attrs[NL80211_ATTR_HE_BSS_COLOR], 5013 ¶ms.he_bss_color); 5014 if (err) 5015 return err; 5016 } 5017 5018 nl80211_calculate_ap_params(¶ms); 5019 5020 if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT]) 5021 params.flags |= AP_SETTINGS_EXTERNAL_AUTH_SUPPORT; 5022 5023 wdev_lock(wdev); 5024 err = rdev_start_ap(rdev, dev, ¶ms); 5025 if (!err) { 5026 wdev->preset_chandef = params.chandef; 5027 wdev->beacon_interval = params.beacon_interval; 5028 wdev->chandef = params.chandef; 5029 wdev->ssid_len = params.ssid_len; 5030 memcpy(wdev->ssid, params.ssid, wdev->ssid_len); 5031 5032 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 5033 wdev->conn_owner_nlportid = info->snd_portid; 5034 } 5035 wdev_unlock(wdev); 5036 5037 out: 5038 kfree(params.acl); 5039 5040 return err; 5041 } 5042 5043 static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info) 5044 { 5045 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5046 struct net_device *dev = info->user_ptr[1]; 5047 struct wireless_dev *wdev = dev->ieee80211_ptr; 5048 struct cfg80211_beacon_data params; 5049 int err; 5050 5051 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 5052 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 5053 return -EOPNOTSUPP; 5054 5055 if (!rdev->ops->change_beacon) 5056 return -EOPNOTSUPP; 5057 5058 if (!wdev->beacon_interval) 5059 return -EINVAL; 5060 5061 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms); 5062 if (err) 5063 return err; 5064 5065 wdev_lock(wdev); 5066 err = rdev_change_beacon(rdev, dev, ¶ms); 5067 wdev_unlock(wdev); 5068 5069 return err; 5070 } 5071 5072 static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info) 5073 { 5074 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5075 struct net_device *dev = info->user_ptr[1]; 5076 5077 return cfg80211_stop_ap(rdev, dev, false); 5078 } 5079 5080 static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = { 5081 [NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG }, 5082 [NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG }, 5083 [NL80211_STA_FLAG_WME] = { .type = NLA_FLAG }, 5084 [NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG }, 5085 [NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG }, 5086 [NL80211_STA_FLAG_TDLS_PEER] = { .type = NLA_FLAG }, 5087 }; 5088 5089 static int parse_station_flags(struct genl_info *info, 5090 enum nl80211_iftype iftype, 5091 struct station_parameters *params) 5092 { 5093 struct nlattr *flags[NL80211_STA_FLAG_MAX + 1]; 5094 struct nlattr *nla; 5095 int flag; 5096 5097 /* 5098 * Try parsing the new attribute first so userspace 5099 * can specify both for older kernels. 5100 */ 5101 nla = info->attrs[NL80211_ATTR_STA_FLAGS2]; 5102 if (nla) { 5103 struct nl80211_sta_flag_update *sta_flags; 5104 5105 sta_flags = nla_data(nla); 5106 params->sta_flags_mask = sta_flags->mask; 5107 params->sta_flags_set = sta_flags->set; 5108 params->sta_flags_set &= params->sta_flags_mask; 5109 if ((params->sta_flags_mask | 5110 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID)) 5111 return -EINVAL; 5112 return 0; 5113 } 5114 5115 /* if present, parse the old attribute */ 5116 5117 nla = info->attrs[NL80211_ATTR_STA_FLAGS]; 5118 if (!nla) 5119 return 0; 5120 5121 if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack)) 5122 return -EINVAL; 5123 5124 /* 5125 * Only allow certain flags for interface types so that 5126 * other attributes are silently ignored. Remember that 5127 * this is backward compatibility code with old userspace 5128 * and shouldn't be hit in other cases anyway. 5129 */ 5130 switch (iftype) { 5131 case NL80211_IFTYPE_AP: 5132 case NL80211_IFTYPE_AP_VLAN: 5133 case NL80211_IFTYPE_P2P_GO: 5134 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 5135 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 5136 BIT(NL80211_STA_FLAG_WME) | 5137 BIT(NL80211_STA_FLAG_MFP); 5138 break; 5139 case NL80211_IFTYPE_P2P_CLIENT: 5140 case NL80211_IFTYPE_STATION: 5141 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 5142 BIT(NL80211_STA_FLAG_TDLS_PEER); 5143 break; 5144 case NL80211_IFTYPE_MESH_POINT: 5145 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | 5146 BIT(NL80211_STA_FLAG_MFP) | 5147 BIT(NL80211_STA_FLAG_AUTHORIZED); 5148 break; 5149 default: 5150 return -EINVAL; 5151 } 5152 5153 for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++) { 5154 if (flags[flag]) { 5155 params->sta_flags_set |= (1<<flag); 5156 5157 /* no longer support new API additions in old API */ 5158 if (flag > NL80211_STA_FLAG_MAX_OLD_API) 5159 return -EINVAL; 5160 } 5161 } 5162 5163 return 0; 5164 } 5165 5166 bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info, int attr) 5167 { 5168 struct nlattr *rate; 5169 u32 bitrate; 5170 u16 bitrate_compat; 5171 enum nl80211_rate_info rate_flg; 5172 5173 rate = nla_nest_start_noflag(msg, attr); 5174 if (!rate) 5175 return false; 5176 5177 /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */ 5178 bitrate = cfg80211_calculate_bitrate(info); 5179 /* report 16-bit bitrate only if we can */ 5180 bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0; 5181 if (bitrate > 0 && 5182 nla_put_u32(msg, NL80211_RATE_INFO_BITRATE32, bitrate)) 5183 return false; 5184 if (bitrate_compat > 0 && 5185 nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat)) 5186 return false; 5187 5188 switch (info->bw) { 5189 case RATE_INFO_BW_5: 5190 rate_flg = NL80211_RATE_INFO_5_MHZ_WIDTH; 5191 break; 5192 case RATE_INFO_BW_10: 5193 rate_flg = NL80211_RATE_INFO_10_MHZ_WIDTH; 5194 break; 5195 default: 5196 WARN_ON(1); 5197 /* fall through */ 5198 case RATE_INFO_BW_20: 5199 rate_flg = 0; 5200 break; 5201 case RATE_INFO_BW_40: 5202 rate_flg = NL80211_RATE_INFO_40_MHZ_WIDTH; 5203 break; 5204 case RATE_INFO_BW_80: 5205 rate_flg = NL80211_RATE_INFO_80_MHZ_WIDTH; 5206 break; 5207 case RATE_INFO_BW_160: 5208 rate_flg = NL80211_RATE_INFO_160_MHZ_WIDTH; 5209 break; 5210 case RATE_INFO_BW_HE_RU: 5211 rate_flg = 0; 5212 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS)); 5213 } 5214 5215 if (rate_flg && nla_put_flag(msg, rate_flg)) 5216 return false; 5217 5218 if (info->flags & RATE_INFO_FLAGS_MCS) { 5219 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) 5220 return false; 5221 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 5222 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 5223 return false; 5224 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) { 5225 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs)) 5226 return false; 5227 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) 5228 return false; 5229 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 5230 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 5231 return false; 5232 } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) { 5233 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs)) 5234 return false; 5235 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss)) 5236 return false; 5237 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi)) 5238 return false; 5239 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm)) 5240 return false; 5241 if (info->bw == RATE_INFO_BW_HE_RU && 5242 nla_put_u8(msg, NL80211_RATE_INFO_HE_RU_ALLOC, 5243 info->he_ru_alloc)) 5244 return false; 5245 } 5246 5247 nla_nest_end(msg, rate); 5248 return true; 5249 } 5250 5251 static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal, 5252 int id) 5253 { 5254 void *attr; 5255 int i = 0; 5256 5257 if (!mask) 5258 return true; 5259 5260 attr = nla_nest_start_noflag(msg, id); 5261 if (!attr) 5262 return false; 5263 5264 for (i = 0; i < IEEE80211_MAX_CHAINS; i++) { 5265 if (!(mask & BIT(i))) 5266 continue; 5267 5268 if (nla_put_u8(msg, i, signal[i])) 5269 return false; 5270 } 5271 5272 nla_nest_end(msg, attr); 5273 5274 return true; 5275 } 5276 5277 static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid, 5278 u32 seq, int flags, 5279 struct cfg80211_registered_device *rdev, 5280 struct net_device *dev, 5281 const u8 *mac_addr, struct station_info *sinfo) 5282 { 5283 void *hdr; 5284 struct nlattr *sinfoattr, *bss_param; 5285 5286 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 5287 if (!hdr) { 5288 cfg80211_sinfo_release_content(sinfo); 5289 return -1; 5290 } 5291 5292 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 5293 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 5294 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation)) 5295 goto nla_put_failure; 5296 5297 sinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_STA_INFO); 5298 if (!sinfoattr) 5299 goto nla_put_failure; 5300 5301 #define PUT_SINFO(attr, memb, type) do { \ 5302 BUILD_BUG_ON(sizeof(type) == sizeof(u64)); \ 5303 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 5304 nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr, \ 5305 sinfo->memb)) \ 5306 goto nla_put_failure; \ 5307 } while (0) 5308 #define PUT_SINFO_U64(attr, memb) do { \ 5309 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_ ## attr) && \ 5310 nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr, \ 5311 sinfo->memb, NL80211_STA_INFO_PAD)) \ 5312 goto nla_put_failure; \ 5313 } while (0) 5314 5315 PUT_SINFO(CONNECTED_TIME, connected_time, u32); 5316 PUT_SINFO(INACTIVE_TIME, inactive_time, u32); 5317 PUT_SINFO_U64(ASSOC_AT_BOOTTIME, assoc_at); 5318 5319 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES) | 5320 BIT_ULL(NL80211_STA_INFO_RX_BYTES64)) && 5321 nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES, 5322 (u32)sinfo->rx_bytes)) 5323 goto nla_put_failure; 5324 5325 if (sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES) | 5326 BIT_ULL(NL80211_STA_INFO_TX_BYTES64)) && 5327 nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES, 5328 (u32)sinfo->tx_bytes)) 5329 goto nla_put_failure; 5330 5331 PUT_SINFO_U64(RX_BYTES64, rx_bytes); 5332 PUT_SINFO_U64(TX_BYTES64, tx_bytes); 5333 PUT_SINFO(LLID, llid, u16); 5334 PUT_SINFO(PLID, plid, u16); 5335 PUT_SINFO(PLINK_STATE, plink_state, u8); 5336 PUT_SINFO_U64(RX_DURATION, rx_duration); 5337 PUT_SINFO_U64(TX_DURATION, tx_duration); 5338 5339 if (wiphy_ext_feature_isset(&rdev->wiphy, 5340 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 5341 PUT_SINFO(AIRTIME_WEIGHT, airtime_weight, u16); 5342 5343 switch (rdev->wiphy.signal_type) { 5344 case CFG80211_SIGNAL_TYPE_MBM: 5345 PUT_SINFO(SIGNAL, signal, u8); 5346 PUT_SINFO(SIGNAL_AVG, signal_avg, u8); 5347 break; 5348 default: 5349 break; 5350 } 5351 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) { 5352 if (!nl80211_put_signal(msg, sinfo->chains, 5353 sinfo->chain_signal, 5354 NL80211_STA_INFO_CHAIN_SIGNAL)) 5355 goto nla_put_failure; 5356 } 5357 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { 5358 if (!nl80211_put_signal(msg, sinfo->chains, 5359 sinfo->chain_signal_avg, 5360 NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) 5361 goto nla_put_failure; 5362 } 5363 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)) { 5364 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, 5365 NL80211_STA_INFO_TX_BITRATE)) 5366 goto nla_put_failure; 5367 } 5368 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) { 5369 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, 5370 NL80211_STA_INFO_RX_BITRATE)) 5371 goto nla_put_failure; 5372 } 5373 5374 PUT_SINFO(RX_PACKETS, rx_packets, u32); 5375 PUT_SINFO(TX_PACKETS, tx_packets, u32); 5376 PUT_SINFO(TX_RETRIES, tx_retries, u32); 5377 PUT_SINFO(TX_FAILED, tx_failed, u32); 5378 PUT_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32); 5379 PUT_SINFO(AIRTIME_LINK_METRIC, airtime_link_metric, u32); 5380 PUT_SINFO(BEACON_LOSS, beacon_loss_count, u32); 5381 PUT_SINFO(LOCAL_PM, local_pm, u32); 5382 PUT_SINFO(PEER_PM, peer_pm, u32); 5383 PUT_SINFO(NONPEER_PM, nonpeer_pm, u32); 5384 PUT_SINFO(CONNECTED_TO_GATE, connected_to_gate, u8); 5385 5386 if (sinfo->filled & BIT_ULL(NL80211_STA_INFO_BSS_PARAM)) { 5387 bss_param = nla_nest_start_noflag(msg, 5388 NL80211_STA_INFO_BSS_PARAM); 5389 if (!bss_param) 5390 goto nla_put_failure; 5391 5392 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) && 5393 nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) || 5394 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) && 5395 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) || 5396 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && 5397 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) || 5398 nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD, 5399 sinfo->bss_param.dtim_period) || 5400 nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL, 5401 sinfo->bss_param.beacon_interval)) 5402 goto nla_put_failure; 5403 5404 nla_nest_end(msg, bss_param); 5405 } 5406 if ((sinfo->filled & BIT_ULL(NL80211_STA_INFO_STA_FLAGS)) && 5407 nla_put(msg, NL80211_STA_INFO_STA_FLAGS, 5408 sizeof(struct nl80211_sta_flag_update), 5409 &sinfo->sta_flags)) 5410 goto nla_put_failure; 5411 5412 PUT_SINFO_U64(T_OFFSET, t_offset); 5413 PUT_SINFO_U64(RX_DROP_MISC, rx_dropped_misc); 5414 PUT_SINFO_U64(BEACON_RX, rx_beacon); 5415 PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8); 5416 PUT_SINFO(RX_MPDUS, rx_mpdu_count, u32); 5417 PUT_SINFO(FCS_ERROR_COUNT, fcs_err_count, u32); 5418 if (wiphy_ext_feature_isset(&rdev->wiphy, 5419 NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT)) { 5420 PUT_SINFO(ACK_SIGNAL, ack_signal, u8); 5421 PUT_SINFO(ACK_SIGNAL_AVG, avg_ack_signal, s8); 5422 } 5423 5424 #undef PUT_SINFO 5425 #undef PUT_SINFO_U64 5426 5427 if (sinfo->pertid) { 5428 struct nlattr *tidsattr; 5429 int tid; 5430 5431 tidsattr = nla_nest_start_noflag(msg, 5432 NL80211_STA_INFO_TID_STATS); 5433 if (!tidsattr) 5434 goto nla_put_failure; 5435 5436 for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) { 5437 struct cfg80211_tid_stats *tidstats; 5438 struct nlattr *tidattr; 5439 5440 tidstats = &sinfo->pertid[tid]; 5441 5442 if (!tidstats->filled) 5443 continue; 5444 5445 tidattr = nla_nest_start_noflag(msg, tid + 1); 5446 if (!tidattr) 5447 goto nla_put_failure; 5448 5449 #define PUT_TIDVAL_U64(attr, memb) do { \ 5450 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ 5451 nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr, \ 5452 tidstats->memb, NL80211_TID_STATS_PAD)) \ 5453 goto nla_put_failure; \ 5454 } while (0) 5455 5456 PUT_TIDVAL_U64(RX_MSDU, rx_msdu); 5457 PUT_TIDVAL_U64(TX_MSDU, tx_msdu); 5458 PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries); 5459 PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed); 5460 5461 #undef PUT_TIDVAL_U64 5462 if ((tidstats->filled & 5463 BIT(NL80211_TID_STATS_TXQ_STATS)) && 5464 !nl80211_put_txq_stats(msg, &tidstats->txq_stats, 5465 NL80211_TID_STATS_TXQ_STATS)) 5466 goto nla_put_failure; 5467 5468 nla_nest_end(msg, tidattr); 5469 } 5470 5471 nla_nest_end(msg, tidsattr); 5472 } 5473 5474 nla_nest_end(msg, sinfoattr); 5475 5476 if (sinfo->assoc_req_ies_len && 5477 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, 5478 sinfo->assoc_req_ies)) 5479 goto nla_put_failure; 5480 5481 cfg80211_sinfo_release_content(sinfo); 5482 genlmsg_end(msg, hdr); 5483 return 0; 5484 5485 nla_put_failure: 5486 cfg80211_sinfo_release_content(sinfo); 5487 genlmsg_cancel(msg, hdr); 5488 return -EMSGSIZE; 5489 } 5490 5491 static int nl80211_dump_station(struct sk_buff *skb, 5492 struct netlink_callback *cb) 5493 { 5494 struct station_info sinfo; 5495 struct cfg80211_registered_device *rdev; 5496 struct wireless_dev *wdev; 5497 u8 mac_addr[ETH_ALEN]; 5498 int sta_idx = cb->args[2]; 5499 int err; 5500 5501 rtnl_lock(); 5502 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev); 5503 if (err) 5504 goto out_err; 5505 5506 if (!wdev->netdev) { 5507 err = -EINVAL; 5508 goto out_err; 5509 } 5510 5511 if (!rdev->ops->dump_station) { 5512 err = -EOPNOTSUPP; 5513 goto out_err; 5514 } 5515 5516 while (1) { 5517 memset(&sinfo, 0, sizeof(sinfo)); 5518 err = rdev_dump_station(rdev, wdev->netdev, sta_idx, 5519 mac_addr, &sinfo); 5520 if (err == -ENOENT) 5521 break; 5522 if (err) 5523 goto out_err; 5524 5525 if (nl80211_send_station(skb, NL80211_CMD_NEW_STATION, 5526 NETLINK_CB(cb->skb).portid, 5527 cb->nlh->nlmsg_seq, NLM_F_MULTI, 5528 rdev, wdev->netdev, mac_addr, 5529 &sinfo) < 0) 5530 goto out; 5531 5532 sta_idx++; 5533 } 5534 5535 out: 5536 cb->args[2] = sta_idx; 5537 err = skb->len; 5538 out_err: 5539 rtnl_unlock(); 5540 5541 return err; 5542 } 5543 5544 static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info) 5545 { 5546 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5547 struct net_device *dev = info->user_ptr[1]; 5548 struct station_info sinfo; 5549 struct sk_buff *msg; 5550 u8 *mac_addr = NULL; 5551 int err; 5552 5553 memset(&sinfo, 0, sizeof(sinfo)); 5554 5555 if (!info->attrs[NL80211_ATTR_MAC]) 5556 return -EINVAL; 5557 5558 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5559 5560 if (!rdev->ops->get_station) 5561 return -EOPNOTSUPP; 5562 5563 err = rdev_get_station(rdev, dev, mac_addr, &sinfo); 5564 if (err) 5565 return err; 5566 5567 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 5568 if (!msg) { 5569 cfg80211_sinfo_release_content(&sinfo); 5570 return -ENOMEM; 5571 } 5572 5573 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 5574 info->snd_portid, info->snd_seq, 0, 5575 rdev, dev, mac_addr, &sinfo) < 0) { 5576 nlmsg_free(msg); 5577 return -ENOBUFS; 5578 } 5579 5580 return genlmsg_reply(msg, info); 5581 } 5582 5583 int cfg80211_check_station_change(struct wiphy *wiphy, 5584 struct station_parameters *params, 5585 enum cfg80211_station_type statype) 5586 { 5587 if (params->listen_interval != -1 && 5588 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 5589 return -EINVAL; 5590 5591 if (params->support_p2p_ps != -1 && 5592 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 5593 return -EINVAL; 5594 5595 if (params->aid && 5596 !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) && 5597 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 5598 return -EINVAL; 5599 5600 /* When you run into this, adjust the code below for the new flag */ 5601 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7); 5602 5603 switch (statype) { 5604 case CFG80211_STA_MESH_PEER_KERNEL: 5605 case CFG80211_STA_MESH_PEER_USER: 5606 /* 5607 * No ignoring the TDLS flag here -- the userspace mesh 5608 * code doesn't have the bug of including TDLS in the 5609 * mask everywhere. 5610 */ 5611 if (params->sta_flags_mask & 5612 ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) | 5613 BIT(NL80211_STA_FLAG_MFP) | 5614 BIT(NL80211_STA_FLAG_AUTHORIZED))) 5615 return -EINVAL; 5616 break; 5617 case CFG80211_STA_TDLS_PEER_SETUP: 5618 case CFG80211_STA_TDLS_PEER_ACTIVE: 5619 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 5620 return -EINVAL; 5621 /* ignore since it can't change */ 5622 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 5623 break; 5624 default: 5625 /* disallow mesh-specific things */ 5626 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) 5627 return -EINVAL; 5628 if (params->local_pm) 5629 return -EINVAL; 5630 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) 5631 return -EINVAL; 5632 } 5633 5634 if (statype != CFG80211_STA_TDLS_PEER_SETUP && 5635 statype != CFG80211_STA_TDLS_PEER_ACTIVE) { 5636 /* TDLS can't be set, ... */ 5637 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) 5638 return -EINVAL; 5639 /* 5640 * ... but don't bother the driver with it. This works around 5641 * a hostapd/wpa_supplicant issue -- it always includes the 5642 * TLDS_PEER flag in the mask even for AP mode. 5643 */ 5644 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 5645 } 5646 5647 if (statype != CFG80211_STA_TDLS_PEER_SETUP && 5648 statype != CFG80211_STA_AP_CLIENT_UNASSOC) { 5649 /* reject other things that can't change */ 5650 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) 5651 return -EINVAL; 5652 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) 5653 return -EINVAL; 5654 if (params->supported_rates) 5655 return -EINVAL; 5656 if (params->ext_capab || params->ht_capa || params->vht_capa || 5657 params->he_capa) 5658 return -EINVAL; 5659 } 5660 5661 if (statype != CFG80211_STA_AP_CLIENT && 5662 statype != CFG80211_STA_AP_CLIENT_UNASSOC) { 5663 if (params->vlan) 5664 return -EINVAL; 5665 } 5666 5667 switch (statype) { 5668 case CFG80211_STA_AP_MLME_CLIENT: 5669 /* Use this only for authorizing/unauthorizing a station */ 5670 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) 5671 return -EOPNOTSUPP; 5672 break; 5673 case CFG80211_STA_AP_CLIENT: 5674 case CFG80211_STA_AP_CLIENT_UNASSOC: 5675 /* accept only the listed bits */ 5676 if (params->sta_flags_mask & 5677 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 5678 BIT(NL80211_STA_FLAG_AUTHENTICATED) | 5679 BIT(NL80211_STA_FLAG_ASSOCIATED) | 5680 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 5681 BIT(NL80211_STA_FLAG_WME) | 5682 BIT(NL80211_STA_FLAG_MFP))) 5683 return -EINVAL; 5684 5685 /* but authenticated/associated only if driver handles it */ 5686 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 5687 params->sta_flags_mask & 5688 (BIT(NL80211_STA_FLAG_AUTHENTICATED) | 5689 BIT(NL80211_STA_FLAG_ASSOCIATED))) 5690 return -EINVAL; 5691 break; 5692 case CFG80211_STA_IBSS: 5693 case CFG80211_STA_AP_STA: 5694 /* reject any changes other than AUTHORIZED */ 5695 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) 5696 return -EINVAL; 5697 break; 5698 case CFG80211_STA_TDLS_PEER_SETUP: 5699 /* reject any changes other than AUTHORIZED or WME */ 5700 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 5701 BIT(NL80211_STA_FLAG_WME))) 5702 return -EINVAL; 5703 /* force (at least) rates when authorizing */ 5704 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) && 5705 !params->supported_rates) 5706 return -EINVAL; 5707 break; 5708 case CFG80211_STA_TDLS_PEER_ACTIVE: 5709 /* reject any changes */ 5710 return -EINVAL; 5711 case CFG80211_STA_MESH_PEER_KERNEL: 5712 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) 5713 return -EINVAL; 5714 break; 5715 case CFG80211_STA_MESH_PEER_USER: 5716 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION && 5717 params->plink_action != NL80211_PLINK_ACTION_BLOCK) 5718 return -EINVAL; 5719 break; 5720 } 5721 5722 /* 5723 * Older kernel versions ignored this attribute entirely, so don't 5724 * reject attempts to update it but mark it as unused instead so the 5725 * driver won't look at the data. 5726 */ 5727 if (statype != CFG80211_STA_AP_CLIENT_UNASSOC && 5728 statype != CFG80211_STA_TDLS_PEER_SETUP) 5729 params->opmode_notif_used = false; 5730 5731 return 0; 5732 } 5733 EXPORT_SYMBOL(cfg80211_check_station_change); 5734 5735 /* 5736 * Get vlan interface making sure it is running and on the right wiphy. 5737 */ 5738 static struct net_device *get_vlan(struct genl_info *info, 5739 struct cfg80211_registered_device *rdev) 5740 { 5741 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; 5742 struct net_device *v; 5743 int ret; 5744 5745 if (!vlanattr) 5746 return NULL; 5747 5748 v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr)); 5749 if (!v) 5750 return ERR_PTR(-ENODEV); 5751 5752 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { 5753 ret = -EINVAL; 5754 goto error; 5755 } 5756 5757 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && 5758 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 5759 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 5760 ret = -EINVAL; 5761 goto error; 5762 } 5763 5764 if (!netif_running(v)) { 5765 ret = -ENETDOWN; 5766 goto error; 5767 } 5768 5769 return v; 5770 error: 5771 dev_put(v); 5772 return ERR_PTR(ret); 5773 } 5774 5775 static const struct nla_policy 5776 nl80211_sta_wme_policy[NL80211_STA_WME_MAX + 1] = { 5777 [NL80211_STA_WME_UAPSD_QUEUES] = { .type = NLA_U8 }, 5778 [NL80211_STA_WME_MAX_SP] = { .type = NLA_U8 }, 5779 }; 5780 5781 static int nl80211_parse_sta_wme(struct genl_info *info, 5782 struct station_parameters *params) 5783 { 5784 struct nlattr *tb[NL80211_STA_WME_MAX + 1]; 5785 struct nlattr *nla; 5786 int err; 5787 5788 /* parse WME attributes if present */ 5789 if (!info->attrs[NL80211_ATTR_STA_WME]) 5790 return 0; 5791 5792 nla = info->attrs[NL80211_ATTR_STA_WME]; 5793 err = nla_parse_nested_deprecated(tb, NL80211_STA_WME_MAX, nla, 5794 nl80211_sta_wme_policy, 5795 info->extack); 5796 if (err) 5797 return err; 5798 5799 if (tb[NL80211_STA_WME_UAPSD_QUEUES]) 5800 params->uapsd_queues = nla_get_u8( 5801 tb[NL80211_STA_WME_UAPSD_QUEUES]); 5802 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) 5803 return -EINVAL; 5804 5805 if (tb[NL80211_STA_WME_MAX_SP]) 5806 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); 5807 5808 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) 5809 return -EINVAL; 5810 5811 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; 5812 5813 return 0; 5814 } 5815 5816 static int nl80211_parse_sta_channel_info(struct genl_info *info, 5817 struct station_parameters *params) 5818 { 5819 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { 5820 params->supported_channels = 5821 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 5822 params->supported_channels_len = 5823 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 5824 /* 5825 * Need to include at least one (first channel, number of 5826 * channels) tuple for each subband, and must have proper 5827 * tuples for the rest of the data as well. 5828 */ 5829 if (params->supported_channels_len < 2) 5830 return -EINVAL; 5831 if (params->supported_channels_len % 2) 5832 return -EINVAL; 5833 } 5834 5835 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { 5836 params->supported_oper_classes = 5837 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 5838 params->supported_oper_classes_len = 5839 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 5840 /* 5841 * The value of the Length field of the Supported Operating 5842 * Classes element is between 2 and 253. 5843 */ 5844 if (params->supported_oper_classes_len < 2 || 5845 params->supported_oper_classes_len > 253) 5846 return -EINVAL; 5847 } 5848 return 0; 5849 } 5850 5851 static int nl80211_set_station_tdls(struct genl_info *info, 5852 struct station_parameters *params) 5853 { 5854 int err; 5855 /* Dummy STA entry gets updated once the peer capabilities are known */ 5856 if (info->attrs[NL80211_ATTR_PEER_AID]) 5857 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 5858 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 5859 params->ht_capa = 5860 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 5861 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 5862 params->vht_capa = 5863 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 5864 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 5865 params->he_capa = 5866 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 5867 params->he_capa_len = 5868 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 5869 5870 if (params->he_capa_len < NL80211_HE_MIN_CAPABILITY_LEN) 5871 return -EINVAL; 5872 } 5873 5874 err = nl80211_parse_sta_channel_info(info, params); 5875 if (err) 5876 return err; 5877 5878 return nl80211_parse_sta_wme(info, params); 5879 } 5880 5881 static int nl80211_parse_sta_txpower_setting(struct genl_info *info, 5882 struct station_parameters *params) 5883 { 5884 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5885 int idx; 5886 5887 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) { 5888 if (!rdev->ops->set_tx_power || 5889 !wiphy_ext_feature_isset(&rdev->wiphy, 5890 NL80211_EXT_FEATURE_STA_TX_PWR)) 5891 return -EOPNOTSUPP; 5892 5893 idx = NL80211_ATTR_STA_TX_POWER_SETTING; 5894 params->txpwr.type = nla_get_u8(info->attrs[idx]); 5895 5896 if (params->txpwr.type == NL80211_TX_POWER_LIMITED) { 5897 idx = NL80211_ATTR_STA_TX_POWER; 5898 5899 if (info->attrs[idx]) 5900 params->txpwr.power = 5901 nla_get_s16(info->attrs[idx]); 5902 else 5903 return -EINVAL; 5904 } 5905 params->sta_modify_mask |= STATION_PARAM_APPLY_STA_TXPOWER; 5906 } 5907 5908 return 0; 5909 } 5910 5911 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) 5912 { 5913 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5914 struct net_device *dev = info->user_ptr[1]; 5915 struct station_parameters params; 5916 u8 *mac_addr; 5917 int err; 5918 5919 memset(¶ms, 0, sizeof(params)); 5920 5921 if (!rdev->ops->change_station) 5922 return -EOPNOTSUPP; 5923 5924 /* 5925 * AID and listen_interval properties can be set only for unassociated 5926 * station. Include these parameters here and will check them in 5927 * cfg80211_check_station_change(). 5928 */ 5929 if (info->attrs[NL80211_ATTR_STA_AID]) 5930 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 5931 5932 if (info->attrs[NL80211_ATTR_VLAN_ID]) 5933 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 5934 5935 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 5936 params.listen_interval = 5937 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 5938 else 5939 params.listen_interval = -1; 5940 5941 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) 5942 params.support_p2p_ps = 5943 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); 5944 else 5945 params.support_p2p_ps = -1; 5946 5947 if (!info->attrs[NL80211_ATTR_MAC]) 5948 return -EINVAL; 5949 5950 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5951 5952 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 5953 params.supported_rates = 5954 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 5955 params.supported_rates_len = 5956 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 5957 } 5958 5959 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 5960 params.capability = 5961 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 5962 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 5963 } 5964 5965 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 5966 params.ext_capab = 5967 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 5968 params.ext_capab_len = 5969 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 5970 } 5971 5972 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) 5973 return -EINVAL; 5974 5975 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) 5976 params.plink_action = 5977 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 5978 5979 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { 5980 params.plink_state = 5981 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); 5982 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) 5983 params.peer_aid = nla_get_u16( 5984 info->attrs[NL80211_ATTR_MESH_PEER_AID]); 5985 params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE; 5986 } 5987 5988 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) 5989 params.local_pm = nla_get_u32( 5990 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); 5991 5992 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 5993 params.opmode_notif_used = true; 5994 params.opmode_notif = 5995 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 5996 } 5997 5998 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) 5999 params.airtime_weight = 6000 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); 6001 6002 if (params.airtime_weight && 6003 !wiphy_ext_feature_isset(&rdev->wiphy, 6004 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 6005 return -EOPNOTSUPP; 6006 6007 err = nl80211_parse_sta_txpower_setting(info, ¶ms); 6008 if (err) 6009 return err; 6010 6011 /* Include parameters for TDLS peer (will check later) */ 6012 err = nl80211_set_station_tdls(info, ¶ms); 6013 if (err) 6014 return err; 6015 6016 params.vlan = get_vlan(info, rdev); 6017 if (IS_ERR(params.vlan)) 6018 return PTR_ERR(params.vlan); 6019 6020 switch (dev->ieee80211_ptr->iftype) { 6021 case NL80211_IFTYPE_AP: 6022 case NL80211_IFTYPE_AP_VLAN: 6023 case NL80211_IFTYPE_P2P_GO: 6024 case NL80211_IFTYPE_P2P_CLIENT: 6025 case NL80211_IFTYPE_STATION: 6026 case NL80211_IFTYPE_ADHOC: 6027 case NL80211_IFTYPE_MESH_POINT: 6028 break; 6029 default: 6030 err = -EOPNOTSUPP; 6031 goto out_put_vlan; 6032 } 6033 6034 /* driver will call cfg80211_check_station_change() */ 6035 err = rdev_change_station(rdev, dev, mac_addr, ¶ms); 6036 6037 out_put_vlan: 6038 if (params.vlan) 6039 dev_put(params.vlan); 6040 6041 return err; 6042 } 6043 6044 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info) 6045 { 6046 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6047 int err; 6048 struct net_device *dev = info->user_ptr[1]; 6049 struct station_parameters params; 6050 u8 *mac_addr = NULL; 6051 u32 auth_assoc = BIT(NL80211_STA_FLAG_AUTHENTICATED) | 6052 BIT(NL80211_STA_FLAG_ASSOCIATED); 6053 6054 memset(¶ms, 0, sizeof(params)); 6055 6056 if (!rdev->ops->add_station) 6057 return -EOPNOTSUPP; 6058 6059 if (!info->attrs[NL80211_ATTR_MAC]) 6060 return -EINVAL; 6061 6062 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 6063 return -EINVAL; 6064 6065 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 6066 return -EINVAL; 6067 6068 if (!info->attrs[NL80211_ATTR_STA_AID] && 6069 !info->attrs[NL80211_ATTR_PEER_AID]) 6070 return -EINVAL; 6071 6072 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 6073 params.supported_rates = 6074 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 6075 params.supported_rates_len = 6076 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 6077 params.listen_interval = 6078 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 6079 6080 if (info->attrs[NL80211_ATTR_VLAN_ID]) 6081 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]); 6082 6083 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { 6084 params.support_p2p_ps = 6085 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); 6086 } else { 6087 /* 6088 * if not specified, assume it's supported for P2P GO interface, 6089 * and is NOT supported for AP interface 6090 */ 6091 params.support_p2p_ps = 6092 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO; 6093 } 6094 6095 if (info->attrs[NL80211_ATTR_PEER_AID]) 6096 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 6097 else 6098 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 6099 6100 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 6101 params.capability = 6102 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 6103 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 6104 } 6105 6106 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 6107 params.ext_capab = 6108 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 6109 params.ext_capab_len = 6110 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 6111 } 6112 6113 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 6114 params.ht_capa = 6115 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 6116 6117 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 6118 params.vht_capa = 6119 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 6120 6121 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) { 6122 params.he_capa = 6123 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 6124 params.he_capa_len = 6125 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); 6126 6127 /* max len is validated in nla policy */ 6128 if (params.he_capa_len < NL80211_HE_MIN_CAPABILITY_LEN) 6129 return -EINVAL; 6130 } 6131 6132 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 6133 params.opmode_notif_used = true; 6134 params.opmode_notif = 6135 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 6136 } 6137 6138 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) 6139 params.plink_action = 6140 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 6141 6142 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]) 6143 params.airtime_weight = 6144 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]); 6145 6146 if (params.airtime_weight && 6147 !wiphy_ext_feature_isset(&rdev->wiphy, 6148 NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) 6149 return -EOPNOTSUPP; 6150 6151 err = nl80211_parse_sta_txpower_setting(info, ¶ms); 6152 if (err) 6153 return err; 6154 6155 err = nl80211_parse_sta_channel_info(info, ¶ms); 6156 if (err) 6157 return err; 6158 6159 err = nl80211_parse_sta_wme(info, ¶ms); 6160 if (err) 6161 return err; 6162 6163 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) 6164 return -EINVAL; 6165 6166 /* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT 6167 * as userspace might just pass through the capabilities from the IEs 6168 * directly, rather than enforcing this restriction and returning an 6169 * error in this case. 6170 */ 6171 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) { 6172 params.ht_capa = NULL; 6173 params.vht_capa = NULL; 6174 6175 /* HE requires WME */ 6176 if (params.he_capa_len) 6177 return -EINVAL; 6178 } 6179 6180 /* When you run into this, adjust the code below for the new flag */ 6181 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7); 6182 6183 switch (dev->ieee80211_ptr->iftype) { 6184 case NL80211_IFTYPE_AP: 6185 case NL80211_IFTYPE_AP_VLAN: 6186 case NL80211_IFTYPE_P2P_GO: 6187 /* ignore WME attributes if iface/sta is not capable */ 6188 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || 6189 !(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) 6190 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 6191 6192 /* TDLS peers cannot be added */ 6193 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 6194 info->attrs[NL80211_ATTR_PEER_AID]) 6195 return -EINVAL; 6196 /* but don't bother the driver with it */ 6197 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 6198 6199 /* allow authenticated/associated only if driver handles it */ 6200 if (!(rdev->wiphy.features & 6201 NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 6202 params.sta_flags_mask & auth_assoc) 6203 return -EINVAL; 6204 6205 /* Older userspace, or userspace wanting to be compatible with 6206 * !NL80211_FEATURE_FULL_AP_CLIENT_STATE, will not set the auth 6207 * and assoc flags in the mask, but assumes the station will be 6208 * added as associated anyway since this was the required driver 6209 * behaviour before NL80211_FEATURE_FULL_AP_CLIENT_STATE was 6210 * introduced. 6211 * In order to not bother drivers with this quirk in the API 6212 * set the flags in both the mask and set for new stations in 6213 * this case. 6214 */ 6215 if (!(params.sta_flags_mask & auth_assoc)) { 6216 params.sta_flags_mask |= auth_assoc; 6217 params.sta_flags_set |= auth_assoc; 6218 } 6219 6220 /* must be last in here for error handling */ 6221 params.vlan = get_vlan(info, rdev); 6222 if (IS_ERR(params.vlan)) 6223 return PTR_ERR(params.vlan); 6224 break; 6225 case NL80211_IFTYPE_MESH_POINT: 6226 /* ignore uAPSD data */ 6227 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 6228 6229 /* associated is disallowed */ 6230 if (params.sta_flags_mask & BIT(NL80211_STA_FLAG_ASSOCIATED)) 6231 return -EINVAL; 6232 /* TDLS peers cannot be added */ 6233 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 6234 info->attrs[NL80211_ATTR_PEER_AID]) 6235 return -EINVAL; 6236 break; 6237 case NL80211_IFTYPE_STATION: 6238 case NL80211_IFTYPE_P2P_CLIENT: 6239 /* ignore uAPSD data */ 6240 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 6241 6242 /* these are disallowed */ 6243 if (params.sta_flags_mask & 6244 (BIT(NL80211_STA_FLAG_ASSOCIATED) | 6245 BIT(NL80211_STA_FLAG_AUTHENTICATED))) 6246 return -EINVAL; 6247 /* Only TDLS peers can be added */ 6248 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 6249 return -EINVAL; 6250 /* Can only add if TDLS ... */ 6251 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) 6252 return -EOPNOTSUPP; 6253 /* ... with external setup is supported */ 6254 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) 6255 return -EOPNOTSUPP; 6256 /* 6257 * Older wpa_supplicant versions always mark the TDLS peer 6258 * as authorized, but it shouldn't yet be. 6259 */ 6260 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_AUTHORIZED); 6261 break; 6262 default: 6263 return -EOPNOTSUPP; 6264 } 6265 6266 /* be aware of params.vlan when changing code here */ 6267 6268 err = rdev_add_station(rdev, dev, mac_addr, ¶ms); 6269 6270 if (params.vlan) 6271 dev_put(params.vlan); 6272 return err; 6273 } 6274 6275 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info) 6276 { 6277 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6278 struct net_device *dev = info->user_ptr[1]; 6279 struct station_del_parameters params; 6280 6281 memset(¶ms, 0, sizeof(params)); 6282 6283 if (info->attrs[NL80211_ATTR_MAC]) 6284 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]); 6285 6286 switch (dev->ieee80211_ptr->iftype) { 6287 case NL80211_IFTYPE_AP: 6288 case NL80211_IFTYPE_AP_VLAN: 6289 case NL80211_IFTYPE_MESH_POINT: 6290 case NL80211_IFTYPE_P2P_GO: 6291 /* always accept these */ 6292 break; 6293 case NL80211_IFTYPE_ADHOC: 6294 /* conditionally accept */ 6295 if (wiphy_ext_feature_isset(&rdev->wiphy, 6296 NL80211_EXT_FEATURE_DEL_IBSS_STA)) 6297 break; 6298 return -EINVAL; 6299 default: 6300 return -EINVAL; 6301 } 6302 6303 if (!rdev->ops->del_station) 6304 return -EOPNOTSUPP; 6305 6306 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) { 6307 params.subtype = 6308 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]); 6309 if (params.subtype != IEEE80211_STYPE_DISASSOC >> 4 && 6310 params.subtype != IEEE80211_STYPE_DEAUTH >> 4) 6311 return -EINVAL; 6312 } else { 6313 /* Default to Deauthentication frame */ 6314 params.subtype = IEEE80211_STYPE_DEAUTH >> 4; 6315 } 6316 6317 if (info->attrs[NL80211_ATTR_REASON_CODE]) { 6318 params.reason_code = 6319 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 6320 if (params.reason_code == 0) 6321 return -EINVAL; /* 0 is reserved */ 6322 } else { 6323 /* Default to reason code 2 */ 6324 params.reason_code = WLAN_REASON_PREV_AUTH_NOT_VALID; 6325 } 6326 6327 return rdev_del_station(rdev, dev, ¶ms); 6328 } 6329 6330 static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq, 6331 int flags, struct net_device *dev, 6332 u8 *dst, u8 *next_hop, 6333 struct mpath_info *pinfo) 6334 { 6335 void *hdr; 6336 struct nlattr *pinfoattr; 6337 6338 hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_MPATH); 6339 if (!hdr) 6340 return -1; 6341 6342 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 6343 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dst) || 6344 nla_put(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop) || 6345 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) 6346 goto nla_put_failure; 6347 6348 pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MPATH_INFO); 6349 if (!pinfoattr) 6350 goto nla_put_failure; 6351 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && 6352 nla_put_u32(msg, NL80211_MPATH_INFO_FRAME_QLEN, 6353 pinfo->frame_qlen)) 6354 goto nla_put_failure; 6355 if (((pinfo->filled & MPATH_INFO_SN) && 6356 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || 6357 ((pinfo->filled & MPATH_INFO_METRIC) && 6358 nla_put_u32(msg, NL80211_MPATH_INFO_METRIC, 6359 pinfo->metric)) || 6360 ((pinfo->filled & MPATH_INFO_EXPTIME) && 6361 nla_put_u32(msg, NL80211_MPATH_INFO_EXPTIME, 6362 pinfo->exptime)) || 6363 ((pinfo->filled & MPATH_INFO_FLAGS) && 6364 nla_put_u8(msg, NL80211_MPATH_INFO_FLAGS, 6365 pinfo->flags)) || 6366 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && 6367 nla_put_u32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT, 6368 pinfo->discovery_timeout)) || 6369 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && 6370 nla_put_u8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES, 6371 pinfo->discovery_retries)) || 6372 ((pinfo->filled & MPATH_INFO_HOP_COUNT) && 6373 nla_put_u8(msg, NL80211_MPATH_INFO_HOP_COUNT, 6374 pinfo->hop_count)) || 6375 ((pinfo->filled & MPATH_INFO_PATH_CHANGE) && 6376 nla_put_u32(msg, NL80211_MPATH_INFO_PATH_CHANGE, 6377 pinfo->path_change_count))) 6378 goto nla_put_failure; 6379 6380 nla_nest_end(msg, pinfoattr); 6381 6382 genlmsg_end(msg, hdr); 6383 return 0; 6384 6385 nla_put_failure: 6386 genlmsg_cancel(msg, hdr); 6387 return -EMSGSIZE; 6388 } 6389 6390 static int nl80211_dump_mpath(struct sk_buff *skb, 6391 struct netlink_callback *cb) 6392 { 6393 struct mpath_info pinfo; 6394 struct cfg80211_registered_device *rdev; 6395 struct wireless_dev *wdev; 6396 u8 dst[ETH_ALEN]; 6397 u8 next_hop[ETH_ALEN]; 6398 int path_idx = cb->args[2]; 6399 int err; 6400 6401 rtnl_lock(); 6402 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev); 6403 if (err) 6404 goto out_err; 6405 6406 if (!rdev->ops->dump_mpath) { 6407 err = -EOPNOTSUPP; 6408 goto out_err; 6409 } 6410 6411 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 6412 err = -EOPNOTSUPP; 6413 goto out_err; 6414 } 6415 6416 while (1) { 6417 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst, 6418 next_hop, &pinfo); 6419 if (err == -ENOENT) 6420 break; 6421 if (err) 6422 goto out_err; 6423 6424 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 6425 cb->nlh->nlmsg_seq, NLM_F_MULTI, 6426 wdev->netdev, dst, next_hop, 6427 &pinfo) < 0) 6428 goto out; 6429 6430 path_idx++; 6431 } 6432 6433 out: 6434 cb->args[2] = path_idx; 6435 err = skb->len; 6436 out_err: 6437 rtnl_unlock(); 6438 return err; 6439 } 6440 6441 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info) 6442 { 6443 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6444 int err; 6445 struct net_device *dev = info->user_ptr[1]; 6446 struct mpath_info pinfo; 6447 struct sk_buff *msg; 6448 u8 *dst = NULL; 6449 u8 next_hop[ETH_ALEN]; 6450 6451 memset(&pinfo, 0, sizeof(pinfo)); 6452 6453 if (!info->attrs[NL80211_ATTR_MAC]) 6454 return -EINVAL; 6455 6456 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 6457 6458 if (!rdev->ops->get_mpath) 6459 return -EOPNOTSUPP; 6460 6461 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 6462 return -EOPNOTSUPP; 6463 6464 err = rdev_get_mpath(rdev, dev, dst, next_hop, &pinfo); 6465 if (err) 6466 return err; 6467 6468 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 6469 if (!msg) 6470 return -ENOMEM; 6471 6472 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 6473 dev, dst, next_hop, &pinfo) < 0) { 6474 nlmsg_free(msg); 6475 return -ENOBUFS; 6476 } 6477 6478 return genlmsg_reply(msg, info); 6479 } 6480 6481 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info) 6482 { 6483 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6484 struct net_device *dev = info->user_ptr[1]; 6485 u8 *dst = NULL; 6486 u8 *next_hop = NULL; 6487 6488 if (!info->attrs[NL80211_ATTR_MAC]) 6489 return -EINVAL; 6490 6491 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 6492 return -EINVAL; 6493 6494 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 6495 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 6496 6497 if (!rdev->ops->change_mpath) 6498 return -EOPNOTSUPP; 6499 6500 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 6501 return -EOPNOTSUPP; 6502 6503 return rdev_change_mpath(rdev, dev, dst, next_hop); 6504 } 6505 6506 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info) 6507 { 6508 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6509 struct net_device *dev = info->user_ptr[1]; 6510 u8 *dst = NULL; 6511 u8 *next_hop = NULL; 6512 6513 if (!info->attrs[NL80211_ATTR_MAC]) 6514 return -EINVAL; 6515 6516 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 6517 return -EINVAL; 6518 6519 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 6520 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 6521 6522 if (!rdev->ops->add_mpath) 6523 return -EOPNOTSUPP; 6524 6525 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 6526 return -EOPNOTSUPP; 6527 6528 return rdev_add_mpath(rdev, dev, dst, next_hop); 6529 } 6530 6531 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info) 6532 { 6533 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6534 struct net_device *dev = info->user_ptr[1]; 6535 u8 *dst = NULL; 6536 6537 if (info->attrs[NL80211_ATTR_MAC]) 6538 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 6539 6540 if (!rdev->ops->del_mpath) 6541 return -EOPNOTSUPP; 6542 6543 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 6544 return -EOPNOTSUPP; 6545 6546 return rdev_del_mpath(rdev, dev, dst); 6547 } 6548 6549 static int nl80211_get_mpp(struct sk_buff *skb, struct genl_info *info) 6550 { 6551 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6552 int err; 6553 struct net_device *dev = info->user_ptr[1]; 6554 struct mpath_info pinfo; 6555 struct sk_buff *msg; 6556 u8 *dst = NULL; 6557 u8 mpp[ETH_ALEN]; 6558 6559 memset(&pinfo, 0, sizeof(pinfo)); 6560 6561 if (!info->attrs[NL80211_ATTR_MAC]) 6562 return -EINVAL; 6563 6564 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 6565 6566 if (!rdev->ops->get_mpp) 6567 return -EOPNOTSUPP; 6568 6569 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 6570 return -EOPNOTSUPP; 6571 6572 err = rdev_get_mpp(rdev, dev, dst, mpp, &pinfo); 6573 if (err) 6574 return err; 6575 6576 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 6577 if (!msg) 6578 return -ENOMEM; 6579 6580 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 6581 dev, dst, mpp, &pinfo) < 0) { 6582 nlmsg_free(msg); 6583 return -ENOBUFS; 6584 } 6585 6586 return genlmsg_reply(msg, info); 6587 } 6588 6589 static int nl80211_dump_mpp(struct sk_buff *skb, 6590 struct netlink_callback *cb) 6591 { 6592 struct mpath_info pinfo; 6593 struct cfg80211_registered_device *rdev; 6594 struct wireless_dev *wdev; 6595 u8 dst[ETH_ALEN]; 6596 u8 mpp[ETH_ALEN]; 6597 int path_idx = cb->args[2]; 6598 int err; 6599 6600 rtnl_lock(); 6601 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev); 6602 if (err) 6603 goto out_err; 6604 6605 if (!rdev->ops->dump_mpp) { 6606 err = -EOPNOTSUPP; 6607 goto out_err; 6608 } 6609 6610 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 6611 err = -EOPNOTSUPP; 6612 goto out_err; 6613 } 6614 6615 while (1) { 6616 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst, 6617 mpp, &pinfo); 6618 if (err == -ENOENT) 6619 break; 6620 if (err) 6621 goto out_err; 6622 6623 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 6624 cb->nlh->nlmsg_seq, NLM_F_MULTI, 6625 wdev->netdev, dst, mpp, 6626 &pinfo) < 0) 6627 goto out; 6628 6629 path_idx++; 6630 } 6631 6632 out: 6633 cb->args[2] = path_idx; 6634 err = skb->len; 6635 out_err: 6636 rtnl_unlock(); 6637 return err; 6638 } 6639 6640 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info) 6641 { 6642 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6643 struct net_device *dev = info->user_ptr[1]; 6644 struct wireless_dev *wdev = dev->ieee80211_ptr; 6645 struct bss_parameters params; 6646 int err; 6647 6648 memset(¶ms, 0, sizeof(params)); 6649 /* default to not changing parameters */ 6650 params.use_cts_prot = -1; 6651 params.use_short_preamble = -1; 6652 params.use_short_slot_time = -1; 6653 params.ap_isolate = -1; 6654 params.ht_opmode = -1; 6655 params.p2p_ctwindow = -1; 6656 params.p2p_opp_ps = -1; 6657 6658 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) 6659 params.use_cts_prot = 6660 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); 6661 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) 6662 params.use_short_preamble = 6663 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); 6664 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) 6665 params.use_short_slot_time = 6666 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); 6667 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 6668 params.basic_rates = 6669 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 6670 params.basic_rates_len = 6671 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 6672 } 6673 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) 6674 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); 6675 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) 6676 params.ht_opmode = 6677 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); 6678 6679 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 6680 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 6681 return -EINVAL; 6682 params.p2p_ctwindow = 6683 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 6684 if (params.p2p_ctwindow != 0 && 6685 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) 6686 return -EINVAL; 6687 } 6688 6689 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 6690 u8 tmp; 6691 6692 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 6693 return -EINVAL; 6694 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 6695 params.p2p_opp_ps = tmp; 6696 if (params.p2p_opp_ps && 6697 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) 6698 return -EINVAL; 6699 } 6700 6701 if (!rdev->ops->change_bss) 6702 return -EOPNOTSUPP; 6703 6704 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 6705 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 6706 return -EOPNOTSUPP; 6707 6708 wdev_lock(wdev); 6709 err = rdev_change_bss(rdev, dev, ¶ms); 6710 wdev_unlock(wdev); 6711 6712 return err; 6713 } 6714 6715 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info) 6716 { 6717 char *data = NULL; 6718 bool is_indoor; 6719 enum nl80211_user_reg_hint_type user_reg_hint_type; 6720 u32 owner_nlportid; 6721 6722 /* 6723 * You should only get this when cfg80211 hasn't yet initialized 6724 * completely when built-in to the kernel right between the time 6725 * window between nl80211_init() and regulatory_init(), if that is 6726 * even possible. 6727 */ 6728 if (unlikely(!rcu_access_pointer(cfg80211_regdomain))) 6729 return -EINPROGRESS; 6730 6731 if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]) 6732 user_reg_hint_type = 6733 nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]); 6734 else 6735 user_reg_hint_type = NL80211_USER_REG_HINT_USER; 6736 6737 switch (user_reg_hint_type) { 6738 case NL80211_USER_REG_HINT_USER: 6739 case NL80211_USER_REG_HINT_CELL_BASE: 6740 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 6741 return -EINVAL; 6742 6743 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 6744 return regulatory_hint_user(data, user_reg_hint_type); 6745 case NL80211_USER_REG_HINT_INDOOR: 6746 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 6747 owner_nlportid = info->snd_portid; 6748 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR]; 6749 } else { 6750 owner_nlportid = 0; 6751 is_indoor = true; 6752 } 6753 6754 return regulatory_hint_indoor(is_indoor, owner_nlportid); 6755 default: 6756 return -EINVAL; 6757 } 6758 } 6759 6760 static int nl80211_reload_regdb(struct sk_buff *skb, struct genl_info *info) 6761 { 6762 return reg_reload_regdb(); 6763 } 6764 6765 static int nl80211_get_mesh_config(struct sk_buff *skb, 6766 struct genl_info *info) 6767 { 6768 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6769 struct net_device *dev = info->user_ptr[1]; 6770 struct wireless_dev *wdev = dev->ieee80211_ptr; 6771 struct mesh_config cur_params; 6772 int err = 0; 6773 void *hdr; 6774 struct nlattr *pinfoattr; 6775 struct sk_buff *msg; 6776 6777 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 6778 return -EOPNOTSUPP; 6779 6780 if (!rdev->ops->get_mesh_config) 6781 return -EOPNOTSUPP; 6782 6783 wdev_lock(wdev); 6784 /* If not connected, get default parameters */ 6785 if (!wdev->mesh_id_len) 6786 memcpy(&cur_params, &default_mesh_config, sizeof(cur_params)); 6787 else 6788 err = rdev_get_mesh_config(rdev, dev, &cur_params); 6789 wdev_unlock(wdev); 6790 6791 if (err) 6792 return err; 6793 6794 /* Draw up a netlink message to send back */ 6795 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 6796 if (!msg) 6797 return -ENOMEM; 6798 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 6799 NL80211_CMD_GET_MESH_CONFIG); 6800 if (!hdr) 6801 goto out; 6802 pinfoattr = nla_nest_start_noflag(msg, NL80211_ATTR_MESH_CONFIG); 6803 if (!pinfoattr) 6804 goto nla_put_failure; 6805 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 6806 nla_put_u16(msg, NL80211_MESHCONF_RETRY_TIMEOUT, 6807 cur_params.dot11MeshRetryTimeout) || 6808 nla_put_u16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT, 6809 cur_params.dot11MeshConfirmTimeout) || 6810 nla_put_u16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT, 6811 cur_params.dot11MeshHoldingTimeout) || 6812 nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS, 6813 cur_params.dot11MeshMaxPeerLinks) || 6814 nla_put_u8(msg, NL80211_MESHCONF_MAX_RETRIES, 6815 cur_params.dot11MeshMaxRetries) || 6816 nla_put_u8(msg, NL80211_MESHCONF_TTL, 6817 cur_params.dot11MeshTTL) || 6818 nla_put_u8(msg, NL80211_MESHCONF_ELEMENT_TTL, 6819 cur_params.element_ttl) || 6820 nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS, 6821 cur_params.auto_open_plinks) || 6822 nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 6823 cur_params.dot11MeshNbrOffsetMaxNeighbor) || 6824 nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 6825 cur_params.dot11MeshHWMPmaxPREQretries) || 6826 nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME, 6827 cur_params.path_refresh_time) || 6828 nla_put_u16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 6829 cur_params.min_discovery_timeout) || 6830 nla_put_u32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 6831 cur_params.dot11MeshHWMPactivePathTimeout) || 6832 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 6833 cur_params.dot11MeshHWMPpreqMinInterval) || 6834 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 6835 cur_params.dot11MeshHWMPperrMinInterval) || 6836 nla_put_u16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 6837 cur_params.dot11MeshHWMPnetDiameterTraversalTime) || 6838 nla_put_u8(msg, NL80211_MESHCONF_HWMP_ROOTMODE, 6839 cur_params.dot11MeshHWMPRootMode) || 6840 nla_put_u16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL, 6841 cur_params.dot11MeshHWMPRannInterval) || 6842 nla_put_u8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 6843 cur_params.dot11MeshGateAnnouncementProtocol) || 6844 nla_put_u8(msg, NL80211_MESHCONF_FORWARDING, 6845 cur_params.dot11MeshForwarding) || 6846 nla_put_s32(msg, NL80211_MESHCONF_RSSI_THRESHOLD, 6847 cur_params.rssi_threshold) || 6848 nla_put_u32(msg, NL80211_MESHCONF_HT_OPMODE, 6849 cur_params.ht_opmode) || 6850 nla_put_u32(msg, NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 6851 cur_params.dot11MeshHWMPactivePathToRootTimeout) || 6852 nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 6853 cur_params.dot11MeshHWMProotInterval) || 6854 nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 6855 cur_params.dot11MeshHWMPconfirmationInterval) || 6856 nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE, 6857 cur_params.power_mode) || 6858 nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW, 6859 cur_params.dot11MeshAwakeWindowDuration) || 6860 nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT, 6861 cur_params.plink_timeout) || 6862 nla_put_u8(msg, NL80211_MESHCONF_CONNECTED_TO_GATE, 6863 cur_params.dot11MeshConnectedToMeshGate)) 6864 goto nla_put_failure; 6865 nla_nest_end(msg, pinfoattr); 6866 genlmsg_end(msg, hdr); 6867 return genlmsg_reply(msg, info); 6868 6869 nla_put_failure: 6870 out: 6871 nlmsg_free(msg); 6872 return -ENOBUFS; 6873 } 6874 6875 static const struct nla_policy 6876 nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = { 6877 [NL80211_MESHCONF_RETRY_TIMEOUT] = 6878 NLA_POLICY_RANGE(NLA_U16, 1, 255), 6879 [NL80211_MESHCONF_CONFIRM_TIMEOUT] = 6880 NLA_POLICY_RANGE(NLA_U16, 1, 255), 6881 [NL80211_MESHCONF_HOLDING_TIMEOUT] = 6882 NLA_POLICY_RANGE(NLA_U16, 1, 255), 6883 [NL80211_MESHCONF_MAX_PEER_LINKS] = 6884 NLA_POLICY_RANGE(NLA_U16, 0, 255), 6885 [NL80211_MESHCONF_MAX_RETRIES] = NLA_POLICY_MAX(NLA_U8, 16), 6886 [NL80211_MESHCONF_TTL] = NLA_POLICY_MIN(NLA_U8, 1), 6887 [NL80211_MESHCONF_ELEMENT_TTL] = NLA_POLICY_MIN(NLA_U8, 1), 6888 [NL80211_MESHCONF_AUTO_OPEN_PLINKS] = NLA_POLICY_MAX(NLA_U8, 1), 6889 [NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] = 6890 NLA_POLICY_RANGE(NLA_U32, 1, 255), 6891 [NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 }, 6892 [NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 }, 6893 [NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = NLA_POLICY_MIN(NLA_U16, 1), 6894 [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 }, 6895 [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = 6896 NLA_POLICY_MIN(NLA_U16, 1), 6897 [NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] = 6898 NLA_POLICY_MIN(NLA_U16, 1), 6899 [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = 6900 NLA_POLICY_MIN(NLA_U16, 1), 6901 [NL80211_MESHCONF_HWMP_ROOTMODE] = NLA_POLICY_MAX(NLA_U8, 4), 6902 [NL80211_MESHCONF_HWMP_RANN_INTERVAL] = 6903 NLA_POLICY_MIN(NLA_U16, 1), 6904 [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = NLA_POLICY_MAX(NLA_U8, 1), 6905 [NL80211_MESHCONF_FORWARDING] = NLA_POLICY_MAX(NLA_U8, 1), 6906 [NL80211_MESHCONF_RSSI_THRESHOLD] = 6907 NLA_POLICY_RANGE(NLA_S32, -255, 0), 6908 [NL80211_MESHCONF_HT_OPMODE] = { .type = NLA_U16 }, 6909 [NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 }, 6910 [NL80211_MESHCONF_HWMP_ROOT_INTERVAL] = 6911 NLA_POLICY_MIN(NLA_U16, 1), 6912 [NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] = 6913 NLA_POLICY_MIN(NLA_U16, 1), 6914 [NL80211_MESHCONF_POWER_MODE] = 6915 NLA_POLICY_RANGE(NLA_U32, 6916 NL80211_MESH_POWER_ACTIVE, 6917 NL80211_MESH_POWER_MAX), 6918 [NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 }, 6919 [NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 }, 6920 [NL80211_MESHCONF_CONNECTED_TO_GATE] = NLA_POLICY_RANGE(NLA_U8, 0, 1), 6921 }; 6922 6923 static const struct nla_policy 6924 nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = { 6925 [NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 }, 6926 [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 }, 6927 [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 }, 6928 [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG }, 6929 [NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 }, 6930 [NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG }, 6931 [NL80211_MESH_SETUP_IE] = 6932 NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_ie_attr, 6933 IEEE80211_MAX_DATA_LEN), 6934 [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG }, 6935 }; 6936 6937 static int nl80211_parse_mesh_config(struct genl_info *info, 6938 struct mesh_config *cfg, 6939 u32 *mask_out) 6940 { 6941 struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1]; 6942 u32 mask = 0; 6943 u16 ht_opmode; 6944 6945 #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, mask, attr, fn) \ 6946 do { \ 6947 if (tb[attr]) { \ 6948 cfg->param = fn(tb[attr]); \ 6949 mask |= BIT((attr) - 1); \ 6950 } \ 6951 } while (0) 6952 6953 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) 6954 return -EINVAL; 6955 if (nla_parse_nested_deprecated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params_policy, info->extack)) 6956 return -EINVAL; 6957 6958 /* This makes sure that there aren't more than 32 mesh config 6959 * parameters (otherwise our bitfield scheme would not work.) */ 6960 BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32); 6961 6962 /* Fill in the params struct */ 6963 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout, mask, 6964 NL80211_MESHCONF_RETRY_TIMEOUT, nla_get_u16); 6965 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout, mask, 6966 NL80211_MESHCONF_CONFIRM_TIMEOUT, 6967 nla_get_u16); 6968 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout, mask, 6969 NL80211_MESHCONF_HOLDING_TIMEOUT, 6970 nla_get_u16); 6971 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks, mask, 6972 NL80211_MESHCONF_MAX_PEER_LINKS, 6973 nla_get_u16); 6974 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries, mask, 6975 NL80211_MESHCONF_MAX_RETRIES, nla_get_u8); 6976 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL, mask, 6977 NL80211_MESHCONF_TTL, nla_get_u8); 6978 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl, mask, 6979 NL80211_MESHCONF_ELEMENT_TTL, nla_get_u8); 6980 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks, mask, 6981 NL80211_MESHCONF_AUTO_OPEN_PLINKS, 6982 nla_get_u8); 6983 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor, 6984 mask, 6985 NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 6986 nla_get_u32); 6987 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries, mask, 6988 NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 6989 nla_get_u8); 6990 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time, mask, 6991 NL80211_MESHCONF_PATH_REFRESH_TIME, 6992 nla_get_u32); 6993 if (mask & BIT(NL80211_MESHCONF_PATH_REFRESH_TIME) && 6994 (cfg->path_refresh_time < 1 || cfg->path_refresh_time > 65535)) 6995 return -EINVAL; 6996 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout, mask, 6997 NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 6998 nla_get_u16); 6999 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout, 7000 mask, 7001 NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 7002 nla_get_u32); 7003 if (mask & BIT(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT) && 7004 (cfg->dot11MeshHWMPactivePathTimeout < 1 || 7005 cfg->dot11MeshHWMPactivePathTimeout > 65535)) 7006 return -EINVAL; 7007 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval, mask, 7008 NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 7009 nla_get_u16); 7010 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPperrMinInterval, mask, 7011 NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 7012 nla_get_u16); 7013 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 7014 dot11MeshHWMPnetDiameterTraversalTime, mask, 7015 NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 7016 nla_get_u16); 7017 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRootMode, mask, 7018 NL80211_MESHCONF_HWMP_ROOTMODE, nla_get_u8); 7019 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRannInterval, mask, 7020 NL80211_MESHCONF_HWMP_RANN_INTERVAL, 7021 nla_get_u16); 7022 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshGateAnnouncementProtocol, 7023 mask, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 7024 nla_get_u8); 7025 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, mask, 7026 NL80211_MESHCONF_FORWARDING, nla_get_u8); 7027 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, mask, 7028 NL80211_MESHCONF_RSSI_THRESHOLD, 7029 nla_get_s32); 7030 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConnectedToMeshGate, mask, 7031 NL80211_MESHCONF_CONNECTED_TO_GATE, 7032 nla_get_u8); 7033 /* 7034 * Check HT operation mode based on 7035 * IEEE 802.11-2016 9.4.2.57 HT Operation element. 7036 */ 7037 if (tb[NL80211_MESHCONF_HT_OPMODE]) { 7038 ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]); 7039 7040 if (ht_opmode & ~(IEEE80211_HT_OP_MODE_PROTECTION | 7041 IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT | 7042 IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)) 7043 return -EINVAL; 7044 7045 /* NON_HT_STA bit is reserved, but some programs set it */ 7046 ht_opmode &= ~IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT; 7047 7048 cfg->ht_opmode = ht_opmode; 7049 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); 7050 } 7051 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 7052 dot11MeshHWMPactivePathToRootTimeout, mask, 7053 NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 7054 nla_get_u32); 7055 if (mask & BIT(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT) && 7056 (cfg->dot11MeshHWMPactivePathToRootTimeout < 1 || 7057 cfg->dot11MeshHWMPactivePathToRootTimeout > 65535)) 7058 return -EINVAL; 7059 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMProotInterval, mask, 7060 NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 7061 nla_get_u16); 7062 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPconfirmationInterval, 7063 mask, 7064 NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 7065 nla_get_u16); 7066 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode, mask, 7067 NL80211_MESHCONF_POWER_MODE, nla_get_u32); 7068 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration, mask, 7069 NL80211_MESHCONF_AWAKE_WINDOW, nla_get_u16); 7070 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, plink_timeout, mask, 7071 NL80211_MESHCONF_PLINK_TIMEOUT, nla_get_u32); 7072 if (mask_out) 7073 *mask_out = mask; 7074 7075 return 0; 7076 7077 #undef FILL_IN_MESH_PARAM_IF_SET 7078 } 7079 7080 static int nl80211_parse_mesh_setup(struct genl_info *info, 7081 struct mesh_setup *setup) 7082 { 7083 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7084 struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1]; 7085 7086 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) 7087 return -EINVAL; 7088 if (nla_parse_nested_deprecated(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_params_policy, info->extack)) 7089 return -EINVAL; 7090 7091 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC]) 7092 setup->sync_method = 7093 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ? 7094 IEEE80211_SYNC_METHOD_VENDOR : 7095 IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET; 7096 7097 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL]) 7098 setup->path_sel_proto = 7099 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ? 7100 IEEE80211_PATH_PROTOCOL_VENDOR : 7101 IEEE80211_PATH_PROTOCOL_HWMP; 7102 7103 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC]) 7104 setup->path_metric = 7105 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ? 7106 IEEE80211_PATH_METRIC_VENDOR : 7107 IEEE80211_PATH_METRIC_AIRTIME; 7108 7109 if (tb[NL80211_MESH_SETUP_IE]) { 7110 struct nlattr *ieattr = 7111 tb[NL80211_MESH_SETUP_IE]; 7112 setup->ie = nla_data(ieattr); 7113 setup->ie_len = nla_len(ieattr); 7114 } 7115 if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] && 7116 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) 7117 return -EINVAL; 7118 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); 7119 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); 7120 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); 7121 if (setup->is_secure) 7122 setup->user_mpm = true; 7123 7124 if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) { 7125 if (!setup->user_mpm) 7126 return -EINVAL; 7127 setup->auth_id = 7128 nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]); 7129 } 7130 7131 return 0; 7132 } 7133 7134 static int nl80211_update_mesh_config(struct sk_buff *skb, 7135 struct genl_info *info) 7136 { 7137 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7138 struct net_device *dev = info->user_ptr[1]; 7139 struct wireless_dev *wdev = dev->ieee80211_ptr; 7140 struct mesh_config cfg; 7141 u32 mask; 7142 int err; 7143 7144 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 7145 return -EOPNOTSUPP; 7146 7147 if (!rdev->ops->update_mesh_config) 7148 return -EOPNOTSUPP; 7149 7150 err = nl80211_parse_mesh_config(info, &cfg, &mask); 7151 if (err) 7152 return err; 7153 7154 wdev_lock(wdev); 7155 if (!wdev->mesh_id_len) 7156 err = -ENOLINK; 7157 7158 if (!err) 7159 err = rdev_update_mesh_config(rdev, dev, mask, &cfg); 7160 7161 wdev_unlock(wdev); 7162 7163 return err; 7164 } 7165 7166 static int nl80211_put_regdom(const struct ieee80211_regdomain *regdom, 7167 struct sk_buff *msg) 7168 { 7169 struct nlattr *nl_reg_rules; 7170 unsigned int i; 7171 7172 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || 7173 (regdom->dfs_region && 7174 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) 7175 goto nla_put_failure; 7176 7177 nl_reg_rules = nla_nest_start_noflag(msg, NL80211_ATTR_REG_RULES); 7178 if (!nl_reg_rules) 7179 goto nla_put_failure; 7180 7181 for (i = 0; i < regdom->n_reg_rules; i++) { 7182 struct nlattr *nl_reg_rule; 7183 const struct ieee80211_reg_rule *reg_rule; 7184 const struct ieee80211_freq_range *freq_range; 7185 const struct ieee80211_power_rule *power_rule; 7186 unsigned int max_bandwidth_khz; 7187 7188 reg_rule = ®dom->reg_rules[i]; 7189 freq_range = ®_rule->freq_range; 7190 power_rule = ®_rule->power_rule; 7191 7192 nl_reg_rule = nla_nest_start_noflag(msg, i); 7193 if (!nl_reg_rule) 7194 goto nla_put_failure; 7195 7196 max_bandwidth_khz = freq_range->max_bandwidth_khz; 7197 if (!max_bandwidth_khz) 7198 max_bandwidth_khz = reg_get_max_bandwidth(regdom, 7199 reg_rule); 7200 7201 if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS, 7202 reg_rule->flags) || 7203 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START, 7204 freq_range->start_freq_khz) || 7205 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END, 7206 freq_range->end_freq_khz) || 7207 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW, 7208 max_bandwidth_khz) || 7209 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN, 7210 power_rule->max_antenna_gain) || 7211 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP, 7212 power_rule->max_eirp) || 7213 nla_put_u32(msg, NL80211_ATTR_DFS_CAC_TIME, 7214 reg_rule->dfs_cac_ms)) 7215 goto nla_put_failure; 7216 7217 nla_nest_end(msg, nl_reg_rule); 7218 } 7219 7220 nla_nest_end(msg, nl_reg_rules); 7221 return 0; 7222 7223 nla_put_failure: 7224 return -EMSGSIZE; 7225 } 7226 7227 static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info) 7228 { 7229 const struct ieee80211_regdomain *regdom = NULL; 7230 struct cfg80211_registered_device *rdev; 7231 struct wiphy *wiphy = NULL; 7232 struct sk_buff *msg; 7233 void *hdr; 7234 7235 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 7236 if (!msg) 7237 return -ENOBUFS; 7238 7239 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 7240 NL80211_CMD_GET_REG); 7241 if (!hdr) 7242 goto put_failure; 7243 7244 if (info->attrs[NL80211_ATTR_WIPHY]) { 7245 bool self_managed; 7246 7247 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 7248 if (IS_ERR(rdev)) { 7249 nlmsg_free(msg); 7250 return PTR_ERR(rdev); 7251 } 7252 7253 wiphy = &rdev->wiphy; 7254 self_managed = wiphy->regulatory_flags & 7255 REGULATORY_WIPHY_SELF_MANAGED; 7256 regdom = get_wiphy_regdom(wiphy); 7257 7258 /* a self-managed-reg device must have a private regdom */ 7259 if (WARN_ON(!regdom && self_managed)) { 7260 nlmsg_free(msg); 7261 return -EINVAL; 7262 } 7263 7264 if (regdom && 7265 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 7266 goto nla_put_failure; 7267 } 7268 7269 if (!wiphy && reg_last_request_cell_base() && 7270 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 7271 NL80211_USER_REG_HINT_CELL_BASE)) 7272 goto nla_put_failure; 7273 7274 rcu_read_lock(); 7275 7276 if (!regdom) 7277 regdom = rcu_dereference(cfg80211_regdomain); 7278 7279 if (nl80211_put_regdom(regdom, msg)) 7280 goto nla_put_failure_rcu; 7281 7282 rcu_read_unlock(); 7283 7284 genlmsg_end(msg, hdr); 7285 return genlmsg_reply(msg, info); 7286 7287 nla_put_failure_rcu: 7288 rcu_read_unlock(); 7289 nla_put_failure: 7290 put_failure: 7291 nlmsg_free(msg); 7292 return -EMSGSIZE; 7293 } 7294 7295 static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb, 7296 u32 seq, int flags, struct wiphy *wiphy, 7297 const struct ieee80211_regdomain *regdom) 7298 { 7299 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 7300 NL80211_CMD_GET_REG); 7301 7302 if (!hdr) 7303 return -1; 7304 7305 genl_dump_check_consistent(cb, hdr); 7306 7307 if (nl80211_put_regdom(regdom, msg)) 7308 goto nla_put_failure; 7309 7310 if (!wiphy && reg_last_request_cell_base() && 7311 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 7312 NL80211_USER_REG_HINT_CELL_BASE)) 7313 goto nla_put_failure; 7314 7315 if (wiphy && 7316 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 7317 goto nla_put_failure; 7318 7319 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 7320 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 7321 goto nla_put_failure; 7322 7323 genlmsg_end(msg, hdr); 7324 return 0; 7325 7326 nla_put_failure: 7327 genlmsg_cancel(msg, hdr); 7328 return -EMSGSIZE; 7329 } 7330 7331 static int nl80211_get_reg_dump(struct sk_buff *skb, 7332 struct netlink_callback *cb) 7333 { 7334 const struct ieee80211_regdomain *regdom = NULL; 7335 struct cfg80211_registered_device *rdev; 7336 int err, reg_idx, start = cb->args[2]; 7337 7338 rtnl_lock(); 7339 7340 if (cfg80211_regdomain && start == 0) { 7341 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, 7342 NLM_F_MULTI, NULL, 7343 rtnl_dereference(cfg80211_regdomain)); 7344 if (err < 0) 7345 goto out_err; 7346 } 7347 7348 /* the global regdom is idx 0 */ 7349 reg_idx = 1; 7350 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 7351 regdom = get_wiphy_regdom(&rdev->wiphy); 7352 if (!regdom) 7353 continue; 7354 7355 if (++reg_idx <= start) 7356 continue; 7357 7358 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, 7359 NLM_F_MULTI, &rdev->wiphy, regdom); 7360 if (err < 0) { 7361 reg_idx--; 7362 break; 7363 } 7364 } 7365 7366 cb->args[2] = reg_idx; 7367 err = skb->len; 7368 out_err: 7369 rtnl_unlock(); 7370 return err; 7371 } 7372 7373 #ifdef CONFIG_CFG80211_CRDA_SUPPORT 7374 static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = { 7375 [NL80211_ATTR_REG_RULE_FLAGS] = { .type = NLA_U32 }, 7376 [NL80211_ATTR_FREQ_RANGE_START] = { .type = NLA_U32 }, 7377 [NL80211_ATTR_FREQ_RANGE_END] = { .type = NLA_U32 }, 7378 [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 }, 7379 [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 }, 7380 [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 }, 7381 [NL80211_ATTR_DFS_CAC_TIME] = { .type = NLA_U32 }, 7382 }; 7383 7384 static int parse_reg_rule(struct nlattr *tb[], 7385 struct ieee80211_reg_rule *reg_rule) 7386 { 7387 struct ieee80211_freq_range *freq_range = ®_rule->freq_range; 7388 struct ieee80211_power_rule *power_rule = ®_rule->power_rule; 7389 7390 if (!tb[NL80211_ATTR_REG_RULE_FLAGS]) 7391 return -EINVAL; 7392 if (!tb[NL80211_ATTR_FREQ_RANGE_START]) 7393 return -EINVAL; 7394 if (!tb[NL80211_ATTR_FREQ_RANGE_END]) 7395 return -EINVAL; 7396 if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]) 7397 return -EINVAL; 7398 if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]) 7399 return -EINVAL; 7400 7401 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); 7402 7403 freq_range->start_freq_khz = 7404 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]); 7405 freq_range->end_freq_khz = 7406 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]); 7407 freq_range->max_bandwidth_khz = 7408 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]); 7409 7410 power_rule->max_eirp = 7411 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]); 7412 7413 if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]) 7414 power_rule->max_antenna_gain = 7415 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]); 7416 7417 if (tb[NL80211_ATTR_DFS_CAC_TIME]) 7418 reg_rule->dfs_cac_ms = 7419 nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]); 7420 7421 return 0; 7422 } 7423 7424 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info) 7425 { 7426 struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1]; 7427 struct nlattr *nl_reg_rule; 7428 char *alpha2; 7429 int rem_reg_rules, r; 7430 u32 num_rules = 0, rule_idx = 0; 7431 enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET; 7432 struct ieee80211_regdomain *rd; 7433 7434 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 7435 return -EINVAL; 7436 7437 if (!info->attrs[NL80211_ATTR_REG_RULES]) 7438 return -EINVAL; 7439 7440 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 7441 7442 if (info->attrs[NL80211_ATTR_DFS_REGION]) 7443 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); 7444 7445 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 7446 rem_reg_rules) { 7447 num_rules++; 7448 if (num_rules > NL80211_MAX_SUPP_REG_RULES) 7449 return -EINVAL; 7450 } 7451 7452 if (!reg_is_valid_request(alpha2)) 7453 return -EINVAL; 7454 7455 rd = kzalloc(struct_size(rd, reg_rules, num_rules), GFP_KERNEL); 7456 if (!rd) 7457 return -ENOMEM; 7458 7459 rd->n_reg_rules = num_rules; 7460 rd->alpha2[0] = alpha2[0]; 7461 rd->alpha2[1] = alpha2[1]; 7462 7463 /* 7464 * Disable DFS master mode if the DFS region was 7465 * not supported or known on this kernel. 7466 */ 7467 if (reg_supported_dfs_region(dfs_region)) 7468 rd->dfs_region = dfs_region; 7469 7470 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 7471 rem_reg_rules) { 7472 r = nla_parse_nested_deprecated(tb, NL80211_REG_RULE_ATTR_MAX, 7473 nl_reg_rule, reg_rule_policy, 7474 info->extack); 7475 if (r) 7476 goto bad_reg; 7477 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); 7478 if (r) 7479 goto bad_reg; 7480 7481 rule_idx++; 7482 7483 if (rule_idx > NL80211_MAX_SUPP_REG_RULES) { 7484 r = -EINVAL; 7485 goto bad_reg; 7486 } 7487 } 7488 7489 /* set_regdom takes ownership of rd */ 7490 return set_regdom(rd, REGD_SOURCE_CRDA); 7491 bad_reg: 7492 kfree(rd); 7493 return r; 7494 } 7495 #endif /* CONFIG_CFG80211_CRDA_SUPPORT */ 7496 7497 static int validate_scan_freqs(struct nlattr *freqs) 7498 { 7499 struct nlattr *attr1, *attr2; 7500 int n_channels = 0, tmp1, tmp2; 7501 7502 nla_for_each_nested(attr1, freqs, tmp1) 7503 if (nla_len(attr1) != sizeof(u32)) 7504 return 0; 7505 7506 nla_for_each_nested(attr1, freqs, tmp1) { 7507 n_channels++; 7508 /* 7509 * Some hardware has a limited channel list for 7510 * scanning, and it is pretty much nonsensical 7511 * to scan for a channel twice, so disallow that 7512 * and don't require drivers to check that the 7513 * channel list they get isn't longer than what 7514 * they can scan, as long as they can scan all 7515 * the channels they registered at once. 7516 */ 7517 nla_for_each_nested(attr2, freqs, tmp2) 7518 if (attr1 != attr2 && 7519 nla_get_u32(attr1) == nla_get_u32(attr2)) 7520 return 0; 7521 } 7522 7523 return n_channels; 7524 } 7525 7526 static bool is_band_valid(struct wiphy *wiphy, enum nl80211_band b) 7527 { 7528 return b < NUM_NL80211_BANDS && wiphy->bands[b]; 7529 } 7530 7531 static int parse_bss_select(struct nlattr *nla, struct wiphy *wiphy, 7532 struct cfg80211_bss_selection *bss_select) 7533 { 7534 struct nlattr *attr[NL80211_BSS_SELECT_ATTR_MAX + 1]; 7535 struct nlattr *nest; 7536 int err; 7537 bool found = false; 7538 int i; 7539 7540 /* only process one nested attribute */ 7541 nest = nla_data(nla); 7542 if (!nla_ok(nest, nla_len(nest))) 7543 return -EINVAL; 7544 7545 err = nla_parse_nested_deprecated(attr, NL80211_BSS_SELECT_ATTR_MAX, 7546 nest, nl80211_bss_select_policy, 7547 NULL); 7548 if (err) 7549 return err; 7550 7551 /* only one attribute may be given */ 7552 for (i = 0; i <= NL80211_BSS_SELECT_ATTR_MAX; i++) { 7553 if (attr[i]) { 7554 if (found) 7555 return -EINVAL; 7556 found = true; 7557 } 7558 } 7559 7560 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID; 7561 7562 if (attr[NL80211_BSS_SELECT_ATTR_RSSI]) 7563 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI; 7564 7565 if (attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]) { 7566 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF; 7567 bss_select->param.band_pref = 7568 nla_get_u32(attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]); 7569 if (!is_band_valid(wiphy, bss_select->param.band_pref)) 7570 return -EINVAL; 7571 } 7572 7573 if (attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]) { 7574 struct nl80211_bss_select_rssi_adjust *adj_param; 7575 7576 adj_param = nla_data(attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]); 7577 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST; 7578 bss_select->param.adjust.band = adj_param->band; 7579 bss_select->param.adjust.delta = adj_param->delta; 7580 if (!is_band_valid(wiphy, bss_select->param.adjust.band)) 7581 return -EINVAL; 7582 } 7583 7584 /* user-space did not provide behaviour attribute */ 7585 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID) 7586 return -EINVAL; 7587 7588 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour))) 7589 return -EINVAL; 7590 7591 return 0; 7592 } 7593 7594 int nl80211_parse_random_mac(struct nlattr **attrs, 7595 u8 *mac_addr, u8 *mac_addr_mask) 7596 { 7597 int i; 7598 7599 if (!attrs[NL80211_ATTR_MAC] && !attrs[NL80211_ATTR_MAC_MASK]) { 7600 eth_zero_addr(mac_addr); 7601 eth_zero_addr(mac_addr_mask); 7602 mac_addr[0] = 0x2; 7603 mac_addr_mask[0] = 0x3; 7604 7605 return 0; 7606 } 7607 7608 /* need both or none */ 7609 if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_MAC_MASK]) 7610 return -EINVAL; 7611 7612 memcpy(mac_addr, nla_data(attrs[NL80211_ATTR_MAC]), ETH_ALEN); 7613 memcpy(mac_addr_mask, nla_data(attrs[NL80211_ATTR_MAC_MASK]), ETH_ALEN); 7614 7615 /* don't allow or configure an mcast address */ 7616 if (!is_multicast_ether_addr(mac_addr_mask) || 7617 is_multicast_ether_addr(mac_addr)) 7618 return -EINVAL; 7619 7620 /* 7621 * allow users to pass a MAC address that has bits set outside 7622 * of the mask, but don't bother drivers with having to deal 7623 * with such bits 7624 */ 7625 for (i = 0; i < ETH_ALEN; i++) 7626 mac_addr[i] &= mac_addr_mask[i]; 7627 7628 return 0; 7629 } 7630 7631 static bool cfg80211_off_channel_oper_allowed(struct wireless_dev *wdev) 7632 { 7633 ASSERT_WDEV_LOCK(wdev); 7634 7635 if (!cfg80211_beaconing_iface_active(wdev)) 7636 return true; 7637 7638 if (!(wdev->chandef.chan->flags & IEEE80211_CHAN_RADAR)) 7639 return true; 7640 7641 return regulatory_pre_cac_allowed(wdev->wiphy); 7642 } 7643 7644 static bool nl80211_check_scan_feat(struct wiphy *wiphy, u32 flags, u32 flag, 7645 enum nl80211_ext_feature_index feat) 7646 { 7647 if (!(flags & flag)) 7648 return true; 7649 if (wiphy_ext_feature_isset(wiphy, feat)) 7650 return true; 7651 return false; 7652 } 7653 7654 static int 7655 nl80211_check_scan_flags(struct wiphy *wiphy, struct wireless_dev *wdev, 7656 void *request, struct nlattr **attrs, 7657 bool is_sched_scan) 7658 { 7659 u8 *mac_addr, *mac_addr_mask; 7660 u32 *flags; 7661 enum nl80211_feature_flags randomness_flag; 7662 7663 if (!attrs[NL80211_ATTR_SCAN_FLAGS]) 7664 return 0; 7665 7666 if (is_sched_scan) { 7667 struct cfg80211_sched_scan_request *req = request; 7668 7669 randomness_flag = wdev ? 7670 NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR : 7671 NL80211_FEATURE_ND_RANDOM_MAC_ADDR; 7672 flags = &req->flags; 7673 mac_addr = req->mac_addr; 7674 mac_addr_mask = req->mac_addr_mask; 7675 } else { 7676 struct cfg80211_scan_request *req = request; 7677 7678 randomness_flag = NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR; 7679 flags = &req->flags; 7680 mac_addr = req->mac_addr; 7681 mac_addr_mask = req->mac_addr_mask; 7682 } 7683 7684 *flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]); 7685 7686 if (((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) && 7687 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) || 7688 !nl80211_check_scan_feat(wiphy, *flags, 7689 NL80211_SCAN_FLAG_LOW_SPAN, 7690 NL80211_EXT_FEATURE_LOW_SPAN_SCAN) || 7691 !nl80211_check_scan_feat(wiphy, *flags, 7692 NL80211_SCAN_FLAG_LOW_POWER, 7693 NL80211_EXT_FEATURE_LOW_POWER_SCAN) || 7694 !nl80211_check_scan_feat(wiphy, *flags, 7695 NL80211_SCAN_FLAG_HIGH_ACCURACY, 7696 NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN) || 7697 !nl80211_check_scan_feat(wiphy, *flags, 7698 NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME, 7699 NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME) || 7700 !nl80211_check_scan_feat(wiphy, *flags, 7701 NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP, 7702 NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP) || 7703 !nl80211_check_scan_feat(wiphy, *flags, 7704 NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION, 7705 NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION) || 7706 !nl80211_check_scan_feat(wiphy, *flags, 7707 NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE, 7708 NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE) || 7709 !nl80211_check_scan_feat(wiphy, *flags, 7710 NL80211_SCAN_FLAG_RANDOM_SN, 7711 NL80211_EXT_FEATURE_SCAN_RANDOM_SN) || 7712 !nl80211_check_scan_feat(wiphy, *flags, 7713 NL80211_SCAN_FLAG_MIN_PREQ_CONTENT, 7714 NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT)) 7715 return -EOPNOTSUPP; 7716 7717 if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { 7718 int err; 7719 7720 if (!(wiphy->features & randomness_flag) || 7721 (wdev && wdev->current_bss)) 7722 return -EOPNOTSUPP; 7723 7724 err = nl80211_parse_random_mac(attrs, mac_addr, mac_addr_mask); 7725 if (err) 7726 return err; 7727 } 7728 7729 return 0; 7730 } 7731 7732 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) 7733 { 7734 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7735 struct wireless_dev *wdev = info->user_ptr[1]; 7736 struct cfg80211_scan_request *request; 7737 struct nlattr *attr; 7738 struct wiphy *wiphy; 7739 int err, tmp, n_ssids = 0, n_channels, i; 7740 size_t ie_len; 7741 7742 wiphy = &rdev->wiphy; 7743 7744 if (wdev->iftype == NL80211_IFTYPE_NAN) 7745 return -EOPNOTSUPP; 7746 7747 if (!rdev->ops->scan) 7748 return -EOPNOTSUPP; 7749 7750 if (rdev->scan_req || rdev->scan_msg) { 7751 err = -EBUSY; 7752 goto unlock; 7753 } 7754 7755 if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 7756 n_channels = validate_scan_freqs( 7757 info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]); 7758 if (!n_channels) { 7759 err = -EINVAL; 7760 goto unlock; 7761 } 7762 } else { 7763 n_channels = ieee80211_get_num_supported_channels(wiphy); 7764 } 7765 7766 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) 7767 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) 7768 n_ssids++; 7769 7770 if (n_ssids > wiphy->max_scan_ssids) { 7771 err = -EINVAL; 7772 goto unlock; 7773 } 7774 7775 if (info->attrs[NL80211_ATTR_IE]) 7776 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 7777 else 7778 ie_len = 0; 7779 7780 if (ie_len > wiphy->max_scan_ie_len) { 7781 err = -EINVAL; 7782 goto unlock; 7783 } 7784 7785 request = kzalloc(sizeof(*request) 7786 + sizeof(*request->ssids) * n_ssids 7787 + sizeof(*request->channels) * n_channels 7788 + ie_len, GFP_KERNEL); 7789 if (!request) { 7790 err = -ENOMEM; 7791 goto unlock; 7792 } 7793 7794 if (n_ssids) 7795 request->ssids = (void *)&request->channels[n_channels]; 7796 request->n_ssids = n_ssids; 7797 if (ie_len) { 7798 if (n_ssids) 7799 request->ie = (void *)(request->ssids + n_ssids); 7800 else 7801 request->ie = (void *)(request->channels + n_channels); 7802 } 7803 7804 i = 0; 7805 if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 7806 /* user specified, bail out if channel not found */ 7807 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_FREQUENCIES], tmp) { 7808 struct ieee80211_channel *chan; 7809 7810 chan = ieee80211_get_channel(wiphy, nla_get_u32(attr)); 7811 7812 if (!chan) { 7813 err = -EINVAL; 7814 goto out_free; 7815 } 7816 7817 /* ignore disabled channels */ 7818 if (chan->flags & IEEE80211_CHAN_DISABLED) 7819 continue; 7820 7821 request->channels[i] = chan; 7822 i++; 7823 } 7824 } else { 7825 enum nl80211_band band; 7826 7827 /* all channels */ 7828 for (band = 0; band < NUM_NL80211_BANDS; band++) { 7829 int j; 7830 7831 if (!wiphy->bands[band]) 7832 continue; 7833 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 7834 struct ieee80211_channel *chan; 7835 7836 chan = &wiphy->bands[band]->channels[j]; 7837 7838 if (chan->flags & IEEE80211_CHAN_DISABLED) 7839 continue; 7840 7841 request->channels[i] = chan; 7842 i++; 7843 } 7844 } 7845 } 7846 7847 if (!i) { 7848 err = -EINVAL; 7849 goto out_free; 7850 } 7851 7852 request->n_channels = i; 7853 7854 wdev_lock(wdev); 7855 if (!cfg80211_off_channel_oper_allowed(wdev)) { 7856 struct ieee80211_channel *chan; 7857 7858 if (request->n_channels != 1) { 7859 wdev_unlock(wdev); 7860 err = -EBUSY; 7861 goto out_free; 7862 } 7863 7864 chan = request->channels[0]; 7865 if (chan->center_freq != wdev->chandef.chan->center_freq) { 7866 wdev_unlock(wdev); 7867 err = -EBUSY; 7868 goto out_free; 7869 } 7870 } 7871 wdev_unlock(wdev); 7872 7873 i = 0; 7874 if (n_ssids) { 7875 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { 7876 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 7877 err = -EINVAL; 7878 goto out_free; 7879 } 7880 request->ssids[i].ssid_len = nla_len(attr); 7881 memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr)); 7882 i++; 7883 } 7884 } 7885 7886 if (info->attrs[NL80211_ATTR_IE]) { 7887 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 7888 memcpy((void *)request->ie, 7889 nla_data(info->attrs[NL80211_ATTR_IE]), 7890 request->ie_len); 7891 } 7892 7893 for (i = 0; i < NUM_NL80211_BANDS; i++) 7894 if (wiphy->bands[i]) 7895 request->rates[i] = 7896 (1 << wiphy->bands[i]->n_bitrates) - 1; 7897 7898 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { 7899 nla_for_each_nested(attr, 7900 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], 7901 tmp) { 7902 enum nl80211_band band = nla_type(attr); 7903 7904 if (band < 0 || band >= NUM_NL80211_BANDS) { 7905 err = -EINVAL; 7906 goto out_free; 7907 } 7908 7909 if (!wiphy->bands[band]) 7910 continue; 7911 7912 err = ieee80211_get_ratemask(wiphy->bands[band], 7913 nla_data(attr), 7914 nla_len(attr), 7915 &request->rates[band]); 7916 if (err) 7917 goto out_free; 7918 } 7919 } 7920 7921 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { 7922 if (!wiphy_ext_feature_isset(wiphy, 7923 NL80211_EXT_FEATURE_SET_SCAN_DWELL)) { 7924 err = -EOPNOTSUPP; 7925 goto out_free; 7926 } 7927 7928 request->duration = 7929 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); 7930 request->duration_mandatory = 7931 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); 7932 } 7933 7934 err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs, 7935 false); 7936 if (err) 7937 goto out_free; 7938 7939 request->no_cck = 7940 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 7941 7942 /* Initial implementation used NL80211_ATTR_MAC to set the specific 7943 * BSSID to scan for. This was problematic because that same attribute 7944 * was already used for another purpose (local random MAC address). The 7945 * NL80211_ATTR_BSSID attribute was added to fix this. For backwards 7946 * compatibility with older userspace components, also use the 7947 * NL80211_ATTR_MAC value here if it can be determined to be used for 7948 * the specific BSSID use case instead of the random MAC address 7949 * (NL80211_ATTR_SCAN_FLAGS is used to enable random MAC address use). 7950 */ 7951 if (info->attrs[NL80211_ATTR_BSSID]) 7952 memcpy(request->bssid, 7953 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); 7954 else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && 7955 info->attrs[NL80211_ATTR_MAC]) 7956 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]), 7957 ETH_ALEN); 7958 else 7959 eth_broadcast_addr(request->bssid); 7960 7961 request->wdev = wdev; 7962 request->wiphy = &rdev->wiphy; 7963 request->scan_start = jiffies; 7964 7965 rdev->scan_req = request; 7966 err = rdev_scan(rdev, request); 7967 7968 if (!err) { 7969 nl80211_send_scan_start(rdev, wdev); 7970 if (wdev->netdev) 7971 dev_hold(wdev->netdev); 7972 } else { 7973 out_free: 7974 rdev->scan_req = NULL; 7975 kfree(request); 7976 } 7977 7978 unlock: 7979 return err; 7980 } 7981 7982 static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info) 7983 { 7984 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7985 struct wireless_dev *wdev = info->user_ptr[1]; 7986 7987 if (!rdev->ops->abort_scan) 7988 return -EOPNOTSUPP; 7989 7990 if (rdev->scan_msg) 7991 return 0; 7992 7993 if (!rdev->scan_req) 7994 return -ENOENT; 7995 7996 rdev_abort_scan(rdev, wdev); 7997 return 0; 7998 } 7999 8000 static int 8001 nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans, 8002 struct cfg80211_sched_scan_request *request, 8003 struct nlattr **attrs) 8004 { 8005 int tmp, err, i = 0; 8006 struct nlattr *attr; 8007 8008 if (!attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) { 8009 u32 interval; 8010 8011 /* 8012 * If scan plans are not specified, 8013 * %NL80211_ATTR_SCHED_SCAN_INTERVAL will be specified. In this 8014 * case one scan plan will be set with the specified scan 8015 * interval and infinite number of iterations. 8016 */ 8017 interval = nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]); 8018 if (!interval) 8019 return -EINVAL; 8020 8021 request->scan_plans[0].interval = 8022 DIV_ROUND_UP(interval, MSEC_PER_SEC); 8023 if (!request->scan_plans[0].interval) 8024 return -EINVAL; 8025 8026 if (request->scan_plans[0].interval > 8027 wiphy->max_sched_scan_plan_interval) 8028 request->scan_plans[0].interval = 8029 wiphy->max_sched_scan_plan_interval; 8030 8031 return 0; 8032 } 8033 8034 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) { 8035 struct nlattr *plan[NL80211_SCHED_SCAN_PLAN_MAX + 1]; 8036 8037 if (WARN_ON(i >= n_plans)) 8038 return -EINVAL; 8039 8040 err = nla_parse_nested_deprecated(plan, 8041 NL80211_SCHED_SCAN_PLAN_MAX, 8042 attr, nl80211_plan_policy, 8043 NULL); 8044 if (err) 8045 return err; 8046 8047 if (!plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]) 8048 return -EINVAL; 8049 8050 request->scan_plans[i].interval = 8051 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]); 8052 if (!request->scan_plans[i].interval || 8053 request->scan_plans[i].interval > 8054 wiphy->max_sched_scan_plan_interval) 8055 return -EINVAL; 8056 8057 if (plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]) { 8058 request->scan_plans[i].iterations = 8059 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]); 8060 if (!request->scan_plans[i].iterations || 8061 (request->scan_plans[i].iterations > 8062 wiphy->max_sched_scan_plan_iterations)) 8063 return -EINVAL; 8064 } else if (i < n_plans - 1) { 8065 /* 8066 * All scan plans but the last one must specify 8067 * a finite number of iterations 8068 */ 8069 return -EINVAL; 8070 } 8071 8072 i++; 8073 } 8074 8075 /* 8076 * The last scan plan must not specify the number of 8077 * iterations, it is supposed to run infinitely 8078 */ 8079 if (request->scan_plans[n_plans - 1].iterations) 8080 return -EINVAL; 8081 8082 return 0; 8083 } 8084 8085 static int 8086 nl80211_parse_sched_scan_per_band_rssi(struct wiphy *wiphy, 8087 struct cfg80211_match_set *match_sets, 8088 struct nlattr *tb_band_rssi, 8089 s32 rssi_thold) 8090 { 8091 struct nlattr *attr; 8092 int i, tmp, ret = 0; 8093 8094 if (!wiphy_ext_feature_isset(wiphy, 8095 NL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD)) { 8096 if (tb_band_rssi) 8097 ret = -EOPNOTSUPP; 8098 else 8099 for (i = 0; i < NUM_NL80211_BANDS; i++) 8100 match_sets->per_band_rssi_thold[i] = 8101 NL80211_SCAN_RSSI_THOLD_OFF; 8102 return ret; 8103 } 8104 8105 for (i = 0; i < NUM_NL80211_BANDS; i++) 8106 match_sets->per_band_rssi_thold[i] = rssi_thold; 8107 8108 nla_for_each_nested(attr, tb_band_rssi, tmp) { 8109 enum nl80211_band band = nla_type(attr); 8110 8111 if (band < 0 || band >= NUM_NL80211_BANDS) 8112 return -EINVAL; 8113 8114 match_sets->per_band_rssi_thold[band] = nla_get_s32(attr); 8115 } 8116 8117 return 0; 8118 } 8119 8120 static struct cfg80211_sched_scan_request * 8121 nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev, 8122 struct nlattr **attrs, int max_match_sets) 8123 { 8124 struct cfg80211_sched_scan_request *request; 8125 struct nlattr *attr; 8126 int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i, n_plans = 0; 8127 enum nl80211_band band; 8128 size_t ie_len; 8129 struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1]; 8130 s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF; 8131 8132 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 8133 n_channels = validate_scan_freqs( 8134 attrs[NL80211_ATTR_SCAN_FREQUENCIES]); 8135 if (!n_channels) 8136 return ERR_PTR(-EINVAL); 8137 } else { 8138 n_channels = ieee80211_get_num_supported_channels(wiphy); 8139 } 8140 8141 if (attrs[NL80211_ATTR_SCAN_SSIDS]) 8142 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS], 8143 tmp) 8144 n_ssids++; 8145 8146 if (n_ssids > wiphy->max_sched_scan_ssids) 8147 return ERR_PTR(-EINVAL); 8148 8149 /* 8150 * First, count the number of 'real' matchsets. Due to an issue with 8151 * the old implementation, matchsets containing only the RSSI attribute 8152 * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default' 8153 * RSSI for all matchsets, rather than their own matchset for reporting 8154 * all APs with a strong RSSI. This is needed to be compatible with 8155 * older userspace that treated a matchset with only the RSSI as the 8156 * global RSSI for all other matchsets - if there are other matchsets. 8157 */ 8158 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 8159 nla_for_each_nested(attr, 8160 attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 8161 tmp) { 8162 struct nlattr *rssi; 8163 8164 err = nla_parse_nested_deprecated(tb, 8165 NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 8166 attr, 8167 nl80211_match_policy, 8168 NULL); 8169 if (err) 8170 return ERR_PTR(err); 8171 8172 /* SSID and BSSID are mutually exclusive */ 8173 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] && 8174 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) 8175 return ERR_PTR(-EINVAL); 8176 8177 /* add other standalone attributes here */ 8178 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] || 8179 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) { 8180 n_match_sets++; 8181 continue; 8182 } 8183 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 8184 if (rssi) 8185 default_match_rssi = nla_get_s32(rssi); 8186 } 8187 } 8188 8189 /* However, if there's no other matchset, add the RSSI one */ 8190 if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF) 8191 n_match_sets = 1; 8192 8193 if (n_match_sets > max_match_sets) 8194 return ERR_PTR(-EINVAL); 8195 8196 if (attrs[NL80211_ATTR_IE]) 8197 ie_len = nla_len(attrs[NL80211_ATTR_IE]); 8198 else 8199 ie_len = 0; 8200 8201 if (ie_len > wiphy->max_sched_scan_ie_len) 8202 return ERR_PTR(-EINVAL); 8203 8204 if (attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) { 8205 /* 8206 * NL80211_ATTR_SCHED_SCAN_INTERVAL must not be specified since 8207 * each scan plan already specifies its own interval 8208 */ 8209 if (attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 8210 return ERR_PTR(-EINVAL); 8211 8212 nla_for_each_nested(attr, 8213 attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) 8214 n_plans++; 8215 } else { 8216 /* 8217 * The scan interval attribute is kept for backward 8218 * compatibility. If no scan plans are specified and sched scan 8219 * interval is specified, one scan plan will be set with this 8220 * scan interval and infinite number of iterations. 8221 */ 8222 if (!attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 8223 return ERR_PTR(-EINVAL); 8224 8225 n_plans = 1; 8226 } 8227 8228 if (!n_plans || n_plans > wiphy->max_sched_scan_plans) 8229 return ERR_PTR(-EINVAL); 8230 8231 if (!wiphy_ext_feature_isset( 8232 wiphy, NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI) && 8233 (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] || 8234 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST])) 8235 return ERR_PTR(-EINVAL); 8236 8237 request = kzalloc(sizeof(*request) 8238 + sizeof(*request->ssids) * n_ssids 8239 + sizeof(*request->match_sets) * n_match_sets 8240 + sizeof(*request->scan_plans) * n_plans 8241 + sizeof(*request->channels) * n_channels 8242 + ie_len, GFP_KERNEL); 8243 if (!request) 8244 return ERR_PTR(-ENOMEM); 8245 8246 if (n_ssids) 8247 request->ssids = (void *)&request->channels[n_channels]; 8248 request->n_ssids = n_ssids; 8249 if (ie_len) { 8250 if (n_ssids) 8251 request->ie = (void *)(request->ssids + n_ssids); 8252 else 8253 request->ie = (void *)(request->channels + n_channels); 8254 } 8255 8256 if (n_match_sets) { 8257 if (request->ie) 8258 request->match_sets = (void *)(request->ie + ie_len); 8259 else if (n_ssids) 8260 request->match_sets = 8261 (void *)(request->ssids + n_ssids); 8262 else 8263 request->match_sets = 8264 (void *)(request->channels + n_channels); 8265 } 8266 request->n_match_sets = n_match_sets; 8267 8268 if (n_match_sets) 8269 request->scan_plans = (void *)(request->match_sets + 8270 n_match_sets); 8271 else if (request->ie) 8272 request->scan_plans = (void *)(request->ie + ie_len); 8273 else if (n_ssids) 8274 request->scan_plans = (void *)(request->ssids + n_ssids); 8275 else 8276 request->scan_plans = (void *)(request->channels + n_channels); 8277 8278 request->n_scan_plans = n_plans; 8279 8280 i = 0; 8281 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 8282 /* user specified, bail out if channel not found */ 8283 nla_for_each_nested(attr, 8284 attrs[NL80211_ATTR_SCAN_FREQUENCIES], 8285 tmp) { 8286 struct ieee80211_channel *chan; 8287 8288 chan = ieee80211_get_channel(wiphy, nla_get_u32(attr)); 8289 8290 if (!chan) { 8291 err = -EINVAL; 8292 goto out_free; 8293 } 8294 8295 /* ignore disabled channels */ 8296 if (chan->flags & IEEE80211_CHAN_DISABLED) 8297 continue; 8298 8299 request->channels[i] = chan; 8300 i++; 8301 } 8302 } else { 8303 /* all channels */ 8304 for (band = 0; band < NUM_NL80211_BANDS; band++) { 8305 int j; 8306 8307 if (!wiphy->bands[band]) 8308 continue; 8309 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 8310 struct ieee80211_channel *chan; 8311 8312 chan = &wiphy->bands[band]->channels[j]; 8313 8314 if (chan->flags & IEEE80211_CHAN_DISABLED) 8315 continue; 8316 8317 request->channels[i] = chan; 8318 i++; 8319 } 8320 } 8321 } 8322 8323 if (!i) { 8324 err = -EINVAL; 8325 goto out_free; 8326 } 8327 8328 request->n_channels = i; 8329 8330 i = 0; 8331 if (n_ssids) { 8332 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS], 8333 tmp) { 8334 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 8335 err = -EINVAL; 8336 goto out_free; 8337 } 8338 request->ssids[i].ssid_len = nla_len(attr); 8339 memcpy(request->ssids[i].ssid, nla_data(attr), 8340 nla_len(attr)); 8341 i++; 8342 } 8343 } 8344 8345 i = 0; 8346 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 8347 nla_for_each_nested(attr, 8348 attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 8349 tmp) { 8350 struct nlattr *ssid, *bssid, *rssi; 8351 8352 err = nla_parse_nested_deprecated(tb, 8353 NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 8354 attr, 8355 nl80211_match_policy, 8356 NULL); 8357 if (err) 8358 goto out_free; 8359 ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID]; 8360 bssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]; 8361 8362 if (!ssid && !bssid) { 8363 i++; 8364 continue; 8365 } 8366 8367 if (WARN_ON(i >= n_match_sets)) { 8368 /* this indicates a programming error, 8369 * the loop above should have verified 8370 * things properly 8371 */ 8372 err = -EINVAL; 8373 goto out_free; 8374 } 8375 8376 if (ssid) { 8377 if (nla_len(ssid) > IEEE80211_MAX_SSID_LEN) { 8378 err = -EINVAL; 8379 goto out_free; 8380 } 8381 memcpy(request->match_sets[i].ssid.ssid, 8382 nla_data(ssid), nla_len(ssid)); 8383 request->match_sets[i].ssid.ssid_len = 8384 nla_len(ssid); 8385 } 8386 if (bssid) { 8387 if (nla_len(bssid) != ETH_ALEN) { 8388 err = -EINVAL; 8389 goto out_free; 8390 } 8391 memcpy(request->match_sets[i].bssid, 8392 nla_data(bssid), ETH_ALEN); 8393 } 8394 8395 /* special attribute - old implementation w/a */ 8396 request->match_sets[i].rssi_thold = default_match_rssi; 8397 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 8398 if (rssi) 8399 request->match_sets[i].rssi_thold = 8400 nla_get_s32(rssi); 8401 8402 /* Parse per band RSSI attribute */ 8403 err = nl80211_parse_sched_scan_per_band_rssi(wiphy, 8404 &request->match_sets[i], 8405 tb[NL80211_SCHED_SCAN_MATCH_PER_BAND_RSSI], 8406 request->match_sets[i].rssi_thold); 8407 if (err) 8408 goto out_free; 8409 8410 i++; 8411 } 8412 8413 /* there was no other matchset, so the RSSI one is alone */ 8414 if (i == 0 && n_match_sets) 8415 request->match_sets[0].rssi_thold = default_match_rssi; 8416 8417 request->min_rssi_thold = INT_MAX; 8418 for (i = 0; i < n_match_sets; i++) 8419 request->min_rssi_thold = 8420 min(request->match_sets[i].rssi_thold, 8421 request->min_rssi_thold); 8422 } else { 8423 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF; 8424 } 8425 8426 if (ie_len) { 8427 request->ie_len = ie_len; 8428 memcpy((void *)request->ie, 8429 nla_data(attrs[NL80211_ATTR_IE]), 8430 request->ie_len); 8431 } 8432 8433 err = nl80211_check_scan_flags(wiphy, wdev, request, attrs, true); 8434 if (err) 8435 goto out_free; 8436 8437 if (attrs[NL80211_ATTR_SCHED_SCAN_DELAY]) 8438 request->delay = 8439 nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_DELAY]); 8440 8441 if (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]) { 8442 request->relative_rssi = nla_get_s8( 8443 attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]); 8444 request->relative_rssi_set = true; 8445 } 8446 8447 if (request->relative_rssi_set && 8448 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]) { 8449 struct nl80211_bss_select_rssi_adjust *rssi_adjust; 8450 8451 rssi_adjust = nla_data( 8452 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]); 8453 request->rssi_adjust.band = rssi_adjust->band; 8454 request->rssi_adjust.delta = rssi_adjust->delta; 8455 if (!is_band_valid(wiphy, request->rssi_adjust.band)) { 8456 err = -EINVAL; 8457 goto out_free; 8458 } 8459 } 8460 8461 err = nl80211_parse_sched_scan_plans(wiphy, n_plans, request, attrs); 8462 if (err) 8463 goto out_free; 8464 8465 request->scan_start = jiffies; 8466 8467 return request; 8468 8469 out_free: 8470 kfree(request); 8471 return ERR_PTR(err); 8472 } 8473 8474 static int nl80211_start_sched_scan(struct sk_buff *skb, 8475 struct genl_info *info) 8476 { 8477 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8478 struct net_device *dev = info->user_ptr[1]; 8479 struct wireless_dev *wdev = dev->ieee80211_ptr; 8480 struct cfg80211_sched_scan_request *sched_scan_req; 8481 bool want_multi; 8482 int err; 8483 8484 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start) 8485 return -EOPNOTSUPP; 8486 8487 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI]; 8488 err = cfg80211_sched_scan_req_possible(rdev, want_multi); 8489 if (err) 8490 return err; 8491 8492 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev, 8493 info->attrs, 8494 rdev->wiphy.max_match_sets); 8495 8496 err = PTR_ERR_OR_ZERO(sched_scan_req); 8497 if (err) 8498 goto out_err; 8499 8500 /* leave request id zero for legacy request 8501 * or if driver does not support multi-scheduled scan 8502 */ 8503 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) 8504 sched_scan_req->reqid = cfg80211_assign_cookie(rdev); 8505 8506 err = rdev_sched_scan_start(rdev, dev, sched_scan_req); 8507 if (err) 8508 goto out_free; 8509 8510 sched_scan_req->dev = dev; 8511 sched_scan_req->wiphy = &rdev->wiphy; 8512 8513 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 8514 sched_scan_req->owner_nlportid = info->snd_portid; 8515 8516 cfg80211_add_sched_scan_req(rdev, sched_scan_req); 8517 8518 nl80211_send_sched_scan(sched_scan_req, NL80211_CMD_START_SCHED_SCAN); 8519 return 0; 8520 8521 out_free: 8522 kfree(sched_scan_req); 8523 out_err: 8524 return err; 8525 } 8526 8527 static int nl80211_stop_sched_scan(struct sk_buff *skb, 8528 struct genl_info *info) 8529 { 8530 struct cfg80211_sched_scan_request *req; 8531 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8532 u64 cookie; 8533 8534 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop) 8535 return -EOPNOTSUPP; 8536 8537 if (info->attrs[NL80211_ATTR_COOKIE]) { 8538 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 8539 return __cfg80211_stop_sched_scan(rdev, cookie, false); 8540 } 8541 8542 req = list_first_or_null_rcu(&rdev->sched_scan_req_list, 8543 struct cfg80211_sched_scan_request, 8544 list); 8545 if (!req || req->reqid || 8546 (req->owner_nlportid && 8547 req->owner_nlportid != info->snd_portid)) 8548 return -ENOENT; 8549 8550 return cfg80211_stop_sched_scan_req(rdev, req, false); 8551 } 8552 8553 static int nl80211_start_radar_detection(struct sk_buff *skb, 8554 struct genl_info *info) 8555 { 8556 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8557 struct net_device *dev = info->user_ptr[1]; 8558 struct wireless_dev *wdev = dev->ieee80211_ptr; 8559 struct wiphy *wiphy = wdev->wiphy; 8560 struct cfg80211_chan_def chandef; 8561 enum nl80211_dfs_regions dfs_region; 8562 unsigned int cac_time_ms; 8563 int err; 8564 8565 dfs_region = reg_get_dfs_region(wiphy); 8566 if (dfs_region == NL80211_DFS_UNSET) 8567 return -EINVAL; 8568 8569 err = nl80211_parse_chandef(rdev, info, &chandef); 8570 if (err) 8571 return err; 8572 8573 if (netif_carrier_ok(dev)) 8574 return -EBUSY; 8575 8576 if (wdev->cac_started) 8577 return -EBUSY; 8578 8579 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); 8580 if (err < 0) 8581 return err; 8582 8583 if (err == 0) 8584 return -EINVAL; 8585 8586 if (!cfg80211_chandef_dfs_usable(wiphy, &chandef)) 8587 return -EINVAL; 8588 8589 /* CAC start is offloaded to HW and can't be started manually */ 8590 if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD)) 8591 return -EOPNOTSUPP; 8592 8593 if (!rdev->ops->start_radar_detection) 8594 return -EOPNOTSUPP; 8595 8596 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); 8597 if (WARN_ON(!cac_time_ms)) 8598 cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS; 8599 8600 err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms); 8601 if (!err) { 8602 wdev->chandef = chandef; 8603 wdev->cac_started = true; 8604 wdev->cac_start_time = jiffies; 8605 wdev->cac_time_ms = cac_time_ms; 8606 } 8607 return err; 8608 } 8609 8610 static int nl80211_notify_radar_detection(struct sk_buff *skb, 8611 struct genl_info *info) 8612 { 8613 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8614 struct net_device *dev = info->user_ptr[1]; 8615 struct wireless_dev *wdev = dev->ieee80211_ptr; 8616 struct wiphy *wiphy = wdev->wiphy; 8617 struct cfg80211_chan_def chandef; 8618 enum nl80211_dfs_regions dfs_region; 8619 int err; 8620 8621 dfs_region = reg_get_dfs_region(wiphy); 8622 if (dfs_region == NL80211_DFS_UNSET) { 8623 GENL_SET_ERR_MSG(info, 8624 "DFS Region is not set. Unexpected Radar indication"); 8625 return -EINVAL; 8626 } 8627 8628 err = nl80211_parse_chandef(rdev, info, &chandef); 8629 if (err) { 8630 GENL_SET_ERR_MSG(info, "Unable to extract chandef info"); 8631 return err; 8632 } 8633 8634 err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype); 8635 if (err < 0) { 8636 GENL_SET_ERR_MSG(info, "chandef is invalid"); 8637 return err; 8638 } 8639 8640 if (err == 0) { 8641 GENL_SET_ERR_MSG(info, 8642 "Unexpected Radar indication for chandef/iftype"); 8643 return -EINVAL; 8644 } 8645 8646 /* Do not process this notification if radar is already detected 8647 * by kernel on this channel, and return success. 8648 */ 8649 if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE) 8650 return 0; 8651 8652 cfg80211_set_dfs_state(wiphy, &chandef, NL80211_DFS_UNAVAILABLE); 8653 8654 cfg80211_sched_dfs_chan_update(rdev); 8655 8656 rdev->radar_chandef = chandef; 8657 8658 /* Propagate this notification to other radios as well */ 8659 queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); 8660 8661 return 0; 8662 } 8663 8664 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info) 8665 { 8666 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8667 struct net_device *dev = info->user_ptr[1]; 8668 struct wireless_dev *wdev = dev->ieee80211_ptr; 8669 struct cfg80211_csa_settings params; 8670 /* csa_attrs is defined static to avoid waste of stack size - this 8671 * function is called under RTNL lock, so this should not be a problem. 8672 */ 8673 static struct nlattr *csa_attrs[NL80211_ATTR_MAX+1]; 8674 int err; 8675 bool need_new_beacon = false; 8676 bool need_handle_dfs_flag = true; 8677 int len, i; 8678 u32 cs_count; 8679 8680 if (!rdev->ops->channel_switch || 8681 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) 8682 return -EOPNOTSUPP; 8683 8684 switch (dev->ieee80211_ptr->iftype) { 8685 case NL80211_IFTYPE_AP: 8686 case NL80211_IFTYPE_P2P_GO: 8687 need_new_beacon = true; 8688 /* For all modes except AP the handle_dfs flag needs to be 8689 * supplied to tell the kernel that userspace will handle radar 8690 * events when they happen. Otherwise a switch to a channel 8691 * requiring DFS will be rejected. 8692 */ 8693 need_handle_dfs_flag = false; 8694 8695 /* useless if AP is not running */ 8696 if (!wdev->beacon_interval) 8697 return -ENOTCONN; 8698 break; 8699 case NL80211_IFTYPE_ADHOC: 8700 if (!wdev->ssid_len) 8701 return -ENOTCONN; 8702 break; 8703 case NL80211_IFTYPE_MESH_POINT: 8704 if (!wdev->mesh_id_len) 8705 return -ENOTCONN; 8706 break; 8707 default: 8708 return -EOPNOTSUPP; 8709 } 8710 8711 memset(¶ms, 0, sizeof(params)); 8712 params.beacon_csa.ftm_responder = -1; 8713 8714 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 8715 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) 8716 return -EINVAL; 8717 8718 /* only important for AP, IBSS and mesh create IEs internally */ 8719 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) 8720 return -EINVAL; 8721 8722 /* Even though the attribute is u32, the specification says 8723 * u8, so let's make sure we don't overflow. 8724 */ 8725 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); 8726 if (cs_count > 255) 8727 return -EINVAL; 8728 8729 params.count = cs_count; 8730 8731 if (!need_new_beacon) 8732 goto skip_beacons; 8733 8734 err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_after); 8735 if (err) 8736 return err; 8737 8738 err = nla_parse_nested_deprecated(csa_attrs, NL80211_ATTR_MAX, 8739 info->attrs[NL80211_ATTR_CSA_IES], 8740 nl80211_policy, info->extack); 8741 if (err) 8742 return err; 8743 8744 err = nl80211_parse_beacon(rdev, csa_attrs, ¶ms.beacon_csa); 8745 if (err) 8746 return err; 8747 8748 if (!csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]) 8749 return -EINVAL; 8750 8751 len = nla_len(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]); 8752 if (!len || (len % sizeof(u16))) 8753 return -EINVAL; 8754 8755 params.n_counter_offsets_beacon = len / sizeof(u16); 8756 if (rdev->wiphy.max_num_csa_counters && 8757 (params.n_counter_offsets_beacon > 8758 rdev->wiphy.max_num_csa_counters)) 8759 return -EINVAL; 8760 8761 params.counter_offsets_beacon = 8762 nla_data(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]); 8763 8764 /* sanity checks - counters should fit and be the same */ 8765 for (i = 0; i < params.n_counter_offsets_beacon; i++) { 8766 u16 offset = params.counter_offsets_beacon[i]; 8767 8768 if (offset >= params.beacon_csa.tail_len) 8769 return -EINVAL; 8770 8771 if (params.beacon_csa.tail[offset] != params.count) 8772 return -EINVAL; 8773 } 8774 8775 if (csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]) { 8776 len = nla_len(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]); 8777 if (!len || (len % sizeof(u16))) 8778 return -EINVAL; 8779 8780 params.n_counter_offsets_presp = len / sizeof(u16); 8781 if (rdev->wiphy.max_num_csa_counters && 8782 (params.n_counter_offsets_presp > 8783 rdev->wiphy.max_num_csa_counters)) 8784 return -EINVAL; 8785 8786 params.counter_offsets_presp = 8787 nla_data(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]); 8788 8789 /* sanity checks - counters should fit and be the same */ 8790 for (i = 0; i < params.n_counter_offsets_presp; i++) { 8791 u16 offset = params.counter_offsets_presp[i]; 8792 8793 if (offset >= params.beacon_csa.probe_resp_len) 8794 return -EINVAL; 8795 8796 if (params.beacon_csa.probe_resp[offset] != 8797 params.count) 8798 return -EINVAL; 8799 } 8800 } 8801 8802 skip_beacons: 8803 err = nl80211_parse_chandef(rdev, info, ¶ms.chandef); 8804 if (err) 8805 return err; 8806 8807 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, 8808 wdev->iftype)) 8809 return -EINVAL; 8810 8811 err = cfg80211_chandef_dfs_required(wdev->wiphy, 8812 ¶ms.chandef, 8813 wdev->iftype); 8814 if (err < 0) 8815 return err; 8816 8817 if (err > 0) { 8818 params.radar_required = true; 8819 if (need_handle_dfs_flag && 8820 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) { 8821 return -EINVAL; 8822 } 8823 } 8824 8825 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) 8826 params.block_tx = true; 8827 8828 wdev_lock(wdev); 8829 err = rdev_channel_switch(rdev, dev, ¶ms); 8830 wdev_unlock(wdev); 8831 8832 return err; 8833 } 8834 8835 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb, 8836 u32 seq, int flags, 8837 struct cfg80211_registered_device *rdev, 8838 struct wireless_dev *wdev, 8839 struct cfg80211_internal_bss *intbss) 8840 { 8841 struct cfg80211_bss *res = &intbss->pub; 8842 const struct cfg80211_bss_ies *ies; 8843 void *hdr; 8844 struct nlattr *bss; 8845 8846 ASSERT_WDEV_LOCK(wdev); 8847 8848 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 8849 NL80211_CMD_NEW_SCAN_RESULTS); 8850 if (!hdr) 8851 return -1; 8852 8853 genl_dump_check_consistent(cb, hdr); 8854 8855 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) 8856 goto nla_put_failure; 8857 if (wdev->netdev && 8858 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) 8859 goto nla_put_failure; 8860 if (nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 8861 NL80211_ATTR_PAD)) 8862 goto nla_put_failure; 8863 8864 bss = nla_nest_start_noflag(msg, NL80211_ATTR_BSS); 8865 if (!bss) 8866 goto nla_put_failure; 8867 if ((!is_zero_ether_addr(res->bssid) && 8868 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) 8869 goto nla_put_failure; 8870 8871 rcu_read_lock(); 8872 /* indicate whether we have probe response data or not */ 8873 if (rcu_access_pointer(res->proberesp_ies) && 8874 nla_put_flag(msg, NL80211_BSS_PRESP_DATA)) 8875 goto fail_unlock_rcu; 8876 8877 /* this pointer prefers to be pointed to probe response data 8878 * but is always valid 8879 */ 8880 ies = rcu_dereference(res->ies); 8881 if (ies) { 8882 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf, 8883 NL80211_BSS_PAD)) 8884 goto fail_unlock_rcu; 8885 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, 8886 ies->len, ies->data)) 8887 goto fail_unlock_rcu; 8888 } 8889 8890 /* and this pointer is always (unless driver didn't know) beacon data */ 8891 ies = rcu_dereference(res->beacon_ies); 8892 if (ies && ies->from_beacon) { 8893 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf, 8894 NL80211_BSS_PAD)) 8895 goto fail_unlock_rcu; 8896 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, 8897 ies->len, ies->data)) 8898 goto fail_unlock_rcu; 8899 } 8900 rcu_read_unlock(); 8901 8902 if (res->beacon_interval && 8903 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) 8904 goto nla_put_failure; 8905 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || 8906 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || 8907 nla_put_u32(msg, NL80211_BSS_CHAN_WIDTH, res->scan_width) || 8908 nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO, 8909 jiffies_to_msecs(jiffies - intbss->ts))) 8910 goto nla_put_failure; 8911 8912 if (intbss->parent_tsf && 8913 (nla_put_u64_64bit(msg, NL80211_BSS_PARENT_TSF, 8914 intbss->parent_tsf, NL80211_BSS_PAD) || 8915 nla_put(msg, NL80211_BSS_PARENT_BSSID, ETH_ALEN, 8916 intbss->parent_bssid))) 8917 goto nla_put_failure; 8918 8919 if (intbss->ts_boottime && 8920 nla_put_u64_64bit(msg, NL80211_BSS_LAST_SEEN_BOOTTIME, 8921 intbss->ts_boottime, NL80211_BSS_PAD)) 8922 goto nla_put_failure; 8923 8924 if (!nl80211_put_signal(msg, intbss->pub.chains, 8925 intbss->pub.chain_signal, 8926 NL80211_BSS_CHAIN_SIGNAL)) 8927 goto nla_put_failure; 8928 8929 switch (rdev->wiphy.signal_type) { 8930 case CFG80211_SIGNAL_TYPE_MBM: 8931 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal)) 8932 goto nla_put_failure; 8933 break; 8934 case CFG80211_SIGNAL_TYPE_UNSPEC: 8935 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal)) 8936 goto nla_put_failure; 8937 break; 8938 default: 8939 break; 8940 } 8941 8942 switch (wdev->iftype) { 8943 case NL80211_IFTYPE_P2P_CLIENT: 8944 case NL80211_IFTYPE_STATION: 8945 if (intbss == wdev->current_bss && 8946 nla_put_u32(msg, NL80211_BSS_STATUS, 8947 NL80211_BSS_STATUS_ASSOCIATED)) 8948 goto nla_put_failure; 8949 break; 8950 case NL80211_IFTYPE_ADHOC: 8951 if (intbss == wdev->current_bss && 8952 nla_put_u32(msg, NL80211_BSS_STATUS, 8953 NL80211_BSS_STATUS_IBSS_JOINED)) 8954 goto nla_put_failure; 8955 break; 8956 default: 8957 break; 8958 } 8959 8960 nla_nest_end(msg, bss); 8961 8962 genlmsg_end(msg, hdr); 8963 return 0; 8964 8965 fail_unlock_rcu: 8966 rcu_read_unlock(); 8967 nla_put_failure: 8968 genlmsg_cancel(msg, hdr); 8969 return -EMSGSIZE; 8970 } 8971 8972 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb) 8973 { 8974 struct cfg80211_registered_device *rdev; 8975 struct cfg80211_internal_bss *scan; 8976 struct wireless_dev *wdev; 8977 int start = cb->args[2], idx = 0; 8978 int err; 8979 8980 rtnl_lock(); 8981 err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev); 8982 if (err) { 8983 rtnl_unlock(); 8984 return err; 8985 } 8986 8987 wdev_lock(wdev); 8988 spin_lock_bh(&rdev->bss_lock); 8989 8990 /* 8991 * dump_scan will be called multiple times to break up the scan results 8992 * into multiple messages. It is unlikely that any more bss-es will be 8993 * expired after the first call, so only call only call this on the 8994 * first dump_scan invocation. 8995 */ 8996 if (start == 0) 8997 cfg80211_bss_expire(rdev); 8998 8999 cb->seq = rdev->bss_generation; 9000 9001 list_for_each_entry(scan, &rdev->bss_list, list) { 9002 if (++idx <= start) 9003 continue; 9004 if (nl80211_send_bss(skb, cb, 9005 cb->nlh->nlmsg_seq, NLM_F_MULTI, 9006 rdev, wdev, scan) < 0) { 9007 idx--; 9008 break; 9009 } 9010 } 9011 9012 spin_unlock_bh(&rdev->bss_lock); 9013 wdev_unlock(wdev); 9014 9015 cb->args[2] = idx; 9016 rtnl_unlock(); 9017 9018 return skb->len; 9019 } 9020 9021 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq, 9022 int flags, struct net_device *dev, 9023 bool allow_radio_stats, 9024 struct survey_info *survey) 9025 { 9026 void *hdr; 9027 struct nlattr *infoattr; 9028 9029 /* skip radio stats if userspace didn't request them */ 9030 if (!survey->channel && !allow_radio_stats) 9031 return 0; 9032 9033 hdr = nl80211hdr_put(msg, portid, seq, flags, 9034 NL80211_CMD_NEW_SURVEY_RESULTS); 9035 if (!hdr) 9036 return -ENOMEM; 9037 9038 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 9039 goto nla_put_failure; 9040 9041 infoattr = nla_nest_start_noflag(msg, NL80211_ATTR_SURVEY_INFO); 9042 if (!infoattr) 9043 goto nla_put_failure; 9044 9045 if (survey->channel && 9046 nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY, 9047 survey->channel->center_freq)) 9048 goto nla_put_failure; 9049 9050 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && 9051 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) 9052 goto nla_put_failure; 9053 if ((survey->filled & SURVEY_INFO_IN_USE) && 9054 nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE)) 9055 goto nla_put_failure; 9056 if ((survey->filled & SURVEY_INFO_TIME) && 9057 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME, 9058 survey->time, NL80211_SURVEY_INFO_PAD)) 9059 goto nla_put_failure; 9060 if ((survey->filled & SURVEY_INFO_TIME_BUSY) && 9061 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BUSY, 9062 survey->time_busy, NL80211_SURVEY_INFO_PAD)) 9063 goto nla_put_failure; 9064 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) && 9065 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_EXT_BUSY, 9066 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD)) 9067 goto nla_put_failure; 9068 if ((survey->filled & SURVEY_INFO_TIME_RX) && 9069 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_RX, 9070 survey->time_rx, NL80211_SURVEY_INFO_PAD)) 9071 goto nla_put_failure; 9072 if ((survey->filled & SURVEY_INFO_TIME_TX) && 9073 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_TX, 9074 survey->time_tx, NL80211_SURVEY_INFO_PAD)) 9075 goto nla_put_failure; 9076 if ((survey->filled & SURVEY_INFO_TIME_SCAN) && 9077 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_SCAN, 9078 survey->time_scan, NL80211_SURVEY_INFO_PAD)) 9079 goto nla_put_failure; 9080 if ((survey->filled & SURVEY_INFO_TIME_BSS_RX) && 9081 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BSS_RX, 9082 survey->time_bss_rx, NL80211_SURVEY_INFO_PAD)) 9083 goto nla_put_failure; 9084 9085 nla_nest_end(msg, infoattr); 9086 9087 genlmsg_end(msg, hdr); 9088 return 0; 9089 9090 nla_put_failure: 9091 genlmsg_cancel(msg, hdr); 9092 return -EMSGSIZE; 9093 } 9094 9095 static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb) 9096 { 9097 struct nlattr **attrbuf; 9098 struct survey_info survey; 9099 struct cfg80211_registered_device *rdev; 9100 struct wireless_dev *wdev; 9101 int survey_idx = cb->args[2]; 9102 int res; 9103 bool radio_stats; 9104 9105 attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf), GFP_KERNEL); 9106 if (!attrbuf) 9107 return -ENOMEM; 9108 9109 rtnl_lock(); 9110 res = nl80211_prepare_wdev_dump(cb, &rdev, &wdev); 9111 if (res) 9112 goto out_err; 9113 9114 /* prepare_wdev_dump parsed the attributes */ 9115 radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS]; 9116 9117 if (!wdev->netdev) { 9118 res = -EINVAL; 9119 goto out_err; 9120 } 9121 9122 if (!rdev->ops->dump_survey) { 9123 res = -EOPNOTSUPP; 9124 goto out_err; 9125 } 9126 9127 while (1) { 9128 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey); 9129 if (res == -ENOENT) 9130 break; 9131 if (res) 9132 goto out_err; 9133 9134 /* don't send disabled channels, but do send non-channel data */ 9135 if (survey.channel && 9136 survey.channel->flags & IEEE80211_CHAN_DISABLED) { 9137 survey_idx++; 9138 continue; 9139 } 9140 9141 if (nl80211_send_survey(skb, 9142 NETLINK_CB(cb->skb).portid, 9143 cb->nlh->nlmsg_seq, NLM_F_MULTI, 9144 wdev->netdev, radio_stats, &survey) < 0) 9145 goto out; 9146 survey_idx++; 9147 } 9148 9149 out: 9150 cb->args[2] = survey_idx; 9151 res = skb->len; 9152 out_err: 9153 kfree(attrbuf); 9154 rtnl_unlock(); 9155 return res; 9156 } 9157 9158 static bool nl80211_valid_wpa_versions(u32 wpa_versions) 9159 { 9160 return !(wpa_versions & ~(NL80211_WPA_VERSION_1 | 9161 NL80211_WPA_VERSION_2 | 9162 NL80211_WPA_VERSION_3)); 9163 } 9164 9165 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info) 9166 { 9167 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9168 struct net_device *dev = info->user_ptr[1]; 9169 struct ieee80211_channel *chan; 9170 const u8 *bssid, *ssid, *ie = NULL, *auth_data = NULL; 9171 int err, ssid_len, ie_len = 0, auth_data_len = 0; 9172 enum nl80211_auth_type auth_type; 9173 struct key_parse key; 9174 bool local_state_change; 9175 9176 if (!info->attrs[NL80211_ATTR_MAC]) 9177 return -EINVAL; 9178 9179 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) 9180 return -EINVAL; 9181 9182 if (!info->attrs[NL80211_ATTR_SSID]) 9183 return -EINVAL; 9184 9185 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 9186 return -EINVAL; 9187 9188 err = nl80211_parse_key(info, &key); 9189 if (err) 9190 return err; 9191 9192 if (key.idx >= 0) { 9193 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) 9194 return -EINVAL; 9195 if (!key.p.key || !key.p.key_len) 9196 return -EINVAL; 9197 if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 || 9198 key.p.key_len != WLAN_KEY_LEN_WEP40) && 9199 (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 || 9200 key.p.key_len != WLAN_KEY_LEN_WEP104)) 9201 return -EINVAL; 9202 if (key.idx > 3) 9203 return -EINVAL; 9204 } else { 9205 key.p.key_len = 0; 9206 key.p.key = NULL; 9207 } 9208 9209 if (key.idx >= 0) { 9210 int i; 9211 bool ok = false; 9212 9213 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { 9214 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { 9215 ok = true; 9216 break; 9217 } 9218 } 9219 if (!ok) 9220 return -EINVAL; 9221 } 9222 9223 if (!rdev->ops->auth) 9224 return -EOPNOTSUPP; 9225 9226 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 9227 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 9228 return -EOPNOTSUPP; 9229 9230 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 9231 chan = nl80211_get_valid_chan(&rdev->wiphy, 9232 info->attrs[NL80211_ATTR_WIPHY_FREQ]); 9233 if (!chan) 9234 return -EINVAL; 9235 9236 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 9237 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 9238 9239 if (info->attrs[NL80211_ATTR_IE]) { 9240 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 9241 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 9242 } 9243 9244 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 9245 if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE)) 9246 return -EINVAL; 9247 9248 if ((auth_type == NL80211_AUTHTYPE_SAE || 9249 auth_type == NL80211_AUTHTYPE_FILS_SK || 9250 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 9251 auth_type == NL80211_AUTHTYPE_FILS_PK) && 9252 !info->attrs[NL80211_ATTR_AUTH_DATA]) 9253 return -EINVAL; 9254 9255 if (info->attrs[NL80211_ATTR_AUTH_DATA]) { 9256 if (auth_type != NL80211_AUTHTYPE_SAE && 9257 auth_type != NL80211_AUTHTYPE_FILS_SK && 9258 auth_type != NL80211_AUTHTYPE_FILS_SK_PFS && 9259 auth_type != NL80211_AUTHTYPE_FILS_PK) 9260 return -EINVAL; 9261 auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]); 9262 auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]); 9263 /* need to include at least Auth Transaction and Status Code */ 9264 if (auth_data_len < 4) 9265 return -EINVAL; 9266 } 9267 9268 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 9269 9270 /* 9271 * Since we no longer track auth state, ignore 9272 * requests to only change local state. 9273 */ 9274 if (local_state_change) 9275 return 0; 9276 9277 wdev_lock(dev->ieee80211_ptr); 9278 err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, 9279 ssid, ssid_len, ie, ie_len, 9280 key.p.key, key.p.key_len, key.idx, 9281 auth_data, auth_data_len); 9282 wdev_unlock(dev->ieee80211_ptr); 9283 return err; 9284 } 9285 9286 static int validate_pae_over_nl80211(struct cfg80211_registered_device *rdev, 9287 struct genl_info *info) 9288 { 9289 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 9290 GENL_SET_ERR_MSG(info, "SOCKET_OWNER not set"); 9291 return -EINVAL; 9292 } 9293 9294 if (!rdev->ops->tx_control_port || 9295 !wiphy_ext_feature_isset(&rdev->wiphy, 9296 NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211)) 9297 return -EOPNOTSUPP; 9298 9299 return 0; 9300 } 9301 9302 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, 9303 struct genl_info *info, 9304 struct cfg80211_crypto_settings *settings, 9305 int cipher_limit) 9306 { 9307 memset(settings, 0, sizeof(*settings)); 9308 9309 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; 9310 9311 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { 9312 u16 proto; 9313 9314 proto = nla_get_u16( 9315 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); 9316 settings->control_port_ethertype = cpu_to_be16(proto); 9317 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && 9318 proto != ETH_P_PAE) 9319 return -EINVAL; 9320 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) 9321 settings->control_port_no_encrypt = true; 9322 } else 9323 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); 9324 9325 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 9326 int r = validate_pae_over_nl80211(rdev, info); 9327 9328 if (r < 0) 9329 return r; 9330 9331 settings->control_port_over_nl80211 = true; 9332 9333 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH]) 9334 settings->control_port_no_preauth = true; 9335 } 9336 9337 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { 9338 void *data; 9339 int len, i; 9340 9341 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 9342 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 9343 settings->n_ciphers_pairwise = len / sizeof(u32); 9344 9345 if (len % sizeof(u32)) 9346 return -EINVAL; 9347 9348 if (settings->n_ciphers_pairwise > cipher_limit) 9349 return -EINVAL; 9350 9351 memcpy(settings->ciphers_pairwise, data, len); 9352 9353 for (i = 0; i < settings->n_ciphers_pairwise; i++) 9354 if (!cfg80211_supported_cipher_suite( 9355 &rdev->wiphy, 9356 settings->ciphers_pairwise[i])) 9357 return -EINVAL; 9358 } 9359 9360 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { 9361 settings->cipher_group = 9362 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); 9363 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, 9364 settings->cipher_group)) 9365 return -EINVAL; 9366 } 9367 9368 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) { 9369 settings->wpa_versions = 9370 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); 9371 if (!nl80211_valid_wpa_versions(settings->wpa_versions)) 9372 return -EINVAL; 9373 } 9374 9375 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { 9376 void *data; 9377 int len; 9378 9379 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); 9380 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); 9381 settings->n_akm_suites = len / sizeof(u32); 9382 9383 if (len % sizeof(u32)) 9384 return -EINVAL; 9385 9386 if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES) 9387 return -EINVAL; 9388 9389 memcpy(settings->akm_suites, data, len); 9390 } 9391 9392 if (info->attrs[NL80211_ATTR_PMK]) { 9393 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN) 9394 return -EINVAL; 9395 if (!wiphy_ext_feature_isset(&rdev->wiphy, 9396 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK)) 9397 return -EINVAL; 9398 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]); 9399 } 9400 9401 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) { 9402 if (!wiphy_ext_feature_isset(&rdev->wiphy, 9403 NL80211_EXT_FEATURE_SAE_OFFLOAD)) 9404 return -EINVAL; 9405 settings->sae_pwd = 9406 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]); 9407 settings->sae_pwd_len = 9408 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]); 9409 } 9410 9411 return 0; 9412 } 9413 9414 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info) 9415 { 9416 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9417 struct net_device *dev = info->user_ptr[1]; 9418 struct ieee80211_channel *chan; 9419 struct cfg80211_assoc_request req = {}; 9420 const u8 *bssid, *ssid; 9421 int err, ssid_len = 0; 9422 9423 if (dev->ieee80211_ptr->conn_owner_nlportid && 9424 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 9425 return -EPERM; 9426 9427 if (!info->attrs[NL80211_ATTR_MAC] || 9428 !info->attrs[NL80211_ATTR_SSID] || 9429 !info->attrs[NL80211_ATTR_WIPHY_FREQ]) 9430 return -EINVAL; 9431 9432 if (!rdev->ops->assoc) 9433 return -EOPNOTSUPP; 9434 9435 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 9436 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 9437 return -EOPNOTSUPP; 9438 9439 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 9440 9441 chan = nl80211_get_valid_chan(&rdev->wiphy, 9442 info->attrs[NL80211_ATTR_WIPHY_FREQ]); 9443 if (!chan) 9444 return -EINVAL; 9445 9446 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 9447 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 9448 9449 if (info->attrs[NL80211_ATTR_IE]) { 9450 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 9451 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 9452 } 9453 9454 if (info->attrs[NL80211_ATTR_USE_MFP]) { 9455 enum nl80211_mfp mfp = 9456 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 9457 if (mfp == NL80211_MFP_REQUIRED) 9458 req.use_mfp = true; 9459 else if (mfp != NL80211_MFP_NO) 9460 return -EINVAL; 9461 } 9462 9463 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 9464 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 9465 9466 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 9467 req.flags |= ASSOC_REQ_DISABLE_HT; 9468 9469 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 9470 memcpy(&req.ht_capa_mask, 9471 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 9472 sizeof(req.ht_capa_mask)); 9473 9474 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 9475 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 9476 return -EINVAL; 9477 memcpy(&req.ht_capa, 9478 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 9479 sizeof(req.ht_capa)); 9480 } 9481 9482 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 9483 req.flags |= ASSOC_REQ_DISABLE_VHT; 9484 9485 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 9486 memcpy(&req.vht_capa_mask, 9487 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 9488 sizeof(req.vht_capa_mask)); 9489 9490 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 9491 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 9492 return -EINVAL; 9493 memcpy(&req.vht_capa, 9494 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 9495 sizeof(req.vht_capa)); 9496 } 9497 9498 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { 9499 if (!((rdev->wiphy.features & 9500 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) && 9501 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && 9502 !wiphy_ext_feature_isset(&rdev->wiphy, 9503 NL80211_EXT_FEATURE_RRM)) 9504 return -EINVAL; 9505 req.flags |= ASSOC_REQ_USE_RRM; 9506 } 9507 9508 if (info->attrs[NL80211_ATTR_FILS_KEK]) { 9509 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); 9510 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); 9511 if (!info->attrs[NL80211_ATTR_FILS_NONCES]) 9512 return -EINVAL; 9513 req.fils_nonces = 9514 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); 9515 } 9516 9517 err = nl80211_crypto_settings(rdev, info, &req.crypto, 1); 9518 if (!err) { 9519 wdev_lock(dev->ieee80211_ptr); 9520 9521 err = cfg80211_mlme_assoc(rdev, dev, chan, bssid, 9522 ssid, ssid_len, &req); 9523 9524 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 9525 dev->ieee80211_ptr->conn_owner_nlportid = 9526 info->snd_portid; 9527 memcpy(dev->ieee80211_ptr->disconnect_bssid, 9528 bssid, ETH_ALEN); 9529 } 9530 9531 wdev_unlock(dev->ieee80211_ptr); 9532 } 9533 9534 return err; 9535 } 9536 9537 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info) 9538 { 9539 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9540 struct net_device *dev = info->user_ptr[1]; 9541 const u8 *ie = NULL, *bssid; 9542 int ie_len = 0, err; 9543 u16 reason_code; 9544 bool local_state_change; 9545 9546 if (dev->ieee80211_ptr->conn_owner_nlportid && 9547 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 9548 return -EPERM; 9549 9550 if (!info->attrs[NL80211_ATTR_MAC]) 9551 return -EINVAL; 9552 9553 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 9554 return -EINVAL; 9555 9556 if (!rdev->ops->deauth) 9557 return -EOPNOTSUPP; 9558 9559 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 9560 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 9561 return -EOPNOTSUPP; 9562 9563 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 9564 9565 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 9566 if (reason_code == 0) { 9567 /* Reason Code 0 is reserved */ 9568 return -EINVAL; 9569 } 9570 9571 if (info->attrs[NL80211_ATTR_IE]) { 9572 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 9573 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 9574 } 9575 9576 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 9577 9578 wdev_lock(dev->ieee80211_ptr); 9579 err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code, 9580 local_state_change); 9581 wdev_unlock(dev->ieee80211_ptr); 9582 return err; 9583 } 9584 9585 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) 9586 { 9587 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9588 struct net_device *dev = info->user_ptr[1]; 9589 const u8 *ie = NULL, *bssid; 9590 int ie_len = 0, err; 9591 u16 reason_code; 9592 bool local_state_change; 9593 9594 if (dev->ieee80211_ptr->conn_owner_nlportid && 9595 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 9596 return -EPERM; 9597 9598 if (!info->attrs[NL80211_ATTR_MAC]) 9599 return -EINVAL; 9600 9601 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 9602 return -EINVAL; 9603 9604 if (!rdev->ops->disassoc) 9605 return -EOPNOTSUPP; 9606 9607 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 9608 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 9609 return -EOPNOTSUPP; 9610 9611 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 9612 9613 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 9614 if (reason_code == 0) { 9615 /* Reason Code 0 is reserved */ 9616 return -EINVAL; 9617 } 9618 9619 if (info->attrs[NL80211_ATTR_IE]) { 9620 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 9621 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 9622 } 9623 9624 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 9625 9626 wdev_lock(dev->ieee80211_ptr); 9627 err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code, 9628 local_state_change); 9629 wdev_unlock(dev->ieee80211_ptr); 9630 return err; 9631 } 9632 9633 static bool 9634 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev, 9635 int mcast_rate[NUM_NL80211_BANDS], 9636 int rateval) 9637 { 9638 struct wiphy *wiphy = &rdev->wiphy; 9639 bool found = false; 9640 int band, i; 9641 9642 for (band = 0; band < NUM_NL80211_BANDS; band++) { 9643 struct ieee80211_supported_band *sband; 9644 9645 sband = wiphy->bands[band]; 9646 if (!sband) 9647 continue; 9648 9649 for (i = 0; i < sband->n_bitrates; i++) { 9650 if (sband->bitrates[i].bitrate == rateval) { 9651 mcast_rate[band] = i + 1; 9652 found = true; 9653 break; 9654 } 9655 } 9656 } 9657 9658 return found; 9659 } 9660 9661 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info) 9662 { 9663 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9664 struct net_device *dev = info->user_ptr[1]; 9665 struct cfg80211_ibss_params ibss; 9666 struct wiphy *wiphy; 9667 struct cfg80211_cached_keys *connkeys = NULL; 9668 int err; 9669 9670 memset(&ibss, 0, sizeof(ibss)); 9671 9672 if (!info->attrs[NL80211_ATTR_SSID] || 9673 !nla_len(info->attrs[NL80211_ATTR_SSID])) 9674 return -EINVAL; 9675 9676 ibss.beacon_interval = 100; 9677 9678 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) 9679 ibss.beacon_interval = 9680 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 9681 9682 err = cfg80211_validate_beacon_int(rdev, NL80211_IFTYPE_ADHOC, 9683 ibss.beacon_interval); 9684 if (err) 9685 return err; 9686 9687 if (!rdev->ops->join_ibss) 9688 return -EOPNOTSUPP; 9689 9690 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 9691 return -EOPNOTSUPP; 9692 9693 wiphy = &rdev->wiphy; 9694 9695 if (info->attrs[NL80211_ATTR_MAC]) { 9696 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 9697 9698 if (!is_valid_ether_addr(ibss.bssid)) 9699 return -EINVAL; 9700 } 9701 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 9702 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 9703 9704 if (info->attrs[NL80211_ATTR_IE]) { 9705 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 9706 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 9707 } 9708 9709 err = nl80211_parse_chandef(rdev, info, &ibss.chandef); 9710 if (err) 9711 return err; 9712 9713 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef, 9714 NL80211_IFTYPE_ADHOC)) 9715 return -EINVAL; 9716 9717 switch (ibss.chandef.width) { 9718 case NL80211_CHAN_WIDTH_5: 9719 case NL80211_CHAN_WIDTH_10: 9720 case NL80211_CHAN_WIDTH_20_NOHT: 9721 break; 9722 case NL80211_CHAN_WIDTH_20: 9723 case NL80211_CHAN_WIDTH_40: 9724 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) 9725 return -EINVAL; 9726 break; 9727 case NL80211_CHAN_WIDTH_80: 9728 case NL80211_CHAN_WIDTH_80P80: 9729 case NL80211_CHAN_WIDTH_160: 9730 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) 9731 return -EINVAL; 9732 if (!wiphy_ext_feature_isset(&rdev->wiphy, 9733 NL80211_EXT_FEATURE_VHT_IBSS)) 9734 return -EINVAL; 9735 break; 9736 default: 9737 return -EINVAL; 9738 } 9739 9740 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; 9741 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 9742 9743 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 9744 u8 *rates = 9745 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 9746 int n_rates = 9747 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 9748 struct ieee80211_supported_band *sband = 9749 wiphy->bands[ibss.chandef.chan->band]; 9750 9751 err = ieee80211_get_ratemask(sband, rates, n_rates, 9752 &ibss.basic_rates); 9753 if (err) 9754 return err; 9755 } 9756 9757 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 9758 memcpy(&ibss.ht_capa_mask, 9759 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 9760 sizeof(ibss.ht_capa_mask)); 9761 9762 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 9763 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 9764 return -EINVAL; 9765 memcpy(&ibss.ht_capa, 9766 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 9767 sizeof(ibss.ht_capa)); 9768 } 9769 9770 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 9771 !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate, 9772 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 9773 return -EINVAL; 9774 9775 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { 9776 bool no_ht = false; 9777 9778 connkeys = nl80211_parse_connkeys(rdev, info, &no_ht); 9779 if (IS_ERR(connkeys)) 9780 return PTR_ERR(connkeys); 9781 9782 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) && 9783 no_ht) { 9784 kzfree(connkeys); 9785 return -EINVAL; 9786 } 9787 } 9788 9789 ibss.control_port = 9790 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); 9791 9792 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 9793 int r = validate_pae_over_nl80211(rdev, info); 9794 9795 if (r < 0) { 9796 kzfree(connkeys); 9797 return r; 9798 } 9799 9800 ibss.control_port_over_nl80211 = true; 9801 } 9802 9803 ibss.userspace_handles_dfs = 9804 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 9805 9806 wdev_lock(dev->ieee80211_ptr); 9807 err = __cfg80211_join_ibss(rdev, dev, &ibss, connkeys); 9808 if (err) 9809 kzfree(connkeys); 9810 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 9811 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 9812 wdev_unlock(dev->ieee80211_ptr); 9813 9814 return err; 9815 } 9816 9817 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info) 9818 { 9819 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9820 struct net_device *dev = info->user_ptr[1]; 9821 9822 if (!rdev->ops->leave_ibss) 9823 return -EOPNOTSUPP; 9824 9825 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 9826 return -EOPNOTSUPP; 9827 9828 return cfg80211_leave_ibss(rdev, dev, false); 9829 } 9830 9831 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info) 9832 { 9833 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9834 struct net_device *dev = info->user_ptr[1]; 9835 int mcast_rate[NUM_NL80211_BANDS]; 9836 u32 nla_rate; 9837 int err; 9838 9839 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && 9840 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && 9841 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) 9842 return -EOPNOTSUPP; 9843 9844 if (!rdev->ops->set_mcast_rate) 9845 return -EOPNOTSUPP; 9846 9847 memset(mcast_rate, 0, sizeof(mcast_rate)); 9848 9849 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) 9850 return -EINVAL; 9851 9852 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); 9853 if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate)) 9854 return -EINVAL; 9855 9856 err = rdev_set_mcast_rate(rdev, dev, mcast_rate); 9857 9858 return err; 9859 } 9860 9861 static struct sk_buff * 9862 __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev, 9863 struct wireless_dev *wdev, int approxlen, 9864 u32 portid, u32 seq, enum nl80211_commands cmd, 9865 enum nl80211_attrs attr, 9866 const struct nl80211_vendor_cmd_info *info, 9867 gfp_t gfp) 9868 { 9869 struct sk_buff *skb; 9870 void *hdr; 9871 struct nlattr *data; 9872 9873 skb = nlmsg_new(approxlen + 100, gfp); 9874 if (!skb) 9875 return NULL; 9876 9877 hdr = nl80211hdr_put(skb, portid, seq, 0, cmd); 9878 if (!hdr) { 9879 kfree_skb(skb); 9880 return NULL; 9881 } 9882 9883 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 9884 goto nla_put_failure; 9885 9886 if (info) { 9887 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID, 9888 info->vendor_id)) 9889 goto nla_put_failure; 9890 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD, 9891 info->subcmd)) 9892 goto nla_put_failure; 9893 } 9894 9895 if (wdev) { 9896 if (nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 9897 wdev_id(wdev), NL80211_ATTR_PAD)) 9898 goto nla_put_failure; 9899 if (wdev->netdev && 9900 nla_put_u32(skb, NL80211_ATTR_IFINDEX, 9901 wdev->netdev->ifindex)) 9902 goto nla_put_failure; 9903 } 9904 9905 data = nla_nest_start_noflag(skb, attr); 9906 if (!data) 9907 goto nla_put_failure; 9908 9909 ((void **)skb->cb)[0] = rdev; 9910 ((void **)skb->cb)[1] = hdr; 9911 ((void **)skb->cb)[2] = data; 9912 9913 return skb; 9914 9915 nla_put_failure: 9916 kfree_skb(skb); 9917 return NULL; 9918 } 9919 9920 struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy, 9921 struct wireless_dev *wdev, 9922 enum nl80211_commands cmd, 9923 enum nl80211_attrs attr, 9924 unsigned int portid, 9925 int vendor_event_idx, 9926 int approxlen, gfp_t gfp) 9927 { 9928 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 9929 const struct nl80211_vendor_cmd_info *info; 9930 9931 switch (cmd) { 9932 case NL80211_CMD_TESTMODE: 9933 if (WARN_ON(vendor_event_idx != -1)) 9934 return NULL; 9935 info = NULL; 9936 break; 9937 case NL80211_CMD_VENDOR: 9938 if (WARN_ON(vendor_event_idx < 0 || 9939 vendor_event_idx >= wiphy->n_vendor_events)) 9940 return NULL; 9941 info = &wiphy->vendor_events[vendor_event_idx]; 9942 break; 9943 default: 9944 WARN_ON(1); 9945 return NULL; 9946 } 9947 9948 return __cfg80211_alloc_vendor_skb(rdev, wdev, approxlen, portid, 0, 9949 cmd, attr, info, gfp); 9950 } 9951 EXPORT_SYMBOL(__cfg80211_alloc_event_skb); 9952 9953 void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp) 9954 { 9955 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 9956 void *hdr = ((void **)skb->cb)[1]; 9957 struct nlmsghdr *nlhdr = nlmsg_hdr(skb); 9958 struct nlattr *data = ((void **)skb->cb)[2]; 9959 enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE; 9960 9961 /* clear CB data for netlink core to own from now on */ 9962 memset(skb->cb, 0, sizeof(skb->cb)); 9963 9964 nla_nest_end(skb, data); 9965 genlmsg_end(skb, hdr); 9966 9967 if (nlhdr->nlmsg_pid) { 9968 genlmsg_unicast(wiphy_net(&rdev->wiphy), skb, 9969 nlhdr->nlmsg_pid); 9970 } else { 9971 if (data->nla_type == NL80211_ATTR_VENDOR_DATA) 9972 mcgrp = NL80211_MCGRP_VENDOR; 9973 9974 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 9975 skb, 0, mcgrp, gfp); 9976 } 9977 } 9978 EXPORT_SYMBOL(__cfg80211_send_event_skb); 9979 9980 #ifdef CONFIG_NL80211_TESTMODE 9981 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) 9982 { 9983 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9984 struct wireless_dev *wdev = 9985 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs); 9986 int err; 9987 9988 if (!rdev->ops->testmode_cmd) 9989 return -EOPNOTSUPP; 9990 9991 if (IS_ERR(wdev)) { 9992 err = PTR_ERR(wdev); 9993 if (err != -EINVAL) 9994 return err; 9995 wdev = NULL; 9996 } else if (wdev->wiphy != &rdev->wiphy) { 9997 return -EINVAL; 9998 } 9999 10000 if (!info->attrs[NL80211_ATTR_TESTDATA]) 10001 return -EINVAL; 10002 10003 rdev->cur_cmd_info = info; 10004 err = rdev_testmode_cmd(rdev, wdev, 10005 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), 10006 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); 10007 rdev->cur_cmd_info = NULL; 10008 10009 return err; 10010 } 10011 10012 static int nl80211_testmode_dump(struct sk_buff *skb, 10013 struct netlink_callback *cb) 10014 { 10015 struct cfg80211_registered_device *rdev; 10016 struct nlattr **attrbuf = NULL; 10017 int err; 10018 long phy_idx; 10019 void *data = NULL; 10020 int data_len = 0; 10021 10022 rtnl_lock(); 10023 10024 if (cb->args[0]) { 10025 /* 10026 * 0 is a valid index, but not valid for args[0], 10027 * so we need to offset by 1. 10028 */ 10029 phy_idx = cb->args[0] - 1; 10030 10031 rdev = cfg80211_rdev_by_wiphy_idx(phy_idx); 10032 if (!rdev) { 10033 err = -ENOENT; 10034 goto out_err; 10035 } 10036 } else { 10037 attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf), 10038 GFP_KERNEL); 10039 if (!attrbuf) { 10040 err = -ENOMEM; 10041 goto out_err; 10042 } 10043 10044 err = nlmsg_parse_deprecated(cb->nlh, 10045 GENL_HDRLEN + nl80211_fam.hdrsize, 10046 attrbuf, nl80211_fam.maxattr, 10047 nl80211_policy, NULL); 10048 if (err) 10049 goto out_err; 10050 10051 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); 10052 if (IS_ERR(rdev)) { 10053 err = PTR_ERR(rdev); 10054 goto out_err; 10055 } 10056 phy_idx = rdev->wiphy_idx; 10057 10058 if (attrbuf[NL80211_ATTR_TESTDATA]) 10059 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; 10060 } 10061 10062 if (cb->args[1]) { 10063 data = nla_data((void *)cb->args[1]); 10064 data_len = nla_len((void *)cb->args[1]); 10065 } 10066 10067 if (!rdev->ops->testmode_dump) { 10068 err = -EOPNOTSUPP; 10069 goto out_err; 10070 } 10071 10072 while (1) { 10073 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 10074 cb->nlh->nlmsg_seq, NLM_F_MULTI, 10075 NL80211_CMD_TESTMODE); 10076 struct nlattr *tmdata; 10077 10078 if (!hdr) 10079 break; 10080 10081 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) { 10082 genlmsg_cancel(skb, hdr); 10083 break; 10084 } 10085 10086 tmdata = nla_nest_start_noflag(skb, NL80211_ATTR_TESTDATA); 10087 if (!tmdata) { 10088 genlmsg_cancel(skb, hdr); 10089 break; 10090 } 10091 err = rdev_testmode_dump(rdev, skb, cb, data, data_len); 10092 nla_nest_end(skb, tmdata); 10093 10094 if (err == -ENOBUFS || err == -ENOENT) { 10095 genlmsg_cancel(skb, hdr); 10096 break; 10097 } else if (err) { 10098 genlmsg_cancel(skb, hdr); 10099 goto out_err; 10100 } 10101 10102 genlmsg_end(skb, hdr); 10103 } 10104 10105 err = skb->len; 10106 /* see above */ 10107 cb->args[0] = phy_idx + 1; 10108 out_err: 10109 kfree(attrbuf); 10110 rtnl_unlock(); 10111 return err; 10112 } 10113 #endif 10114 10115 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info) 10116 { 10117 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10118 struct net_device *dev = info->user_ptr[1]; 10119 struct cfg80211_connect_params connect; 10120 struct wiphy *wiphy; 10121 struct cfg80211_cached_keys *connkeys = NULL; 10122 int err; 10123 10124 memset(&connect, 0, sizeof(connect)); 10125 10126 if (!info->attrs[NL80211_ATTR_SSID] || 10127 !nla_len(info->attrs[NL80211_ATTR_SSID])) 10128 return -EINVAL; 10129 10130 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 10131 connect.auth_type = 10132 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 10133 if (!nl80211_valid_auth_type(rdev, connect.auth_type, 10134 NL80211_CMD_CONNECT)) 10135 return -EINVAL; 10136 } else 10137 connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC; 10138 10139 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; 10140 10141 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] && 10142 !wiphy_ext_feature_isset(&rdev->wiphy, 10143 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 10144 return -EINVAL; 10145 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS]; 10146 10147 err = nl80211_crypto_settings(rdev, info, &connect.crypto, 10148 NL80211_MAX_NR_CIPHER_SUITES); 10149 if (err) 10150 return err; 10151 10152 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 10153 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 10154 return -EOPNOTSUPP; 10155 10156 wiphy = &rdev->wiphy; 10157 10158 connect.bg_scan_period = -1; 10159 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && 10160 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { 10161 connect.bg_scan_period = 10162 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); 10163 } 10164 10165 if (info->attrs[NL80211_ATTR_MAC]) 10166 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 10167 else if (info->attrs[NL80211_ATTR_MAC_HINT]) 10168 connect.bssid_hint = 10169 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]); 10170 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 10171 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 10172 10173 if (info->attrs[NL80211_ATTR_IE]) { 10174 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 10175 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 10176 } 10177 10178 if (info->attrs[NL80211_ATTR_USE_MFP]) { 10179 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 10180 if (connect.mfp == NL80211_MFP_OPTIONAL && 10181 !wiphy_ext_feature_isset(&rdev->wiphy, 10182 NL80211_EXT_FEATURE_MFP_OPTIONAL)) 10183 return -EOPNOTSUPP; 10184 } else { 10185 connect.mfp = NL80211_MFP_NO; 10186 } 10187 10188 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 10189 connect.prev_bssid = 10190 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 10191 10192 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 10193 connect.channel = nl80211_get_valid_chan( 10194 wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ]); 10195 if (!connect.channel) 10196 return -EINVAL; 10197 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) { 10198 connect.channel_hint = nl80211_get_valid_chan( 10199 wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]); 10200 if (!connect.channel_hint) 10201 return -EINVAL; 10202 } 10203 10204 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) { 10205 connect.edmg.channels = 10206 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]); 10207 10208 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]) 10209 connect.edmg.bw_config = 10210 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]); 10211 } 10212 10213 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { 10214 connkeys = nl80211_parse_connkeys(rdev, info, NULL); 10215 if (IS_ERR(connkeys)) 10216 return PTR_ERR(connkeys); 10217 } 10218 10219 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 10220 connect.flags |= ASSOC_REQ_DISABLE_HT; 10221 10222 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 10223 memcpy(&connect.ht_capa_mask, 10224 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 10225 sizeof(connect.ht_capa_mask)); 10226 10227 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 10228 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { 10229 kzfree(connkeys); 10230 return -EINVAL; 10231 } 10232 memcpy(&connect.ht_capa, 10233 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 10234 sizeof(connect.ht_capa)); 10235 } 10236 10237 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 10238 connect.flags |= ASSOC_REQ_DISABLE_VHT; 10239 10240 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 10241 memcpy(&connect.vht_capa_mask, 10242 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 10243 sizeof(connect.vht_capa_mask)); 10244 10245 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 10246 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { 10247 kzfree(connkeys); 10248 return -EINVAL; 10249 } 10250 memcpy(&connect.vht_capa, 10251 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 10252 sizeof(connect.vht_capa)); 10253 } 10254 10255 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { 10256 if (!((rdev->wiphy.features & 10257 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) && 10258 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && 10259 !wiphy_ext_feature_isset(&rdev->wiphy, 10260 NL80211_EXT_FEATURE_RRM)) { 10261 kzfree(connkeys); 10262 return -EINVAL; 10263 } 10264 connect.flags |= ASSOC_REQ_USE_RRM; 10265 } 10266 10267 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); 10268 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { 10269 kzfree(connkeys); 10270 return -EOPNOTSUPP; 10271 } 10272 10273 if (info->attrs[NL80211_ATTR_BSS_SELECT]) { 10274 /* bss selection makes no sense if bssid is set */ 10275 if (connect.bssid) { 10276 kzfree(connkeys); 10277 return -EINVAL; 10278 } 10279 10280 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT], 10281 wiphy, &connect.bss_select); 10282 if (err) { 10283 kzfree(connkeys); 10284 return err; 10285 } 10286 } 10287 10288 if (wiphy_ext_feature_isset(&rdev->wiphy, 10289 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) && 10290 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && 10291 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && 10292 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && 10293 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 10294 connect.fils_erp_username = 10295 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 10296 connect.fils_erp_username_len = 10297 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 10298 connect.fils_erp_realm = 10299 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 10300 connect.fils_erp_realm_len = 10301 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 10302 connect.fils_erp_next_seq_num = 10303 nla_get_u16( 10304 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); 10305 connect.fils_erp_rrk = 10306 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 10307 connect.fils_erp_rrk_len = 10308 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 10309 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || 10310 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || 10311 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || 10312 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 10313 kzfree(connkeys); 10314 return -EINVAL; 10315 } 10316 10317 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) { 10318 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 10319 kzfree(connkeys); 10320 GENL_SET_ERR_MSG(info, 10321 "external auth requires connection ownership"); 10322 return -EINVAL; 10323 } 10324 connect.flags |= CONNECT_REQ_EXTERNAL_AUTH_SUPPORT; 10325 } 10326 10327 wdev_lock(dev->ieee80211_ptr); 10328 10329 err = cfg80211_connect(rdev, dev, &connect, connkeys, 10330 connect.prev_bssid); 10331 if (err) 10332 kzfree(connkeys); 10333 10334 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 10335 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 10336 if (connect.bssid) 10337 memcpy(dev->ieee80211_ptr->disconnect_bssid, 10338 connect.bssid, ETH_ALEN); 10339 else 10340 memset(dev->ieee80211_ptr->disconnect_bssid, 10341 0, ETH_ALEN); 10342 } 10343 10344 wdev_unlock(dev->ieee80211_ptr); 10345 10346 return err; 10347 } 10348 10349 static int nl80211_update_connect_params(struct sk_buff *skb, 10350 struct genl_info *info) 10351 { 10352 struct cfg80211_connect_params connect = {}; 10353 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10354 struct net_device *dev = info->user_ptr[1]; 10355 struct wireless_dev *wdev = dev->ieee80211_ptr; 10356 bool fils_sk_offload; 10357 u32 auth_type; 10358 u32 changed = 0; 10359 int ret; 10360 10361 if (!rdev->ops->update_connect_params) 10362 return -EOPNOTSUPP; 10363 10364 if (info->attrs[NL80211_ATTR_IE]) { 10365 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 10366 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 10367 changed |= UPDATE_ASSOC_IES; 10368 } 10369 10370 fils_sk_offload = wiphy_ext_feature_isset(&rdev->wiphy, 10371 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD); 10372 10373 /* 10374 * when driver supports fils-sk offload all attributes must be 10375 * provided. So the else covers "fils-sk-not-all" and 10376 * "no-fils-sk-any". 10377 */ 10378 if (fils_sk_offload && 10379 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && 10380 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && 10381 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && 10382 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 10383 connect.fils_erp_username = 10384 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 10385 connect.fils_erp_username_len = 10386 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 10387 connect.fils_erp_realm = 10388 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 10389 connect.fils_erp_realm_len = 10390 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 10391 connect.fils_erp_next_seq_num = 10392 nla_get_u16( 10393 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); 10394 connect.fils_erp_rrk = 10395 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 10396 connect.fils_erp_rrk_len = 10397 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 10398 changed |= UPDATE_FILS_ERP_INFO; 10399 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || 10400 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || 10401 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || 10402 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 10403 return -EINVAL; 10404 } 10405 10406 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 10407 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 10408 if (!nl80211_valid_auth_type(rdev, auth_type, 10409 NL80211_CMD_CONNECT)) 10410 return -EINVAL; 10411 10412 if (auth_type == NL80211_AUTHTYPE_FILS_SK && 10413 fils_sk_offload && !(changed & UPDATE_FILS_ERP_INFO)) 10414 return -EINVAL; 10415 10416 connect.auth_type = auth_type; 10417 changed |= UPDATE_AUTH_TYPE; 10418 } 10419 10420 wdev_lock(dev->ieee80211_ptr); 10421 if (!wdev->current_bss) 10422 ret = -ENOLINK; 10423 else 10424 ret = rdev_update_connect_params(rdev, dev, &connect, changed); 10425 wdev_unlock(dev->ieee80211_ptr); 10426 10427 return ret; 10428 } 10429 10430 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info) 10431 { 10432 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10433 struct net_device *dev = info->user_ptr[1]; 10434 u16 reason; 10435 int ret; 10436 10437 if (dev->ieee80211_ptr->conn_owner_nlportid && 10438 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid) 10439 return -EPERM; 10440 10441 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 10442 reason = WLAN_REASON_DEAUTH_LEAVING; 10443 else 10444 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 10445 10446 if (reason == 0) 10447 return -EINVAL; 10448 10449 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 10450 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 10451 return -EOPNOTSUPP; 10452 10453 wdev_lock(dev->ieee80211_ptr); 10454 ret = cfg80211_disconnect(rdev, dev, reason, true); 10455 wdev_unlock(dev->ieee80211_ptr); 10456 return ret; 10457 } 10458 10459 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info) 10460 { 10461 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10462 struct net *net; 10463 int err; 10464 10465 if (info->attrs[NL80211_ATTR_PID]) { 10466 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); 10467 10468 net = get_net_ns_by_pid(pid); 10469 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) { 10470 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]); 10471 10472 net = get_net_ns_by_fd(fd); 10473 } else { 10474 return -EINVAL; 10475 } 10476 10477 if (IS_ERR(net)) 10478 return PTR_ERR(net); 10479 10480 err = 0; 10481 10482 /* check if anything to do */ 10483 if (!net_eq(wiphy_net(&rdev->wiphy), net)) 10484 err = cfg80211_switch_netns(rdev, net); 10485 10486 put_net(net); 10487 return err; 10488 } 10489 10490 static int nl80211_setdel_pmksa(struct sk_buff *skb, struct genl_info *info) 10491 { 10492 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10493 int (*rdev_ops)(struct wiphy *wiphy, struct net_device *dev, 10494 struct cfg80211_pmksa *pmksa) = NULL; 10495 struct net_device *dev = info->user_ptr[1]; 10496 struct cfg80211_pmksa pmksa; 10497 10498 memset(&pmksa, 0, sizeof(struct cfg80211_pmksa)); 10499 10500 if (!info->attrs[NL80211_ATTR_PMKID]) 10501 return -EINVAL; 10502 10503 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 10504 10505 if (info->attrs[NL80211_ATTR_MAC]) { 10506 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 10507 } else if (info->attrs[NL80211_ATTR_SSID] && 10508 info->attrs[NL80211_ATTR_FILS_CACHE_ID] && 10509 (info->genlhdr->cmd == NL80211_CMD_DEL_PMKSA || 10510 info->attrs[NL80211_ATTR_PMK])) { 10511 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 10512 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 10513 pmksa.cache_id = 10514 nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); 10515 } else { 10516 return -EINVAL; 10517 } 10518 if (info->attrs[NL80211_ATTR_PMK]) { 10519 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); 10520 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); 10521 } 10522 10523 if (info->attrs[NL80211_ATTR_PMK_LIFETIME]) 10524 pmksa.pmk_lifetime = 10525 nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]); 10526 10527 if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]) 10528 pmksa.pmk_reauth_threshold = 10529 nla_get_u8( 10530 info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]); 10531 10532 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 10533 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT && 10534 !(dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP && 10535 wiphy_ext_feature_isset(&rdev->wiphy, 10536 NL80211_EXT_FEATURE_AP_PMKSA_CACHING))) 10537 return -EOPNOTSUPP; 10538 10539 switch (info->genlhdr->cmd) { 10540 case NL80211_CMD_SET_PMKSA: 10541 rdev_ops = rdev->ops->set_pmksa; 10542 break; 10543 case NL80211_CMD_DEL_PMKSA: 10544 rdev_ops = rdev->ops->del_pmksa; 10545 break; 10546 default: 10547 WARN_ON(1); 10548 break; 10549 } 10550 10551 if (!rdev_ops) 10552 return -EOPNOTSUPP; 10553 10554 return rdev_ops(&rdev->wiphy, dev, &pmksa); 10555 } 10556 10557 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info) 10558 { 10559 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10560 struct net_device *dev = info->user_ptr[1]; 10561 10562 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 10563 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 10564 return -EOPNOTSUPP; 10565 10566 if (!rdev->ops->flush_pmksa) 10567 return -EOPNOTSUPP; 10568 10569 return rdev_flush_pmksa(rdev, dev); 10570 } 10571 10572 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info) 10573 { 10574 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10575 struct net_device *dev = info->user_ptr[1]; 10576 u8 action_code, dialog_token; 10577 u32 peer_capability = 0; 10578 u16 status_code; 10579 u8 *peer; 10580 bool initiator; 10581 10582 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 10583 !rdev->ops->tdls_mgmt) 10584 return -EOPNOTSUPP; 10585 10586 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || 10587 !info->attrs[NL80211_ATTR_STATUS_CODE] || 10588 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || 10589 !info->attrs[NL80211_ATTR_IE] || 10590 !info->attrs[NL80211_ATTR_MAC]) 10591 return -EINVAL; 10592 10593 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 10594 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); 10595 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 10596 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); 10597 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]); 10598 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]) 10599 peer_capability = 10600 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]); 10601 10602 return rdev_tdls_mgmt(rdev, dev, peer, action_code, 10603 dialog_token, status_code, peer_capability, 10604 initiator, 10605 nla_data(info->attrs[NL80211_ATTR_IE]), 10606 nla_len(info->attrs[NL80211_ATTR_IE])); 10607 } 10608 10609 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info) 10610 { 10611 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10612 struct net_device *dev = info->user_ptr[1]; 10613 enum nl80211_tdls_operation operation; 10614 u8 *peer; 10615 10616 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 10617 !rdev->ops->tdls_oper) 10618 return -EOPNOTSUPP; 10619 10620 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || 10621 !info->attrs[NL80211_ATTR_MAC]) 10622 return -EINVAL; 10623 10624 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); 10625 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 10626 10627 return rdev_tdls_oper(rdev, dev, peer, operation); 10628 } 10629 10630 static int nl80211_remain_on_channel(struct sk_buff *skb, 10631 struct genl_info *info) 10632 { 10633 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10634 struct wireless_dev *wdev = info->user_ptr[1]; 10635 struct cfg80211_chan_def chandef; 10636 const struct cfg80211_chan_def *compat_chandef; 10637 struct sk_buff *msg; 10638 void *hdr; 10639 u64 cookie; 10640 u32 duration; 10641 int err; 10642 10643 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 10644 !info->attrs[NL80211_ATTR_DURATION]) 10645 return -EINVAL; 10646 10647 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 10648 10649 if (!rdev->ops->remain_on_channel || 10650 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) 10651 return -EOPNOTSUPP; 10652 10653 /* 10654 * We should be on that channel for at least a minimum amount of 10655 * time (10ms) but no longer than the driver supports. 10656 */ 10657 if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 10658 duration > rdev->wiphy.max_remain_on_channel_duration) 10659 return -EINVAL; 10660 10661 err = nl80211_parse_chandef(rdev, info, &chandef); 10662 if (err) 10663 return err; 10664 10665 wdev_lock(wdev); 10666 if (!cfg80211_off_channel_oper_allowed(wdev) && 10667 !cfg80211_chandef_identical(&wdev->chandef, &chandef)) { 10668 compat_chandef = cfg80211_chandef_compatible(&wdev->chandef, 10669 &chandef); 10670 if (compat_chandef != &chandef) { 10671 wdev_unlock(wdev); 10672 return -EBUSY; 10673 } 10674 } 10675 wdev_unlock(wdev); 10676 10677 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 10678 if (!msg) 10679 return -ENOMEM; 10680 10681 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 10682 NL80211_CMD_REMAIN_ON_CHANNEL); 10683 if (!hdr) { 10684 err = -ENOBUFS; 10685 goto free_msg; 10686 } 10687 10688 err = rdev_remain_on_channel(rdev, wdev, chandef.chan, 10689 duration, &cookie); 10690 10691 if (err) 10692 goto free_msg; 10693 10694 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 10695 NL80211_ATTR_PAD)) 10696 goto nla_put_failure; 10697 10698 genlmsg_end(msg, hdr); 10699 10700 return genlmsg_reply(msg, info); 10701 10702 nla_put_failure: 10703 err = -ENOBUFS; 10704 free_msg: 10705 nlmsg_free(msg); 10706 return err; 10707 } 10708 10709 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb, 10710 struct genl_info *info) 10711 { 10712 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10713 struct wireless_dev *wdev = info->user_ptr[1]; 10714 u64 cookie; 10715 10716 if (!info->attrs[NL80211_ATTR_COOKIE]) 10717 return -EINVAL; 10718 10719 if (!rdev->ops->cancel_remain_on_channel) 10720 return -EOPNOTSUPP; 10721 10722 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 10723 10724 return rdev_cancel_remain_on_channel(rdev, wdev, cookie); 10725 } 10726 10727 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb, 10728 struct genl_info *info) 10729 { 10730 struct cfg80211_bitrate_mask mask; 10731 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10732 struct net_device *dev = info->user_ptr[1]; 10733 int err; 10734 10735 if (!rdev->ops->set_bitrate_mask) 10736 return -EOPNOTSUPP; 10737 10738 err = nl80211_parse_tx_bitrate_mask(info, &mask); 10739 if (err) 10740 return err; 10741 10742 return rdev_set_bitrate_mask(rdev, dev, NULL, &mask); 10743 } 10744 10745 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info) 10746 { 10747 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10748 struct wireless_dev *wdev = info->user_ptr[1]; 10749 u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION; 10750 10751 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) 10752 return -EINVAL; 10753 10754 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) 10755 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); 10756 10757 switch (wdev->iftype) { 10758 case NL80211_IFTYPE_STATION: 10759 case NL80211_IFTYPE_ADHOC: 10760 case NL80211_IFTYPE_P2P_CLIENT: 10761 case NL80211_IFTYPE_AP: 10762 case NL80211_IFTYPE_AP_VLAN: 10763 case NL80211_IFTYPE_MESH_POINT: 10764 case NL80211_IFTYPE_P2P_GO: 10765 case NL80211_IFTYPE_P2P_DEVICE: 10766 break; 10767 case NL80211_IFTYPE_NAN: 10768 default: 10769 return -EOPNOTSUPP; 10770 } 10771 10772 /* not much point in registering if we can't reply */ 10773 if (!rdev->ops->mgmt_tx) 10774 return -EOPNOTSUPP; 10775 10776 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, 10777 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), 10778 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]), 10779 info->extack); 10780 } 10781 10782 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info) 10783 { 10784 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10785 struct wireless_dev *wdev = info->user_ptr[1]; 10786 struct cfg80211_chan_def chandef; 10787 int err; 10788 void *hdr = NULL; 10789 u64 cookie; 10790 struct sk_buff *msg = NULL; 10791 struct cfg80211_mgmt_tx_params params = { 10792 .dont_wait_for_ack = 10793 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], 10794 }; 10795 10796 if (!info->attrs[NL80211_ATTR_FRAME]) 10797 return -EINVAL; 10798 10799 if (!rdev->ops->mgmt_tx) 10800 return -EOPNOTSUPP; 10801 10802 switch (wdev->iftype) { 10803 case NL80211_IFTYPE_P2P_DEVICE: 10804 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 10805 return -EINVAL; 10806 case NL80211_IFTYPE_STATION: 10807 case NL80211_IFTYPE_ADHOC: 10808 case NL80211_IFTYPE_P2P_CLIENT: 10809 case NL80211_IFTYPE_AP: 10810 case NL80211_IFTYPE_AP_VLAN: 10811 case NL80211_IFTYPE_MESH_POINT: 10812 case NL80211_IFTYPE_P2P_GO: 10813 break; 10814 case NL80211_IFTYPE_NAN: 10815 default: 10816 return -EOPNOTSUPP; 10817 } 10818 10819 if (info->attrs[NL80211_ATTR_DURATION]) { 10820 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 10821 return -EINVAL; 10822 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 10823 10824 /* 10825 * We should wait on the channel for at least a minimum amount 10826 * of time (10ms) but no longer than the driver supports. 10827 */ 10828 if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 10829 params.wait > rdev->wiphy.max_remain_on_channel_duration) 10830 return -EINVAL; 10831 } 10832 10833 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; 10834 10835 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 10836 return -EINVAL; 10837 10838 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 10839 10840 /* get the channel if any has been specified, otherwise pass NULL to 10841 * the driver. The latter will use the current one 10842 */ 10843 chandef.chan = NULL; 10844 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 10845 err = nl80211_parse_chandef(rdev, info, &chandef); 10846 if (err) 10847 return err; 10848 } 10849 10850 if (!chandef.chan && params.offchan) 10851 return -EINVAL; 10852 10853 wdev_lock(wdev); 10854 if (params.offchan && !cfg80211_off_channel_oper_allowed(wdev)) { 10855 wdev_unlock(wdev); 10856 return -EBUSY; 10857 } 10858 wdev_unlock(wdev); 10859 10860 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 10861 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 10862 10863 if (info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]) { 10864 int len = nla_len(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); 10865 int i; 10866 10867 if (len % sizeof(u16)) 10868 return -EINVAL; 10869 10870 params.n_csa_offsets = len / sizeof(u16); 10871 params.csa_offsets = 10872 nla_data(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); 10873 10874 /* check that all the offsets fit the frame */ 10875 for (i = 0; i < params.n_csa_offsets; i++) { 10876 if (params.csa_offsets[i] >= params.len) 10877 return -EINVAL; 10878 } 10879 } 10880 10881 if (!params.dont_wait_for_ack) { 10882 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 10883 if (!msg) 10884 return -ENOMEM; 10885 10886 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 10887 NL80211_CMD_FRAME); 10888 if (!hdr) { 10889 err = -ENOBUFS; 10890 goto free_msg; 10891 } 10892 } 10893 10894 params.chan = chandef.chan; 10895 err = cfg80211_mlme_mgmt_tx(rdev, wdev, ¶ms, &cookie); 10896 if (err) 10897 goto free_msg; 10898 10899 if (msg) { 10900 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 10901 NL80211_ATTR_PAD)) 10902 goto nla_put_failure; 10903 10904 genlmsg_end(msg, hdr); 10905 return genlmsg_reply(msg, info); 10906 } 10907 10908 return 0; 10909 10910 nla_put_failure: 10911 err = -ENOBUFS; 10912 free_msg: 10913 nlmsg_free(msg); 10914 return err; 10915 } 10916 10917 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info) 10918 { 10919 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10920 struct wireless_dev *wdev = info->user_ptr[1]; 10921 u64 cookie; 10922 10923 if (!info->attrs[NL80211_ATTR_COOKIE]) 10924 return -EINVAL; 10925 10926 if (!rdev->ops->mgmt_tx_cancel_wait) 10927 return -EOPNOTSUPP; 10928 10929 switch (wdev->iftype) { 10930 case NL80211_IFTYPE_STATION: 10931 case NL80211_IFTYPE_ADHOC: 10932 case NL80211_IFTYPE_P2P_CLIENT: 10933 case NL80211_IFTYPE_AP: 10934 case NL80211_IFTYPE_AP_VLAN: 10935 case NL80211_IFTYPE_P2P_GO: 10936 case NL80211_IFTYPE_P2P_DEVICE: 10937 break; 10938 case NL80211_IFTYPE_NAN: 10939 default: 10940 return -EOPNOTSUPP; 10941 } 10942 10943 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 10944 10945 return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie); 10946 } 10947 10948 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info) 10949 { 10950 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10951 struct wireless_dev *wdev; 10952 struct net_device *dev = info->user_ptr[1]; 10953 u8 ps_state; 10954 bool state; 10955 int err; 10956 10957 if (!info->attrs[NL80211_ATTR_PS_STATE]) 10958 return -EINVAL; 10959 10960 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); 10961 10962 wdev = dev->ieee80211_ptr; 10963 10964 if (!rdev->ops->set_power_mgmt) 10965 return -EOPNOTSUPP; 10966 10967 state = (ps_state == NL80211_PS_ENABLED) ? true : false; 10968 10969 if (state == wdev->ps) 10970 return 0; 10971 10972 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); 10973 if (!err) 10974 wdev->ps = state; 10975 return err; 10976 } 10977 10978 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info) 10979 { 10980 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10981 enum nl80211_ps_state ps_state; 10982 struct wireless_dev *wdev; 10983 struct net_device *dev = info->user_ptr[1]; 10984 struct sk_buff *msg; 10985 void *hdr; 10986 int err; 10987 10988 wdev = dev->ieee80211_ptr; 10989 10990 if (!rdev->ops->set_power_mgmt) 10991 return -EOPNOTSUPP; 10992 10993 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 10994 if (!msg) 10995 return -ENOMEM; 10996 10997 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 10998 NL80211_CMD_GET_POWER_SAVE); 10999 if (!hdr) { 11000 err = -ENOBUFS; 11001 goto free_msg; 11002 } 11003 11004 if (wdev->ps) 11005 ps_state = NL80211_PS_ENABLED; 11006 else 11007 ps_state = NL80211_PS_DISABLED; 11008 11009 if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state)) 11010 goto nla_put_failure; 11011 11012 genlmsg_end(msg, hdr); 11013 return genlmsg_reply(msg, info); 11014 11015 nla_put_failure: 11016 err = -ENOBUFS; 11017 free_msg: 11018 nlmsg_free(msg); 11019 return err; 11020 } 11021 11022 static const struct nla_policy 11023 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = { 11024 [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_BINARY }, 11025 [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 }, 11026 [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 }, 11027 [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 }, 11028 [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 }, 11029 [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 }, 11030 [NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_S32 }, 11031 }; 11032 11033 static int nl80211_set_cqm_txe(struct genl_info *info, 11034 u32 rate, u32 pkts, u32 intvl) 11035 { 11036 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11037 struct net_device *dev = info->user_ptr[1]; 11038 struct wireless_dev *wdev = dev->ieee80211_ptr; 11039 11040 if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL) 11041 return -EINVAL; 11042 11043 if (!rdev->ops->set_cqm_txe_config) 11044 return -EOPNOTSUPP; 11045 11046 if (wdev->iftype != NL80211_IFTYPE_STATION && 11047 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 11048 return -EOPNOTSUPP; 11049 11050 return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl); 11051 } 11052 11053 static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev, 11054 struct net_device *dev) 11055 { 11056 struct wireless_dev *wdev = dev->ieee80211_ptr; 11057 s32 last, low, high; 11058 u32 hyst; 11059 int i, n, low_index; 11060 int err; 11061 11062 /* RSSI reporting disabled? */ 11063 if (!wdev->cqm_config) 11064 return rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0); 11065 11066 /* 11067 * Obtain current RSSI value if possible, if not and no RSSI threshold 11068 * event has been received yet, we should receive an event after a 11069 * connection is established and enough beacons received to calculate 11070 * the average. 11071 */ 11072 if (!wdev->cqm_config->last_rssi_event_value && wdev->current_bss && 11073 rdev->ops->get_station) { 11074 struct station_info sinfo = {}; 11075 u8 *mac_addr; 11076 11077 mac_addr = wdev->current_bss->pub.bssid; 11078 11079 err = rdev_get_station(rdev, dev, mac_addr, &sinfo); 11080 if (err) 11081 return err; 11082 11083 cfg80211_sinfo_release_content(&sinfo); 11084 if (sinfo.filled & BIT_ULL(NL80211_STA_INFO_BEACON_SIGNAL_AVG)) 11085 wdev->cqm_config->last_rssi_event_value = 11086 (s8) sinfo.rx_beacon_signal_avg; 11087 } 11088 11089 last = wdev->cqm_config->last_rssi_event_value; 11090 hyst = wdev->cqm_config->rssi_hyst; 11091 n = wdev->cqm_config->n_rssi_thresholds; 11092 11093 for (i = 0; i < n; i++) { 11094 i = array_index_nospec(i, n); 11095 if (last < wdev->cqm_config->rssi_thresholds[i]) 11096 break; 11097 } 11098 11099 low_index = i - 1; 11100 if (low_index >= 0) { 11101 low_index = array_index_nospec(low_index, n); 11102 low = wdev->cqm_config->rssi_thresholds[low_index] - hyst; 11103 } else { 11104 low = S32_MIN; 11105 } 11106 if (i < n) { 11107 i = array_index_nospec(i, n); 11108 high = wdev->cqm_config->rssi_thresholds[i] + hyst - 1; 11109 } else { 11110 high = S32_MAX; 11111 } 11112 11113 return rdev_set_cqm_rssi_range_config(rdev, dev, low, high); 11114 } 11115 11116 static int nl80211_set_cqm_rssi(struct genl_info *info, 11117 const s32 *thresholds, int n_thresholds, 11118 u32 hysteresis) 11119 { 11120 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11121 struct net_device *dev = info->user_ptr[1]; 11122 struct wireless_dev *wdev = dev->ieee80211_ptr; 11123 int i, err; 11124 s32 prev = S32_MIN; 11125 11126 /* Check all values negative and sorted */ 11127 for (i = 0; i < n_thresholds; i++) { 11128 if (thresholds[i] > 0 || thresholds[i] <= prev) 11129 return -EINVAL; 11130 11131 prev = thresholds[i]; 11132 } 11133 11134 if (wdev->iftype != NL80211_IFTYPE_STATION && 11135 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 11136 return -EOPNOTSUPP; 11137 11138 wdev_lock(wdev); 11139 cfg80211_cqm_config_free(wdev); 11140 wdev_unlock(wdev); 11141 11142 if (n_thresholds <= 1 && rdev->ops->set_cqm_rssi_config) { 11143 if (n_thresholds == 0 || thresholds[0] == 0) /* Disabling */ 11144 return rdev_set_cqm_rssi_config(rdev, dev, 0, 0); 11145 11146 return rdev_set_cqm_rssi_config(rdev, dev, 11147 thresholds[0], hysteresis); 11148 } 11149 11150 if (!wiphy_ext_feature_isset(&rdev->wiphy, 11151 NL80211_EXT_FEATURE_CQM_RSSI_LIST)) 11152 return -EOPNOTSUPP; 11153 11154 if (n_thresholds == 1 && thresholds[0] == 0) /* Disabling */ 11155 n_thresholds = 0; 11156 11157 wdev_lock(wdev); 11158 if (n_thresholds) { 11159 struct cfg80211_cqm_config *cqm_config; 11160 11161 cqm_config = kzalloc(sizeof(struct cfg80211_cqm_config) + 11162 n_thresholds * sizeof(s32), GFP_KERNEL); 11163 if (!cqm_config) { 11164 err = -ENOMEM; 11165 goto unlock; 11166 } 11167 11168 cqm_config->rssi_hyst = hysteresis; 11169 cqm_config->n_rssi_thresholds = n_thresholds; 11170 memcpy(cqm_config->rssi_thresholds, thresholds, 11171 n_thresholds * sizeof(s32)); 11172 11173 wdev->cqm_config = cqm_config; 11174 } 11175 11176 err = cfg80211_cqm_rssi_update(rdev, dev); 11177 11178 unlock: 11179 wdev_unlock(wdev); 11180 11181 return err; 11182 } 11183 11184 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info) 11185 { 11186 struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1]; 11187 struct nlattr *cqm; 11188 int err; 11189 11190 cqm = info->attrs[NL80211_ATTR_CQM]; 11191 if (!cqm) 11192 return -EINVAL; 11193 11194 err = nla_parse_nested_deprecated(attrs, NL80211_ATTR_CQM_MAX, cqm, 11195 nl80211_attr_cqm_policy, 11196 info->extack); 11197 if (err) 11198 return err; 11199 11200 if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] && 11201 attrs[NL80211_ATTR_CQM_RSSI_HYST]) { 11202 const s32 *thresholds = 11203 nla_data(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 11204 int len = nla_len(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 11205 u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]); 11206 11207 if (len % 4) 11208 return -EINVAL; 11209 11210 return nl80211_set_cqm_rssi(info, thresholds, len / 4, 11211 hysteresis); 11212 } 11213 11214 if (attrs[NL80211_ATTR_CQM_TXE_RATE] && 11215 attrs[NL80211_ATTR_CQM_TXE_PKTS] && 11216 attrs[NL80211_ATTR_CQM_TXE_INTVL]) { 11217 u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]); 11218 u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]); 11219 u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]); 11220 11221 return nl80211_set_cqm_txe(info, rate, pkts, intvl); 11222 } 11223 11224 return -EINVAL; 11225 } 11226 11227 static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info) 11228 { 11229 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11230 struct net_device *dev = info->user_ptr[1]; 11231 struct ocb_setup setup = {}; 11232 int err; 11233 11234 err = nl80211_parse_chandef(rdev, info, &setup.chandef); 11235 if (err) 11236 return err; 11237 11238 return cfg80211_join_ocb(rdev, dev, &setup); 11239 } 11240 11241 static int nl80211_leave_ocb(struct sk_buff *skb, struct genl_info *info) 11242 { 11243 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11244 struct net_device *dev = info->user_ptr[1]; 11245 11246 return cfg80211_leave_ocb(rdev, dev); 11247 } 11248 11249 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info) 11250 { 11251 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11252 struct net_device *dev = info->user_ptr[1]; 11253 struct mesh_config cfg; 11254 struct mesh_setup setup; 11255 int err; 11256 11257 /* start with default */ 11258 memcpy(&cfg, &default_mesh_config, sizeof(cfg)); 11259 memcpy(&setup, &default_mesh_setup, sizeof(setup)); 11260 11261 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { 11262 /* and parse parameters if given */ 11263 err = nl80211_parse_mesh_config(info, &cfg, NULL); 11264 if (err) 11265 return err; 11266 } 11267 11268 if (!info->attrs[NL80211_ATTR_MESH_ID] || 11269 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) 11270 return -EINVAL; 11271 11272 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); 11273 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 11274 11275 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 11276 !nl80211_parse_mcast_rate(rdev, setup.mcast_rate, 11277 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 11278 return -EINVAL; 11279 11280 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { 11281 setup.beacon_interval = 11282 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 11283 11284 err = cfg80211_validate_beacon_int(rdev, 11285 NL80211_IFTYPE_MESH_POINT, 11286 setup.beacon_interval); 11287 if (err) 11288 return err; 11289 } 11290 11291 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { 11292 setup.dtim_period = 11293 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 11294 if (setup.dtim_period < 1 || setup.dtim_period > 100) 11295 return -EINVAL; 11296 } 11297 11298 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { 11299 /* parse additional setup parameters if given */ 11300 err = nl80211_parse_mesh_setup(info, &setup); 11301 if (err) 11302 return err; 11303 } 11304 11305 if (setup.user_mpm) 11306 cfg.auto_open_plinks = false; 11307 11308 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 11309 err = nl80211_parse_chandef(rdev, info, &setup.chandef); 11310 if (err) 11311 return err; 11312 } else { 11313 /* __cfg80211_join_mesh() will sort it out */ 11314 setup.chandef.chan = NULL; 11315 } 11316 11317 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 11318 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 11319 int n_rates = 11320 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 11321 struct ieee80211_supported_band *sband; 11322 11323 if (!setup.chandef.chan) 11324 return -EINVAL; 11325 11326 sband = rdev->wiphy.bands[setup.chandef.chan->band]; 11327 11328 err = ieee80211_get_ratemask(sband, rates, n_rates, 11329 &setup.basic_rates); 11330 if (err) 11331 return err; 11332 } 11333 11334 if (info->attrs[NL80211_ATTR_TX_RATES]) { 11335 err = nl80211_parse_tx_bitrate_mask(info, &setup.beacon_rate); 11336 if (err) 11337 return err; 11338 11339 if (!setup.chandef.chan) 11340 return -EINVAL; 11341 11342 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band, 11343 &setup.beacon_rate); 11344 if (err) 11345 return err; 11346 } 11347 11348 setup.userspace_handles_dfs = 11349 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 11350 11351 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) { 11352 int r = validate_pae_over_nl80211(rdev, info); 11353 11354 if (r < 0) 11355 return r; 11356 11357 setup.control_port_over_nl80211 = true; 11358 } 11359 11360 wdev_lock(dev->ieee80211_ptr); 11361 err = __cfg80211_join_mesh(rdev, dev, &setup, &cfg); 11362 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) 11363 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 11364 wdev_unlock(dev->ieee80211_ptr); 11365 11366 return err; 11367 } 11368 11369 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info) 11370 { 11371 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11372 struct net_device *dev = info->user_ptr[1]; 11373 11374 return cfg80211_leave_mesh(rdev, dev); 11375 } 11376 11377 #ifdef CONFIG_PM 11378 static int nl80211_send_wowlan_patterns(struct sk_buff *msg, 11379 struct cfg80211_registered_device *rdev) 11380 { 11381 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; 11382 struct nlattr *nl_pats, *nl_pat; 11383 int i, pat_len; 11384 11385 if (!wowlan->n_patterns) 11386 return 0; 11387 11388 nl_pats = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN); 11389 if (!nl_pats) 11390 return -ENOBUFS; 11391 11392 for (i = 0; i < wowlan->n_patterns; i++) { 11393 nl_pat = nla_nest_start_noflag(msg, i + 1); 11394 if (!nl_pat) 11395 return -ENOBUFS; 11396 pat_len = wowlan->patterns[i].pattern_len; 11397 if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8), 11398 wowlan->patterns[i].mask) || 11399 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 11400 wowlan->patterns[i].pattern) || 11401 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 11402 wowlan->patterns[i].pkt_offset)) 11403 return -ENOBUFS; 11404 nla_nest_end(msg, nl_pat); 11405 } 11406 nla_nest_end(msg, nl_pats); 11407 11408 return 0; 11409 } 11410 11411 static int nl80211_send_wowlan_tcp(struct sk_buff *msg, 11412 struct cfg80211_wowlan_tcp *tcp) 11413 { 11414 struct nlattr *nl_tcp; 11415 11416 if (!tcp) 11417 return 0; 11418 11419 nl_tcp = nla_nest_start_noflag(msg, 11420 NL80211_WOWLAN_TRIG_TCP_CONNECTION); 11421 if (!nl_tcp) 11422 return -ENOBUFS; 11423 11424 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || 11425 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || 11426 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || 11427 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || 11428 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || 11429 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 11430 tcp->payload_len, tcp->payload) || 11431 nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 11432 tcp->data_interval) || 11433 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 11434 tcp->wake_len, tcp->wake_data) || 11435 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK, 11436 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) 11437 return -ENOBUFS; 11438 11439 if (tcp->payload_seq.len && 11440 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ, 11441 sizeof(tcp->payload_seq), &tcp->payload_seq)) 11442 return -ENOBUFS; 11443 11444 if (tcp->payload_tok.len && 11445 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 11446 sizeof(tcp->payload_tok) + tcp->tokens_size, 11447 &tcp->payload_tok)) 11448 return -ENOBUFS; 11449 11450 nla_nest_end(msg, nl_tcp); 11451 11452 return 0; 11453 } 11454 11455 static int nl80211_send_wowlan_nd(struct sk_buff *msg, 11456 struct cfg80211_sched_scan_request *req) 11457 { 11458 struct nlattr *nd, *freqs, *matches, *match, *scan_plans, *scan_plan; 11459 int i; 11460 11461 if (!req) 11462 return 0; 11463 11464 nd = nla_nest_start_noflag(msg, NL80211_WOWLAN_TRIG_NET_DETECT); 11465 if (!nd) 11466 return -ENOBUFS; 11467 11468 if (req->n_scan_plans == 1 && 11469 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_INTERVAL, 11470 req->scan_plans[0].interval * 1000)) 11471 return -ENOBUFS; 11472 11473 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay)) 11474 return -ENOBUFS; 11475 11476 if (req->relative_rssi_set) { 11477 struct nl80211_bss_select_rssi_adjust rssi_adjust; 11478 11479 if (nla_put_s8(msg, NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI, 11480 req->relative_rssi)) 11481 return -ENOBUFS; 11482 11483 rssi_adjust.band = req->rssi_adjust.band; 11484 rssi_adjust.delta = req->rssi_adjust.delta; 11485 if (nla_put(msg, NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST, 11486 sizeof(rssi_adjust), &rssi_adjust)) 11487 return -ENOBUFS; 11488 } 11489 11490 freqs = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_FREQUENCIES); 11491 if (!freqs) 11492 return -ENOBUFS; 11493 11494 for (i = 0; i < req->n_channels; i++) { 11495 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) 11496 return -ENOBUFS; 11497 } 11498 11499 nla_nest_end(msg, freqs); 11500 11501 if (req->n_match_sets) { 11502 matches = nla_nest_start_noflag(msg, 11503 NL80211_ATTR_SCHED_SCAN_MATCH); 11504 if (!matches) 11505 return -ENOBUFS; 11506 11507 for (i = 0; i < req->n_match_sets; i++) { 11508 match = nla_nest_start_noflag(msg, i); 11509 if (!match) 11510 return -ENOBUFS; 11511 11512 if (nla_put(msg, NL80211_SCHED_SCAN_MATCH_ATTR_SSID, 11513 req->match_sets[i].ssid.ssid_len, 11514 req->match_sets[i].ssid.ssid)) 11515 return -ENOBUFS; 11516 nla_nest_end(msg, match); 11517 } 11518 nla_nest_end(msg, matches); 11519 } 11520 11521 scan_plans = nla_nest_start_noflag(msg, NL80211_ATTR_SCHED_SCAN_PLANS); 11522 if (!scan_plans) 11523 return -ENOBUFS; 11524 11525 for (i = 0; i < req->n_scan_plans; i++) { 11526 scan_plan = nla_nest_start_noflag(msg, i + 1); 11527 if (!scan_plan) 11528 return -ENOBUFS; 11529 11530 if (nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_INTERVAL, 11531 req->scan_plans[i].interval) || 11532 (req->scan_plans[i].iterations && 11533 nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_ITERATIONS, 11534 req->scan_plans[i].iterations))) 11535 return -ENOBUFS; 11536 nla_nest_end(msg, scan_plan); 11537 } 11538 nla_nest_end(msg, scan_plans); 11539 11540 nla_nest_end(msg, nd); 11541 11542 return 0; 11543 } 11544 11545 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info) 11546 { 11547 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11548 struct sk_buff *msg; 11549 void *hdr; 11550 u32 size = NLMSG_DEFAULT_SIZE; 11551 11552 if (!rdev->wiphy.wowlan) 11553 return -EOPNOTSUPP; 11554 11555 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { 11556 /* adjust size to have room for all the data */ 11557 size += rdev->wiphy.wowlan_config->tcp->tokens_size + 11558 rdev->wiphy.wowlan_config->tcp->payload_len + 11559 rdev->wiphy.wowlan_config->tcp->wake_len + 11560 rdev->wiphy.wowlan_config->tcp->wake_len / 8; 11561 } 11562 11563 msg = nlmsg_new(size, GFP_KERNEL); 11564 if (!msg) 11565 return -ENOMEM; 11566 11567 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 11568 NL80211_CMD_GET_WOWLAN); 11569 if (!hdr) 11570 goto nla_put_failure; 11571 11572 if (rdev->wiphy.wowlan_config) { 11573 struct nlattr *nl_wowlan; 11574 11575 nl_wowlan = nla_nest_start_noflag(msg, 11576 NL80211_ATTR_WOWLAN_TRIGGERS); 11577 if (!nl_wowlan) 11578 goto nla_put_failure; 11579 11580 if ((rdev->wiphy.wowlan_config->any && 11581 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 11582 (rdev->wiphy.wowlan_config->disconnect && 11583 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 11584 (rdev->wiphy.wowlan_config->magic_pkt && 11585 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 11586 (rdev->wiphy.wowlan_config->gtk_rekey_failure && 11587 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 11588 (rdev->wiphy.wowlan_config->eap_identity_req && 11589 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 11590 (rdev->wiphy.wowlan_config->four_way_handshake && 11591 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 11592 (rdev->wiphy.wowlan_config->rfkill_release && 11593 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 11594 goto nla_put_failure; 11595 11596 if (nl80211_send_wowlan_patterns(msg, rdev)) 11597 goto nla_put_failure; 11598 11599 if (nl80211_send_wowlan_tcp(msg, 11600 rdev->wiphy.wowlan_config->tcp)) 11601 goto nla_put_failure; 11602 11603 if (nl80211_send_wowlan_nd( 11604 msg, 11605 rdev->wiphy.wowlan_config->nd_config)) 11606 goto nla_put_failure; 11607 11608 nla_nest_end(msg, nl_wowlan); 11609 } 11610 11611 genlmsg_end(msg, hdr); 11612 return genlmsg_reply(msg, info); 11613 11614 nla_put_failure: 11615 nlmsg_free(msg); 11616 return -ENOBUFS; 11617 } 11618 11619 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev, 11620 struct nlattr *attr, 11621 struct cfg80211_wowlan *trig) 11622 { 11623 struct nlattr *tb[NUM_NL80211_WOWLAN_TCP]; 11624 struct cfg80211_wowlan_tcp *cfg; 11625 struct nl80211_wowlan_tcp_data_token *tok = NULL; 11626 struct nl80211_wowlan_tcp_data_seq *seq = NULL; 11627 u32 size; 11628 u32 data_size, wake_size, tokens_size = 0, wake_mask_size; 11629 int err, port; 11630 11631 if (!rdev->wiphy.wowlan->tcp) 11632 return -EINVAL; 11633 11634 err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TCP, attr, 11635 nl80211_wowlan_tcp_policy, NULL); 11636 if (err) 11637 return err; 11638 11639 if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] || 11640 !tb[NL80211_WOWLAN_TCP_DST_IPV4] || 11641 !tb[NL80211_WOWLAN_TCP_DST_MAC] || 11642 !tb[NL80211_WOWLAN_TCP_DST_PORT] || 11643 !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] || 11644 !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] || 11645 !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] || 11646 !tb[NL80211_WOWLAN_TCP_WAKE_MASK]) 11647 return -EINVAL; 11648 11649 data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]); 11650 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) 11651 return -EINVAL; 11652 11653 if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) > 11654 rdev->wiphy.wowlan->tcp->data_interval_max || 11655 nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0) 11656 return -EINVAL; 11657 11658 wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]); 11659 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) 11660 return -EINVAL; 11661 11662 wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]); 11663 if (wake_mask_size != DIV_ROUND_UP(wake_size, 8)) 11664 return -EINVAL; 11665 11666 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) { 11667 u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 11668 11669 tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 11670 tokens_size = tokln - sizeof(*tok); 11671 11672 if (!tok->len || tokens_size % tok->len) 11673 return -EINVAL; 11674 if (!rdev->wiphy.wowlan->tcp->tok) 11675 return -EINVAL; 11676 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) 11677 return -EINVAL; 11678 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) 11679 return -EINVAL; 11680 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) 11681 return -EINVAL; 11682 if (tok->offset + tok->len > data_size) 11683 return -EINVAL; 11684 } 11685 11686 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) { 11687 seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]); 11688 if (!rdev->wiphy.wowlan->tcp->seq) 11689 return -EINVAL; 11690 if (seq->len == 0 || seq->len > 4) 11691 return -EINVAL; 11692 if (seq->len + seq->offset > data_size) 11693 return -EINVAL; 11694 } 11695 11696 size = sizeof(*cfg); 11697 size += data_size; 11698 size += wake_size + wake_mask_size; 11699 size += tokens_size; 11700 11701 cfg = kzalloc(size, GFP_KERNEL); 11702 if (!cfg) 11703 return -ENOMEM; 11704 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); 11705 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]); 11706 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), 11707 ETH_ALEN); 11708 if (tb[NL80211_WOWLAN_TCP_SRC_PORT]) 11709 port = nla_get_u16(tb[NL80211_WOWLAN_TCP_SRC_PORT]); 11710 else 11711 port = 0; 11712 #ifdef CONFIG_INET 11713 /* allocate a socket and port for it and use it */ 11714 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, 11715 IPPROTO_TCP, &cfg->sock, 1); 11716 if (err) { 11717 kfree(cfg); 11718 return err; 11719 } 11720 if (inet_csk_get_port(cfg->sock->sk, port)) { 11721 sock_release(cfg->sock); 11722 kfree(cfg); 11723 return -EADDRINUSE; 11724 } 11725 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; 11726 #else 11727 if (!port) { 11728 kfree(cfg); 11729 return -EINVAL; 11730 } 11731 cfg->src_port = port; 11732 #endif 11733 11734 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); 11735 cfg->payload_len = data_size; 11736 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; 11737 memcpy((void *)cfg->payload, 11738 nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]), 11739 data_size); 11740 if (seq) 11741 cfg->payload_seq = *seq; 11742 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); 11743 cfg->wake_len = wake_size; 11744 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; 11745 memcpy((void *)cfg->wake_data, 11746 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]), 11747 wake_size); 11748 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + 11749 data_size + wake_size; 11750 memcpy((void *)cfg->wake_mask, 11751 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]), 11752 wake_mask_size); 11753 if (tok) { 11754 cfg->tokens_size = tokens_size; 11755 memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size); 11756 } 11757 11758 trig->tcp = cfg; 11759 11760 return 0; 11761 } 11762 11763 static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev, 11764 const struct wiphy_wowlan_support *wowlan, 11765 struct nlattr *attr, 11766 struct cfg80211_wowlan *trig) 11767 { 11768 struct nlattr **tb; 11769 int err; 11770 11771 tb = kcalloc(NUM_NL80211_ATTR, sizeof(*tb), GFP_KERNEL); 11772 if (!tb) 11773 return -ENOMEM; 11774 11775 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) { 11776 err = -EOPNOTSUPP; 11777 goto out; 11778 } 11779 11780 err = nla_parse_nested_deprecated(tb, NL80211_ATTR_MAX, attr, 11781 nl80211_policy, NULL); 11782 if (err) 11783 goto out; 11784 11785 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb, 11786 wowlan->max_nd_match_sets); 11787 err = PTR_ERR_OR_ZERO(trig->nd_config); 11788 if (err) 11789 trig->nd_config = NULL; 11790 11791 out: 11792 kfree(tb); 11793 return err; 11794 } 11795 11796 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info) 11797 { 11798 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11799 struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG]; 11800 struct cfg80211_wowlan new_triggers = {}; 11801 struct cfg80211_wowlan *ntrig; 11802 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; 11803 int err, i; 11804 bool prev_enabled = rdev->wiphy.wowlan_config; 11805 bool regular = false; 11806 11807 if (!wowlan) 11808 return -EOPNOTSUPP; 11809 11810 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { 11811 cfg80211_rdev_free_wowlan(rdev); 11812 rdev->wiphy.wowlan_config = NULL; 11813 goto set_wakeup; 11814 } 11815 11816 err = nla_parse_nested_deprecated(tb, MAX_NL80211_WOWLAN_TRIG, 11817 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS], 11818 nl80211_wowlan_policy, info->extack); 11819 if (err) 11820 return err; 11821 11822 if (tb[NL80211_WOWLAN_TRIG_ANY]) { 11823 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) 11824 return -EINVAL; 11825 new_triggers.any = true; 11826 } 11827 11828 if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) { 11829 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) 11830 return -EINVAL; 11831 new_triggers.disconnect = true; 11832 regular = true; 11833 } 11834 11835 if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) { 11836 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) 11837 return -EINVAL; 11838 new_triggers.magic_pkt = true; 11839 regular = true; 11840 } 11841 11842 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED]) 11843 return -EINVAL; 11844 11845 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) { 11846 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) 11847 return -EINVAL; 11848 new_triggers.gtk_rekey_failure = true; 11849 regular = true; 11850 } 11851 11852 if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) { 11853 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) 11854 return -EINVAL; 11855 new_triggers.eap_identity_req = true; 11856 regular = true; 11857 } 11858 11859 if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) { 11860 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) 11861 return -EINVAL; 11862 new_triggers.four_way_handshake = true; 11863 regular = true; 11864 } 11865 11866 if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) { 11867 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) 11868 return -EINVAL; 11869 new_triggers.rfkill_release = true; 11870 regular = true; 11871 } 11872 11873 if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) { 11874 struct nlattr *pat; 11875 int n_patterns = 0; 11876 int rem, pat_len, mask_len, pkt_offset; 11877 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 11878 11879 regular = true; 11880 11881 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 11882 rem) 11883 n_patterns++; 11884 if (n_patterns > wowlan->n_patterns) 11885 return -EINVAL; 11886 11887 new_triggers.patterns = kcalloc(n_patterns, 11888 sizeof(new_triggers.patterns[0]), 11889 GFP_KERNEL); 11890 if (!new_triggers.patterns) 11891 return -ENOMEM; 11892 11893 new_triggers.n_patterns = n_patterns; 11894 i = 0; 11895 11896 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 11897 rem) { 11898 u8 *mask_pat; 11899 11900 err = nla_parse_nested_deprecated(pat_tb, 11901 MAX_NL80211_PKTPAT, 11902 pat, 11903 nl80211_packet_pattern_policy, 11904 info->extack); 11905 if (err) 11906 goto error; 11907 11908 err = -EINVAL; 11909 if (!pat_tb[NL80211_PKTPAT_MASK] || 11910 !pat_tb[NL80211_PKTPAT_PATTERN]) 11911 goto error; 11912 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 11913 mask_len = DIV_ROUND_UP(pat_len, 8); 11914 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 11915 goto error; 11916 if (pat_len > wowlan->pattern_max_len || 11917 pat_len < wowlan->pattern_min_len) 11918 goto error; 11919 11920 if (!pat_tb[NL80211_PKTPAT_OFFSET]) 11921 pkt_offset = 0; 11922 else 11923 pkt_offset = nla_get_u32( 11924 pat_tb[NL80211_PKTPAT_OFFSET]); 11925 if (pkt_offset > wowlan->max_pkt_offset) 11926 goto error; 11927 new_triggers.patterns[i].pkt_offset = pkt_offset; 11928 11929 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL); 11930 if (!mask_pat) { 11931 err = -ENOMEM; 11932 goto error; 11933 } 11934 new_triggers.patterns[i].mask = mask_pat; 11935 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]), 11936 mask_len); 11937 mask_pat += mask_len; 11938 new_triggers.patterns[i].pattern = mask_pat; 11939 new_triggers.patterns[i].pattern_len = pat_len; 11940 memcpy(mask_pat, 11941 nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 11942 pat_len); 11943 i++; 11944 } 11945 } 11946 11947 if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) { 11948 regular = true; 11949 err = nl80211_parse_wowlan_tcp( 11950 rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION], 11951 &new_triggers); 11952 if (err) 11953 goto error; 11954 } 11955 11956 if (tb[NL80211_WOWLAN_TRIG_NET_DETECT]) { 11957 regular = true; 11958 err = nl80211_parse_wowlan_nd( 11959 rdev, wowlan, tb[NL80211_WOWLAN_TRIG_NET_DETECT], 11960 &new_triggers); 11961 if (err) 11962 goto error; 11963 } 11964 11965 /* The 'any' trigger means the device continues operating more or less 11966 * as in its normal operation mode and wakes up the host on most of the 11967 * normal interrupts (like packet RX, ...) 11968 * It therefore makes little sense to combine with the more constrained 11969 * wakeup trigger modes. 11970 */ 11971 if (new_triggers.any && regular) { 11972 err = -EINVAL; 11973 goto error; 11974 } 11975 11976 ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL); 11977 if (!ntrig) { 11978 err = -ENOMEM; 11979 goto error; 11980 } 11981 cfg80211_rdev_free_wowlan(rdev); 11982 rdev->wiphy.wowlan_config = ntrig; 11983 11984 set_wakeup: 11985 if (rdev->ops->set_wakeup && 11986 prev_enabled != !!rdev->wiphy.wowlan_config) 11987 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); 11988 11989 return 0; 11990 error: 11991 for (i = 0; i < new_triggers.n_patterns; i++) 11992 kfree(new_triggers.patterns[i].mask); 11993 kfree(new_triggers.patterns); 11994 if (new_triggers.tcp && new_triggers.tcp->sock) 11995 sock_release(new_triggers.tcp->sock); 11996 kfree(new_triggers.tcp); 11997 kfree(new_triggers.nd_config); 11998 return err; 11999 } 12000 #endif 12001 12002 static int nl80211_send_coalesce_rules(struct sk_buff *msg, 12003 struct cfg80211_registered_device *rdev) 12004 { 12005 struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules; 12006 int i, j, pat_len; 12007 struct cfg80211_coalesce_rules *rule; 12008 12009 if (!rdev->coalesce->n_rules) 12010 return 0; 12011 12012 nl_rules = nla_nest_start_noflag(msg, NL80211_ATTR_COALESCE_RULE); 12013 if (!nl_rules) 12014 return -ENOBUFS; 12015 12016 for (i = 0; i < rdev->coalesce->n_rules; i++) { 12017 nl_rule = nla_nest_start_noflag(msg, i + 1); 12018 if (!nl_rule) 12019 return -ENOBUFS; 12020 12021 rule = &rdev->coalesce->rules[i]; 12022 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY, 12023 rule->delay)) 12024 return -ENOBUFS; 12025 12026 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION, 12027 rule->condition)) 12028 return -ENOBUFS; 12029 12030 nl_pats = nla_nest_start_noflag(msg, 12031 NL80211_ATTR_COALESCE_RULE_PKT_PATTERN); 12032 if (!nl_pats) 12033 return -ENOBUFS; 12034 12035 for (j = 0; j < rule->n_patterns; j++) { 12036 nl_pat = nla_nest_start_noflag(msg, j + 1); 12037 if (!nl_pat) 12038 return -ENOBUFS; 12039 pat_len = rule->patterns[j].pattern_len; 12040 if (nla_put(msg, NL80211_PKTPAT_MASK, 12041 DIV_ROUND_UP(pat_len, 8), 12042 rule->patterns[j].mask) || 12043 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 12044 rule->patterns[j].pattern) || 12045 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 12046 rule->patterns[j].pkt_offset)) 12047 return -ENOBUFS; 12048 nla_nest_end(msg, nl_pat); 12049 } 12050 nla_nest_end(msg, nl_pats); 12051 nla_nest_end(msg, nl_rule); 12052 } 12053 nla_nest_end(msg, nl_rules); 12054 12055 return 0; 12056 } 12057 12058 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info) 12059 { 12060 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12061 struct sk_buff *msg; 12062 void *hdr; 12063 12064 if (!rdev->wiphy.coalesce) 12065 return -EOPNOTSUPP; 12066 12067 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 12068 if (!msg) 12069 return -ENOMEM; 12070 12071 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 12072 NL80211_CMD_GET_COALESCE); 12073 if (!hdr) 12074 goto nla_put_failure; 12075 12076 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) 12077 goto nla_put_failure; 12078 12079 genlmsg_end(msg, hdr); 12080 return genlmsg_reply(msg, info); 12081 12082 nla_put_failure: 12083 nlmsg_free(msg); 12084 return -ENOBUFS; 12085 } 12086 12087 void cfg80211_rdev_free_coalesce(struct cfg80211_registered_device *rdev) 12088 { 12089 struct cfg80211_coalesce *coalesce = rdev->coalesce; 12090 int i, j; 12091 struct cfg80211_coalesce_rules *rule; 12092 12093 if (!coalesce) 12094 return; 12095 12096 for (i = 0; i < coalesce->n_rules; i++) { 12097 rule = &coalesce->rules[i]; 12098 for (j = 0; j < rule->n_patterns; j++) 12099 kfree(rule->patterns[j].mask); 12100 kfree(rule->patterns); 12101 } 12102 kfree(coalesce->rules); 12103 kfree(coalesce); 12104 rdev->coalesce = NULL; 12105 } 12106 12107 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev, 12108 struct nlattr *rule, 12109 struct cfg80211_coalesce_rules *new_rule) 12110 { 12111 int err, i; 12112 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 12113 struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat; 12114 int rem, pat_len, mask_len, pkt_offset, n_patterns = 0; 12115 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 12116 12117 err = nla_parse_nested_deprecated(tb, NL80211_ATTR_COALESCE_RULE_MAX, 12118 rule, nl80211_coalesce_policy, NULL); 12119 if (err) 12120 return err; 12121 12122 if (tb[NL80211_ATTR_COALESCE_RULE_DELAY]) 12123 new_rule->delay = 12124 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]); 12125 if (new_rule->delay > coalesce->max_delay) 12126 return -EINVAL; 12127 12128 if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION]) 12129 new_rule->condition = 12130 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]); 12131 12132 if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN]) 12133 return -EINVAL; 12134 12135 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 12136 rem) 12137 n_patterns++; 12138 if (n_patterns > coalesce->n_patterns) 12139 return -EINVAL; 12140 12141 new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]), 12142 GFP_KERNEL); 12143 if (!new_rule->patterns) 12144 return -ENOMEM; 12145 12146 new_rule->n_patterns = n_patterns; 12147 i = 0; 12148 12149 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 12150 rem) { 12151 u8 *mask_pat; 12152 12153 err = nla_parse_nested_deprecated(pat_tb, MAX_NL80211_PKTPAT, 12154 pat, 12155 nl80211_packet_pattern_policy, 12156 NULL); 12157 if (err) 12158 return err; 12159 12160 if (!pat_tb[NL80211_PKTPAT_MASK] || 12161 !pat_tb[NL80211_PKTPAT_PATTERN]) 12162 return -EINVAL; 12163 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 12164 mask_len = DIV_ROUND_UP(pat_len, 8); 12165 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 12166 return -EINVAL; 12167 if (pat_len > coalesce->pattern_max_len || 12168 pat_len < coalesce->pattern_min_len) 12169 return -EINVAL; 12170 12171 if (!pat_tb[NL80211_PKTPAT_OFFSET]) 12172 pkt_offset = 0; 12173 else 12174 pkt_offset = nla_get_u32(pat_tb[NL80211_PKTPAT_OFFSET]); 12175 if (pkt_offset > coalesce->max_pkt_offset) 12176 return -EINVAL; 12177 new_rule->patterns[i].pkt_offset = pkt_offset; 12178 12179 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL); 12180 if (!mask_pat) 12181 return -ENOMEM; 12182 12183 new_rule->patterns[i].mask = mask_pat; 12184 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]), 12185 mask_len); 12186 12187 mask_pat += mask_len; 12188 new_rule->patterns[i].pattern = mask_pat; 12189 new_rule->patterns[i].pattern_len = pat_len; 12190 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 12191 pat_len); 12192 i++; 12193 } 12194 12195 return 0; 12196 } 12197 12198 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info) 12199 { 12200 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12201 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 12202 struct cfg80211_coalesce new_coalesce = {}; 12203 struct cfg80211_coalesce *n_coalesce; 12204 int err, rem_rule, n_rules = 0, i, j; 12205 struct nlattr *rule; 12206 struct cfg80211_coalesce_rules *tmp_rule; 12207 12208 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) 12209 return -EOPNOTSUPP; 12210 12211 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { 12212 cfg80211_rdev_free_coalesce(rdev); 12213 rdev_set_coalesce(rdev, NULL); 12214 return 0; 12215 } 12216 12217 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 12218 rem_rule) 12219 n_rules++; 12220 if (n_rules > coalesce->n_rules) 12221 return -EINVAL; 12222 12223 new_coalesce.rules = kcalloc(n_rules, sizeof(new_coalesce.rules[0]), 12224 GFP_KERNEL); 12225 if (!new_coalesce.rules) 12226 return -ENOMEM; 12227 12228 new_coalesce.n_rules = n_rules; 12229 i = 0; 12230 12231 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 12232 rem_rule) { 12233 err = nl80211_parse_coalesce_rule(rdev, rule, 12234 &new_coalesce.rules[i]); 12235 if (err) 12236 goto error; 12237 12238 i++; 12239 } 12240 12241 err = rdev_set_coalesce(rdev, &new_coalesce); 12242 if (err) 12243 goto error; 12244 12245 n_coalesce = kmemdup(&new_coalesce, sizeof(new_coalesce), GFP_KERNEL); 12246 if (!n_coalesce) { 12247 err = -ENOMEM; 12248 goto error; 12249 } 12250 cfg80211_rdev_free_coalesce(rdev); 12251 rdev->coalesce = n_coalesce; 12252 12253 return 0; 12254 error: 12255 for (i = 0; i < new_coalesce.n_rules; i++) { 12256 tmp_rule = &new_coalesce.rules[i]; 12257 for (j = 0; j < tmp_rule->n_patterns; j++) 12258 kfree(tmp_rule->patterns[j].mask); 12259 kfree(tmp_rule->patterns); 12260 } 12261 kfree(new_coalesce.rules); 12262 12263 return err; 12264 } 12265 12266 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info) 12267 { 12268 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12269 struct net_device *dev = info->user_ptr[1]; 12270 struct wireless_dev *wdev = dev->ieee80211_ptr; 12271 struct nlattr *tb[NUM_NL80211_REKEY_DATA]; 12272 struct cfg80211_gtk_rekey_data rekey_data; 12273 int err; 12274 12275 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) 12276 return -EINVAL; 12277 12278 err = nla_parse_nested_deprecated(tb, MAX_NL80211_REKEY_DATA, 12279 info->attrs[NL80211_ATTR_REKEY_DATA], 12280 nl80211_rekey_policy, info->extack); 12281 if (err) 12282 return err; 12283 12284 if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] || 12285 !tb[NL80211_REKEY_DATA_KCK]) 12286 return -EINVAL; 12287 if (nla_len(tb[NL80211_REKEY_DATA_REPLAY_CTR]) != NL80211_REPLAY_CTR_LEN) 12288 return -ERANGE; 12289 if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN) 12290 return -ERANGE; 12291 if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN) 12292 return -ERANGE; 12293 12294 rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]); 12295 rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]); 12296 rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]); 12297 12298 wdev_lock(wdev); 12299 if (!wdev->current_bss) { 12300 err = -ENOTCONN; 12301 goto out; 12302 } 12303 12304 if (!rdev->ops->set_rekey_data) { 12305 err = -EOPNOTSUPP; 12306 goto out; 12307 } 12308 12309 err = rdev_set_rekey_data(rdev, dev, &rekey_data); 12310 out: 12311 wdev_unlock(wdev); 12312 return err; 12313 } 12314 12315 static int nl80211_register_unexpected_frame(struct sk_buff *skb, 12316 struct genl_info *info) 12317 { 12318 struct net_device *dev = info->user_ptr[1]; 12319 struct wireless_dev *wdev = dev->ieee80211_ptr; 12320 12321 if (wdev->iftype != NL80211_IFTYPE_AP && 12322 wdev->iftype != NL80211_IFTYPE_P2P_GO) 12323 return -EINVAL; 12324 12325 if (wdev->ap_unexpected_nlportid) 12326 return -EBUSY; 12327 12328 wdev->ap_unexpected_nlportid = info->snd_portid; 12329 return 0; 12330 } 12331 12332 static int nl80211_probe_client(struct sk_buff *skb, 12333 struct genl_info *info) 12334 { 12335 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12336 struct net_device *dev = info->user_ptr[1]; 12337 struct wireless_dev *wdev = dev->ieee80211_ptr; 12338 struct sk_buff *msg; 12339 void *hdr; 12340 const u8 *addr; 12341 u64 cookie; 12342 int err; 12343 12344 if (wdev->iftype != NL80211_IFTYPE_AP && 12345 wdev->iftype != NL80211_IFTYPE_P2P_GO) 12346 return -EOPNOTSUPP; 12347 12348 if (!info->attrs[NL80211_ATTR_MAC]) 12349 return -EINVAL; 12350 12351 if (!rdev->ops->probe_client) 12352 return -EOPNOTSUPP; 12353 12354 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 12355 if (!msg) 12356 return -ENOMEM; 12357 12358 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 12359 NL80211_CMD_PROBE_CLIENT); 12360 if (!hdr) { 12361 err = -ENOBUFS; 12362 goto free_msg; 12363 } 12364 12365 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 12366 12367 err = rdev_probe_client(rdev, dev, addr, &cookie); 12368 if (err) 12369 goto free_msg; 12370 12371 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 12372 NL80211_ATTR_PAD)) 12373 goto nla_put_failure; 12374 12375 genlmsg_end(msg, hdr); 12376 12377 return genlmsg_reply(msg, info); 12378 12379 nla_put_failure: 12380 err = -ENOBUFS; 12381 free_msg: 12382 nlmsg_free(msg); 12383 return err; 12384 } 12385 12386 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info) 12387 { 12388 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12389 struct cfg80211_beacon_registration *reg, *nreg; 12390 int rv; 12391 12392 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) 12393 return -EOPNOTSUPP; 12394 12395 nreg = kzalloc(sizeof(*nreg), GFP_KERNEL); 12396 if (!nreg) 12397 return -ENOMEM; 12398 12399 /* First, check if already registered. */ 12400 spin_lock_bh(&rdev->beacon_registrations_lock); 12401 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 12402 if (reg->nlportid == info->snd_portid) { 12403 rv = -EALREADY; 12404 goto out_err; 12405 } 12406 } 12407 /* Add it to the list */ 12408 nreg->nlportid = info->snd_portid; 12409 list_add(&nreg->list, &rdev->beacon_registrations); 12410 12411 spin_unlock_bh(&rdev->beacon_registrations_lock); 12412 12413 return 0; 12414 out_err: 12415 spin_unlock_bh(&rdev->beacon_registrations_lock); 12416 kfree(nreg); 12417 return rv; 12418 } 12419 12420 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info) 12421 { 12422 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12423 struct wireless_dev *wdev = info->user_ptr[1]; 12424 int err; 12425 12426 if (!rdev->ops->start_p2p_device) 12427 return -EOPNOTSUPP; 12428 12429 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 12430 return -EOPNOTSUPP; 12431 12432 if (wdev_running(wdev)) 12433 return 0; 12434 12435 if (rfkill_blocked(rdev->rfkill)) 12436 return -ERFKILL; 12437 12438 err = rdev_start_p2p_device(rdev, wdev); 12439 if (err) 12440 return err; 12441 12442 wdev->is_running = true; 12443 rdev->opencount++; 12444 12445 return 0; 12446 } 12447 12448 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info) 12449 { 12450 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12451 struct wireless_dev *wdev = info->user_ptr[1]; 12452 12453 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 12454 return -EOPNOTSUPP; 12455 12456 if (!rdev->ops->stop_p2p_device) 12457 return -EOPNOTSUPP; 12458 12459 cfg80211_stop_p2p_device(rdev, wdev); 12460 12461 return 0; 12462 } 12463 12464 static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info) 12465 { 12466 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12467 struct wireless_dev *wdev = info->user_ptr[1]; 12468 struct cfg80211_nan_conf conf = {}; 12469 int err; 12470 12471 if (wdev->iftype != NL80211_IFTYPE_NAN) 12472 return -EOPNOTSUPP; 12473 12474 if (wdev_running(wdev)) 12475 return -EEXIST; 12476 12477 if (rfkill_blocked(rdev->rfkill)) 12478 return -ERFKILL; 12479 12480 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) 12481 return -EINVAL; 12482 12483 conf.master_pref = 12484 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); 12485 12486 if (info->attrs[NL80211_ATTR_BANDS]) { 12487 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); 12488 12489 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) 12490 return -EOPNOTSUPP; 12491 12492 if (bands && !(bands & BIT(NL80211_BAND_2GHZ))) 12493 return -EINVAL; 12494 12495 conf.bands = bands; 12496 } 12497 12498 err = rdev_start_nan(rdev, wdev, &conf); 12499 if (err) 12500 return err; 12501 12502 wdev->is_running = true; 12503 rdev->opencount++; 12504 12505 return 0; 12506 } 12507 12508 static int nl80211_stop_nan(struct sk_buff *skb, struct genl_info *info) 12509 { 12510 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12511 struct wireless_dev *wdev = info->user_ptr[1]; 12512 12513 if (wdev->iftype != NL80211_IFTYPE_NAN) 12514 return -EOPNOTSUPP; 12515 12516 cfg80211_stop_nan(rdev, wdev); 12517 12518 return 0; 12519 } 12520 12521 static int validate_nan_filter(struct nlattr *filter_attr) 12522 { 12523 struct nlattr *attr; 12524 int len = 0, n_entries = 0, rem; 12525 12526 nla_for_each_nested(attr, filter_attr, rem) { 12527 len += nla_len(attr); 12528 n_entries++; 12529 } 12530 12531 if (len >= U8_MAX) 12532 return -EINVAL; 12533 12534 return n_entries; 12535 } 12536 12537 static int handle_nan_filter(struct nlattr *attr_filter, 12538 struct cfg80211_nan_func *func, 12539 bool tx) 12540 { 12541 struct nlattr *attr; 12542 int n_entries, rem, i; 12543 struct cfg80211_nan_func_filter *filter; 12544 12545 n_entries = validate_nan_filter(attr_filter); 12546 if (n_entries < 0) 12547 return n_entries; 12548 12549 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters)); 12550 12551 filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL); 12552 if (!filter) 12553 return -ENOMEM; 12554 12555 i = 0; 12556 nla_for_each_nested(attr, attr_filter, rem) { 12557 filter[i].filter = nla_memdup(attr, GFP_KERNEL); 12558 filter[i].len = nla_len(attr); 12559 i++; 12560 } 12561 if (tx) { 12562 func->num_tx_filters = n_entries; 12563 func->tx_filters = filter; 12564 } else { 12565 func->num_rx_filters = n_entries; 12566 func->rx_filters = filter; 12567 } 12568 12569 return 0; 12570 } 12571 12572 static int nl80211_nan_add_func(struct sk_buff *skb, 12573 struct genl_info *info) 12574 { 12575 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12576 struct wireless_dev *wdev = info->user_ptr[1]; 12577 struct nlattr *tb[NUM_NL80211_NAN_FUNC_ATTR], *func_attr; 12578 struct cfg80211_nan_func *func; 12579 struct sk_buff *msg = NULL; 12580 void *hdr = NULL; 12581 int err = 0; 12582 12583 if (wdev->iftype != NL80211_IFTYPE_NAN) 12584 return -EOPNOTSUPP; 12585 12586 if (!wdev_running(wdev)) 12587 return -ENOTCONN; 12588 12589 if (!info->attrs[NL80211_ATTR_NAN_FUNC]) 12590 return -EINVAL; 12591 12592 err = nla_parse_nested_deprecated(tb, NL80211_NAN_FUNC_ATTR_MAX, 12593 info->attrs[NL80211_ATTR_NAN_FUNC], 12594 nl80211_nan_func_policy, 12595 info->extack); 12596 if (err) 12597 return err; 12598 12599 func = kzalloc(sizeof(*func), GFP_KERNEL); 12600 if (!func) 12601 return -ENOMEM; 12602 12603 func->cookie = cfg80211_assign_cookie(rdev); 12604 12605 if (!tb[NL80211_NAN_FUNC_TYPE] || 12606 nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]) > NL80211_NAN_FUNC_MAX_TYPE) { 12607 err = -EINVAL; 12608 goto out; 12609 } 12610 12611 12612 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]); 12613 12614 if (!tb[NL80211_NAN_FUNC_SERVICE_ID]) { 12615 err = -EINVAL; 12616 goto out; 12617 } 12618 12619 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]), 12620 sizeof(func->service_id)); 12621 12622 func->close_range = 12623 nla_get_flag(tb[NL80211_NAN_FUNC_CLOSE_RANGE]); 12624 12625 if (tb[NL80211_NAN_FUNC_SERVICE_INFO]) { 12626 func->serv_spec_info_len = 12627 nla_len(tb[NL80211_NAN_FUNC_SERVICE_INFO]); 12628 func->serv_spec_info = 12629 kmemdup(nla_data(tb[NL80211_NAN_FUNC_SERVICE_INFO]), 12630 func->serv_spec_info_len, 12631 GFP_KERNEL); 12632 if (!func->serv_spec_info) { 12633 err = -ENOMEM; 12634 goto out; 12635 } 12636 } 12637 12638 if (tb[NL80211_NAN_FUNC_TTL]) 12639 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]); 12640 12641 switch (func->type) { 12642 case NL80211_NAN_FUNC_PUBLISH: 12643 if (!tb[NL80211_NAN_FUNC_PUBLISH_TYPE]) { 12644 err = -EINVAL; 12645 goto out; 12646 } 12647 12648 func->publish_type = 12649 nla_get_u8(tb[NL80211_NAN_FUNC_PUBLISH_TYPE]); 12650 func->publish_bcast = 12651 nla_get_flag(tb[NL80211_NAN_FUNC_PUBLISH_BCAST]); 12652 12653 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) && 12654 func->publish_bcast) { 12655 err = -EINVAL; 12656 goto out; 12657 } 12658 break; 12659 case NL80211_NAN_FUNC_SUBSCRIBE: 12660 func->subscribe_active = 12661 nla_get_flag(tb[NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE]); 12662 break; 12663 case NL80211_NAN_FUNC_FOLLOW_UP: 12664 if (!tb[NL80211_NAN_FUNC_FOLLOW_UP_ID] || 12665 !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] || 12666 !tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]) { 12667 err = -EINVAL; 12668 goto out; 12669 } 12670 12671 func->followup_id = 12672 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_ID]); 12673 func->followup_reqid = 12674 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]); 12675 memcpy(func->followup_dest.addr, 12676 nla_data(tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]), 12677 sizeof(func->followup_dest.addr)); 12678 if (func->ttl) { 12679 err = -EINVAL; 12680 goto out; 12681 } 12682 break; 12683 default: 12684 err = -EINVAL; 12685 goto out; 12686 } 12687 12688 if (tb[NL80211_NAN_FUNC_SRF]) { 12689 struct nlattr *srf_tb[NUM_NL80211_NAN_SRF_ATTR]; 12690 12691 err = nla_parse_nested_deprecated(srf_tb, 12692 NL80211_NAN_SRF_ATTR_MAX, 12693 tb[NL80211_NAN_FUNC_SRF], 12694 nl80211_nan_srf_policy, 12695 info->extack); 12696 if (err) 12697 goto out; 12698 12699 func->srf_include = 12700 nla_get_flag(srf_tb[NL80211_NAN_SRF_INCLUDE]); 12701 12702 if (srf_tb[NL80211_NAN_SRF_BF]) { 12703 if (srf_tb[NL80211_NAN_SRF_MAC_ADDRS] || 12704 !srf_tb[NL80211_NAN_SRF_BF_IDX]) { 12705 err = -EINVAL; 12706 goto out; 12707 } 12708 12709 func->srf_bf_len = 12710 nla_len(srf_tb[NL80211_NAN_SRF_BF]); 12711 func->srf_bf = 12712 kmemdup(nla_data(srf_tb[NL80211_NAN_SRF_BF]), 12713 func->srf_bf_len, GFP_KERNEL); 12714 if (!func->srf_bf) { 12715 err = -ENOMEM; 12716 goto out; 12717 } 12718 12719 func->srf_bf_idx = 12720 nla_get_u8(srf_tb[NL80211_NAN_SRF_BF_IDX]); 12721 } else { 12722 struct nlattr *attr, *mac_attr = 12723 srf_tb[NL80211_NAN_SRF_MAC_ADDRS]; 12724 int n_entries, rem, i = 0; 12725 12726 if (!mac_attr) { 12727 err = -EINVAL; 12728 goto out; 12729 } 12730 12731 n_entries = validate_acl_mac_addrs(mac_attr); 12732 if (n_entries <= 0) { 12733 err = -EINVAL; 12734 goto out; 12735 } 12736 12737 func->srf_num_macs = n_entries; 12738 func->srf_macs = 12739 kcalloc(n_entries, sizeof(*func->srf_macs), 12740 GFP_KERNEL); 12741 if (!func->srf_macs) { 12742 err = -ENOMEM; 12743 goto out; 12744 } 12745 12746 nla_for_each_nested(attr, mac_attr, rem) 12747 memcpy(func->srf_macs[i++].addr, nla_data(attr), 12748 sizeof(*func->srf_macs)); 12749 } 12750 } 12751 12752 if (tb[NL80211_NAN_FUNC_TX_MATCH_FILTER]) { 12753 err = handle_nan_filter(tb[NL80211_NAN_FUNC_TX_MATCH_FILTER], 12754 func, true); 12755 if (err) 12756 goto out; 12757 } 12758 12759 if (tb[NL80211_NAN_FUNC_RX_MATCH_FILTER]) { 12760 err = handle_nan_filter(tb[NL80211_NAN_FUNC_RX_MATCH_FILTER], 12761 func, false); 12762 if (err) 12763 goto out; 12764 } 12765 12766 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 12767 if (!msg) { 12768 err = -ENOMEM; 12769 goto out; 12770 } 12771 12772 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 12773 NL80211_CMD_ADD_NAN_FUNCTION); 12774 /* This can't really happen - we just allocated 4KB */ 12775 if (WARN_ON(!hdr)) { 12776 err = -ENOMEM; 12777 goto out; 12778 } 12779 12780 err = rdev_add_nan_func(rdev, wdev, func); 12781 out: 12782 if (err < 0) { 12783 cfg80211_free_nan_func(func); 12784 nlmsg_free(msg); 12785 return err; 12786 } 12787 12788 /* propagate the instance id and cookie to userspace */ 12789 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie, 12790 NL80211_ATTR_PAD)) 12791 goto nla_put_failure; 12792 12793 func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC); 12794 if (!func_attr) 12795 goto nla_put_failure; 12796 12797 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, 12798 func->instance_id)) 12799 goto nla_put_failure; 12800 12801 nla_nest_end(msg, func_attr); 12802 12803 genlmsg_end(msg, hdr); 12804 return genlmsg_reply(msg, info); 12805 12806 nla_put_failure: 12807 nlmsg_free(msg); 12808 return -ENOBUFS; 12809 } 12810 12811 static int nl80211_nan_del_func(struct sk_buff *skb, 12812 struct genl_info *info) 12813 { 12814 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12815 struct wireless_dev *wdev = info->user_ptr[1]; 12816 u64 cookie; 12817 12818 if (wdev->iftype != NL80211_IFTYPE_NAN) 12819 return -EOPNOTSUPP; 12820 12821 if (!wdev_running(wdev)) 12822 return -ENOTCONN; 12823 12824 if (!info->attrs[NL80211_ATTR_COOKIE]) 12825 return -EINVAL; 12826 12827 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 12828 12829 rdev_del_nan_func(rdev, wdev, cookie); 12830 12831 return 0; 12832 } 12833 12834 static int nl80211_nan_change_config(struct sk_buff *skb, 12835 struct genl_info *info) 12836 { 12837 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12838 struct wireless_dev *wdev = info->user_ptr[1]; 12839 struct cfg80211_nan_conf conf = {}; 12840 u32 changed = 0; 12841 12842 if (wdev->iftype != NL80211_IFTYPE_NAN) 12843 return -EOPNOTSUPP; 12844 12845 if (!wdev_running(wdev)) 12846 return -ENOTCONN; 12847 12848 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { 12849 conf.master_pref = 12850 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); 12851 if (conf.master_pref <= 1 || conf.master_pref == 255) 12852 return -EINVAL; 12853 12854 changed |= CFG80211_NAN_CONF_CHANGED_PREF; 12855 } 12856 12857 if (info->attrs[NL80211_ATTR_BANDS]) { 12858 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); 12859 12860 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) 12861 return -EOPNOTSUPP; 12862 12863 if (bands && !(bands & BIT(NL80211_BAND_2GHZ))) 12864 return -EINVAL; 12865 12866 conf.bands = bands; 12867 changed |= CFG80211_NAN_CONF_CHANGED_BANDS; 12868 } 12869 12870 if (!changed) 12871 return -EINVAL; 12872 12873 return rdev_nan_change_conf(rdev, wdev, &conf, changed); 12874 } 12875 12876 void cfg80211_nan_match(struct wireless_dev *wdev, 12877 struct cfg80211_nan_match_params *match, gfp_t gfp) 12878 { 12879 struct wiphy *wiphy = wdev->wiphy; 12880 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 12881 struct nlattr *match_attr, *local_func_attr, *peer_func_attr; 12882 struct sk_buff *msg; 12883 void *hdr; 12884 12885 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr)) 12886 return; 12887 12888 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 12889 if (!msg) 12890 return; 12891 12892 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_MATCH); 12893 if (!hdr) { 12894 nlmsg_free(msg); 12895 return; 12896 } 12897 12898 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 12899 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 12900 wdev->netdev->ifindex)) || 12901 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 12902 NL80211_ATTR_PAD)) 12903 goto nla_put_failure; 12904 12905 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie, 12906 NL80211_ATTR_PAD) || 12907 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr)) 12908 goto nla_put_failure; 12909 12910 match_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_MATCH); 12911 if (!match_attr) 12912 goto nla_put_failure; 12913 12914 local_func_attr = nla_nest_start_noflag(msg, 12915 NL80211_NAN_MATCH_FUNC_LOCAL); 12916 if (!local_func_attr) 12917 goto nla_put_failure; 12918 12919 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id)) 12920 goto nla_put_failure; 12921 12922 nla_nest_end(msg, local_func_attr); 12923 12924 peer_func_attr = nla_nest_start_noflag(msg, 12925 NL80211_NAN_MATCH_FUNC_PEER); 12926 if (!peer_func_attr) 12927 goto nla_put_failure; 12928 12929 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) || 12930 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id)) 12931 goto nla_put_failure; 12932 12933 if (match->info && match->info_len && 12934 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len, 12935 match->info)) 12936 goto nla_put_failure; 12937 12938 nla_nest_end(msg, peer_func_attr); 12939 nla_nest_end(msg, match_attr); 12940 genlmsg_end(msg, hdr); 12941 12942 if (!wdev->owner_nlportid) 12943 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 12944 msg, 0, NL80211_MCGRP_NAN, gfp); 12945 else 12946 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 12947 wdev->owner_nlportid); 12948 12949 return; 12950 12951 nla_put_failure: 12952 nlmsg_free(msg); 12953 } 12954 EXPORT_SYMBOL(cfg80211_nan_match); 12955 12956 void cfg80211_nan_func_terminated(struct wireless_dev *wdev, 12957 u8 inst_id, 12958 enum nl80211_nan_func_term_reason reason, 12959 u64 cookie, gfp_t gfp) 12960 { 12961 struct wiphy *wiphy = wdev->wiphy; 12962 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 12963 struct sk_buff *msg; 12964 struct nlattr *func_attr; 12965 void *hdr; 12966 12967 if (WARN_ON(!inst_id)) 12968 return; 12969 12970 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 12971 if (!msg) 12972 return; 12973 12974 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_NAN_FUNCTION); 12975 if (!hdr) { 12976 nlmsg_free(msg); 12977 return; 12978 } 12979 12980 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 12981 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 12982 wdev->netdev->ifindex)) || 12983 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 12984 NL80211_ATTR_PAD)) 12985 goto nla_put_failure; 12986 12987 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 12988 NL80211_ATTR_PAD)) 12989 goto nla_put_failure; 12990 12991 func_attr = nla_nest_start_noflag(msg, NL80211_ATTR_NAN_FUNC); 12992 if (!func_attr) 12993 goto nla_put_failure; 12994 12995 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, inst_id) || 12996 nla_put_u8(msg, NL80211_NAN_FUNC_TERM_REASON, reason)) 12997 goto nla_put_failure; 12998 12999 nla_nest_end(msg, func_attr); 13000 genlmsg_end(msg, hdr); 13001 13002 if (!wdev->owner_nlportid) 13003 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 13004 msg, 0, NL80211_MCGRP_NAN, gfp); 13005 else 13006 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 13007 wdev->owner_nlportid); 13008 13009 return; 13010 13011 nla_put_failure: 13012 nlmsg_free(msg); 13013 } 13014 EXPORT_SYMBOL(cfg80211_nan_func_terminated); 13015 13016 static int nl80211_get_protocol_features(struct sk_buff *skb, 13017 struct genl_info *info) 13018 { 13019 void *hdr; 13020 struct sk_buff *msg; 13021 13022 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 13023 if (!msg) 13024 return -ENOMEM; 13025 13026 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 13027 NL80211_CMD_GET_PROTOCOL_FEATURES); 13028 if (!hdr) 13029 goto nla_put_failure; 13030 13031 if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES, 13032 NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP)) 13033 goto nla_put_failure; 13034 13035 genlmsg_end(msg, hdr); 13036 return genlmsg_reply(msg, info); 13037 13038 nla_put_failure: 13039 kfree_skb(msg); 13040 return -ENOBUFS; 13041 } 13042 13043 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info) 13044 { 13045 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13046 struct cfg80211_update_ft_ies_params ft_params; 13047 struct net_device *dev = info->user_ptr[1]; 13048 13049 if (!rdev->ops->update_ft_ies) 13050 return -EOPNOTSUPP; 13051 13052 if (!info->attrs[NL80211_ATTR_MDID] || 13053 !info->attrs[NL80211_ATTR_IE]) 13054 return -EINVAL; 13055 13056 memset(&ft_params, 0, sizeof(ft_params)); 13057 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); 13058 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13059 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13060 13061 return rdev_update_ft_ies(rdev, dev, &ft_params); 13062 } 13063 13064 static int nl80211_crit_protocol_start(struct sk_buff *skb, 13065 struct genl_info *info) 13066 { 13067 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13068 struct wireless_dev *wdev = info->user_ptr[1]; 13069 enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC; 13070 u16 duration; 13071 int ret; 13072 13073 if (!rdev->ops->crit_proto_start) 13074 return -EOPNOTSUPP; 13075 13076 if (WARN_ON(!rdev->ops->crit_proto_stop)) 13077 return -EINVAL; 13078 13079 if (rdev->crit_proto_nlportid) 13080 return -EBUSY; 13081 13082 /* determine protocol if provided */ 13083 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) 13084 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); 13085 13086 if (proto >= NUM_NL80211_CRIT_PROTO) 13087 return -EINVAL; 13088 13089 /* timeout must be provided */ 13090 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) 13091 return -EINVAL; 13092 13093 duration = 13094 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); 13095 13096 if (duration > NL80211_CRIT_PROTO_MAX_DURATION) 13097 return -ERANGE; 13098 13099 ret = rdev_crit_proto_start(rdev, wdev, proto, duration); 13100 if (!ret) 13101 rdev->crit_proto_nlportid = info->snd_portid; 13102 13103 return ret; 13104 } 13105 13106 static int nl80211_crit_protocol_stop(struct sk_buff *skb, 13107 struct genl_info *info) 13108 { 13109 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13110 struct wireless_dev *wdev = info->user_ptr[1]; 13111 13112 if (!rdev->ops->crit_proto_stop) 13113 return -EOPNOTSUPP; 13114 13115 if (rdev->crit_proto_nlportid) { 13116 rdev->crit_proto_nlportid = 0; 13117 rdev_crit_proto_stop(rdev, wdev); 13118 } 13119 return 0; 13120 } 13121 13122 static int nl80211_vendor_check_policy(const struct wiphy_vendor_command *vcmd, 13123 struct nlattr *attr, 13124 struct netlink_ext_ack *extack) 13125 { 13126 if (vcmd->policy == VENDOR_CMD_RAW_DATA) { 13127 if (attr->nla_type & NLA_F_NESTED) { 13128 NL_SET_ERR_MSG_ATTR(extack, attr, 13129 "unexpected nested data"); 13130 return -EINVAL; 13131 } 13132 13133 return 0; 13134 } 13135 13136 if (!(attr->nla_type & NLA_F_NESTED)) { 13137 NL_SET_ERR_MSG_ATTR(extack, attr, "expected nested data"); 13138 return -EINVAL; 13139 } 13140 13141 return nla_validate_nested(attr, vcmd->maxattr, vcmd->policy, extack); 13142 } 13143 13144 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info) 13145 { 13146 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13147 struct wireless_dev *wdev = 13148 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs); 13149 int i, err; 13150 u32 vid, subcmd; 13151 13152 if (!rdev->wiphy.vendor_commands) 13153 return -EOPNOTSUPP; 13154 13155 if (IS_ERR(wdev)) { 13156 err = PTR_ERR(wdev); 13157 if (err != -EINVAL) 13158 return err; 13159 wdev = NULL; 13160 } else if (wdev->wiphy != &rdev->wiphy) { 13161 return -EINVAL; 13162 } 13163 13164 if (!info->attrs[NL80211_ATTR_VENDOR_ID] || 13165 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD]) 13166 return -EINVAL; 13167 13168 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]); 13169 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]); 13170 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { 13171 const struct wiphy_vendor_command *vcmd; 13172 void *data = NULL; 13173 int len = 0; 13174 13175 vcmd = &rdev->wiphy.vendor_commands[i]; 13176 13177 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) 13178 continue; 13179 13180 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | 13181 WIPHY_VENDOR_CMD_NEED_NETDEV)) { 13182 if (!wdev) 13183 return -EINVAL; 13184 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && 13185 !wdev->netdev) 13186 return -EINVAL; 13187 13188 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { 13189 if (!wdev_running(wdev)) 13190 return -ENETDOWN; 13191 } 13192 13193 if (!vcmd->doit) 13194 return -EOPNOTSUPP; 13195 } else { 13196 wdev = NULL; 13197 } 13198 13199 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { 13200 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); 13201 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); 13202 13203 err = nl80211_vendor_check_policy(vcmd, 13204 info->attrs[NL80211_ATTR_VENDOR_DATA], 13205 info->extack); 13206 if (err) 13207 return err; 13208 } 13209 13210 rdev->cur_cmd_info = info; 13211 err = vcmd->doit(&rdev->wiphy, wdev, data, len); 13212 rdev->cur_cmd_info = NULL; 13213 return err; 13214 } 13215 13216 return -EOPNOTSUPP; 13217 } 13218 13219 static int nl80211_prepare_vendor_dump(struct sk_buff *skb, 13220 struct netlink_callback *cb, 13221 struct cfg80211_registered_device **rdev, 13222 struct wireless_dev **wdev) 13223 { 13224 struct nlattr **attrbuf; 13225 u32 vid, subcmd; 13226 unsigned int i; 13227 int vcmd_idx = -1; 13228 int err; 13229 void *data = NULL; 13230 unsigned int data_len = 0; 13231 13232 if (cb->args[0]) { 13233 /* subtract the 1 again here */ 13234 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); 13235 struct wireless_dev *tmp; 13236 13237 if (!wiphy) 13238 return -ENODEV; 13239 *rdev = wiphy_to_rdev(wiphy); 13240 *wdev = NULL; 13241 13242 if (cb->args[1]) { 13243 list_for_each_entry(tmp, &wiphy->wdev_list, list) { 13244 if (tmp->identifier == cb->args[1] - 1) { 13245 *wdev = tmp; 13246 break; 13247 } 13248 } 13249 } 13250 13251 /* keep rtnl locked in successful case */ 13252 return 0; 13253 } 13254 13255 attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf), GFP_KERNEL); 13256 if (!attrbuf) 13257 return -ENOMEM; 13258 13259 err = nlmsg_parse_deprecated(cb->nlh, 13260 GENL_HDRLEN + nl80211_fam.hdrsize, 13261 attrbuf, nl80211_fam.maxattr, 13262 nl80211_policy, NULL); 13263 if (err) 13264 goto out; 13265 13266 if (!attrbuf[NL80211_ATTR_VENDOR_ID] || 13267 !attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) { 13268 err = -EINVAL; 13269 goto out; 13270 } 13271 13272 *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), attrbuf); 13273 if (IS_ERR(*wdev)) 13274 *wdev = NULL; 13275 13276 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); 13277 if (IS_ERR(*rdev)) { 13278 err = PTR_ERR(*rdev); 13279 goto out; 13280 } 13281 13282 vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]); 13283 subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]); 13284 13285 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { 13286 const struct wiphy_vendor_command *vcmd; 13287 13288 vcmd = &(*rdev)->wiphy.vendor_commands[i]; 13289 13290 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) 13291 continue; 13292 13293 if (!vcmd->dumpit) { 13294 err = -EOPNOTSUPP; 13295 goto out; 13296 } 13297 13298 vcmd_idx = i; 13299 break; 13300 } 13301 13302 if (vcmd_idx < 0) { 13303 err = -EOPNOTSUPP; 13304 goto out; 13305 } 13306 13307 if (attrbuf[NL80211_ATTR_VENDOR_DATA]) { 13308 data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]); 13309 data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]); 13310 13311 err = nl80211_vendor_check_policy( 13312 &(*rdev)->wiphy.vendor_commands[vcmd_idx], 13313 attrbuf[NL80211_ATTR_VENDOR_DATA], 13314 cb->extack); 13315 if (err) 13316 goto out; 13317 } 13318 13319 /* 0 is the first index - add 1 to parse only once */ 13320 cb->args[0] = (*rdev)->wiphy_idx + 1; 13321 /* add 1 to know if it was NULL */ 13322 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0; 13323 cb->args[2] = vcmd_idx; 13324 cb->args[3] = (unsigned long)data; 13325 cb->args[4] = data_len; 13326 13327 /* keep rtnl locked in successful case */ 13328 err = 0; 13329 out: 13330 kfree(attrbuf); 13331 return err; 13332 } 13333 13334 static int nl80211_vendor_cmd_dump(struct sk_buff *skb, 13335 struct netlink_callback *cb) 13336 { 13337 struct cfg80211_registered_device *rdev; 13338 struct wireless_dev *wdev; 13339 unsigned int vcmd_idx; 13340 const struct wiphy_vendor_command *vcmd; 13341 void *data; 13342 int data_len; 13343 int err; 13344 struct nlattr *vendor_data; 13345 13346 rtnl_lock(); 13347 err = nl80211_prepare_vendor_dump(skb, cb, &rdev, &wdev); 13348 if (err) 13349 goto out; 13350 13351 vcmd_idx = cb->args[2]; 13352 data = (void *)cb->args[3]; 13353 data_len = cb->args[4]; 13354 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx]; 13355 13356 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | 13357 WIPHY_VENDOR_CMD_NEED_NETDEV)) { 13358 if (!wdev) { 13359 err = -EINVAL; 13360 goto out; 13361 } 13362 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && 13363 !wdev->netdev) { 13364 err = -EINVAL; 13365 goto out; 13366 } 13367 13368 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { 13369 if (!wdev_running(wdev)) { 13370 err = -ENETDOWN; 13371 goto out; 13372 } 13373 } 13374 } 13375 13376 while (1) { 13377 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 13378 cb->nlh->nlmsg_seq, NLM_F_MULTI, 13379 NL80211_CMD_VENDOR); 13380 if (!hdr) 13381 break; 13382 13383 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 13384 (wdev && nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 13385 wdev_id(wdev), 13386 NL80211_ATTR_PAD))) { 13387 genlmsg_cancel(skb, hdr); 13388 break; 13389 } 13390 13391 vendor_data = nla_nest_start_noflag(skb, 13392 NL80211_ATTR_VENDOR_DATA); 13393 if (!vendor_data) { 13394 genlmsg_cancel(skb, hdr); 13395 break; 13396 } 13397 13398 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len, 13399 (unsigned long *)&cb->args[5]); 13400 nla_nest_end(skb, vendor_data); 13401 13402 if (err == -ENOBUFS || err == -ENOENT) { 13403 genlmsg_cancel(skb, hdr); 13404 break; 13405 } else if (err) { 13406 genlmsg_cancel(skb, hdr); 13407 goto out; 13408 } 13409 13410 genlmsg_end(skb, hdr); 13411 } 13412 13413 err = skb->len; 13414 out: 13415 rtnl_unlock(); 13416 return err; 13417 } 13418 13419 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy, 13420 enum nl80211_commands cmd, 13421 enum nl80211_attrs attr, 13422 int approxlen) 13423 { 13424 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 13425 13426 if (WARN_ON(!rdev->cur_cmd_info)) 13427 return NULL; 13428 13429 return __cfg80211_alloc_vendor_skb(rdev, NULL, approxlen, 13430 rdev->cur_cmd_info->snd_portid, 13431 rdev->cur_cmd_info->snd_seq, 13432 cmd, attr, NULL, GFP_KERNEL); 13433 } 13434 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb); 13435 13436 int cfg80211_vendor_cmd_reply(struct sk_buff *skb) 13437 { 13438 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 13439 void *hdr = ((void **)skb->cb)[1]; 13440 struct nlattr *data = ((void **)skb->cb)[2]; 13441 13442 /* clear CB data for netlink core to own from now on */ 13443 memset(skb->cb, 0, sizeof(skb->cb)); 13444 13445 if (WARN_ON(!rdev->cur_cmd_info)) { 13446 kfree_skb(skb); 13447 return -EINVAL; 13448 } 13449 13450 nla_nest_end(skb, data); 13451 genlmsg_end(skb, hdr); 13452 return genlmsg_reply(skb, rdev->cur_cmd_info); 13453 } 13454 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply); 13455 13456 unsigned int cfg80211_vendor_cmd_get_sender(struct wiphy *wiphy) 13457 { 13458 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 13459 13460 if (WARN_ON(!rdev->cur_cmd_info)) 13461 return 0; 13462 13463 return rdev->cur_cmd_info->snd_portid; 13464 } 13465 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_get_sender); 13466 13467 static int nl80211_set_qos_map(struct sk_buff *skb, 13468 struct genl_info *info) 13469 { 13470 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13471 struct cfg80211_qos_map *qos_map = NULL; 13472 struct net_device *dev = info->user_ptr[1]; 13473 u8 *pos, len, num_des, des_len, des; 13474 int ret; 13475 13476 if (!rdev->ops->set_qos_map) 13477 return -EOPNOTSUPP; 13478 13479 if (info->attrs[NL80211_ATTR_QOS_MAP]) { 13480 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]); 13481 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]); 13482 13483 if (len % 2 || len < IEEE80211_QOS_MAP_LEN_MIN || 13484 len > IEEE80211_QOS_MAP_LEN_MAX) 13485 return -EINVAL; 13486 13487 qos_map = kzalloc(sizeof(struct cfg80211_qos_map), GFP_KERNEL); 13488 if (!qos_map) 13489 return -ENOMEM; 13490 13491 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1; 13492 if (num_des) { 13493 des_len = num_des * 13494 sizeof(struct cfg80211_dscp_exception); 13495 memcpy(qos_map->dscp_exception, pos, des_len); 13496 qos_map->num_des = num_des; 13497 for (des = 0; des < num_des; des++) { 13498 if (qos_map->dscp_exception[des].up > 7) { 13499 kfree(qos_map); 13500 return -EINVAL; 13501 } 13502 } 13503 pos += des_len; 13504 } 13505 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN); 13506 } 13507 13508 wdev_lock(dev->ieee80211_ptr); 13509 ret = nl80211_key_allowed(dev->ieee80211_ptr); 13510 if (!ret) 13511 ret = rdev_set_qos_map(rdev, dev, qos_map); 13512 wdev_unlock(dev->ieee80211_ptr); 13513 13514 kfree(qos_map); 13515 return ret; 13516 } 13517 13518 static int nl80211_add_tx_ts(struct sk_buff *skb, struct genl_info *info) 13519 { 13520 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13521 struct net_device *dev = info->user_ptr[1]; 13522 struct wireless_dev *wdev = dev->ieee80211_ptr; 13523 const u8 *peer; 13524 u8 tsid, up; 13525 u16 admitted_time = 0; 13526 int err; 13527 13528 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)) 13529 return -EOPNOTSUPP; 13530 13531 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] || 13532 !info->attrs[NL80211_ATTR_USER_PRIO]) 13533 return -EINVAL; 13534 13535 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); 13536 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]); 13537 13538 /* WMM uses TIDs 0-7 even for TSPEC */ 13539 if (tsid >= IEEE80211_FIRST_TSPEC_TSID) { 13540 /* TODO: handle 802.11 TSPEC/admission control 13541 * need more attributes for that (e.g. BA session requirement); 13542 * change the WMM adminssion test above to allow both then 13543 */ 13544 return -EINVAL; 13545 } 13546 13547 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 13548 13549 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) { 13550 admitted_time = 13551 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]); 13552 if (!admitted_time) 13553 return -EINVAL; 13554 } 13555 13556 wdev_lock(wdev); 13557 switch (wdev->iftype) { 13558 case NL80211_IFTYPE_STATION: 13559 case NL80211_IFTYPE_P2P_CLIENT: 13560 if (wdev->current_bss) 13561 break; 13562 err = -ENOTCONN; 13563 goto out; 13564 default: 13565 err = -EOPNOTSUPP; 13566 goto out; 13567 } 13568 13569 err = rdev_add_tx_ts(rdev, dev, tsid, peer, up, admitted_time); 13570 13571 out: 13572 wdev_unlock(wdev); 13573 return err; 13574 } 13575 13576 static int nl80211_del_tx_ts(struct sk_buff *skb, struct genl_info *info) 13577 { 13578 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13579 struct net_device *dev = info->user_ptr[1]; 13580 struct wireless_dev *wdev = dev->ieee80211_ptr; 13581 const u8 *peer; 13582 u8 tsid; 13583 int err; 13584 13585 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC]) 13586 return -EINVAL; 13587 13588 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); 13589 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 13590 13591 wdev_lock(wdev); 13592 err = rdev_del_tx_ts(rdev, dev, tsid, peer); 13593 wdev_unlock(wdev); 13594 13595 return err; 13596 } 13597 13598 static int nl80211_tdls_channel_switch(struct sk_buff *skb, 13599 struct genl_info *info) 13600 { 13601 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13602 struct net_device *dev = info->user_ptr[1]; 13603 struct wireless_dev *wdev = dev->ieee80211_ptr; 13604 struct cfg80211_chan_def chandef = {}; 13605 const u8 *addr; 13606 u8 oper_class; 13607 int err; 13608 13609 if (!rdev->ops->tdls_channel_switch || 13610 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) 13611 return -EOPNOTSUPP; 13612 13613 switch (dev->ieee80211_ptr->iftype) { 13614 case NL80211_IFTYPE_STATION: 13615 case NL80211_IFTYPE_P2P_CLIENT: 13616 break; 13617 default: 13618 return -EOPNOTSUPP; 13619 } 13620 13621 if (!info->attrs[NL80211_ATTR_MAC] || 13622 !info->attrs[NL80211_ATTR_OPER_CLASS]) 13623 return -EINVAL; 13624 13625 err = nl80211_parse_chandef(rdev, info, &chandef); 13626 if (err) 13627 return err; 13628 13629 /* 13630 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012 13631 * section 10.22.6.2.1. Disallow 5/10Mhz channels as well for now, the 13632 * specification is not defined for them. 13633 */ 13634 if (chandef.chan->band == NL80211_BAND_2GHZ && 13635 chandef.width != NL80211_CHAN_WIDTH_20_NOHT && 13636 chandef.width != NL80211_CHAN_WIDTH_20) 13637 return -EINVAL; 13638 13639 /* we will be active on the TDLS link */ 13640 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, 13641 wdev->iftype)) 13642 return -EINVAL; 13643 13644 /* don't allow switching to DFS channels */ 13645 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype)) 13646 return -EINVAL; 13647 13648 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 13649 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]); 13650 13651 wdev_lock(wdev); 13652 err = rdev_tdls_channel_switch(rdev, dev, addr, oper_class, &chandef); 13653 wdev_unlock(wdev); 13654 13655 return err; 13656 } 13657 13658 static int nl80211_tdls_cancel_channel_switch(struct sk_buff *skb, 13659 struct genl_info *info) 13660 { 13661 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13662 struct net_device *dev = info->user_ptr[1]; 13663 struct wireless_dev *wdev = dev->ieee80211_ptr; 13664 const u8 *addr; 13665 13666 if (!rdev->ops->tdls_channel_switch || 13667 !rdev->ops->tdls_cancel_channel_switch || 13668 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) 13669 return -EOPNOTSUPP; 13670 13671 switch (dev->ieee80211_ptr->iftype) { 13672 case NL80211_IFTYPE_STATION: 13673 case NL80211_IFTYPE_P2P_CLIENT: 13674 break; 13675 default: 13676 return -EOPNOTSUPP; 13677 } 13678 13679 if (!info->attrs[NL80211_ATTR_MAC]) 13680 return -EINVAL; 13681 13682 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 13683 13684 wdev_lock(wdev); 13685 rdev_tdls_cancel_channel_switch(rdev, dev, addr); 13686 wdev_unlock(wdev); 13687 13688 return 0; 13689 } 13690 13691 static int nl80211_set_multicast_to_unicast(struct sk_buff *skb, 13692 struct genl_info *info) 13693 { 13694 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13695 struct net_device *dev = info->user_ptr[1]; 13696 struct wireless_dev *wdev = dev->ieee80211_ptr; 13697 const struct nlattr *nla; 13698 bool enabled; 13699 13700 if (!rdev->ops->set_multicast_to_unicast) 13701 return -EOPNOTSUPP; 13702 13703 if (wdev->iftype != NL80211_IFTYPE_AP && 13704 wdev->iftype != NL80211_IFTYPE_P2P_GO) 13705 return -EOPNOTSUPP; 13706 13707 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED]; 13708 enabled = nla_get_flag(nla); 13709 13710 return rdev_set_multicast_to_unicast(rdev, dev, enabled); 13711 } 13712 13713 static int nl80211_set_pmk(struct sk_buff *skb, struct genl_info *info) 13714 { 13715 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13716 struct net_device *dev = info->user_ptr[1]; 13717 struct wireless_dev *wdev = dev->ieee80211_ptr; 13718 struct cfg80211_pmk_conf pmk_conf = {}; 13719 int ret; 13720 13721 if (wdev->iftype != NL80211_IFTYPE_STATION && 13722 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 13723 return -EOPNOTSUPP; 13724 13725 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13726 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 13727 return -EOPNOTSUPP; 13728 13729 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK]) 13730 return -EINVAL; 13731 13732 wdev_lock(wdev); 13733 if (!wdev->current_bss) { 13734 ret = -ENOTCONN; 13735 goto out; 13736 } 13737 13738 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]); 13739 if (memcmp(pmk_conf.aa, wdev->current_bss->pub.bssid, ETH_ALEN)) { 13740 ret = -EINVAL; 13741 goto out; 13742 } 13743 13744 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); 13745 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); 13746 if (pmk_conf.pmk_len != WLAN_PMK_LEN && 13747 pmk_conf.pmk_len != WLAN_PMK_LEN_SUITE_B_192) { 13748 ret = -EINVAL; 13749 goto out; 13750 } 13751 13752 if (info->attrs[NL80211_ATTR_PMKR0_NAME]) { 13753 int r0_name_len = nla_len(info->attrs[NL80211_ATTR_PMKR0_NAME]); 13754 13755 if (r0_name_len != WLAN_PMK_NAME_LEN) { 13756 ret = -EINVAL; 13757 goto out; 13758 } 13759 13760 pmk_conf.pmk_r0_name = 13761 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]); 13762 } 13763 13764 ret = rdev_set_pmk(rdev, dev, &pmk_conf); 13765 out: 13766 wdev_unlock(wdev); 13767 return ret; 13768 } 13769 13770 static int nl80211_del_pmk(struct sk_buff *skb, struct genl_info *info) 13771 { 13772 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13773 struct net_device *dev = info->user_ptr[1]; 13774 struct wireless_dev *wdev = dev->ieee80211_ptr; 13775 const u8 *aa; 13776 int ret; 13777 13778 if (wdev->iftype != NL80211_IFTYPE_STATION && 13779 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 13780 return -EOPNOTSUPP; 13781 13782 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13783 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 13784 return -EOPNOTSUPP; 13785 13786 if (!info->attrs[NL80211_ATTR_MAC]) 13787 return -EINVAL; 13788 13789 wdev_lock(wdev); 13790 aa = nla_data(info->attrs[NL80211_ATTR_MAC]); 13791 ret = rdev_del_pmk(rdev, dev, aa); 13792 wdev_unlock(wdev); 13793 13794 return ret; 13795 } 13796 13797 static int nl80211_external_auth(struct sk_buff *skb, struct genl_info *info) 13798 { 13799 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13800 struct net_device *dev = info->user_ptr[1]; 13801 struct cfg80211_external_auth_params params; 13802 13803 if (!rdev->ops->external_auth) 13804 return -EOPNOTSUPP; 13805 13806 if (!info->attrs[NL80211_ATTR_SSID] && 13807 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 13808 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 13809 return -EINVAL; 13810 13811 if (!info->attrs[NL80211_ATTR_BSSID]) 13812 return -EINVAL; 13813 13814 if (!info->attrs[NL80211_ATTR_STATUS_CODE]) 13815 return -EINVAL; 13816 13817 memset(¶ms, 0, sizeof(params)); 13818 13819 if (info->attrs[NL80211_ATTR_SSID]) { 13820 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 13821 if (params.ssid.ssid_len == 0 || 13822 params.ssid.ssid_len > IEEE80211_MAX_SSID_LEN) 13823 return -EINVAL; 13824 memcpy(params.ssid.ssid, 13825 nla_data(info->attrs[NL80211_ATTR_SSID]), 13826 params.ssid.ssid_len); 13827 } 13828 13829 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), 13830 ETH_ALEN); 13831 13832 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 13833 13834 if (info->attrs[NL80211_ATTR_PMKID]) 13835 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 13836 13837 return rdev_external_auth(rdev, dev, ¶ms); 13838 } 13839 13840 static int nl80211_tx_control_port(struct sk_buff *skb, struct genl_info *info) 13841 { 13842 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13843 struct net_device *dev = info->user_ptr[1]; 13844 struct wireless_dev *wdev = dev->ieee80211_ptr; 13845 const u8 *buf; 13846 size_t len; 13847 u8 *dest; 13848 u16 proto; 13849 bool noencrypt; 13850 int err; 13851 13852 if (!wiphy_ext_feature_isset(&rdev->wiphy, 13853 NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211)) 13854 return -EOPNOTSUPP; 13855 13856 if (!rdev->ops->tx_control_port) 13857 return -EOPNOTSUPP; 13858 13859 if (!info->attrs[NL80211_ATTR_FRAME] || 13860 !info->attrs[NL80211_ATTR_MAC] || 13861 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { 13862 GENL_SET_ERR_MSG(info, "Frame, MAC or ethertype missing"); 13863 return -EINVAL; 13864 } 13865 13866 wdev_lock(wdev); 13867 13868 switch (wdev->iftype) { 13869 case NL80211_IFTYPE_AP: 13870 case NL80211_IFTYPE_P2P_GO: 13871 case NL80211_IFTYPE_MESH_POINT: 13872 break; 13873 case NL80211_IFTYPE_ADHOC: 13874 case NL80211_IFTYPE_STATION: 13875 case NL80211_IFTYPE_P2P_CLIENT: 13876 if (wdev->current_bss) 13877 break; 13878 err = -ENOTCONN; 13879 goto out; 13880 default: 13881 err = -EOPNOTSUPP; 13882 goto out; 13883 } 13884 13885 wdev_unlock(wdev); 13886 13887 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 13888 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 13889 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); 13890 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); 13891 noencrypt = 13892 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]); 13893 13894 return rdev_tx_control_port(rdev, dev, buf, len, 13895 dest, cpu_to_be16(proto), noencrypt); 13896 13897 out: 13898 wdev_unlock(wdev); 13899 return err; 13900 } 13901 13902 static int nl80211_get_ftm_responder_stats(struct sk_buff *skb, 13903 struct genl_info *info) 13904 { 13905 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13906 struct net_device *dev = info->user_ptr[1]; 13907 struct wireless_dev *wdev = dev->ieee80211_ptr; 13908 struct cfg80211_ftm_responder_stats ftm_stats = {}; 13909 struct sk_buff *msg; 13910 void *hdr; 13911 struct nlattr *ftm_stats_attr; 13912 int err; 13913 13914 if (wdev->iftype != NL80211_IFTYPE_AP || !wdev->beacon_interval) 13915 return -EOPNOTSUPP; 13916 13917 err = rdev_get_ftm_responder_stats(rdev, dev, &ftm_stats); 13918 if (err) 13919 return err; 13920 13921 if (!ftm_stats.filled) 13922 return -ENODATA; 13923 13924 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 13925 if (!msg) 13926 return -ENOMEM; 13927 13928 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 13929 NL80211_CMD_GET_FTM_RESPONDER_STATS); 13930 if (!hdr) 13931 goto nla_put_failure; 13932 13933 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 13934 goto nla_put_failure; 13935 13936 ftm_stats_attr = nla_nest_start_noflag(msg, 13937 NL80211_ATTR_FTM_RESPONDER_STATS); 13938 if (!ftm_stats_attr) 13939 goto nla_put_failure; 13940 13941 #define SET_FTM(field, name, type) \ 13942 do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \ 13943 nla_put_ ## type(msg, NL80211_FTM_STATS_ ## name, \ 13944 ftm_stats.field)) \ 13945 goto nla_put_failure; } while (0) 13946 #define SET_FTM_U64(field, name) \ 13947 do { if ((ftm_stats.filled & BIT(NL80211_FTM_STATS_ ## name)) && \ 13948 nla_put_u64_64bit(msg, NL80211_FTM_STATS_ ## name, \ 13949 ftm_stats.field, NL80211_FTM_STATS_PAD)) \ 13950 goto nla_put_failure; } while (0) 13951 13952 SET_FTM(success_num, SUCCESS_NUM, u32); 13953 SET_FTM(partial_num, PARTIAL_NUM, u32); 13954 SET_FTM(failed_num, FAILED_NUM, u32); 13955 SET_FTM(asap_num, ASAP_NUM, u32); 13956 SET_FTM(non_asap_num, NON_ASAP_NUM, u32); 13957 SET_FTM_U64(total_duration_ms, TOTAL_DURATION_MSEC); 13958 SET_FTM(unknown_triggers_num, UNKNOWN_TRIGGERS_NUM, u32); 13959 SET_FTM(reschedule_requests_num, RESCHEDULE_REQUESTS_NUM, u32); 13960 SET_FTM(out_of_window_triggers_num, OUT_OF_WINDOW_TRIGGERS_NUM, u32); 13961 #undef SET_FTM 13962 13963 nla_nest_end(msg, ftm_stats_attr); 13964 13965 genlmsg_end(msg, hdr); 13966 return genlmsg_reply(msg, info); 13967 13968 nla_put_failure: 13969 nlmsg_free(msg); 13970 return -ENOBUFS; 13971 } 13972 13973 static int nl80211_update_owe_info(struct sk_buff *skb, struct genl_info *info) 13974 { 13975 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 13976 struct cfg80211_update_owe_info owe_info; 13977 struct net_device *dev = info->user_ptr[1]; 13978 13979 if (!rdev->ops->update_owe_info) 13980 return -EOPNOTSUPP; 13981 13982 if (!info->attrs[NL80211_ATTR_STATUS_CODE] || 13983 !info->attrs[NL80211_ATTR_MAC]) 13984 return -EINVAL; 13985 13986 memset(&owe_info, 0, sizeof(owe_info)); 13987 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 13988 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN); 13989 13990 if (info->attrs[NL80211_ATTR_IE]) { 13991 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 13992 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 13993 } 13994 13995 return rdev_update_owe_info(rdev, dev, &owe_info); 13996 } 13997 13998 static int nl80211_probe_mesh_link(struct sk_buff *skb, struct genl_info *info) 13999 { 14000 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14001 struct net_device *dev = info->user_ptr[1]; 14002 struct wireless_dev *wdev = dev->ieee80211_ptr; 14003 struct station_info sinfo = {}; 14004 const u8 *buf; 14005 size_t len; 14006 u8 *dest; 14007 int err; 14008 14009 if (!rdev->ops->probe_mesh_link || !rdev->ops->get_station) 14010 return -EOPNOTSUPP; 14011 14012 if (!info->attrs[NL80211_ATTR_MAC] || 14013 !info->attrs[NL80211_ATTR_FRAME]) { 14014 GENL_SET_ERR_MSG(info, "Frame or MAC missing"); 14015 return -EINVAL; 14016 } 14017 14018 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 14019 return -EOPNOTSUPP; 14020 14021 dest = nla_data(info->attrs[NL80211_ATTR_MAC]); 14022 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 14023 len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 14024 14025 if (len < sizeof(struct ethhdr)) 14026 return -EINVAL; 14027 14028 if (!ether_addr_equal(buf, dest) || is_multicast_ether_addr(buf) || 14029 !ether_addr_equal(buf + ETH_ALEN, dev->dev_addr)) 14030 return -EINVAL; 14031 14032 err = rdev_get_station(rdev, dev, dest, &sinfo); 14033 if (err) 14034 return err; 14035 14036 cfg80211_sinfo_release_content(&sinfo); 14037 14038 return rdev_probe_mesh_link(rdev, dev, dest, buf, len); 14039 } 14040 14041 static int parse_tid_conf(struct cfg80211_registered_device *rdev, 14042 struct nlattr *attrs[], struct net_device *dev, 14043 struct cfg80211_tid_cfg *tid_conf, 14044 struct genl_info *info, const u8 *peer) 14045 { 14046 struct netlink_ext_ack *extack = info->extack; 14047 u64 mask; 14048 int err; 14049 14050 if (!attrs[NL80211_TID_CONFIG_ATTR_TIDS]) 14051 return -EINVAL; 14052 14053 tid_conf->config_override = 14054 nla_get_flag(attrs[NL80211_TID_CONFIG_ATTR_OVERRIDE]); 14055 tid_conf->tids = nla_get_u16(attrs[NL80211_TID_CONFIG_ATTR_TIDS]); 14056 14057 if (tid_conf->config_override) { 14058 if (rdev->ops->reset_tid_config) { 14059 err = rdev_reset_tid_config(rdev, dev, peer, 14060 tid_conf->tids); 14061 /* If peer is there no other configuration will be 14062 * allowed 14063 */ 14064 if (err || peer) 14065 return err; 14066 } else { 14067 return -EINVAL; 14068 } 14069 } 14070 14071 if (attrs[NL80211_TID_CONFIG_ATTR_NOACK]) { 14072 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_NOACK); 14073 tid_conf->noack = 14074 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_NOACK]); 14075 } 14076 14077 if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]) { 14078 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_SHORT); 14079 tid_conf->retry_short = 14080 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_SHORT]); 14081 14082 if (tid_conf->retry_short > rdev->wiphy.max_data_retry_count) 14083 return -EINVAL; 14084 } 14085 14086 if (attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]) { 14087 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RETRY_LONG); 14088 tid_conf->retry_long = 14089 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RETRY_LONG]); 14090 14091 if (tid_conf->retry_long > rdev->wiphy.max_data_retry_count) 14092 return -EINVAL; 14093 } 14094 14095 if (attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]) { 14096 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL); 14097 tid_conf->ampdu = 14098 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_AMPDU_CTRL]); 14099 } 14100 14101 if (attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]) { 14102 tid_conf->mask |= BIT(NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL); 14103 tid_conf->rtscts = 14104 nla_get_u8(attrs[NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL]); 14105 } 14106 14107 if (peer) 14108 mask = rdev->wiphy.tid_config_support.peer; 14109 else 14110 mask = rdev->wiphy.tid_config_support.vif; 14111 14112 if (tid_conf->mask & ~mask) { 14113 NL_SET_ERR_MSG(extack, "unsupported TID configuration"); 14114 return -ENOTSUPP; 14115 } 14116 14117 return 0; 14118 } 14119 14120 static int nl80211_set_tid_config(struct sk_buff *skb, 14121 struct genl_info *info) 14122 { 14123 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 14124 struct nlattr *attrs[NL80211_TID_CONFIG_ATTR_MAX + 1]; 14125 struct net_device *dev = info->user_ptr[1]; 14126 struct cfg80211_tid_config *tid_config; 14127 struct nlattr *tid; 14128 int conf_idx = 0, rem_conf; 14129 int ret = -EINVAL; 14130 u32 num_conf = 0; 14131 14132 if (!info->attrs[NL80211_ATTR_TID_CONFIG]) 14133 return -EINVAL; 14134 14135 if (!rdev->ops->set_tid_config) 14136 return -EOPNOTSUPP; 14137 14138 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], 14139 rem_conf) 14140 num_conf++; 14141 14142 tid_config = kzalloc(struct_size(tid_config, tid_conf, num_conf), 14143 GFP_KERNEL); 14144 if (!tid_config) 14145 return -ENOMEM; 14146 14147 tid_config->n_tid_conf = num_conf; 14148 14149 if (info->attrs[NL80211_ATTR_MAC]) 14150 tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 14151 14152 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG], 14153 rem_conf) { 14154 ret = nla_parse_nested(attrs, NL80211_TID_CONFIG_ATTR_MAX, 14155 tid, NULL, NULL); 14156 14157 if (ret) 14158 goto bad_tid_conf; 14159 14160 ret = parse_tid_conf(rdev, attrs, dev, 14161 &tid_config->tid_conf[conf_idx], 14162 info, tid_config->peer); 14163 if (ret) 14164 goto bad_tid_conf; 14165 14166 conf_idx++; 14167 } 14168 14169 ret = rdev_set_tid_config(rdev, dev, tid_config); 14170 14171 bad_tid_conf: 14172 kfree(tid_config); 14173 return ret; 14174 } 14175 14176 #define NL80211_FLAG_NEED_WIPHY 0x01 14177 #define NL80211_FLAG_NEED_NETDEV 0x02 14178 #define NL80211_FLAG_NEED_RTNL 0x04 14179 #define NL80211_FLAG_CHECK_NETDEV_UP 0x08 14180 #define NL80211_FLAG_NEED_NETDEV_UP (NL80211_FLAG_NEED_NETDEV |\ 14181 NL80211_FLAG_CHECK_NETDEV_UP) 14182 #define NL80211_FLAG_NEED_WDEV 0x10 14183 /* If a netdev is associated, it must be UP, P2P must be started */ 14184 #define NL80211_FLAG_NEED_WDEV_UP (NL80211_FLAG_NEED_WDEV |\ 14185 NL80211_FLAG_CHECK_NETDEV_UP) 14186 #define NL80211_FLAG_CLEAR_SKB 0x20 14187 14188 static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, 14189 struct genl_info *info) 14190 { 14191 struct cfg80211_registered_device *rdev; 14192 struct wireless_dev *wdev; 14193 struct net_device *dev; 14194 bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL; 14195 14196 if (rtnl) 14197 rtnl_lock(); 14198 14199 if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) { 14200 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 14201 if (IS_ERR(rdev)) { 14202 if (rtnl) 14203 rtnl_unlock(); 14204 return PTR_ERR(rdev); 14205 } 14206 info->user_ptr[0] = rdev; 14207 } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV || 14208 ops->internal_flags & NL80211_FLAG_NEED_WDEV) { 14209 ASSERT_RTNL(); 14210 14211 wdev = __cfg80211_wdev_from_attrs(genl_info_net(info), 14212 info->attrs); 14213 if (IS_ERR(wdev)) { 14214 if (rtnl) 14215 rtnl_unlock(); 14216 return PTR_ERR(wdev); 14217 } 14218 14219 dev = wdev->netdev; 14220 rdev = wiphy_to_rdev(wdev->wiphy); 14221 14222 if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) { 14223 if (!dev) { 14224 if (rtnl) 14225 rtnl_unlock(); 14226 return -EINVAL; 14227 } 14228 14229 info->user_ptr[1] = dev; 14230 } else { 14231 info->user_ptr[1] = wdev; 14232 } 14233 14234 if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && 14235 !wdev_running(wdev)) { 14236 if (rtnl) 14237 rtnl_unlock(); 14238 return -ENETDOWN; 14239 } 14240 14241 if (dev) 14242 dev_hold(dev); 14243 14244 info->user_ptr[0] = rdev; 14245 } 14246 14247 return 0; 14248 } 14249 14250 static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb, 14251 struct genl_info *info) 14252 { 14253 if (info->user_ptr[1]) { 14254 if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) { 14255 struct wireless_dev *wdev = info->user_ptr[1]; 14256 14257 if (wdev->netdev) 14258 dev_put(wdev->netdev); 14259 } else { 14260 dev_put(info->user_ptr[1]); 14261 } 14262 } 14263 14264 if (ops->internal_flags & NL80211_FLAG_NEED_RTNL) 14265 rtnl_unlock(); 14266 14267 /* If needed, clear the netlink message payload from the SKB 14268 * as it might contain key data that shouldn't stick around on 14269 * the heap after the SKB is freed. The netlink message header 14270 * is still needed for further processing, so leave it intact. 14271 */ 14272 if (ops->internal_flags & NL80211_FLAG_CLEAR_SKB) { 14273 struct nlmsghdr *nlh = nlmsg_hdr(skb); 14274 14275 memset(nlmsg_data(nlh), 0, nlmsg_len(nlh)); 14276 } 14277 } 14278 14279 static const struct genl_ops nl80211_ops[] = { 14280 { 14281 .cmd = NL80211_CMD_GET_WIPHY, 14282 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14283 .doit = nl80211_get_wiphy, 14284 .dumpit = nl80211_dump_wiphy, 14285 .done = nl80211_dump_wiphy_done, 14286 /* can be retrieved by unprivileged users */ 14287 .internal_flags = NL80211_FLAG_NEED_WIPHY | 14288 NL80211_FLAG_NEED_RTNL, 14289 }, 14290 { 14291 .cmd = NL80211_CMD_SET_WIPHY, 14292 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14293 .doit = nl80211_set_wiphy, 14294 .flags = GENL_UNS_ADMIN_PERM, 14295 .internal_flags = NL80211_FLAG_NEED_RTNL, 14296 }, 14297 { 14298 .cmd = NL80211_CMD_GET_INTERFACE, 14299 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14300 .doit = nl80211_get_interface, 14301 .dumpit = nl80211_dump_interface, 14302 /* can be retrieved by unprivileged users */ 14303 .internal_flags = NL80211_FLAG_NEED_WDEV | 14304 NL80211_FLAG_NEED_RTNL, 14305 }, 14306 { 14307 .cmd = NL80211_CMD_SET_INTERFACE, 14308 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14309 .doit = nl80211_set_interface, 14310 .flags = GENL_UNS_ADMIN_PERM, 14311 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14312 NL80211_FLAG_NEED_RTNL, 14313 }, 14314 { 14315 .cmd = NL80211_CMD_NEW_INTERFACE, 14316 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14317 .doit = nl80211_new_interface, 14318 .flags = GENL_UNS_ADMIN_PERM, 14319 .internal_flags = NL80211_FLAG_NEED_WIPHY | 14320 NL80211_FLAG_NEED_RTNL, 14321 }, 14322 { 14323 .cmd = NL80211_CMD_DEL_INTERFACE, 14324 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14325 .doit = nl80211_del_interface, 14326 .flags = GENL_UNS_ADMIN_PERM, 14327 .internal_flags = NL80211_FLAG_NEED_WDEV | 14328 NL80211_FLAG_NEED_RTNL, 14329 }, 14330 { 14331 .cmd = NL80211_CMD_GET_KEY, 14332 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14333 .doit = nl80211_get_key, 14334 .flags = GENL_UNS_ADMIN_PERM, 14335 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14336 NL80211_FLAG_NEED_RTNL, 14337 }, 14338 { 14339 .cmd = NL80211_CMD_SET_KEY, 14340 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14341 .doit = nl80211_set_key, 14342 .flags = GENL_UNS_ADMIN_PERM, 14343 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14344 NL80211_FLAG_NEED_RTNL | 14345 NL80211_FLAG_CLEAR_SKB, 14346 }, 14347 { 14348 .cmd = NL80211_CMD_NEW_KEY, 14349 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14350 .doit = nl80211_new_key, 14351 .flags = GENL_UNS_ADMIN_PERM, 14352 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14353 NL80211_FLAG_NEED_RTNL | 14354 NL80211_FLAG_CLEAR_SKB, 14355 }, 14356 { 14357 .cmd = NL80211_CMD_DEL_KEY, 14358 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14359 .doit = nl80211_del_key, 14360 .flags = GENL_UNS_ADMIN_PERM, 14361 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14362 NL80211_FLAG_NEED_RTNL, 14363 }, 14364 { 14365 .cmd = NL80211_CMD_SET_BEACON, 14366 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14367 .flags = GENL_UNS_ADMIN_PERM, 14368 .doit = nl80211_set_beacon, 14369 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14370 NL80211_FLAG_NEED_RTNL, 14371 }, 14372 { 14373 .cmd = NL80211_CMD_START_AP, 14374 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14375 .flags = GENL_UNS_ADMIN_PERM, 14376 .doit = nl80211_start_ap, 14377 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14378 NL80211_FLAG_NEED_RTNL, 14379 }, 14380 { 14381 .cmd = NL80211_CMD_STOP_AP, 14382 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14383 .flags = GENL_UNS_ADMIN_PERM, 14384 .doit = nl80211_stop_ap, 14385 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14386 NL80211_FLAG_NEED_RTNL, 14387 }, 14388 { 14389 .cmd = NL80211_CMD_GET_STATION, 14390 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14391 .doit = nl80211_get_station, 14392 .dumpit = nl80211_dump_station, 14393 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14394 NL80211_FLAG_NEED_RTNL, 14395 }, 14396 { 14397 .cmd = NL80211_CMD_SET_STATION, 14398 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14399 .doit = nl80211_set_station, 14400 .flags = GENL_UNS_ADMIN_PERM, 14401 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14402 NL80211_FLAG_NEED_RTNL, 14403 }, 14404 { 14405 .cmd = NL80211_CMD_NEW_STATION, 14406 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14407 .doit = nl80211_new_station, 14408 .flags = GENL_UNS_ADMIN_PERM, 14409 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14410 NL80211_FLAG_NEED_RTNL, 14411 }, 14412 { 14413 .cmd = NL80211_CMD_DEL_STATION, 14414 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14415 .doit = nl80211_del_station, 14416 .flags = GENL_UNS_ADMIN_PERM, 14417 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14418 NL80211_FLAG_NEED_RTNL, 14419 }, 14420 { 14421 .cmd = NL80211_CMD_GET_MPATH, 14422 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14423 .doit = nl80211_get_mpath, 14424 .dumpit = nl80211_dump_mpath, 14425 .flags = GENL_UNS_ADMIN_PERM, 14426 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14427 NL80211_FLAG_NEED_RTNL, 14428 }, 14429 { 14430 .cmd = NL80211_CMD_GET_MPP, 14431 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14432 .doit = nl80211_get_mpp, 14433 .dumpit = nl80211_dump_mpp, 14434 .flags = GENL_UNS_ADMIN_PERM, 14435 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14436 NL80211_FLAG_NEED_RTNL, 14437 }, 14438 { 14439 .cmd = NL80211_CMD_SET_MPATH, 14440 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14441 .doit = nl80211_set_mpath, 14442 .flags = GENL_UNS_ADMIN_PERM, 14443 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14444 NL80211_FLAG_NEED_RTNL, 14445 }, 14446 { 14447 .cmd = NL80211_CMD_NEW_MPATH, 14448 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14449 .doit = nl80211_new_mpath, 14450 .flags = GENL_UNS_ADMIN_PERM, 14451 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14452 NL80211_FLAG_NEED_RTNL, 14453 }, 14454 { 14455 .cmd = NL80211_CMD_DEL_MPATH, 14456 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14457 .doit = nl80211_del_mpath, 14458 .flags = GENL_UNS_ADMIN_PERM, 14459 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14460 NL80211_FLAG_NEED_RTNL, 14461 }, 14462 { 14463 .cmd = NL80211_CMD_SET_BSS, 14464 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14465 .doit = nl80211_set_bss, 14466 .flags = GENL_UNS_ADMIN_PERM, 14467 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14468 NL80211_FLAG_NEED_RTNL, 14469 }, 14470 { 14471 .cmd = NL80211_CMD_GET_REG, 14472 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14473 .doit = nl80211_get_reg_do, 14474 .dumpit = nl80211_get_reg_dump, 14475 .internal_flags = NL80211_FLAG_NEED_RTNL, 14476 /* can be retrieved by unprivileged users */ 14477 }, 14478 #ifdef CONFIG_CFG80211_CRDA_SUPPORT 14479 { 14480 .cmd = NL80211_CMD_SET_REG, 14481 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14482 .doit = nl80211_set_reg, 14483 .flags = GENL_ADMIN_PERM, 14484 .internal_flags = NL80211_FLAG_NEED_RTNL, 14485 }, 14486 #endif 14487 { 14488 .cmd = NL80211_CMD_REQ_SET_REG, 14489 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14490 .doit = nl80211_req_set_reg, 14491 .flags = GENL_ADMIN_PERM, 14492 }, 14493 { 14494 .cmd = NL80211_CMD_RELOAD_REGDB, 14495 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14496 .doit = nl80211_reload_regdb, 14497 .flags = GENL_ADMIN_PERM, 14498 }, 14499 { 14500 .cmd = NL80211_CMD_GET_MESH_CONFIG, 14501 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14502 .doit = nl80211_get_mesh_config, 14503 /* can be retrieved by unprivileged users */ 14504 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14505 NL80211_FLAG_NEED_RTNL, 14506 }, 14507 { 14508 .cmd = NL80211_CMD_SET_MESH_CONFIG, 14509 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14510 .doit = nl80211_update_mesh_config, 14511 .flags = GENL_UNS_ADMIN_PERM, 14512 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14513 NL80211_FLAG_NEED_RTNL, 14514 }, 14515 { 14516 .cmd = NL80211_CMD_TRIGGER_SCAN, 14517 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14518 .doit = nl80211_trigger_scan, 14519 .flags = GENL_UNS_ADMIN_PERM, 14520 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14521 NL80211_FLAG_NEED_RTNL, 14522 }, 14523 { 14524 .cmd = NL80211_CMD_ABORT_SCAN, 14525 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14526 .doit = nl80211_abort_scan, 14527 .flags = GENL_UNS_ADMIN_PERM, 14528 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14529 NL80211_FLAG_NEED_RTNL, 14530 }, 14531 { 14532 .cmd = NL80211_CMD_GET_SCAN, 14533 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14534 .dumpit = nl80211_dump_scan, 14535 }, 14536 { 14537 .cmd = NL80211_CMD_START_SCHED_SCAN, 14538 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14539 .doit = nl80211_start_sched_scan, 14540 .flags = GENL_UNS_ADMIN_PERM, 14541 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14542 NL80211_FLAG_NEED_RTNL, 14543 }, 14544 { 14545 .cmd = NL80211_CMD_STOP_SCHED_SCAN, 14546 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14547 .doit = nl80211_stop_sched_scan, 14548 .flags = GENL_UNS_ADMIN_PERM, 14549 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14550 NL80211_FLAG_NEED_RTNL, 14551 }, 14552 { 14553 .cmd = NL80211_CMD_AUTHENTICATE, 14554 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14555 .doit = nl80211_authenticate, 14556 .flags = GENL_UNS_ADMIN_PERM, 14557 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14558 NL80211_FLAG_NEED_RTNL | 14559 NL80211_FLAG_CLEAR_SKB, 14560 }, 14561 { 14562 .cmd = NL80211_CMD_ASSOCIATE, 14563 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14564 .doit = nl80211_associate, 14565 .flags = GENL_UNS_ADMIN_PERM, 14566 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14567 NL80211_FLAG_NEED_RTNL | 14568 NL80211_FLAG_CLEAR_SKB, 14569 }, 14570 { 14571 .cmd = NL80211_CMD_DEAUTHENTICATE, 14572 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14573 .doit = nl80211_deauthenticate, 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_DISASSOCIATE, 14580 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14581 .doit = nl80211_disassociate, 14582 .flags = GENL_UNS_ADMIN_PERM, 14583 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14584 NL80211_FLAG_NEED_RTNL, 14585 }, 14586 { 14587 .cmd = NL80211_CMD_JOIN_IBSS, 14588 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14589 .doit = nl80211_join_ibss, 14590 .flags = GENL_UNS_ADMIN_PERM, 14591 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14592 NL80211_FLAG_NEED_RTNL, 14593 }, 14594 { 14595 .cmd = NL80211_CMD_LEAVE_IBSS, 14596 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14597 .doit = nl80211_leave_ibss, 14598 .flags = GENL_UNS_ADMIN_PERM, 14599 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14600 NL80211_FLAG_NEED_RTNL, 14601 }, 14602 #ifdef CONFIG_NL80211_TESTMODE 14603 { 14604 .cmd = NL80211_CMD_TESTMODE, 14605 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14606 .doit = nl80211_testmode_do, 14607 .dumpit = nl80211_testmode_dump, 14608 .flags = GENL_UNS_ADMIN_PERM, 14609 .internal_flags = NL80211_FLAG_NEED_WIPHY | 14610 NL80211_FLAG_NEED_RTNL, 14611 }, 14612 #endif 14613 { 14614 .cmd = NL80211_CMD_CONNECT, 14615 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14616 .doit = nl80211_connect, 14617 .flags = GENL_UNS_ADMIN_PERM, 14618 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14619 NL80211_FLAG_NEED_RTNL | 14620 NL80211_FLAG_CLEAR_SKB, 14621 }, 14622 { 14623 .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS, 14624 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14625 .doit = nl80211_update_connect_params, 14626 .flags = GENL_ADMIN_PERM, 14627 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14628 NL80211_FLAG_NEED_RTNL | 14629 NL80211_FLAG_CLEAR_SKB, 14630 }, 14631 { 14632 .cmd = NL80211_CMD_DISCONNECT, 14633 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14634 .doit = nl80211_disconnect, 14635 .flags = GENL_UNS_ADMIN_PERM, 14636 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14637 NL80211_FLAG_NEED_RTNL, 14638 }, 14639 { 14640 .cmd = NL80211_CMD_SET_WIPHY_NETNS, 14641 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14642 .doit = nl80211_wiphy_netns, 14643 .flags = GENL_UNS_ADMIN_PERM, 14644 .internal_flags = NL80211_FLAG_NEED_WIPHY | 14645 NL80211_FLAG_NEED_RTNL, 14646 }, 14647 { 14648 .cmd = NL80211_CMD_GET_SURVEY, 14649 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14650 .dumpit = nl80211_dump_survey, 14651 }, 14652 { 14653 .cmd = NL80211_CMD_SET_PMKSA, 14654 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14655 .doit = nl80211_setdel_pmksa, 14656 .flags = GENL_UNS_ADMIN_PERM, 14657 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14658 NL80211_FLAG_NEED_RTNL | 14659 NL80211_FLAG_CLEAR_SKB, 14660 }, 14661 { 14662 .cmd = NL80211_CMD_DEL_PMKSA, 14663 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14664 .doit = nl80211_setdel_pmksa, 14665 .flags = GENL_UNS_ADMIN_PERM, 14666 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14667 NL80211_FLAG_NEED_RTNL, 14668 }, 14669 { 14670 .cmd = NL80211_CMD_FLUSH_PMKSA, 14671 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14672 .doit = nl80211_flush_pmksa, 14673 .flags = GENL_UNS_ADMIN_PERM, 14674 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14675 NL80211_FLAG_NEED_RTNL, 14676 }, 14677 { 14678 .cmd = NL80211_CMD_REMAIN_ON_CHANNEL, 14679 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14680 .doit = nl80211_remain_on_channel, 14681 .flags = GENL_UNS_ADMIN_PERM, 14682 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14683 NL80211_FLAG_NEED_RTNL, 14684 }, 14685 { 14686 .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 14687 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14688 .doit = nl80211_cancel_remain_on_channel, 14689 .flags = GENL_UNS_ADMIN_PERM, 14690 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14691 NL80211_FLAG_NEED_RTNL, 14692 }, 14693 { 14694 .cmd = NL80211_CMD_SET_TX_BITRATE_MASK, 14695 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14696 .doit = nl80211_set_tx_bitrate_mask, 14697 .flags = GENL_UNS_ADMIN_PERM, 14698 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14699 NL80211_FLAG_NEED_RTNL, 14700 }, 14701 { 14702 .cmd = NL80211_CMD_REGISTER_FRAME, 14703 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14704 .doit = nl80211_register_mgmt, 14705 .flags = GENL_UNS_ADMIN_PERM, 14706 .internal_flags = NL80211_FLAG_NEED_WDEV | 14707 NL80211_FLAG_NEED_RTNL, 14708 }, 14709 { 14710 .cmd = NL80211_CMD_FRAME, 14711 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14712 .doit = nl80211_tx_mgmt, 14713 .flags = GENL_UNS_ADMIN_PERM, 14714 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14715 NL80211_FLAG_NEED_RTNL, 14716 }, 14717 { 14718 .cmd = NL80211_CMD_FRAME_WAIT_CANCEL, 14719 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14720 .doit = nl80211_tx_mgmt_cancel_wait, 14721 .flags = GENL_UNS_ADMIN_PERM, 14722 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14723 NL80211_FLAG_NEED_RTNL, 14724 }, 14725 { 14726 .cmd = NL80211_CMD_SET_POWER_SAVE, 14727 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14728 .doit = nl80211_set_power_save, 14729 .flags = GENL_UNS_ADMIN_PERM, 14730 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14731 NL80211_FLAG_NEED_RTNL, 14732 }, 14733 { 14734 .cmd = NL80211_CMD_GET_POWER_SAVE, 14735 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14736 .doit = nl80211_get_power_save, 14737 /* can be retrieved by unprivileged users */ 14738 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14739 NL80211_FLAG_NEED_RTNL, 14740 }, 14741 { 14742 .cmd = NL80211_CMD_SET_CQM, 14743 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14744 .doit = nl80211_set_cqm, 14745 .flags = GENL_UNS_ADMIN_PERM, 14746 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14747 NL80211_FLAG_NEED_RTNL, 14748 }, 14749 { 14750 .cmd = NL80211_CMD_SET_CHANNEL, 14751 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14752 .doit = nl80211_set_channel, 14753 .flags = GENL_UNS_ADMIN_PERM, 14754 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14755 NL80211_FLAG_NEED_RTNL, 14756 }, 14757 { 14758 .cmd = NL80211_CMD_SET_WDS_PEER, 14759 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14760 .doit = nl80211_set_wds_peer, 14761 .flags = GENL_UNS_ADMIN_PERM, 14762 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14763 NL80211_FLAG_NEED_RTNL, 14764 }, 14765 { 14766 .cmd = NL80211_CMD_JOIN_MESH, 14767 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14768 .doit = nl80211_join_mesh, 14769 .flags = GENL_UNS_ADMIN_PERM, 14770 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14771 NL80211_FLAG_NEED_RTNL, 14772 }, 14773 { 14774 .cmd = NL80211_CMD_LEAVE_MESH, 14775 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14776 .doit = nl80211_leave_mesh, 14777 .flags = GENL_UNS_ADMIN_PERM, 14778 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14779 NL80211_FLAG_NEED_RTNL, 14780 }, 14781 { 14782 .cmd = NL80211_CMD_JOIN_OCB, 14783 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14784 .doit = nl80211_join_ocb, 14785 .flags = GENL_UNS_ADMIN_PERM, 14786 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14787 NL80211_FLAG_NEED_RTNL, 14788 }, 14789 { 14790 .cmd = NL80211_CMD_LEAVE_OCB, 14791 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14792 .doit = nl80211_leave_ocb, 14793 .flags = GENL_UNS_ADMIN_PERM, 14794 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14795 NL80211_FLAG_NEED_RTNL, 14796 }, 14797 #ifdef CONFIG_PM 14798 { 14799 .cmd = NL80211_CMD_GET_WOWLAN, 14800 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14801 .doit = nl80211_get_wowlan, 14802 /* can be retrieved by unprivileged users */ 14803 .internal_flags = NL80211_FLAG_NEED_WIPHY | 14804 NL80211_FLAG_NEED_RTNL, 14805 }, 14806 { 14807 .cmd = NL80211_CMD_SET_WOWLAN, 14808 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14809 .doit = nl80211_set_wowlan, 14810 .flags = GENL_UNS_ADMIN_PERM, 14811 .internal_flags = NL80211_FLAG_NEED_WIPHY | 14812 NL80211_FLAG_NEED_RTNL, 14813 }, 14814 #endif 14815 { 14816 .cmd = NL80211_CMD_SET_REKEY_OFFLOAD, 14817 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14818 .doit = nl80211_set_rekey_data, 14819 .flags = GENL_UNS_ADMIN_PERM, 14820 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14821 NL80211_FLAG_NEED_RTNL | 14822 NL80211_FLAG_CLEAR_SKB, 14823 }, 14824 { 14825 .cmd = NL80211_CMD_TDLS_MGMT, 14826 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14827 .doit = nl80211_tdls_mgmt, 14828 .flags = GENL_UNS_ADMIN_PERM, 14829 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14830 NL80211_FLAG_NEED_RTNL, 14831 }, 14832 { 14833 .cmd = NL80211_CMD_TDLS_OPER, 14834 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14835 .doit = nl80211_tdls_oper, 14836 .flags = GENL_UNS_ADMIN_PERM, 14837 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14838 NL80211_FLAG_NEED_RTNL, 14839 }, 14840 { 14841 .cmd = NL80211_CMD_UNEXPECTED_FRAME, 14842 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14843 .doit = nl80211_register_unexpected_frame, 14844 .flags = GENL_UNS_ADMIN_PERM, 14845 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14846 NL80211_FLAG_NEED_RTNL, 14847 }, 14848 { 14849 .cmd = NL80211_CMD_PROBE_CLIENT, 14850 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14851 .doit = nl80211_probe_client, 14852 .flags = GENL_UNS_ADMIN_PERM, 14853 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14854 NL80211_FLAG_NEED_RTNL, 14855 }, 14856 { 14857 .cmd = NL80211_CMD_REGISTER_BEACONS, 14858 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14859 .doit = nl80211_register_beacons, 14860 .flags = GENL_UNS_ADMIN_PERM, 14861 .internal_flags = NL80211_FLAG_NEED_WIPHY | 14862 NL80211_FLAG_NEED_RTNL, 14863 }, 14864 { 14865 .cmd = NL80211_CMD_SET_NOACK_MAP, 14866 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14867 .doit = nl80211_set_noack_map, 14868 .flags = GENL_UNS_ADMIN_PERM, 14869 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14870 NL80211_FLAG_NEED_RTNL, 14871 }, 14872 { 14873 .cmd = NL80211_CMD_START_P2P_DEVICE, 14874 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14875 .doit = nl80211_start_p2p_device, 14876 .flags = GENL_UNS_ADMIN_PERM, 14877 .internal_flags = NL80211_FLAG_NEED_WDEV | 14878 NL80211_FLAG_NEED_RTNL, 14879 }, 14880 { 14881 .cmd = NL80211_CMD_STOP_P2P_DEVICE, 14882 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14883 .doit = nl80211_stop_p2p_device, 14884 .flags = GENL_UNS_ADMIN_PERM, 14885 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14886 NL80211_FLAG_NEED_RTNL, 14887 }, 14888 { 14889 .cmd = NL80211_CMD_START_NAN, 14890 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14891 .doit = nl80211_start_nan, 14892 .flags = GENL_ADMIN_PERM, 14893 .internal_flags = NL80211_FLAG_NEED_WDEV | 14894 NL80211_FLAG_NEED_RTNL, 14895 }, 14896 { 14897 .cmd = NL80211_CMD_STOP_NAN, 14898 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14899 .doit = nl80211_stop_nan, 14900 .flags = GENL_ADMIN_PERM, 14901 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14902 NL80211_FLAG_NEED_RTNL, 14903 }, 14904 { 14905 .cmd = NL80211_CMD_ADD_NAN_FUNCTION, 14906 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14907 .doit = nl80211_nan_add_func, 14908 .flags = GENL_ADMIN_PERM, 14909 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14910 NL80211_FLAG_NEED_RTNL, 14911 }, 14912 { 14913 .cmd = NL80211_CMD_DEL_NAN_FUNCTION, 14914 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14915 .doit = nl80211_nan_del_func, 14916 .flags = GENL_ADMIN_PERM, 14917 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14918 NL80211_FLAG_NEED_RTNL, 14919 }, 14920 { 14921 .cmd = NL80211_CMD_CHANGE_NAN_CONFIG, 14922 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14923 .doit = nl80211_nan_change_config, 14924 .flags = GENL_ADMIN_PERM, 14925 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14926 NL80211_FLAG_NEED_RTNL, 14927 }, 14928 { 14929 .cmd = NL80211_CMD_SET_MCAST_RATE, 14930 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14931 .doit = nl80211_set_mcast_rate, 14932 .flags = GENL_UNS_ADMIN_PERM, 14933 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14934 NL80211_FLAG_NEED_RTNL, 14935 }, 14936 { 14937 .cmd = NL80211_CMD_SET_MAC_ACL, 14938 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14939 .doit = nl80211_set_mac_acl, 14940 .flags = GENL_UNS_ADMIN_PERM, 14941 .internal_flags = NL80211_FLAG_NEED_NETDEV | 14942 NL80211_FLAG_NEED_RTNL, 14943 }, 14944 { 14945 .cmd = NL80211_CMD_RADAR_DETECT, 14946 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14947 .doit = nl80211_start_radar_detection, 14948 .flags = GENL_UNS_ADMIN_PERM, 14949 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14950 NL80211_FLAG_NEED_RTNL, 14951 }, 14952 { 14953 .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES, 14954 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14955 .doit = nl80211_get_protocol_features, 14956 }, 14957 { 14958 .cmd = NL80211_CMD_UPDATE_FT_IES, 14959 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14960 .doit = nl80211_update_ft_ies, 14961 .flags = GENL_UNS_ADMIN_PERM, 14962 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 14963 NL80211_FLAG_NEED_RTNL, 14964 }, 14965 { 14966 .cmd = NL80211_CMD_CRIT_PROTOCOL_START, 14967 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14968 .doit = nl80211_crit_protocol_start, 14969 .flags = GENL_UNS_ADMIN_PERM, 14970 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14971 NL80211_FLAG_NEED_RTNL, 14972 }, 14973 { 14974 .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP, 14975 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14976 .doit = nl80211_crit_protocol_stop, 14977 .flags = GENL_UNS_ADMIN_PERM, 14978 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 14979 NL80211_FLAG_NEED_RTNL, 14980 }, 14981 { 14982 .cmd = NL80211_CMD_GET_COALESCE, 14983 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14984 .doit = nl80211_get_coalesce, 14985 .internal_flags = NL80211_FLAG_NEED_WIPHY | 14986 NL80211_FLAG_NEED_RTNL, 14987 }, 14988 { 14989 .cmd = NL80211_CMD_SET_COALESCE, 14990 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14991 .doit = nl80211_set_coalesce, 14992 .flags = GENL_UNS_ADMIN_PERM, 14993 .internal_flags = NL80211_FLAG_NEED_WIPHY | 14994 NL80211_FLAG_NEED_RTNL, 14995 }, 14996 { 14997 .cmd = NL80211_CMD_CHANNEL_SWITCH, 14998 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 14999 .doit = nl80211_channel_switch, 15000 .flags = GENL_UNS_ADMIN_PERM, 15001 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 15002 NL80211_FLAG_NEED_RTNL, 15003 }, 15004 { 15005 .cmd = NL80211_CMD_VENDOR, 15006 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 15007 .doit = nl80211_vendor_cmd, 15008 .dumpit = nl80211_vendor_cmd_dump, 15009 .flags = GENL_UNS_ADMIN_PERM, 15010 .internal_flags = NL80211_FLAG_NEED_WIPHY | 15011 NL80211_FLAG_NEED_RTNL | 15012 NL80211_FLAG_CLEAR_SKB, 15013 }, 15014 { 15015 .cmd = NL80211_CMD_SET_QOS_MAP, 15016 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 15017 .doit = nl80211_set_qos_map, 15018 .flags = GENL_UNS_ADMIN_PERM, 15019 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 15020 NL80211_FLAG_NEED_RTNL, 15021 }, 15022 { 15023 .cmd = NL80211_CMD_ADD_TX_TS, 15024 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 15025 .doit = nl80211_add_tx_ts, 15026 .flags = GENL_UNS_ADMIN_PERM, 15027 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 15028 NL80211_FLAG_NEED_RTNL, 15029 }, 15030 { 15031 .cmd = NL80211_CMD_DEL_TX_TS, 15032 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 15033 .doit = nl80211_del_tx_ts, 15034 .flags = GENL_UNS_ADMIN_PERM, 15035 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 15036 NL80211_FLAG_NEED_RTNL, 15037 }, 15038 { 15039 .cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH, 15040 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 15041 .doit = nl80211_tdls_channel_switch, 15042 .flags = GENL_UNS_ADMIN_PERM, 15043 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 15044 NL80211_FLAG_NEED_RTNL, 15045 }, 15046 { 15047 .cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, 15048 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 15049 .doit = nl80211_tdls_cancel_channel_switch, 15050 .flags = GENL_UNS_ADMIN_PERM, 15051 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 15052 NL80211_FLAG_NEED_RTNL, 15053 }, 15054 { 15055 .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST, 15056 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 15057 .doit = nl80211_set_multicast_to_unicast, 15058 .flags = GENL_UNS_ADMIN_PERM, 15059 .internal_flags = NL80211_FLAG_NEED_NETDEV | 15060 NL80211_FLAG_NEED_RTNL, 15061 }, 15062 { 15063 .cmd = NL80211_CMD_SET_PMK, 15064 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 15065 .doit = nl80211_set_pmk, 15066 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 15067 NL80211_FLAG_NEED_RTNL | 15068 NL80211_FLAG_CLEAR_SKB, 15069 }, 15070 { 15071 .cmd = NL80211_CMD_DEL_PMK, 15072 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 15073 .doit = nl80211_del_pmk, 15074 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 15075 NL80211_FLAG_NEED_RTNL, 15076 }, 15077 { 15078 .cmd = NL80211_CMD_EXTERNAL_AUTH, 15079 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 15080 .doit = nl80211_external_auth, 15081 .flags = GENL_ADMIN_PERM, 15082 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 15083 NL80211_FLAG_NEED_RTNL, 15084 }, 15085 { 15086 .cmd = NL80211_CMD_CONTROL_PORT_FRAME, 15087 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 15088 .doit = nl80211_tx_control_port, 15089 .flags = GENL_UNS_ADMIN_PERM, 15090 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 15091 NL80211_FLAG_NEED_RTNL, 15092 }, 15093 { 15094 .cmd = NL80211_CMD_GET_FTM_RESPONDER_STATS, 15095 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 15096 .doit = nl80211_get_ftm_responder_stats, 15097 .internal_flags = NL80211_FLAG_NEED_NETDEV | 15098 NL80211_FLAG_NEED_RTNL, 15099 }, 15100 { 15101 .cmd = NL80211_CMD_PEER_MEASUREMENT_START, 15102 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 15103 .doit = nl80211_pmsr_start, 15104 .flags = GENL_UNS_ADMIN_PERM, 15105 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 15106 NL80211_FLAG_NEED_RTNL, 15107 }, 15108 { 15109 .cmd = NL80211_CMD_NOTIFY_RADAR, 15110 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, 15111 .doit = nl80211_notify_radar_detection, 15112 .flags = GENL_UNS_ADMIN_PERM, 15113 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 15114 NL80211_FLAG_NEED_RTNL, 15115 }, 15116 { 15117 .cmd = NL80211_CMD_UPDATE_OWE_INFO, 15118 .doit = nl80211_update_owe_info, 15119 .flags = GENL_ADMIN_PERM, 15120 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 15121 NL80211_FLAG_NEED_RTNL, 15122 }, 15123 { 15124 .cmd = NL80211_CMD_PROBE_MESH_LINK, 15125 .doit = nl80211_probe_mesh_link, 15126 .flags = GENL_UNS_ADMIN_PERM, 15127 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 15128 NL80211_FLAG_NEED_RTNL, 15129 }, 15130 { 15131 .cmd = NL80211_CMD_SET_TID_CONFIG, 15132 .doit = nl80211_set_tid_config, 15133 .flags = GENL_UNS_ADMIN_PERM, 15134 .internal_flags = NL80211_FLAG_NEED_NETDEV | 15135 NL80211_FLAG_NEED_RTNL, 15136 }, 15137 }; 15138 15139 static struct genl_family nl80211_fam __ro_after_init = { 15140 .name = NL80211_GENL_NAME, /* have users key off the name instead */ 15141 .hdrsize = 0, /* no private header */ 15142 .version = 1, /* no particular meaning now */ 15143 .maxattr = NL80211_ATTR_MAX, 15144 .policy = nl80211_policy, 15145 .netnsok = true, 15146 .pre_doit = nl80211_pre_doit, 15147 .post_doit = nl80211_post_doit, 15148 .module = THIS_MODULE, 15149 .ops = nl80211_ops, 15150 .n_ops = ARRAY_SIZE(nl80211_ops), 15151 .mcgrps = nl80211_mcgrps, 15152 .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps), 15153 .parallel_ops = true, 15154 }; 15155 15156 /* notification functions */ 15157 15158 void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev, 15159 enum nl80211_commands cmd) 15160 { 15161 struct sk_buff *msg; 15162 struct nl80211_dump_wiphy_state state = {}; 15163 15164 WARN_ON(cmd != NL80211_CMD_NEW_WIPHY && 15165 cmd != NL80211_CMD_DEL_WIPHY); 15166 15167 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 15168 if (!msg) 15169 return; 15170 15171 if (nl80211_send_wiphy(rdev, cmd, msg, 0, 0, 0, &state) < 0) { 15172 nlmsg_free(msg); 15173 return; 15174 } 15175 15176 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15177 NL80211_MCGRP_CONFIG, GFP_KERNEL); 15178 } 15179 15180 void nl80211_notify_iface(struct cfg80211_registered_device *rdev, 15181 struct wireless_dev *wdev, 15182 enum nl80211_commands cmd) 15183 { 15184 struct sk_buff *msg; 15185 15186 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 15187 if (!msg) 15188 return; 15189 15190 if (nl80211_send_iface(msg, 0, 0, 0, rdev, wdev, cmd) < 0) { 15191 nlmsg_free(msg); 15192 return; 15193 } 15194 15195 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15196 NL80211_MCGRP_CONFIG, GFP_KERNEL); 15197 } 15198 15199 static int nl80211_add_scan_req(struct sk_buff *msg, 15200 struct cfg80211_registered_device *rdev) 15201 { 15202 struct cfg80211_scan_request *req = rdev->scan_req; 15203 struct nlattr *nest; 15204 int i; 15205 15206 if (WARN_ON(!req)) 15207 return 0; 15208 15209 nest = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_SSIDS); 15210 if (!nest) 15211 goto nla_put_failure; 15212 for (i = 0; i < req->n_ssids; i++) { 15213 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid)) 15214 goto nla_put_failure; 15215 } 15216 nla_nest_end(msg, nest); 15217 15218 nest = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_FREQUENCIES); 15219 if (!nest) 15220 goto nla_put_failure; 15221 for (i = 0; i < req->n_channels; i++) { 15222 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) 15223 goto nla_put_failure; 15224 } 15225 nla_nest_end(msg, nest); 15226 15227 if (req->ie && 15228 nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie)) 15229 goto nla_put_failure; 15230 15231 if (req->flags && 15232 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags)) 15233 goto nla_put_failure; 15234 15235 if (req->info.scan_start_tsf && 15236 (nla_put_u64_64bit(msg, NL80211_ATTR_SCAN_START_TIME_TSF, 15237 req->info.scan_start_tsf, NL80211_BSS_PAD) || 15238 nla_put(msg, NL80211_ATTR_SCAN_START_TIME_TSF_BSSID, ETH_ALEN, 15239 req->info.tsf_bssid))) 15240 goto nla_put_failure; 15241 15242 return 0; 15243 nla_put_failure: 15244 return -ENOBUFS; 15245 } 15246 15247 static int nl80211_prep_scan_msg(struct sk_buff *msg, 15248 struct cfg80211_registered_device *rdev, 15249 struct wireless_dev *wdev, 15250 u32 portid, u32 seq, int flags, 15251 u32 cmd) 15252 { 15253 void *hdr; 15254 15255 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 15256 if (!hdr) 15257 return -1; 15258 15259 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15260 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 15261 wdev->netdev->ifindex)) || 15262 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 15263 NL80211_ATTR_PAD)) 15264 goto nla_put_failure; 15265 15266 /* ignore errors and send incomplete event anyway */ 15267 nl80211_add_scan_req(msg, rdev); 15268 15269 genlmsg_end(msg, hdr); 15270 return 0; 15271 15272 nla_put_failure: 15273 genlmsg_cancel(msg, hdr); 15274 return -EMSGSIZE; 15275 } 15276 15277 static int 15278 nl80211_prep_sched_scan_msg(struct sk_buff *msg, 15279 struct cfg80211_sched_scan_request *req, u32 cmd) 15280 { 15281 void *hdr; 15282 15283 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 15284 if (!hdr) 15285 return -1; 15286 15287 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, 15288 wiphy_to_rdev(req->wiphy)->wiphy_idx) || 15289 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) || 15290 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid, 15291 NL80211_ATTR_PAD)) 15292 goto nla_put_failure; 15293 15294 genlmsg_end(msg, hdr); 15295 return 0; 15296 15297 nla_put_failure: 15298 genlmsg_cancel(msg, hdr); 15299 return -EMSGSIZE; 15300 } 15301 15302 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev, 15303 struct wireless_dev *wdev) 15304 { 15305 struct sk_buff *msg; 15306 15307 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 15308 if (!msg) 15309 return; 15310 15311 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0, 15312 NL80211_CMD_TRIGGER_SCAN) < 0) { 15313 nlmsg_free(msg); 15314 return; 15315 } 15316 15317 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15318 NL80211_MCGRP_SCAN, GFP_KERNEL); 15319 } 15320 15321 struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev, 15322 struct wireless_dev *wdev, bool aborted) 15323 { 15324 struct sk_buff *msg; 15325 15326 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 15327 if (!msg) 15328 return NULL; 15329 15330 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0, 15331 aborted ? NL80211_CMD_SCAN_ABORTED : 15332 NL80211_CMD_NEW_SCAN_RESULTS) < 0) { 15333 nlmsg_free(msg); 15334 return NULL; 15335 } 15336 15337 return msg; 15338 } 15339 15340 /* send message created by nl80211_build_scan_msg() */ 15341 void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev, 15342 struct sk_buff *msg) 15343 { 15344 if (!msg) 15345 return; 15346 15347 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15348 NL80211_MCGRP_SCAN, GFP_KERNEL); 15349 } 15350 15351 void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd) 15352 { 15353 struct sk_buff *msg; 15354 15355 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 15356 if (!msg) 15357 return; 15358 15359 if (nl80211_prep_sched_scan_msg(msg, req, cmd) < 0) { 15360 nlmsg_free(msg); 15361 return; 15362 } 15363 15364 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0, 15365 NL80211_MCGRP_SCAN, GFP_KERNEL); 15366 } 15367 15368 static bool nl80211_reg_change_event_fill(struct sk_buff *msg, 15369 struct regulatory_request *request) 15370 { 15371 /* Userspace can always count this one always being set */ 15372 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) 15373 goto nla_put_failure; 15374 15375 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { 15376 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 15377 NL80211_REGDOM_TYPE_WORLD)) 15378 goto nla_put_failure; 15379 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { 15380 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 15381 NL80211_REGDOM_TYPE_CUSTOM_WORLD)) 15382 goto nla_put_failure; 15383 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || 15384 request->intersect) { 15385 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 15386 NL80211_REGDOM_TYPE_INTERSECTION)) 15387 goto nla_put_failure; 15388 } else { 15389 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 15390 NL80211_REGDOM_TYPE_COUNTRY) || 15391 nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, 15392 request->alpha2)) 15393 goto nla_put_failure; 15394 } 15395 15396 if (request->wiphy_idx != WIPHY_IDX_INVALID) { 15397 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx); 15398 15399 if (wiphy && 15400 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) 15401 goto nla_put_failure; 15402 15403 if (wiphy && 15404 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 15405 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 15406 goto nla_put_failure; 15407 } 15408 15409 return true; 15410 15411 nla_put_failure: 15412 return false; 15413 } 15414 15415 /* 15416 * This can happen on global regulatory changes or device specific settings 15417 * based on custom regulatory domains. 15418 */ 15419 void nl80211_common_reg_change_event(enum nl80211_commands cmd_id, 15420 struct regulatory_request *request) 15421 { 15422 struct sk_buff *msg; 15423 void *hdr; 15424 15425 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 15426 if (!msg) 15427 return; 15428 15429 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd_id); 15430 if (!hdr) 15431 goto nla_put_failure; 15432 15433 if (!nl80211_reg_change_event_fill(msg, request)) 15434 goto nla_put_failure; 15435 15436 genlmsg_end(msg, hdr); 15437 15438 rcu_read_lock(); 15439 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 15440 NL80211_MCGRP_REGULATORY, GFP_ATOMIC); 15441 rcu_read_unlock(); 15442 15443 return; 15444 15445 nla_put_failure: 15446 nlmsg_free(msg); 15447 } 15448 15449 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev, 15450 struct net_device *netdev, 15451 const u8 *buf, size_t len, 15452 enum nl80211_commands cmd, gfp_t gfp, 15453 int uapsd_queues, const u8 *req_ies, 15454 size_t req_ies_len) 15455 { 15456 struct sk_buff *msg; 15457 void *hdr; 15458 15459 msg = nlmsg_new(100 + len + req_ies_len, gfp); 15460 if (!msg) 15461 return; 15462 15463 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 15464 if (!hdr) { 15465 nlmsg_free(msg); 15466 return; 15467 } 15468 15469 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15470 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 15471 nla_put(msg, NL80211_ATTR_FRAME, len, buf) || 15472 (req_ies && 15473 nla_put(msg, NL80211_ATTR_REQ_IE, req_ies_len, req_ies))) 15474 goto nla_put_failure; 15475 15476 if (uapsd_queues >= 0) { 15477 struct nlattr *nla_wmm = 15478 nla_nest_start_noflag(msg, NL80211_ATTR_STA_WME); 15479 if (!nla_wmm) 15480 goto nla_put_failure; 15481 15482 if (nla_put_u8(msg, NL80211_STA_WME_UAPSD_QUEUES, 15483 uapsd_queues)) 15484 goto nla_put_failure; 15485 15486 nla_nest_end(msg, nla_wmm); 15487 } 15488 15489 genlmsg_end(msg, hdr); 15490 15491 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15492 NL80211_MCGRP_MLME, gfp); 15493 return; 15494 15495 nla_put_failure: 15496 nlmsg_free(msg); 15497 } 15498 15499 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev, 15500 struct net_device *netdev, const u8 *buf, 15501 size_t len, gfp_t gfp) 15502 { 15503 nl80211_send_mlme_event(rdev, netdev, buf, len, 15504 NL80211_CMD_AUTHENTICATE, gfp, -1, NULL, 0); 15505 } 15506 15507 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev, 15508 struct net_device *netdev, const u8 *buf, 15509 size_t len, gfp_t gfp, int uapsd_queues, 15510 const u8 *req_ies, size_t req_ies_len) 15511 { 15512 nl80211_send_mlme_event(rdev, netdev, buf, len, 15513 NL80211_CMD_ASSOCIATE, gfp, uapsd_queues, 15514 req_ies, req_ies_len); 15515 } 15516 15517 void nl80211_send_deauth(struct cfg80211_registered_device *rdev, 15518 struct net_device *netdev, const u8 *buf, 15519 size_t len, gfp_t gfp) 15520 { 15521 nl80211_send_mlme_event(rdev, netdev, buf, len, 15522 NL80211_CMD_DEAUTHENTICATE, gfp, -1, NULL, 0); 15523 } 15524 15525 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev, 15526 struct net_device *netdev, const u8 *buf, 15527 size_t len, gfp_t gfp) 15528 { 15529 nl80211_send_mlme_event(rdev, netdev, buf, len, 15530 NL80211_CMD_DISASSOCIATE, gfp, -1, NULL, 0); 15531 } 15532 15533 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf, 15534 size_t len) 15535 { 15536 struct wireless_dev *wdev = dev->ieee80211_ptr; 15537 struct wiphy *wiphy = wdev->wiphy; 15538 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 15539 const struct ieee80211_mgmt *mgmt = (void *)buf; 15540 u32 cmd; 15541 15542 if (WARN_ON(len < 2)) 15543 return; 15544 15545 if (ieee80211_is_deauth(mgmt->frame_control)) 15546 cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE; 15547 else 15548 cmd = NL80211_CMD_UNPROT_DISASSOCIATE; 15549 15550 trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len); 15551 nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC, -1, 15552 NULL, 0); 15553 } 15554 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt); 15555 15556 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev, 15557 struct net_device *netdev, int cmd, 15558 const u8 *addr, gfp_t gfp) 15559 { 15560 struct sk_buff *msg; 15561 void *hdr; 15562 15563 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 15564 if (!msg) 15565 return; 15566 15567 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 15568 if (!hdr) { 15569 nlmsg_free(msg); 15570 return; 15571 } 15572 15573 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15574 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 15575 nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 15576 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) 15577 goto nla_put_failure; 15578 15579 genlmsg_end(msg, hdr); 15580 15581 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15582 NL80211_MCGRP_MLME, gfp); 15583 return; 15584 15585 nla_put_failure: 15586 nlmsg_free(msg); 15587 } 15588 15589 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev, 15590 struct net_device *netdev, const u8 *addr, 15591 gfp_t gfp) 15592 { 15593 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE, 15594 addr, gfp); 15595 } 15596 15597 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev, 15598 struct net_device *netdev, const u8 *addr, 15599 gfp_t gfp) 15600 { 15601 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE, 15602 addr, gfp); 15603 } 15604 15605 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev, 15606 struct net_device *netdev, 15607 struct cfg80211_connect_resp_params *cr, 15608 gfp_t gfp) 15609 { 15610 struct sk_buff *msg; 15611 void *hdr; 15612 15613 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len + 15614 cr->fils.kek_len + cr->fils.pmk_len + 15615 (cr->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp); 15616 if (!msg) 15617 return; 15618 15619 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT); 15620 if (!hdr) { 15621 nlmsg_free(msg); 15622 return; 15623 } 15624 15625 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15626 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 15627 (cr->bssid && 15628 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cr->bssid)) || 15629 nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, 15630 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE : 15631 cr->status) || 15632 (cr->status < 0 && 15633 (nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 15634 nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON, 15635 cr->timeout_reason))) || 15636 (cr->req_ie && 15637 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) || 15638 (cr->resp_ie && 15639 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len, 15640 cr->resp_ie)) || 15641 (cr->fils.update_erp_next_seq_num && 15642 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM, 15643 cr->fils.erp_next_seq_num)) || 15644 (cr->status == WLAN_STATUS_SUCCESS && 15645 ((cr->fils.kek && 15646 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils.kek_len, 15647 cr->fils.kek)) || 15648 (cr->fils.pmk && 15649 nla_put(msg, NL80211_ATTR_PMK, cr->fils.pmk_len, cr->fils.pmk)) || 15650 (cr->fils.pmkid && 15651 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->fils.pmkid))))) 15652 goto nla_put_failure; 15653 15654 genlmsg_end(msg, hdr); 15655 15656 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15657 NL80211_MCGRP_MLME, gfp); 15658 return; 15659 15660 nla_put_failure: 15661 nlmsg_free(msg); 15662 } 15663 15664 void nl80211_send_roamed(struct cfg80211_registered_device *rdev, 15665 struct net_device *netdev, 15666 struct cfg80211_roam_info *info, gfp_t gfp) 15667 { 15668 struct sk_buff *msg; 15669 void *hdr; 15670 const u8 *bssid = info->bss ? info->bss->bssid : info->bssid; 15671 15672 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len + 15673 info->fils.kek_len + info->fils.pmk_len + 15674 (info->fils.pmkid ? WLAN_PMKID_LEN : 0), gfp); 15675 if (!msg) 15676 return; 15677 15678 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM); 15679 if (!hdr) { 15680 nlmsg_free(msg); 15681 return; 15682 } 15683 15684 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15685 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 15686 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid) || 15687 (info->req_ie && 15688 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len, 15689 info->req_ie)) || 15690 (info->resp_ie && 15691 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len, 15692 info->resp_ie)) || 15693 (info->fils.update_erp_next_seq_num && 15694 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM, 15695 info->fils.erp_next_seq_num)) || 15696 (info->fils.kek && 15697 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len, 15698 info->fils.kek)) || 15699 (info->fils.pmk && 15700 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) || 15701 (info->fils.pmkid && 15702 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid))) 15703 goto nla_put_failure; 15704 15705 genlmsg_end(msg, hdr); 15706 15707 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15708 NL80211_MCGRP_MLME, gfp); 15709 return; 15710 15711 nla_put_failure: 15712 nlmsg_free(msg); 15713 } 15714 15715 void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev, 15716 struct net_device *netdev, const u8 *bssid) 15717 { 15718 struct sk_buff *msg; 15719 void *hdr; 15720 15721 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 15722 if (!msg) 15723 return; 15724 15725 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PORT_AUTHORIZED); 15726 if (!hdr) { 15727 nlmsg_free(msg); 15728 return; 15729 } 15730 15731 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15732 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 15733 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 15734 goto nla_put_failure; 15735 15736 genlmsg_end(msg, hdr); 15737 15738 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15739 NL80211_MCGRP_MLME, GFP_KERNEL); 15740 return; 15741 15742 nla_put_failure: 15743 nlmsg_free(msg); 15744 } 15745 15746 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev, 15747 struct net_device *netdev, u16 reason, 15748 const u8 *ie, size_t ie_len, bool from_ap) 15749 { 15750 struct sk_buff *msg; 15751 void *hdr; 15752 15753 msg = nlmsg_new(100 + ie_len, GFP_KERNEL); 15754 if (!msg) 15755 return; 15756 15757 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT); 15758 if (!hdr) { 15759 nlmsg_free(msg); 15760 return; 15761 } 15762 15763 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15764 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 15765 (reason && 15766 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) || 15767 (from_ap && 15768 nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) || 15769 (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie))) 15770 goto nla_put_failure; 15771 15772 genlmsg_end(msg, hdr); 15773 15774 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15775 NL80211_MCGRP_MLME, GFP_KERNEL); 15776 return; 15777 15778 nla_put_failure: 15779 nlmsg_free(msg); 15780 } 15781 15782 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev, 15783 struct net_device *netdev, const u8 *bssid, 15784 gfp_t gfp) 15785 { 15786 struct sk_buff *msg; 15787 void *hdr; 15788 15789 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 15790 if (!msg) 15791 return; 15792 15793 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS); 15794 if (!hdr) { 15795 nlmsg_free(msg); 15796 return; 15797 } 15798 15799 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15800 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 15801 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 15802 goto nla_put_failure; 15803 15804 genlmsg_end(msg, hdr); 15805 15806 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15807 NL80211_MCGRP_MLME, gfp); 15808 return; 15809 15810 nla_put_failure: 15811 nlmsg_free(msg); 15812 } 15813 15814 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr, 15815 const u8 *ie, u8 ie_len, 15816 int sig_dbm, gfp_t gfp) 15817 { 15818 struct wireless_dev *wdev = dev->ieee80211_ptr; 15819 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 15820 struct sk_buff *msg; 15821 void *hdr; 15822 15823 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) 15824 return; 15825 15826 trace_cfg80211_notify_new_peer_candidate(dev, addr); 15827 15828 msg = nlmsg_new(100 + ie_len, gfp); 15829 if (!msg) 15830 return; 15831 15832 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE); 15833 if (!hdr) { 15834 nlmsg_free(msg); 15835 return; 15836 } 15837 15838 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15839 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 15840 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 15841 (ie_len && ie && 15842 nla_put(msg, NL80211_ATTR_IE, ie_len, ie)) || 15843 (sig_dbm && 15844 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm))) 15845 goto nla_put_failure; 15846 15847 genlmsg_end(msg, hdr); 15848 15849 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15850 NL80211_MCGRP_MLME, gfp); 15851 return; 15852 15853 nla_put_failure: 15854 nlmsg_free(msg); 15855 } 15856 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate); 15857 15858 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev, 15859 struct net_device *netdev, const u8 *addr, 15860 enum nl80211_key_type key_type, int key_id, 15861 const u8 *tsc, gfp_t gfp) 15862 { 15863 struct sk_buff *msg; 15864 void *hdr; 15865 15866 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 15867 if (!msg) 15868 return; 15869 15870 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE); 15871 if (!hdr) { 15872 nlmsg_free(msg); 15873 return; 15874 } 15875 15876 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15877 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 15878 (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) || 15879 nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) || 15880 (key_id != -1 && 15881 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) || 15882 (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc))) 15883 goto nla_put_failure; 15884 15885 genlmsg_end(msg, hdr); 15886 15887 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15888 NL80211_MCGRP_MLME, gfp); 15889 return; 15890 15891 nla_put_failure: 15892 nlmsg_free(msg); 15893 } 15894 15895 void nl80211_send_beacon_hint_event(struct wiphy *wiphy, 15896 struct ieee80211_channel *channel_before, 15897 struct ieee80211_channel *channel_after) 15898 { 15899 struct sk_buff *msg; 15900 void *hdr; 15901 struct nlattr *nl_freq; 15902 15903 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); 15904 if (!msg) 15905 return; 15906 15907 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT); 15908 if (!hdr) { 15909 nlmsg_free(msg); 15910 return; 15911 } 15912 15913 /* 15914 * Since we are applying the beacon hint to a wiphy we know its 15915 * wiphy_idx is valid 15916 */ 15917 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 15918 goto nla_put_failure; 15919 15920 /* Before */ 15921 nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_BEFORE); 15922 if (!nl_freq) 15923 goto nla_put_failure; 15924 15925 if (nl80211_msg_put_channel(msg, wiphy, channel_before, false)) 15926 goto nla_put_failure; 15927 nla_nest_end(msg, nl_freq); 15928 15929 /* After */ 15930 nl_freq = nla_nest_start_noflag(msg, NL80211_ATTR_FREQ_AFTER); 15931 if (!nl_freq) 15932 goto nla_put_failure; 15933 15934 if (nl80211_msg_put_channel(msg, wiphy, channel_after, false)) 15935 goto nla_put_failure; 15936 nla_nest_end(msg, nl_freq); 15937 15938 genlmsg_end(msg, hdr); 15939 15940 rcu_read_lock(); 15941 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 15942 NL80211_MCGRP_REGULATORY, GFP_ATOMIC); 15943 rcu_read_unlock(); 15944 15945 return; 15946 15947 nla_put_failure: 15948 nlmsg_free(msg); 15949 } 15950 15951 static void nl80211_send_remain_on_chan_event( 15952 int cmd, struct cfg80211_registered_device *rdev, 15953 struct wireless_dev *wdev, u64 cookie, 15954 struct ieee80211_channel *chan, 15955 unsigned int duration, gfp_t gfp) 15956 { 15957 struct sk_buff *msg; 15958 void *hdr; 15959 15960 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 15961 if (!msg) 15962 return; 15963 15964 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 15965 if (!hdr) { 15966 nlmsg_free(msg); 15967 return; 15968 } 15969 15970 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15971 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 15972 wdev->netdev->ifindex)) || 15973 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 15974 NL80211_ATTR_PAD) || 15975 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || 15976 nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 15977 NL80211_CHAN_NO_HT) || 15978 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 15979 NL80211_ATTR_PAD)) 15980 goto nla_put_failure; 15981 15982 if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL && 15983 nla_put_u32(msg, NL80211_ATTR_DURATION, duration)) 15984 goto nla_put_failure; 15985 15986 genlmsg_end(msg, hdr); 15987 15988 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15989 NL80211_MCGRP_MLME, gfp); 15990 return; 15991 15992 nla_put_failure: 15993 nlmsg_free(msg); 15994 } 15995 15996 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie, 15997 struct ieee80211_channel *chan, 15998 unsigned int duration, gfp_t gfp) 15999 { 16000 struct wiphy *wiphy = wdev->wiphy; 16001 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16002 16003 trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration); 16004 nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL, 16005 rdev, wdev, cookie, chan, 16006 duration, gfp); 16007 } 16008 EXPORT_SYMBOL(cfg80211_ready_on_channel); 16009 16010 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie, 16011 struct ieee80211_channel *chan, 16012 gfp_t gfp) 16013 { 16014 struct wiphy *wiphy = wdev->wiphy; 16015 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16016 16017 trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan); 16018 nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 16019 rdev, wdev, cookie, chan, 0, gfp); 16020 } 16021 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired); 16022 16023 void cfg80211_tx_mgmt_expired(struct wireless_dev *wdev, u64 cookie, 16024 struct ieee80211_channel *chan, 16025 gfp_t gfp) 16026 { 16027 struct wiphy *wiphy = wdev->wiphy; 16028 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16029 16030 trace_cfg80211_tx_mgmt_expired(wdev, cookie, chan); 16031 nl80211_send_remain_on_chan_event(NL80211_CMD_FRAME_WAIT_CANCEL, 16032 rdev, wdev, cookie, chan, 0, gfp); 16033 } 16034 EXPORT_SYMBOL(cfg80211_tx_mgmt_expired); 16035 16036 void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr, 16037 struct station_info *sinfo, gfp_t gfp) 16038 { 16039 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 16040 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16041 struct sk_buff *msg; 16042 16043 trace_cfg80211_new_sta(dev, mac_addr, sinfo); 16044 16045 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16046 if (!msg) 16047 return; 16048 16049 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 0, 0, 0, 16050 rdev, dev, mac_addr, sinfo) < 0) { 16051 nlmsg_free(msg); 16052 return; 16053 } 16054 16055 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16056 NL80211_MCGRP_MLME, gfp); 16057 } 16058 EXPORT_SYMBOL(cfg80211_new_sta); 16059 16060 void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr, 16061 struct station_info *sinfo, gfp_t gfp) 16062 { 16063 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 16064 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16065 struct sk_buff *msg; 16066 struct station_info empty_sinfo = {}; 16067 16068 if (!sinfo) 16069 sinfo = &empty_sinfo; 16070 16071 trace_cfg80211_del_sta(dev, mac_addr); 16072 16073 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16074 if (!msg) { 16075 cfg80211_sinfo_release_content(sinfo); 16076 return; 16077 } 16078 16079 if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0, 16080 rdev, dev, mac_addr, sinfo) < 0) { 16081 nlmsg_free(msg); 16082 return; 16083 } 16084 16085 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16086 NL80211_MCGRP_MLME, gfp); 16087 } 16088 EXPORT_SYMBOL(cfg80211_del_sta_sinfo); 16089 16090 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr, 16091 enum nl80211_connect_failed_reason reason, 16092 gfp_t gfp) 16093 { 16094 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 16095 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16096 struct sk_buff *msg; 16097 void *hdr; 16098 16099 msg = nlmsg_new(NLMSG_GOODSIZE, gfp); 16100 if (!msg) 16101 return; 16102 16103 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED); 16104 if (!hdr) { 16105 nlmsg_free(msg); 16106 return; 16107 } 16108 16109 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 16110 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 16111 nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason)) 16112 goto nla_put_failure; 16113 16114 genlmsg_end(msg, hdr); 16115 16116 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16117 NL80211_MCGRP_MLME, gfp); 16118 return; 16119 16120 nla_put_failure: 16121 nlmsg_free(msg); 16122 } 16123 EXPORT_SYMBOL(cfg80211_conn_failed); 16124 16125 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd, 16126 const u8 *addr, gfp_t gfp) 16127 { 16128 struct wireless_dev *wdev = dev->ieee80211_ptr; 16129 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 16130 struct sk_buff *msg; 16131 void *hdr; 16132 u32 nlportid = READ_ONCE(wdev->ap_unexpected_nlportid); 16133 16134 if (!nlportid) 16135 return false; 16136 16137 msg = nlmsg_new(100, gfp); 16138 if (!msg) 16139 return true; 16140 16141 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 16142 if (!hdr) { 16143 nlmsg_free(msg); 16144 return true; 16145 } 16146 16147 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16148 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 16149 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) 16150 goto nla_put_failure; 16151 16152 genlmsg_end(msg, hdr); 16153 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 16154 return true; 16155 16156 nla_put_failure: 16157 nlmsg_free(msg); 16158 return true; 16159 } 16160 16161 bool cfg80211_rx_spurious_frame(struct net_device *dev, 16162 const u8 *addr, gfp_t gfp) 16163 { 16164 struct wireless_dev *wdev = dev->ieee80211_ptr; 16165 bool ret; 16166 16167 trace_cfg80211_rx_spurious_frame(dev, addr); 16168 16169 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 16170 wdev->iftype != NL80211_IFTYPE_P2P_GO)) { 16171 trace_cfg80211_return_bool(false); 16172 return false; 16173 } 16174 ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME, 16175 addr, gfp); 16176 trace_cfg80211_return_bool(ret); 16177 return ret; 16178 } 16179 EXPORT_SYMBOL(cfg80211_rx_spurious_frame); 16180 16181 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev, 16182 const u8 *addr, gfp_t gfp) 16183 { 16184 struct wireless_dev *wdev = dev->ieee80211_ptr; 16185 bool ret; 16186 16187 trace_cfg80211_rx_unexpected_4addr_frame(dev, addr); 16188 16189 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 16190 wdev->iftype != NL80211_IFTYPE_P2P_GO && 16191 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { 16192 trace_cfg80211_return_bool(false); 16193 return false; 16194 } 16195 ret = __nl80211_unexpected_frame(dev, 16196 NL80211_CMD_UNEXPECTED_4ADDR_FRAME, 16197 addr, gfp); 16198 trace_cfg80211_return_bool(ret); 16199 return ret; 16200 } 16201 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame); 16202 16203 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, 16204 struct wireless_dev *wdev, u32 nlportid, 16205 int freq, int sig_dbm, 16206 const u8 *buf, size_t len, u32 flags, gfp_t gfp) 16207 { 16208 struct net_device *netdev = wdev->netdev; 16209 struct sk_buff *msg; 16210 void *hdr; 16211 16212 msg = nlmsg_new(100 + len, gfp); 16213 if (!msg) 16214 return -ENOMEM; 16215 16216 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 16217 if (!hdr) { 16218 nlmsg_free(msg); 16219 return -ENOMEM; 16220 } 16221 16222 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16223 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 16224 netdev->ifindex)) || 16225 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 16226 NL80211_ATTR_PAD) || 16227 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) || 16228 (sig_dbm && 16229 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) || 16230 nla_put(msg, NL80211_ATTR_FRAME, len, buf) || 16231 (flags && 16232 nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, flags))) 16233 goto nla_put_failure; 16234 16235 genlmsg_end(msg, hdr); 16236 16237 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 16238 16239 nla_put_failure: 16240 nlmsg_free(msg); 16241 return -ENOBUFS; 16242 } 16243 16244 void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie, 16245 const u8 *buf, size_t len, bool ack, gfp_t gfp) 16246 { 16247 struct wiphy *wiphy = wdev->wiphy; 16248 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16249 struct net_device *netdev = wdev->netdev; 16250 struct sk_buff *msg; 16251 void *hdr; 16252 16253 trace_cfg80211_mgmt_tx_status(wdev, cookie, ack); 16254 16255 msg = nlmsg_new(100 + len, gfp); 16256 if (!msg) 16257 return; 16258 16259 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME_TX_STATUS); 16260 if (!hdr) { 16261 nlmsg_free(msg); 16262 return; 16263 } 16264 16265 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16266 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 16267 netdev->ifindex)) || 16268 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 16269 NL80211_ATTR_PAD) || 16270 nla_put(msg, NL80211_ATTR_FRAME, len, buf) || 16271 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 16272 NL80211_ATTR_PAD) || 16273 (ack && nla_put_flag(msg, NL80211_ATTR_ACK))) 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 EXPORT_SYMBOL(cfg80211_mgmt_tx_status); 16286 16287 static int __nl80211_rx_control_port(struct net_device *dev, 16288 struct sk_buff *skb, 16289 bool unencrypted, gfp_t gfp) 16290 { 16291 struct wireless_dev *wdev = dev->ieee80211_ptr; 16292 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 16293 struct ethhdr *ehdr = eth_hdr(skb); 16294 const u8 *addr = ehdr->h_source; 16295 u16 proto = be16_to_cpu(skb->protocol); 16296 struct sk_buff *msg; 16297 void *hdr; 16298 struct nlattr *frame; 16299 16300 u32 nlportid = READ_ONCE(wdev->conn_owner_nlportid); 16301 16302 if (!nlportid) 16303 return -ENOENT; 16304 16305 msg = nlmsg_new(100 + skb->len, gfp); 16306 if (!msg) 16307 return -ENOMEM; 16308 16309 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONTROL_PORT_FRAME); 16310 if (!hdr) { 16311 nlmsg_free(msg); 16312 return -ENOBUFS; 16313 } 16314 16315 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16316 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 16317 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 16318 NL80211_ATTR_PAD) || 16319 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 16320 nla_put_u16(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE, proto) || 16321 (unencrypted && nla_put_flag(msg, 16322 NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT))) 16323 goto nla_put_failure; 16324 16325 frame = nla_reserve(msg, NL80211_ATTR_FRAME, skb->len); 16326 if (!frame) 16327 goto nla_put_failure; 16328 16329 skb_copy_bits(skb, 0, nla_data(frame), skb->len); 16330 genlmsg_end(msg, hdr); 16331 16332 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 16333 16334 nla_put_failure: 16335 nlmsg_free(msg); 16336 return -ENOBUFS; 16337 } 16338 16339 bool cfg80211_rx_control_port(struct net_device *dev, 16340 struct sk_buff *skb, bool unencrypted) 16341 { 16342 int ret; 16343 16344 trace_cfg80211_rx_control_port(dev, skb, unencrypted); 16345 ret = __nl80211_rx_control_port(dev, skb, unencrypted, GFP_ATOMIC); 16346 trace_cfg80211_return_bool(ret == 0); 16347 return ret == 0; 16348 } 16349 EXPORT_SYMBOL(cfg80211_rx_control_port); 16350 16351 static struct sk_buff *cfg80211_prepare_cqm(struct net_device *dev, 16352 const char *mac, gfp_t gfp) 16353 { 16354 struct wireless_dev *wdev = dev->ieee80211_ptr; 16355 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 16356 struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16357 void **cb; 16358 16359 if (!msg) 16360 return NULL; 16361 16362 cb = (void **)msg->cb; 16363 16364 cb[0] = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM); 16365 if (!cb[0]) { 16366 nlmsg_free(msg); 16367 return NULL; 16368 } 16369 16370 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16371 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 16372 goto nla_put_failure; 16373 16374 if (mac && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac)) 16375 goto nla_put_failure; 16376 16377 cb[1] = nla_nest_start_noflag(msg, NL80211_ATTR_CQM); 16378 if (!cb[1]) 16379 goto nla_put_failure; 16380 16381 cb[2] = rdev; 16382 16383 return msg; 16384 nla_put_failure: 16385 nlmsg_free(msg); 16386 return NULL; 16387 } 16388 16389 static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp) 16390 { 16391 void **cb = (void **)msg->cb; 16392 struct cfg80211_registered_device *rdev = cb[2]; 16393 16394 nla_nest_end(msg, cb[1]); 16395 genlmsg_end(msg, cb[0]); 16396 16397 memset(msg->cb, 0, sizeof(msg->cb)); 16398 16399 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16400 NL80211_MCGRP_MLME, gfp); 16401 } 16402 16403 void cfg80211_cqm_rssi_notify(struct net_device *dev, 16404 enum nl80211_cqm_rssi_threshold_event rssi_event, 16405 s32 rssi_level, gfp_t gfp) 16406 { 16407 struct sk_buff *msg; 16408 struct wireless_dev *wdev = dev->ieee80211_ptr; 16409 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 16410 16411 trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level); 16412 16413 if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW && 16414 rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH)) 16415 return; 16416 16417 if (wdev->cqm_config) { 16418 wdev->cqm_config->last_rssi_event_value = rssi_level; 16419 16420 cfg80211_cqm_rssi_update(rdev, dev); 16421 16422 if (rssi_level == 0) 16423 rssi_level = wdev->cqm_config->last_rssi_event_value; 16424 } 16425 16426 msg = cfg80211_prepare_cqm(dev, NULL, gfp); 16427 if (!msg) 16428 return; 16429 16430 if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT, 16431 rssi_event)) 16432 goto nla_put_failure; 16433 16434 if (rssi_level && nla_put_s32(msg, NL80211_ATTR_CQM_RSSI_LEVEL, 16435 rssi_level)) 16436 goto nla_put_failure; 16437 16438 cfg80211_send_cqm(msg, gfp); 16439 16440 return; 16441 16442 nla_put_failure: 16443 nlmsg_free(msg); 16444 } 16445 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify); 16446 16447 void cfg80211_cqm_txe_notify(struct net_device *dev, 16448 const u8 *peer, u32 num_packets, 16449 u32 rate, u32 intvl, gfp_t gfp) 16450 { 16451 struct sk_buff *msg; 16452 16453 msg = cfg80211_prepare_cqm(dev, peer, gfp); 16454 if (!msg) 16455 return; 16456 16457 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets)) 16458 goto nla_put_failure; 16459 16460 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate)) 16461 goto nla_put_failure; 16462 16463 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl)) 16464 goto nla_put_failure; 16465 16466 cfg80211_send_cqm(msg, gfp); 16467 return; 16468 16469 nla_put_failure: 16470 nlmsg_free(msg); 16471 } 16472 EXPORT_SYMBOL(cfg80211_cqm_txe_notify); 16473 16474 void cfg80211_cqm_pktloss_notify(struct net_device *dev, 16475 const u8 *peer, u32 num_packets, gfp_t gfp) 16476 { 16477 struct sk_buff *msg; 16478 16479 trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets); 16480 16481 msg = cfg80211_prepare_cqm(dev, peer, gfp); 16482 if (!msg) 16483 return; 16484 16485 if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets)) 16486 goto nla_put_failure; 16487 16488 cfg80211_send_cqm(msg, gfp); 16489 return; 16490 16491 nla_put_failure: 16492 nlmsg_free(msg); 16493 } 16494 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify); 16495 16496 void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp) 16497 { 16498 struct sk_buff *msg; 16499 16500 msg = cfg80211_prepare_cqm(dev, NULL, gfp); 16501 if (!msg) 16502 return; 16503 16504 if (nla_put_flag(msg, NL80211_ATTR_CQM_BEACON_LOSS_EVENT)) 16505 goto nla_put_failure; 16506 16507 cfg80211_send_cqm(msg, gfp); 16508 return; 16509 16510 nla_put_failure: 16511 nlmsg_free(msg); 16512 } 16513 EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify); 16514 16515 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev, 16516 struct net_device *netdev, const u8 *bssid, 16517 const u8 *replay_ctr, gfp_t gfp) 16518 { 16519 struct sk_buff *msg; 16520 struct nlattr *rekey_attr; 16521 void *hdr; 16522 16523 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16524 if (!msg) 16525 return; 16526 16527 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD); 16528 if (!hdr) { 16529 nlmsg_free(msg); 16530 return; 16531 } 16532 16533 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16534 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 16535 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 16536 goto nla_put_failure; 16537 16538 rekey_attr = nla_nest_start_noflag(msg, NL80211_ATTR_REKEY_DATA); 16539 if (!rekey_attr) 16540 goto nla_put_failure; 16541 16542 if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR, 16543 NL80211_REPLAY_CTR_LEN, replay_ctr)) 16544 goto nla_put_failure; 16545 16546 nla_nest_end(msg, rekey_attr); 16547 16548 genlmsg_end(msg, hdr); 16549 16550 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16551 NL80211_MCGRP_MLME, gfp); 16552 return; 16553 16554 nla_put_failure: 16555 nlmsg_free(msg); 16556 } 16557 16558 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid, 16559 const u8 *replay_ctr, gfp_t gfp) 16560 { 16561 struct wireless_dev *wdev = dev->ieee80211_ptr; 16562 struct wiphy *wiphy = wdev->wiphy; 16563 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16564 16565 trace_cfg80211_gtk_rekey_notify(dev, bssid); 16566 nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp); 16567 } 16568 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify); 16569 16570 static void 16571 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev, 16572 struct net_device *netdev, int index, 16573 const u8 *bssid, bool preauth, gfp_t gfp) 16574 { 16575 struct sk_buff *msg; 16576 struct nlattr *attr; 16577 void *hdr; 16578 16579 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16580 if (!msg) 16581 return; 16582 16583 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE); 16584 if (!hdr) { 16585 nlmsg_free(msg); 16586 return; 16587 } 16588 16589 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16590 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 16591 goto nla_put_failure; 16592 16593 attr = nla_nest_start_noflag(msg, NL80211_ATTR_PMKSA_CANDIDATE); 16594 if (!attr) 16595 goto nla_put_failure; 16596 16597 if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) || 16598 nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) || 16599 (preauth && 16600 nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH))) 16601 goto nla_put_failure; 16602 16603 nla_nest_end(msg, attr); 16604 16605 genlmsg_end(msg, hdr); 16606 16607 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16608 NL80211_MCGRP_MLME, gfp); 16609 return; 16610 16611 nla_put_failure: 16612 nlmsg_free(msg); 16613 } 16614 16615 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index, 16616 const u8 *bssid, bool preauth, gfp_t gfp) 16617 { 16618 struct wireless_dev *wdev = dev->ieee80211_ptr; 16619 struct wiphy *wiphy = wdev->wiphy; 16620 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16621 16622 trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth); 16623 nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp); 16624 } 16625 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify); 16626 16627 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev, 16628 struct net_device *netdev, 16629 struct cfg80211_chan_def *chandef, 16630 gfp_t gfp, 16631 enum nl80211_commands notif, 16632 u8 count) 16633 { 16634 struct sk_buff *msg; 16635 void *hdr; 16636 16637 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16638 if (!msg) 16639 return; 16640 16641 hdr = nl80211hdr_put(msg, 0, 0, 0, notif); 16642 if (!hdr) { 16643 nlmsg_free(msg); 16644 return; 16645 } 16646 16647 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 16648 goto nla_put_failure; 16649 16650 if (nl80211_send_chandef(msg, chandef)) 16651 goto nla_put_failure; 16652 16653 if ((notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) && 16654 (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count))) 16655 goto nla_put_failure; 16656 16657 genlmsg_end(msg, hdr); 16658 16659 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16660 NL80211_MCGRP_MLME, gfp); 16661 return; 16662 16663 nla_put_failure: 16664 nlmsg_free(msg); 16665 } 16666 16667 void cfg80211_ch_switch_notify(struct net_device *dev, 16668 struct cfg80211_chan_def *chandef) 16669 { 16670 struct wireless_dev *wdev = dev->ieee80211_ptr; 16671 struct wiphy *wiphy = wdev->wiphy; 16672 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16673 16674 ASSERT_WDEV_LOCK(wdev); 16675 16676 trace_cfg80211_ch_switch_notify(dev, chandef); 16677 16678 wdev->chandef = *chandef; 16679 wdev->preset_chandef = *chandef; 16680 16681 if (wdev->iftype == NL80211_IFTYPE_STATION && 16682 !WARN_ON(!wdev->current_bss)) 16683 cfg80211_update_assoc_bss_entry(wdev, chandef->chan); 16684 16685 cfg80211_sched_dfs_chan_update(rdev); 16686 16687 nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL, 16688 NL80211_CMD_CH_SWITCH_NOTIFY, 0); 16689 } 16690 EXPORT_SYMBOL(cfg80211_ch_switch_notify); 16691 16692 void cfg80211_ch_switch_started_notify(struct net_device *dev, 16693 struct cfg80211_chan_def *chandef, 16694 u8 count) 16695 { 16696 struct wireless_dev *wdev = dev->ieee80211_ptr; 16697 struct wiphy *wiphy = wdev->wiphy; 16698 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16699 16700 trace_cfg80211_ch_switch_started_notify(dev, chandef); 16701 16702 nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL, 16703 NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, count); 16704 } 16705 EXPORT_SYMBOL(cfg80211_ch_switch_started_notify); 16706 16707 void 16708 nl80211_radar_notify(struct cfg80211_registered_device *rdev, 16709 const struct cfg80211_chan_def *chandef, 16710 enum nl80211_radar_event event, 16711 struct net_device *netdev, gfp_t gfp) 16712 { 16713 struct sk_buff *msg; 16714 void *hdr; 16715 16716 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16717 if (!msg) 16718 return; 16719 16720 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT); 16721 if (!hdr) { 16722 nlmsg_free(msg); 16723 return; 16724 } 16725 16726 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 16727 goto nla_put_failure; 16728 16729 /* NOP and radar events don't need a netdev parameter */ 16730 if (netdev) { 16731 struct wireless_dev *wdev = netdev->ieee80211_ptr; 16732 16733 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 16734 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 16735 NL80211_ATTR_PAD)) 16736 goto nla_put_failure; 16737 } 16738 16739 if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event)) 16740 goto nla_put_failure; 16741 16742 if (nl80211_send_chandef(msg, chandef)) 16743 goto nla_put_failure; 16744 16745 genlmsg_end(msg, hdr); 16746 16747 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16748 NL80211_MCGRP_MLME, gfp); 16749 return; 16750 16751 nla_put_failure: 16752 nlmsg_free(msg); 16753 } 16754 16755 void cfg80211_sta_opmode_change_notify(struct net_device *dev, const u8 *mac, 16756 struct sta_opmode_info *sta_opmode, 16757 gfp_t gfp) 16758 { 16759 struct sk_buff *msg; 16760 struct wireless_dev *wdev = dev->ieee80211_ptr; 16761 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 16762 void *hdr; 16763 16764 if (WARN_ON(!mac)) 16765 return; 16766 16767 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16768 if (!msg) 16769 return; 16770 16771 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STA_OPMODE_CHANGED); 16772 if (!hdr) { 16773 nlmsg_free(msg); 16774 return; 16775 } 16776 16777 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 16778 goto nla_put_failure; 16779 16780 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 16781 goto nla_put_failure; 16782 16783 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac)) 16784 goto nla_put_failure; 16785 16786 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) && 16787 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode)) 16788 goto nla_put_failure; 16789 16790 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && 16791 nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) 16792 goto nla_put_failure; 16793 16794 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && 16795 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss)) 16796 goto nla_put_failure; 16797 16798 genlmsg_end(msg, hdr); 16799 16800 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16801 NL80211_MCGRP_MLME, gfp); 16802 16803 return; 16804 16805 nla_put_failure: 16806 nlmsg_free(msg); 16807 } 16808 EXPORT_SYMBOL(cfg80211_sta_opmode_change_notify); 16809 16810 void cfg80211_probe_status(struct net_device *dev, const u8 *addr, 16811 u64 cookie, bool acked, s32 ack_signal, 16812 bool is_valid_ack_signal, gfp_t gfp) 16813 { 16814 struct wireless_dev *wdev = dev->ieee80211_ptr; 16815 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 16816 struct sk_buff *msg; 16817 void *hdr; 16818 16819 trace_cfg80211_probe_status(dev, addr, cookie, acked); 16820 16821 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 16822 16823 if (!msg) 16824 return; 16825 16826 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_CLIENT); 16827 if (!hdr) { 16828 nlmsg_free(msg); 16829 return; 16830 } 16831 16832 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16833 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 16834 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 16835 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 16836 NL80211_ATTR_PAD) || 16837 (acked && nla_put_flag(msg, NL80211_ATTR_ACK)) || 16838 (is_valid_ack_signal && nla_put_s32(msg, NL80211_ATTR_ACK_SIGNAL, 16839 ack_signal))) 16840 goto nla_put_failure; 16841 16842 genlmsg_end(msg, hdr); 16843 16844 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 16845 NL80211_MCGRP_MLME, gfp); 16846 return; 16847 16848 nla_put_failure: 16849 nlmsg_free(msg); 16850 } 16851 EXPORT_SYMBOL(cfg80211_probe_status); 16852 16853 void cfg80211_report_obss_beacon(struct wiphy *wiphy, 16854 const u8 *frame, size_t len, 16855 int freq, int sig_dbm) 16856 { 16857 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 16858 struct sk_buff *msg; 16859 void *hdr; 16860 struct cfg80211_beacon_registration *reg; 16861 16862 trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm); 16863 16864 spin_lock_bh(&rdev->beacon_registrations_lock); 16865 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 16866 msg = nlmsg_new(len + 100, GFP_ATOMIC); 16867 if (!msg) { 16868 spin_unlock_bh(&rdev->beacon_registrations_lock); 16869 return; 16870 } 16871 16872 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 16873 if (!hdr) 16874 goto nla_put_failure; 16875 16876 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16877 (freq && 16878 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq)) || 16879 (sig_dbm && 16880 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) || 16881 nla_put(msg, NL80211_ATTR_FRAME, len, frame)) 16882 goto nla_put_failure; 16883 16884 genlmsg_end(msg, hdr); 16885 16886 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); 16887 } 16888 spin_unlock_bh(&rdev->beacon_registrations_lock); 16889 return; 16890 16891 nla_put_failure: 16892 spin_unlock_bh(&rdev->beacon_registrations_lock); 16893 nlmsg_free(msg); 16894 } 16895 EXPORT_SYMBOL(cfg80211_report_obss_beacon); 16896 16897 #ifdef CONFIG_PM 16898 static int cfg80211_net_detect_results(struct sk_buff *msg, 16899 struct cfg80211_wowlan_wakeup *wakeup) 16900 { 16901 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect; 16902 struct nlattr *nl_results, *nl_match, *nl_freqs; 16903 int i, j; 16904 16905 nl_results = nla_nest_start_noflag(msg, 16906 NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS); 16907 if (!nl_results) 16908 return -EMSGSIZE; 16909 16910 for (i = 0; i < nd->n_matches; i++) { 16911 struct cfg80211_wowlan_nd_match *match = nd->matches[i]; 16912 16913 nl_match = nla_nest_start_noflag(msg, i); 16914 if (!nl_match) 16915 break; 16916 16917 /* The SSID attribute is optional in nl80211, but for 16918 * simplicity reasons it's always present in the 16919 * cfg80211 structure. If a driver can't pass the 16920 * SSID, that needs to be changed. A zero length SSID 16921 * is still a valid SSID (wildcard), so it cannot be 16922 * used for this purpose. 16923 */ 16924 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len, 16925 match->ssid.ssid)) { 16926 nla_nest_cancel(msg, nl_match); 16927 goto out; 16928 } 16929 16930 if (match->n_channels) { 16931 nl_freqs = nla_nest_start_noflag(msg, 16932 NL80211_ATTR_SCAN_FREQUENCIES); 16933 if (!nl_freqs) { 16934 nla_nest_cancel(msg, nl_match); 16935 goto out; 16936 } 16937 16938 for (j = 0; j < match->n_channels; j++) { 16939 if (nla_put_u32(msg, j, match->channels[j])) { 16940 nla_nest_cancel(msg, nl_freqs); 16941 nla_nest_cancel(msg, nl_match); 16942 goto out; 16943 } 16944 } 16945 16946 nla_nest_end(msg, nl_freqs); 16947 } 16948 16949 nla_nest_end(msg, nl_match); 16950 } 16951 16952 out: 16953 nla_nest_end(msg, nl_results); 16954 return 0; 16955 } 16956 16957 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev, 16958 struct cfg80211_wowlan_wakeup *wakeup, 16959 gfp_t gfp) 16960 { 16961 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 16962 struct sk_buff *msg; 16963 void *hdr; 16964 int size = 200; 16965 16966 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); 16967 16968 if (wakeup) 16969 size += wakeup->packet_present_len; 16970 16971 msg = nlmsg_new(size, gfp); 16972 if (!msg) 16973 return; 16974 16975 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN); 16976 if (!hdr) 16977 goto free_msg; 16978 16979 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 16980 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 16981 NL80211_ATTR_PAD)) 16982 goto free_msg; 16983 16984 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 16985 wdev->netdev->ifindex)) 16986 goto free_msg; 16987 16988 if (wakeup) { 16989 struct nlattr *reasons; 16990 16991 reasons = nla_nest_start_noflag(msg, 16992 NL80211_ATTR_WOWLAN_TRIGGERS); 16993 if (!reasons) 16994 goto free_msg; 16995 16996 if (wakeup->disconnect && 16997 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) 16998 goto free_msg; 16999 if (wakeup->magic_pkt && 17000 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) 17001 goto free_msg; 17002 if (wakeup->gtk_rekey_failure && 17003 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) 17004 goto free_msg; 17005 if (wakeup->eap_identity_req && 17006 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) 17007 goto free_msg; 17008 if (wakeup->four_way_handshake && 17009 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) 17010 goto free_msg; 17011 if (wakeup->rfkill_release && 17012 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)) 17013 goto free_msg; 17014 17015 if (wakeup->pattern_idx >= 0 && 17016 nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN, 17017 wakeup->pattern_idx)) 17018 goto free_msg; 17019 17020 if (wakeup->tcp_match && 17021 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH)) 17022 goto free_msg; 17023 17024 if (wakeup->tcp_connlost && 17025 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST)) 17026 goto free_msg; 17027 17028 if (wakeup->tcp_nomoretokens && 17029 nla_put_flag(msg, 17030 NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS)) 17031 goto free_msg; 17032 17033 if (wakeup->packet) { 17034 u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211; 17035 u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN; 17036 17037 if (!wakeup->packet_80211) { 17038 pkt_attr = 17039 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023; 17040 len_attr = 17041 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN; 17042 } 17043 17044 if (wakeup->packet_len && 17045 nla_put_u32(msg, len_attr, wakeup->packet_len)) 17046 goto free_msg; 17047 17048 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, 17049 wakeup->packet)) 17050 goto free_msg; 17051 } 17052 17053 if (wakeup->net_detect && 17054 cfg80211_net_detect_results(msg, wakeup)) 17055 goto free_msg; 17056 17057 nla_nest_end(msg, reasons); 17058 } 17059 17060 genlmsg_end(msg, hdr); 17061 17062 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 17063 NL80211_MCGRP_MLME, gfp); 17064 return; 17065 17066 free_msg: 17067 nlmsg_free(msg); 17068 } 17069 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup); 17070 #endif 17071 17072 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer, 17073 enum nl80211_tdls_operation oper, 17074 u16 reason_code, gfp_t gfp) 17075 { 17076 struct wireless_dev *wdev = dev->ieee80211_ptr; 17077 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 17078 struct sk_buff *msg; 17079 void *hdr; 17080 17081 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, 17082 reason_code); 17083 17084 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 17085 if (!msg) 17086 return; 17087 17088 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER); 17089 if (!hdr) { 17090 nlmsg_free(msg); 17091 return; 17092 } 17093 17094 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17095 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 17096 nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) || 17097 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) || 17098 (reason_code > 0 && 17099 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code))) 17100 goto nla_put_failure; 17101 17102 genlmsg_end(msg, hdr); 17103 17104 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 17105 NL80211_MCGRP_MLME, gfp); 17106 return; 17107 17108 nla_put_failure: 17109 nlmsg_free(msg); 17110 } 17111 EXPORT_SYMBOL(cfg80211_tdls_oper_request); 17112 17113 static int nl80211_netlink_notify(struct notifier_block * nb, 17114 unsigned long state, 17115 void *_notify) 17116 { 17117 struct netlink_notify *notify = _notify; 17118 struct cfg80211_registered_device *rdev; 17119 struct wireless_dev *wdev; 17120 struct cfg80211_beacon_registration *reg, *tmp; 17121 17122 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC) 17123 return NOTIFY_DONE; 17124 17125 rcu_read_lock(); 17126 17127 list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) { 17128 struct cfg80211_sched_scan_request *sched_scan_req; 17129 17130 list_for_each_entry_rcu(sched_scan_req, 17131 &rdev->sched_scan_req_list, 17132 list) { 17133 if (sched_scan_req->owner_nlportid == notify->portid) { 17134 sched_scan_req->nl_owner_dead = true; 17135 schedule_work(&rdev->sched_scan_stop_wk); 17136 } 17137 } 17138 17139 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) { 17140 cfg80211_mlme_unregister_socket(wdev, notify->portid); 17141 17142 if (wdev->owner_nlportid == notify->portid) { 17143 wdev->nl_owner_dead = true; 17144 schedule_work(&rdev->destroy_work); 17145 } else if (wdev->conn_owner_nlportid == notify->portid) { 17146 schedule_work(&wdev->disconnect_wk); 17147 } 17148 17149 cfg80211_release_pmsr(wdev, notify->portid); 17150 } 17151 17152 spin_lock_bh(&rdev->beacon_registrations_lock); 17153 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, 17154 list) { 17155 if (reg->nlportid == notify->portid) { 17156 list_del(®->list); 17157 kfree(reg); 17158 break; 17159 } 17160 } 17161 spin_unlock_bh(&rdev->beacon_registrations_lock); 17162 } 17163 17164 rcu_read_unlock(); 17165 17166 /* 17167 * It is possible that the user space process that is controlling the 17168 * indoor setting disappeared, so notify the regulatory core. 17169 */ 17170 regulatory_netlink_notify(notify->portid); 17171 return NOTIFY_OK; 17172 } 17173 17174 static struct notifier_block nl80211_netlink_notifier = { 17175 .notifier_call = nl80211_netlink_notify, 17176 }; 17177 17178 void cfg80211_ft_event(struct net_device *netdev, 17179 struct cfg80211_ft_event_params *ft_event) 17180 { 17181 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; 17182 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 17183 struct sk_buff *msg; 17184 void *hdr; 17185 17186 trace_cfg80211_ft_event(wiphy, netdev, ft_event); 17187 17188 if (!ft_event->target_ap) 17189 return; 17190 17191 msg = nlmsg_new(100 + ft_event->ies_len + ft_event->ric_ies_len, 17192 GFP_KERNEL); 17193 if (!msg) 17194 return; 17195 17196 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT); 17197 if (!hdr) 17198 goto out; 17199 17200 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17201 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 17202 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) 17203 goto out; 17204 17205 if (ft_event->ies && 17206 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) 17207 goto out; 17208 if (ft_event->ric_ies && 17209 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, 17210 ft_event->ric_ies)) 17211 goto out; 17212 17213 genlmsg_end(msg, hdr); 17214 17215 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 17216 NL80211_MCGRP_MLME, GFP_KERNEL); 17217 return; 17218 out: 17219 nlmsg_free(msg); 17220 } 17221 EXPORT_SYMBOL(cfg80211_ft_event); 17222 17223 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp) 17224 { 17225 struct cfg80211_registered_device *rdev; 17226 struct sk_buff *msg; 17227 void *hdr; 17228 u32 nlportid; 17229 17230 rdev = wiphy_to_rdev(wdev->wiphy); 17231 if (!rdev->crit_proto_nlportid) 17232 return; 17233 17234 nlportid = rdev->crit_proto_nlportid; 17235 rdev->crit_proto_nlportid = 0; 17236 17237 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 17238 if (!msg) 17239 return; 17240 17241 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP); 17242 if (!hdr) 17243 goto nla_put_failure; 17244 17245 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17246 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 17247 NL80211_ATTR_PAD)) 17248 goto nla_put_failure; 17249 17250 genlmsg_end(msg, hdr); 17251 17252 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 17253 return; 17254 17255 nla_put_failure: 17256 nlmsg_free(msg); 17257 } 17258 EXPORT_SYMBOL(cfg80211_crit_proto_stopped); 17259 17260 void nl80211_send_ap_stopped(struct wireless_dev *wdev) 17261 { 17262 struct wiphy *wiphy = wdev->wiphy; 17263 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 17264 struct sk_buff *msg; 17265 void *hdr; 17266 17267 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 17268 if (!msg) 17269 return; 17270 17271 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP); 17272 if (!hdr) 17273 goto out; 17274 17275 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17276 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || 17277 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 17278 NL80211_ATTR_PAD)) 17279 goto out; 17280 17281 genlmsg_end(msg, hdr); 17282 17283 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0, 17284 NL80211_MCGRP_MLME, GFP_KERNEL); 17285 return; 17286 out: 17287 nlmsg_free(msg); 17288 } 17289 17290 int cfg80211_external_auth_request(struct net_device *dev, 17291 struct cfg80211_external_auth_params *params, 17292 gfp_t gfp) 17293 { 17294 struct wireless_dev *wdev = dev->ieee80211_ptr; 17295 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 17296 struct sk_buff *msg; 17297 void *hdr; 17298 17299 if (!wdev->conn_owner_nlportid) 17300 return -EINVAL; 17301 17302 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 17303 if (!msg) 17304 return -ENOMEM; 17305 17306 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EXTERNAL_AUTH); 17307 if (!hdr) 17308 goto nla_put_failure; 17309 17310 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17311 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 17312 nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, params->key_mgmt_suite) || 17313 nla_put_u32(msg, NL80211_ATTR_EXTERNAL_AUTH_ACTION, 17314 params->action) || 17315 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) || 17316 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len, 17317 params->ssid.ssid)) 17318 goto nla_put_failure; 17319 17320 genlmsg_end(msg, hdr); 17321 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 17322 wdev->conn_owner_nlportid); 17323 return 0; 17324 17325 nla_put_failure: 17326 nlmsg_free(msg); 17327 return -ENOBUFS; 17328 } 17329 EXPORT_SYMBOL(cfg80211_external_auth_request); 17330 17331 void cfg80211_update_owe_info_event(struct net_device *netdev, 17332 struct cfg80211_update_owe_info *owe_info, 17333 gfp_t gfp) 17334 { 17335 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; 17336 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 17337 struct sk_buff *msg; 17338 void *hdr; 17339 17340 trace_cfg80211_update_owe_info_event(wiphy, netdev, owe_info); 17341 17342 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 17343 if (!msg) 17344 return; 17345 17346 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_UPDATE_OWE_INFO); 17347 if (!hdr) 17348 goto nla_put_failure; 17349 17350 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 17351 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 17352 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, owe_info->peer)) 17353 goto nla_put_failure; 17354 17355 if (!owe_info->ie_len || 17356 nla_put(msg, NL80211_ATTR_IE, owe_info->ie_len, owe_info->ie)) 17357 goto nla_put_failure; 17358 17359 genlmsg_end(msg, hdr); 17360 17361 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 17362 NL80211_MCGRP_MLME, gfp); 17363 return; 17364 17365 nla_put_failure: 17366 genlmsg_cancel(msg, hdr); 17367 nlmsg_free(msg); 17368 } 17369 EXPORT_SYMBOL(cfg80211_update_owe_info_event); 17370 17371 /* initialisation/exit functions */ 17372 17373 int __init nl80211_init(void) 17374 { 17375 int err; 17376 17377 err = genl_register_family(&nl80211_fam); 17378 if (err) 17379 return err; 17380 17381 err = netlink_register_notifier(&nl80211_netlink_notifier); 17382 if (err) 17383 goto err_out; 17384 17385 return 0; 17386 err_out: 17387 genl_unregister_family(&nl80211_fam); 17388 return err; 17389 } 17390 17391 void nl80211_exit(void) 17392 { 17393 netlink_unregister_notifier(&nl80211_netlink_notifier); 17394 genl_unregister_family(&nl80211_fam); 17395 } 17396