1 /* 2 * This is the new netlink-based wireless configuration interface. 3 * 4 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net> 5 * Copyright 2013-2014 Intel Mobile Communications GmbH 6 * Copyright 2015-2017 Intel Deutschland GmbH 7 */ 8 9 #include <linux/if.h> 10 #include <linux/module.h> 11 #include <linux/err.h> 12 #include <linux/slab.h> 13 #include <linux/list.h> 14 #include <linux/if_ether.h> 15 #include <linux/ieee80211.h> 16 #include <linux/nl80211.h> 17 #include <linux/rtnetlink.h> 18 #include <linux/netlink.h> 19 #include <linux/nospec.h> 20 #include <linux/etherdevice.h> 21 #include <net/net_namespace.h> 22 #include <net/genetlink.h> 23 #include <net/cfg80211.h> 24 #include <net/sock.h> 25 #include <net/inet_connection_sock.h> 26 #include "core.h" 27 #include "nl80211.h" 28 #include "reg.h" 29 #include "rdev-ops.h" 30 31 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, 32 struct genl_info *info, 33 struct cfg80211_crypto_settings *settings, 34 int cipher_limit); 35 36 /* the netlink family */ 37 static struct genl_family nl80211_fam; 38 39 /* multicast groups */ 40 enum nl80211_multicast_groups { 41 NL80211_MCGRP_CONFIG, 42 NL80211_MCGRP_SCAN, 43 NL80211_MCGRP_REGULATORY, 44 NL80211_MCGRP_MLME, 45 NL80211_MCGRP_VENDOR, 46 NL80211_MCGRP_NAN, 47 NL80211_MCGRP_TESTMODE /* keep last - ifdef! */ 48 }; 49 50 static const struct genl_multicast_group nl80211_mcgrps[] = { 51 [NL80211_MCGRP_CONFIG] = { .name = NL80211_MULTICAST_GROUP_CONFIG }, 52 [NL80211_MCGRP_SCAN] = { .name = NL80211_MULTICAST_GROUP_SCAN }, 53 [NL80211_MCGRP_REGULATORY] = { .name = NL80211_MULTICAST_GROUP_REG }, 54 [NL80211_MCGRP_MLME] = { .name = NL80211_MULTICAST_GROUP_MLME }, 55 [NL80211_MCGRP_VENDOR] = { .name = NL80211_MULTICAST_GROUP_VENDOR }, 56 [NL80211_MCGRP_NAN] = { .name = NL80211_MULTICAST_GROUP_NAN }, 57 #ifdef CONFIG_NL80211_TESTMODE 58 [NL80211_MCGRP_TESTMODE] = { .name = NL80211_MULTICAST_GROUP_TESTMODE } 59 #endif 60 }; 61 62 /* returns ERR_PTR values */ 63 static struct wireless_dev * 64 __cfg80211_wdev_from_attrs(struct net *netns, struct nlattr **attrs) 65 { 66 struct cfg80211_registered_device *rdev; 67 struct wireless_dev *result = NULL; 68 bool have_ifidx = attrs[NL80211_ATTR_IFINDEX]; 69 bool have_wdev_id = attrs[NL80211_ATTR_WDEV]; 70 u64 wdev_id; 71 int wiphy_idx = -1; 72 int ifidx = -1; 73 74 ASSERT_RTNL(); 75 76 if (!have_ifidx && !have_wdev_id) 77 return ERR_PTR(-EINVAL); 78 79 if (have_ifidx) 80 ifidx = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]); 81 if (have_wdev_id) { 82 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]); 83 wiphy_idx = wdev_id >> 32; 84 } 85 86 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 87 struct wireless_dev *wdev; 88 89 if (wiphy_net(&rdev->wiphy) != netns) 90 continue; 91 92 if (have_wdev_id && rdev->wiphy_idx != wiphy_idx) 93 continue; 94 95 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 96 if (have_ifidx && wdev->netdev && 97 wdev->netdev->ifindex == ifidx) { 98 result = wdev; 99 break; 100 } 101 if (have_wdev_id && wdev->identifier == (u32)wdev_id) { 102 result = wdev; 103 break; 104 } 105 } 106 107 if (result) 108 break; 109 } 110 111 if (result) 112 return result; 113 return ERR_PTR(-ENODEV); 114 } 115 116 static struct cfg80211_registered_device * 117 __cfg80211_rdev_from_attrs(struct net *netns, struct nlattr **attrs) 118 { 119 struct cfg80211_registered_device *rdev = NULL, *tmp; 120 struct net_device *netdev; 121 122 ASSERT_RTNL(); 123 124 if (!attrs[NL80211_ATTR_WIPHY] && 125 !attrs[NL80211_ATTR_IFINDEX] && 126 !attrs[NL80211_ATTR_WDEV]) 127 return ERR_PTR(-EINVAL); 128 129 if (attrs[NL80211_ATTR_WIPHY]) 130 rdev = cfg80211_rdev_by_wiphy_idx( 131 nla_get_u32(attrs[NL80211_ATTR_WIPHY])); 132 133 if (attrs[NL80211_ATTR_WDEV]) { 134 u64 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]); 135 struct wireless_dev *wdev; 136 bool found = false; 137 138 tmp = cfg80211_rdev_by_wiphy_idx(wdev_id >> 32); 139 if (tmp) { 140 /* make sure wdev exists */ 141 list_for_each_entry(wdev, &tmp->wiphy.wdev_list, list) { 142 if (wdev->identifier != (u32)wdev_id) 143 continue; 144 found = true; 145 break; 146 } 147 148 if (!found) 149 tmp = NULL; 150 151 if (rdev && tmp != rdev) 152 return ERR_PTR(-EINVAL); 153 rdev = tmp; 154 } 155 } 156 157 if (attrs[NL80211_ATTR_IFINDEX]) { 158 int ifindex = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]); 159 160 netdev = __dev_get_by_index(netns, ifindex); 161 if (netdev) { 162 if (netdev->ieee80211_ptr) 163 tmp = wiphy_to_rdev( 164 netdev->ieee80211_ptr->wiphy); 165 else 166 tmp = NULL; 167 168 /* not wireless device -- return error */ 169 if (!tmp) 170 return ERR_PTR(-EINVAL); 171 172 /* mismatch -- return error */ 173 if (rdev && tmp != rdev) 174 return ERR_PTR(-EINVAL); 175 176 rdev = tmp; 177 } 178 } 179 180 if (!rdev) 181 return ERR_PTR(-ENODEV); 182 183 if (netns != wiphy_net(&rdev->wiphy)) 184 return ERR_PTR(-ENODEV); 185 186 return rdev; 187 } 188 189 /* 190 * This function returns a pointer to the driver 191 * that the genl_info item that is passed refers to. 192 * 193 * The result of this can be a PTR_ERR and hence must 194 * be checked with IS_ERR() for errors. 195 */ 196 static struct cfg80211_registered_device * 197 cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info) 198 { 199 return __cfg80211_rdev_from_attrs(netns, info->attrs); 200 } 201 202 /* policy for the attributes */ 203 static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { 204 [NL80211_ATTR_WIPHY] = { .type = NLA_U32 }, 205 [NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING, 206 .len = 20-1 }, 207 [NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED }, 208 209 [NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 }, 210 [NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 }, 211 [NL80211_ATTR_CHANNEL_WIDTH] = { .type = NLA_U32 }, 212 [NL80211_ATTR_CENTER_FREQ1] = { .type = NLA_U32 }, 213 [NL80211_ATTR_CENTER_FREQ2] = { .type = NLA_U32 }, 214 215 [NL80211_ATTR_WIPHY_RETRY_SHORT] = { .type = NLA_U8 }, 216 [NL80211_ATTR_WIPHY_RETRY_LONG] = { .type = NLA_U8 }, 217 [NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 }, 218 [NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 }, 219 [NL80211_ATTR_WIPHY_COVERAGE_CLASS] = { .type = NLA_U8 }, 220 [NL80211_ATTR_WIPHY_DYN_ACK] = { .type = NLA_FLAG }, 221 222 [NL80211_ATTR_IFTYPE] = { .type = NLA_U32 }, 223 [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 }, 224 [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 }, 225 226 [NL80211_ATTR_MAC] = { .len = ETH_ALEN }, 227 [NL80211_ATTR_PREV_BSSID] = { .len = ETH_ALEN }, 228 229 [NL80211_ATTR_KEY] = { .type = NLA_NESTED, }, 230 [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY, 231 .len = WLAN_MAX_KEY_LEN }, 232 [NL80211_ATTR_KEY_IDX] = { .type = NLA_U8 }, 233 [NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 }, 234 [NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG }, 235 [NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 }, 236 [NL80211_ATTR_KEY_TYPE] = { .type = NLA_U32 }, 237 238 [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 }, 239 [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 }, 240 [NL80211_ATTR_BEACON_HEAD] = { .type = NLA_BINARY, 241 .len = IEEE80211_MAX_DATA_LEN }, 242 [NL80211_ATTR_BEACON_TAIL] = { .type = NLA_BINARY, 243 .len = IEEE80211_MAX_DATA_LEN }, 244 [NL80211_ATTR_STA_AID] = { .type = NLA_U16 }, 245 [NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED }, 246 [NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 }, 247 [NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY, 248 .len = NL80211_MAX_SUPP_RATES }, 249 [NL80211_ATTR_STA_PLINK_ACTION] = { .type = NLA_U8 }, 250 [NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 }, 251 [NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ }, 252 [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY, 253 .len = IEEE80211_MAX_MESH_ID_LEN }, 254 [NL80211_ATTR_MPATH_NEXT_HOP] = { .type = NLA_U32 }, 255 256 [NL80211_ATTR_REG_ALPHA2] = { .type = NLA_STRING, .len = 2 }, 257 [NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED }, 258 259 [NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 }, 260 [NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 }, 261 [NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 }, 262 [NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY, 263 .len = NL80211_MAX_SUPP_RATES }, 264 [NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 }, 265 266 [NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED }, 267 [NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG }, 268 269 [NL80211_ATTR_HT_CAPABILITY] = { .len = NL80211_HT_CAPABILITY_LEN }, 270 271 [NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 }, 272 [NL80211_ATTR_IE] = { .type = NLA_BINARY, 273 .len = IEEE80211_MAX_DATA_LEN }, 274 [NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED }, 275 [NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED }, 276 277 [NL80211_ATTR_SSID] = { .type = NLA_BINARY, 278 .len = IEEE80211_MAX_SSID_LEN }, 279 [NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 }, 280 [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 }, 281 [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG }, 282 [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG }, 283 [NL80211_ATTR_USE_MFP] = { .type = NLA_U32 }, 284 [NL80211_ATTR_STA_FLAGS2] = { 285 .len = sizeof(struct nl80211_sta_flag_update), 286 }, 287 [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG }, 288 [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 }, 289 [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG }, 290 [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG }, 291 [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 }, 292 [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 }, 293 [NL80211_ATTR_PID] = { .type = NLA_U32 }, 294 [NL80211_ATTR_4ADDR] = { .type = NLA_U8 }, 295 [NL80211_ATTR_PMKID] = { .len = WLAN_PMKID_LEN }, 296 [NL80211_ATTR_DURATION] = { .type = NLA_U32 }, 297 [NL80211_ATTR_COOKIE] = { .type = NLA_U64 }, 298 [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED }, 299 [NL80211_ATTR_FRAME] = { .type = NLA_BINARY, 300 .len = IEEE80211_MAX_DATA_LEN }, 301 [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, }, 302 [NL80211_ATTR_PS_STATE] = { .type = NLA_U32 }, 303 [NL80211_ATTR_CQM] = { .type = NLA_NESTED, }, 304 [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG }, 305 [NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 }, 306 [NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 }, 307 [NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 }, 308 [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 }, 309 [NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 }, 310 [NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 }, 311 [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 }, 312 [NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG }, 313 [NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED }, 314 [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED }, 315 [NL80211_ATTR_STA_PLINK_STATE] = { .type = NLA_U8 }, 316 [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 }, 317 [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED }, 318 [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED }, 319 [NL80211_ATTR_HIDDEN_SSID] = { .type = NLA_U32 }, 320 [NL80211_ATTR_IE_PROBE_RESP] = { .type = NLA_BINARY, 321 .len = IEEE80211_MAX_DATA_LEN }, 322 [NL80211_ATTR_IE_ASSOC_RESP] = { .type = NLA_BINARY, 323 .len = IEEE80211_MAX_DATA_LEN }, 324 [NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG }, 325 [NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED }, 326 [NL80211_ATTR_TX_NO_CCK_RATE] = { .type = NLA_FLAG }, 327 [NL80211_ATTR_TDLS_ACTION] = { .type = NLA_U8 }, 328 [NL80211_ATTR_TDLS_DIALOG_TOKEN] = { .type = NLA_U8 }, 329 [NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 }, 330 [NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG }, 331 [NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG }, 332 [NL80211_ATTR_TDLS_INITIATOR] = { .type = NLA_FLAG }, 333 [NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG }, 334 [NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY, 335 .len = IEEE80211_MAX_DATA_LEN }, 336 [NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 }, 337 [NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG }, 338 [NL80211_ATTR_HT_CAPABILITY_MASK] = { 339 .len = NL80211_HT_CAPABILITY_LEN 340 }, 341 [NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 }, 342 [NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 }, 343 [NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 }, 344 [NL80211_ATTR_WDEV] = { .type = NLA_U64 }, 345 [NL80211_ATTR_USER_REG_HINT_TYPE] = { .type = NLA_U32 }, 346 [NL80211_ATTR_AUTH_DATA] = { .type = NLA_BINARY, }, 347 [NL80211_ATTR_VHT_CAPABILITY] = { .len = NL80211_VHT_CAPABILITY_LEN }, 348 [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 }, 349 [NL80211_ATTR_P2P_CTWINDOW] = { .type = NLA_U8 }, 350 [NL80211_ATTR_P2P_OPPPS] = { .type = NLA_U8 }, 351 [NL80211_ATTR_LOCAL_MESH_POWER_MODE] = {. type = NLA_U32 }, 352 [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 }, 353 [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED }, 354 [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 }, 355 [NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, }, 356 [NL80211_ATTR_SPLIT_WIPHY_DUMP] = { .type = NLA_FLAG, }, 357 [NL80211_ATTR_DISABLE_VHT] = { .type = NLA_FLAG }, 358 [NL80211_ATTR_VHT_CAPABILITY_MASK] = { 359 .len = NL80211_VHT_CAPABILITY_LEN, 360 }, 361 [NL80211_ATTR_MDID] = { .type = NLA_U16 }, 362 [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY, 363 .len = IEEE80211_MAX_DATA_LEN }, 364 [NL80211_ATTR_PEER_AID] = { .type = NLA_U16 }, 365 [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 }, 366 [NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG }, 367 [NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED }, 368 [NL80211_ATTR_CSA_C_OFF_BEACON] = { .type = NLA_BINARY }, 369 [NL80211_ATTR_CSA_C_OFF_PRESP] = { .type = NLA_BINARY }, 370 [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = { .type = NLA_BINARY }, 371 [NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = { .type = NLA_BINARY }, 372 [NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG }, 373 [NL80211_ATTR_OPMODE_NOTIF] = { .type = NLA_U8 }, 374 [NL80211_ATTR_VENDOR_ID] = { .type = NLA_U32 }, 375 [NL80211_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 }, 376 [NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY }, 377 [NL80211_ATTR_QOS_MAP] = { .type = NLA_BINARY, 378 .len = IEEE80211_QOS_MAP_LEN_MAX }, 379 [NL80211_ATTR_MAC_HINT] = { .len = ETH_ALEN }, 380 [NL80211_ATTR_WIPHY_FREQ_HINT] = { .type = NLA_U32 }, 381 [NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 }, 382 [NL80211_ATTR_SOCKET_OWNER] = { .type = NLA_FLAG }, 383 [NL80211_ATTR_CSA_C_OFFSETS_TX] = { .type = NLA_BINARY }, 384 [NL80211_ATTR_USE_RRM] = { .type = NLA_FLAG }, 385 [NL80211_ATTR_TSID] = { .type = NLA_U8 }, 386 [NL80211_ATTR_USER_PRIO] = { .type = NLA_U8 }, 387 [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 }, 388 [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 }, 389 [NL80211_ATTR_MAC_MASK] = { .len = ETH_ALEN }, 390 [NL80211_ATTR_WIPHY_SELF_MANAGED_REG] = { .type = NLA_FLAG }, 391 [NL80211_ATTR_NETNS_FD] = { .type = NLA_U32 }, 392 [NL80211_ATTR_SCHED_SCAN_DELAY] = { .type = NLA_U32 }, 393 [NL80211_ATTR_REG_INDOOR] = { .type = NLA_FLAG }, 394 [NL80211_ATTR_PBSS] = { .type = NLA_FLAG }, 395 [NL80211_ATTR_BSS_SELECT] = { .type = NLA_NESTED }, 396 [NL80211_ATTR_STA_SUPPORT_P2P_PS] = { .type = NLA_U8 }, 397 [NL80211_ATTR_MU_MIMO_GROUP_DATA] = { 398 .len = VHT_MUMIMO_GROUPS_DATA_LEN 399 }, 400 [NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR] = { .len = ETH_ALEN }, 401 [NL80211_ATTR_NAN_MASTER_PREF] = { .type = NLA_U8 }, 402 [NL80211_ATTR_BANDS] = { .type = NLA_U32 }, 403 [NL80211_ATTR_NAN_FUNC] = { .type = NLA_NESTED }, 404 [NL80211_ATTR_FILS_KEK] = { .type = NLA_BINARY, 405 .len = FILS_MAX_KEK_LEN }, 406 [NL80211_ATTR_FILS_NONCES] = { .len = 2 * FILS_NONCE_LEN }, 407 [NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED] = { .type = NLA_FLAG, }, 408 [NL80211_ATTR_BSSID] = { .len = ETH_ALEN }, 409 [NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] = { .type = NLA_S8 }, 410 [NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST] = { 411 .len = sizeof(struct nl80211_bss_select_rssi_adjust) 412 }, 413 [NL80211_ATTR_TIMEOUT_REASON] = { .type = NLA_U32 }, 414 [NL80211_ATTR_FILS_ERP_USERNAME] = { .type = NLA_BINARY, 415 .len = FILS_ERP_MAX_USERNAME_LEN }, 416 [NL80211_ATTR_FILS_ERP_REALM] = { .type = NLA_BINARY, 417 .len = FILS_ERP_MAX_REALM_LEN }, 418 [NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] = { .type = NLA_U16 }, 419 [NL80211_ATTR_FILS_ERP_RRK] = { .type = NLA_BINARY, 420 .len = FILS_ERP_MAX_RRK_LEN }, 421 [NL80211_ATTR_FILS_CACHE_ID] = { .len = 2 }, 422 [NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN }, 423 [NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG }, 424 [NL80211_ATTR_EXTERNAL_AUTH_SUPPORT] = { .type = NLA_FLAG }, 425 }; 426 427 /* policy for the key attributes */ 428 static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = { 429 [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN }, 430 [NL80211_KEY_IDX] = { .type = NLA_U8 }, 431 [NL80211_KEY_CIPHER] = { .type = NLA_U32 }, 432 [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 }, 433 [NL80211_KEY_DEFAULT] = { .type = NLA_FLAG }, 434 [NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG }, 435 [NL80211_KEY_TYPE] = { .type = NLA_U32 }, 436 [NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED }, 437 }; 438 439 /* policy for the key default flags */ 440 static const struct nla_policy 441 nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = { 442 [NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG }, 443 [NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG }, 444 }; 445 446 #ifdef CONFIG_PM 447 /* policy for WoWLAN attributes */ 448 static const struct nla_policy 449 nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = { 450 [NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG }, 451 [NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG }, 452 [NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG }, 453 [NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED }, 454 [NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE] = { .type = NLA_FLAG }, 455 [NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST] = { .type = NLA_FLAG }, 456 [NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE] = { .type = NLA_FLAG }, 457 [NL80211_WOWLAN_TRIG_RFKILL_RELEASE] = { .type = NLA_FLAG }, 458 [NL80211_WOWLAN_TRIG_TCP_CONNECTION] = { .type = NLA_NESTED }, 459 [NL80211_WOWLAN_TRIG_NET_DETECT] = { .type = NLA_NESTED }, 460 }; 461 462 static const struct nla_policy 463 nl80211_wowlan_tcp_policy[NUM_NL80211_WOWLAN_TCP] = { 464 [NL80211_WOWLAN_TCP_SRC_IPV4] = { .type = NLA_U32 }, 465 [NL80211_WOWLAN_TCP_DST_IPV4] = { .type = NLA_U32 }, 466 [NL80211_WOWLAN_TCP_DST_MAC] = { .len = ETH_ALEN }, 467 [NL80211_WOWLAN_TCP_SRC_PORT] = { .type = NLA_U16 }, 468 [NL80211_WOWLAN_TCP_DST_PORT] = { .type = NLA_U16 }, 469 [NL80211_WOWLAN_TCP_DATA_PAYLOAD] = { .len = 1 }, 470 [NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ] = { 471 .len = sizeof(struct nl80211_wowlan_tcp_data_seq) 472 }, 473 [NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN] = { 474 .len = sizeof(struct nl80211_wowlan_tcp_data_token) 475 }, 476 [NL80211_WOWLAN_TCP_DATA_INTERVAL] = { .type = NLA_U32 }, 477 [NL80211_WOWLAN_TCP_WAKE_PAYLOAD] = { .len = 1 }, 478 [NL80211_WOWLAN_TCP_WAKE_MASK] = { .len = 1 }, 479 }; 480 #endif /* CONFIG_PM */ 481 482 /* policy for coalesce rule attributes */ 483 static const struct nla_policy 484 nl80211_coalesce_policy[NUM_NL80211_ATTR_COALESCE_RULE] = { 485 [NL80211_ATTR_COALESCE_RULE_DELAY] = { .type = NLA_U32 }, 486 [NL80211_ATTR_COALESCE_RULE_CONDITION] = { .type = NLA_U32 }, 487 [NL80211_ATTR_COALESCE_RULE_PKT_PATTERN] = { .type = NLA_NESTED }, 488 }; 489 490 /* policy for GTK rekey offload attributes */ 491 static const struct nla_policy 492 nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = { 493 [NL80211_REKEY_DATA_KEK] = { .len = NL80211_KEK_LEN }, 494 [NL80211_REKEY_DATA_KCK] = { .len = NL80211_KCK_LEN }, 495 [NL80211_REKEY_DATA_REPLAY_CTR] = { .len = NL80211_REPLAY_CTR_LEN }, 496 }; 497 498 static const struct nla_policy 499 nl80211_match_policy[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1] = { 500 [NL80211_SCHED_SCAN_MATCH_ATTR_SSID] = { .type = NLA_BINARY, 501 .len = IEEE80211_MAX_SSID_LEN }, 502 [NL80211_SCHED_SCAN_MATCH_ATTR_BSSID] = { .len = ETH_ALEN }, 503 [NL80211_SCHED_SCAN_MATCH_ATTR_RSSI] = { .type = NLA_U32 }, 504 }; 505 506 static const struct nla_policy 507 nl80211_plan_policy[NL80211_SCHED_SCAN_PLAN_MAX + 1] = { 508 [NL80211_SCHED_SCAN_PLAN_INTERVAL] = { .type = NLA_U32 }, 509 [NL80211_SCHED_SCAN_PLAN_ITERATIONS] = { .type = NLA_U32 }, 510 }; 511 512 static const struct nla_policy 513 nl80211_bss_select_policy[NL80211_BSS_SELECT_ATTR_MAX + 1] = { 514 [NL80211_BSS_SELECT_ATTR_RSSI] = { .type = NLA_FLAG }, 515 [NL80211_BSS_SELECT_ATTR_BAND_PREF] = { .type = NLA_U32 }, 516 [NL80211_BSS_SELECT_ATTR_RSSI_ADJUST] = { 517 .len = sizeof(struct nl80211_bss_select_rssi_adjust) 518 }, 519 }; 520 521 /* policy for NAN function attributes */ 522 static const struct nla_policy 523 nl80211_nan_func_policy[NL80211_NAN_FUNC_ATTR_MAX + 1] = { 524 [NL80211_NAN_FUNC_TYPE] = { .type = NLA_U8 }, 525 [NL80211_NAN_FUNC_SERVICE_ID] = { 526 .len = NL80211_NAN_FUNC_SERVICE_ID_LEN }, 527 [NL80211_NAN_FUNC_PUBLISH_TYPE] = { .type = NLA_U8 }, 528 [NL80211_NAN_FUNC_PUBLISH_BCAST] = { .type = NLA_FLAG }, 529 [NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE] = { .type = NLA_FLAG }, 530 [NL80211_NAN_FUNC_FOLLOW_UP_ID] = { .type = NLA_U8 }, 531 [NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] = { .type = NLA_U8 }, 532 [NL80211_NAN_FUNC_FOLLOW_UP_DEST] = { .len = ETH_ALEN }, 533 [NL80211_NAN_FUNC_CLOSE_RANGE] = { .type = NLA_FLAG }, 534 [NL80211_NAN_FUNC_TTL] = { .type = NLA_U32 }, 535 [NL80211_NAN_FUNC_SERVICE_INFO] = { .type = NLA_BINARY, 536 .len = NL80211_NAN_FUNC_SERVICE_SPEC_INFO_MAX_LEN }, 537 [NL80211_NAN_FUNC_SRF] = { .type = NLA_NESTED }, 538 [NL80211_NAN_FUNC_RX_MATCH_FILTER] = { .type = NLA_NESTED }, 539 [NL80211_NAN_FUNC_TX_MATCH_FILTER] = { .type = NLA_NESTED }, 540 [NL80211_NAN_FUNC_INSTANCE_ID] = { .type = NLA_U8 }, 541 [NL80211_NAN_FUNC_TERM_REASON] = { .type = NLA_U8 }, 542 }; 543 544 /* policy for Service Response Filter attributes */ 545 static const struct nla_policy 546 nl80211_nan_srf_policy[NL80211_NAN_SRF_ATTR_MAX + 1] = { 547 [NL80211_NAN_SRF_INCLUDE] = { .type = NLA_FLAG }, 548 [NL80211_NAN_SRF_BF] = { .type = NLA_BINARY, 549 .len = NL80211_NAN_FUNC_SRF_MAX_LEN }, 550 [NL80211_NAN_SRF_BF_IDX] = { .type = NLA_U8 }, 551 [NL80211_NAN_SRF_MAC_ADDRS] = { .type = NLA_NESTED }, 552 }; 553 554 /* policy for packet pattern attributes */ 555 static const struct nla_policy 556 nl80211_packet_pattern_policy[MAX_NL80211_PKTPAT + 1] = { 557 [NL80211_PKTPAT_MASK] = { .type = NLA_BINARY, }, 558 [NL80211_PKTPAT_PATTERN] = { .type = NLA_BINARY, }, 559 [NL80211_PKTPAT_OFFSET] = { .type = NLA_U32 }, 560 }; 561 562 static int nl80211_prepare_wdev_dump(struct sk_buff *skb, 563 struct netlink_callback *cb, 564 struct cfg80211_registered_device **rdev, 565 struct wireless_dev **wdev) 566 { 567 int err; 568 569 if (!cb->args[0]) { 570 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, 571 genl_family_attrbuf(&nl80211_fam), 572 nl80211_fam.maxattr, nl80211_policy, NULL); 573 if (err) 574 return err; 575 576 *wdev = __cfg80211_wdev_from_attrs( 577 sock_net(skb->sk), 578 genl_family_attrbuf(&nl80211_fam)); 579 if (IS_ERR(*wdev)) 580 return PTR_ERR(*wdev); 581 *rdev = wiphy_to_rdev((*wdev)->wiphy); 582 /* 0 is the first index - add 1 to parse only once */ 583 cb->args[0] = (*rdev)->wiphy_idx + 1; 584 cb->args[1] = (*wdev)->identifier; 585 } else { 586 /* subtract the 1 again here */ 587 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); 588 struct wireless_dev *tmp; 589 590 if (!wiphy) 591 return -ENODEV; 592 *rdev = wiphy_to_rdev(wiphy); 593 *wdev = NULL; 594 595 list_for_each_entry(tmp, &(*rdev)->wiphy.wdev_list, list) { 596 if (tmp->identifier == cb->args[1]) { 597 *wdev = tmp; 598 break; 599 } 600 } 601 602 if (!*wdev) 603 return -ENODEV; 604 } 605 606 return 0; 607 } 608 609 /* IE validation */ 610 static bool is_valid_ie_attr(const struct nlattr *attr) 611 { 612 const u8 *pos; 613 int len; 614 615 if (!attr) 616 return true; 617 618 pos = nla_data(attr); 619 len = nla_len(attr); 620 621 while (len) { 622 u8 elemlen; 623 624 if (len < 2) 625 return false; 626 len -= 2; 627 628 elemlen = pos[1]; 629 if (elemlen > len) 630 return false; 631 632 len -= elemlen; 633 pos += 2 + elemlen; 634 } 635 636 return true; 637 } 638 639 /* message building helper */ 640 static inline void *nl80211hdr_put(struct sk_buff *skb, u32 portid, u32 seq, 641 int flags, u8 cmd) 642 { 643 /* since there is no private header just add the generic one */ 644 return genlmsg_put(skb, portid, seq, &nl80211_fam, flags, cmd); 645 } 646 647 static int nl80211_msg_put_channel(struct sk_buff *msg, 648 struct ieee80211_channel *chan, 649 bool large) 650 { 651 /* Some channels must be completely excluded from the 652 * list to protect old user-space tools from breaking 653 */ 654 if (!large && chan->flags & 655 (IEEE80211_CHAN_NO_10MHZ | IEEE80211_CHAN_NO_20MHZ)) 656 return 0; 657 658 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ, 659 chan->center_freq)) 660 goto nla_put_failure; 661 662 if ((chan->flags & IEEE80211_CHAN_DISABLED) && 663 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DISABLED)) 664 goto nla_put_failure; 665 if (chan->flags & IEEE80211_CHAN_NO_IR) { 666 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IR)) 667 goto nla_put_failure; 668 if (nla_put_flag(msg, __NL80211_FREQUENCY_ATTR_NO_IBSS)) 669 goto nla_put_failure; 670 } 671 if (chan->flags & IEEE80211_CHAN_RADAR) { 672 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR)) 673 goto nla_put_failure; 674 if (large) { 675 u32 time; 676 677 time = elapsed_jiffies_msecs(chan->dfs_state_entered); 678 679 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE, 680 chan->dfs_state)) 681 goto nla_put_failure; 682 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME, 683 time)) 684 goto nla_put_failure; 685 if (nla_put_u32(msg, 686 NL80211_FREQUENCY_ATTR_DFS_CAC_TIME, 687 chan->dfs_cac_ms)) 688 goto nla_put_failure; 689 } 690 } 691 692 if (large) { 693 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) && 694 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS)) 695 goto nla_put_failure; 696 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) && 697 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS)) 698 goto nla_put_failure; 699 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) && 700 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ)) 701 goto nla_put_failure; 702 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) && 703 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ)) 704 goto nla_put_failure; 705 if ((chan->flags & IEEE80211_CHAN_INDOOR_ONLY) && 706 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_INDOOR_ONLY)) 707 goto nla_put_failure; 708 if ((chan->flags & IEEE80211_CHAN_IR_CONCURRENT) && 709 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_IR_CONCURRENT)) 710 goto nla_put_failure; 711 if ((chan->flags & IEEE80211_CHAN_NO_20MHZ) && 712 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_20MHZ)) 713 goto nla_put_failure; 714 if ((chan->flags & IEEE80211_CHAN_NO_10MHZ) && 715 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_10MHZ)) 716 goto nla_put_failure; 717 } 718 719 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER, 720 DBM_TO_MBM(chan->max_power))) 721 goto nla_put_failure; 722 723 return 0; 724 725 nla_put_failure: 726 return -ENOBUFS; 727 } 728 729 /* netlink command implementations */ 730 731 struct key_parse { 732 struct key_params p; 733 int idx; 734 int type; 735 bool def, defmgmt; 736 bool def_uni, def_multi; 737 }; 738 739 static int nl80211_parse_key_new(struct genl_info *info, struct nlattr *key, 740 struct key_parse *k) 741 { 742 struct nlattr *tb[NL80211_KEY_MAX + 1]; 743 int err = nla_parse_nested(tb, NL80211_KEY_MAX, key, 744 nl80211_key_policy, info->extack); 745 if (err) 746 return err; 747 748 k->def = !!tb[NL80211_KEY_DEFAULT]; 749 k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT]; 750 751 if (k->def) { 752 k->def_uni = true; 753 k->def_multi = true; 754 } 755 if (k->defmgmt) 756 k->def_multi = true; 757 758 if (tb[NL80211_KEY_IDX]) 759 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]); 760 761 if (tb[NL80211_KEY_DATA]) { 762 k->p.key = nla_data(tb[NL80211_KEY_DATA]); 763 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]); 764 } 765 766 if (tb[NL80211_KEY_SEQ]) { 767 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]); 768 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]); 769 } 770 771 if (tb[NL80211_KEY_CIPHER]) 772 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]); 773 774 if (tb[NL80211_KEY_TYPE]) { 775 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]); 776 if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES) 777 return genl_err_attr(info, -EINVAL, 778 tb[NL80211_KEY_TYPE]); 779 } 780 781 if (tb[NL80211_KEY_DEFAULT_TYPES]) { 782 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES]; 783 784 err = nla_parse_nested(kdt, NUM_NL80211_KEY_DEFAULT_TYPES - 1, 785 tb[NL80211_KEY_DEFAULT_TYPES], 786 nl80211_key_default_policy, 787 info->extack); 788 if (err) 789 return err; 790 791 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; 792 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; 793 } 794 795 return 0; 796 } 797 798 static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k) 799 { 800 if (info->attrs[NL80211_ATTR_KEY_DATA]) { 801 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]); 802 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]); 803 } 804 805 if (info->attrs[NL80211_ATTR_KEY_SEQ]) { 806 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]); 807 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]); 808 } 809 810 if (info->attrs[NL80211_ATTR_KEY_IDX]) 811 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); 812 813 if (info->attrs[NL80211_ATTR_KEY_CIPHER]) 814 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]); 815 816 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT]; 817 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT]; 818 819 if (k->def) { 820 k->def_uni = true; 821 k->def_multi = true; 822 } 823 if (k->defmgmt) 824 k->def_multi = true; 825 826 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { 827 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); 828 if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES) { 829 GENL_SET_ERR_MSG(info, "key type out of range"); 830 return -EINVAL; 831 } 832 } 833 834 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) { 835 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES]; 836 int err = nla_parse_nested(kdt, 837 NUM_NL80211_KEY_DEFAULT_TYPES - 1, 838 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES], 839 nl80211_key_default_policy, 840 info->extack); 841 if (err) 842 return err; 843 844 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; 845 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; 846 } 847 848 return 0; 849 } 850 851 static int nl80211_parse_key(struct genl_info *info, struct key_parse *k) 852 { 853 int err; 854 855 memset(k, 0, sizeof(*k)); 856 k->idx = -1; 857 k->type = -1; 858 859 if (info->attrs[NL80211_ATTR_KEY]) 860 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k); 861 else 862 err = nl80211_parse_key_old(info, k); 863 864 if (err) 865 return err; 866 867 if (k->def && k->defmgmt) { 868 GENL_SET_ERR_MSG(info, "key with def && defmgmt is invalid"); 869 return -EINVAL; 870 } 871 872 if (k->defmgmt) { 873 if (k->def_uni || !k->def_multi) { 874 GENL_SET_ERR_MSG(info, "defmgmt key must be mcast"); 875 return -EINVAL; 876 } 877 } 878 879 if (k->idx != -1) { 880 if (k->defmgmt) { 881 if (k->idx < 4 || k->idx > 5) { 882 GENL_SET_ERR_MSG(info, 883 "defmgmt key idx not 4 or 5"); 884 return -EINVAL; 885 } 886 } else if (k->def) { 887 if (k->idx < 0 || k->idx > 3) { 888 GENL_SET_ERR_MSG(info, "def key idx not 0-3"); 889 return -EINVAL; 890 } 891 } else { 892 if (k->idx < 0 || k->idx > 5) { 893 GENL_SET_ERR_MSG(info, "key idx not 0-5"); 894 return -EINVAL; 895 } 896 } 897 } 898 899 return 0; 900 } 901 902 static struct cfg80211_cached_keys * 903 nl80211_parse_connkeys(struct cfg80211_registered_device *rdev, 904 struct genl_info *info, bool *no_ht) 905 { 906 struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS]; 907 struct key_parse parse; 908 struct nlattr *key; 909 struct cfg80211_cached_keys *result; 910 int rem, err, def = 0; 911 bool have_key = false; 912 913 nla_for_each_nested(key, keys, rem) { 914 have_key = true; 915 break; 916 } 917 918 if (!have_key) 919 return NULL; 920 921 result = kzalloc(sizeof(*result), GFP_KERNEL); 922 if (!result) 923 return ERR_PTR(-ENOMEM); 924 925 result->def = -1; 926 927 nla_for_each_nested(key, keys, rem) { 928 memset(&parse, 0, sizeof(parse)); 929 parse.idx = -1; 930 931 err = nl80211_parse_key_new(info, key, &parse); 932 if (err) 933 goto error; 934 err = -EINVAL; 935 if (!parse.p.key) 936 goto error; 937 if (parse.idx < 0 || parse.idx > 3) { 938 GENL_SET_ERR_MSG(info, "key index out of range [0-3]"); 939 goto error; 940 } 941 if (parse.def) { 942 if (def) { 943 GENL_SET_ERR_MSG(info, 944 "only one key can be default"); 945 goto error; 946 } 947 def = 1; 948 result->def = parse.idx; 949 if (!parse.def_uni || !parse.def_multi) 950 goto error; 951 } else if (parse.defmgmt) 952 goto error; 953 err = cfg80211_validate_key_settings(rdev, &parse.p, 954 parse.idx, false, NULL); 955 if (err) 956 goto error; 957 if (parse.p.cipher != WLAN_CIPHER_SUITE_WEP40 && 958 parse.p.cipher != WLAN_CIPHER_SUITE_WEP104) { 959 GENL_SET_ERR_MSG(info, "connect key must be WEP"); 960 err = -EINVAL; 961 goto error; 962 } 963 result->params[parse.idx].cipher = parse.p.cipher; 964 result->params[parse.idx].key_len = parse.p.key_len; 965 result->params[parse.idx].key = result->data[parse.idx]; 966 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len); 967 968 /* must be WEP key if we got here */ 969 if (no_ht) 970 *no_ht = true; 971 } 972 973 if (result->def < 0) { 974 err = -EINVAL; 975 GENL_SET_ERR_MSG(info, "need a default/TX key"); 976 goto error; 977 } 978 979 return result; 980 error: 981 kfree(result); 982 return ERR_PTR(err); 983 } 984 985 static int nl80211_key_allowed(struct wireless_dev *wdev) 986 { 987 ASSERT_WDEV_LOCK(wdev); 988 989 switch (wdev->iftype) { 990 case NL80211_IFTYPE_AP: 991 case NL80211_IFTYPE_AP_VLAN: 992 case NL80211_IFTYPE_P2P_GO: 993 case NL80211_IFTYPE_MESH_POINT: 994 break; 995 case NL80211_IFTYPE_ADHOC: 996 case NL80211_IFTYPE_STATION: 997 case NL80211_IFTYPE_P2P_CLIENT: 998 if (!wdev->current_bss) 999 return -ENOLINK; 1000 break; 1001 case NL80211_IFTYPE_UNSPECIFIED: 1002 case NL80211_IFTYPE_OCB: 1003 case NL80211_IFTYPE_MONITOR: 1004 case NL80211_IFTYPE_NAN: 1005 case NL80211_IFTYPE_P2P_DEVICE: 1006 case NL80211_IFTYPE_WDS: 1007 case NUM_NL80211_IFTYPES: 1008 return -EINVAL; 1009 } 1010 1011 return 0; 1012 } 1013 1014 static struct ieee80211_channel *nl80211_get_valid_chan(struct wiphy *wiphy, 1015 struct nlattr *tb) 1016 { 1017 struct ieee80211_channel *chan; 1018 1019 if (tb == NULL) 1020 return NULL; 1021 chan = ieee80211_get_channel(wiphy, nla_get_u32(tb)); 1022 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) 1023 return NULL; 1024 return chan; 1025 } 1026 1027 static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes) 1028 { 1029 struct nlattr *nl_modes = nla_nest_start(msg, attr); 1030 int i; 1031 1032 if (!nl_modes) 1033 goto nla_put_failure; 1034 1035 i = 0; 1036 while (ifmodes) { 1037 if ((ifmodes & 1) && nla_put_flag(msg, i)) 1038 goto nla_put_failure; 1039 ifmodes >>= 1; 1040 i++; 1041 } 1042 1043 nla_nest_end(msg, nl_modes); 1044 return 0; 1045 1046 nla_put_failure: 1047 return -ENOBUFS; 1048 } 1049 1050 static int nl80211_put_iface_combinations(struct wiphy *wiphy, 1051 struct sk_buff *msg, 1052 bool large) 1053 { 1054 struct nlattr *nl_combis; 1055 int i, j; 1056 1057 nl_combis = nla_nest_start(msg, 1058 NL80211_ATTR_INTERFACE_COMBINATIONS); 1059 if (!nl_combis) 1060 goto nla_put_failure; 1061 1062 for (i = 0; i < wiphy->n_iface_combinations; i++) { 1063 const struct ieee80211_iface_combination *c; 1064 struct nlattr *nl_combi, *nl_limits; 1065 1066 c = &wiphy->iface_combinations[i]; 1067 1068 nl_combi = nla_nest_start(msg, i + 1); 1069 if (!nl_combi) 1070 goto nla_put_failure; 1071 1072 nl_limits = nla_nest_start(msg, NL80211_IFACE_COMB_LIMITS); 1073 if (!nl_limits) 1074 goto nla_put_failure; 1075 1076 for (j = 0; j < c->n_limits; j++) { 1077 struct nlattr *nl_limit; 1078 1079 nl_limit = nla_nest_start(msg, j + 1); 1080 if (!nl_limit) 1081 goto nla_put_failure; 1082 if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX, 1083 c->limits[j].max)) 1084 goto nla_put_failure; 1085 if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES, 1086 c->limits[j].types)) 1087 goto nla_put_failure; 1088 nla_nest_end(msg, nl_limit); 1089 } 1090 1091 nla_nest_end(msg, nl_limits); 1092 1093 if (c->beacon_int_infra_match && 1094 nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH)) 1095 goto nla_put_failure; 1096 if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS, 1097 c->num_different_channels) || 1098 nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM, 1099 c->max_interfaces)) 1100 goto nla_put_failure; 1101 if (large && 1102 (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS, 1103 c->radar_detect_widths) || 1104 nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS, 1105 c->radar_detect_regions))) 1106 goto nla_put_failure; 1107 if (c->beacon_int_min_gcd && 1108 nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD, 1109 c->beacon_int_min_gcd)) 1110 goto nla_put_failure; 1111 1112 nla_nest_end(msg, nl_combi); 1113 } 1114 1115 nla_nest_end(msg, nl_combis); 1116 1117 return 0; 1118 nla_put_failure: 1119 return -ENOBUFS; 1120 } 1121 1122 #ifdef CONFIG_PM 1123 static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev, 1124 struct sk_buff *msg) 1125 { 1126 const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp; 1127 struct nlattr *nl_tcp; 1128 1129 if (!tcp) 1130 return 0; 1131 1132 nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION); 1133 if (!nl_tcp) 1134 return -ENOBUFS; 1135 1136 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 1137 tcp->data_payload_max)) 1138 return -ENOBUFS; 1139 1140 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 1141 tcp->data_payload_max)) 1142 return -ENOBUFS; 1143 1144 if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ)) 1145 return -ENOBUFS; 1146 1147 if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 1148 sizeof(*tcp->tok), tcp->tok)) 1149 return -ENOBUFS; 1150 1151 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 1152 tcp->data_interval_max)) 1153 return -ENOBUFS; 1154 1155 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 1156 tcp->wake_payload_max)) 1157 return -ENOBUFS; 1158 1159 nla_nest_end(msg, nl_tcp); 1160 return 0; 1161 } 1162 1163 static int nl80211_send_wowlan(struct sk_buff *msg, 1164 struct cfg80211_registered_device *rdev, 1165 bool large) 1166 { 1167 struct nlattr *nl_wowlan; 1168 1169 if (!rdev->wiphy.wowlan) 1170 return 0; 1171 1172 nl_wowlan = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED); 1173 if (!nl_wowlan) 1174 return -ENOBUFS; 1175 1176 if (((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) && 1177 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 1178 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) && 1179 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 1180 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) && 1181 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 1182 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) && 1183 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED)) || 1184 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && 1185 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 1186 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) && 1187 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 1188 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) && 1189 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 1190 ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) && 1191 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 1192 return -ENOBUFS; 1193 1194 if (rdev->wiphy.wowlan->n_patterns) { 1195 struct nl80211_pattern_support pat = { 1196 .max_patterns = rdev->wiphy.wowlan->n_patterns, 1197 .min_pattern_len = rdev->wiphy.wowlan->pattern_min_len, 1198 .max_pattern_len = rdev->wiphy.wowlan->pattern_max_len, 1199 .max_pkt_offset = rdev->wiphy.wowlan->max_pkt_offset, 1200 }; 1201 1202 if (nla_put(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN, 1203 sizeof(pat), &pat)) 1204 return -ENOBUFS; 1205 } 1206 1207 if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) && 1208 nla_put_u32(msg, NL80211_WOWLAN_TRIG_NET_DETECT, 1209 rdev->wiphy.wowlan->max_nd_match_sets)) 1210 return -ENOBUFS; 1211 1212 if (large && nl80211_send_wowlan_tcp_caps(rdev, msg)) 1213 return -ENOBUFS; 1214 1215 nla_nest_end(msg, nl_wowlan); 1216 1217 return 0; 1218 } 1219 #endif 1220 1221 static int nl80211_send_coalesce(struct sk_buff *msg, 1222 struct cfg80211_registered_device *rdev) 1223 { 1224 struct nl80211_coalesce_rule_support rule; 1225 1226 if (!rdev->wiphy.coalesce) 1227 return 0; 1228 1229 rule.max_rules = rdev->wiphy.coalesce->n_rules; 1230 rule.max_delay = rdev->wiphy.coalesce->max_delay; 1231 rule.pat.max_patterns = rdev->wiphy.coalesce->n_patterns; 1232 rule.pat.min_pattern_len = rdev->wiphy.coalesce->pattern_min_len; 1233 rule.pat.max_pattern_len = rdev->wiphy.coalesce->pattern_max_len; 1234 rule.pat.max_pkt_offset = rdev->wiphy.coalesce->max_pkt_offset; 1235 1236 if (nla_put(msg, NL80211_ATTR_COALESCE_RULE, sizeof(rule), &rule)) 1237 return -ENOBUFS; 1238 1239 return 0; 1240 } 1241 1242 static int nl80211_send_band_rateinfo(struct sk_buff *msg, 1243 struct ieee80211_supported_band *sband) 1244 { 1245 struct nlattr *nl_rates, *nl_rate; 1246 struct ieee80211_rate *rate; 1247 int i; 1248 1249 /* add HT info */ 1250 if (sband->ht_cap.ht_supported && 1251 (nla_put(msg, NL80211_BAND_ATTR_HT_MCS_SET, 1252 sizeof(sband->ht_cap.mcs), 1253 &sband->ht_cap.mcs) || 1254 nla_put_u16(msg, NL80211_BAND_ATTR_HT_CAPA, 1255 sband->ht_cap.cap) || 1256 nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR, 1257 sband->ht_cap.ampdu_factor) || 1258 nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY, 1259 sband->ht_cap.ampdu_density))) 1260 return -ENOBUFS; 1261 1262 /* add VHT info */ 1263 if (sband->vht_cap.vht_supported && 1264 (nla_put(msg, NL80211_BAND_ATTR_VHT_MCS_SET, 1265 sizeof(sband->vht_cap.vht_mcs), 1266 &sband->vht_cap.vht_mcs) || 1267 nla_put_u32(msg, NL80211_BAND_ATTR_VHT_CAPA, 1268 sband->vht_cap.cap))) 1269 return -ENOBUFS; 1270 1271 /* add bitrates */ 1272 nl_rates = nla_nest_start(msg, NL80211_BAND_ATTR_RATES); 1273 if (!nl_rates) 1274 return -ENOBUFS; 1275 1276 for (i = 0; i < sband->n_bitrates; i++) { 1277 nl_rate = nla_nest_start(msg, i); 1278 if (!nl_rate) 1279 return -ENOBUFS; 1280 1281 rate = &sband->bitrates[i]; 1282 if (nla_put_u32(msg, NL80211_BITRATE_ATTR_RATE, 1283 rate->bitrate)) 1284 return -ENOBUFS; 1285 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && 1286 nla_put_flag(msg, 1287 NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE)) 1288 return -ENOBUFS; 1289 1290 nla_nest_end(msg, nl_rate); 1291 } 1292 1293 nla_nest_end(msg, nl_rates); 1294 1295 return 0; 1296 } 1297 1298 static int 1299 nl80211_send_mgmt_stypes(struct sk_buff *msg, 1300 const struct ieee80211_txrx_stypes *mgmt_stypes) 1301 { 1302 u16 stypes; 1303 struct nlattr *nl_ftypes, *nl_ifs; 1304 enum nl80211_iftype ift; 1305 int i; 1306 1307 if (!mgmt_stypes) 1308 return 0; 1309 1310 nl_ifs = nla_nest_start(msg, NL80211_ATTR_TX_FRAME_TYPES); 1311 if (!nl_ifs) 1312 return -ENOBUFS; 1313 1314 for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) { 1315 nl_ftypes = nla_nest_start(msg, ift); 1316 if (!nl_ftypes) 1317 return -ENOBUFS; 1318 i = 0; 1319 stypes = mgmt_stypes[ift].tx; 1320 while (stypes) { 1321 if ((stypes & 1) && 1322 nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE, 1323 (i << 4) | IEEE80211_FTYPE_MGMT)) 1324 return -ENOBUFS; 1325 stypes >>= 1; 1326 i++; 1327 } 1328 nla_nest_end(msg, nl_ftypes); 1329 } 1330 1331 nla_nest_end(msg, nl_ifs); 1332 1333 nl_ifs = nla_nest_start(msg, NL80211_ATTR_RX_FRAME_TYPES); 1334 if (!nl_ifs) 1335 return -ENOBUFS; 1336 1337 for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) { 1338 nl_ftypes = nla_nest_start(msg, ift); 1339 if (!nl_ftypes) 1340 return -ENOBUFS; 1341 i = 0; 1342 stypes = mgmt_stypes[ift].rx; 1343 while (stypes) { 1344 if ((stypes & 1) && 1345 nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE, 1346 (i << 4) | IEEE80211_FTYPE_MGMT)) 1347 return -ENOBUFS; 1348 stypes >>= 1; 1349 i++; 1350 } 1351 nla_nest_end(msg, nl_ftypes); 1352 } 1353 nla_nest_end(msg, nl_ifs); 1354 1355 return 0; 1356 } 1357 1358 #define CMD(op, n) \ 1359 do { \ 1360 if (rdev->ops->op) { \ 1361 i++; \ 1362 if (nla_put_u32(msg, i, NL80211_CMD_ ## n)) \ 1363 goto nla_put_failure; \ 1364 } \ 1365 } while (0) 1366 1367 static int nl80211_add_commands_unsplit(struct cfg80211_registered_device *rdev, 1368 struct sk_buff *msg) 1369 { 1370 int i = 0; 1371 1372 /* 1373 * do *NOT* add anything into this function, new things need to be 1374 * advertised only to new versions of userspace that can deal with 1375 * the split (and they can't possibly care about new features... 1376 */ 1377 CMD(add_virtual_intf, NEW_INTERFACE); 1378 CMD(change_virtual_intf, SET_INTERFACE); 1379 CMD(add_key, NEW_KEY); 1380 CMD(start_ap, START_AP); 1381 CMD(add_station, NEW_STATION); 1382 CMD(add_mpath, NEW_MPATH); 1383 CMD(update_mesh_config, SET_MESH_CONFIG); 1384 CMD(change_bss, SET_BSS); 1385 CMD(auth, AUTHENTICATE); 1386 CMD(assoc, ASSOCIATE); 1387 CMD(deauth, DEAUTHENTICATE); 1388 CMD(disassoc, DISASSOCIATE); 1389 CMD(join_ibss, JOIN_IBSS); 1390 CMD(join_mesh, JOIN_MESH); 1391 CMD(set_pmksa, SET_PMKSA); 1392 CMD(del_pmksa, DEL_PMKSA); 1393 CMD(flush_pmksa, FLUSH_PMKSA); 1394 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) 1395 CMD(remain_on_channel, REMAIN_ON_CHANNEL); 1396 CMD(set_bitrate_mask, SET_TX_BITRATE_MASK); 1397 CMD(mgmt_tx, FRAME); 1398 CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL); 1399 if (rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK) { 1400 i++; 1401 if (nla_put_u32(msg, i, NL80211_CMD_SET_WIPHY_NETNS)) 1402 goto nla_put_failure; 1403 } 1404 if (rdev->ops->set_monitor_channel || rdev->ops->start_ap || 1405 rdev->ops->join_mesh) { 1406 i++; 1407 if (nla_put_u32(msg, i, NL80211_CMD_SET_CHANNEL)) 1408 goto nla_put_failure; 1409 } 1410 CMD(set_wds_peer, SET_WDS_PEER); 1411 if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) { 1412 CMD(tdls_mgmt, TDLS_MGMT); 1413 CMD(tdls_oper, TDLS_OPER); 1414 } 1415 if (rdev->wiphy.max_sched_scan_reqs) 1416 CMD(sched_scan_start, START_SCHED_SCAN); 1417 CMD(probe_client, PROBE_CLIENT); 1418 CMD(set_noack_map, SET_NOACK_MAP); 1419 if (rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) { 1420 i++; 1421 if (nla_put_u32(msg, i, NL80211_CMD_REGISTER_BEACONS)) 1422 goto nla_put_failure; 1423 } 1424 CMD(start_p2p_device, START_P2P_DEVICE); 1425 CMD(set_mcast_rate, SET_MCAST_RATE); 1426 #ifdef CONFIG_NL80211_TESTMODE 1427 CMD(testmode_cmd, TESTMODE); 1428 #endif 1429 1430 if (rdev->ops->connect || rdev->ops->auth) { 1431 i++; 1432 if (nla_put_u32(msg, i, NL80211_CMD_CONNECT)) 1433 goto nla_put_failure; 1434 } 1435 1436 if (rdev->ops->disconnect || rdev->ops->deauth) { 1437 i++; 1438 if (nla_put_u32(msg, i, NL80211_CMD_DISCONNECT)) 1439 goto nla_put_failure; 1440 } 1441 1442 return i; 1443 nla_put_failure: 1444 return -ENOBUFS; 1445 } 1446 1447 struct nl80211_dump_wiphy_state { 1448 s64 filter_wiphy; 1449 long start; 1450 long split_start, band_start, chan_start, capa_start; 1451 bool split; 1452 }; 1453 1454 static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, 1455 enum nl80211_commands cmd, 1456 struct sk_buff *msg, u32 portid, u32 seq, 1457 int flags, struct nl80211_dump_wiphy_state *state) 1458 { 1459 void *hdr; 1460 struct nlattr *nl_bands, *nl_band; 1461 struct nlattr *nl_freqs, *nl_freq; 1462 struct nlattr *nl_cmds; 1463 enum nl80211_band band; 1464 struct ieee80211_channel *chan; 1465 int i; 1466 const struct ieee80211_txrx_stypes *mgmt_stypes = 1467 rdev->wiphy.mgmt_stypes; 1468 u32 features; 1469 1470 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 1471 if (!hdr) 1472 return -ENOBUFS; 1473 1474 if (WARN_ON(!state)) 1475 return -EINVAL; 1476 1477 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 1478 nla_put_string(msg, NL80211_ATTR_WIPHY_NAME, 1479 wiphy_name(&rdev->wiphy)) || 1480 nla_put_u32(msg, NL80211_ATTR_GENERATION, 1481 cfg80211_rdev_list_generation)) 1482 goto nla_put_failure; 1483 1484 if (cmd != NL80211_CMD_NEW_WIPHY) 1485 goto finish; 1486 1487 switch (state->split_start) { 1488 case 0: 1489 if (nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT, 1490 rdev->wiphy.retry_short) || 1491 nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_LONG, 1492 rdev->wiphy.retry_long) || 1493 nla_put_u32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD, 1494 rdev->wiphy.frag_threshold) || 1495 nla_put_u32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD, 1496 rdev->wiphy.rts_threshold) || 1497 nla_put_u8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS, 1498 rdev->wiphy.coverage_class) || 1499 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS, 1500 rdev->wiphy.max_scan_ssids) || 1501 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS, 1502 rdev->wiphy.max_sched_scan_ssids) || 1503 nla_put_u16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN, 1504 rdev->wiphy.max_scan_ie_len) || 1505 nla_put_u16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN, 1506 rdev->wiphy.max_sched_scan_ie_len) || 1507 nla_put_u8(msg, NL80211_ATTR_MAX_MATCH_SETS, 1508 rdev->wiphy.max_match_sets) || 1509 nla_put_u32(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS, 1510 rdev->wiphy.max_sched_scan_plans) || 1511 nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL, 1512 rdev->wiphy.max_sched_scan_plan_interval) || 1513 nla_put_u32(msg, NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS, 1514 rdev->wiphy.max_sched_scan_plan_iterations)) 1515 goto nla_put_failure; 1516 1517 if ((rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) && 1518 nla_put_flag(msg, NL80211_ATTR_SUPPORT_IBSS_RSN)) 1519 goto nla_put_failure; 1520 if ((rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) && 1521 nla_put_flag(msg, NL80211_ATTR_SUPPORT_MESH_AUTH)) 1522 goto nla_put_failure; 1523 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) && 1524 nla_put_flag(msg, NL80211_ATTR_SUPPORT_AP_UAPSD)) 1525 goto nla_put_failure; 1526 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) && 1527 nla_put_flag(msg, NL80211_ATTR_ROAM_SUPPORT)) 1528 goto nla_put_failure; 1529 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) && 1530 nla_put_flag(msg, NL80211_ATTR_TDLS_SUPPORT)) 1531 goto nla_put_failure; 1532 if ((rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) && 1533 nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP)) 1534 goto nla_put_failure; 1535 state->split_start++; 1536 if (state->split) 1537 break; 1538 case 1: 1539 if (nla_put(msg, NL80211_ATTR_CIPHER_SUITES, 1540 sizeof(u32) * rdev->wiphy.n_cipher_suites, 1541 rdev->wiphy.cipher_suites)) 1542 goto nla_put_failure; 1543 1544 if (nla_put_u8(msg, NL80211_ATTR_MAX_NUM_PMKIDS, 1545 rdev->wiphy.max_num_pmkids)) 1546 goto nla_put_failure; 1547 1548 if ((rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && 1549 nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE)) 1550 goto nla_put_failure; 1551 1552 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX, 1553 rdev->wiphy.available_antennas_tx) || 1554 nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX, 1555 rdev->wiphy.available_antennas_rx)) 1556 goto nla_put_failure; 1557 1558 if ((rdev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) && 1559 nla_put_u32(msg, NL80211_ATTR_PROBE_RESP_OFFLOAD, 1560 rdev->wiphy.probe_resp_offload)) 1561 goto nla_put_failure; 1562 1563 if ((rdev->wiphy.available_antennas_tx || 1564 rdev->wiphy.available_antennas_rx) && 1565 rdev->ops->get_antenna) { 1566 u32 tx_ant = 0, rx_ant = 0; 1567 int res; 1568 1569 res = rdev_get_antenna(rdev, &tx_ant, &rx_ant); 1570 if (!res) { 1571 if (nla_put_u32(msg, 1572 NL80211_ATTR_WIPHY_ANTENNA_TX, 1573 tx_ant) || 1574 nla_put_u32(msg, 1575 NL80211_ATTR_WIPHY_ANTENNA_RX, 1576 rx_ant)) 1577 goto nla_put_failure; 1578 } 1579 } 1580 1581 state->split_start++; 1582 if (state->split) 1583 break; 1584 case 2: 1585 if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES, 1586 rdev->wiphy.interface_modes)) 1587 goto nla_put_failure; 1588 state->split_start++; 1589 if (state->split) 1590 break; 1591 case 3: 1592 nl_bands = nla_nest_start(msg, NL80211_ATTR_WIPHY_BANDS); 1593 if (!nl_bands) 1594 goto nla_put_failure; 1595 1596 for (band = state->band_start; 1597 band < NUM_NL80211_BANDS; band++) { 1598 struct ieee80211_supported_band *sband; 1599 1600 sband = rdev->wiphy.bands[band]; 1601 1602 if (!sband) 1603 continue; 1604 1605 nl_band = nla_nest_start(msg, band); 1606 if (!nl_band) 1607 goto nla_put_failure; 1608 1609 switch (state->chan_start) { 1610 case 0: 1611 if (nl80211_send_band_rateinfo(msg, sband)) 1612 goto nla_put_failure; 1613 state->chan_start++; 1614 if (state->split) 1615 break; 1616 default: 1617 /* add frequencies */ 1618 nl_freqs = nla_nest_start( 1619 msg, NL80211_BAND_ATTR_FREQS); 1620 if (!nl_freqs) 1621 goto nla_put_failure; 1622 1623 for (i = state->chan_start - 1; 1624 i < sband->n_channels; 1625 i++) { 1626 nl_freq = nla_nest_start(msg, i); 1627 if (!nl_freq) 1628 goto nla_put_failure; 1629 1630 chan = &sband->channels[i]; 1631 1632 if (nl80211_msg_put_channel( 1633 msg, chan, 1634 state->split)) 1635 goto nla_put_failure; 1636 1637 nla_nest_end(msg, nl_freq); 1638 if (state->split) 1639 break; 1640 } 1641 if (i < sband->n_channels) 1642 state->chan_start = i + 2; 1643 else 1644 state->chan_start = 0; 1645 nla_nest_end(msg, nl_freqs); 1646 } 1647 1648 nla_nest_end(msg, nl_band); 1649 1650 if (state->split) { 1651 /* start again here */ 1652 if (state->chan_start) 1653 band--; 1654 break; 1655 } 1656 } 1657 nla_nest_end(msg, nl_bands); 1658 1659 if (band < NUM_NL80211_BANDS) 1660 state->band_start = band + 1; 1661 else 1662 state->band_start = 0; 1663 1664 /* if bands & channels are done, continue outside */ 1665 if (state->band_start == 0 && state->chan_start == 0) 1666 state->split_start++; 1667 if (state->split) 1668 break; 1669 case 4: 1670 nl_cmds = nla_nest_start(msg, NL80211_ATTR_SUPPORTED_COMMANDS); 1671 if (!nl_cmds) 1672 goto nla_put_failure; 1673 1674 i = nl80211_add_commands_unsplit(rdev, msg); 1675 if (i < 0) 1676 goto nla_put_failure; 1677 if (state->split) { 1678 CMD(crit_proto_start, CRIT_PROTOCOL_START); 1679 CMD(crit_proto_stop, CRIT_PROTOCOL_STOP); 1680 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) 1681 CMD(channel_switch, CHANNEL_SWITCH); 1682 CMD(set_qos_map, SET_QOS_MAP); 1683 if (rdev->wiphy.features & 1684 NL80211_FEATURE_SUPPORTS_WMM_ADMISSION) 1685 CMD(add_tx_ts, ADD_TX_TS); 1686 CMD(set_multicast_to_unicast, SET_MULTICAST_TO_UNICAST); 1687 CMD(update_connect_params, UPDATE_CONNECT_PARAMS); 1688 } 1689 #undef CMD 1690 1691 nla_nest_end(msg, nl_cmds); 1692 state->split_start++; 1693 if (state->split) 1694 break; 1695 case 5: 1696 if (rdev->ops->remain_on_channel && 1697 (rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) && 1698 nla_put_u32(msg, 1699 NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION, 1700 rdev->wiphy.max_remain_on_channel_duration)) 1701 goto nla_put_failure; 1702 1703 if ((rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) && 1704 nla_put_flag(msg, NL80211_ATTR_OFFCHANNEL_TX_OK)) 1705 goto nla_put_failure; 1706 1707 if (nl80211_send_mgmt_stypes(msg, mgmt_stypes)) 1708 goto nla_put_failure; 1709 state->split_start++; 1710 if (state->split) 1711 break; 1712 case 6: 1713 #ifdef CONFIG_PM 1714 if (nl80211_send_wowlan(msg, rdev, state->split)) 1715 goto nla_put_failure; 1716 state->split_start++; 1717 if (state->split) 1718 break; 1719 #else 1720 state->split_start++; 1721 #endif 1722 case 7: 1723 if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES, 1724 rdev->wiphy.software_iftypes)) 1725 goto nla_put_failure; 1726 1727 if (nl80211_put_iface_combinations(&rdev->wiphy, msg, 1728 state->split)) 1729 goto nla_put_failure; 1730 1731 state->split_start++; 1732 if (state->split) 1733 break; 1734 case 8: 1735 if ((rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) && 1736 nla_put_u32(msg, NL80211_ATTR_DEVICE_AP_SME, 1737 rdev->wiphy.ap_sme_capa)) 1738 goto nla_put_failure; 1739 1740 features = rdev->wiphy.features; 1741 /* 1742 * We can only add the per-channel limit information if the 1743 * dump is split, otherwise it makes it too big. Therefore 1744 * only advertise it in that case. 1745 */ 1746 if (state->split) 1747 features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS; 1748 if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features)) 1749 goto nla_put_failure; 1750 1751 if (rdev->wiphy.ht_capa_mod_mask && 1752 nla_put(msg, NL80211_ATTR_HT_CAPABILITY_MASK, 1753 sizeof(*rdev->wiphy.ht_capa_mod_mask), 1754 rdev->wiphy.ht_capa_mod_mask)) 1755 goto nla_put_failure; 1756 1757 if (rdev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME && 1758 rdev->wiphy.max_acl_mac_addrs && 1759 nla_put_u32(msg, NL80211_ATTR_MAC_ACL_MAX, 1760 rdev->wiphy.max_acl_mac_addrs)) 1761 goto nla_put_failure; 1762 1763 /* 1764 * Any information below this point is only available to 1765 * applications that can deal with it being split. This 1766 * helps ensure that newly added capabilities don't break 1767 * older tools by overrunning their buffers. 1768 * 1769 * We still increment split_start so that in the split 1770 * case we'll continue with more data in the next round, 1771 * but break unconditionally so unsplit data stops here. 1772 */ 1773 state->split_start++; 1774 break; 1775 case 9: 1776 if (rdev->wiphy.extended_capabilities && 1777 (nla_put(msg, NL80211_ATTR_EXT_CAPA, 1778 rdev->wiphy.extended_capabilities_len, 1779 rdev->wiphy.extended_capabilities) || 1780 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK, 1781 rdev->wiphy.extended_capabilities_len, 1782 rdev->wiphy.extended_capabilities_mask))) 1783 goto nla_put_failure; 1784 1785 if (rdev->wiphy.vht_capa_mod_mask && 1786 nla_put(msg, NL80211_ATTR_VHT_CAPABILITY_MASK, 1787 sizeof(*rdev->wiphy.vht_capa_mod_mask), 1788 rdev->wiphy.vht_capa_mod_mask)) 1789 goto nla_put_failure; 1790 1791 state->split_start++; 1792 break; 1793 case 10: 1794 if (nl80211_send_coalesce(msg, rdev)) 1795 goto nla_put_failure; 1796 1797 if ((rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) && 1798 (nla_put_flag(msg, NL80211_ATTR_SUPPORT_5_MHZ) || 1799 nla_put_flag(msg, NL80211_ATTR_SUPPORT_10_MHZ))) 1800 goto nla_put_failure; 1801 1802 if (rdev->wiphy.max_ap_assoc_sta && 1803 nla_put_u32(msg, NL80211_ATTR_MAX_AP_ASSOC_STA, 1804 rdev->wiphy.max_ap_assoc_sta)) 1805 goto nla_put_failure; 1806 1807 state->split_start++; 1808 break; 1809 case 11: 1810 if (rdev->wiphy.n_vendor_commands) { 1811 const struct nl80211_vendor_cmd_info *info; 1812 struct nlattr *nested; 1813 1814 nested = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA); 1815 if (!nested) 1816 goto nla_put_failure; 1817 1818 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { 1819 info = &rdev->wiphy.vendor_commands[i].info; 1820 if (nla_put(msg, i + 1, sizeof(*info), info)) 1821 goto nla_put_failure; 1822 } 1823 nla_nest_end(msg, nested); 1824 } 1825 1826 if (rdev->wiphy.n_vendor_events) { 1827 const struct nl80211_vendor_cmd_info *info; 1828 struct nlattr *nested; 1829 1830 nested = nla_nest_start(msg, 1831 NL80211_ATTR_VENDOR_EVENTS); 1832 if (!nested) 1833 goto nla_put_failure; 1834 1835 for (i = 0; i < rdev->wiphy.n_vendor_events; i++) { 1836 info = &rdev->wiphy.vendor_events[i]; 1837 if (nla_put(msg, i + 1, sizeof(*info), info)) 1838 goto nla_put_failure; 1839 } 1840 nla_nest_end(msg, nested); 1841 } 1842 state->split_start++; 1843 break; 1844 case 12: 1845 if (rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH && 1846 nla_put_u8(msg, NL80211_ATTR_MAX_CSA_COUNTERS, 1847 rdev->wiphy.max_num_csa_counters)) 1848 goto nla_put_failure; 1849 1850 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 1851 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 1852 goto nla_put_failure; 1853 1854 if (rdev->wiphy.max_sched_scan_reqs && 1855 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_MAX_REQS, 1856 rdev->wiphy.max_sched_scan_reqs)) 1857 goto nla_put_failure; 1858 1859 if (nla_put(msg, NL80211_ATTR_EXT_FEATURES, 1860 sizeof(rdev->wiphy.ext_features), 1861 rdev->wiphy.ext_features)) 1862 goto nla_put_failure; 1863 1864 if (rdev->wiphy.bss_select_support) { 1865 struct nlattr *nested; 1866 u32 bss_select_support = rdev->wiphy.bss_select_support; 1867 1868 nested = nla_nest_start(msg, NL80211_ATTR_BSS_SELECT); 1869 if (!nested) 1870 goto nla_put_failure; 1871 1872 i = 0; 1873 while (bss_select_support) { 1874 if ((bss_select_support & 1) && 1875 nla_put_flag(msg, i)) 1876 goto nla_put_failure; 1877 i++; 1878 bss_select_support >>= 1; 1879 } 1880 nla_nest_end(msg, nested); 1881 } 1882 1883 state->split_start++; 1884 break; 1885 case 13: 1886 if (rdev->wiphy.num_iftype_ext_capab && 1887 rdev->wiphy.iftype_ext_capab) { 1888 struct nlattr *nested_ext_capab, *nested; 1889 1890 nested = nla_nest_start(msg, 1891 NL80211_ATTR_IFTYPE_EXT_CAPA); 1892 if (!nested) 1893 goto nla_put_failure; 1894 1895 for (i = state->capa_start; 1896 i < rdev->wiphy.num_iftype_ext_capab; i++) { 1897 const struct wiphy_iftype_ext_capab *capab; 1898 1899 capab = &rdev->wiphy.iftype_ext_capab[i]; 1900 1901 nested_ext_capab = nla_nest_start(msg, i); 1902 if (!nested_ext_capab || 1903 nla_put_u32(msg, NL80211_ATTR_IFTYPE, 1904 capab->iftype) || 1905 nla_put(msg, NL80211_ATTR_EXT_CAPA, 1906 capab->extended_capabilities_len, 1907 capab->extended_capabilities) || 1908 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK, 1909 capab->extended_capabilities_len, 1910 capab->extended_capabilities_mask)) 1911 goto nla_put_failure; 1912 1913 nla_nest_end(msg, nested_ext_capab); 1914 if (state->split) 1915 break; 1916 } 1917 nla_nest_end(msg, nested); 1918 if (i < rdev->wiphy.num_iftype_ext_capab) { 1919 state->capa_start = i + 1; 1920 break; 1921 } 1922 } 1923 1924 if (nla_put_u32(msg, NL80211_ATTR_BANDS, 1925 rdev->wiphy.nan_supported_bands)) 1926 goto nla_put_failure; 1927 1928 /* done */ 1929 state->split_start = 0; 1930 break; 1931 } 1932 finish: 1933 genlmsg_end(msg, hdr); 1934 return 0; 1935 1936 nla_put_failure: 1937 genlmsg_cancel(msg, hdr); 1938 return -EMSGSIZE; 1939 } 1940 1941 static int nl80211_dump_wiphy_parse(struct sk_buff *skb, 1942 struct netlink_callback *cb, 1943 struct nl80211_dump_wiphy_state *state) 1944 { 1945 struct nlattr **tb = genl_family_attrbuf(&nl80211_fam); 1946 int ret = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, tb, 1947 nl80211_fam.maxattr, nl80211_policy, NULL); 1948 /* ignore parse errors for backward compatibility */ 1949 if (ret) 1950 return 0; 1951 1952 state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; 1953 if (tb[NL80211_ATTR_WIPHY]) 1954 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]); 1955 if (tb[NL80211_ATTR_WDEV]) 1956 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32; 1957 if (tb[NL80211_ATTR_IFINDEX]) { 1958 struct net_device *netdev; 1959 struct cfg80211_registered_device *rdev; 1960 int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]); 1961 1962 netdev = __dev_get_by_index(sock_net(skb->sk), ifidx); 1963 if (!netdev) 1964 return -ENODEV; 1965 if (netdev->ieee80211_ptr) { 1966 rdev = wiphy_to_rdev( 1967 netdev->ieee80211_ptr->wiphy); 1968 state->filter_wiphy = rdev->wiphy_idx; 1969 } 1970 } 1971 1972 return 0; 1973 } 1974 1975 static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb) 1976 { 1977 int idx = 0, ret; 1978 struct nl80211_dump_wiphy_state *state = (void *)cb->args[0]; 1979 struct cfg80211_registered_device *rdev; 1980 1981 rtnl_lock(); 1982 if (!state) { 1983 state = kzalloc(sizeof(*state), GFP_KERNEL); 1984 if (!state) { 1985 rtnl_unlock(); 1986 return -ENOMEM; 1987 } 1988 state->filter_wiphy = -1; 1989 ret = nl80211_dump_wiphy_parse(skb, cb, state); 1990 if (ret) { 1991 kfree(state); 1992 rtnl_unlock(); 1993 return ret; 1994 } 1995 cb->args[0] = (long)state; 1996 } 1997 1998 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 1999 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) 2000 continue; 2001 if (++idx <= state->start) 2002 continue; 2003 if (state->filter_wiphy != -1 && 2004 state->filter_wiphy != rdev->wiphy_idx) 2005 continue; 2006 /* attempt to fit multiple wiphy data chunks into the skb */ 2007 do { 2008 ret = nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, 2009 skb, 2010 NETLINK_CB(cb->skb).portid, 2011 cb->nlh->nlmsg_seq, 2012 NLM_F_MULTI, state); 2013 if (ret < 0) { 2014 /* 2015 * If sending the wiphy data didn't fit (ENOBUFS 2016 * or EMSGSIZE returned), this SKB is still 2017 * empty (so it's not too big because another 2018 * wiphy dataset is already in the skb) and 2019 * we've not tried to adjust the dump allocation 2020 * yet ... then adjust the alloc size to be 2021 * bigger, and return 1 but with the empty skb. 2022 * This results in an empty message being RX'ed 2023 * in userspace, but that is ignored. 2024 * 2025 * We can then retry with the larger buffer. 2026 */ 2027 if ((ret == -ENOBUFS || ret == -EMSGSIZE) && 2028 !skb->len && !state->split && 2029 cb->min_dump_alloc < 4096) { 2030 cb->min_dump_alloc = 4096; 2031 state->split_start = 0; 2032 rtnl_unlock(); 2033 return 1; 2034 } 2035 idx--; 2036 break; 2037 } 2038 } while (state->split_start > 0); 2039 break; 2040 } 2041 rtnl_unlock(); 2042 2043 state->start = idx; 2044 2045 return skb->len; 2046 } 2047 2048 static int nl80211_dump_wiphy_done(struct netlink_callback *cb) 2049 { 2050 kfree((void *)cb->args[0]); 2051 return 0; 2052 } 2053 2054 static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info) 2055 { 2056 struct sk_buff *msg; 2057 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2058 struct nl80211_dump_wiphy_state state = {}; 2059 2060 msg = nlmsg_new(4096, GFP_KERNEL); 2061 if (!msg) 2062 return -ENOMEM; 2063 2064 if (nl80211_send_wiphy(rdev, NL80211_CMD_NEW_WIPHY, msg, 2065 info->snd_portid, info->snd_seq, 0, 2066 &state) < 0) { 2067 nlmsg_free(msg); 2068 return -ENOBUFS; 2069 } 2070 2071 return genlmsg_reply(msg, info); 2072 } 2073 2074 static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = { 2075 [NL80211_TXQ_ATTR_QUEUE] = { .type = NLA_U8 }, 2076 [NL80211_TXQ_ATTR_TXOP] = { .type = NLA_U16 }, 2077 [NL80211_TXQ_ATTR_CWMIN] = { .type = NLA_U16 }, 2078 [NL80211_TXQ_ATTR_CWMAX] = { .type = NLA_U16 }, 2079 [NL80211_TXQ_ATTR_AIFS] = { .type = NLA_U8 }, 2080 }; 2081 2082 static int parse_txq_params(struct nlattr *tb[], 2083 struct ieee80211_txq_params *txq_params) 2084 { 2085 u8 ac; 2086 2087 if (!tb[NL80211_TXQ_ATTR_AC] || !tb[NL80211_TXQ_ATTR_TXOP] || 2088 !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] || 2089 !tb[NL80211_TXQ_ATTR_AIFS]) 2090 return -EINVAL; 2091 2092 ac = nla_get_u8(tb[NL80211_TXQ_ATTR_AC]); 2093 txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]); 2094 txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]); 2095 txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]); 2096 txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]); 2097 2098 if (ac >= NL80211_NUM_ACS) 2099 return -EINVAL; 2100 txq_params->ac = array_index_nospec(ac, NL80211_NUM_ACS); 2101 return 0; 2102 } 2103 2104 static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev) 2105 { 2106 /* 2107 * You can only set the channel explicitly for WDS interfaces, 2108 * all others have their channel managed via their respective 2109 * "establish a connection" command (connect, join, ...) 2110 * 2111 * For AP/GO and mesh mode, the channel can be set with the 2112 * channel userspace API, but is only stored and passed to the 2113 * low-level driver when the AP starts or the mesh is joined. 2114 * This is for backward compatibility, userspace can also give 2115 * the channel in the start-ap or join-mesh commands instead. 2116 * 2117 * Monitors are special as they are normally slaved to 2118 * whatever else is going on, so they have their own special 2119 * operation to set the monitor channel if possible. 2120 */ 2121 return !wdev || 2122 wdev->iftype == NL80211_IFTYPE_AP || 2123 wdev->iftype == NL80211_IFTYPE_MESH_POINT || 2124 wdev->iftype == NL80211_IFTYPE_MONITOR || 2125 wdev->iftype == NL80211_IFTYPE_P2P_GO; 2126 } 2127 2128 static int nl80211_parse_chandef(struct cfg80211_registered_device *rdev, 2129 struct genl_info *info, 2130 struct cfg80211_chan_def *chandef) 2131 { 2132 u32 control_freq; 2133 2134 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 2135 return -EINVAL; 2136 2137 control_freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]); 2138 2139 chandef->chan = ieee80211_get_channel(&rdev->wiphy, control_freq); 2140 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; 2141 chandef->center_freq1 = control_freq; 2142 chandef->center_freq2 = 0; 2143 2144 /* Primary channel not allowed */ 2145 if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED) 2146 return -EINVAL; 2147 2148 if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) { 2149 enum nl80211_channel_type chantype; 2150 2151 chantype = nla_get_u32( 2152 info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]); 2153 2154 switch (chantype) { 2155 case NL80211_CHAN_NO_HT: 2156 case NL80211_CHAN_HT20: 2157 case NL80211_CHAN_HT40PLUS: 2158 case NL80211_CHAN_HT40MINUS: 2159 cfg80211_chandef_create(chandef, chandef->chan, 2160 chantype); 2161 /* user input for center_freq is incorrect */ 2162 if (info->attrs[NL80211_ATTR_CENTER_FREQ1] && 2163 chandef->center_freq1 != nla_get_u32( 2164 info->attrs[NL80211_ATTR_CENTER_FREQ1])) 2165 return -EINVAL; 2166 /* center_freq2 must be zero */ 2167 if (info->attrs[NL80211_ATTR_CENTER_FREQ2] && 2168 nla_get_u32(info->attrs[NL80211_ATTR_CENTER_FREQ2])) 2169 return -EINVAL; 2170 break; 2171 default: 2172 return -EINVAL; 2173 } 2174 } else if (info->attrs[NL80211_ATTR_CHANNEL_WIDTH]) { 2175 chandef->width = 2176 nla_get_u32(info->attrs[NL80211_ATTR_CHANNEL_WIDTH]); 2177 if (info->attrs[NL80211_ATTR_CENTER_FREQ1]) 2178 chandef->center_freq1 = 2179 nla_get_u32( 2180 info->attrs[NL80211_ATTR_CENTER_FREQ1]); 2181 if (info->attrs[NL80211_ATTR_CENTER_FREQ2]) 2182 chandef->center_freq2 = 2183 nla_get_u32( 2184 info->attrs[NL80211_ATTR_CENTER_FREQ2]); 2185 } 2186 2187 if (!cfg80211_chandef_valid(chandef)) 2188 return -EINVAL; 2189 2190 if (!cfg80211_chandef_usable(&rdev->wiphy, chandef, 2191 IEEE80211_CHAN_DISABLED)) 2192 return -EINVAL; 2193 2194 if ((chandef->width == NL80211_CHAN_WIDTH_5 || 2195 chandef->width == NL80211_CHAN_WIDTH_10) && 2196 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) 2197 return -EINVAL; 2198 2199 return 0; 2200 } 2201 2202 static int __nl80211_set_channel(struct cfg80211_registered_device *rdev, 2203 struct net_device *dev, 2204 struct genl_info *info) 2205 { 2206 struct cfg80211_chan_def chandef; 2207 int result; 2208 enum nl80211_iftype iftype = NL80211_IFTYPE_MONITOR; 2209 struct wireless_dev *wdev = NULL; 2210 2211 if (dev) 2212 wdev = dev->ieee80211_ptr; 2213 if (!nl80211_can_set_dev_channel(wdev)) 2214 return -EOPNOTSUPP; 2215 if (wdev) 2216 iftype = wdev->iftype; 2217 2218 result = nl80211_parse_chandef(rdev, info, &chandef); 2219 if (result) 2220 return result; 2221 2222 switch (iftype) { 2223 case NL80211_IFTYPE_AP: 2224 case NL80211_IFTYPE_P2P_GO: 2225 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, 2226 iftype)) { 2227 result = -EINVAL; 2228 break; 2229 } 2230 if (wdev->beacon_interval) { 2231 if (!dev || !rdev->ops->set_ap_chanwidth || 2232 !(rdev->wiphy.features & 2233 NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE)) { 2234 result = -EBUSY; 2235 break; 2236 } 2237 2238 /* Only allow dynamic channel width changes */ 2239 if (chandef.chan != wdev->preset_chandef.chan) { 2240 result = -EBUSY; 2241 break; 2242 } 2243 result = rdev_set_ap_chanwidth(rdev, dev, &chandef); 2244 if (result) 2245 break; 2246 } 2247 wdev->preset_chandef = chandef; 2248 result = 0; 2249 break; 2250 case NL80211_IFTYPE_MESH_POINT: 2251 result = cfg80211_set_mesh_channel(rdev, wdev, &chandef); 2252 break; 2253 case NL80211_IFTYPE_MONITOR: 2254 result = cfg80211_set_monitor_channel(rdev, &chandef); 2255 break; 2256 default: 2257 result = -EINVAL; 2258 } 2259 2260 return result; 2261 } 2262 2263 static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info) 2264 { 2265 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2266 struct net_device *netdev = info->user_ptr[1]; 2267 2268 return __nl80211_set_channel(rdev, netdev, info); 2269 } 2270 2271 static int nl80211_set_wds_peer(struct sk_buff *skb, struct genl_info *info) 2272 { 2273 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2274 struct net_device *dev = info->user_ptr[1]; 2275 struct wireless_dev *wdev = dev->ieee80211_ptr; 2276 const u8 *bssid; 2277 2278 if (!info->attrs[NL80211_ATTR_MAC]) 2279 return -EINVAL; 2280 2281 if (netif_running(dev)) 2282 return -EBUSY; 2283 2284 if (!rdev->ops->set_wds_peer) 2285 return -EOPNOTSUPP; 2286 2287 if (wdev->iftype != NL80211_IFTYPE_WDS) 2288 return -EOPNOTSUPP; 2289 2290 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 2291 return rdev_set_wds_peer(rdev, dev, bssid); 2292 } 2293 2294 static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) 2295 { 2296 struct cfg80211_registered_device *rdev; 2297 struct net_device *netdev = NULL; 2298 struct wireless_dev *wdev; 2299 int result = 0, rem_txq_params = 0; 2300 struct nlattr *nl_txq_params; 2301 u32 changed; 2302 u8 retry_short = 0, retry_long = 0; 2303 u32 frag_threshold = 0, rts_threshold = 0; 2304 u8 coverage_class = 0; 2305 2306 ASSERT_RTNL(); 2307 2308 /* 2309 * Try to find the wiphy and netdev. Normally this 2310 * function shouldn't need the netdev, but this is 2311 * done for backward compatibility -- previously 2312 * setting the channel was done per wiphy, but now 2313 * it is per netdev. Previous userland like hostapd 2314 * also passed a netdev to set_wiphy, so that it is 2315 * possible to let that go to the right netdev! 2316 */ 2317 2318 if (info->attrs[NL80211_ATTR_IFINDEX]) { 2319 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); 2320 2321 netdev = __dev_get_by_index(genl_info_net(info), ifindex); 2322 if (netdev && netdev->ieee80211_ptr) 2323 rdev = wiphy_to_rdev(netdev->ieee80211_ptr->wiphy); 2324 else 2325 netdev = NULL; 2326 } 2327 2328 if (!netdev) { 2329 rdev = __cfg80211_rdev_from_attrs(genl_info_net(info), 2330 info->attrs); 2331 if (IS_ERR(rdev)) 2332 return PTR_ERR(rdev); 2333 wdev = NULL; 2334 netdev = NULL; 2335 result = 0; 2336 } else 2337 wdev = netdev->ieee80211_ptr; 2338 2339 /* 2340 * end workaround code, by now the rdev is available 2341 * and locked, and wdev may or may not be NULL. 2342 */ 2343 2344 if (info->attrs[NL80211_ATTR_WIPHY_NAME]) 2345 result = cfg80211_dev_rename( 2346 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME])); 2347 2348 if (result) 2349 return result; 2350 2351 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) { 2352 struct ieee80211_txq_params txq_params; 2353 struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1]; 2354 2355 if (!rdev->ops->set_txq_params) 2356 return -EOPNOTSUPP; 2357 2358 if (!netdev) 2359 return -EINVAL; 2360 2361 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 2362 netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 2363 return -EINVAL; 2364 2365 if (!netif_running(netdev)) 2366 return -ENETDOWN; 2367 2368 nla_for_each_nested(nl_txq_params, 2369 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], 2370 rem_txq_params) { 2371 result = nla_parse_nested(tb, NL80211_TXQ_ATTR_MAX, 2372 nl_txq_params, 2373 txq_params_policy, 2374 info->extack); 2375 if (result) 2376 return result; 2377 result = parse_txq_params(tb, &txq_params); 2378 if (result) 2379 return result; 2380 2381 result = rdev_set_txq_params(rdev, netdev, 2382 &txq_params); 2383 if (result) 2384 return result; 2385 } 2386 } 2387 2388 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 2389 result = __nl80211_set_channel( 2390 rdev, 2391 nl80211_can_set_dev_channel(wdev) ? netdev : NULL, 2392 info); 2393 if (result) 2394 return result; 2395 } 2396 2397 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) { 2398 struct wireless_dev *txp_wdev = wdev; 2399 enum nl80211_tx_power_setting type; 2400 int idx, mbm = 0; 2401 2402 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER)) 2403 txp_wdev = NULL; 2404 2405 if (!rdev->ops->set_tx_power) 2406 return -EOPNOTSUPP; 2407 2408 idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING; 2409 type = nla_get_u32(info->attrs[idx]); 2410 2411 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] && 2412 (type != NL80211_TX_POWER_AUTOMATIC)) 2413 return -EINVAL; 2414 2415 if (type != NL80211_TX_POWER_AUTOMATIC) { 2416 idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL; 2417 mbm = nla_get_u32(info->attrs[idx]); 2418 } 2419 2420 result = rdev_set_tx_power(rdev, txp_wdev, type, mbm); 2421 if (result) 2422 return result; 2423 } 2424 2425 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && 2426 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { 2427 u32 tx_ant, rx_ant; 2428 2429 if ((!rdev->wiphy.available_antennas_tx && 2430 !rdev->wiphy.available_antennas_rx) || 2431 !rdev->ops->set_antenna) 2432 return -EOPNOTSUPP; 2433 2434 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]); 2435 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]); 2436 2437 /* reject antenna configurations which don't match the 2438 * available antenna masks, except for the "all" mask */ 2439 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) || 2440 (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) 2441 return -EINVAL; 2442 2443 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx; 2444 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx; 2445 2446 result = rdev_set_antenna(rdev, tx_ant, rx_ant); 2447 if (result) 2448 return result; 2449 } 2450 2451 changed = 0; 2452 2453 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) { 2454 retry_short = nla_get_u8( 2455 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]); 2456 if (retry_short == 0) 2457 return -EINVAL; 2458 2459 changed |= WIPHY_PARAM_RETRY_SHORT; 2460 } 2461 2462 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) { 2463 retry_long = nla_get_u8( 2464 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]); 2465 if (retry_long == 0) 2466 return -EINVAL; 2467 2468 changed |= WIPHY_PARAM_RETRY_LONG; 2469 } 2470 2471 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) { 2472 frag_threshold = nla_get_u32( 2473 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]); 2474 if (frag_threshold < 256) 2475 return -EINVAL; 2476 2477 if (frag_threshold != (u32) -1) { 2478 /* 2479 * Fragments (apart from the last one) are required to 2480 * have even length. Make the fragmentation code 2481 * simpler by stripping LSB should someone try to use 2482 * odd threshold value. 2483 */ 2484 frag_threshold &= ~0x1; 2485 } 2486 changed |= WIPHY_PARAM_FRAG_THRESHOLD; 2487 } 2488 2489 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { 2490 rts_threshold = nla_get_u32( 2491 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); 2492 changed |= WIPHY_PARAM_RTS_THRESHOLD; 2493 } 2494 2495 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) { 2496 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) 2497 return -EINVAL; 2498 2499 coverage_class = nla_get_u8( 2500 info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]); 2501 changed |= WIPHY_PARAM_COVERAGE_CLASS; 2502 } 2503 2504 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) { 2505 if (!(rdev->wiphy.features & NL80211_FEATURE_ACKTO_ESTIMATION)) 2506 return -EOPNOTSUPP; 2507 2508 changed |= WIPHY_PARAM_DYN_ACK; 2509 } 2510 2511 if (changed) { 2512 u8 old_retry_short, old_retry_long; 2513 u32 old_frag_threshold, old_rts_threshold; 2514 u8 old_coverage_class; 2515 2516 if (!rdev->ops->set_wiphy_params) 2517 return -EOPNOTSUPP; 2518 2519 old_retry_short = rdev->wiphy.retry_short; 2520 old_retry_long = rdev->wiphy.retry_long; 2521 old_frag_threshold = rdev->wiphy.frag_threshold; 2522 old_rts_threshold = rdev->wiphy.rts_threshold; 2523 old_coverage_class = rdev->wiphy.coverage_class; 2524 2525 if (changed & WIPHY_PARAM_RETRY_SHORT) 2526 rdev->wiphy.retry_short = retry_short; 2527 if (changed & WIPHY_PARAM_RETRY_LONG) 2528 rdev->wiphy.retry_long = retry_long; 2529 if (changed & WIPHY_PARAM_FRAG_THRESHOLD) 2530 rdev->wiphy.frag_threshold = frag_threshold; 2531 if (changed & WIPHY_PARAM_RTS_THRESHOLD) 2532 rdev->wiphy.rts_threshold = rts_threshold; 2533 if (changed & WIPHY_PARAM_COVERAGE_CLASS) 2534 rdev->wiphy.coverage_class = coverage_class; 2535 2536 result = rdev_set_wiphy_params(rdev, changed); 2537 if (result) { 2538 rdev->wiphy.retry_short = old_retry_short; 2539 rdev->wiphy.retry_long = old_retry_long; 2540 rdev->wiphy.frag_threshold = old_frag_threshold; 2541 rdev->wiphy.rts_threshold = old_rts_threshold; 2542 rdev->wiphy.coverage_class = old_coverage_class; 2543 return result; 2544 } 2545 } 2546 return 0; 2547 } 2548 2549 static inline u64 wdev_id(struct wireless_dev *wdev) 2550 { 2551 return (u64)wdev->identifier | 2552 ((u64)wiphy_to_rdev(wdev->wiphy)->wiphy_idx << 32); 2553 } 2554 2555 static int nl80211_send_chandef(struct sk_buff *msg, 2556 const struct cfg80211_chan_def *chandef) 2557 { 2558 if (WARN_ON(!cfg80211_chandef_valid(chandef))) 2559 return -EINVAL; 2560 2561 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, 2562 chandef->chan->center_freq)) 2563 return -ENOBUFS; 2564 switch (chandef->width) { 2565 case NL80211_CHAN_WIDTH_20_NOHT: 2566 case NL80211_CHAN_WIDTH_20: 2567 case NL80211_CHAN_WIDTH_40: 2568 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 2569 cfg80211_get_chandef_type(chandef))) 2570 return -ENOBUFS; 2571 break; 2572 default: 2573 break; 2574 } 2575 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width)) 2576 return -ENOBUFS; 2577 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1)) 2578 return -ENOBUFS; 2579 if (chandef->center_freq2 && 2580 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2)) 2581 return -ENOBUFS; 2582 return 0; 2583 } 2584 2585 static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags, 2586 struct cfg80211_registered_device *rdev, 2587 struct wireless_dev *wdev, bool removal) 2588 { 2589 struct net_device *dev = wdev->netdev; 2590 u8 cmd = NL80211_CMD_NEW_INTERFACE; 2591 void *hdr; 2592 2593 if (removal) 2594 cmd = NL80211_CMD_DEL_INTERFACE; 2595 2596 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 2597 if (!hdr) 2598 return -1; 2599 2600 if (dev && 2601 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 2602 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name))) 2603 goto nla_put_failure; 2604 2605 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 2606 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || 2607 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 2608 NL80211_ATTR_PAD) || 2609 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, wdev_address(wdev)) || 2610 nla_put_u32(msg, NL80211_ATTR_GENERATION, 2611 rdev->devlist_generation ^ 2612 (cfg80211_rdev_list_generation << 2))) 2613 goto nla_put_failure; 2614 2615 if (rdev->ops->get_channel) { 2616 int ret; 2617 struct cfg80211_chan_def chandef; 2618 2619 ret = rdev_get_channel(rdev, wdev, &chandef); 2620 if (ret == 0) { 2621 if (nl80211_send_chandef(msg, &chandef)) 2622 goto nla_put_failure; 2623 } 2624 } 2625 2626 if (rdev->ops->get_tx_power) { 2627 int dbm, ret; 2628 2629 ret = rdev_get_tx_power(rdev, wdev, &dbm); 2630 if (ret == 0 && 2631 nla_put_u32(msg, NL80211_ATTR_WIPHY_TX_POWER_LEVEL, 2632 DBM_TO_MBM(dbm))) 2633 goto nla_put_failure; 2634 } 2635 2636 wdev_lock(wdev); 2637 switch (wdev->iftype) { 2638 case NL80211_IFTYPE_AP: 2639 if (wdev->ssid_len && 2640 nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid)) 2641 goto nla_put_failure_locked; 2642 break; 2643 case NL80211_IFTYPE_STATION: 2644 case NL80211_IFTYPE_P2P_CLIENT: 2645 case NL80211_IFTYPE_ADHOC: { 2646 const u8 *ssid_ie; 2647 if (!wdev->current_bss) 2648 break; 2649 rcu_read_lock(); 2650 ssid_ie = ieee80211_bss_get_ie(&wdev->current_bss->pub, 2651 WLAN_EID_SSID); 2652 if (ssid_ie && 2653 nla_put(msg, NL80211_ATTR_SSID, ssid_ie[1], ssid_ie + 2)) 2654 goto nla_put_failure_rcu_locked; 2655 rcu_read_unlock(); 2656 break; 2657 } 2658 default: 2659 /* nothing */ 2660 break; 2661 } 2662 wdev_unlock(wdev); 2663 2664 genlmsg_end(msg, hdr); 2665 return 0; 2666 2667 nla_put_failure_rcu_locked: 2668 rcu_read_unlock(); 2669 nla_put_failure_locked: 2670 wdev_unlock(wdev); 2671 nla_put_failure: 2672 genlmsg_cancel(msg, hdr); 2673 return -EMSGSIZE; 2674 } 2675 2676 static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb) 2677 { 2678 int wp_idx = 0; 2679 int if_idx = 0; 2680 int wp_start = cb->args[0]; 2681 int if_start = cb->args[1]; 2682 int filter_wiphy = -1; 2683 struct cfg80211_registered_device *rdev; 2684 struct wireless_dev *wdev; 2685 int ret; 2686 2687 rtnl_lock(); 2688 if (!cb->args[2]) { 2689 struct nl80211_dump_wiphy_state state = { 2690 .filter_wiphy = -1, 2691 }; 2692 2693 ret = nl80211_dump_wiphy_parse(skb, cb, &state); 2694 if (ret) 2695 goto out_unlock; 2696 2697 filter_wiphy = state.filter_wiphy; 2698 2699 /* 2700 * if filtering, set cb->args[2] to +1 since 0 is the default 2701 * value needed to determine that parsing is necessary. 2702 */ 2703 if (filter_wiphy >= 0) 2704 cb->args[2] = filter_wiphy + 1; 2705 else 2706 cb->args[2] = -1; 2707 } else if (cb->args[2] > 0) { 2708 filter_wiphy = cb->args[2] - 1; 2709 } 2710 2711 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 2712 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) 2713 continue; 2714 if (wp_idx < wp_start) { 2715 wp_idx++; 2716 continue; 2717 } 2718 2719 if (filter_wiphy >= 0 && filter_wiphy != rdev->wiphy_idx) 2720 continue; 2721 2722 if_idx = 0; 2723 2724 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 2725 if (if_idx < if_start) { 2726 if_idx++; 2727 continue; 2728 } 2729 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, 2730 cb->nlh->nlmsg_seq, NLM_F_MULTI, 2731 rdev, wdev, false) < 0) { 2732 goto out; 2733 } 2734 if_idx++; 2735 } 2736 2737 wp_idx++; 2738 } 2739 out: 2740 cb->args[0] = wp_idx; 2741 cb->args[1] = if_idx; 2742 2743 ret = skb->len; 2744 out_unlock: 2745 rtnl_unlock(); 2746 2747 return ret; 2748 } 2749 2750 static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info) 2751 { 2752 struct sk_buff *msg; 2753 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2754 struct wireless_dev *wdev = info->user_ptr[1]; 2755 2756 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 2757 if (!msg) 2758 return -ENOMEM; 2759 2760 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, 2761 rdev, wdev, false) < 0) { 2762 nlmsg_free(msg); 2763 return -ENOBUFS; 2764 } 2765 2766 return genlmsg_reply(msg, info); 2767 } 2768 2769 static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = { 2770 [NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG }, 2771 [NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG }, 2772 [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG }, 2773 [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG }, 2774 [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG }, 2775 [NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG }, 2776 }; 2777 2778 static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags) 2779 { 2780 struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1]; 2781 int flag; 2782 2783 *mntrflags = 0; 2784 2785 if (!nla) 2786 return -EINVAL; 2787 2788 if (nla_parse_nested(flags, NL80211_MNTR_FLAG_MAX, nla, 2789 mntr_flags_policy, NULL)) 2790 return -EINVAL; 2791 2792 for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++) 2793 if (flags[flag]) 2794 *mntrflags |= (1<<flag); 2795 2796 *mntrflags |= MONITOR_FLAG_CHANGED; 2797 2798 return 0; 2799 } 2800 2801 static int nl80211_parse_mon_options(struct cfg80211_registered_device *rdev, 2802 enum nl80211_iftype type, 2803 struct genl_info *info, 2804 struct vif_params *params) 2805 { 2806 bool change = false; 2807 int err; 2808 2809 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { 2810 if (type != NL80211_IFTYPE_MONITOR) 2811 return -EINVAL; 2812 2813 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], 2814 ¶ms->flags); 2815 if (err) 2816 return err; 2817 2818 change = true; 2819 } 2820 2821 if (params->flags & MONITOR_FLAG_ACTIVE && 2822 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) 2823 return -EOPNOTSUPP; 2824 2825 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) { 2826 const u8 *mumimo_groups; 2827 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER; 2828 2829 if (type != NL80211_IFTYPE_MONITOR) 2830 return -EINVAL; 2831 2832 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) 2833 return -EOPNOTSUPP; 2834 2835 mumimo_groups = 2836 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]); 2837 2838 /* bits 0 and 63 are reserved and must be zero */ 2839 if ((mumimo_groups[0] & BIT(0)) || 2840 (mumimo_groups[VHT_MUMIMO_GROUPS_DATA_LEN - 1] & BIT(7))) 2841 return -EINVAL; 2842 2843 params->vht_mumimo_groups = mumimo_groups; 2844 change = true; 2845 } 2846 2847 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) { 2848 u32 cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER; 2849 2850 if (type != NL80211_IFTYPE_MONITOR) 2851 return -EINVAL; 2852 2853 if (!wiphy_ext_feature_isset(&rdev->wiphy, cap_flag)) 2854 return -EOPNOTSUPP; 2855 2856 params->vht_mumimo_follow_addr = 2857 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]); 2858 change = true; 2859 } 2860 2861 return change ? 1 : 0; 2862 } 2863 2864 static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev, 2865 struct net_device *netdev, u8 use_4addr, 2866 enum nl80211_iftype iftype) 2867 { 2868 if (!use_4addr) { 2869 if (netdev && (netdev->priv_flags & IFF_BRIDGE_PORT)) 2870 return -EBUSY; 2871 return 0; 2872 } 2873 2874 switch (iftype) { 2875 case NL80211_IFTYPE_AP_VLAN: 2876 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP) 2877 return 0; 2878 break; 2879 case NL80211_IFTYPE_STATION: 2880 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION) 2881 return 0; 2882 break; 2883 default: 2884 break; 2885 } 2886 2887 return -EOPNOTSUPP; 2888 } 2889 2890 static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info) 2891 { 2892 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2893 struct vif_params params; 2894 int err; 2895 enum nl80211_iftype otype, ntype; 2896 struct net_device *dev = info->user_ptr[1]; 2897 bool change = false; 2898 2899 memset(¶ms, 0, sizeof(params)); 2900 2901 otype = ntype = dev->ieee80211_ptr->iftype; 2902 2903 if (info->attrs[NL80211_ATTR_IFTYPE]) { 2904 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); 2905 if (otype != ntype) 2906 change = true; 2907 if (ntype > NL80211_IFTYPE_MAX) 2908 return -EINVAL; 2909 } 2910 2911 if (info->attrs[NL80211_ATTR_MESH_ID]) { 2912 struct wireless_dev *wdev = dev->ieee80211_ptr; 2913 2914 if (ntype != NL80211_IFTYPE_MESH_POINT) 2915 return -EINVAL; 2916 if (netif_running(dev)) 2917 return -EBUSY; 2918 2919 wdev_lock(wdev); 2920 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN != 2921 IEEE80211_MAX_MESH_ID_LEN); 2922 wdev->mesh_id_up_len = 2923 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 2924 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]), 2925 wdev->mesh_id_up_len); 2926 wdev_unlock(wdev); 2927 } 2928 2929 if (info->attrs[NL80211_ATTR_4ADDR]) { 2930 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); 2931 change = true; 2932 err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype); 2933 if (err) 2934 return err; 2935 } else { 2936 params.use_4addr = -1; 2937 } 2938 2939 err = nl80211_parse_mon_options(rdev, ntype, info, ¶ms); 2940 if (err < 0) 2941 return err; 2942 if (err > 0) 2943 change = true; 2944 2945 if (change) 2946 err = cfg80211_change_iface(rdev, dev, ntype, ¶ms); 2947 else 2948 err = 0; 2949 2950 if (!err && params.use_4addr != -1) 2951 dev->ieee80211_ptr->use_4addr = params.use_4addr; 2952 2953 return err; 2954 } 2955 2956 static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) 2957 { 2958 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2959 struct vif_params params; 2960 struct wireless_dev *wdev; 2961 struct sk_buff *msg; 2962 int err; 2963 enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED; 2964 2965 /* to avoid failing a new interface creation due to pending removal */ 2966 cfg80211_destroy_ifaces(rdev); 2967 2968 memset(¶ms, 0, sizeof(params)); 2969 2970 if (!info->attrs[NL80211_ATTR_IFNAME]) 2971 return -EINVAL; 2972 2973 if (info->attrs[NL80211_ATTR_IFTYPE]) { 2974 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); 2975 if (type > NL80211_IFTYPE_MAX) 2976 return -EINVAL; 2977 } 2978 2979 if (!rdev->ops->add_virtual_intf || 2980 !(rdev->wiphy.interface_modes & (1 << type))) 2981 return -EOPNOTSUPP; 2982 2983 if ((type == NL80211_IFTYPE_P2P_DEVICE || type == NL80211_IFTYPE_NAN || 2984 rdev->wiphy.features & NL80211_FEATURE_MAC_ON_CREATE) && 2985 info->attrs[NL80211_ATTR_MAC]) { 2986 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], 2987 ETH_ALEN); 2988 if (!is_valid_ether_addr(params.macaddr)) 2989 return -EADDRNOTAVAIL; 2990 } 2991 2992 if (info->attrs[NL80211_ATTR_4ADDR]) { 2993 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); 2994 err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type); 2995 if (err) 2996 return err; 2997 } 2998 2999 err = nl80211_parse_mon_options(rdev, type, info, ¶ms); 3000 if (err < 0) 3001 return err; 3002 3003 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 3004 if (!msg) 3005 return -ENOMEM; 3006 3007 wdev = rdev_add_virtual_intf(rdev, 3008 nla_data(info->attrs[NL80211_ATTR_IFNAME]), 3009 NET_NAME_USER, type, ¶ms); 3010 if (WARN_ON(!wdev)) { 3011 nlmsg_free(msg); 3012 return -EPROTO; 3013 } else if (IS_ERR(wdev)) { 3014 nlmsg_free(msg); 3015 return PTR_ERR(wdev); 3016 } 3017 3018 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 3019 wdev->owner_nlportid = info->snd_portid; 3020 3021 switch (type) { 3022 case NL80211_IFTYPE_MESH_POINT: 3023 if (!info->attrs[NL80211_ATTR_MESH_ID]) 3024 break; 3025 wdev_lock(wdev); 3026 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN != 3027 IEEE80211_MAX_MESH_ID_LEN); 3028 wdev->mesh_id_up_len = 3029 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 3030 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]), 3031 wdev->mesh_id_up_len); 3032 wdev_unlock(wdev); 3033 break; 3034 case NL80211_IFTYPE_NAN: 3035 case NL80211_IFTYPE_P2P_DEVICE: 3036 /* 3037 * P2P Device and NAN do not have a netdev, so don't go 3038 * through the netdev notifier and must be added here 3039 */ 3040 mutex_init(&wdev->mtx); 3041 INIT_LIST_HEAD(&wdev->event_list); 3042 spin_lock_init(&wdev->event_lock); 3043 INIT_LIST_HEAD(&wdev->mgmt_registrations); 3044 spin_lock_init(&wdev->mgmt_registrations_lock); 3045 3046 wdev->identifier = ++rdev->wdev_id; 3047 list_add_rcu(&wdev->list, &rdev->wiphy.wdev_list); 3048 rdev->devlist_generation++; 3049 break; 3050 default: 3051 break; 3052 } 3053 3054 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, 3055 rdev, wdev, false) < 0) { 3056 nlmsg_free(msg); 3057 return -ENOBUFS; 3058 } 3059 3060 /* 3061 * For wdevs which have no associated netdev object (e.g. of type 3062 * NL80211_IFTYPE_P2P_DEVICE), emit the NEW_INTERFACE event here. 3063 * For all other types, the event will be generated from the 3064 * netdev notifier 3065 */ 3066 if (!wdev->netdev) 3067 nl80211_notify_iface(rdev, wdev, NL80211_CMD_NEW_INTERFACE); 3068 3069 return genlmsg_reply(msg, info); 3070 } 3071 3072 static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info) 3073 { 3074 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3075 struct wireless_dev *wdev = info->user_ptr[1]; 3076 3077 if (!rdev->ops->del_virtual_intf) 3078 return -EOPNOTSUPP; 3079 3080 /* 3081 * If we remove a wireless device without a netdev then clear 3082 * user_ptr[1] so that nl80211_post_doit won't dereference it 3083 * to check if it needs to do dev_put(). Otherwise it crashes 3084 * since the wdev has been freed, unlike with a netdev where 3085 * we need the dev_put() for the netdev to really be freed. 3086 */ 3087 if (!wdev->netdev) 3088 info->user_ptr[1] = NULL; 3089 3090 return rdev_del_virtual_intf(rdev, wdev); 3091 } 3092 3093 static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info) 3094 { 3095 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3096 struct net_device *dev = info->user_ptr[1]; 3097 u16 noack_map; 3098 3099 if (!info->attrs[NL80211_ATTR_NOACK_MAP]) 3100 return -EINVAL; 3101 3102 if (!rdev->ops->set_noack_map) 3103 return -EOPNOTSUPP; 3104 3105 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]); 3106 3107 return rdev_set_noack_map(rdev, dev, noack_map); 3108 } 3109 3110 struct get_key_cookie { 3111 struct sk_buff *msg; 3112 int error; 3113 int idx; 3114 }; 3115 3116 static void get_key_callback(void *c, struct key_params *params) 3117 { 3118 struct nlattr *key; 3119 struct get_key_cookie *cookie = c; 3120 3121 if ((params->key && 3122 nla_put(cookie->msg, NL80211_ATTR_KEY_DATA, 3123 params->key_len, params->key)) || 3124 (params->seq && 3125 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ, 3126 params->seq_len, params->seq)) || 3127 (params->cipher && 3128 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER, 3129 params->cipher))) 3130 goto nla_put_failure; 3131 3132 key = nla_nest_start(cookie->msg, NL80211_ATTR_KEY); 3133 if (!key) 3134 goto nla_put_failure; 3135 3136 if ((params->key && 3137 nla_put(cookie->msg, NL80211_KEY_DATA, 3138 params->key_len, params->key)) || 3139 (params->seq && 3140 nla_put(cookie->msg, NL80211_KEY_SEQ, 3141 params->seq_len, params->seq)) || 3142 (params->cipher && 3143 nla_put_u32(cookie->msg, NL80211_KEY_CIPHER, 3144 params->cipher))) 3145 goto nla_put_failure; 3146 3147 if (nla_put_u8(cookie->msg, NL80211_ATTR_KEY_IDX, cookie->idx)) 3148 goto nla_put_failure; 3149 3150 nla_nest_end(cookie->msg, key); 3151 3152 return; 3153 nla_put_failure: 3154 cookie->error = 1; 3155 } 3156 3157 static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) 3158 { 3159 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3160 int err; 3161 struct net_device *dev = info->user_ptr[1]; 3162 u8 key_idx = 0; 3163 const u8 *mac_addr = NULL; 3164 bool pairwise; 3165 struct get_key_cookie cookie = { 3166 .error = 0, 3167 }; 3168 void *hdr; 3169 struct sk_buff *msg; 3170 3171 if (info->attrs[NL80211_ATTR_KEY_IDX]) 3172 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); 3173 3174 if (key_idx > 5) 3175 return -EINVAL; 3176 3177 if (info->attrs[NL80211_ATTR_MAC]) 3178 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 3179 3180 pairwise = !!mac_addr; 3181 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { 3182 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); 3183 3184 if (kt >= NUM_NL80211_KEYTYPES) 3185 return -EINVAL; 3186 if (kt != NL80211_KEYTYPE_GROUP && 3187 kt != NL80211_KEYTYPE_PAIRWISE) 3188 return -EINVAL; 3189 pairwise = kt == NL80211_KEYTYPE_PAIRWISE; 3190 } 3191 3192 if (!rdev->ops->get_key) 3193 return -EOPNOTSUPP; 3194 3195 if (!pairwise && mac_addr && !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) 3196 return -ENOENT; 3197 3198 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 3199 if (!msg) 3200 return -ENOMEM; 3201 3202 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 3203 NL80211_CMD_NEW_KEY); 3204 if (!hdr) 3205 goto nla_put_failure; 3206 3207 cookie.msg = msg; 3208 cookie.idx = key_idx; 3209 3210 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 3211 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_idx)) 3212 goto nla_put_failure; 3213 if (mac_addr && 3214 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr)) 3215 goto nla_put_failure; 3216 3217 err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie, 3218 get_key_callback); 3219 3220 if (err) 3221 goto free_msg; 3222 3223 if (cookie.error) 3224 goto nla_put_failure; 3225 3226 genlmsg_end(msg, hdr); 3227 return genlmsg_reply(msg, info); 3228 3229 nla_put_failure: 3230 err = -ENOBUFS; 3231 free_msg: 3232 nlmsg_free(msg); 3233 return err; 3234 } 3235 3236 static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info) 3237 { 3238 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3239 struct key_parse key; 3240 int err; 3241 struct net_device *dev = info->user_ptr[1]; 3242 3243 err = nl80211_parse_key(info, &key); 3244 if (err) 3245 return err; 3246 3247 if (key.idx < 0) 3248 return -EINVAL; 3249 3250 /* only support setting default key */ 3251 if (!key.def && !key.defmgmt) 3252 return -EINVAL; 3253 3254 wdev_lock(dev->ieee80211_ptr); 3255 3256 if (key.def) { 3257 if (!rdev->ops->set_default_key) { 3258 err = -EOPNOTSUPP; 3259 goto out; 3260 } 3261 3262 err = nl80211_key_allowed(dev->ieee80211_ptr); 3263 if (err) 3264 goto out; 3265 3266 err = rdev_set_default_key(rdev, dev, key.idx, 3267 key.def_uni, key.def_multi); 3268 3269 if (err) 3270 goto out; 3271 3272 #ifdef CONFIG_CFG80211_WEXT 3273 dev->ieee80211_ptr->wext.default_key = key.idx; 3274 #endif 3275 } else { 3276 if (key.def_uni || !key.def_multi) { 3277 err = -EINVAL; 3278 goto out; 3279 } 3280 3281 if (!rdev->ops->set_default_mgmt_key) { 3282 err = -EOPNOTSUPP; 3283 goto out; 3284 } 3285 3286 err = nl80211_key_allowed(dev->ieee80211_ptr); 3287 if (err) 3288 goto out; 3289 3290 err = rdev_set_default_mgmt_key(rdev, dev, key.idx); 3291 if (err) 3292 goto out; 3293 3294 #ifdef CONFIG_CFG80211_WEXT 3295 dev->ieee80211_ptr->wext.default_mgmt_key = key.idx; 3296 #endif 3297 } 3298 3299 out: 3300 wdev_unlock(dev->ieee80211_ptr); 3301 3302 return err; 3303 } 3304 3305 static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info) 3306 { 3307 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3308 int err; 3309 struct net_device *dev = info->user_ptr[1]; 3310 struct key_parse key; 3311 const u8 *mac_addr = NULL; 3312 3313 err = nl80211_parse_key(info, &key); 3314 if (err) 3315 return err; 3316 3317 if (!key.p.key) 3318 return -EINVAL; 3319 3320 if (info->attrs[NL80211_ATTR_MAC]) 3321 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 3322 3323 if (key.type == -1) { 3324 if (mac_addr) 3325 key.type = NL80211_KEYTYPE_PAIRWISE; 3326 else 3327 key.type = NL80211_KEYTYPE_GROUP; 3328 } 3329 3330 /* for now */ 3331 if (key.type != NL80211_KEYTYPE_PAIRWISE && 3332 key.type != NL80211_KEYTYPE_GROUP) 3333 return -EINVAL; 3334 3335 if (!rdev->ops->add_key) 3336 return -EOPNOTSUPP; 3337 3338 if (cfg80211_validate_key_settings(rdev, &key.p, key.idx, 3339 key.type == NL80211_KEYTYPE_PAIRWISE, 3340 mac_addr)) 3341 return -EINVAL; 3342 3343 wdev_lock(dev->ieee80211_ptr); 3344 err = nl80211_key_allowed(dev->ieee80211_ptr); 3345 if (!err) 3346 err = rdev_add_key(rdev, dev, key.idx, 3347 key.type == NL80211_KEYTYPE_PAIRWISE, 3348 mac_addr, &key.p); 3349 wdev_unlock(dev->ieee80211_ptr); 3350 3351 return err; 3352 } 3353 3354 static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info) 3355 { 3356 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3357 int err; 3358 struct net_device *dev = info->user_ptr[1]; 3359 u8 *mac_addr = NULL; 3360 struct key_parse key; 3361 3362 err = nl80211_parse_key(info, &key); 3363 if (err) 3364 return err; 3365 3366 if (info->attrs[NL80211_ATTR_MAC]) 3367 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 3368 3369 if (key.type == -1) { 3370 if (mac_addr) 3371 key.type = NL80211_KEYTYPE_PAIRWISE; 3372 else 3373 key.type = NL80211_KEYTYPE_GROUP; 3374 } 3375 3376 /* for now */ 3377 if (key.type != NL80211_KEYTYPE_PAIRWISE && 3378 key.type != NL80211_KEYTYPE_GROUP) 3379 return -EINVAL; 3380 3381 if (!rdev->ops->del_key) 3382 return -EOPNOTSUPP; 3383 3384 wdev_lock(dev->ieee80211_ptr); 3385 err = nl80211_key_allowed(dev->ieee80211_ptr); 3386 3387 if (key.type == NL80211_KEYTYPE_GROUP && mac_addr && 3388 !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) 3389 err = -ENOENT; 3390 3391 if (!err) 3392 err = rdev_del_key(rdev, dev, key.idx, 3393 key.type == NL80211_KEYTYPE_PAIRWISE, 3394 mac_addr); 3395 3396 #ifdef CONFIG_CFG80211_WEXT 3397 if (!err) { 3398 if (key.idx == dev->ieee80211_ptr->wext.default_key) 3399 dev->ieee80211_ptr->wext.default_key = -1; 3400 else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key) 3401 dev->ieee80211_ptr->wext.default_mgmt_key = -1; 3402 } 3403 #endif 3404 wdev_unlock(dev->ieee80211_ptr); 3405 3406 return err; 3407 } 3408 3409 /* This function returns an error or the number of nested attributes */ 3410 static int validate_acl_mac_addrs(struct nlattr *nl_attr) 3411 { 3412 struct nlattr *attr; 3413 int n_entries = 0, tmp; 3414 3415 nla_for_each_nested(attr, nl_attr, tmp) { 3416 if (nla_len(attr) != ETH_ALEN) 3417 return -EINVAL; 3418 3419 n_entries++; 3420 } 3421 3422 return n_entries; 3423 } 3424 3425 /* 3426 * This function parses ACL information and allocates memory for ACL data. 3427 * On successful return, the calling function is responsible to free the 3428 * ACL buffer returned by this function. 3429 */ 3430 static struct cfg80211_acl_data *parse_acl_data(struct wiphy *wiphy, 3431 struct genl_info *info) 3432 { 3433 enum nl80211_acl_policy acl_policy; 3434 struct nlattr *attr; 3435 struct cfg80211_acl_data *acl; 3436 int i = 0, n_entries, tmp; 3437 3438 if (!wiphy->max_acl_mac_addrs) 3439 return ERR_PTR(-EOPNOTSUPP); 3440 3441 if (!info->attrs[NL80211_ATTR_ACL_POLICY]) 3442 return ERR_PTR(-EINVAL); 3443 3444 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]); 3445 if (acl_policy != NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED && 3446 acl_policy != NL80211_ACL_POLICY_DENY_UNLESS_LISTED) 3447 return ERR_PTR(-EINVAL); 3448 3449 if (!info->attrs[NL80211_ATTR_MAC_ADDRS]) 3450 return ERR_PTR(-EINVAL); 3451 3452 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]); 3453 if (n_entries < 0) 3454 return ERR_PTR(n_entries); 3455 3456 if (n_entries > wiphy->max_acl_mac_addrs) 3457 return ERR_PTR(-ENOTSUPP); 3458 3459 acl = kzalloc(sizeof(*acl) + (sizeof(struct mac_address) * n_entries), 3460 GFP_KERNEL); 3461 if (!acl) 3462 return ERR_PTR(-ENOMEM); 3463 3464 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { 3465 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); 3466 i++; 3467 } 3468 3469 acl->n_acl_entries = n_entries; 3470 acl->acl_policy = acl_policy; 3471 3472 return acl; 3473 } 3474 3475 static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info) 3476 { 3477 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3478 struct net_device *dev = info->user_ptr[1]; 3479 struct cfg80211_acl_data *acl; 3480 int err; 3481 3482 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 3483 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 3484 return -EOPNOTSUPP; 3485 3486 if (!dev->ieee80211_ptr->beacon_interval) 3487 return -EINVAL; 3488 3489 acl = parse_acl_data(&rdev->wiphy, info); 3490 if (IS_ERR(acl)) 3491 return PTR_ERR(acl); 3492 3493 err = rdev_set_mac_acl(rdev, dev, acl); 3494 3495 kfree(acl); 3496 3497 return err; 3498 } 3499 3500 static u32 rateset_to_mask(struct ieee80211_supported_band *sband, 3501 u8 *rates, u8 rates_len) 3502 { 3503 u8 i; 3504 u32 mask = 0; 3505 3506 for (i = 0; i < rates_len; i++) { 3507 int rate = (rates[i] & 0x7f) * 5; 3508 int ridx; 3509 3510 for (ridx = 0; ridx < sband->n_bitrates; ridx++) { 3511 struct ieee80211_rate *srate = 3512 &sband->bitrates[ridx]; 3513 if (rate == srate->bitrate) { 3514 mask |= 1 << ridx; 3515 break; 3516 } 3517 } 3518 if (ridx == sband->n_bitrates) 3519 return 0; /* rate not found */ 3520 } 3521 3522 return mask; 3523 } 3524 3525 static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband, 3526 u8 *rates, u8 rates_len, 3527 u8 mcs[IEEE80211_HT_MCS_MASK_LEN]) 3528 { 3529 u8 i; 3530 3531 memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN); 3532 3533 for (i = 0; i < rates_len; i++) { 3534 int ridx, rbit; 3535 3536 ridx = rates[i] / 8; 3537 rbit = BIT(rates[i] % 8); 3538 3539 /* check validity */ 3540 if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN)) 3541 return false; 3542 3543 /* check availability */ 3544 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) 3545 mcs[ridx] |= rbit; 3546 else 3547 return false; 3548 } 3549 3550 return true; 3551 } 3552 3553 static u16 vht_mcs_map_to_mcs_mask(u8 vht_mcs_map) 3554 { 3555 u16 mcs_mask = 0; 3556 3557 switch (vht_mcs_map) { 3558 case IEEE80211_VHT_MCS_NOT_SUPPORTED: 3559 break; 3560 case IEEE80211_VHT_MCS_SUPPORT_0_7: 3561 mcs_mask = 0x00FF; 3562 break; 3563 case IEEE80211_VHT_MCS_SUPPORT_0_8: 3564 mcs_mask = 0x01FF; 3565 break; 3566 case IEEE80211_VHT_MCS_SUPPORT_0_9: 3567 mcs_mask = 0x03FF; 3568 break; 3569 default: 3570 break; 3571 } 3572 3573 return mcs_mask; 3574 } 3575 3576 static void vht_build_mcs_mask(u16 vht_mcs_map, 3577 u16 vht_mcs_mask[NL80211_VHT_NSS_MAX]) 3578 { 3579 u8 nss; 3580 3581 for (nss = 0; nss < NL80211_VHT_NSS_MAX; nss++) { 3582 vht_mcs_mask[nss] = vht_mcs_map_to_mcs_mask(vht_mcs_map & 0x03); 3583 vht_mcs_map >>= 2; 3584 } 3585 } 3586 3587 static bool vht_set_mcs_mask(struct ieee80211_supported_band *sband, 3588 struct nl80211_txrate_vht *txrate, 3589 u16 mcs[NL80211_VHT_NSS_MAX]) 3590 { 3591 u16 tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 3592 u16 tx_mcs_mask[NL80211_VHT_NSS_MAX] = {}; 3593 u8 i; 3594 3595 if (!sband->vht_cap.vht_supported) 3596 return false; 3597 3598 memset(mcs, 0, sizeof(u16) * NL80211_VHT_NSS_MAX); 3599 3600 /* Build vht_mcs_mask from VHT capabilities */ 3601 vht_build_mcs_mask(tx_mcs_map, tx_mcs_mask); 3602 3603 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 3604 if ((tx_mcs_mask[i] & txrate->mcs[i]) == txrate->mcs[i]) 3605 mcs[i] = txrate->mcs[i]; 3606 else 3607 return false; 3608 } 3609 3610 return true; 3611 } 3612 3613 static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = { 3614 [NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY, 3615 .len = NL80211_MAX_SUPP_RATES }, 3616 [NL80211_TXRATE_HT] = { .type = NLA_BINARY, 3617 .len = NL80211_MAX_SUPP_HT_RATES }, 3618 [NL80211_TXRATE_VHT] = { .len = sizeof(struct nl80211_txrate_vht)}, 3619 [NL80211_TXRATE_GI] = { .type = NLA_U8 }, 3620 }; 3621 3622 static int nl80211_parse_tx_bitrate_mask(struct genl_info *info, 3623 struct cfg80211_bitrate_mask *mask) 3624 { 3625 struct nlattr *tb[NL80211_TXRATE_MAX + 1]; 3626 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3627 int rem, i; 3628 struct nlattr *tx_rates; 3629 struct ieee80211_supported_band *sband; 3630 u16 vht_tx_mcs_map; 3631 3632 memset(mask, 0, sizeof(*mask)); 3633 /* Default to all rates enabled */ 3634 for (i = 0; i < NUM_NL80211_BANDS; i++) { 3635 sband = rdev->wiphy.bands[i]; 3636 3637 if (!sband) 3638 continue; 3639 3640 mask->control[i].legacy = (1 << sband->n_bitrates) - 1; 3641 memcpy(mask->control[i].ht_mcs, 3642 sband->ht_cap.mcs.rx_mask, 3643 sizeof(mask->control[i].ht_mcs)); 3644 3645 if (!sband->vht_cap.vht_supported) 3646 continue; 3647 3648 vht_tx_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map); 3649 vht_build_mcs_mask(vht_tx_mcs_map, mask->control[i].vht_mcs); 3650 } 3651 3652 /* if no rates are given set it back to the defaults */ 3653 if (!info->attrs[NL80211_ATTR_TX_RATES]) 3654 goto out; 3655 3656 /* The nested attribute uses enum nl80211_band as the index. This maps 3657 * directly to the enum nl80211_band values used in cfg80211. 3658 */ 3659 BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8); 3660 nla_for_each_nested(tx_rates, info->attrs[NL80211_ATTR_TX_RATES], rem) { 3661 enum nl80211_band band = nla_type(tx_rates); 3662 int err; 3663 3664 if (band < 0 || band >= NUM_NL80211_BANDS) 3665 return -EINVAL; 3666 sband = rdev->wiphy.bands[band]; 3667 if (sband == NULL) 3668 return -EINVAL; 3669 err = nla_parse_nested(tb, NL80211_TXRATE_MAX, tx_rates, 3670 nl80211_txattr_policy, info->extack); 3671 if (err) 3672 return err; 3673 if (tb[NL80211_TXRATE_LEGACY]) { 3674 mask->control[band].legacy = rateset_to_mask( 3675 sband, 3676 nla_data(tb[NL80211_TXRATE_LEGACY]), 3677 nla_len(tb[NL80211_TXRATE_LEGACY])); 3678 if ((mask->control[band].legacy == 0) && 3679 nla_len(tb[NL80211_TXRATE_LEGACY])) 3680 return -EINVAL; 3681 } 3682 if (tb[NL80211_TXRATE_HT]) { 3683 if (!ht_rateset_to_mask( 3684 sband, 3685 nla_data(tb[NL80211_TXRATE_HT]), 3686 nla_len(tb[NL80211_TXRATE_HT]), 3687 mask->control[band].ht_mcs)) 3688 return -EINVAL; 3689 } 3690 if (tb[NL80211_TXRATE_VHT]) { 3691 if (!vht_set_mcs_mask( 3692 sband, 3693 nla_data(tb[NL80211_TXRATE_VHT]), 3694 mask->control[band].vht_mcs)) 3695 return -EINVAL; 3696 } 3697 if (tb[NL80211_TXRATE_GI]) { 3698 mask->control[band].gi = 3699 nla_get_u8(tb[NL80211_TXRATE_GI]); 3700 if (mask->control[band].gi > NL80211_TXRATE_FORCE_LGI) 3701 return -EINVAL; 3702 } 3703 3704 if (mask->control[band].legacy == 0) { 3705 /* don't allow empty legacy rates if HT or VHT 3706 * are not even supported. 3707 */ 3708 if (!(rdev->wiphy.bands[band]->ht_cap.ht_supported || 3709 rdev->wiphy.bands[band]->vht_cap.vht_supported)) 3710 return -EINVAL; 3711 3712 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) 3713 if (mask->control[band].ht_mcs[i]) 3714 goto out; 3715 3716 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) 3717 if (mask->control[band].vht_mcs[i]) 3718 goto out; 3719 3720 /* legacy and mcs rates may not be both empty */ 3721 return -EINVAL; 3722 } 3723 } 3724 3725 out: 3726 return 0; 3727 } 3728 3729 static int validate_beacon_tx_rate(struct cfg80211_registered_device *rdev, 3730 enum nl80211_band band, 3731 struct cfg80211_bitrate_mask *beacon_rate) 3732 { 3733 u32 count_ht, count_vht, i; 3734 u32 rate = beacon_rate->control[band].legacy; 3735 3736 /* Allow only one rate */ 3737 if (hweight32(rate) > 1) 3738 return -EINVAL; 3739 3740 count_ht = 0; 3741 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) { 3742 if (hweight8(beacon_rate->control[band].ht_mcs[i]) > 1) { 3743 return -EINVAL; 3744 } else if (beacon_rate->control[band].ht_mcs[i]) { 3745 count_ht++; 3746 if (count_ht > 1) 3747 return -EINVAL; 3748 } 3749 if (count_ht && rate) 3750 return -EINVAL; 3751 } 3752 3753 count_vht = 0; 3754 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) { 3755 if (hweight16(beacon_rate->control[band].vht_mcs[i]) > 1) { 3756 return -EINVAL; 3757 } else if (beacon_rate->control[band].vht_mcs[i]) { 3758 count_vht++; 3759 if (count_vht > 1) 3760 return -EINVAL; 3761 } 3762 if (count_vht && rate) 3763 return -EINVAL; 3764 } 3765 3766 if ((count_ht && count_vht) || (!rate && !count_ht && !count_vht)) 3767 return -EINVAL; 3768 3769 if (rate && 3770 !wiphy_ext_feature_isset(&rdev->wiphy, 3771 NL80211_EXT_FEATURE_BEACON_RATE_LEGACY)) 3772 return -EINVAL; 3773 if (count_ht && 3774 !wiphy_ext_feature_isset(&rdev->wiphy, 3775 NL80211_EXT_FEATURE_BEACON_RATE_HT)) 3776 return -EINVAL; 3777 if (count_vht && 3778 !wiphy_ext_feature_isset(&rdev->wiphy, 3779 NL80211_EXT_FEATURE_BEACON_RATE_VHT)) 3780 return -EINVAL; 3781 3782 return 0; 3783 } 3784 3785 static int nl80211_parse_beacon(struct nlattr *attrs[], 3786 struct cfg80211_beacon_data *bcn) 3787 { 3788 bool haveinfo = false; 3789 3790 if (!is_valid_ie_attr(attrs[NL80211_ATTR_BEACON_TAIL]) || 3791 !is_valid_ie_attr(attrs[NL80211_ATTR_IE]) || 3792 !is_valid_ie_attr(attrs[NL80211_ATTR_IE_PROBE_RESP]) || 3793 !is_valid_ie_attr(attrs[NL80211_ATTR_IE_ASSOC_RESP])) 3794 return -EINVAL; 3795 3796 memset(bcn, 0, sizeof(*bcn)); 3797 3798 if (attrs[NL80211_ATTR_BEACON_HEAD]) { 3799 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); 3800 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); 3801 if (!bcn->head_len) 3802 return -EINVAL; 3803 haveinfo = true; 3804 } 3805 3806 if (attrs[NL80211_ATTR_BEACON_TAIL]) { 3807 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]); 3808 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]); 3809 haveinfo = true; 3810 } 3811 3812 if (!haveinfo) 3813 return -EINVAL; 3814 3815 if (attrs[NL80211_ATTR_IE]) { 3816 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]); 3817 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]); 3818 } 3819 3820 if (attrs[NL80211_ATTR_IE_PROBE_RESP]) { 3821 bcn->proberesp_ies = 3822 nla_data(attrs[NL80211_ATTR_IE_PROBE_RESP]); 3823 bcn->proberesp_ies_len = 3824 nla_len(attrs[NL80211_ATTR_IE_PROBE_RESP]); 3825 } 3826 3827 if (attrs[NL80211_ATTR_IE_ASSOC_RESP]) { 3828 bcn->assocresp_ies = 3829 nla_data(attrs[NL80211_ATTR_IE_ASSOC_RESP]); 3830 bcn->assocresp_ies_len = 3831 nla_len(attrs[NL80211_ATTR_IE_ASSOC_RESP]); 3832 } 3833 3834 if (attrs[NL80211_ATTR_PROBE_RESP]) { 3835 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]); 3836 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]); 3837 } 3838 3839 return 0; 3840 } 3841 3842 static void nl80211_check_ap_rate_selectors(struct cfg80211_ap_settings *params, 3843 const u8 *rates) 3844 { 3845 int i; 3846 3847 if (!rates) 3848 return; 3849 3850 for (i = 0; i < rates[1]; i++) { 3851 if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_HT_PHY) 3852 params->ht_required = true; 3853 if (rates[2 + i] == BSS_MEMBERSHIP_SELECTOR_VHT_PHY) 3854 params->vht_required = true; 3855 } 3856 } 3857 3858 /* 3859 * Since the nl80211 API didn't include, from the beginning, attributes about 3860 * HT/VHT requirements/capabilities, we parse them out of the IEs for the 3861 * benefit of drivers that rebuild IEs in the firmware. 3862 */ 3863 static void nl80211_calculate_ap_params(struct cfg80211_ap_settings *params) 3864 { 3865 const struct cfg80211_beacon_data *bcn = ¶ms->beacon; 3866 size_t ies_len = bcn->tail_len; 3867 const u8 *ies = bcn->tail; 3868 const u8 *rates; 3869 const u8 *cap; 3870 3871 rates = cfg80211_find_ie(WLAN_EID_SUPP_RATES, ies, ies_len); 3872 nl80211_check_ap_rate_selectors(params, rates); 3873 3874 rates = cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES, ies, ies_len); 3875 nl80211_check_ap_rate_selectors(params, rates); 3876 3877 cap = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, ies, ies_len); 3878 if (cap && cap[1] >= sizeof(*params->ht_cap)) 3879 params->ht_cap = (void *)(cap + 2); 3880 cap = cfg80211_find_ie(WLAN_EID_VHT_CAPABILITY, ies, ies_len); 3881 if (cap && cap[1] >= sizeof(*params->vht_cap)) 3882 params->vht_cap = (void *)(cap + 2); 3883 } 3884 3885 static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev, 3886 struct cfg80211_ap_settings *params) 3887 { 3888 struct wireless_dev *wdev; 3889 bool ret = false; 3890 3891 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 3892 if (wdev->iftype != NL80211_IFTYPE_AP && 3893 wdev->iftype != NL80211_IFTYPE_P2P_GO) 3894 continue; 3895 3896 if (!wdev->preset_chandef.chan) 3897 continue; 3898 3899 params->chandef = wdev->preset_chandef; 3900 ret = true; 3901 break; 3902 } 3903 3904 return ret; 3905 } 3906 3907 static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev, 3908 enum nl80211_auth_type auth_type, 3909 enum nl80211_commands cmd) 3910 { 3911 if (auth_type > NL80211_AUTHTYPE_MAX) 3912 return false; 3913 3914 switch (cmd) { 3915 case NL80211_CMD_AUTHENTICATE: 3916 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && 3917 auth_type == NL80211_AUTHTYPE_SAE) 3918 return false; 3919 if (!wiphy_ext_feature_isset(&rdev->wiphy, 3920 NL80211_EXT_FEATURE_FILS_STA) && 3921 (auth_type == NL80211_AUTHTYPE_FILS_SK || 3922 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 3923 auth_type == NL80211_AUTHTYPE_FILS_PK)) 3924 return false; 3925 return true; 3926 case NL80211_CMD_CONNECT: 3927 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && 3928 auth_type == NL80211_AUTHTYPE_SAE) 3929 return false; 3930 3931 /* FILS with SK PFS or PK not supported yet */ 3932 if (auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 3933 auth_type == NL80211_AUTHTYPE_FILS_PK) 3934 return false; 3935 if (!wiphy_ext_feature_isset( 3936 &rdev->wiphy, 3937 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) && 3938 auth_type == NL80211_AUTHTYPE_FILS_SK) 3939 return false; 3940 return true; 3941 case NL80211_CMD_START_AP: 3942 /* SAE not supported yet */ 3943 if (auth_type == NL80211_AUTHTYPE_SAE) 3944 return false; 3945 /* FILS not supported yet */ 3946 if (auth_type == NL80211_AUTHTYPE_FILS_SK || 3947 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 3948 auth_type == NL80211_AUTHTYPE_FILS_PK) 3949 return false; 3950 return true; 3951 default: 3952 return false; 3953 } 3954 } 3955 3956 static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) 3957 { 3958 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3959 struct net_device *dev = info->user_ptr[1]; 3960 struct wireless_dev *wdev = dev->ieee80211_ptr; 3961 struct cfg80211_ap_settings params; 3962 int err; 3963 3964 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 3965 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 3966 return -EOPNOTSUPP; 3967 3968 if (!rdev->ops->start_ap) 3969 return -EOPNOTSUPP; 3970 3971 if (wdev->beacon_interval) 3972 return -EALREADY; 3973 3974 memset(¶ms, 0, sizeof(params)); 3975 3976 /* these are required for START_AP */ 3977 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] || 3978 !info->attrs[NL80211_ATTR_DTIM_PERIOD] || 3979 !info->attrs[NL80211_ATTR_BEACON_HEAD]) 3980 return -EINVAL; 3981 3982 err = nl80211_parse_beacon(info->attrs, ¶ms.beacon); 3983 if (err) 3984 return err; 3985 3986 params.beacon_interval = 3987 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 3988 params.dtim_period = 3989 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 3990 3991 err = cfg80211_validate_beacon_int(rdev, dev->ieee80211_ptr->iftype, 3992 params.beacon_interval); 3993 if (err) 3994 return err; 3995 3996 /* 3997 * In theory, some of these attributes should be required here 3998 * but since they were not used when the command was originally 3999 * added, keep them optional for old user space programs to let 4000 * them continue to work with drivers that do not need the 4001 * additional information -- drivers must check! 4002 */ 4003 if (info->attrs[NL80211_ATTR_SSID]) { 4004 params.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 4005 params.ssid_len = 4006 nla_len(info->attrs[NL80211_ATTR_SSID]); 4007 if (params.ssid_len == 0 || 4008 params.ssid_len > IEEE80211_MAX_SSID_LEN) 4009 return -EINVAL; 4010 } 4011 4012 if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) { 4013 params.hidden_ssid = nla_get_u32( 4014 info->attrs[NL80211_ATTR_HIDDEN_SSID]); 4015 if (params.hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE && 4016 params.hidden_ssid != NL80211_HIDDEN_SSID_ZERO_LEN && 4017 params.hidden_ssid != NL80211_HIDDEN_SSID_ZERO_CONTENTS) 4018 return -EINVAL; 4019 } 4020 4021 params.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 4022 4023 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 4024 params.auth_type = nla_get_u32( 4025 info->attrs[NL80211_ATTR_AUTH_TYPE]); 4026 if (!nl80211_valid_auth_type(rdev, params.auth_type, 4027 NL80211_CMD_START_AP)) 4028 return -EINVAL; 4029 } else 4030 params.auth_type = NL80211_AUTHTYPE_AUTOMATIC; 4031 4032 err = nl80211_crypto_settings(rdev, info, ¶ms.crypto, 4033 NL80211_MAX_NR_CIPHER_SUITES); 4034 if (err) 4035 return err; 4036 4037 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) { 4038 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) 4039 return -EOPNOTSUPP; 4040 params.inactivity_timeout = nla_get_u16( 4041 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]); 4042 } 4043 4044 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 4045 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4046 return -EINVAL; 4047 params.p2p_ctwindow = 4048 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 4049 if (params.p2p_ctwindow > 127) 4050 return -EINVAL; 4051 if (params.p2p_ctwindow != 0 && 4052 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) 4053 return -EINVAL; 4054 } 4055 4056 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 4057 u8 tmp; 4058 4059 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4060 return -EINVAL; 4061 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 4062 if (tmp > 1) 4063 return -EINVAL; 4064 params.p2p_opp_ps = tmp; 4065 if (params.p2p_opp_ps != 0 && 4066 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) 4067 return -EINVAL; 4068 } 4069 4070 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 4071 err = nl80211_parse_chandef(rdev, info, ¶ms.chandef); 4072 if (err) 4073 return err; 4074 } else if (wdev->preset_chandef.chan) { 4075 params.chandef = wdev->preset_chandef; 4076 } else if (!nl80211_get_ap_channel(rdev, ¶ms)) 4077 return -EINVAL; 4078 4079 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, 4080 wdev->iftype)) 4081 return -EINVAL; 4082 4083 if (info->attrs[NL80211_ATTR_TX_RATES]) { 4084 err = nl80211_parse_tx_bitrate_mask(info, ¶ms.beacon_rate); 4085 if (err) 4086 return err; 4087 4088 err = validate_beacon_tx_rate(rdev, params.chandef.chan->band, 4089 ¶ms.beacon_rate); 4090 if (err) 4091 return err; 4092 } 4093 4094 if (info->attrs[NL80211_ATTR_SMPS_MODE]) { 4095 params.smps_mode = 4096 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]); 4097 switch (params.smps_mode) { 4098 case NL80211_SMPS_OFF: 4099 break; 4100 case NL80211_SMPS_STATIC: 4101 if (!(rdev->wiphy.features & 4102 NL80211_FEATURE_STATIC_SMPS)) 4103 return -EINVAL; 4104 break; 4105 case NL80211_SMPS_DYNAMIC: 4106 if (!(rdev->wiphy.features & 4107 NL80211_FEATURE_DYNAMIC_SMPS)) 4108 return -EINVAL; 4109 break; 4110 default: 4111 return -EINVAL; 4112 } 4113 } else { 4114 params.smps_mode = NL80211_SMPS_OFF; 4115 } 4116 4117 params.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); 4118 if (params.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) 4119 return -EOPNOTSUPP; 4120 4121 if (info->attrs[NL80211_ATTR_ACL_POLICY]) { 4122 params.acl = parse_acl_data(&rdev->wiphy, info); 4123 if (IS_ERR(params.acl)) 4124 return PTR_ERR(params.acl); 4125 } 4126 4127 nl80211_calculate_ap_params(¶ms); 4128 4129 wdev_lock(wdev); 4130 err = rdev_start_ap(rdev, dev, ¶ms); 4131 if (!err) { 4132 wdev->preset_chandef = params.chandef; 4133 wdev->beacon_interval = params.beacon_interval; 4134 wdev->chandef = params.chandef; 4135 wdev->ssid_len = params.ssid_len; 4136 memcpy(wdev->ssid, params.ssid, wdev->ssid_len); 4137 } 4138 wdev_unlock(wdev); 4139 4140 kfree(params.acl); 4141 4142 return err; 4143 } 4144 4145 static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info) 4146 { 4147 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4148 struct net_device *dev = info->user_ptr[1]; 4149 struct wireless_dev *wdev = dev->ieee80211_ptr; 4150 struct cfg80211_beacon_data params; 4151 int err; 4152 4153 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 4154 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4155 return -EOPNOTSUPP; 4156 4157 if (!rdev->ops->change_beacon) 4158 return -EOPNOTSUPP; 4159 4160 if (!wdev->beacon_interval) 4161 return -EINVAL; 4162 4163 err = nl80211_parse_beacon(info->attrs, ¶ms); 4164 if (err) 4165 return err; 4166 4167 wdev_lock(wdev); 4168 err = rdev_change_beacon(rdev, dev, ¶ms); 4169 wdev_unlock(wdev); 4170 4171 return err; 4172 } 4173 4174 static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info) 4175 { 4176 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4177 struct net_device *dev = info->user_ptr[1]; 4178 4179 return cfg80211_stop_ap(rdev, dev, false); 4180 } 4181 4182 static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = { 4183 [NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG }, 4184 [NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG }, 4185 [NL80211_STA_FLAG_WME] = { .type = NLA_FLAG }, 4186 [NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG }, 4187 [NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG }, 4188 [NL80211_STA_FLAG_TDLS_PEER] = { .type = NLA_FLAG }, 4189 }; 4190 4191 static int parse_station_flags(struct genl_info *info, 4192 enum nl80211_iftype iftype, 4193 struct station_parameters *params) 4194 { 4195 struct nlattr *flags[NL80211_STA_FLAG_MAX + 1]; 4196 struct nlattr *nla; 4197 int flag; 4198 4199 /* 4200 * Try parsing the new attribute first so userspace 4201 * can specify both for older kernels. 4202 */ 4203 nla = info->attrs[NL80211_ATTR_STA_FLAGS2]; 4204 if (nla) { 4205 struct nl80211_sta_flag_update *sta_flags; 4206 4207 sta_flags = nla_data(nla); 4208 params->sta_flags_mask = sta_flags->mask; 4209 params->sta_flags_set = sta_flags->set; 4210 params->sta_flags_set &= params->sta_flags_mask; 4211 if ((params->sta_flags_mask | 4212 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID)) 4213 return -EINVAL; 4214 return 0; 4215 } 4216 4217 /* if present, parse the old attribute */ 4218 4219 nla = info->attrs[NL80211_ATTR_STA_FLAGS]; 4220 if (!nla) 4221 return 0; 4222 4223 if (nla_parse_nested(flags, NL80211_STA_FLAG_MAX, nla, 4224 sta_flags_policy, info->extack)) 4225 return -EINVAL; 4226 4227 /* 4228 * Only allow certain flags for interface types so that 4229 * other attributes are silently ignored. Remember that 4230 * this is backward compatibility code with old userspace 4231 * and shouldn't be hit in other cases anyway. 4232 */ 4233 switch (iftype) { 4234 case NL80211_IFTYPE_AP: 4235 case NL80211_IFTYPE_AP_VLAN: 4236 case NL80211_IFTYPE_P2P_GO: 4237 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 4238 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 4239 BIT(NL80211_STA_FLAG_WME) | 4240 BIT(NL80211_STA_FLAG_MFP); 4241 break; 4242 case NL80211_IFTYPE_P2P_CLIENT: 4243 case NL80211_IFTYPE_STATION: 4244 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 4245 BIT(NL80211_STA_FLAG_TDLS_PEER); 4246 break; 4247 case NL80211_IFTYPE_MESH_POINT: 4248 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | 4249 BIT(NL80211_STA_FLAG_MFP) | 4250 BIT(NL80211_STA_FLAG_AUTHORIZED); 4251 default: 4252 return -EINVAL; 4253 } 4254 4255 for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++) { 4256 if (flags[flag]) { 4257 params->sta_flags_set |= (1<<flag); 4258 4259 /* no longer support new API additions in old API */ 4260 if (flag > NL80211_STA_FLAG_MAX_OLD_API) 4261 return -EINVAL; 4262 } 4263 } 4264 4265 return 0; 4266 } 4267 4268 static bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info, 4269 int attr) 4270 { 4271 struct nlattr *rate; 4272 u32 bitrate; 4273 u16 bitrate_compat; 4274 enum nl80211_rate_info rate_flg; 4275 4276 rate = nla_nest_start(msg, attr); 4277 if (!rate) 4278 return false; 4279 4280 /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */ 4281 bitrate = cfg80211_calculate_bitrate(info); 4282 /* report 16-bit bitrate only if we can */ 4283 bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0; 4284 if (bitrate > 0 && 4285 nla_put_u32(msg, NL80211_RATE_INFO_BITRATE32, bitrate)) 4286 return false; 4287 if (bitrate_compat > 0 && 4288 nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat)) 4289 return false; 4290 4291 switch (info->bw) { 4292 case RATE_INFO_BW_5: 4293 rate_flg = NL80211_RATE_INFO_5_MHZ_WIDTH; 4294 break; 4295 case RATE_INFO_BW_10: 4296 rate_flg = NL80211_RATE_INFO_10_MHZ_WIDTH; 4297 break; 4298 default: 4299 WARN_ON(1); 4300 /* fall through */ 4301 case RATE_INFO_BW_20: 4302 rate_flg = 0; 4303 break; 4304 case RATE_INFO_BW_40: 4305 rate_flg = NL80211_RATE_INFO_40_MHZ_WIDTH; 4306 break; 4307 case RATE_INFO_BW_80: 4308 rate_flg = NL80211_RATE_INFO_80_MHZ_WIDTH; 4309 break; 4310 case RATE_INFO_BW_160: 4311 rate_flg = NL80211_RATE_INFO_160_MHZ_WIDTH; 4312 break; 4313 } 4314 4315 if (rate_flg && nla_put_flag(msg, rate_flg)) 4316 return false; 4317 4318 if (info->flags & RATE_INFO_FLAGS_MCS) { 4319 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) 4320 return false; 4321 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 4322 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 4323 return false; 4324 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) { 4325 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs)) 4326 return false; 4327 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) 4328 return false; 4329 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 4330 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 4331 return false; 4332 } 4333 4334 nla_nest_end(msg, rate); 4335 return true; 4336 } 4337 4338 static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal, 4339 int id) 4340 { 4341 void *attr; 4342 int i = 0; 4343 4344 if (!mask) 4345 return true; 4346 4347 attr = nla_nest_start(msg, id); 4348 if (!attr) 4349 return false; 4350 4351 for (i = 0; i < IEEE80211_MAX_CHAINS; i++) { 4352 if (!(mask & BIT(i))) 4353 continue; 4354 4355 if (nla_put_u8(msg, i, signal[i])) 4356 return false; 4357 } 4358 4359 nla_nest_end(msg, attr); 4360 4361 return true; 4362 } 4363 4364 static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid, 4365 u32 seq, int flags, 4366 struct cfg80211_registered_device *rdev, 4367 struct net_device *dev, 4368 const u8 *mac_addr, struct station_info *sinfo) 4369 { 4370 void *hdr; 4371 struct nlattr *sinfoattr, *bss_param; 4372 4373 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 4374 if (!hdr) 4375 return -1; 4376 4377 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 4378 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 4379 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation)) 4380 goto nla_put_failure; 4381 4382 sinfoattr = nla_nest_start(msg, NL80211_ATTR_STA_INFO); 4383 if (!sinfoattr) 4384 goto nla_put_failure; 4385 4386 #define PUT_SINFO(attr, memb, type) do { \ 4387 BUILD_BUG_ON(sizeof(type) == sizeof(u64)); \ 4388 if (sinfo->filled & (1ULL << NL80211_STA_INFO_ ## attr) && \ 4389 nla_put_ ## type(msg, NL80211_STA_INFO_ ## attr, \ 4390 sinfo->memb)) \ 4391 goto nla_put_failure; \ 4392 } while (0) 4393 #define PUT_SINFO_U64(attr, memb) do { \ 4394 if (sinfo->filled & (1ULL << NL80211_STA_INFO_ ## attr) && \ 4395 nla_put_u64_64bit(msg, NL80211_STA_INFO_ ## attr, \ 4396 sinfo->memb, NL80211_STA_INFO_PAD)) \ 4397 goto nla_put_failure; \ 4398 } while (0) 4399 4400 PUT_SINFO(CONNECTED_TIME, connected_time, u32); 4401 PUT_SINFO(INACTIVE_TIME, inactive_time, u32); 4402 4403 if (sinfo->filled & (BIT(NL80211_STA_INFO_RX_BYTES) | 4404 BIT(NL80211_STA_INFO_RX_BYTES64)) && 4405 nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES, 4406 (u32)sinfo->rx_bytes)) 4407 goto nla_put_failure; 4408 4409 if (sinfo->filled & (BIT(NL80211_STA_INFO_TX_BYTES) | 4410 BIT(NL80211_STA_INFO_TX_BYTES64)) && 4411 nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES, 4412 (u32)sinfo->tx_bytes)) 4413 goto nla_put_failure; 4414 4415 PUT_SINFO_U64(RX_BYTES64, rx_bytes); 4416 PUT_SINFO_U64(TX_BYTES64, tx_bytes); 4417 PUT_SINFO(LLID, llid, u16); 4418 PUT_SINFO(PLID, plid, u16); 4419 PUT_SINFO(PLINK_STATE, plink_state, u8); 4420 PUT_SINFO_U64(RX_DURATION, rx_duration); 4421 4422 switch (rdev->wiphy.signal_type) { 4423 case CFG80211_SIGNAL_TYPE_MBM: 4424 PUT_SINFO(SIGNAL, signal, u8); 4425 PUT_SINFO(SIGNAL_AVG, signal_avg, u8); 4426 break; 4427 default: 4428 break; 4429 } 4430 if (sinfo->filled & BIT(NL80211_STA_INFO_CHAIN_SIGNAL)) { 4431 if (!nl80211_put_signal(msg, sinfo->chains, 4432 sinfo->chain_signal, 4433 NL80211_STA_INFO_CHAIN_SIGNAL)) 4434 goto nla_put_failure; 4435 } 4436 if (sinfo->filled & BIT(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) { 4437 if (!nl80211_put_signal(msg, sinfo->chains, 4438 sinfo->chain_signal_avg, 4439 NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) 4440 goto nla_put_failure; 4441 } 4442 if (sinfo->filled & BIT(NL80211_STA_INFO_TX_BITRATE)) { 4443 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, 4444 NL80211_STA_INFO_TX_BITRATE)) 4445 goto nla_put_failure; 4446 } 4447 if (sinfo->filled & BIT(NL80211_STA_INFO_RX_BITRATE)) { 4448 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, 4449 NL80211_STA_INFO_RX_BITRATE)) 4450 goto nla_put_failure; 4451 } 4452 4453 PUT_SINFO(RX_PACKETS, rx_packets, u32); 4454 PUT_SINFO(TX_PACKETS, tx_packets, u32); 4455 PUT_SINFO(TX_RETRIES, tx_retries, u32); 4456 PUT_SINFO(TX_FAILED, tx_failed, u32); 4457 PUT_SINFO(EXPECTED_THROUGHPUT, expected_throughput, u32); 4458 PUT_SINFO(BEACON_LOSS, beacon_loss_count, u32); 4459 PUT_SINFO(LOCAL_PM, local_pm, u32); 4460 PUT_SINFO(PEER_PM, peer_pm, u32); 4461 PUT_SINFO(NONPEER_PM, nonpeer_pm, u32); 4462 4463 if (sinfo->filled & BIT(NL80211_STA_INFO_BSS_PARAM)) { 4464 bss_param = nla_nest_start(msg, NL80211_STA_INFO_BSS_PARAM); 4465 if (!bss_param) 4466 goto nla_put_failure; 4467 4468 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) && 4469 nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) || 4470 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) && 4471 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) || 4472 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && 4473 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) || 4474 nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD, 4475 sinfo->bss_param.dtim_period) || 4476 nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL, 4477 sinfo->bss_param.beacon_interval)) 4478 goto nla_put_failure; 4479 4480 nla_nest_end(msg, bss_param); 4481 } 4482 if ((sinfo->filled & BIT(NL80211_STA_INFO_STA_FLAGS)) && 4483 nla_put(msg, NL80211_STA_INFO_STA_FLAGS, 4484 sizeof(struct nl80211_sta_flag_update), 4485 &sinfo->sta_flags)) 4486 goto nla_put_failure; 4487 4488 PUT_SINFO_U64(T_OFFSET, t_offset); 4489 PUT_SINFO_U64(RX_DROP_MISC, rx_dropped_misc); 4490 PUT_SINFO_U64(BEACON_RX, rx_beacon); 4491 PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8); 4492 PUT_SINFO(ACK_SIGNAL, ack_signal, u8); 4493 4494 #undef PUT_SINFO 4495 #undef PUT_SINFO_U64 4496 4497 if (sinfo->filled & BIT(NL80211_STA_INFO_TID_STATS)) { 4498 struct nlattr *tidsattr; 4499 int tid; 4500 4501 tidsattr = nla_nest_start(msg, NL80211_STA_INFO_TID_STATS); 4502 if (!tidsattr) 4503 goto nla_put_failure; 4504 4505 for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) { 4506 struct cfg80211_tid_stats *tidstats; 4507 struct nlattr *tidattr; 4508 4509 tidstats = &sinfo->pertid[tid]; 4510 4511 if (!tidstats->filled) 4512 continue; 4513 4514 tidattr = nla_nest_start(msg, tid + 1); 4515 if (!tidattr) 4516 goto nla_put_failure; 4517 4518 #define PUT_TIDVAL_U64(attr, memb) do { \ 4519 if (tidstats->filled & BIT(NL80211_TID_STATS_ ## attr) && \ 4520 nla_put_u64_64bit(msg, NL80211_TID_STATS_ ## attr, \ 4521 tidstats->memb, NL80211_TID_STATS_PAD)) \ 4522 goto nla_put_failure; \ 4523 } while (0) 4524 4525 PUT_TIDVAL_U64(RX_MSDU, rx_msdu); 4526 PUT_TIDVAL_U64(TX_MSDU, tx_msdu); 4527 PUT_TIDVAL_U64(TX_MSDU_RETRIES, tx_msdu_retries); 4528 PUT_TIDVAL_U64(TX_MSDU_FAILED, tx_msdu_failed); 4529 4530 #undef PUT_TIDVAL_U64 4531 nla_nest_end(msg, tidattr); 4532 } 4533 4534 nla_nest_end(msg, tidsattr); 4535 } 4536 4537 nla_nest_end(msg, sinfoattr); 4538 4539 if (sinfo->assoc_req_ies_len && 4540 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, 4541 sinfo->assoc_req_ies)) 4542 goto nla_put_failure; 4543 4544 genlmsg_end(msg, hdr); 4545 return 0; 4546 4547 nla_put_failure: 4548 genlmsg_cancel(msg, hdr); 4549 return -EMSGSIZE; 4550 } 4551 4552 static int nl80211_dump_station(struct sk_buff *skb, 4553 struct netlink_callback *cb) 4554 { 4555 struct station_info sinfo; 4556 struct cfg80211_registered_device *rdev; 4557 struct wireless_dev *wdev; 4558 u8 mac_addr[ETH_ALEN]; 4559 int sta_idx = cb->args[2]; 4560 int err; 4561 4562 rtnl_lock(); 4563 err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev); 4564 if (err) 4565 goto out_err; 4566 4567 if (!wdev->netdev) { 4568 err = -EINVAL; 4569 goto out_err; 4570 } 4571 4572 if (!rdev->ops->dump_station) { 4573 err = -EOPNOTSUPP; 4574 goto out_err; 4575 } 4576 4577 while (1) { 4578 memset(&sinfo, 0, sizeof(sinfo)); 4579 err = rdev_dump_station(rdev, wdev->netdev, sta_idx, 4580 mac_addr, &sinfo); 4581 if (err == -ENOENT) 4582 break; 4583 if (err) 4584 goto out_err; 4585 4586 if (nl80211_send_station(skb, NL80211_CMD_NEW_STATION, 4587 NETLINK_CB(cb->skb).portid, 4588 cb->nlh->nlmsg_seq, NLM_F_MULTI, 4589 rdev, wdev->netdev, mac_addr, 4590 &sinfo) < 0) 4591 goto out; 4592 4593 sta_idx++; 4594 } 4595 4596 out: 4597 cb->args[2] = sta_idx; 4598 err = skb->len; 4599 out_err: 4600 rtnl_unlock(); 4601 4602 return err; 4603 } 4604 4605 static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info) 4606 { 4607 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4608 struct net_device *dev = info->user_ptr[1]; 4609 struct station_info sinfo; 4610 struct sk_buff *msg; 4611 u8 *mac_addr = NULL; 4612 int err; 4613 4614 memset(&sinfo, 0, sizeof(sinfo)); 4615 4616 if (!info->attrs[NL80211_ATTR_MAC]) 4617 return -EINVAL; 4618 4619 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 4620 4621 if (!rdev->ops->get_station) 4622 return -EOPNOTSUPP; 4623 4624 err = rdev_get_station(rdev, dev, mac_addr, &sinfo); 4625 if (err) 4626 return err; 4627 4628 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 4629 if (!msg) 4630 return -ENOMEM; 4631 4632 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 4633 info->snd_portid, info->snd_seq, 0, 4634 rdev, dev, mac_addr, &sinfo) < 0) { 4635 nlmsg_free(msg); 4636 return -ENOBUFS; 4637 } 4638 4639 return genlmsg_reply(msg, info); 4640 } 4641 4642 int cfg80211_check_station_change(struct wiphy *wiphy, 4643 struct station_parameters *params, 4644 enum cfg80211_station_type statype) 4645 { 4646 if (params->listen_interval != -1 && 4647 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 4648 return -EINVAL; 4649 4650 if (params->support_p2p_ps != -1 && 4651 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 4652 return -EINVAL; 4653 4654 if (params->aid && 4655 !(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) && 4656 statype != CFG80211_STA_AP_CLIENT_UNASSOC) 4657 return -EINVAL; 4658 4659 /* When you run into this, adjust the code below for the new flag */ 4660 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7); 4661 4662 switch (statype) { 4663 case CFG80211_STA_MESH_PEER_KERNEL: 4664 case CFG80211_STA_MESH_PEER_USER: 4665 /* 4666 * No ignoring the TDLS flag here -- the userspace mesh 4667 * code doesn't have the bug of including TDLS in the 4668 * mask everywhere. 4669 */ 4670 if (params->sta_flags_mask & 4671 ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) | 4672 BIT(NL80211_STA_FLAG_MFP) | 4673 BIT(NL80211_STA_FLAG_AUTHORIZED))) 4674 return -EINVAL; 4675 break; 4676 case CFG80211_STA_TDLS_PEER_SETUP: 4677 case CFG80211_STA_TDLS_PEER_ACTIVE: 4678 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 4679 return -EINVAL; 4680 /* ignore since it can't change */ 4681 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 4682 break; 4683 default: 4684 /* disallow mesh-specific things */ 4685 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) 4686 return -EINVAL; 4687 if (params->local_pm) 4688 return -EINVAL; 4689 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) 4690 return -EINVAL; 4691 } 4692 4693 if (statype != CFG80211_STA_TDLS_PEER_SETUP && 4694 statype != CFG80211_STA_TDLS_PEER_ACTIVE) { 4695 /* TDLS can't be set, ... */ 4696 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) 4697 return -EINVAL; 4698 /* 4699 * ... but don't bother the driver with it. This works around 4700 * a hostapd/wpa_supplicant issue -- it always includes the 4701 * TLDS_PEER flag in the mask even for AP mode. 4702 */ 4703 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 4704 } 4705 4706 if (statype != CFG80211_STA_TDLS_PEER_SETUP && 4707 statype != CFG80211_STA_AP_CLIENT_UNASSOC) { 4708 /* reject other things that can't change */ 4709 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) 4710 return -EINVAL; 4711 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) 4712 return -EINVAL; 4713 if (params->supported_rates) 4714 return -EINVAL; 4715 if (params->ext_capab || params->ht_capa || params->vht_capa) 4716 return -EINVAL; 4717 } 4718 4719 if (statype != CFG80211_STA_AP_CLIENT && 4720 statype != CFG80211_STA_AP_CLIENT_UNASSOC) { 4721 if (params->vlan) 4722 return -EINVAL; 4723 } 4724 4725 switch (statype) { 4726 case CFG80211_STA_AP_MLME_CLIENT: 4727 /* Use this only for authorizing/unauthorizing a station */ 4728 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) 4729 return -EOPNOTSUPP; 4730 break; 4731 case CFG80211_STA_AP_CLIENT: 4732 case CFG80211_STA_AP_CLIENT_UNASSOC: 4733 /* accept only the listed bits */ 4734 if (params->sta_flags_mask & 4735 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 4736 BIT(NL80211_STA_FLAG_AUTHENTICATED) | 4737 BIT(NL80211_STA_FLAG_ASSOCIATED) | 4738 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 4739 BIT(NL80211_STA_FLAG_WME) | 4740 BIT(NL80211_STA_FLAG_MFP))) 4741 return -EINVAL; 4742 4743 /* but authenticated/associated only if driver handles it */ 4744 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 4745 params->sta_flags_mask & 4746 (BIT(NL80211_STA_FLAG_AUTHENTICATED) | 4747 BIT(NL80211_STA_FLAG_ASSOCIATED))) 4748 return -EINVAL; 4749 break; 4750 case CFG80211_STA_IBSS: 4751 case CFG80211_STA_AP_STA: 4752 /* reject any changes other than AUTHORIZED */ 4753 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) 4754 return -EINVAL; 4755 break; 4756 case CFG80211_STA_TDLS_PEER_SETUP: 4757 /* reject any changes other than AUTHORIZED or WME */ 4758 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 4759 BIT(NL80211_STA_FLAG_WME))) 4760 return -EINVAL; 4761 /* force (at least) rates when authorizing */ 4762 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) && 4763 !params->supported_rates) 4764 return -EINVAL; 4765 break; 4766 case CFG80211_STA_TDLS_PEER_ACTIVE: 4767 /* reject any changes */ 4768 return -EINVAL; 4769 case CFG80211_STA_MESH_PEER_KERNEL: 4770 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) 4771 return -EINVAL; 4772 break; 4773 case CFG80211_STA_MESH_PEER_USER: 4774 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION && 4775 params->plink_action != NL80211_PLINK_ACTION_BLOCK) 4776 return -EINVAL; 4777 break; 4778 } 4779 4780 /* 4781 * Older kernel versions ignored this attribute entirely, so don't 4782 * reject attempts to update it but mark it as unused instead so the 4783 * driver won't look at the data. 4784 */ 4785 if (statype != CFG80211_STA_AP_CLIENT_UNASSOC && 4786 statype != CFG80211_STA_TDLS_PEER_SETUP) 4787 params->opmode_notif_used = false; 4788 4789 return 0; 4790 } 4791 EXPORT_SYMBOL(cfg80211_check_station_change); 4792 4793 /* 4794 * Get vlan interface making sure it is running and on the right wiphy. 4795 */ 4796 static struct net_device *get_vlan(struct genl_info *info, 4797 struct cfg80211_registered_device *rdev) 4798 { 4799 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; 4800 struct net_device *v; 4801 int ret; 4802 4803 if (!vlanattr) 4804 return NULL; 4805 4806 v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr)); 4807 if (!v) 4808 return ERR_PTR(-ENODEV); 4809 4810 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { 4811 ret = -EINVAL; 4812 goto error; 4813 } 4814 4815 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && 4816 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 4817 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 4818 ret = -EINVAL; 4819 goto error; 4820 } 4821 4822 if (!netif_running(v)) { 4823 ret = -ENETDOWN; 4824 goto error; 4825 } 4826 4827 return v; 4828 error: 4829 dev_put(v); 4830 return ERR_PTR(ret); 4831 } 4832 4833 static const struct nla_policy 4834 nl80211_sta_wme_policy[NL80211_STA_WME_MAX + 1] = { 4835 [NL80211_STA_WME_UAPSD_QUEUES] = { .type = NLA_U8 }, 4836 [NL80211_STA_WME_MAX_SP] = { .type = NLA_U8 }, 4837 }; 4838 4839 static int nl80211_parse_sta_wme(struct genl_info *info, 4840 struct station_parameters *params) 4841 { 4842 struct nlattr *tb[NL80211_STA_WME_MAX + 1]; 4843 struct nlattr *nla; 4844 int err; 4845 4846 /* parse WME attributes if present */ 4847 if (!info->attrs[NL80211_ATTR_STA_WME]) 4848 return 0; 4849 4850 nla = info->attrs[NL80211_ATTR_STA_WME]; 4851 err = nla_parse_nested(tb, NL80211_STA_WME_MAX, nla, 4852 nl80211_sta_wme_policy, info->extack); 4853 if (err) 4854 return err; 4855 4856 if (tb[NL80211_STA_WME_UAPSD_QUEUES]) 4857 params->uapsd_queues = nla_get_u8( 4858 tb[NL80211_STA_WME_UAPSD_QUEUES]); 4859 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) 4860 return -EINVAL; 4861 4862 if (tb[NL80211_STA_WME_MAX_SP]) 4863 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); 4864 4865 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) 4866 return -EINVAL; 4867 4868 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; 4869 4870 return 0; 4871 } 4872 4873 static int nl80211_parse_sta_channel_info(struct genl_info *info, 4874 struct station_parameters *params) 4875 { 4876 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { 4877 params->supported_channels = 4878 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 4879 params->supported_channels_len = 4880 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 4881 /* 4882 * Need to include at least one (first channel, number of 4883 * channels) tuple for each subband, and must have proper 4884 * tuples for the rest of the data as well. 4885 */ 4886 if (params->supported_channels_len < 2) 4887 return -EINVAL; 4888 if (params->supported_channels_len % 2) 4889 return -EINVAL; 4890 } 4891 4892 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { 4893 params->supported_oper_classes = 4894 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 4895 params->supported_oper_classes_len = 4896 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 4897 /* 4898 * The value of the Length field of the Supported Operating 4899 * Classes element is between 2 and 253. 4900 */ 4901 if (params->supported_oper_classes_len < 2 || 4902 params->supported_oper_classes_len > 253) 4903 return -EINVAL; 4904 } 4905 return 0; 4906 } 4907 4908 static int nl80211_set_station_tdls(struct genl_info *info, 4909 struct station_parameters *params) 4910 { 4911 int err; 4912 /* Dummy STA entry gets updated once the peer capabilities are known */ 4913 if (info->attrs[NL80211_ATTR_PEER_AID]) 4914 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 4915 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 4916 params->ht_capa = 4917 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 4918 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 4919 params->vht_capa = 4920 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 4921 4922 err = nl80211_parse_sta_channel_info(info, params); 4923 if (err) 4924 return err; 4925 4926 return nl80211_parse_sta_wme(info, params); 4927 } 4928 4929 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) 4930 { 4931 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4932 struct net_device *dev = info->user_ptr[1]; 4933 struct station_parameters params; 4934 u8 *mac_addr; 4935 int err; 4936 4937 memset(¶ms, 0, sizeof(params)); 4938 4939 if (!rdev->ops->change_station) 4940 return -EOPNOTSUPP; 4941 4942 /* 4943 * AID and listen_interval properties can be set only for unassociated 4944 * station. Include these parameters here and will check them in 4945 * cfg80211_check_station_change(). 4946 */ 4947 if (info->attrs[NL80211_ATTR_STA_AID]) 4948 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 4949 4950 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 4951 params.listen_interval = 4952 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 4953 else 4954 params.listen_interval = -1; 4955 4956 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { 4957 u8 tmp; 4958 4959 tmp = nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); 4960 if (tmp >= NUM_NL80211_P2P_PS_STATUS) 4961 return -EINVAL; 4962 4963 params.support_p2p_ps = tmp; 4964 } else { 4965 params.support_p2p_ps = -1; 4966 } 4967 4968 if (!info->attrs[NL80211_ATTR_MAC]) 4969 return -EINVAL; 4970 4971 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 4972 4973 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 4974 params.supported_rates = 4975 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 4976 params.supported_rates_len = 4977 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 4978 } 4979 4980 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 4981 params.capability = 4982 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 4983 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 4984 } 4985 4986 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 4987 params.ext_capab = 4988 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 4989 params.ext_capab_len = 4990 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 4991 } 4992 4993 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) 4994 return -EINVAL; 4995 4996 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) { 4997 params.plink_action = 4998 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 4999 if (params.plink_action >= NUM_NL80211_PLINK_ACTIONS) 5000 return -EINVAL; 5001 } 5002 5003 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { 5004 params.plink_state = 5005 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); 5006 if (params.plink_state >= NUM_NL80211_PLINK_STATES) 5007 return -EINVAL; 5008 if (info->attrs[NL80211_ATTR_MESH_PEER_AID]) { 5009 params.peer_aid = nla_get_u16( 5010 info->attrs[NL80211_ATTR_MESH_PEER_AID]); 5011 if (params.peer_aid > IEEE80211_MAX_AID) 5012 return -EINVAL; 5013 } 5014 params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE; 5015 } 5016 5017 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) { 5018 enum nl80211_mesh_power_mode pm = nla_get_u32( 5019 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); 5020 5021 if (pm <= NL80211_MESH_POWER_UNKNOWN || 5022 pm > NL80211_MESH_POWER_MAX) 5023 return -EINVAL; 5024 5025 params.local_pm = pm; 5026 } 5027 5028 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 5029 params.opmode_notif_used = true; 5030 params.opmode_notif = 5031 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 5032 } 5033 5034 /* Include parameters for TDLS peer (will check later) */ 5035 err = nl80211_set_station_tdls(info, ¶ms); 5036 if (err) 5037 return err; 5038 5039 params.vlan = get_vlan(info, rdev); 5040 if (IS_ERR(params.vlan)) 5041 return PTR_ERR(params.vlan); 5042 5043 switch (dev->ieee80211_ptr->iftype) { 5044 case NL80211_IFTYPE_AP: 5045 case NL80211_IFTYPE_AP_VLAN: 5046 case NL80211_IFTYPE_P2P_GO: 5047 case NL80211_IFTYPE_P2P_CLIENT: 5048 case NL80211_IFTYPE_STATION: 5049 case NL80211_IFTYPE_ADHOC: 5050 case NL80211_IFTYPE_MESH_POINT: 5051 break; 5052 default: 5053 err = -EOPNOTSUPP; 5054 goto out_put_vlan; 5055 } 5056 5057 /* driver will call cfg80211_check_station_change() */ 5058 err = rdev_change_station(rdev, dev, mac_addr, ¶ms); 5059 5060 out_put_vlan: 5061 if (params.vlan) 5062 dev_put(params.vlan); 5063 5064 return err; 5065 } 5066 5067 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info) 5068 { 5069 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5070 int err; 5071 struct net_device *dev = info->user_ptr[1]; 5072 struct station_parameters params; 5073 u8 *mac_addr = NULL; 5074 u32 auth_assoc = BIT(NL80211_STA_FLAG_AUTHENTICATED) | 5075 BIT(NL80211_STA_FLAG_ASSOCIATED); 5076 5077 memset(¶ms, 0, sizeof(params)); 5078 5079 if (!rdev->ops->add_station) 5080 return -EOPNOTSUPP; 5081 5082 if (!info->attrs[NL80211_ATTR_MAC]) 5083 return -EINVAL; 5084 5085 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 5086 return -EINVAL; 5087 5088 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 5089 return -EINVAL; 5090 5091 if (!info->attrs[NL80211_ATTR_STA_AID] && 5092 !info->attrs[NL80211_ATTR_PEER_AID]) 5093 return -EINVAL; 5094 5095 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 5096 params.supported_rates = 5097 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 5098 params.supported_rates_len = 5099 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 5100 params.listen_interval = 5101 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 5102 5103 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) { 5104 u8 tmp; 5105 5106 tmp = nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); 5107 if (tmp >= NUM_NL80211_P2P_PS_STATUS) 5108 return -EINVAL; 5109 5110 params.support_p2p_ps = tmp; 5111 } else { 5112 /* 5113 * if not specified, assume it's supported for P2P GO interface, 5114 * and is NOT supported for AP interface 5115 */ 5116 params.support_p2p_ps = 5117 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO; 5118 } 5119 5120 if (info->attrs[NL80211_ATTR_PEER_AID]) 5121 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 5122 else 5123 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 5124 if (!params.aid || params.aid > IEEE80211_MAX_AID) 5125 return -EINVAL; 5126 5127 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 5128 params.capability = 5129 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 5130 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 5131 } 5132 5133 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 5134 params.ext_capab = 5135 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 5136 params.ext_capab_len = 5137 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 5138 } 5139 5140 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 5141 params.ht_capa = 5142 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 5143 5144 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 5145 params.vht_capa = 5146 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 5147 5148 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { 5149 params.opmode_notif_used = true; 5150 params.opmode_notif = 5151 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]); 5152 } 5153 5154 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) { 5155 params.plink_action = 5156 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 5157 if (params.plink_action >= NUM_NL80211_PLINK_ACTIONS) 5158 return -EINVAL; 5159 } 5160 5161 err = nl80211_parse_sta_channel_info(info, ¶ms); 5162 if (err) 5163 return err; 5164 5165 err = nl80211_parse_sta_wme(info, ¶ms); 5166 if (err) 5167 return err; 5168 5169 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) 5170 return -EINVAL; 5171 5172 /* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT 5173 * as userspace might just pass through the capabilities from the IEs 5174 * directly, rather than enforcing this restriction and returning an 5175 * error in this case. 5176 */ 5177 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) { 5178 params.ht_capa = NULL; 5179 params.vht_capa = NULL; 5180 } 5181 5182 /* When you run into this, adjust the code below for the new flag */ 5183 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7); 5184 5185 switch (dev->ieee80211_ptr->iftype) { 5186 case NL80211_IFTYPE_AP: 5187 case NL80211_IFTYPE_AP_VLAN: 5188 case NL80211_IFTYPE_P2P_GO: 5189 /* ignore WME attributes if iface/sta is not capable */ 5190 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || 5191 !(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) 5192 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 5193 5194 /* TDLS peers cannot be added */ 5195 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 5196 info->attrs[NL80211_ATTR_PEER_AID]) 5197 return -EINVAL; 5198 /* but don't bother the driver with it */ 5199 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 5200 5201 /* allow authenticated/associated only if driver handles it */ 5202 if (!(rdev->wiphy.features & 5203 NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 5204 params.sta_flags_mask & auth_assoc) 5205 return -EINVAL; 5206 5207 /* Older userspace, or userspace wanting to be compatible with 5208 * !NL80211_FEATURE_FULL_AP_CLIENT_STATE, will not set the auth 5209 * and assoc flags in the mask, but assumes the station will be 5210 * added as associated anyway since this was the required driver 5211 * behaviour before NL80211_FEATURE_FULL_AP_CLIENT_STATE was 5212 * introduced. 5213 * In order to not bother drivers with this quirk in the API 5214 * set the flags in both the mask and set for new stations in 5215 * this case. 5216 */ 5217 if (!(params.sta_flags_mask & auth_assoc)) { 5218 params.sta_flags_mask |= auth_assoc; 5219 params.sta_flags_set |= auth_assoc; 5220 } 5221 5222 /* must be last in here for error handling */ 5223 params.vlan = get_vlan(info, rdev); 5224 if (IS_ERR(params.vlan)) 5225 return PTR_ERR(params.vlan); 5226 break; 5227 case NL80211_IFTYPE_MESH_POINT: 5228 /* ignore uAPSD data */ 5229 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 5230 5231 /* associated is disallowed */ 5232 if (params.sta_flags_mask & BIT(NL80211_STA_FLAG_ASSOCIATED)) 5233 return -EINVAL; 5234 /* TDLS peers cannot be added */ 5235 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 5236 info->attrs[NL80211_ATTR_PEER_AID]) 5237 return -EINVAL; 5238 break; 5239 case NL80211_IFTYPE_STATION: 5240 case NL80211_IFTYPE_P2P_CLIENT: 5241 /* ignore uAPSD data */ 5242 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 5243 5244 /* these are disallowed */ 5245 if (params.sta_flags_mask & 5246 (BIT(NL80211_STA_FLAG_ASSOCIATED) | 5247 BIT(NL80211_STA_FLAG_AUTHENTICATED))) 5248 return -EINVAL; 5249 /* Only TDLS peers can be added */ 5250 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 5251 return -EINVAL; 5252 /* Can only add if TDLS ... */ 5253 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) 5254 return -EOPNOTSUPP; 5255 /* ... with external setup is supported */ 5256 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) 5257 return -EOPNOTSUPP; 5258 /* 5259 * Older wpa_supplicant versions always mark the TDLS peer 5260 * as authorized, but it shouldn't yet be. 5261 */ 5262 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_AUTHORIZED); 5263 break; 5264 default: 5265 return -EOPNOTSUPP; 5266 } 5267 5268 /* be aware of params.vlan when changing code here */ 5269 5270 err = rdev_add_station(rdev, dev, mac_addr, ¶ms); 5271 5272 if (params.vlan) 5273 dev_put(params.vlan); 5274 return err; 5275 } 5276 5277 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info) 5278 { 5279 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5280 struct net_device *dev = info->user_ptr[1]; 5281 struct station_del_parameters params; 5282 5283 memset(¶ms, 0, sizeof(params)); 5284 5285 if (info->attrs[NL80211_ATTR_MAC]) 5286 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]); 5287 5288 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 5289 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && 5290 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && 5291 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 5292 return -EINVAL; 5293 5294 if (!rdev->ops->del_station) 5295 return -EOPNOTSUPP; 5296 5297 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) { 5298 params.subtype = 5299 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]); 5300 if (params.subtype != IEEE80211_STYPE_DISASSOC >> 4 && 5301 params.subtype != IEEE80211_STYPE_DEAUTH >> 4) 5302 return -EINVAL; 5303 } else { 5304 /* Default to Deauthentication frame */ 5305 params.subtype = IEEE80211_STYPE_DEAUTH >> 4; 5306 } 5307 5308 if (info->attrs[NL80211_ATTR_REASON_CODE]) { 5309 params.reason_code = 5310 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 5311 if (params.reason_code == 0) 5312 return -EINVAL; /* 0 is reserved */ 5313 } else { 5314 /* Default to reason code 2 */ 5315 params.reason_code = WLAN_REASON_PREV_AUTH_NOT_VALID; 5316 } 5317 5318 return rdev_del_station(rdev, dev, ¶ms); 5319 } 5320 5321 static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq, 5322 int flags, struct net_device *dev, 5323 u8 *dst, u8 *next_hop, 5324 struct mpath_info *pinfo) 5325 { 5326 void *hdr; 5327 struct nlattr *pinfoattr; 5328 5329 hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_MPATH); 5330 if (!hdr) 5331 return -1; 5332 5333 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 5334 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dst) || 5335 nla_put(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop) || 5336 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) 5337 goto nla_put_failure; 5338 5339 pinfoattr = nla_nest_start(msg, NL80211_ATTR_MPATH_INFO); 5340 if (!pinfoattr) 5341 goto nla_put_failure; 5342 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && 5343 nla_put_u32(msg, NL80211_MPATH_INFO_FRAME_QLEN, 5344 pinfo->frame_qlen)) 5345 goto nla_put_failure; 5346 if (((pinfo->filled & MPATH_INFO_SN) && 5347 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || 5348 ((pinfo->filled & MPATH_INFO_METRIC) && 5349 nla_put_u32(msg, NL80211_MPATH_INFO_METRIC, 5350 pinfo->metric)) || 5351 ((pinfo->filled & MPATH_INFO_EXPTIME) && 5352 nla_put_u32(msg, NL80211_MPATH_INFO_EXPTIME, 5353 pinfo->exptime)) || 5354 ((pinfo->filled & MPATH_INFO_FLAGS) && 5355 nla_put_u8(msg, NL80211_MPATH_INFO_FLAGS, 5356 pinfo->flags)) || 5357 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && 5358 nla_put_u32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT, 5359 pinfo->discovery_timeout)) || 5360 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && 5361 nla_put_u8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES, 5362 pinfo->discovery_retries))) 5363 goto nla_put_failure; 5364 5365 nla_nest_end(msg, pinfoattr); 5366 5367 genlmsg_end(msg, hdr); 5368 return 0; 5369 5370 nla_put_failure: 5371 genlmsg_cancel(msg, hdr); 5372 return -EMSGSIZE; 5373 } 5374 5375 static int nl80211_dump_mpath(struct sk_buff *skb, 5376 struct netlink_callback *cb) 5377 { 5378 struct mpath_info pinfo; 5379 struct cfg80211_registered_device *rdev; 5380 struct wireless_dev *wdev; 5381 u8 dst[ETH_ALEN]; 5382 u8 next_hop[ETH_ALEN]; 5383 int path_idx = cb->args[2]; 5384 int err; 5385 5386 rtnl_lock(); 5387 err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev); 5388 if (err) 5389 goto out_err; 5390 5391 if (!rdev->ops->dump_mpath) { 5392 err = -EOPNOTSUPP; 5393 goto out_err; 5394 } 5395 5396 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 5397 err = -EOPNOTSUPP; 5398 goto out_err; 5399 } 5400 5401 while (1) { 5402 err = rdev_dump_mpath(rdev, wdev->netdev, path_idx, dst, 5403 next_hop, &pinfo); 5404 if (err == -ENOENT) 5405 break; 5406 if (err) 5407 goto out_err; 5408 5409 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 5410 cb->nlh->nlmsg_seq, NLM_F_MULTI, 5411 wdev->netdev, dst, next_hop, 5412 &pinfo) < 0) 5413 goto out; 5414 5415 path_idx++; 5416 } 5417 5418 out: 5419 cb->args[2] = path_idx; 5420 err = skb->len; 5421 out_err: 5422 rtnl_unlock(); 5423 return err; 5424 } 5425 5426 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info) 5427 { 5428 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5429 int err; 5430 struct net_device *dev = info->user_ptr[1]; 5431 struct mpath_info pinfo; 5432 struct sk_buff *msg; 5433 u8 *dst = NULL; 5434 u8 next_hop[ETH_ALEN]; 5435 5436 memset(&pinfo, 0, sizeof(pinfo)); 5437 5438 if (!info->attrs[NL80211_ATTR_MAC]) 5439 return -EINVAL; 5440 5441 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 5442 5443 if (!rdev->ops->get_mpath) 5444 return -EOPNOTSUPP; 5445 5446 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 5447 return -EOPNOTSUPP; 5448 5449 err = rdev_get_mpath(rdev, dev, dst, next_hop, &pinfo); 5450 if (err) 5451 return err; 5452 5453 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 5454 if (!msg) 5455 return -ENOMEM; 5456 5457 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 5458 dev, dst, next_hop, &pinfo) < 0) { 5459 nlmsg_free(msg); 5460 return -ENOBUFS; 5461 } 5462 5463 return genlmsg_reply(msg, info); 5464 } 5465 5466 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info) 5467 { 5468 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5469 struct net_device *dev = info->user_ptr[1]; 5470 u8 *dst = NULL; 5471 u8 *next_hop = NULL; 5472 5473 if (!info->attrs[NL80211_ATTR_MAC]) 5474 return -EINVAL; 5475 5476 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 5477 return -EINVAL; 5478 5479 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 5480 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 5481 5482 if (!rdev->ops->change_mpath) 5483 return -EOPNOTSUPP; 5484 5485 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 5486 return -EOPNOTSUPP; 5487 5488 return rdev_change_mpath(rdev, dev, dst, next_hop); 5489 } 5490 5491 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info) 5492 { 5493 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5494 struct net_device *dev = info->user_ptr[1]; 5495 u8 *dst = NULL; 5496 u8 *next_hop = NULL; 5497 5498 if (!info->attrs[NL80211_ATTR_MAC]) 5499 return -EINVAL; 5500 5501 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 5502 return -EINVAL; 5503 5504 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 5505 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 5506 5507 if (!rdev->ops->add_mpath) 5508 return -EOPNOTSUPP; 5509 5510 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 5511 return -EOPNOTSUPP; 5512 5513 return rdev_add_mpath(rdev, dev, dst, next_hop); 5514 } 5515 5516 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info) 5517 { 5518 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5519 struct net_device *dev = info->user_ptr[1]; 5520 u8 *dst = NULL; 5521 5522 if (info->attrs[NL80211_ATTR_MAC]) 5523 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 5524 5525 if (!rdev->ops->del_mpath) 5526 return -EOPNOTSUPP; 5527 5528 return rdev_del_mpath(rdev, dev, dst); 5529 } 5530 5531 static int nl80211_get_mpp(struct sk_buff *skb, struct genl_info *info) 5532 { 5533 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5534 int err; 5535 struct net_device *dev = info->user_ptr[1]; 5536 struct mpath_info pinfo; 5537 struct sk_buff *msg; 5538 u8 *dst = NULL; 5539 u8 mpp[ETH_ALEN]; 5540 5541 memset(&pinfo, 0, sizeof(pinfo)); 5542 5543 if (!info->attrs[NL80211_ATTR_MAC]) 5544 return -EINVAL; 5545 5546 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 5547 5548 if (!rdev->ops->get_mpp) 5549 return -EOPNOTSUPP; 5550 5551 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 5552 return -EOPNOTSUPP; 5553 5554 err = rdev_get_mpp(rdev, dev, dst, mpp, &pinfo); 5555 if (err) 5556 return err; 5557 5558 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 5559 if (!msg) 5560 return -ENOMEM; 5561 5562 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 5563 dev, dst, mpp, &pinfo) < 0) { 5564 nlmsg_free(msg); 5565 return -ENOBUFS; 5566 } 5567 5568 return genlmsg_reply(msg, info); 5569 } 5570 5571 static int nl80211_dump_mpp(struct sk_buff *skb, 5572 struct netlink_callback *cb) 5573 { 5574 struct mpath_info pinfo; 5575 struct cfg80211_registered_device *rdev; 5576 struct wireless_dev *wdev; 5577 u8 dst[ETH_ALEN]; 5578 u8 mpp[ETH_ALEN]; 5579 int path_idx = cb->args[2]; 5580 int err; 5581 5582 rtnl_lock(); 5583 err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev); 5584 if (err) 5585 goto out_err; 5586 5587 if (!rdev->ops->dump_mpp) { 5588 err = -EOPNOTSUPP; 5589 goto out_err; 5590 } 5591 5592 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 5593 err = -EOPNOTSUPP; 5594 goto out_err; 5595 } 5596 5597 while (1) { 5598 err = rdev_dump_mpp(rdev, wdev->netdev, path_idx, dst, 5599 mpp, &pinfo); 5600 if (err == -ENOENT) 5601 break; 5602 if (err) 5603 goto out_err; 5604 5605 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 5606 cb->nlh->nlmsg_seq, NLM_F_MULTI, 5607 wdev->netdev, dst, mpp, 5608 &pinfo) < 0) 5609 goto out; 5610 5611 path_idx++; 5612 } 5613 5614 out: 5615 cb->args[2] = path_idx; 5616 err = skb->len; 5617 out_err: 5618 rtnl_unlock(); 5619 return err; 5620 } 5621 5622 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info) 5623 { 5624 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5625 struct net_device *dev = info->user_ptr[1]; 5626 struct wireless_dev *wdev = dev->ieee80211_ptr; 5627 struct bss_parameters params; 5628 int err; 5629 5630 memset(¶ms, 0, sizeof(params)); 5631 /* default to not changing parameters */ 5632 params.use_cts_prot = -1; 5633 params.use_short_preamble = -1; 5634 params.use_short_slot_time = -1; 5635 params.ap_isolate = -1; 5636 params.ht_opmode = -1; 5637 params.p2p_ctwindow = -1; 5638 params.p2p_opp_ps = -1; 5639 5640 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) 5641 params.use_cts_prot = 5642 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); 5643 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) 5644 params.use_short_preamble = 5645 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); 5646 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) 5647 params.use_short_slot_time = 5648 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); 5649 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 5650 params.basic_rates = 5651 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 5652 params.basic_rates_len = 5653 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 5654 } 5655 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) 5656 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); 5657 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) 5658 params.ht_opmode = 5659 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); 5660 5661 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 5662 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 5663 return -EINVAL; 5664 params.p2p_ctwindow = 5665 nla_get_s8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 5666 if (params.p2p_ctwindow < 0) 5667 return -EINVAL; 5668 if (params.p2p_ctwindow != 0 && 5669 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) 5670 return -EINVAL; 5671 } 5672 5673 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 5674 u8 tmp; 5675 5676 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 5677 return -EINVAL; 5678 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 5679 if (tmp > 1) 5680 return -EINVAL; 5681 params.p2p_opp_ps = tmp; 5682 if (params.p2p_opp_ps && 5683 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) 5684 return -EINVAL; 5685 } 5686 5687 if (!rdev->ops->change_bss) 5688 return -EOPNOTSUPP; 5689 5690 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 5691 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 5692 return -EOPNOTSUPP; 5693 5694 wdev_lock(wdev); 5695 err = rdev_change_bss(rdev, dev, ¶ms); 5696 wdev_unlock(wdev); 5697 5698 return err; 5699 } 5700 5701 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info) 5702 { 5703 char *data = NULL; 5704 bool is_indoor; 5705 enum nl80211_user_reg_hint_type user_reg_hint_type; 5706 u32 owner_nlportid; 5707 5708 /* 5709 * You should only get this when cfg80211 hasn't yet initialized 5710 * completely when built-in to the kernel right between the time 5711 * window between nl80211_init() and regulatory_init(), if that is 5712 * even possible. 5713 */ 5714 if (unlikely(!rcu_access_pointer(cfg80211_regdomain))) 5715 return -EINPROGRESS; 5716 5717 if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]) 5718 user_reg_hint_type = 5719 nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]); 5720 else 5721 user_reg_hint_type = NL80211_USER_REG_HINT_USER; 5722 5723 switch (user_reg_hint_type) { 5724 case NL80211_USER_REG_HINT_USER: 5725 case NL80211_USER_REG_HINT_CELL_BASE: 5726 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 5727 return -EINVAL; 5728 5729 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 5730 return regulatory_hint_user(data, user_reg_hint_type); 5731 case NL80211_USER_REG_HINT_INDOOR: 5732 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 5733 owner_nlportid = info->snd_portid; 5734 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR]; 5735 } else { 5736 owner_nlportid = 0; 5737 is_indoor = true; 5738 } 5739 5740 return regulatory_hint_indoor(is_indoor, owner_nlportid); 5741 default: 5742 return -EINVAL; 5743 } 5744 } 5745 5746 static int nl80211_reload_regdb(struct sk_buff *skb, struct genl_info *info) 5747 { 5748 return reg_reload_regdb(); 5749 } 5750 5751 static int nl80211_get_mesh_config(struct sk_buff *skb, 5752 struct genl_info *info) 5753 { 5754 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5755 struct net_device *dev = info->user_ptr[1]; 5756 struct wireless_dev *wdev = dev->ieee80211_ptr; 5757 struct mesh_config cur_params; 5758 int err = 0; 5759 void *hdr; 5760 struct nlattr *pinfoattr; 5761 struct sk_buff *msg; 5762 5763 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 5764 return -EOPNOTSUPP; 5765 5766 if (!rdev->ops->get_mesh_config) 5767 return -EOPNOTSUPP; 5768 5769 wdev_lock(wdev); 5770 /* If not connected, get default parameters */ 5771 if (!wdev->mesh_id_len) 5772 memcpy(&cur_params, &default_mesh_config, sizeof(cur_params)); 5773 else 5774 err = rdev_get_mesh_config(rdev, dev, &cur_params); 5775 wdev_unlock(wdev); 5776 5777 if (err) 5778 return err; 5779 5780 /* Draw up a netlink message to send back */ 5781 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 5782 if (!msg) 5783 return -ENOMEM; 5784 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 5785 NL80211_CMD_GET_MESH_CONFIG); 5786 if (!hdr) 5787 goto out; 5788 pinfoattr = nla_nest_start(msg, NL80211_ATTR_MESH_CONFIG); 5789 if (!pinfoattr) 5790 goto nla_put_failure; 5791 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 5792 nla_put_u16(msg, NL80211_MESHCONF_RETRY_TIMEOUT, 5793 cur_params.dot11MeshRetryTimeout) || 5794 nla_put_u16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT, 5795 cur_params.dot11MeshConfirmTimeout) || 5796 nla_put_u16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT, 5797 cur_params.dot11MeshHoldingTimeout) || 5798 nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS, 5799 cur_params.dot11MeshMaxPeerLinks) || 5800 nla_put_u8(msg, NL80211_MESHCONF_MAX_RETRIES, 5801 cur_params.dot11MeshMaxRetries) || 5802 nla_put_u8(msg, NL80211_MESHCONF_TTL, 5803 cur_params.dot11MeshTTL) || 5804 nla_put_u8(msg, NL80211_MESHCONF_ELEMENT_TTL, 5805 cur_params.element_ttl) || 5806 nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS, 5807 cur_params.auto_open_plinks) || 5808 nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 5809 cur_params.dot11MeshNbrOffsetMaxNeighbor) || 5810 nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 5811 cur_params.dot11MeshHWMPmaxPREQretries) || 5812 nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME, 5813 cur_params.path_refresh_time) || 5814 nla_put_u16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 5815 cur_params.min_discovery_timeout) || 5816 nla_put_u32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 5817 cur_params.dot11MeshHWMPactivePathTimeout) || 5818 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 5819 cur_params.dot11MeshHWMPpreqMinInterval) || 5820 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 5821 cur_params.dot11MeshHWMPperrMinInterval) || 5822 nla_put_u16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 5823 cur_params.dot11MeshHWMPnetDiameterTraversalTime) || 5824 nla_put_u8(msg, NL80211_MESHCONF_HWMP_ROOTMODE, 5825 cur_params.dot11MeshHWMPRootMode) || 5826 nla_put_u16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL, 5827 cur_params.dot11MeshHWMPRannInterval) || 5828 nla_put_u8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 5829 cur_params.dot11MeshGateAnnouncementProtocol) || 5830 nla_put_u8(msg, NL80211_MESHCONF_FORWARDING, 5831 cur_params.dot11MeshForwarding) || 5832 nla_put_s32(msg, NL80211_MESHCONF_RSSI_THRESHOLD, 5833 cur_params.rssi_threshold) || 5834 nla_put_u32(msg, NL80211_MESHCONF_HT_OPMODE, 5835 cur_params.ht_opmode) || 5836 nla_put_u32(msg, NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 5837 cur_params.dot11MeshHWMPactivePathToRootTimeout) || 5838 nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 5839 cur_params.dot11MeshHWMProotInterval) || 5840 nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 5841 cur_params.dot11MeshHWMPconfirmationInterval) || 5842 nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE, 5843 cur_params.power_mode) || 5844 nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW, 5845 cur_params.dot11MeshAwakeWindowDuration) || 5846 nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT, 5847 cur_params.plink_timeout)) 5848 goto nla_put_failure; 5849 nla_nest_end(msg, pinfoattr); 5850 genlmsg_end(msg, hdr); 5851 return genlmsg_reply(msg, info); 5852 5853 nla_put_failure: 5854 out: 5855 nlmsg_free(msg); 5856 return -ENOBUFS; 5857 } 5858 5859 static const struct nla_policy nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = { 5860 [NL80211_MESHCONF_RETRY_TIMEOUT] = { .type = NLA_U16 }, 5861 [NL80211_MESHCONF_CONFIRM_TIMEOUT] = { .type = NLA_U16 }, 5862 [NL80211_MESHCONF_HOLDING_TIMEOUT] = { .type = NLA_U16 }, 5863 [NL80211_MESHCONF_MAX_PEER_LINKS] = { .type = NLA_U16 }, 5864 [NL80211_MESHCONF_MAX_RETRIES] = { .type = NLA_U8 }, 5865 [NL80211_MESHCONF_TTL] = { .type = NLA_U8 }, 5866 [NL80211_MESHCONF_ELEMENT_TTL] = { .type = NLA_U8 }, 5867 [NL80211_MESHCONF_AUTO_OPEN_PLINKS] = { .type = NLA_U8 }, 5868 [NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] = { .type = NLA_U32 }, 5869 [NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 }, 5870 [NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 }, 5871 [NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = { .type = NLA_U16 }, 5872 [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 }, 5873 [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = { .type = NLA_U16 }, 5874 [NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] = { .type = NLA_U16 }, 5875 [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = { .type = NLA_U16 }, 5876 [NL80211_MESHCONF_HWMP_ROOTMODE] = { .type = NLA_U8 }, 5877 [NL80211_MESHCONF_HWMP_RANN_INTERVAL] = { .type = NLA_U16 }, 5878 [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = { .type = NLA_U8 }, 5879 [NL80211_MESHCONF_FORWARDING] = { .type = NLA_U8 }, 5880 [NL80211_MESHCONF_RSSI_THRESHOLD] = { .type = NLA_U32 }, 5881 [NL80211_MESHCONF_HT_OPMODE] = { .type = NLA_U16 }, 5882 [NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 }, 5883 [NL80211_MESHCONF_HWMP_ROOT_INTERVAL] = { .type = NLA_U16 }, 5884 [NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] = { .type = NLA_U16 }, 5885 [NL80211_MESHCONF_POWER_MODE] = { .type = NLA_U32 }, 5886 [NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 }, 5887 [NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 }, 5888 }; 5889 5890 static const struct nla_policy 5891 nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = { 5892 [NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 }, 5893 [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 }, 5894 [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 }, 5895 [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG }, 5896 [NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 }, 5897 [NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG }, 5898 [NL80211_MESH_SETUP_IE] = { .type = NLA_BINARY, 5899 .len = IEEE80211_MAX_DATA_LEN }, 5900 [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG }, 5901 }; 5902 5903 static int nl80211_check_bool(const struct nlattr *nla, u8 min, u8 max, bool *out) 5904 { 5905 u8 val = nla_get_u8(nla); 5906 if (val < min || val > max) 5907 return -EINVAL; 5908 *out = val; 5909 return 0; 5910 } 5911 5912 static int nl80211_check_u8(const struct nlattr *nla, u8 min, u8 max, u8 *out) 5913 { 5914 u8 val = nla_get_u8(nla); 5915 if (val < min || val > max) 5916 return -EINVAL; 5917 *out = val; 5918 return 0; 5919 } 5920 5921 static int nl80211_check_u16(const struct nlattr *nla, u16 min, u16 max, u16 *out) 5922 { 5923 u16 val = nla_get_u16(nla); 5924 if (val < min || val > max) 5925 return -EINVAL; 5926 *out = val; 5927 return 0; 5928 } 5929 5930 static int nl80211_check_u32(const struct nlattr *nla, u32 min, u32 max, u32 *out) 5931 { 5932 u32 val = nla_get_u32(nla); 5933 if (val < min || val > max) 5934 return -EINVAL; 5935 *out = val; 5936 return 0; 5937 } 5938 5939 static int nl80211_check_s32(const struct nlattr *nla, s32 min, s32 max, s32 *out) 5940 { 5941 s32 val = nla_get_s32(nla); 5942 if (val < min || val > max) 5943 return -EINVAL; 5944 *out = val; 5945 return 0; 5946 } 5947 5948 static int nl80211_check_power_mode(const struct nlattr *nla, 5949 enum nl80211_mesh_power_mode min, 5950 enum nl80211_mesh_power_mode max, 5951 enum nl80211_mesh_power_mode *out) 5952 { 5953 u32 val = nla_get_u32(nla); 5954 if (val < min || val > max) 5955 return -EINVAL; 5956 *out = val; 5957 return 0; 5958 } 5959 5960 static int nl80211_parse_mesh_config(struct genl_info *info, 5961 struct mesh_config *cfg, 5962 u32 *mask_out) 5963 { 5964 struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1]; 5965 u32 mask = 0; 5966 u16 ht_opmode; 5967 5968 #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, min, max, mask, attr, fn) \ 5969 do { \ 5970 if (tb[attr]) { \ 5971 if (fn(tb[attr], min, max, &cfg->param)) \ 5972 return -EINVAL; \ 5973 mask |= (1 << (attr - 1)); \ 5974 } \ 5975 } while (0) 5976 5977 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) 5978 return -EINVAL; 5979 if (nla_parse_nested(tb, NL80211_MESHCONF_ATTR_MAX, 5980 info->attrs[NL80211_ATTR_MESH_CONFIG], 5981 nl80211_meshconf_params_policy, info->extack)) 5982 return -EINVAL; 5983 5984 /* This makes sure that there aren't more than 32 mesh config 5985 * parameters (otherwise our bitfield scheme would not work.) */ 5986 BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32); 5987 5988 /* Fill in the params struct */ 5989 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout, 1, 255, 5990 mask, NL80211_MESHCONF_RETRY_TIMEOUT, 5991 nl80211_check_u16); 5992 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout, 1, 255, 5993 mask, NL80211_MESHCONF_CONFIRM_TIMEOUT, 5994 nl80211_check_u16); 5995 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout, 1, 255, 5996 mask, NL80211_MESHCONF_HOLDING_TIMEOUT, 5997 nl80211_check_u16); 5998 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks, 0, 255, 5999 mask, NL80211_MESHCONF_MAX_PEER_LINKS, 6000 nl80211_check_u16); 6001 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries, 0, 16, 6002 mask, NL80211_MESHCONF_MAX_RETRIES, 6003 nl80211_check_u8); 6004 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL, 1, 255, 6005 mask, NL80211_MESHCONF_TTL, nl80211_check_u8); 6006 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl, 1, 255, 6007 mask, NL80211_MESHCONF_ELEMENT_TTL, 6008 nl80211_check_u8); 6009 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks, 0, 1, 6010 mask, NL80211_MESHCONF_AUTO_OPEN_PLINKS, 6011 nl80211_check_bool); 6012 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor, 6013 1, 255, mask, 6014 NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 6015 nl80211_check_u32); 6016 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries, 0, 255, 6017 mask, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 6018 nl80211_check_u8); 6019 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time, 1, 65535, 6020 mask, NL80211_MESHCONF_PATH_REFRESH_TIME, 6021 nl80211_check_u32); 6022 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout, 1, 65535, 6023 mask, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 6024 nl80211_check_u16); 6025 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout, 6026 1, 65535, mask, 6027 NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 6028 nl80211_check_u32); 6029 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval, 6030 1, 65535, mask, 6031 NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 6032 nl80211_check_u16); 6033 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPperrMinInterval, 6034 1, 65535, mask, 6035 NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 6036 nl80211_check_u16); 6037 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 6038 dot11MeshHWMPnetDiameterTraversalTime, 6039 1, 65535, mask, 6040 NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 6041 nl80211_check_u16); 6042 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRootMode, 0, 4, 6043 mask, NL80211_MESHCONF_HWMP_ROOTMODE, 6044 nl80211_check_u8); 6045 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRannInterval, 1, 65535, 6046 mask, NL80211_MESHCONF_HWMP_RANN_INTERVAL, 6047 nl80211_check_u16); 6048 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 6049 dot11MeshGateAnnouncementProtocol, 0, 1, 6050 mask, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 6051 nl80211_check_bool); 6052 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, 0, 1, 6053 mask, NL80211_MESHCONF_FORWARDING, 6054 nl80211_check_bool); 6055 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, -255, 0, 6056 mask, NL80211_MESHCONF_RSSI_THRESHOLD, 6057 nl80211_check_s32); 6058 /* 6059 * Check HT operation mode based on 6060 * IEEE 802.11 2012 8.4.2.59 HT Operation element. 6061 */ 6062 if (tb[NL80211_MESHCONF_HT_OPMODE]) { 6063 ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]); 6064 6065 if (ht_opmode & ~(IEEE80211_HT_OP_MODE_PROTECTION | 6066 IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT | 6067 IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)) 6068 return -EINVAL; 6069 6070 if ((ht_opmode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT) && 6071 (ht_opmode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)) 6072 return -EINVAL; 6073 6074 switch (ht_opmode & IEEE80211_HT_OP_MODE_PROTECTION) { 6075 case IEEE80211_HT_OP_MODE_PROTECTION_NONE: 6076 case IEEE80211_HT_OP_MODE_PROTECTION_20MHZ: 6077 if (ht_opmode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT) 6078 return -EINVAL; 6079 break; 6080 case IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER: 6081 case IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED: 6082 if (!(ht_opmode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)) 6083 return -EINVAL; 6084 break; 6085 } 6086 cfg->ht_opmode = ht_opmode; 6087 mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); 6088 } 6089 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathToRootTimeout, 6090 1, 65535, mask, 6091 NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 6092 nl80211_check_u32); 6093 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMProotInterval, 1, 65535, 6094 mask, NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 6095 nl80211_check_u16); 6096 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 6097 dot11MeshHWMPconfirmationInterval, 6098 1, 65535, mask, 6099 NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 6100 nl80211_check_u16); 6101 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode, 6102 NL80211_MESH_POWER_ACTIVE, 6103 NL80211_MESH_POWER_MAX, 6104 mask, NL80211_MESHCONF_POWER_MODE, 6105 nl80211_check_power_mode); 6106 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration, 6107 0, 65535, mask, 6108 NL80211_MESHCONF_AWAKE_WINDOW, nl80211_check_u16); 6109 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, plink_timeout, 0, 0xffffffff, 6110 mask, NL80211_MESHCONF_PLINK_TIMEOUT, 6111 nl80211_check_u32); 6112 if (mask_out) 6113 *mask_out = mask; 6114 6115 return 0; 6116 6117 #undef FILL_IN_MESH_PARAM_IF_SET 6118 } 6119 6120 static int nl80211_parse_mesh_setup(struct genl_info *info, 6121 struct mesh_setup *setup) 6122 { 6123 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6124 struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1]; 6125 6126 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) 6127 return -EINVAL; 6128 if (nla_parse_nested(tb, NL80211_MESH_SETUP_ATTR_MAX, 6129 info->attrs[NL80211_ATTR_MESH_SETUP], 6130 nl80211_mesh_setup_params_policy, info->extack)) 6131 return -EINVAL; 6132 6133 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC]) 6134 setup->sync_method = 6135 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ? 6136 IEEE80211_SYNC_METHOD_VENDOR : 6137 IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET; 6138 6139 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL]) 6140 setup->path_sel_proto = 6141 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ? 6142 IEEE80211_PATH_PROTOCOL_VENDOR : 6143 IEEE80211_PATH_PROTOCOL_HWMP; 6144 6145 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC]) 6146 setup->path_metric = 6147 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ? 6148 IEEE80211_PATH_METRIC_VENDOR : 6149 IEEE80211_PATH_METRIC_AIRTIME; 6150 6151 if (tb[NL80211_MESH_SETUP_IE]) { 6152 struct nlattr *ieattr = 6153 tb[NL80211_MESH_SETUP_IE]; 6154 if (!is_valid_ie_attr(ieattr)) 6155 return -EINVAL; 6156 setup->ie = nla_data(ieattr); 6157 setup->ie_len = nla_len(ieattr); 6158 } 6159 if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] && 6160 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) 6161 return -EINVAL; 6162 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); 6163 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); 6164 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); 6165 if (setup->is_secure) 6166 setup->user_mpm = true; 6167 6168 if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) { 6169 if (!setup->user_mpm) 6170 return -EINVAL; 6171 setup->auth_id = 6172 nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]); 6173 } 6174 6175 return 0; 6176 } 6177 6178 static int nl80211_update_mesh_config(struct sk_buff *skb, 6179 struct genl_info *info) 6180 { 6181 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6182 struct net_device *dev = info->user_ptr[1]; 6183 struct wireless_dev *wdev = dev->ieee80211_ptr; 6184 struct mesh_config cfg; 6185 u32 mask; 6186 int err; 6187 6188 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 6189 return -EOPNOTSUPP; 6190 6191 if (!rdev->ops->update_mesh_config) 6192 return -EOPNOTSUPP; 6193 6194 err = nl80211_parse_mesh_config(info, &cfg, &mask); 6195 if (err) 6196 return err; 6197 6198 wdev_lock(wdev); 6199 if (!wdev->mesh_id_len) 6200 err = -ENOLINK; 6201 6202 if (!err) 6203 err = rdev_update_mesh_config(rdev, dev, mask, &cfg); 6204 6205 wdev_unlock(wdev); 6206 6207 return err; 6208 } 6209 6210 static int nl80211_put_regdom(const struct ieee80211_regdomain *regdom, 6211 struct sk_buff *msg) 6212 { 6213 struct nlattr *nl_reg_rules; 6214 unsigned int i; 6215 6216 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || 6217 (regdom->dfs_region && 6218 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) 6219 goto nla_put_failure; 6220 6221 nl_reg_rules = nla_nest_start(msg, NL80211_ATTR_REG_RULES); 6222 if (!nl_reg_rules) 6223 goto nla_put_failure; 6224 6225 for (i = 0; i < regdom->n_reg_rules; i++) { 6226 struct nlattr *nl_reg_rule; 6227 const struct ieee80211_reg_rule *reg_rule; 6228 const struct ieee80211_freq_range *freq_range; 6229 const struct ieee80211_power_rule *power_rule; 6230 unsigned int max_bandwidth_khz; 6231 6232 reg_rule = ®dom->reg_rules[i]; 6233 freq_range = ®_rule->freq_range; 6234 power_rule = ®_rule->power_rule; 6235 6236 nl_reg_rule = nla_nest_start(msg, i); 6237 if (!nl_reg_rule) 6238 goto nla_put_failure; 6239 6240 max_bandwidth_khz = freq_range->max_bandwidth_khz; 6241 if (!max_bandwidth_khz) 6242 max_bandwidth_khz = reg_get_max_bandwidth(regdom, 6243 reg_rule); 6244 6245 if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS, 6246 reg_rule->flags) || 6247 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START, 6248 freq_range->start_freq_khz) || 6249 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END, 6250 freq_range->end_freq_khz) || 6251 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW, 6252 max_bandwidth_khz) || 6253 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN, 6254 power_rule->max_antenna_gain) || 6255 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP, 6256 power_rule->max_eirp) || 6257 nla_put_u32(msg, NL80211_ATTR_DFS_CAC_TIME, 6258 reg_rule->dfs_cac_ms)) 6259 goto nla_put_failure; 6260 6261 nla_nest_end(msg, nl_reg_rule); 6262 } 6263 6264 nla_nest_end(msg, nl_reg_rules); 6265 return 0; 6266 6267 nla_put_failure: 6268 return -EMSGSIZE; 6269 } 6270 6271 static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info) 6272 { 6273 const struct ieee80211_regdomain *regdom = NULL; 6274 struct cfg80211_registered_device *rdev; 6275 struct wiphy *wiphy = NULL; 6276 struct sk_buff *msg; 6277 void *hdr; 6278 6279 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 6280 if (!msg) 6281 return -ENOBUFS; 6282 6283 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 6284 NL80211_CMD_GET_REG); 6285 if (!hdr) 6286 goto put_failure; 6287 6288 if (info->attrs[NL80211_ATTR_WIPHY]) { 6289 bool self_managed; 6290 6291 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 6292 if (IS_ERR(rdev)) { 6293 nlmsg_free(msg); 6294 return PTR_ERR(rdev); 6295 } 6296 6297 wiphy = &rdev->wiphy; 6298 self_managed = wiphy->regulatory_flags & 6299 REGULATORY_WIPHY_SELF_MANAGED; 6300 regdom = get_wiphy_regdom(wiphy); 6301 6302 /* a self-managed-reg device must have a private regdom */ 6303 if (WARN_ON(!regdom && self_managed)) { 6304 nlmsg_free(msg); 6305 return -EINVAL; 6306 } 6307 6308 if (regdom && 6309 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 6310 goto nla_put_failure; 6311 } 6312 6313 if (!wiphy && reg_last_request_cell_base() && 6314 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 6315 NL80211_USER_REG_HINT_CELL_BASE)) 6316 goto nla_put_failure; 6317 6318 rcu_read_lock(); 6319 6320 if (!regdom) 6321 regdom = rcu_dereference(cfg80211_regdomain); 6322 6323 if (nl80211_put_regdom(regdom, msg)) 6324 goto nla_put_failure_rcu; 6325 6326 rcu_read_unlock(); 6327 6328 genlmsg_end(msg, hdr); 6329 return genlmsg_reply(msg, info); 6330 6331 nla_put_failure_rcu: 6332 rcu_read_unlock(); 6333 nla_put_failure: 6334 put_failure: 6335 nlmsg_free(msg); 6336 return -EMSGSIZE; 6337 } 6338 6339 static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb, 6340 u32 seq, int flags, struct wiphy *wiphy, 6341 const struct ieee80211_regdomain *regdom) 6342 { 6343 void *hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 6344 NL80211_CMD_GET_REG); 6345 6346 if (!hdr) 6347 return -1; 6348 6349 genl_dump_check_consistent(cb, hdr); 6350 6351 if (nl80211_put_regdom(regdom, msg)) 6352 goto nla_put_failure; 6353 6354 if (!wiphy && reg_last_request_cell_base() && 6355 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 6356 NL80211_USER_REG_HINT_CELL_BASE)) 6357 goto nla_put_failure; 6358 6359 if (wiphy && 6360 nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 6361 goto nla_put_failure; 6362 6363 if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 6364 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 6365 goto nla_put_failure; 6366 6367 genlmsg_end(msg, hdr); 6368 return 0; 6369 6370 nla_put_failure: 6371 genlmsg_cancel(msg, hdr); 6372 return -EMSGSIZE; 6373 } 6374 6375 static int nl80211_get_reg_dump(struct sk_buff *skb, 6376 struct netlink_callback *cb) 6377 { 6378 const struct ieee80211_regdomain *regdom = NULL; 6379 struct cfg80211_registered_device *rdev; 6380 int err, reg_idx, start = cb->args[2]; 6381 6382 rtnl_lock(); 6383 6384 if (cfg80211_regdomain && start == 0) { 6385 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, 6386 NLM_F_MULTI, NULL, 6387 rtnl_dereference(cfg80211_regdomain)); 6388 if (err < 0) 6389 goto out_err; 6390 } 6391 6392 /* the global regdom is idx 0 */ 6393 reg_idx = 1; 6394 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 6395 regdom = get_wiphy_regdom(&rdev->wiphy); 6396 if (!regdom) 6397 continue; 6398 6399 if (++reg_idx <= start) 6400 continue; 6401 6402 err = nl80211_send_regdom(skb, cb, cb->nlh->nlmsg_seq, 6403 NLM_F_MULTI, &rdev->wiphy, regdom); 6404 if (err < 0) { 6405 reg_idx--; 6406 break; 6407 } 6408 } 6409 6410 cb->args[2] = reg_idx; 6411 err = skb->len; 6412 out_err: 6413 rtnl_unlock(); 6414 return err; 6415 } 6416 6417 #ifdef CONFIG_CFG80211_CRDA_SUPPORT 6418 static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = { 6419 [NL80211_ATTR_REG_RULE_FLAGS] = { .type = NLA_U32 }, 6420 [NL80211_ATTR_FREQ_RANGE_START] = { .type = NLA_U32 }, 6421 [NL80211_ATTR_FREQ_RANGE_END] = { .type = NLA_U32 }, 6422 [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 }, 6423 [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 }, 6424 [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 }, 6425 [NL80211_ATTR_DFS_CAC_TIME] = { .type = NLA_U32 }, 6426 }; 6427 6428 static int parse_reg_rule(struct nlattr *tb[], 6429 struct ieee80211_reg_rule *reg_rule) 6430 { 6431 struct ieee80211_freq_range *freq_range = ®_rule->freq_range; 6432 struct ieee80211_power_rule *power_rule = ®_rule->power_rule; 6433 6434 if (!tb[NL80211_ATTR_REG_RULE_FLAGS]) 6435 return -EINVAL; 6436 if (!tb[NL80211_ATTR_FREQ_RANGE_START]) 6437 return -EINVAL; 6438 if (!tb[NL80211_ATTR_FREQ_RANGE_END]) 6439 return -EINVAL; 6440 if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]) 6441 return -EINVAL; 6442 if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]) 6443 return -EINVAL; 6444 6445 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); 6446 6447 freq_range->start_freq_khz = 6448 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]); 6449 freq_range->end_freq_khz = 6450 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]); 6451 freq_range->max_bandwidth_khz = 6452 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]); 6453 6454 power_rule->max_eirp = 6455 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]); 6456 6457 if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]) 6458 power_rule->max_antenna_gain = 6459 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]); 6460 6461 if (tb[NL80211_ATTR_DFS_CAC_TIME]) 6462 reg_rule->dfs_cac_ms = 6463 nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]); 6464 6465 return 0; 6466 } 6467 6468 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info) 6469 { 6470 struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1]; 6471 struct nlattr *nl_reg_rule; 6472 char *alpha2; 6473 int rem_reg_rules, r; 6474 u32 num_rules = 0, rule_idx = 0, size_of_regd; 6475 enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET; 6476 struct ieee80211_regdomain *rd; 6477 6478 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 6479 return -EINVAL; 6480 6481 if (!info->attrs[NL80211_ATTR_REG_RULES]) 6482 return -EINVAL; 6483 6484 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 6485 6486 if (info->attrs[NL80211_ATTR_DFS_REGION]) 6487 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); 6488 6489 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 6490 rem_reg_rules) { 6491 num_rules++; 6492 if (num_rules > NL80211_MAX_SUPP_REG_RULES) 6493 return -EINVAL; 6494 } 6495 6496 if (!reg_is_valid_request(alpha2)) 6497 return -EINVAL; 6498 6499 size_of_regd = sizeof(struct ieee80211_regdomain) + 6500 num_rules * sizeof(struct ieee80211_reg_rule); 6501 6502 rd = kzalloc(size_of_regd, GFP_KERNEL); 6503 if (!rd) 6504 return -ENOMEM; 6505 6506 rd->n_reg_rules = num_rules; 6507 rd->alpha2[0] = alpha2[0]; 6508 rd->alpha2[1] = alpha2[1]; 6509 6510 /* 6511 * Disable DFS master mode if the DFS region was 6512 * not supported or known on this kernel. 6513 */ 6514 if (reg_supported_dfs_region(dfs_region)) 6515 rd->dfs_region = dfs_region; 6516 6517 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 6518 rem_reg_rules) { 6519 r = nla_parse_nested(tb, NL80211_REG_RULE_ATTR_MAX, 6520 nl_reg_rule, reg_rule_policy, 6521 info->extack); 6522 if (r) 6523 goto bad_reg; 6524 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); 6525 if (r) 6526 goto bad_reg; 6527 6528 rule_idx++; 6529 6530 if (rule_idx > NL80211_MAX_SUPP_REG_RULES) { 6531 r = -EINVAL; 6532 goto bad_reg; 6533 } 6534 } 6535 6536 /* set_regdom takes ownership of rd */ 6537 return set_regdom(rd, REGD_SOURCE_CRDA); 6538 bad_reg: 6539 kfree(rd); 6540 return r; 6541 } 6542 #endif /* CONFIG_CFG80211_CRDA_SUPPORT */ 6543 6544 static int validate_scan_freqs(struct nlattr *freqs) 6545 { 6546 struct nlattr *attr1, *attr2; 6547 int n_channels = 0, tmp1, tmp2; 6548 6549 nla_for_each_nested(attr1, freqs, tmp1) 6550 if (nla_len(attr1) != sizeof(u32)) 6551 return 0; 6552 6553 nla_for_each_nested(attr1, freqs, tmp1) { 6554 n_channels++; 6555 /* 6556 * Some hardware has a limited channel list for 6557 * scanning, and it is pretty much nonsensical 6558 * to scan for a channel twice, so disallow that 6559 * and don't require drivers to check that the 6560 * channel list they get isn't longer than what 6561 * they can scan, as long as they can scan all 6562 * the channels they registered at once. 6563 */ 6564 nla_for_each_nested(attr2, freqs, tmp2) 6565 if (attr1 != attr2 && 6566 nla_get_u32(attr1) == nla_get_u32(attr2)) 6567 return 0; 6568 } 6569 6570 return n_channels; 6571 } 6572 6573 static bool is_band_valid(struct wiphy *wiphy, enum nl80211_band b) 6574 { 6575 return b < NUM_NL80211_BANDS && wiphy->bands[b]; 6576 } 6577 6578 static int parse_bss_select(struct nlattr *nla, struct wiphy *wiphy, 6579 struct cfg80211_bss_selection *bss_select) 6580 { 6581 struct nlattr *attr[NL80211_BSS_SELECT_ATTR_MAX + 1]; 6582 struct nlattr *nest; 6583 int err; 6584 bool found = false; 6585 int i; 6586 6587 /* only process one nested attribute */ 6588 nest = nla_data(nla); 6589 if (!nla_ok(nest, nla_len(nest))) 6590 return -EINVAL; 6591 6592 err = nla_parse_nested(attr, NL80211_BSS_SELECT_ATTR_MAX, nest, 6593 nl80211_bss_select_policy, NULL); 6594 if (err) 6595 return err; 6596 6597 /* only one attribute may be given */ 6598 for (i = 0; i <= NL80211_BSS_SELECT_ATTR_MAX; i++) { 6599 if (attr[i]) { 6600 if (found) 6601 return -EINVAL; 6602 found = true; 6603 } 6604 } 6605 6606 bss_select->behaviour = __NL80211_BSS_SELECT_ATTR_INVALID; 6607 6608 if (attr[NL80211_BSS_SELECT_ATTR_RSSI]) 6609 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI; 6610 6611 if (attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]) { 6612 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_BAND_PREF; 6613 bss_select->param.band_pref = 6614 nla_get_u32(attr[NL80211_BSS_SELECT_ATTR_BAND_PREF]); 6615 if (!is_band_valid(wiphy, bss_select->param.band_pref)) 6616 return -EINVAL; 6617 } 6618 6619 if (attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]) { 6620 struct nl80211_bss_select_rssi_adjust *adj_param; 6621 6622 adj_param = nla_data(attr[NL80211_BSS_SELECT_ATTR_RSSI_ADJUST]); 6623 bss_select->behaviour = NL80211_BSS_SELECT_ATTR_RSSI_ADJUST; 6624 bss_select->param.adjust.band = adj_param->band; 6625 bss_select->param.adjust.delta = adj_param->delta; 6626 if (!is_band_valid(wiphy, bss_select->param.adjust.band)) 6627 return -EINVAL; 6628 } 6629 6630 /* user-space did not provide behaviour attribute */ 6631 if (bss_select->behaviour == __NL80211_BSS_SELECT_ATTR_INVALID) 6632 return -EINVAL; 6633 6634 if (!(wiphy->bss_select_support & BIT(bss_select->behaviour))) 6635 return -EINVAL; 6636 6637 return 0; 6638 } 6639 6640 static int nl80211_parse_random_mac(struct nlattr **attrs, 6641 u8 *mac_addr, u8 *mac_addr_mask) 6642 { 6643 int i; 6644 6645 if (!attrs[NL80211_ATTR_MAC] && !attrs[NL80211_ATTR_MAC_MASK]) { 6646 eth_zero_addr(mac_addr); 6647 eth_zero_addr(mac_addr_mask); 6648 mac_addr[0] = 0x2; 6649 mac_addr_mask[0] = 0x3; 6650 6651 return 0; 6652 } 6653 6654 /* need both or none */ 6655 if (!attrs[NL80211_ATTR_MAC] || !attrs[NL80211_ATTR_MAC_MASK]) 6656 return -EINVAL; 6657 6658 memcpy(mac_addr, nla_data(attrs[NL80211_ATTR_MAC]), ETH_ALEN); 6659 memcpy(mac_addr_mask, nla_data(attrs[NL80211_ATTR_MAC_MASK]), ETH_ALEN); 6660 6661 /* don't allow or configure an mcast address */ 6662 if (!is_multicast_ether_addr(mac_addr_mask) || 6663 is_multicast_ether_addr(mac_addr)) 6664 return -EINVAL; 6665 6666 /* 6667 * allow users to pass a MAC address that has bits set outside 6668 * of the mask, but don't bother drivers with having to deal 6669 * with such bits 6670 */ 6671 for (i = 0; i < ETH_ALEN; i++) 6672 mac_addr[i] &= mac_addr_mask[i]; 6673 6674 return 0; 6675 } 6676 6677 static bool cfg80211_off_channel_oper_allowed(struct wireless_dev *wdev) 6678 { 6679 ASSERT_WDEV_LOCK(wdev); 6680 6681 if (!cfg80211_beaconing_iface_active(wdev)) 6682 return true; 6683 6684 if (!(wdev->chandef.chan->flags & IEEE80211_CHAN_RADAR)) 6685 return true; 6686 6687 return regulatory_pre_cac_allowed(wdev->wiphy); 6688 } 6689 6690 static int 6691 nl80211_check_scan_flags(struct wiphy *wiphy, struct wireless_dev *wdev, 6692 void *request, struct nlattr **attrs, 6693 bool is_sched_scan) 6694 { 6695 u8 *mac_addr, *mac_addr_mask; 6696 u32 *flags; 6697 enum nl80211_feature_flags randomness_flag; 6698 6699 if (!attrs[NL80211_ATTR_SCAN_FLAGS]) 6700 return 0; 6701 6702 if (is_sched_scan) { 6703 struct cfg80211_sched_scan_request *req = request; 6704 6705 randomness_flag = wdev ? 6706 NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR : 6707 NL80211_FEATURE_ND_RANDOM_MAC_ADDR; 6708 flags = &req->flags; 6709 mac_addr = req->mac_addr; 6710 mac_addr_mask = req->mac_addr_mask; 6711 } else { 6712 struct cfg80211_scan_request *req = request; 6713 6714 randomness_flag = NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR; 6715 flags = &req->flags; 6716 mac_addr = req->mac_addr; 6717 mac_addr_mask = req->mac_addr_mask; 6718 } 6719 6720 *flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]); 6721 6722 if (((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) && 6723 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) || 6724 ((*flags & NL80211_SCAN_FLAG_LOW_SPAN) && 6725 !wiphy_ext_feature_isset(wiphy, 6726 NL80211_EXT_FEATURE_LOW_SPAN_SCAN)) || 6727 ((*flags & NL80211_SCAN_FLAG_LOW_POWER) && 6728 !wiphy_ext_feature_isset(wiphy, 6729 NL80211_EXT_FEATURE_LOW_POWER_SCAN)) || 6730 ((*flags & NL80211_SCAN_FLAG_HIGH_ACCURACY) && 6731 !wiphy_ext_feature_isset(wiphy, 6732 NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN))) 6733 return -EOPNOTSUPP; 6734 6735 if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { 6736 int err; 6737 6738 if (!(wiphy->features & randomness_flag) || 6739 (wdev && wdev->current_bss)) 6740 return -EOPNOTSUPP; 6741 6742 err = nl80211_parse_random_mac(attrs, mac_addr, mac_addr_mask); 6743 if (err) 6744 return err; 6745 } 6746 6747 if ((*flags & NL80211_SCAN_FLAG_FILS_MAX_CHANNEL_TIME) && 6748 !wiphy_ext_feature_isset(wiphy, 6749 NL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME)) 6750 return -EOPNOTSUPP; 6751 6752 if ((*flags & NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP) && 6753 !wiphy_ext_feature_isset(wiphy, 6754 NL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP)) 6755 return -EOPNOTSUPP; 6756 6757 if ((*flags & NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION) && 6758 !wiphy_ext_feature_isset(wiphy, 6759 NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION)) 6760 return -EOPNOTSUPP; 6761 6762 if ((*flags & NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE) && 6763 !wiphy_ext_feature_isset(wiphy, 6764 NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE)) 6765 return -EOPNOTSUPP; 6766 6767 return 0; 6768 } 6769 6770 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) 6771 { 6772 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6773 struct wireless_dev *wdev = info->user_ptr[1]; 6774 struct cfg80211_scan_request *request; 6775 struct nlattr *attr; 6776 struct wiphy *wiphy; 6777 int err, tmp, n_ssids = 0, n_channels, i; 6778 size_t ie_len; 6779 6780 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) 6781 return -EINVAL; 6782 6783 wiphy = &rdev->wiphy; 6784 6785 if (wdev->iftype == NL80211_IFTYPE_NAN) 6786 return -EOPNOTSUPP; 6787 6788 if (!rdev->ops->scan) 6789 return -EOPNOTSUPP; 6790 6791 if (rdev->scan_req || rdev->scan_msg) { 6792 err = -EBUSY; 6793 goto unlock; 6794 } 6795 6796 if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 6797 n_channels = validate_scan_freqs( 6798 info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]); 6799 if (!n_channels) { 6800 err = -EINVAL; 6801 goto unlock; 6802 } 6803 } else { 6804 n_channels = ieee80211_get_num_supported_channels(wiphy); 6805 } 6806 6807 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) 6808 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) 6809 n_ssids++; 6810 6811 if (n_ssids > wiphy->max_scan_ssids) { 6812 err = -EINVAL; 6813 goto unlock; 6814 } 6815 6816 if (info->attrs[NL80211_ATTR_IE]) 6817 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 6818 else 6819 ie_len = 0; 6820 6821 if (ie_len > wiphy->max_scan_ie_len) { 6822 err = -EINVAL; 6823 goto unlock; 6824 } 6825 6826 request = kzalloc(sizeof(*request) 6827 + sizeof(*request->ssids) * n_ssids 6828 + sizeof(*request->channels) * n_channels 6829 + ie_len, GFP_KERNEL); 6830 if (!request) { 6831 err = -ENOMEM; 6832 goto unlock; 6833 } 6834 6835 if (n_ssids) 6836 request->ssids = (void *)&request->channels[n_channels]; 6837 request->n_ssids = n_ssids; 6838 if (ie_len) { 6839 if (n_ssids) 6840 request->ie = (void *)(request->ssids + n_ssids); 6841 else 6842 request->ie = (void *)(request->channels + n_channels); 6843 } 6844 6845 i = 0; 6846 if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 6847 /* user specified, bail out if channel not found */ 6848 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_FREQUENCIES], tmp) { 6849 struct ieee80211_channel *chan; 6850 6851 chan = ieee80211_get_channel(wiphy, nla_get_u32(attr)); 6852 6853 if (!chan) { 6854 err = -EINVAL; 6855 goto out_free; 6856 } 6857 6858 /* ignore disabled channels */ 6859 if (chan->flags & IEEE80211_CHAN_DISABLED) 6860 continue; 6861 6862 request->channels[i] = chan; 6863 i++; 6864 } 6865 } else { 6866 enum nl80211_band band; 6867 6868 /* all channels */ 6869 for (band = 0; band < NUM_NL80211_BANDS; band++) { 6870 int j; 6871 6872 if (!wiphy->bands[band]) 6873 continue; 6874 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 6875 struct ieee80211_channel *chan; 6876 6877 chan = &wiphy->bands[band]->channels[j]; 6878 6879 if (chan->flags & IEEE80211_CHAN_DISABLED) 6880 continue; 6881 6882 request->channels[i] = chan; 6883 i++; 6884 } 6885 } 6886 } 6887 6888 if (!i) { 6889 err = -EINVAL; 6890 goto out_free; 6891 } 6892 6893 request->n_channels = i; 6894 6895 wdev_lock(wdev); 6896 if (!cfg80211_off_channel_oper_allowed(wdev)) { 6897 struct ieee80211_channel *chan; 6898 6899 if (request->n_channels != 1) { 6900 wdev_unlock(wdev); 6901 err = -EBUSY; 6902 goto out_free; 6903 } 6904 6905 chan = request->channels[0]; 6906 if (chan->center_freq != wdev->chandef.chan->center_freq) { 6907 wdev_unlock(wdev); 6908 err = -EBUSY; 6909 goto out_free; 6910 } 6911 } 6912 wdev_unlock(wdev); 6913 6914 i = 0; 6915 if (n_ssids) { 6916 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { 6917 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 6918 err = -EINVAL; 6919 goto out_free; 6920 } 6921 request->ssids[i].ssid_len = nla_len(attr); 6922 memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr)); 6923 i++; 6924 } 6925 } 6926 6927 if (info->attrs[NL80211_ATTR_IE]) { 6928 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 6929 memcpy((void *)request->ie, 6930 nla_data(info->attrs[NL80211_ATTR_IE]), 6931 request->ie_len); 6932 } 6933 6934 for (i = 0; i < NUM_NL80211_BANDS; i++) 6935 if (wiphy->bands[i]) 6936 request->rates[i] = 6937 (1 << wiphy->bands[i]->n_bitrates) - 1; 6938 6939 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { 6940 nla_for_each_nested(attr, 6941 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], 6942 tmp) { 6943 enum nl80211_band band = nla_type(attr); 6944 6945 if (band < 0 || band >= NUM_NL80211_BANDS) { 6946 err = -EINVAL; 6947 goto out_free; 6948 } 6949 6950 if (!wiphy->bands[band]) 6951 continue; 6952 6953 err = ieee80211_get_ratemask(wiphy->bands[band], 6954 nla_data(attr), 6955 nla_len(attr), 6956 &request->rates[band]); 6957 if (err) 6958 goto out_free; 6959 } 6960 } 6961 6962 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { 6963 if (!wiphy_ext_feature_isset(wiphy, 6964 NL80211_EXT_FEATURE_SET_SCAN_DWELL)) { 6965 err = -EOPNOTSUPP; 6966 goto out_free; 6967 } 6968 6969 request->duration = 6970 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); 6971 request->duration_mandatory = 6972 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); 6973 } 6974 6975 err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs, 6976 false); 6977 if (err) 6978 goto out_free; 6979 6980 request->no_cck = 6981 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 6982 6983 /* Initial implementation used NL80211_ATTR_MAC to set the specific 6984 * BSSID to scan for. This was problematic because that same attribute 6985 * was already used for another purpose (local random MAC address). The 6986 * NL80211_ATTR_BSSID attribute was added to fix this. For backwards 6987 * compatibility with older userspace components, also use the 6988 * NL80211_ATTR_MAC value here if it can be determined to be used for 6989 * the specific BSSID use case instead of the random MAC address 6990 * (NL80211_ATTR_SCAN_FLAGS is used to enable random MAC address use). 6991 */ 6992 if (info->attrs[NL80211_ATTR_BSSID]) 6993 memcpy(request->bssid, 6994 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); 6995 else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && 6996 info->attrs[NL80211_ATTR_MAC]) 6997 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]), 6998 ETH_ALEN); 6999 else 7000 eth_broadcast_addr(request->bssid); 7001 7002 request->wdev = wdev; 7003 request->wiphy = &rdev->wiphy; 7004 request->scan_start = jiffies; 7005 7006 rdev->scan_req = request; 7007 err = rdev_scan(rdev, request); 7008 7009 if (!err) { 7010 nl80211_send_scan_start(rdev, wdev); 7011 if (wdev->netdev) 7012 dev_hold(wdev->netdev); 7013 } else { 7014 out_free: 7015 rdev->scan_req = NULL; 7016 kfree(request); 7017 } 7018 7019 unlock: 7020 return err; 7021 } 7022 7023 static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info) 7024 { 7025 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7026 struct wireless_dev *wdev = info->user_ptr[1]; 7027 7028 if (!rdev->ops->abort_scan) 7029 return -EOPNOTSUPP; 7030 7031 if (rdev->scan_msg) 7032 return 0; 7033 7034 if (!rdev->scan_req) 7035 return -ENOENT; 7036 7037 rdev_abort_scan(rdev, wdev); 7038 return 0; 7039 } 7040 7041 static int 7042 nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans, 7043 struct cfg80211_sched_scan_request *request, 7044 struct nlattr **attrs) 7045 { 7046 int tmp, err, i = 0; 7047 struct nlattr *attr; 7048 7049 if (!attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) { 7050 u32 interval; 7051 7052 /* 7053 * If scan plans are not specified, 7054 * %NL80211_ATTR_SCHED_SCAN_INTERVAL will be specified. In this 7055 * case one scan plan will be set with the specified scan 7056 * interval and infinite number of iterations. 7057 */ 7058 interval = nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]); 7059 if (!interval) 7060 return -EINVAL; 7061 7062 request->scan_plans[0].interval = 7063 DIV_ROUND_UP(interval, MSEC_PER_SEC); 7064 if (!request->scan_plans[0].interval) 7065 return -EINVAL; 7066 7067 if (request->scan_plans[0].interval > 7068 wiphy->max_sched_scan_plan_interval) 7069 request->scan_plans[0].interval = 7070 wiphy->max_sched_scan_plan_interval; 7071 7072 return 0; 7073 } 7074 7075 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) { 7076 struct nlattr *plan[NL80211_SCHED_SCAN_PLAN_MAX + 1]; 7077 7078 if (WARN_ON(i >= n_plans)) 7079 return -EINVAL; 7080 7081 err = nla_parse_nested(plan, NL80211_SCHED_SCAN_PLAN_MAX, 7082 attr, nl80211_plan_policy, NULL); 7083 if (err) 7084 return err; 7085 7086 if (!plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]) 7087 return -EINVAL; 7088 7089 request->scan_plans[i].interval = 7090 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_INTERVAL]); 7091 if (!request->scan_plans[i].interval || 7092 request->scan_plans[i].interval > 7093 wiphy->max_sched_scan_plan_interval) 7094 return -EINVAL; 7095 7096 if (plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]) { 7097 request->scan_plans[i].iterations = 7098 nla_get_u32(plan[NL80211_SCHED_SCAN_PLAN_ITERATIONS]); 7099 if (!request->scan_plans[i].iterations || 7100 (request->scan_plans[i].iterations > 7101 wiphy->max_sched_scan_plan_iterations)) 7102 return -EINVAL; 7103 } else if (i < n_plans - 1) { 7104 /* 7105 * All scan plans but the last one must specify 7106 * a finite number of iterations 7107 */ 7108 return -EINVAL; 7109 } 7110 7111 i++; 7112 } 7113 7114 /* 7115 * The last scan plan must not specify the number of 7116 * iterations, it is supposed to run infinitely 7117 */ 7118 if (request->scan_plans[n_plans - 1].iterations) 7119 return -EINVAL; 7120 7121 return 0; 7122 } 7123 7124 static struct cfg80211_sched_scan_request * 7125 nl80211_parse_sched_scan(struct wiphy *wiphy, struct wireless_dev *wdev, 7126 struct nlattr **attrs, int max_match_sets) 7127 { 7128 struct cfg80211_sched_scan_request *request; 7129 struct nlattr *attr; 7130 int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i, n_plans = 0; 7131 enum nl80211_band band; 7132 size_t ie_len; 7133 struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1]; 7134 s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF; 7135 7136 if (!is_valid_ie_attr(attrs[NL80211_ATTR_IE])) 7137 return ERR_PTR(-EINVAL); 7138 7139 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 7140 n_channels = validate_scan_freqs( 7141 attrs[NL80211_ATTR_SCAN_FREQUENCIES]); 7142 if (!n_channels) 7143 return ERR_PTR(-EINVAL); 7144 } else { 7145 n_channels = ieee80211_get_num_supported_channels(wiphy); 7146 } 7147 7148 if (attrs[NL80211_ATTR_SCAN_SSIDS]) 7149 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS], 7150 tmp) 7151 n_ssids++; 7152 7153 if (n_ssids > wiphy->max_sched_scan_ssids) 7154 return ERR_PTR(-EINVAL); 7155 7156 /* 7157 * First, count the number of 'real' matchsets. Due to an issue with 7158 * the old implementation, matchsets containing only the RSSI attribute 7159 * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default' 7160 * RSSI for all matchsets, rather than their own matchset for reporting 7161 * all APs with a strong RSSI. This is needed to be compatible with 7162 * older userspace that treated a matchset with only the RSSI as the 7163 * global RSSI for all other matchsets - if there are other matchsets. 7164 */ 7165 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 7166 nla_for_each_nested(attr, 7167 attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 7168 tmp) { 7169 struct nlattr *rssi; 7170 7171 err = nla_parse_nested(tb, 7172 NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 7173 attr, nl80211_match_policy, 7174 NULL); 7175 if (err) 7176 return ERR_PTR(err); 7177 7178 /* SSID and BSSID are mutually exclusive */ 7179 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] && 7180 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) 7181 return ERR_PTR(-EINVAL); 7182 7183 /* add other standalone attributes here */ 7184 if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID] || 7185 tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]) { 7186 n_match_sets++; 7187 continue; 7188 } 7189 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 7190 if (rssi) 7191 default_match_rssi = nla_get_s32(rssi); 7192 } 7193 } 7194 7195 /* However, if there's no other matchset, add the RSSI one */ 7196 if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF) 7197 n_match_sets = 1; 7198 7199 if (n_match_sets > max_match_sets) 7200 return ERR_PTR(-EINVAL); 7201 7202 if (attrs[NL80211_ATTR_IE]) 7203 ie_len = nla_len(attrs[NL80211_ATTR_IE]); 7204 else 7205 ie_len = 0; 7206 7207 if (ie_len > wiphy->max_sched_scan_ie_len) 7208 return ERR_PTR(-EINVAL); 7209 7210 if (attrs[NL80211_ATTR_SCHED_SCAN_PLANS]) { 7211 /* 7212 * NL80211_ATTR_SCHED_SCAN_INTERVAL must not be specified since 7213 * each scan plan already specifies its own interval 7214 */ 7215 if (attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 7216 return ERR_PTR(-EINVAL); 7217 7218 nla_for_each_nested(attr, 7219 attrs[NL80211_ATTR_SCHED_SCAN_PLANS], tmp) 7220 n_plans++; 7221 } else { 7222 /* 7223 * The scan interval attribute is kept for backward 7224 * compatibility. If no scan plans are specified and sched scan 7225 * interval is specified, one scan plan will be set with this 7226 * scan interval and infinite number of iterations. 7227 */ 7228 if (!attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 7229 return ERR_PTR(-EINVAL); 7230 7231 n_plans = 1; 7232 } 7233 7234 if (!n_plans || n_plans > wiphy->max_sched_scan_plans) 7235 return ERR_PTR(-EINVAL); 7236 7237 if (!wiphy_ext_feature_isset( 7238 wiphy, NL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI) && 7239 (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI] || 7240 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST])) 7241 return ERR_PTR(-EINVAL); 7242 7243 request = kzalloc(sizeof(*request) 7244 + sizeof(*request->ssids) * n_ssids 7245 + sizeof(*request->match_sets) * n_match_sets 7246 + sizeof(*request->scan_plans) * n_plans 7247 + sizeof(*request->channels) * n_channels 7248 + ie_len, GFP_KERNEL); 7249 if (!request) 7250 return ERR_PTR(-ENOMEM); 7251 7252 if (n_ssids) 7253 request->ssids = (void *)&request->channels[n_channels]; 7254 request->n_ssids = n_ssids; 7255 if (ie_len) { 7256 if (n_ssids) 7257 request->ie = (void *)(request->ssids + n_ssids); 7258 else 7259 request->ie = (void *)(request->channels + n_channels); 7260 } 7261 7262 if (n_match_sets) { 7263 if (request->ie) 7264 request->match_sets = (void *)(request->ie + ie_len); 7265 else if (n_ssids) 7266 request->match_sets = 7267 (void *)(request->ssids + n_ssids); 7268 else 7269 request->match_sets = 7270 (void *)(request->channels + n_channels); 7271 } 7272 request->n_match_sets = n_match_sets; 7273 7274 if (n_match_sets) 7275 request->scan_plans = (void *)(request->match_sets + 7276 n_match_sets); 7277 else if (request->ie) 7278 request->scan_plans = (void *)(request->ie + ie_len); 7279 else if (n_ssids) 7280 request->scan_plans = (void *)(request->ssids + n_ssids); 7281 else 7282 request->scan_plans = (void *)(request->channels + n_channels); 7283 7284 request->n_scan_plans = n_plans; 7285 7286 i = 0; 7287 if (attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 7288 /* user specified, bail out if channel not found */ 7289 nla_for_each_nested(attr, 7290 attrs[NL80211_ATTR_SCAN_FREQUENCIES], 7291 tmp) { 7292 struct ieee80211_channel *chan; 7293 7294 chan = ieee80211_get_channel(wiphy, nla_get_u32(attr)); 7295 7296 if (!chan) { 7297 err = -EINVAL; 7298 goto out_free; 7299 } 7300 7301 /* ignore disabled channels */ 7302 if (chan->flags & IEEE80211_CHAN_DISABLED) 7303 continue; 7304 7305 request->channels[i] = chan; 7306 i++; 7307 } 7308 } else { 7309 /* all channels */ 7310 for (band = 0; band < NUM_NL80211_BANDS; band++) { 7311 int j; 7312 7313 if (!wiphy->bands[band]) 7314 continue; 7315 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 7316 struct ieee80211_channel *chan; 7317 7318 chan = &wiphy->bands[band]->channels[j]; 7319 7320 if (chan->flags & IEEE80211_CHAN_DISABLED) 7321 continue; 7322 7323 request->channels[i] = chan; 7324 i++; 7325 } 7326 } 7327 } 7328 7329 if (!i) { 7330 err = -EINVAL; 7331 goto out_free; 7332 } 7333 7334 request->n_channels = i; 7335 7336 i = 0; 7337 if (n_ssids) { 7338 nla_for_each_nested(attr, attrs[NL80211_ATTR_SCAN_SSIDS], 7339 tmp) { 7340 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 7341 err = -EINVAL; 7342 goto out_free; 7343 } 7344 request->ssids[i].ssid_len = nla_len(attr); 7345 memcpy(request->ssids[i].ssid, nla_data(attr), 7346 nla_len(attr)); 7347 i++; 7348 } 7349 } 7350 7351 i = 0; 7352 if (attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 7353 nla_for_each_nested(attr, 7354 attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 7355 tmp) { 7356 struct nlattr *ssid, *bssid, *rssi; 7357 7358 err = nla_parse_nested(tb, 7359 NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 7360 attr, nl80211_match_policy, 7361 NULL); 7362 if (err) 7363 goto out_free; 7364 ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID]; 7365 bssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_BSSID]; 7366 if (ssid || bssid) { 7367 if (WARN_ON(i >= n_match_sets)) { 7368 /* this indicates a programming error, 7369 * the loop above should have verified 7370 * things properly 7371 */ 7372 err = -EINVAL; 7373 goto out_free; 7374 } 7375 7376 if (ssid) { 7377 if (nla_len(ssid) > IEEE80211_MAX_SSID_LEN) { 7378 err = -EINVAL; 7379 goto out_free; 7380 } 7381 memcpy(request->match_sets[i].ssid.ssid, 7382 nla_data(ssid), nla_len(ssid)); 7383 request->match_sets[i].ssid.ssid_len = 7384 nla_len(ssid); 7385 } 7386 if (bssid) { 7387 if (nla_len(bssid) != ETH_ALEN) { 7388 err = -EINVAL; 7389 goto out_free; 7390 } 7391 memcpy(request->match_sets[i].bssid, 7392 nla_data(bssid), ETH_ALEN); 7393 } 7394 7395 /* special attribute - old implementation w/a */ 7396 request->match_sets[i].rssi_thold = 7397 default_match_rssi; 7398 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 7399 if (rssi) 7400 request->match_sets[i].rssi_thold = 7401 nla_get_s32(rssi); 7402 } 7403 i++; 7404 } 7405 7406 /* there was no other matchset, so the RSSI one is alone */ 7407 if (i == 0 && n_match_sets) 7408 request->match_sets[0].rssi_thold = default_match_rssi; 7409 7410 request->min_rssi_thold = INT_MAX; 7411 for (i = 0; i < n_match_sets; i++) 7412 request->min_rssi_thold = 7413 min(request->match_sets[i].rssi_thold, 7414 request->min_rssi_thold); 7415 } else { 7416 request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF; 7417 } 7418 7419 if (ie_len) { 7420 request->ie_len = ie_len; 7421 memcpy((void *)request->ie, 7422 nla_data(attrs[NL80211_ATTR_IE]), 7423 request->ie_len); 7424 } 7425 7426 err = nl80211_check_scan_flags(wiphy, wdev, request, attrs, true); 7427 if (err) 7428 goto out_free; 7429 7430 if (attrs[NL80211_ATTR_SCHED_SCAN_DELAY]) 7431 request->delay = 7432 nla_get_u32(attrs[NL80211_ATTR_SCHED_SCAN_DELAY]); 7433 7434 if (attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]) { 7435 request->relative_rssi = nla_get_s8( 7436 attrs[NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI]); 7437 request->relative_rssi_set = true; 7438 } 7439 7440 if (request->relative_rssi_set && 7441 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]) { 7442 struct nl80211_bss_select_rssi_adjust *rssi_adjust; 7443 7444 rssi_adjust = nla_data( 7445 attrs[NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST]); 7446 request->rssi_adjust.band = rssi_adjust->band; 7447 request->rssi_adjust.delta = rssi_adjust->delta; 7448 if (!is_band_valid(wiphy, request->rssi_adjust.band)) { 7449 err = -EINVAL; 7450 goto out_free; 7451 } 7452 } 7453 7454 err = nl80211_parse_sched_scan_plans(wiphy, n_plans, request, attrs); 7455 if (err) 7456 goto out_free; 7457 7458 request->scan_start = jiffies; 7459 7460 return request; 7461 7462 out_free: 7463 kfree(request); 7464 return ERR_PTR(err); 7465 } 7466 7467 static int nl80211_start_sched_scan(struct sk_buff *skb, 7468 struct genl_info *info) 7469 { 7470 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7471 struct net_device *dev = info->user_ptr[1]; 7472 struct wireless_dev *wdev = dev->ieee80211_ptr; 7473 struct cfg80211_sched_scan_request *sched_scan_req; 7474 bool want_multi; 7475 int err; 7476 7477 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_start) 7478 return -EOPNOTSUPP; 7479 7480 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI]; 7481 err = cfg80211_sched_scan_req_possible(rdev, want_multi); 7482 if (err) 7483 return err; 7484 7485 sched_scan_req = nl80211_parse_sched_scan(&rdev->wiphy, wdev, 7486 info->attrs, 7487 rdev->wiphy.max_match_sets); 7488 7489 err = PTR_ERR_OR_ZERO(sched_scan_req); 7490 if (err) 7491 goto out_err; 7492 7493 /* leave request id zero for legacy request 7494 * or if driver does not support multi-scheduled scan 7495 */ 7496 if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) { 7497 while (!sched_scan_req->reqid) 7498 sched_scan_req->reqid = rdev->wiphy.cookie_counter++; 7499 } 7500 7501 err = rdev_sched_scan_start(rdev, dev, sched_scan_req); 7502 if (err) 7503 goto out_free; 7504 7505 sched_scan_req->dev = dev; 7506 sched_scan_req->wiphy = &rdev->wiphy; 7507 7508 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) 7509 sched_scan_req->owner_nlportid = info->snd_portid; 7510 7511 cfg80211_add_sched_scan_req(rdev, sched_scan_req); 7512 7513 nl80211_send_sched_scan(sched_scan_req, NL80211_CMD_START_SCHED_SCAN); 7514 return 0; 7515 7516 out_free: 7517 kfree(sched_scan_req); 7518 out_err: 7519 return err; 7520 } 7521 7522 static int nl80211_stop_sched_scan(struct sk_buff *skb, 7523 struct genl_info *info) 7524 { 7525 struct cfg80211_sched_scan_request *req; 7526 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7527 u64 cookie; 7528 7529 if (!rdev->wiphy.max_sched_scan_reqs || !rdev->ops->sched_scan_stop) 7530 return -EOPNOTSUPP; 7531 7532 if (info->attrs[NL80211_ATTR_COOKIE]) { 7533 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 7534 return __cfg80211_stop_sched_scan(rdev, cookie, false); 7535 } 7536 7537 req = list_first_or_null_rcu(&rdev->sched_scan_req_list, 7538 struct cfg80211_sched_scan_request, 7539 list); 7540 if (!req || req->reqid || 7541 (req->owner_nlportid && 7542 req->owner_nlportid != info->snd_portid)) 7543 return -ENOENT; 7544 7545 return cfg80211_stop_sched_scan_req(rdev, req, false); 7546 } 7547 7548 static int nl80211_start_radar_detection(struct sk_buff *skb, 7549 struct genl_info *info) 7550 { 7551 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7552 struct net_device *dev = info->user_ptr[1]; 7553 struct wireless_dev *wdev = dev->ieee80211_ptr; 7554 struct cfg80211_chan_def chandef; 7555 enum nl80211_dfs_regions dfs_region; 7556 unsigned int cac_time_ms; 7557 int err; 7558 7559 dfs_region = reg_get_dfs_region(wdev->wiphy); 7560 if (dfs_region == NL80211_DFS_UNSET) 7561 return -EINVAL; 7562 7563 err = nl80211_parse_chandef(rdev, info, &chandef); 7564 if (err) 7565 return err; 7566 7567 if (netif_carrier_ok(dev)) 7568 return -EBUSY; 7569 7570 if (wdev->cac_started) 7571 return -EBUSY; 7572 7573 err = cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, 7574 wdev->iftype); 7575 if (err < 0) 7576 return err; 7577 7578 if (err == 0) 7579 return -EINVAL; 7580 7581 if (!cfg80211_chandef_dfs_usable(wdev->wiphy, &chandef)) 7582 return -EINVAL; 7583 7584 if (!rdev->ops->start_radar_detection) 7585 return -EOPNOTSUPP; 7586 7587 cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef); 7588 if (WARN_ON(!cac_time_ms)) 7589 cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS; 7590 7591 err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms); 7592 if (!err) { 7593 wdev->chandef = chandef; 7594 wdev->cac_started = true; 7595 wdev->cac_start_time = jiffies; 7596 wdev->cac_time_ms = cac_time_ms; 7597 } 7598 return err; 7599 } 7600 7601 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info) 7602 { 7603 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7604 struct net_device *dev = info->user_ptr[1]; 7605 struct wireless_dev *wdev = dev->ieee80211_ptr; 7606 struct cfg80211_csa_settings params; 7607 /* csa_attrs is defined static to avoid waste of stack size - this 7608 * function is called under RTNL lock, so this should not be a problem. 7609 */ 7610 static struct nlattr *csa_attrs[NL80211_ATTR_MAX+1]; 7611 int err; 7612 bool need_new_beacon = false; 7613 bool need_handle_dfs_flag = true; 7614 int len, i; 7615 u32 cs_count; 7616 7617 if (!rdev->ops->channel_switch || 7618 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) 7619 return -EOPNOTSUPP; 7620 7621 switch (dev->ieee80211_ptr->iftype) { 7622 case NL80211_IFTYPE_AP: 7623 case NL80211_IFTYPE_P2P_GO: 7624 need_new_beacon = true; 7625 /* For all modes except AP the handle_dfs flag needs to be 7626 * supplied to tell the kernel that userspace will handle radar 7627 * events when they happen. Otherwise a switch to a channel 7628 * requiring DFS will be rejected. 7629 */ 7630 need_handle_dfs_flag = false; 7631 7632 /* useless if AP is not running */ 7633 if (!wdev->beacon_interval) 7634 return -ENOTCONN; 7635 break; 7636 case NL80211_IFTYPE_ADHOC: 7637 if (!wdev->ssid_len) 7638 return -ENOTCONN; 7639 break; 7640 case NL80211_IFTYPE_MESH_POINT: 7641 if (!wdev->mesh_id_len) 7642 return -ENOTCONN; 7643 break; 7644 default: 7645 return -EOPNOTSUPP; 7646 } 7647 7648 memset(¶ms, 0, sizeof(params)); 7649 7650 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 7651 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) 7652 return -EINVAL; 7653 7654 /* only important for AP, IBSS and mesh create IEs internally */ 7655 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) 7656 return -EINVAL; 7657 7658 /* Even though the attribute is u32, the specification says 7659 * u8, so let's make sure we don't overflow. 7660 */ 7661 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); 7662 if (cs_count > 255) 7663 return -EINVAL; 7664 7665 params.count = cs_count; 7666 7667 if (!need_new_beacon) 7668 goto skip_beacons; 7669 7670 err = nl80211_parse_beacon(info->attrs, ¶ms.beacon_after); 7671 if (err) 7672 return err; 7673 7674 err = nla_parse_nested(csa_attrs, NL80211_ATTR_MAX, 7675 info->attrs[NL80211_ATTR_CSA_IES], 7676 nl80211_policy, info->extack); 7677 if (err) 7678 return err; 7679 7680 err = nl80211_parse_beacon(csa_attrs, ¶ms.beacon_csa); 7681 if (err) 7682 return err; 7683 7684 if (!csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]) 7685 return -EINVAL; 7686 7687 len = nla_len(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]); 7688 if (!len || (len % sizeof(u16))) 7689 return -EINVAL; 7690 7691 params.n_counter_offsets_beacon = len / sizeof(u16); 7692 if (rdev->wiphy.max_num_csa_counters && 7693 (params.n_counter_offsets_beacon > 7694 rdev->wiphy.max_num_csa_counters)) 7695 return -EINVAL; 7696 7697 params.counter_offsets_beacon = 7698 nla_data(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]); 7699 7700 /* sanity checks - counters should fit and be the same */ 7701 for (i = 0; i < params.n_counter_offsets_beacon; i++) { 7702 u16 offset = params.counter_offsets_beacon[i]; 7703 7704 if (offset >= params.beacon_csa.tail_len) 7705 return -EINVAL; 7706 7707 if (params.beacon_csa.tail[offset] != params.count) 7708 return -EINVAL; 7709 } 7710 7711 if (csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]) { 7712 len = nla_len(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]); 7713 if (!len || (len % sizeof(u16))) 7714 return -EINVAL; 7715 7716 params.n_counter_offsets_presp = len / sizeof(u16); 7717 if (rdev->wiphy.max_num_csa_counters && 7718 (params.n_counter_offsets_presp > 7719 rdev->wiphy.max_num_csa_counters)) 7720 return -EINVAL; 7721 7722 params.counter_offsets_presp = 7723 nla_data(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]); 7724 7725 /* sanity checks - counters should fit and be the same */ 7726 for (i = 0; i < params.n_counter_offsets_presp; i++) { 7727 u16 offset = params.counter_offsets_presp[i]; 7728 7729 if (offset >= params.beacon_csa.probe_resp_len) 7730 return -EINVAL; 7731 7732 if (params.beacon_csa.probe_resp[offset] != 7733 params.count) 7734 return -EINVAL; 7735 } 7736 } 7737 7738 skip_beacons: 7739 err = nl80211_parse_chandef(rdev, info, ¶ms.chandef); 7740 if (err) 7741 return err; 7742 7743 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms.chandef, 7744 wdev->iftype)) 7745 return -EINVAL; 7746 7747 err = cfg80211_chandef_dfs_required(wdev->wiphy, 7748 ¶ms.chandef, 7749 wdev->iftype); 7750 if (err < 0) 7751 return err; 7752 7753 if (err > 0) { 7754 params.radar_required = true; 7755 if (need_handle_dfs_flag && 7756 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) { 7757 return -EINVAL; 7758 } 7759 } 7760 7761 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) 7762 params.block_tx = true; 7763 7764 wdev_lock(wdev); 7765 err = rdev_channel_switch(rdev, dev, ¶ms); 7766 wdev_unlock(wdev); 7767 7768 return err; 7769 } 7770 7771 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb, 7772 u32 seq, int flags, 7773 struct cfg80211_registered_device *rdev, 7774 struct wireless_dev *wdev, 7775 struct cfg80211_internal_bss *intbss) 7776 { 7777 struct cfg80211_bss *res = &intbss->pub; 7778 const struct cfg80211_bss_ies *ies; 7779 void *hdr; 7780 struct nlattr *bss; 7781 7782 ASSERT_WDEV_LOCK(wdev); 7783 7784 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 7785 NL80211_CMD_NEW_SCAN_RESULTS); 7786 if (!hdr) 7787 return -1; 7788 7789 genl_dump_check_consistent(cb, hdr); 7790 7791 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) 7792 goto nla_put_failure; 7793 if (wdev->netdev && 7794 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) 7795 goto nla_put_failure; 7796 if (nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 7797 NL80211_ATTR_PAD)) 7798 goto nla_put_failure; 7799 7800 bss = nla_nest_start(msg, NL80211_ATTR_BSS); 7801 if (!bss) 7802 goto nla_put_failure; 7803 if ((!is_zero_ether_addr(res->bssid) && 7804 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) 7805 goto nla_put_failure; 7806 7807 rcu_read_lock(); 7808 /* indicate whether we have probe response data or not */ 7809 if (rcu_access_pointer(res->proberesp_ies) && 7810 nla_put_flag(msg, NL80211_BSS_PRESP_DATA)) 7811 goto fail_unlock_rcu; 7812 7813 /* this pointer prefers to be pointed to probe response data 7814 * but is always valid 7815 */ 7816 ies = rcu_dereference(res->ies); 7817 if (ies) { 7818 if (nla_put_u64_64bit(msg, NL80211_BSS_TSF, ies->tsf, 7819 NL80211_BSS_PAD)) 7820 goto fail_unlock_rcu; 7821 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, 7822 ies->len, ies->data)) 7823 goto fail_unlock_rcu; 7824 } 7825 7826 /* and this pointer is always (unless driver didn't know) beacon data */ 7827 ies = rcu_dereference(res->beacon_ies); 7828 if (ies && ies->from_beacon) { 7829 if (nla_put_u64_64bit(msg, NL80211_BSS_BEACON_TSF, ies->tsf, 7830 NL80211_BSS_PAD)) 7831 goto fail_unlock_rcu; 7832 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, 7833 ies->len, ies->data)) 7834 goto fail_unlock_rcu; 7835 } 7836 rcu_read_unlock(); 7837 7838 if (res->beacon_interval && 7839 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) 7840 goto nla_put_failure; 7841 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || 7842 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || 7843 nla_put_u32(msg, NL80211_BSS_CHAN_WIDTH, res->scan_width) || 7844 nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO, 7845 jiffies_to_msecs(jiffies - intbss->ts))) 7846 goto nla_put_failure; 7847 7848 if (intbss->parent_tsf && 7849 (nla_put_u64_64bit(msg, NL80211_BSS_PARENT_TSF, 7850 intbss->parent_tsf, NL80211_BSS_PAD) || 7851 nla_put(msg, NL80211_BSS_PARENT_BSSID, ETH_ALEN, 7852 intbss->parent_bssid))) 7853 goto nla_put_failure; 7854 7855 if (intbss->ts_boottime && 7856 nla_put_u64_64bit(msg, NL80211_BSS_LAST_SEEN_BOOTTIME, 7857 intbss->ts_boottime, NL80211_BSS_PAD)) 7858 goto nla_put_failure; 7859 7860 if (!nl80211_put_signal(msg, intbss->pub.chains, 7861 intbss->pub.chain_signal, 7862 NL80211_BSS_CHAIN_SIGNAL)) 7863 goto nla_put_failure; 7864 7865 switch (rdev->wiphy.signal_type) { 7866 case CFG80211_SIGNAL_TYPE_MBM: 7867 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal)) 7868 goto nla_put_failure; 7869 break; 7870 case CFG80211_SIGNAL_TYPE_UNSPEC: 7871 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal)) 7872 goto nla_put_failure; 7873 break; 7874 default: 7875 break; 7876 } 7877 7878 switch (wdev->iftype) { 7879 case NL80211_IFTYPE_P2P_CLIENT: 7880 case NL80211_IFTYPE_STATION: 7881 if (intbss == wdev->current_bss && 7882 nla_put_u32(msg, NL80211_BSS_STATUS, 7883 NL80211_BSS_STATUS_ASSOCIATED)) 7884 goto nla_put_failure; 7885 break; 7886 case NL80211_IFTYPE_ADHOC: 7887 if (intbss == wdev->current_bss && 7888 nla_put_u32(msg, NL80211_BSS_STATUS, 7889 NL80211_BSS_STATUS_IBSS_JOINED)) 7890 goto nla_put_failure; 7891 break; 7892 default: 7893 break; 7894 } 7895 7896 nla_nest_end(msg, bss); 7897 7898 genlmsg_end(msg, hdr); 7899 return 0; 7900 7901 fail_unlock_rcu: 7902 rcu_read_unlock(); 7903 nla_put_failure: 7904 genlmsg_cancel(msg, hdr); 7905 return -EMSGSIZE; 7906 } 7907 7908 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb) 7909 { 7910 struct cfg80211_registered_device *rdev; 7911 struct cfg80211_internal_bss *scan; 7912 struct wireless_dev *wdev; 7913 int start = cb->args[2], idx = 0; 7914 int err; 7915 7916 rtnl_lock(); 7917 err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev); 7918 if (err) { 7919 rtnl_unlock(); 7920 return err; 7921 } 7922 7923 wdev_lock(wdev); 7924 spin_lock_bh(&rdev->bss_lock); 7925 cfg80211_bss_expire(rdev); 7926 7927 cb->seq = rdev->bss_generation; 7928 7929 list_for_each_entry(scan, &rdev->bss_list, list) { 7930 if (++idx <= start) 7931 continue; 7932 if (nl80211_send_bss(skb, cb, 7933 cb->nlh->nlmsg_seq, NLM_F_MULTI, 7934 rdev, wdev, scan) < 0) { 7935 idx--; 7936 break; 7937 } 7938 } 7939 7940 spin_unlock_bh(&rdev->bss_lock); 7941 wdev_unlock(wdev); 7942 7943 cb->args[2] = idx; 7944 rtnl_unlock(); 7945 7946 return skb->len; 7947 } 7948 7949 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq, 7950 int flags, struct net_device *dev, 7951 bool allow_radio_stats, 7952 struct survey_info *survey) 7953 { 7954 void *hdr; 7955 struct nlattr *infoattr; 7956 7957 /* skip radio stats if userspace didn't request them */ 7958 if (!survey->channel && !allow_radio_stats) 7959 return 0; 7960 7961 hdr = nl80211hdr_put(msg, portid, seq, flags, 7962 NL80211_CMD_NEW_SURVEY_RESULTS); 7963 if (!hdr) 7964 return -ENOMEM; 7965 7966 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 7967 goto nla_put_failure; 7968 7969 infoattr = nla_nest_start(msg, NL80211_ATTR_SURVEY_INFO); 7970 if (!infoattr) 7971 goto nla_put_failure; 7972 7973 if (survey->channel && 7974 nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY, 7975 survey->channel->center_freq)) 7976 goto nla_put_failure; 7977 7978 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && 7979 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) 7980 goto nla_put_failure; 7981 if ((survey->filled & SURVEY_INFO_IN_USE) && 7982 nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE)) 7983 goto nla_put_failure; 7984 if ((survey->filled & SURVEY_INFO_TIME) && 7985 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME, 7986 survey->time, NL80211_SURVEY_INFO_PAD)) 7987 goto nla_put_failure; 7988 if ((survey->filled & SURVEY_INFO_TIME_BUSY) && 7989 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_BUSY, 7990 survey->time_busy, NL80211_SURVEY_INFO_PAD)) 7991 goto nla_put_failure; 7992 if ((survey->filled & SURVEY_INFO_TIME_EXT_BUSY) && 7993 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_EXT_BUSY, 7994 survey->time_ext_busy, NL80211_SURVEY_INFO_PAD)) 7995 goto nla_put_failure; 7996 if ((survey->filled & SURVEY_INFO_TIME_RX) && 7997 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_RX, 7998 survey->time_rx, NL80211_SURVEY_INFO_PAD)) 7999 goto nla_put_failure; 8000 if ((survey->filled & SURVEY_INFO_TIME_TX) && 8001 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_TX, 8002 survey->time_tx, NL80211_SURVEY_INFO_PAD)) 8003 goto nla_put_failure; 8004 if ((survey->filled & SURVEY_INFO_TIME_SCAN) && 8005 nla_put_u64_64bit(msg, NL80211_SURVEY_INFO_TIME_SCAN, 8006 survey->time_scan, NL80211_SURVEY_INFO_PAD)) 8007 goto nla_put_failure; 8008 8009 nla_nest_end(msg, infoattr); 8010 8011 genlmsg_end(msg, hdr); 8012 return 0; 8013 8014 nla_put_failure: 8015 genlmsg_cancel(msg, hdr); 8016 return -EMSGSIZE; 8017 } 8018 8019 static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb) 8020 { 8021 struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam); 8022 struct survey_info survey; 8023 struct cfg80211_registered_device *rdev; 8024 struct wireless_dev *wdev; 8025 int survey_idx = cb->args[2]; 8026 int res; 8027 bool radio_stats; 8028 8029 rtnl_lock(); 8030 res = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev); 8031 if (res) 8032 goto out_err; 8033 8034 /* prepare_wdev_dump parsed the attributes */ 8035 radio_stats = attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS]; 8036 8037 if (!wdev->netdev) { 8038 res = -EINVAL; 8039 goto out_err; 8040 } 8041 8042 if (!rdev->ops->dump_survey) { 8043 res = -EOPNOTSUPP; 8044 goto out_err; 8045 } 8046 8047 while (1) { 8048 res = rdev_dump_survey(rdev, wdev->netdev, survey_idx, &survey); 8049 if (res == -ENOENT) 8050 break; 8051 if (res) 8052 goto out_err; 8053 8054 /* don't send disabled channels, but do send non-channel data */ 8055 if (survey.channel && 8056 survey.channel->flags & IEEE80211_CHAN_DISABLED) { 8057 survey_idx++; 8058 continue; 8059 } 8060 8061 if (nl80211_send_survey(skb, 8062 NETLINK_CB(cb->skb).portid, 8063 cb->nlh->nlmsg_seq, NLM_F_MULTI, 8064 wdev->netdev, radio_stats, &survey) < 0) 8065 goto out; 8066 survey_idx++; 8067 } 8068 8069 out: 8070 cb->args[2] = survey_idx; 8071 res = skb->len; 8072 out_err: 8073 rtnl_unlock(); 8074 return res; 8075 } 8076 8077 static bool nl80211_valid_wpa_versions(u32 wpa_versions) 8078 { 8079 return !(wpa_versions & ~(NL80211_WPA_VERSION_1 | 8080 NL80211_WPA_VERSION_2)); 8081 } 8082 8083 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info) 8084 { 8085 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8086 struct net_device *dev = info->user_ptr[1]; 8087 struct ieee80211_channel *chan; 8088 const u8 *bssid, *ssid, *ie = NULL, *auth_data = NULL; 8089 int err, ssid_len, ie_len = 0, auth_data_len = 0; 8090 enum nl80211_auth_type auth_type; 8091 struct key_parse key; 8092 bool local_state_change; 8093 8094 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) 8095 return -EINVAL; 8096 8097 if (!info->attrs[NL80211_ATTR_MAC]) 8098 return -EINVAL; 8099 8100 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) 8101 return -EINVAL; 8102 8103 if (!info->attrs[NL80211_ATTR_SSID]) 8104 return -EINVAL; 8105 8106 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 8107 return -EINVAL; 8108 8109 err = nl80211_parse_key(info, &key); 8110 if (err) 8111 return err; 8112 8113 if (key.idx >= 0) { 8114 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) 8115 return -EINVAL; 8116 if (!key.p.key || !key.p.key_len) 8117 return -EINVAL; 8118 if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 || 8119 key.p.key_len != WLAN_KEY_LEN_WEP40) && 8120 (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 || 8121 key.p.key_len != WLAN_KEY_LEN_WEP104)) 8122 return -EINVAL; 8123 if (key.idx > 3) 8124 return -EINVAL; 8125 } else { 8126 key.p.key_len = 0; 8127 key.p.key = NULL; 8128 } 8129 8130 if (key.idx >= 0) { 8131 int i; 8132 bool ok = false; 8133 8134 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { 8135 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { 8136 ok = true; 8137 break; 8138 } 8139 } 8140 if (!ok) 8141 return -EINVAL; 8142 } 8143 8144 if (!rdev->ops->auth) 8145 return -EOPNOTSUPP; 8146 8147 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 8148 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 8149 return -EOPNOTSUPP; 8150 8151 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 8152 chan = nl80211_get_valid_chan(&rdev->wiphy, 8153 info->attrs[NL80211_ATTR_WIPHY_FREQ]); 8154 if (!chan) 8155 return -EINVAL; 8156 8157 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 8158 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 8159 8160 if (info->attrs[NL80211_ATTR_IE]) { 8161 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 8162 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 8163 } 8164 8165 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 8166 if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE)) 8167 return -EINVAL; 8168 8169 if ((auth_type == NL80211_AUTHTYPE_SAE || 8170 auth_type == NL80211_AUTHTYPE_FILS_SK || 8171 auth_type == NL80211_AUTHTYPE_FILS_SK_PFS || 8172 auth_type == NL80211_AUTHTYPE_FILS_PK) && 8173 !info->attrs[NL80211_ATTR_AUTH_DATA]) 8174 return -EINVAL; 8175 8176 if (info->attrs[NL80211_ATTR_AUTH_DATA]) { 8177 if (auth_type != NL80211_AUTHTYPE_SAE && 8178 auth_type != NL80211_AUTHTYPE_FILS_SK && 8179 auth_type != NL80211_AUTHTYPE_FILS_SK_PFS && 8180 auth_type != NL80211_AUTHTYPE_FILS_PK) 8181 return -EINVAL; 8182 auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]); 8183 auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]); 8184 /* need to include at least Auth Transaction and Status Code */ 8185 if (auth_data_len < 4) 8186 return -EINVAL; 8187 } 8188 8189 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 8190 8191 /* 8192 * Since we no longer track auth state, ignore 8193 * requests to only change local state. 8194 */ 8195 if (local_state_change) 8196 return 0; 8197 8198 wdev_lock(dev->ieee80211_ptr); 8199 err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, 8200 ssid, ssid_len, ie, ie_len, 8201 key.p.key, key.p.key_len, key.idx, 8202 auth_data, auth_data_len); 8203 wdev_unlock(dev->ieee80211_ptr); 8204 return err; 8205 } 8206 8207 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, 8208 struct genl_info *info, 8209 struct cfg80211_crypto_settings *settings, 8210 int cipher_limit) 8211 { 8212 memset(settings, 0, sizeof(*settings)); 8213 8214 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; 8215 8216 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { 8217 u16 proto; 8218 8219 proto = nla_get_u16( 8220 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); 8221 settings->control_port_ethertype = cpu_to_be16(proto); 8222 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && 8223 proto != ETH_P_PAE) 8224 return -EINVAL; 8225 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) 8226 settings->control_port_no_encrypt = true; 8227 } else 8228 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); 8229 8230 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { 8231 void *data; 8232 int len, i; 8233 8234 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 8235 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 8236 settings->n_ciphers_pairwise = len / sizeof(u32); 8237 8238 if (len % sizeof(u32)) 8239 return -EINVAL; 8240 8241 if (settings->n_ciphers_pairwise > cipher_limit) 8242 return -EINVAL; 8243 8244 memcpy(settings->ciphers_pairwise, data, len); 8245 8246 for (i = 0; i < settings->n_ciphers_pairwise; i++) 8247 if (!cfg80211_supported_cipher_suite( 8248 &rdev->wiphy, 8249 settings->ciphers_pairwise[i])) 8250 return -EINVAL; 8251 } 8252 8253 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { 8254 settings->cipher_group = 8255 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); 8256 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, 8257 settings->cipher_group)) 8258 return -EINVAL; 8259 } 8260 8261 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) { 8262 settings->wpa_versions = 8263 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); 8264 if (!nl80211_valid_wpa_versions(settings->wpa_versions)) 8265 return -EINVAL; 8266 } 8267 8268 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { 8269 void *data; 8270 int len; 8271 8272 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); 8273 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); 8274 settings->n_akm_suites = len / sizeof(u32); 8275 8276 if (len % sizeof(u32)) 8277 return -EINVAL; 8278 8279 if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES) 8280 return -EINVAL; 8281 8282 memcpy(settings->akm_suites, data, len); 8283 } 8284 8285 if (info->attrs[NL80211_ATTR_PMK]) { 8286 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN) 8287 return -EINVAL; 8288 if (!wiphy_ext_feature_isset(&rdev->wiphy, 8289 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK)) 8290 return -EINVAL; 8291 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]); 8292 } 8293 8294 return 0; 8295 } 8296 8297 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info) 8298 { 8299 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8300 struct net_device *dev = info->user_ptr[1]; 8301 struct ieee80211_channel *chan; 8302 struct cfg80211_assoc_request req = {}; 8303 const u8 *bssid, *ssid; 8304 int err, ssid_len = 0; 8305 8306 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) 8307 return -EINVAL; 8308 8309 if (!info->attrs[NL80211_ATTR_MAC] || 8310 !info->attrs[NL80211_ATTR_SSID] || 8311 !info->attrs[NL80211_ATTR_WIPHY_FREQ]) 8312 return -EINVAL; 8313 8314 if (!rdev->ops->assoc) 8315 return -EOPNOTSUPP; 8316 8317 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 8318 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 8319 return -EOPNOTSUPP; 8320 8321 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 8322 8323 chan = nl80211_get_valid_chan(&rdev->wiphy, 8324 info->attrs[NL80211_ATTR_WIPHY_FREQ]); 8325 if (!chan) 8326 return -EINVAL; 8327 8328 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 8329 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 8330 8331 if (info->attrs[NL80211_ATTR_IE]) { 8332 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 8333 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 8334 } 8335 8336 if (info->attrs[NL80211_ATTR_USE_MFP]) { 8337 enum nl80211_mfp mfp = 8338 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 8339 if (mfp == NL80211_MFP_REQUIRED) 8340 req.use_mfp = true; 8341 else if (mfp != NL80211_MFP_NO) 8342 return -EINVAL; 8343 } 8344 8345 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 8346 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 8347 8348 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 8349 req.flags |= ASSOC_REQ_DISABLE_HT; 8350 8351 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 8352 memcpy(&req.ht_capa_mask, 8353 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 8354 sizeof(req.ht_capa_mask)); 8355 8356 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 8357 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 8358 return -EINVAL; 8359 memcpy(&req.ht_capa, 8360 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 8361 sizeof(req.ht_capa)); 8362 } 8363 8364 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 8365 req.flags |= ASSOC_REQ_DISABLE_VHT; 8366 8367 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 8368 memcpy(&req.vht_capa_mask, 8369 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 8370 sizeof(req.vht_capa_mask)); 8371 8372 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 8373 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 8374 return -EINVAL; 8375 memcpy(&req.vht_capa, 8376 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 8377 sizeof(req.vht_capa)); 8378 } 8379 8380 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { 8381 if (!((rdev->wiphy.features & 8382 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) && 8383 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && 8384 !wiphy_ext_feature_isset(&rdev->wiphy, 8385 NL80211_EXT_FEATURE_RRM)) 8386 return -EINVAL; 8387 req.flags |= ASSOC_REQ_USE_RRM; 8388 } 8389 8390 if (info->attrs[NL80211_ATTR_FILS_KEK]) { 8391 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]); 8392 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]); 8393 if (!info->attrs[NL80211_ATTR_FILS_NONCES]) 8394 return -EINVAL; 8395 req.fils_nonces = 8396 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]); 8397 } 8398 8399 err = nl80211_crypto_settings(rdev, info, &req.crypto, 1); 8400 if (!err) { 8401 wdev_lock(dev->ieee80211_ptr); 8402 8403 err = cfg80211_mlme_assoc(rdev, dev, chan, bssid, 8404 ssid, ssid_len, &req); 8405 8406 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 8407 dev->ieee80211_ptr->conn_owner_nlportid = 8408 info->snd_portid; 8409 memcpy(dev->ieee80211_ptr->disconnect_bssid, 8410 bssid, ETH_ALEN); 8411 } 8412 8413 wdev_unlock(dev->ieee80211_ptr); 8414 } 8415 8416 return err; 8417 } 8418 8419 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info) 8420 { 8421 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8422 struct net_device *dev = info->user_ptr[1]; 8423 const u8 *ie = NULL, *bssid; 8424 int ie_len = 0, err; 8425 u16 reason_code; 8426 bool local_state_change; 8427 8428 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) 8429 return -EINVAL; 8430 8431 if (!info->attrs[NL80211_ATTR_MAC]) 8432 return -EINVAL; 8433 8434 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 8435 return -EINVAL; 8436 8437 if (!rdev->ops->deauth) 8438 return -EOPNOTSUPP; 8439 8440 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 8441 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 8442 return -EOPNOTSUPP; 8443 8444 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 8445 8446 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 8447 if (reason_code == 0) { 8448 /* Reason Code 0 is reserved */ 8449 return -EINVAL; 8450 } 8451 8452 if (info->attrs[NL80211_ATTR_IE]) { 8453 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 8454 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 8455 } 8456 8457 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 8458 8459 wdev_lock(dev->ieee80211_ptr); 8460 err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code, 8461 local_state_change); 8462 wdev_unlock(dev->ieee80211_ptr); 8463 return err; 8464 } 8465 8466 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) 8467 { 8468 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8469 struct net_device *dev = info->user_ptr[1]; 8470 const u8 *ie = NULL, *bssid; 8471 int ie_len = 0, err; 8472 u16 reason_code; 8473 bool local_state_change; 8474 8475 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) 8476 return -EINVAL; 8477 8478 if (!info->attrs[NL80211_ATTR_MAC]) 8479 return -EINVAL; 8480 8481 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 8482 return -EINVAL; 8483 8484 if (!rdev->ops->disassoc) 8485 return -EOPNOTSUPP; 8486 8487 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 8488 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 8489 return -EOPNOTSUPP; 8490 8491 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 8492 8493 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 8494 if (reason_code == 0) { 8495 /* Reason Code 0 is reserved */ 8496 return -EINVAL; 8497 } 8498 8499 if (info->attrs[NL80211_ATTR_IE]) { 8500 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 8501 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 8502 } 8503 8504 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 8505 8506 wdev_lock(dev->ieee80211_ptr); 8507 err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code, 8508 local_state_change); 8509 wdev_unlock(dev->ieee80211_ptr); 8510 return err; 8511 } 8512 8513 static bool 8514 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev, 8515 int mcast_rate[NUM_NL80211_BANDS], 8516 int rateval) 8517 { 8518 struct wiphy *wiphy = &rdev->wiphy; 8519 bool found = false; 8520 int band, i; 8521 8522 for (band = 0; band < NUM_NL80211_BANDS; band++) { 8523 struct ieee80211_supported_band *sband; 8524 8525 sband = wiphy->bands[band]; 8526 if (!sband) 8527 continue; 8528 8529 for (i = 0; i < sband->n_bitrates; i++) { 8530 if (sband->bitrates[i].bitrate == rateval) { 8531 mcast_rate[band] = i + 1; 8532 found = true; 8533 break; 8534 } 8535 } 8536 } 8537 8538 return found; 8539 } 8540 8541 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info) 8542 { 8543 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8544 struct net_device *dev = info->user_ptr[1]; 8545 struct cfg80211_ibss_params ibss; 8546 struct wiphy *wiphy; 8547 struct cfg80211_cached_keys *connkeys = NULL; 8548 int err; 8549 8550 memset(&ibss, 0, sizeof(ibss)); 8551 8552 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) 8553 return -EINVAL; 8554 8555 if (!info->attrs[NL80211_ATTR_SSID] || 8556 !nla_len(info->attrs[NL80211_ATTR_SSID])) 8557 return -EINVAL; 8558 8559 ibss.beacon_interval = 100; 8560 8561 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) 8562 ibss.beacon_interval = 8563 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 8564 8565 err = cfg80211_validate_beacon_int(rdev, NL80211_IFTYPE_ADHOC, 8566 ibss.beacon_interval); 8567 if (err) 8568 return err; 8569 8570 if (!rdev->ops->join_ibss) 8571 return -EOPNOTSUPP; 8572 8573 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 8574 return -EOPNOTSUPP; 8575 8576 wiphy = &rdev->wiphy; 8577 8578 if (info->attrs[NL80211_ATTR_MAC]) { 8579 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 8580 8581 if (!is_valid_ether_addr(ibss.bssid)) 8582 return -EINVAL; 8583 } 8584 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 8585 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 8586 8587 if (info->attrs[NL80211_ATTR_IE]) { 8588 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 8589 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 8590 } 8591 8592 err = nl80211_parse_chandef(rdev, info, &ibss.chandef); 8593 if (err) 8594 return err; 8595 8596 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef, 8597 NL80211_IFTYPE_ADHOC)) 8598 return -EINVAL; 8599 8600 switch (ibss.chandef.width) { 8601 case NL80211_CHAN_WIDTH_5: 8602 case NL80211_CHAN_WIDTH_10: 8603 case NL80211_CHAN_WIDTH_20_NOHT: 8604 break; 8605 case NL80211_CHAN_WIDTH_20: 8606 case NL80211_CHAN_WIDTH_40: 8607 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) 8608 return -EINVAL; 8609 break; 8610 case NL80211_CHAN_WIDTH_80: 8611 case NL80211_CHAN_WIDTH_80P80: 8612 case NL80211_CHAN_WIDTH_160: 8613 if (!(rdev->wiphy.features & NL80211_FEATURE_HT_IBSS)) 8614 return -EINVAL; 8615 if (!wiphy_ext_feature_isset(&rdev->wiphy, 8616 NL80211_EXT_FEATURE_VHT_IBSS)) 8617 return -EINVAL; 8618 break; 8619 default: 8620 return -EINVAL; 8621 } 8622 8623 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; 8624 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 8625 8626 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 8627 u8 *rates = 8628 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 8629 int n_rates = 8630 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 8631 struct ieee80211_supported_band *sband = 8632 wiphy->bands[ibss.chandef.chan->band]; 8633 8634 err = ieee80211_get_ratemask(sband, rates, n_rates, 8635 &ibss.basic_rates); 8636 if (err) 8637 return err; 8638 } 8639 8640 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 8641 memcpy(&ibss.ht_capa_mask, 8642 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 8643 sizeof(ibss.ht_capa_mask)); 8644 8645 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 8646 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 8647 return -EINVAL; 8648 memcpy(&ibss.ht_capa, 8649 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 8650 sizeof(ibss.ht_capa)); 8651 } 8652 8653 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 8654 !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate, 8655 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 8656 return -EINVAL; 8657 8658 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { 8659 bool no_ht = false; 8660 8661 connkeys = nl80211_parse_connkeys(rdev, info, &no_ht); 8662 if (IS_ERR(connkeys)) 8663 return PTR_ERR(connkeys); 8664 8665 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) && 8666 no_ht) { 8667 kzfree(connkeys); 8668 return -EINVAL; 8669 } 8670 } 8671 8672 ibss.control_port = 8673 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); 8674 8675 ibss.userspace_handles_dfs = 8676 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 8677 8678 err = cfg80211_join_ibss(rdev, dev, &ibss, connkeys); 8679 if (err) 8680 kzfree(connkeys); 8681 return err; 8682 } 8683 8684 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info) 8685 { 8686 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8687 struct net_device *dev = info->user_ptr[1]; 8688 8689 if (!rdev->ops->leave_ibss) 8690 return -EOPNOTSUPP; 8691 8692 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 8693 return -EOPNOTSUPP; 8694 8695 return cfg80211_leave_ibss(rdev, dev, false); 8696 } 8697 8698 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info) 8699 { 8700 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8701 struct net_device *dev = info->user_ptr[1]; 8702 int mcast_rate[NUM_NL80211_BANDS]; 8703 u32 nla_rate; 8704 int err; 8705 8706 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && 8707 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && 8708 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) 8709 return -EOPNOTSUPP; 8710 8711 if (!rdev->ops->set_mcast_rate) 8712 return -EOPNOTSUPP; 8713 8714 memset(mcast_rate, 0, sizeof(mcast_rate)); 8715 8716 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) 8717 return -EINVAL; 8718 8719 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); 8720 if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate)) 8721 return -EINVAL; 8722 8723 err = rdev_set_mcast_rate(rdev, dev, mcast_rate); 8724 8725 return err; 8726 } 8727 8728 static struct sk_buff * 8729 __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev, 8730 struct wireless_dev *wdev, int approxlen, 8731 u32 portid, u32 seq, enum nl80211_commands cmd, 8732 enum nl80211_attrs attr, 8733 const struct nl80211_vendor_cmd_info *info, 8734 gfp_t gfp) 8735 { 8736 struct sk_buff *skb; 8737 void *hdr; 8738 struct nlattr *data; 8739 8740 skb = nlmsg_new(approxlen + 100, gfp); 8741 if (!skb) 8742 return NULL; 8743 8744 hdr = nl80211hdr_put(skb, portid, seq, 0, cmd); 8745 if (!hdr) { 8746 kfree_skb(skb); 8747 return NULL; 8748 } 8749 8750 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 8751 goto nla_put_failure; 8752 8753 if (info) { 8754 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_ID, 8755 info->vendor_id)) 8756 goto nla_put_failure; 8757 if (nla_put_u32(skb, NL80211_ATTR_VENDOR_SUBCMD, 8758 info->subcmd)) 8759 goto nla_put_failure; 8760 } 8761 8762 if (wdev) { 8763 if (nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 8764 wdev_id(wdev), NL80211_ATTR_PAD)) 8765 goto nla_put_failure; 8766 if (wdev->netdev && 8767 nla_put_u32(skb, NL80211_ATTR_IFINDEX, 8768 wdev->netdev->ifindex)) 8769 goto nla_put_failure; 8770 } 8771 8772 data = nla_nest_start(skb, attr); 8773 if (!data) 8774 goto nla_put_failure; 8775 8776 ((void **)skb->cb)[0] = rdev; 8777 ((void **)skb->cb)[1] = hdr; 8778 ((void **)skb->cb)[2] = data; 8779 8780 return skb; 8781 8782 nla_put_failure: 8783 kfree_skb(skb); 8784 return NULL; 8785 } 8786 8787 struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy, 8788 struct wireless_dev *wdev, 8789 enum nl80211_commands cmd, 8790 enum nl80211_attrs attr, 8791 int vendor_event_idx, 8792 int approxlen, gfp_t gfp) 8793 { 8794 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 8795 const struct nl80211_vendor_cmd_info *info; 8796 8797 switch (cmd) { 8798 case NL80211_CMD_TESTMODE: 8799 if (WARN_ON(vendor_event_idx != -1)) 8800 return NULL; 8801 info = NULL; 8802 break; 8803 case NL80211_CMD_VENDOR: 8804 if (WARN_ON(vendor_event_idx < 0 || 8805 vendor_event_idx >= wiphy->n_vendor_events)) 8806 return NULL; 8807 info = &wiphy->vendor_events[vendor_event_idx]; 8808 break; 8809 default: 8810 WARN_ON(1); 8811 return NULL; 8812 } 8813 8814 return __cfg80211_alloc_vendor_skb(rdev, wdev, approxlen, 0, 0, 8815 cmd, attr, info, gfp); 8816 } 8817 EXPORT_SYMBOL(__cfg80211_alloc_event_skb); 8818 8819 void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp) 8820 { 8821 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 8822 void *hdr = ((void **)skb->cb)[1]; 8823 struct nlattr *data = ((void **)skb->cb)[2]; 8824 enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE; 8825 8826 /* clear CB data for netlink core to own from now on */ 8827 memset(skb->cb, 0, sizeof(skb->cb)); 8828 8829 nla_nest_end(skb, data); 8830 genlmsg_end(skb, hdr); 8831 8832 if (data->nla_type == NL80211_ATTR_VENDOR_DATA) 8833 mcgrp = NL80211_MCGRP_VENDOR; 8834 8835 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), skb, 0, 8836 mcgrp, gfp); 8837 } 8838 EXPORT_SYMBOL(__cfg80211_send_event_skb); 8839 8840 #ifdef CONFIG_NL80211_TESTMODE 8841 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) 8842 { 8843 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8844 struct wireless_dev *wdev = 8845 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs); 8846 int err; 8847 8848 if (!rdev->ops->testmode_cmd) 8849 return -EOPNOTSUPP; 8850 8851 if (IS_ERR(wdev)) { 8852 err = PTR_ERR(wdev); 8853 if (err != -EINVAL) 8854 return err; 8855 wdev = NULL; 8856 } else if (wdev->wiphy != &rdev->wiphy) { 8857 return -EINVAL; 8858 } 8859 8860 if (!info->attrs[NL80211_ATTR_TESTDATA]) 8861 return -EINVAL; 8862 8863 rdev->cur_cmd_info = info; 8864 err = rdev_testmode_cmd(rdev, wdev, 8865 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), 8866 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); 8867 rdev->cur_cmd_info = NULL; 8868 8869 return err; 8870 } 8871 8872 static int nl80211_testmode_dump(struct sk_buff *skb, 8873 struct netlink_callback *cb) 8874 { 8875 struct cfg80211_registered_device *rdev; 8876 int err; 8877 long phy_idx; 8878 void *data = NULL; 8879 int data_len = 0; 8880 8881 rtnl_lock(); 8882 8883 if (cb->args[0]) { 8884 /* 8885 * 0 is a valid index, but not valid for args[0], 8886 * so we need to offset by 1. 8887 */ 8888 phy_idx = cb->args[0] - 1; 8889 8890 rdev = cfg80211_rdev_by_wiphy_idx(phy_idx); 8891 if (!rdev) { 8892 err = -ENOENT; 8893 goto out_err; 8894 } 8895 } else { 8896 struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam); 8897 8898 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, 8899 attrbuf, nl80211_fam.maxattr, 8900 nl80211_policy, NULL); 8901 if (err) 8902 goto out_err; 8903 8904 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); 8905 if (IS_ERR(rdev)) { 8906 err = PTR_ERR(rdev); 8907 goto out_err; 8908 } 8909 phy_idx = rdev->wiphy_idx; 8910 8911 if (attrbuf[NL80211_ATTR_TESTDATA]) 8912 cb->args[1] = (long)attrbuf[NL80211_ATTR_TESTDATA]; 8913 } 8914 8915 if (cb->args[1]) { 8916 data = nla_data((void *)cb->args[1]); 8917 data_len = nla_len((void *)cb->args[1]); 8918 } 8919 8920 if (!rdev->ops->testmode_dump) { 8921 err = -EOPNOTSUPP; 8922 goto out_err; 8923 } 8924 8925 while (1) { 8926 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 8927 cb->nlh->nlmsg_seq, NLM_F_MULTI, 8928 NL80211_CMD_TESTMODE); 8929 struct nlattr *tmdata; 8930 8931 if (!hdr) 8932 break; 8933 8934 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) { 8935 genlmsg_cancel(skb, hdr); 8936 break; 8937 } 8938 8939 tmdata = nla_nest_start(skb, NL80211_ATTR_TESTDATA); 8940 if (!tmdata) { 8941 genlmsg_cancel(skb, hdr); 8942 break; 8943 } 8944 err = rdev_testmode_dump(rdev, skb, cb, data, data_len); 8945 nla_nest_end(skb, tmdata); 8946 8947 if (err == -ENOBUFS || err == -ENOENT) { 8948 genlmsg_cancel(skb, hdr); 8949 break; 8950 } else if (err) { 8951 genlmsg_cancel(skb, hdr); 8952 goto out_err; 8953 } 8954 8955 genlmsg_end(skb, hdr); 8956 } 8957 8958 err = skb->len; 8959 /* see above */ 8960 cb->args[0] = phy_idx + 1; 8961 out_err: 8962 rtnl_unlock(); 8963 return err; 8964 } 8965 #endif 8966 8967 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info) 8968 { 8969 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8970 struct net_device *dev = info->user_ptr[1]; 8971 struct cfg80211_connect_params connect; 8972 struct wiphy *wiphy; 8973 struct cfg80211_cached_keys *connkeys = NULL; 8974 int err; 8975 8976 memset(&connect, 0, sizeof(connect)); 8977 8978 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) 8979 return -EINVAL; 8980 8981 if (!info->attrs[NL80211_ATTR_SSID] || 8982 !nla_len(info->attrs[NL80211_ATTR_SSID])) 8983 return -EINVAL; 8984 8985 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 8986 connect.auth_type = 8987 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 8988 if (!nl80211_valid_auth_type(rdev, connect.auth_type, 8989 NL80211_CMD_CONNECT)) 8990 return -EINVAL; 8991 } else 8992 connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC; 8993 8994 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; 8995 8996 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] && 8997 !wiphy_ext_feature_isset(&rdev->wiphy, 8998 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 8999 return -EINVAL; 9000 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS]; 9001 9002 err = nl80211_crypto_settings(rdev, info, &connect.crypto, 9003 NL80211_MAX_NR_CIPHER_SUITES); 9004 if (err) 9005 return err; 9006 9007 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 9008 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 9009 return -EOPNOTSUPP; 9010 9011 wiphy = &rdev->wiphy; 9012 9013 connect.bg_scan_period = -1; 9014 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && 9015 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { 9016 connect.bg_scan_period = 9017 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); 9018 } 9019 9020 if (info->attrs[NL80211_ATTR_MAC]) 9021 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 9022 else if (info->attrs[NL80211_ATTR_MAC_HINT]) 9023 connect.bssid_hint = 9024 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]); 9025 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 9026 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 9027 9028 if (info->attrs[NL80211_ATTR_IE]) { 9029 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 9030 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 9031 } 9032 9033 if (info->attrs[NL80211_ATTR_USE_MFP]) { 9034 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 9035 if (connect.mfp == NL80211_MFP_OPTIONAL && 9036 !wiphy_ext_feature_isset(&rdev->wiphy, 9037 NL80211_EXT_FEATURE_MFP_OPTIONAL)) 9038 return -EOPNOTSUPP; 9039 9040 if (connect.mfp != NL80211_MFP_REQUIRED && 9041 connect.mfp != NL80211_MFP_NO && 9042 connect.mfp != NL80211_MFP_OPTIONAL) 9043 return -EINVAL; 9044 } else { 9045 connect.mfp = NL80211_MFP_NO; 9046 } 9047 9048 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 9049 connect.prev_bssid = 9050 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 9051 9052 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 9053 connect.channel = nl80211_get_valid_chan( 9054 wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ]); 9055 if (!connect.channel) 9056 return -EINVAL; 9057 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) { 9058 connect.channel_hint = nl80211_get_valid_chan( 9059 wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]); 9060 if (!connect.channel_hint) 9061 return -EINVAL; 9062 } 9063 9064 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { 9065 connkeys = nl80211_parse_connkeys(rdev, info, NULL); 9066 if (IS_ERR(connkeys)) 9067 return PTR_ERR(connkeys); 9068 } 9069 9070 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 9071 connect.flags |= ASSOC_REQ_DISABLE_HT; 9072 9073 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 9074 memcpy(&connect.ht_capa_mask, 9075 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 9076 sizeof(connect.ht_capa_mask)); 9077 9078 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 9079 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { 9080 kzfree(connkeys); 9081 return -EINVAL; 9082 } 9083 memcpy(&connect.ht_capa, 9084 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 9085 sizeof(connect.ht_capa)); 9086 } 9087 9088 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 9089 connect.flags |= ASSOC_REQ_DISABLE_VHT; 9090 9091 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 9092 memcpy(&connect.vht_capa_mask, 9093 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 9094 sizeof(connect.vht_capa_mask)); 9095 9096 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 9097 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { 9098 kzfree(connkeys); 9099 return -EINVAL; 9100 } 9101 memcpy(&connect.vht_capa, 9102 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 9103 sizeof(connect.vht_capa)); 9104 } 9105 9106 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) { 9107 if (!((rdev->wiphy.features & 9108 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) && 9109 (rdev->wiphy.features & NL80211_FEATURE_QUIET)) && 9110 !wiphy_ext_feature_isset(&rdev->wiphy, 9111 NL80211_EXT_FEATURE_RRM)) { 9112 kzfree(connkeys); 9113 return -EINVAL; 9114 } 9115 connect.flags |= ASSOC_REQ_USE_RRM; 9116 } 9117 9118 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]); 9119 if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) { 9120 kzfree(connkeys); 9121 return -EOPNOTSUPP; 9122 } 9123 9124 if (info->attrs[NL80211_ATTR_BSS_SELECT]) { 9125 /* bss selection makes no sense if bssid is set */ 9126 if (connect.bssid) { 9127 kzfree(connkeys); 9128 return -EINVAL; 9129 } 9130 9131 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT], 9132 wiphy, &connect.bss_select); 9133 if (err) { 9134 kzfree(connkeys); 9135 return err; 9136 } 9137 } 9138 9139 if (wiphy_ext_feature_isset(&rdev->wiphy, 9140 NL80211_EXT_FEATURE_FILS_SK_OFFLOAD) && 9141 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] && 9142 info->attrs[NL80211_ATTR_FILS_ERP_REALM] && 9143 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] && 9144 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 9145 connect.fils_erp_username = 9146 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 9147 connect.fils_erp_username_len = 9148 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]); 9149 connect.fils_erp_realm = 9150 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 9151 connect.fils_erp_realm_len = 9152 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]); 9153 connect.fils_erp_next_seq_num = 9154 nla_get_u16( 9155 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]); 9156 connect.fils_erp_rrk = 9157 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 9158 connect.fils_erp_rrk_len = 9159 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]); 9160 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] || 9161 info->attrs[NL80211_ATTR_FILS_ERP_REALM] || 9162 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] || 9163 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) { 9164 kzfree(connkeys); 9165 return -EINVAL; 9166 } 9167 9168 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) { 9169 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 9170 GENL_SET_ERR_MSG(info, 9171 "external auth requires connection ownership"); 9172 return -EINVAL; 9173 } 9174 connect.flags |= CONNECT_REQ_EXTERNAL_AUTH_SUPPORT; 9175 } 9176 9177 wdev_lock(dev->ieee80211_ptr); 9178 9179 err = cfg80211_connect(rdev, dev, &connect, connkeys, 9180 connect.prev_bssid); 9181 if (err) 9182 kzfree(connkeys); 9183 9184 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) { 9185 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid; 9186 if (connect.bssid) 9187 memcpy(dev->ieee80211_ptr->disconnect_bssid, 9188 connect.bssid, ETH_ALEN); 9189 else 9190 memset(dev->ieee80211_ptr->disconnect_bssid, 9191 0, ETH_ALEN); 9192 } 9193 9194 wdev_unlock(dev->ieee80211_ptr); 9195 9196 return err; 9197 } 9198 9199 static int nl80211_update_connect_params(struct sk_buff *skb, 9200 struct genl_info *info) 9201 { 9202 struct cfg80211_connect_params connect = {}; 9203 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9204 struct net_device *dev = info->user_ptr[1]; 9205 struct wireless_dev *wdev = dev->ieee80211_ptr; 9206 u32 changed = 0; 9207 int ret; 9208 9209 if (!rdev->ops->update_connect_params) 9210 return -EOPNOTSUPP; 9211 9212 if (info->attrs[NL80211_ATTR_IE]) { 9213 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) 9214 return -EINVAL; 9215 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 9216 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 9217 changed |= UPDATE_ASSOC_IES; 9218 } 9219 9220 wdev_lock(dev->ieee80211_ptr); 9221 if (!wdev->current_bss) 9222 ret = -ENOLINK; 9223 else 9224 ret = rdev_update_connect_params(rdev, dev, &connect, changed); 9225 wdev_unlock(dev->ieee80211_ptr); 9226 9227 return ret; 9228 } 9229 9230 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info) 9231 { 9232 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9233 struct net_device *dev = info->user_ptr[1]; 9234 u16 reason; 9235 int ret; 9236 9237 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 9238 reason = WLAN_REASON_DEAUTH_LEAVING; 9239 else 9240 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 9241 9242 if (reason == 0) 9243 return -EINVAL; 9244 9245 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 9246 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 9247 return -EOPNOTSUPP; 9248 9249 wdev_lock(dev->ieee80211_ptr); 9250 ret = cfg80211_disconnect(rdev, dev, reason, true); 9251 wdev_unlock(dev->ieee80211_ptr); 9252 return ret; 9253 } 9254 9255 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info) 9256 { 9257 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9258 struct net *net; 9259 int err; 9260 9261 if (info->attrs[NL80211_ATTR_PID]) { 9262 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); 9263 9264 net = get_net_ns_by_pid(pid); 9265 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) { 9266 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]); 9267 9268 net = get_net_ns_by_fd(fd); 9269 } else { 9270 return -EINVAL; 9271 } 9272 9273 if (IS_ERR(net)) 9274 return PTR_ERR(net); 9275 9276 err = 0; 9277 9278 /* check if anything to do */ 9279 if (!net_eq(wiphy_net(&rdev->wiphy), net)) 9280 err = cfg80211_switch_netns(rdev, net); 9281 9282 put_net(net); 9283 return err; 9284 } 9285 9286 static int nl80211_setdel_pmksa(struct sk_buff *skb, struct genl_info *info) 9287 { 9288 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9289 int (*rdev_ops)(struct wiphy *wiphy, struct net_device *dev, 9290 struct cfg80211_pmksa *pmksa) = NULL; 9291 struct net_device *dev = info->user_ptr[1]; 9292 struct cfg80211_pmksa pmksa; 9293 9294 memset(&pmksa, 0, sizeof(struct cfg80211_pmksa)); 9295 9296 if (!info->attrs[NL80211_ATTR_PMKID]) 9297 return -EINVAL; 9298 9299 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 9300 9301 if (info->attrs[NL80211_ATTR_MAC]) { 9302 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 9303 } else if (info->attrs[NL80211_ATTR_SSID] && 9304 info->attrs[NL80211_ATTR_FILS_CACHE_ID] && 9305 (info->genlhdr->cmd == NL80211_CMD_DEL_PMKSA || 9306 info->attrs[NL80211_ATTR_PMK])) { 9307 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 9308 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 9309 pmksa.cache_id = 9310 nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]); 9311 } else { 9312 return -EINVAL; 9313 } 9314 if (info->attrs[NL80211_ATTR_PMK]) { 9315 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); 9316 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); 9317 } 9318 9319 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 9320 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 9321 return -EOPNOTSUPP; 9322 9323 switch (info->genlhdr->cmd) { 9324 case NL80211_CMD_SET_PMKSA: 9325 rdev_ops = rdev->ops->set_pmksa; 9326 break; 9327 case NL80211_CMD_DEL_PMKSA: 9328 rdev_ops = rdev->ops->del_pmksa; 9329 break; 9330 default: 9331 WARN_ON(1); 9332 break; 9333 } 9334 9335 if (!rdev_ops) 9336 return -EOPNOTSUPP; 9337 9338 return rdev_ops(&rdev->wiphy, dev, &pmksa); 9339 } 9340 9341 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info) 9342 { 9343 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9344 struct net_device *dev = info->user_ptr[1]; 9345 9346 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 9347 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 9348 return -EOPNOTSUPP; 9349 9350 if (!rdev->ops->flush_pmksa) 9351 return -EOPNOTSUPP; 9352 9353 return rdev_flush_pmksa(rdev, dev); 9354 } 9355 9356 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info) 9357 { 9358 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9359 struct net_device *dev = info->user_ptr[1]; 9360 u8 action_code, dialog_token; 9361 u32 peer_capability = 0; 9362 u16 status_code; 9363 u8 *peer; 9364 bool initiator; 9365 9366 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 9367 !rdev->ops->tdls_mgmt) 9368 return -EOPNOTSUPP; 9369 9370 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || 9371 !info->attrs[NL80211_ATTR_STATUS_CODE] || 9372 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || 9373 !info->attrs[NL80211_ATTR_IE] || 9374 !info->attrs[NL80211_ATTR_MAC]) 9375 return -EINVAL; 9376 9377 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 9378 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); 9379 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 9380 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); 9381 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]); 9382 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]) 9383 peer_capability = 9384 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]); 9385 9386 return rdev_tdls_mgmt(rdev, dev, peer, action_code, 9387 dialog_token, status_code, peer_capability, 9388 initiator, 9389 nla_data(info->attrs[NL80211_ATTR_IE]), 9390 nla_len(info->attrs[NL80211_ATTR_IE])); 9391 } 9392 9393 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info) 9394 { 9395 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9396 struct net_device *dev = info->user_ptr[1]; 9397 enum nl80211_tdls_operation operation; 9398 u8 *peer; 9399 9400 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 9401 !rdev->ops->tdls_oper) 9402 return -EOPNOTSUPP; 9403 9404 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || 9405 !info->attrs[NL80211_ATTR_MAC]) 9406 return -EINVAL; 9407 9408 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); 9409 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 9410 9411 return rdev_tdls_oper(rdev, dev, peer, operation); 9412 } 9413 9414 static int nl80211_remain_on_channel(struct sk_buff *skb, 9415 struct genl_info *info) 9416 { 9417 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9418 struct wireless_dev *wdev = info->user_ptr[1]; 9419 struct cfg80211_chan_def chandef; 9420 const struct cfg80211_chan_def *compat_chandef; 9421 struct sk_buff *msg; 9422 void *hdr; 9423 u64 cookie; 9424 u32 duration; 9425 int err; 9426 9427 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 9428 !info->attrs[NL80211_ATTR_DURATION]) 9429 return -EINVAL; 9430 9431 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 9432 9433 if (!rdev->ops->remain_on_channel || 9434 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) 9435 return -EOPNOTSUPP; 9436 9437 /* 9438 * We should be on that channel for at least a minimum amount of 9439 * time (10ms) but no longer than the driver supports. 9440 */ 9441 if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 9442 duration > rdev->wiphy.max_remain_on_channel_duration) 9443 return -EINVAL; 9444 9445 err = nl80211_parse_chandef(rdev, info, &chandef); 9446 if (err) 9447 return err; 9448 9449 wdev_lock(wdev); 9450 if (!cfg80211_off_channel_oper_allowed(wdev) && 9451 !cfg80211_chandef_identical(&wdev->chandef, &chandef)) { 9452 compat_chandef = cfg80211_chandef_compatible(&wdev->chandef, 9453 &chandef); 9454 if (compat_chandef != &chandef) { 9455 wdev_unlock(wdev); 9456 return -EBUSY; 9457 } 9458 } 9459 wdev_unlock(wdev); 9460 9461 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9462 if (!msg) 9463 return -ENOMEM; 9464 9465 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 9466 NL80211_CMD_REMAIN_ON_CHANNEL); 9467 if (!hdr) { 9468 err = -ENOBUFS; 9469 goto free_msg; 9470 } 9471 9472 err = rdev_remain_on_channel(rdev, wdev, chandef.chan, 9473 duration, &cookie); 9474 9475 if (err) 9476 goto free_msg; 9477 9478 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 9479 NL80211_ATTR_PAD)) 9480 goto nla_put_failure; 9481 9482 genlmsg_end(msg, hdr); 9483 9484 return genlmsg_reply(msg, info); 9485 9486 nla_put_failure: 9487 err = -ENOBUFS; 9488 free_msg: 9489 nlmsg_free(msg); 9490 return err; 9491 } 9492 9493 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb, 9494 struct genl_info *info) 9495 { 9496 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9497 struct wireless_dev *wdev = info->user_ptr[1]; 9498 u64 cookie; 9499 9500 if (!info->attrs[NL80211_ATTR_COOKIE]) 9501 return -EINVAL; 9502 9503 if (!rdev->ops->cancel_remain_on_channel) 9504 return -EOPNOTSUPP; 9505 9506 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 9507 9508 return rdev_cancel_remain_on_channel(rdev, wdev, cookie); 9509 } 9510 9511 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb, 9512 struct genl_info *info) 9513 { 9514 struct cfg80211_bitrate_mask mask; 9515 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9516 struct net_device *dev = info->user_ptr[1]; 9517 int err; 9518 9519 if (!rdev->ops->set_bitrate_mask) 9520 return -EOPNOTSUPP; 9521 9522 err = nl80211_parse_tx_bitrate_mask(info, &mask); 9523 if (err) 9524 return err; 9525 9526 return rdev_set_bitrate_mask(rdev, dev, NULL, &mask); 9527 } 9528 9529 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info) 9530 { 9531 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9532 struct wireless_dev *wdev = info->user_ptr[1]; 9533 u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION; 9534 9535 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) 9536 return -EINVAL; 9537 9538 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) 9539 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); 9540 9541 switch (wdev->iftype) { 9542 case NL80211_IFTYPE_STATION: 9543 case NL80211_IFTYPE_ADHOC: 9544 case NL80211_IFTYPE_P2P_CLIENT: 9545 case NL80211_IFTYPE_AP: 9546 case NL80211_IFTYPE_AP_VLAN: 9547 case NL80211_IFTYPE_MESH_POINT: 9548 case NL80211_IFTYPE_P2P_GO: 9549 case NL80211_IFTYPE_P2P_DEVICE: 9550 break; 9551 case NL80211_IFTYPE_NAN: 9552 default: 9553 return -EOPNOTSUPP; 9554 } 9555 9556 /* not much point in registering if we can't reply */ 9557 if (!rdev->ops->mgmt_tx) 9558 return -EOPNOTSUPP; 9559 9560 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, 9561 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), 9562 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH])); 9563 } 9564 9565 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info) 9566 { 9567 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9568 struct wireless_dev *wdev = info->user_ptr[1]; 9569 struct cfg80211_chan_def chandef; 9570 int err; 9571 void *hdr = NULL; 9572 u64 cookie; 9573 struct sk_buff *msg = NULL; 9574 struct cfg80211_mgmt_tx_params params = { 9575 .dont_wait_for_ack = 9576 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], 9577 }; 9578 9579 if (!info->attrs[NL80211_ATTR_FRAME]) 9580 return -EINVAL; 9581 9582 if (!rdev->ops->mgmt_tx) 9583 return -EOPNOTSUPP; 9584 9585 switch (wdev->iftype) { 9586 case NL80211_IFTYPE_P2P_DEVICE: 9587 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 9588 return -EINVAL; 9589 case NL80211_IFTYPE_STATION: 9590 case NL80211_IFTYPE_ADHOC: 9591 case NL80211_IFTYPE_P2P_CLIENT: 9592 case NL80211_IFTYPE_AP: 9593 case NL80211_IFTYPE_AP_VLAN: 9594 case NL80211_IFTYPE_MESH_POINT: 9595 case NL80211_IFTYPE_P2P_GO: 9596 break; 9597 case NL80211_IFTYPE_NAN: 9598 default: 9599 return -EOPNOTSUPP; 9600 } 9601 9602 if (info->attrs[NL80211_ATTR_DURATION]) { 9603 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 9604 return -EINVAL; 9605 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 9606 9607 /* 9608 * We should wait on the channel for at least a minimum amount 9609 * of time (10ms) but no longer than the driver supports. 9610 */ 9611 if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 9612 params.wait > rdev->wiphy.max_remain_on_channel_duration) 9613 return -EINVAL; 9614 } 9615 9616 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; 9617 9618 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 9619 return -EINVAL; 9620 9621 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 9622 9623 /* get the channel if any has been specified, otherwise pass NULL to 9624 * the driver. The latter will use the current one 9625 */ 9626 chandef.chan = NULL; 9627 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 9628 err = nl80211_parse_chandef(rdev, info, &chandef); 9629 if (err) 9630 return err; 9631 } 9632 9633 if (!chandef.chan && params.offchan) 9634 return -EINVAL; 9635 9636 wdev_lock(wdev); 9637 if (params.offchan && !cfg80211_off_channel_oper_allowed(wdev)) { 9638 wdev_unlock(wdev); 9639 return -EBUSY; 9640 } 9641 wdev_unlock(wdev); 9642 9643 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 9644 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 9645 9646 if (info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]) { 9647 int len = nla_len(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); 9648 int i; 9649 9650 if (len % sizeof(u16)) 9651 return -EINVAL; 9652 9653 params.n_csa_offsets = len / sizeof(u16); 9654 params.csa_offsets = 9655 nla_data(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]); 9656 9657 /* check that all the offsets fit the frame */ 9658 for (i = 0; i < params.n_csa_offsets; i++) { 9659 if (params.csa_offsets[i] >= params.len) 9660 return -EINVAL; 9661 } 9662 } 9663 9664 if (!params.dont_wait_for_ack) { 9665 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9666 if (!msg) 9667 return -ENOMEM; 9668 9669 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 9670 NL80211_CMD_FRAME); 9671 if (!hdr) { 9672 err = -ENOBUFS; 9673 goto free_msg; 9674 } 9675 } 9676 9677 params.chan = chandef.chan; 9678 err = cfg80211_mlme_mgmt_tx(rdev, wdev, ¶ms, &cookie); 9679 if (err) 9680 goto free_msg; 9681 9682 if (msg) { 9683 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 9684 NL80211_ATTR_PAD)) 9685 goto nla_put_failure; 9686 9687 genlmsg_end(msg, hdr); 9688 return genlmsg_reply(msg, info); 9689 } 9690 9691 return 0; 9692 9693 nla_put_failure: 9694 err = -ENOBUFS; 9695 free_msg: 9696 nlmsg_free(msg); 9697 return err; 9698 } 9699 9700 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info) 9701 { 9702 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9703 struct wireless_dev *wdev = info->user_ptr[1]; 9704 u64 cookie; 9705 9706 if (!info->attrs[NL80211_ATTR_COOKIE]) 9707 return -EINVAL; 9708 9709 if (!rdev->ops->mgmt_tx_cancel_wait) 9710 return -EOPNOTSUPP; 9711 9712 switch (wdev->iftype) { 9713 case NL80211_IFTYPE_STATION: 9714 case NL80211_IFTYPE_ADHOC: 9715 case NL80211_IFTYPE_P2P_CLIENT: 9716 case NL80211_IFTYPE_AP: 9717 case NL80211_IFTYPE_AP_VLAN: 9718 case NL80211_IFTYPE_P2P_GO: 9719 case NL80211_IFTYPE_P2P_DEVICE: 9720 break; 9721 case NL80211_IFTYPE_NAN: 9722 default: 9723 return -EOPNOTSUPP; 9724 } 9725 9726 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 9727 9728 return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie); 9729 } 9730 9731 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info) 9732 { 9733 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9734 struct wireless_dev *wdev; 9735 struct net_device *dev = info->user_ptr[1]; 9736 u8 ps_state; 9737 bool state; 9738 int err; 9739 9740 if (!info->attrs[NL80211_ATTR_PS_STATE]) 9741 return -EINVAL; 9742 9743 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); 9744 9745 if (ps_state != NL80211_PS_DISABLED && ps_state != NL80211_PS_ENABLED) 9746 return -EINVAL; 9747 9748 wdev = dev->ieee80211_ptr; 9749 9750 if (!rdev->ops->set_power_mgmt) 9751 return -EOPNOTSUPP; 9752 9753 state = (ps_state == NL80211_PS_ENABLED) ? true : false; 9754 9755 if (state == wdev->ps) 9756 return 0; 9757 9758 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); 9759 if (!err) 9760 wdev->ps = state; 9761 return err; 9762 } 9763 9764 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info) 9765 { 9766 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9767 enum nl80211_ps_state ps_state; 9768 struct wireless_dev *wdev; 9769 struct net_device *dev = info->user_ptr[1]; 9770 struct sk_buff *msg; 9771 void *hdr; 9772 int err; 9773 9774 wdev = dev->ieee80211_ptr; 9775 9776 if (!rdev->ops->set_power_mgmt) 9777 return -EOPNOTSUPP; 9778 9779 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9780 if (!msg) 9781 return -ENOMEM; 9782 9783 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 9784 NL80211_CMD_GET_POWER_SAVE); 9785 if (!hdr) { 9786 err = -ENOBUFS; 9787 goto free_msg; 9788 } 9789 9790 if (wdev->ps) 9791 ps_state = NL80211_PS_ENABLED; 9792 else 9793 ps_state = NL80211_PS_DISABLED; 9794 9795 if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state)) 9796 goto nla_put_failure; 9797 9798 genlmsg_end(msg, hdr); 9799 return genlmsg_reply(msg, info); 9800 9801 nla_put_failure: 9802 err = -ENOBUFS; 9803 free_msg: 9804 nlmsg_free(msg); 9805 return err; 9806 } 9807 9808 static const struct nla_policy 9809 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = { 9810 [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_BINARY }, 9811 [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 }, 9812 [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 }, 9813 [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 }, 9814 [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 }, 9815 [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 }, 9816 [NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_S32 }, 9817 }; 9818 9819 static int nl80211_set_cqm_txe(struct genl_info *info, 9820 u32 rate, u32 pkts, u32 intvl) 9821 { 9822 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9823 struct net_device *dev = info->user_ptr[1]; 9824 struct wireless_dev *wdev = dev->ieee80211_ptr; 9825 9826 if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL) 9827 return -EINVAL; 9828 9829 if (!rdev->ops->set_cqm_txe_config) 9830 return -EOPNOTSUPP; 9831 9832 if (wdev->iftype != NL80211_IFTYPE_STATION && 9833 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 9834 return -EOPNOTSUPP; 9835 9836 return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl); 9837 } 9838 9839 static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev, 9840 struct net_device *dev) 9841 { 9842 struct wireless_dev *wdev = dev->ieee80211_ptr; 9843 s32 last, low, high; 9844 u32 hyst; 9845 int i, n; 9846 int err; 9847 9848 /* RSSI reporting disabled? */ 9849 if (!wdev->cqm_config) 9850 return rdev_set_cqm_rssi_range_config(rdev, dev, 0, 0); 9851 9852 /* 9853 * Obtain current RSSI value if possible, if not and no RSSI threshold 9854 * event has been received yet, we should receive an event after a 9855 * connection is established and enough beacons received to calculate 9856 * the average. 9857 */ 9858 if (!wdev->cqm_config->last_rssi_event_value && wdev->current_bss && 9859 rdev->ops->get_station) { 9860 struct station_info sinfo = {}; 9861 u8 *mac_addr; 9862 9863 mac_addr = wdev->current_bss->pub.bssid; 9864 9865 err = rdev_get_station(rdev, dev, mac_addr, &sinfo); 9866 if (err) 9867 return err; 9868 9869 if (sinfo.filled & BIT(NL80211_STA_INFO_BEACON_SIGNAL_AVG)) 9870 wdev->cqm_config->last_rssi_event_value = 9871 (s8) sinfo.rx_beacon_signal_avg; 9872 } 9873 9874 last = wdev->cqm_config->last_rssi_event_value; 9875 hyst = wdev->cqm_config->rssi_hyst; 9876 n = wdev->cqm_config->n_rssi_thresholds; 9877 9878 for (i = 0; i < n; i++) 9879 if (last < wdev->cqm_config->rssi_thresholds[i]) 9880 break; 9881 9882 low = i > 0 ? 9883 (wdev->cqm_config->rssi_thresholds[i - 1] - hyst) : S32_MIN; 9884 high = i < n ? 9885 (wdev->cqm_config->rssi_thresholds[i] + hyst - 1) : S32_MAX; 9886 9887 return rdev_set_cqm_rssi_range_config(rdev, dev, low, high); 9888 } 9889 9890 static int nl80211_set_cqm_rssi(struct genl_info *info, 9891 const s32 *thresholds, int n_thresholds, 9892 u32 hysteresis) 9893 { 9894 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9895 struct net_device *dev = info->user_ptr[1]; 9896 struct wireless_dev *wdev = dev->ieee80211_ptr; 9897 int i, err; 9898 s32 prev = S32_MIN; 9899 9900 /* Check all values negative and sorted */ 9901 for (i = 0; i < n_thresholds; i++) { 9902 if (thresholds[i] > 0 || thresholds[i] <= prev) 9903 return -EINVAL; 9904 9905 prev = thresholds[i]; 9906 } 9907 9908 if (wdev->iftype != NL80211_IFTYPE_STATION && 9909 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 9910 return -EOPNOTSUPP; 9911 9912 wdev_lock(wdev); 9913 cfg80211_cqm_config_free(wdev); 9914 wdev_unlock(wdev); 9915 9916 if (n_thresholds <= 1 && rdev->ops->set_cqm_rssi_config) { 9917 if (n_thresholds == 0 || thresholds[0] == 0) /* Disabling */ 9918 return rdev_set_cqm_rssi_config(rdev, dev, 0, 0); 9919 9920 return rdev_set_cqm_rssi_config(rdev, dev, 9921 thresholds[0], hysteresis); 9922 } 9923 9924 if (!wiphy_ext_feature_isset(&rdev->wiphy, 9925 NL80211_EXT_FEATURE_CQM_RSSI_LIST)) 9926 return -EOPNOTSUPP; 9927 9928 if (n_thresholds == 1 && thresholds[0] == 0) /* Disabling */ 9929 n_thresholds = 0; 9930 9931 wdev_lock(wdev); 9932 if (n_thresholds) { 9933 struct cfg80211_cqm_config *cqm_config; 9934 9935 cqm_config = kzalloc(sizeof(struct cfg80211_cqm_config) + 9936 n_thresholds * sizeof(s32), GFP_KERNEL); 9937 if (!cqm_config) { 9938 err = -ENOMEM; 9939 goto unlock; 9940 } 9941 9942 cqm_config->rssi_hyst = hysteresis; 9943 cqm_config->n_rssi_thresholds = n_thresholds; 9944 memcpy(cqm_config->rssi_thresholds, thresholds, 9945 n_thresholds * sizeof(s32)); 9946 9947 wdev->cqm_config = cqm_config; 9948 } 9949 9950 err = cfg80211_cqm_rssi_update(rdev, dev); 9951 9952 unlock: 9953 wdev_unlock(wdev); 9954 9955 return err; 9956 } 9957 9958 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info) 9959 { 9960 struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1]; 9961 struct nlattr *cqm; 9962 int err; 9963 9964 cqm = info->attrs[NL80211_ATTR_CQM]; 9965 if (!cqm) 9966 return -EINVAL; 9967 9968 err = nla_parse_nested(attrs, NL80211_ATTR_CQM_MAX, cqm, 9969 nl80211_attr_cqm_policy, info->extack); 9970 if (err) 9971 return err; 9972 9973 if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] && 9974 attrs[NL80211_ATTR_CQM_RSSI_HYST]) { 9975 const s32 *thresholds = 9976 nla_data(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 9977 int len = nla_len(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 9978 u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]); 9979 9980 if (len % 4) 9981 return -EINVAL; 9982 9983 return nl80211_set_cqm_rssi(info, thresholds, len / 4, 9984 hysteresis); 9985 } 9986 9987 if (attrs[NL80211_ATTR_CQM_TXE_RATE] && 9988 attrs[NL80211_ATTR_CQM_TXE_PKTS] && 9989 attrs[NL80211_ATTR_CQM_TXE_INTVL]) { 9990 u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]); 9991 u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]); 9992 u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]); 9993 9994 return nl80211_set_cqm_txe(info, rate, pkts, intvl); 9995 } 9996 9997 return -EINVAL; 9998 } 9999 10000 static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info) 10001 { 10002 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10003 struct net_device *dev = info->user_ptr[1]; 10004 struct ocb_setup setup = {}; 10005 int err; 10006 10007 err = nl80211_parse_chandef(rdev, info, &setup.chandef); 10008 if (err) 10009 return err; 10010 10011 return cfg80211_join_ocb(rdev, dev, &setup); 10012 } 10013 10014 static int nl80211_leave_ocb(struct sk_buff *skb, struct genl_info *info) 10015 { 10016 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10017 struct net_device *dev = info->user_ptr[1]; 10018 10019 return cfg80211_leave_ocb(rdev, dev); 10020 } 10021 10022 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info) 10023 { 10024 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10025 struct net_device *dev = info->user_ptr[1]; 10026 struct mesh_config cfg; 10027 struct mesh_setup setup; 10028 int err; 10029 10030 /* start with default */ 10031 memcpy(&cfg, &default_mesh_config, sizeof(cfg)); 10032 memcpy(&setup, &default_mesh_setup, sizeof(setup)); 10033 10034 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { 10035 /* and parse parameters if given */ 10036 err = nl80211_parse_mesh_config(info, &cfg, NULL); 10037 if (err) 10038 return err; 10039 } 10040 10041 if (!info->attrs[NL80211_ATTR_MESH_ID] || 10042 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) 10043 return -EINVAL; 10044 10045 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); 10046 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 10047 10048 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 10049 !nl80211_parse_mcast_rate(rdev, setup.mcast_rate, 10050 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 10051 return -EINVAL; 10052 10053 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { 10054 setup.beacon_interval = 10055 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 10056 10057 err = cfg80211_validate_beacon_int(rdev, 10058 NL80211_IFTYPE_MESH_POINT, 10059 setup.beacon_interval); 10060 if (err) 10061 return err; 10062 } 10063 10064 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { 10065 setup.dtim_period = 10066 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 10067 if (setup.dtim_period < 1 || setup.dtim_period > 100) 10068 return -EINVAL; 10069 } 10070 10071 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { 10072 /* parse additional setup parameters if given */ 10073 err = nl80211_parse_mesh_setup(info, &setup); 10074 if (err) 10075 return err; 10076 } 10077 10078 if (setup.user_mpm) 10079 cfg.auto_open_plinks = false; 10080 10081 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 10082 err = nl80211_parse_chandef(rdev, info, &setup.chandef); 10083 if (err) 10084 return err; 10085 } else { 10086 /* cfg80211_join_mesh() will sort it out */ 10087 setup.chandef.chan = NULL; 10088 } 10089 10090 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 10091 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 10092 int n_rates = 10093 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 10094 struct ieee80211_supported_band *sband; 10095 10096 if (!setup.chandef.chan) 10097 return -EINVAL; 10098 10099 sband = rdev->wiphy.bands[setup.chandef.chan->band]; 10100 10101 err = ieee80211_get_ratemask(sband, rates, n_rates, 10102 &setup.basic_rates); 10103 if (err) 10104 return err; 10105 } 10106 10107 if (info->attrs[NL80211_ATTR_TX_RATES]) { 10108 err = nl80211_parse_tx_bitrate_mask(info, &setup.beacon_rate); 10109 if (err) 10110 return err; 10111 10112 if (!setup.chandef.chan) 10113 return -EINVAL; 10114 10115 err = validate_beacon_tx_rate(rdev, setup.chandef.chan->band, 10116 &setup.beacon_rate); 10117 if (err) 10118 return err; 10119 } 10120 10121 setup.userspace_handles_dfs = 10122 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 10123 10124 return cfg80211_join_mesh(rdev, dev, &setup, &cfg); 10125 } 10126 10127 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info) 10128 { 10129 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10130 struct net_device *dev = info->user_ptr[1]; 10131 10132 return cfg80211_leave_mesh(rdev, dev); 10133 } 10134 10135 #ifdef CONFIG_PM 10136 static int nl80211_send_wowlan_patterns(struct sk_buff *msg, 10137 struct cfg80211_registered_device *rdev) 10138 { 10139 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; 10140 struct nlattr *nl_pats, *nl_pat; 10141 int i, pat_len; 10142 10143 if (!wowlan->n_patterns) 10144 return 0; 10145 10146 nl_pats = nla_nest_start(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN); 10147 if (!nl_pats) 10148 return -ENOBUFS; 10149 10150 for (i = 0; i < wowlan->n_patterns; i++) { 10151 nl_pat = nla_nest_start(msg, i + 1); 10152 if (!nl_pat) 10153 return -ENOBUFS; 10154 pat_len = wowlan->patterns[i].pattern_len; 10155 if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8), 10156 wowlan->patterns[i].mask) || 10157 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 10158 wowlan->patterns[i].pattern) || 10159 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 10160 wowlan->patterns[i].pkt_offset)) 10161 return -ENOBUFS; 10162 nla_nest_end(msg, nl_pat); 10163 } 10164 nla_nest_end(msg, nl_pats); 10165 10166 return 0; 10167 } 10168 10169 static int nl80211_send_wowlan_tcp(struct sk_buff *msg, 10170 struct cfg80211_wowlan_tcp *tcp) 10171 { 10172 struct nlattr *nl_tcp; 10173 10174 if (!tcp) 10175 return 0; 10176 10177 nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION); 10178 if (!nl_tcp) 10179 return -ENOBUFS; 10180 10181 if (nla_put_in_addr(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || 10182 nla_put_in_addr(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || 10183 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || 10184 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || 10185 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || 10186 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 10187 tcp->payload_len, tcp->payload) || 10188 nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 10189 tcp->data_interval) || 10190 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 10191 tcp->wake_len, tcp->wake_data) || 10192 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK, 10193 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) 10194 return -ENOBUFS; 10195 10196 if (tcp->payload_seq.len && 10197 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ, 10198 sizeof(tcp->payload_seq), &tcp->payload_seq)) 10199 return -ENOBUFS; 10200 10201 if (tcp->payload_tok.len && 10202 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 10203 sizeof(tcp->payload_tok) + tcp->tokens_size, 10204 &tcp->payload_tok)) 10205 return -ENOBUFS; 10206 10207 nla_nest_end(msg, nl_tcp); 10208 10209 return 0; 10210 } 10211 10212 static int nl80211_send_wowlan_nd(struct sk_buff *msg, 10213 struct cfg80211_sched_scan_request *req) 10214 { 10215 struct nlattr *nd, *freqs, *matches, *match, *scan_plans, *scan_plan; 10216 int i; 10217 10218 if (!req) 10219 return 0; 10220 10221 nd = nla_nest_start(msg, NL80211_WOWLAN_TRIG_NET_DETECT); 10222 if (!nd) 10223 return -ENOBUFS; 10224 10225 if (req->n_scan_plans == 1 && 10226 nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_INTERVAL, 10227 req->scan_plans[0].interval * 1000)) 10228 return -ENOBUFS; 10229 10230 if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_DELAY, req->delay)) 10231 return -ENOBUFS; 10232 10233 if (req->relative_rssi_set) { 10234 struct nl80211_bss_select_rssi_adjust rssi_adjust; 10235 10236 if (nla_put_s8(msg, NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI, 10237 req->relative_rssi)) 10238 return -ENOBUFS; 10239 10240 rssi_adjust.band = req->rssi_adjust.band; 10241 rssi_adjust.delta = req->rssi_adjust.delta; 10242 if (nla_put(msg, NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST, 10243 sizeof(rssi_adjust), &rssi_adjust)) 10244 return -ENOBUFS; 10245 } 10246 10247 freqs = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES); 10248 if (!freqs) 10249 return -ENOBUFS; 10250 10251 for (i = 0; i < req->n_channels; i++) { 10252 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) 10253 return -ENOBUFS; 10254 } 10255 10256 nla_nest_end(msg, freqs); 10257 10258 if (req->n_match_sets) { 10259 matches = nla_nest_start(msg, NL80211_ATTR_SCHED_SCAN_MATCH); 10260 if (!matches) 10261 return -ENOBUFS; 10262 10263 for (i = 0; i < req->n_match_sets; i++) { 10264 match = nla_nest_start(msg, i); 10265 if (!match) 10266 return -ENOBUFS; 10267 10268 if (nla_put(msg, NL80211_SCHED_SCAN_MATCH_ATTR_SSID, 10269 req->match_sets[i].ssid.ssid_len, 10270 req->match_sets[i].ssid.ssid)) 10271 return -ENOBUFS; 10272 nla_nest_end(msg, match); 10273 } 10274 nla_nest_end(msg, matches); 10275 } 10276 10277 scan_plans = nla_nest_start(msg, NL80211_ATTR_SCHED_SCAN_PLANS); 10278 if (!scan_plans) 10279 return -ENOBUFS; 10280 10281 for (i = 0; i < req->n_scan_plans; i++) { 10282 scan_plan = nla_nest_start(msg, i + 1); 10283 if (!scan_plan) 10284 return -ENOBUFS; 10285 10286 if (!scan_plan || 10287 nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_INTERVAL, 10288 req->scan_plans[i].interval) || 10289 (req->scan_plans[i].iterations && 10290 nla_put_u32(msg, NL80211_SCHED_SCAN_PLAN_ITERATIONS, 10291 req->scan_plans[i].iterations))) 10292 return -ENOBUFS; 10293 nla_nest_end(msg, scan_plan); 10294 } 10295 nla_nest_end(msg, scan_plans); 10296 10297 nla_nest_end(msg, nd); 10298 10299 return 0; 10300 } 10301 10302 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info) 10303 { 10304 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10305 struct sk_buff *msg; 10306 void *hdr; 10307 u32 size = NLMSG_DEFAULT_SIZE; 10308 10309 if (!rdev->wiphy.wowlan) 10310 return -EOPNOTSUPP; 10311 10312 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { 10313 /* adjust size to have room for all the data */ 10314 size += rdev->wiphy.wowlan_config->tcp->tokens_size + 10315 rdev->wiphy.wowlan_config->tcp->payload_len + 10316 rdev->wiphy.wowlan_config->tcp->wake_len + 10317 rdev->wiphy.wowlan_config->tcp->wake_len / 8; 10318 } 10319 10320 msg = nlmsg_new(size, GFP_KERNEL); 10321 if (!msg) 10322 return -ENOMEM; 10323 10324 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 10325 NL80211_CMD_GET_WOWLAN); 10326 if (!hdr) 10327 goto nla_put_failure; 10328 10329 if (rdev->wiphy.wowlan_config) { 10330 struct nlattr *nl_wowlan; 10331 10332 nl_wowlan = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS); 10333 if (!nl_wowlan) 10334 goto nla_put_failure; 10335 10336 if ((rdev->wiphy.wowlan_config->any && 10337 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 10338 (rdev->wiphy.wowlan_config->disconnect && 10339 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 10340 (rdev->wiphy.wowlan_config->magic_pkt && 10341 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 10342 (rdev->wiphy.wowlan_config->gtk_rekey_failure && 10343 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 10344 (rdev->wiphy.wowlan_config->eap_identity_req && 10345 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 10346 (rdev->wiphy.wowlan_config->four_way_handshake && 10347 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 10348 (rdev->wiphy.wowlan_config->rfkill_release && 10349 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 10350 goto nla_put_failure; 10351 10352 if (nl80211_send_wowlan_patterns(msg, rdev)) 10353 goto nla_put_failure; 10354 10355 if (nl80211_send_wowlan_tcp(msg, 10356 rdev->wiphy.wowlan_config->tcp)) 10357 goto nla_put_failure; 10358 10359 if (nl80211_send_wowlan_nd( 10360 msg, 10361 rdev->wiphy.wowlan_config->nd_config)) 10362 goto nla_put_failure; 10363 10364 nla_nest_end(msg, nl_wowlan); 10365 } 10366 10367 genlmsg_end(msg, hdr); 10368 return genlmsg_reply(msg, info); 10369 10370 nla_put_failure: 10371 nlmsg_free(msg); 10372 return -ENOBUFS; 10373 } 10374 10375 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev, 10376 struct nlattr *attr, 10377 struct cfg80211_wowlan *trig) 10378 { 10379 struct nlattr *tb[NUM_NL80211_WOWLAN_TCP]; 10380 struct cfg80211_wowlan_tcp *cfg; 10381 struct nl80211_wowlan_tcp_data_token *tok = NULL; 10382 struct nl80211_wowlan_tcp_data_seq *seq = NULL; 10383 u32 size; 10384 u32 data_size, wake_size, tokens_size = 0, wake_mask_size; 10385 int err, port; 10386 10387 if (!rdev->wiphy.wowlan->tcp) 10388 return -EINVAL; 10389 10390 err = nla_parse_nested(tb, MAX_NL80211_WOWLAN_TCP, attr, 10391 nl80211_wowlan_tcp_policy, NULL); 10392 if (err) 10393 return err; 10394 10395 if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] || 10396 !tb[NL80211_WOWLAN_TCP_DST_IPV4] || 10397 !tb[NL80211_WOWLAN_TCP_DST_MAC] || 10398 !tb[NL80211_WOWLAN_TCP_DST_PORT] || 10399 !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] || 10400 !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] || 10401 !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] || 10402 !tb[NL80211_WOWLAN_TCP_WAKE_MASK]) 10403 return -EINVAL; 10404 10405 data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]); 10406 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) 10407 return -EINVAL; 10408 10409 if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) > 10410 rdev->wiphy.wowlan->tcp->data_interval_max || 10411 nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0) 10412 return -EINVAL; 10413 10414 wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]); 10415 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) 10416 return -EINVAL; 10417 10418 wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]); 10419 if (wake_mask_size != DIV_ROUND_UP(wake_size, 8)) 10420 return -EINVAL; 10421 10422 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) { 10423 u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 10424 10425 tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 10426 tokens_size = tokln - sizeof(*tok); 10427 10428 if (!tok->len || tokens_size % tok->len) 10429 return -EINVAL; 10430 if (!rdev->wiphy.wowlan->tcp->tok) 10431 return -EINVAL; 10432 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) 10433 return -EINVAL; 10434 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) 10435 return -EINVAL; 10436 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) 10437 return -EINVAL; 10438 if (tok->offset + tok->len > data_size) 10439 return -EINVAL; 10440 } 10441 10442 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) { 10443 seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]); 10444 if (!rdev->wiphy.wowlan->tcp->seq) 10445 return -EINVAL; 10446 if (seq->len == 0 || seq->len > 4) 10447 return -EINVAL; 10448 if (seq->len + seq->offset > data_size) 10449 return -EINVAL; 10450 } 10451 10452 size = sizeof(*cfg); 10453 size += data_size; 10454 size += wake_size + wake_mask_size; 10455 size += tokens_size; 10456 10457 cfg = kzalloc(size, GFP_KERNEL); 10458 if (!cfg) 10459 return -ENOMEM; 10460 cfg->src = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); 10461 cfg->dst = nla_get_in_addr(tb[NL80211_WOWLAN_TCP_DST_IPV4]); 10462 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), 10463 ETH_ALEN); 10464 if (tb[NL80211_WOWLAN_TCP_SRC_PORT]) 10465 port = nla_get_u16(tb[NL80211_WOWLAN_TCP_SRC_PORT]); 10466 else 10467 port = 0; 10468 #ifdef CONFIG_INET 10469 /* allocate a socket and port for it and use it */ 10470 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, 10471 IPPROTO_TCP, &cfg->sock, 1); 10472 if (err) { 10473 kfree(cfg); 10474 return err; 10475 } 10476 if (inet_csk_get_port(cfg->sock->sk, port)) { 10477 sock_release(cfg->sock); 10478 kfree(cfg); 10479 return -EADDRINUSE; 10480 } 10481 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; 10482 #else 10483 if (!port) { 10484 kfree(cfg); 10485 return -EINVAL; 10486 } 10487 cfg->src_port = port; 10488 #endif 10489 10490 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); 10491 cfg->payload_len = data_size; 10492 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; 10493 memcpy((void *)cfg->payload, 10494 nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]), 10495 data_size); 10496 if (seq) 10497 cfg->payload_seq = *seq; 10498 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); 10499 cfg->wake_len = wake_size; 10500 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; 10501 memcpy((void *)cfg->wake_data, 10502 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]), 10503 wake_size); 10504 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + 10505 data_size + wake_size; 10506 memcpy((void *)cfg->wake_mask, 10507 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]), 10508 wake_mask_size); 10509 if (tok) { 10510 cfg->tokens_size = tokens_size; 10511 memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size); 10512 } 10513 10514 trig->tcp = cfg; 10515 10516 return 0; 10517 } 10518 10519 static int nl80211_parse_wowlan_nd(struct cfg80211_registered_device *rdev, 10520 const struct wiphy_wowlan_support *wowlan, 10521 struct nlattr *attr, 10522 struct cfg80211_wowlan *trig) 10523 { 10524 struct nlattr **tb; 10525 int err; 10526 10527 tb = kzalloc(NUM_NL80211_ATTR * sizeof(*tb), GFP_KERNEL); 10528 if (!tb) 10529 return -ENOMEM; 10530 10531 if (!(wowlan->flags & WIPHY_WOWLAN_NET_DETECT)) { 10532 err = -EOPNOTSUPP; 10533 goto out; 10534 } 10535 10536 err = nla_parse_nested(tb, NL80211_ATTR_MAX, attr, nl80211_policy, 10537 NULL); 10538 if (err) 10539 goto out; 10540 10541 trig->nd_config = nl80211_parse_sched_scan(&rdev->wiphy, NULL, tb, 10542 wowlan->max_nd_match_sets); 10543 err = PTR_ERR_OR_ZERO(trig->nd_config); 10544 if (err) 10545 trig->nd_config = NULL; 10546 10547 out: 10548 kfree(tb); 10549 return err; 10550 } 10551 10552 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info) 10553 { 10554 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10555 struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG]; 10556 struct cfg80211_wowlan new_triggers = {}; 10557 struct cfg80211_wowlan *ntrig; 10558 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; 10559 int err, i; 10560 bool prev_enabled = rdev->wiphy.wowlan_config; 10561 bool regular = false; 10562 10563 if (!wowlan) 10564 return -EOPNOTSUPP; 10565 10566 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { 10567 cfg80211_rdev_free_wowlan(rdev); 10568 rdev->wiphy.wowlan_config = NULL; 10569 goto set_wakeup; 10570 } 10571 10572 err = nla_parse_nested(tb, MAX_NL80211_WOWLAN_TRIG, 10573 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS], 10574 nl80211_wowlan_policy, info->extack); 10575 if (err) 10576 return err; 10577 10578 if (tb[NL80211_WOWLAN_TRIG_ANY]) { 10579 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) 10580 return -EINVAL; 10581 new_triggers.any = true; 10582 } 10583 10584 if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) { 10585 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) 10586 return -EINVAL; 10587 new_triggers.disconnect = true; 10588 regular = true; 10589 } 10590 10591 if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) { 10592 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) 10593 return -EINVAL; 10594 new_triggers.magic_pkt = true; 10595 regular = true; 10596 } 10597 10598 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED]) 10599 return -EINVAL; 10600 10601 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) { 10602 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) 10603 return -EINVAL; 10604 new_triggers.gtk_rekey_failure = true; 10605 regular = true; 10606 } 10607 10608 if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) { 10609 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) 10610 return -EINVAL; 10611 new_triggers.eap_identity_req = true; 10612 regular = true; 10613 } 10614 10615 if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) { 10616 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) 10617 return -EINVAL; 10618 new_triggers.four_way_handshake = true; 10619 regular = true; 10620 } 10621 10622 if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) { 10623 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) 10624 return -EINVAL; 10625 new_triggers.rfkill_release = true; 10626 regular = true; 10627 } 10628 10629 if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) { 10630 struct nlattr *pat; 10631 int n_patterns = 0; 10632 int rem, pat_len, mask_len, pkt_offset; 10633 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 10634 10635 regular = true; 10636 10637 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 10638 rem) 10639 n_patterns++; 10640 if (n_patterns > wowlan->n_patterns) 10641 return -EINVAL; 10642 10643 new_triggers.patterns = kcalloc(n_patterns, 10644 sizeof(new_triggers.patterns[0]), 10645 GFP_KERNEL); 10646 if (!new_triggers.patterns) 10647 return -ENOMEM; 10648 10649 new_triggers.n_patterns = n_patterns; 10650 i = 0; 10651 10652 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 10653 rem) { 10654 u8 *mask_pat; 10655 10656 nla_parse_nested(pat_tb, MAX_NL80211_PKTPAT, pat, 10657 nl80211_packet_pattern_policy, 10658 info->extack); 10659 err = -EINVAL; 10660 if (!pat_tb[NL80211_PKTPAT_MASK] || 10661 !pat_tb[NL80211_PKTPAT_PATTERN]) 10662 goto error; 10663 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 10664 mask_len = DIV_ROUND_UP(pat_len, 8); 10665 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 10666 goto error; 10667 if (pat_len > wowlan->pattern_max_len || 10668 pat_len < wowlan->pattern_min_len) 10669 goto error; 10670 10671 if (!pat_tb[NL80211_PKTPAT_OFFSET]) 10672 pkt_offset = 0; 10673 else 10674 pkt_offset = nla_get_u32( 10675 pat_tb[NL80211_PKTPAT_OFFSET]); 10676 if (pkt_offset > wowlan->max_pkt_offset) 10677 goto error; 10678 new_triggers.patterns[i].pkt_offset = pkt_offset; 10679 10680 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL); 10681 if (!mask_pat) { 10682 err = -ENOMEM; 10683 goto error; 10684 } 10685 new_triggers.patterns[i].mask = mask_pat; 10686 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]), 10687 mask_len); 10688 mask_pat += mask_len; 10689 new_triggers.patterns[i].pattern = mask_pat; 10690 new_triggers.patterns[i].pattern_len = pat_len; 10691 memcpy(mask_pat, 10692 nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 10693 pat_len); 10694 i++; 10695 } 10696 } 10697 10698 if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) { 10699 regular = true; 10700 err = nl80211_parse_wowlan_tcp( 10701 rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION], 10702 &new_triggers); 10703 if (err) 10704 goto error; 10705 } 10706 10707 if (tb[NL80211_WOWLAN_TRIG_NET_DETECT]) { 10708 regular = true; 10709 err = nl80211_parse_wowlan_nd( 10710 rdev, wowlan, tb[NL80211_WOWLAN_TRIG_NET_DETECT], 10711 &new_triggers); 10712 if (err) 10713 goto error; 10714 } 10715 10716 /* The 'any' trigger means the device continues operating more or less 10717 * as in its normal operation mode and wakes up the host on most of the 10718 * normal interrupts (like packet RX, ...) 10719 * It therefore makes little sense to combine with the more constrained 10720 * wakeup trigger modes. 10721 */ 10722 if (new_triggers.any && regular) { 10723 err = -EINVAL; 10724 goto error; 10725 } 10726 10727 ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL); 10728 if (!ntrig) { 10729 err = -ENOMEM; 10730 goto error; 10731 } 10732 cfg80211_rdev_free_wowlan(rdev); 10733 rdev->wiphy.wowlan_config = ntrig; 10734 10735 set_wakeup: 10736 if (rdev->ops->set_wakeup && 10737 prev_enabled != !!rdev->wiphy.wowlan_config) 10738 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); 10739 10740 return 0; 10741 error: 10742 for (i = 0; i < new_triggers.n_patterns; i++) 10743 kfree(new_triggers.patterns[i].mask); 10744 kfree(new_triggers.patterns); 10745 if (new_triggers.tcp && new_triggers.tcp->sock) 10746 sock_release(new_triggers.tcp->sock); 10747 kfree(new_triggers.tcp); 10748 kfree(new_triggers.nd_config); 10749 return err; 10750 } 10751 #endif 10752 10753 static int nl80211_send_coalesce_rules(struct sk_buff *msg, 10754 struct cfg80211_registered_device *rdev) 10755 { 10756 struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules; 10757 int i, j, pat_len; 10758 struct cfg80211_coalesce_rules *rule; 10759 10760 if (!rdev->coalesce->n_rules) 10761 return 0; 10762 10763 nl_rules = nla_nest_start(msg, NL80211_ATTR_COALESCE_RULE); 10764 if (!nl_rules) 10765 return -ENOBUFS; 10766 10767 for (i = 0; i < rdev->coalesce->n_rules; i++) { 10768 nl_rule = nla_nest_start(msg, i + 1); 10769 if (!nl_rule) 10770 return -ENOBUFS; 10771 10772 rule = &rdev->coalesce->rules[i]; 10773 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY, 10774 rule->delay)) 10775 return -ENOBUFS; 10776 10777 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION, 10778 rule->condition)) 10779 return -ENOBUFS; 10780 10781 nl_pats = nla_nest_start(msg, 10782 NL80211_ATTR_COALESCE_RULE_PKT_PATTERN); 10783 if (!nl_pats) 10784 return -ENOBUFS; 10785 10786 for (j = 0; j < rule->n_patterns; j++) { 10787 nl_pat = nla_nest_start(msg, j + 1); 10788 if (!nl_pat) 10789 return -ENOBUFS; 10790 pat_len = rule->patterns[j].pattern_len; 10791 if (nla_put(msg, NL80211_PKTPAT_MASK, 10792 DIV_ROUND_UP(pat_len, 8), 10793 rule->patterns[j].mask) || 10794 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 10795 rule->patterns[j].pattern) || 10796 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 10797 rule->patterns[j].pkt_offset)) 10798 return -ENOBUFS; 10799 nla_nest_end(msg, nl_pat); 10800 } 10801 nla_nest_end(msg, nl_pats); 10802 nla_nest_end(msg, nl_rule); 10803 } 10804 nla_nest_end(msg, nl_rules); 10805 10806 return 0; 10807 } 10808 10809 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info) 10810 { 10811 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10812 struct sk_buff *msg; 10813 void *hdr; 10814 10815 if (!rdev->wiphy.coalesce) 10816 return -EOPNOTSUPP; 10817 10818 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 10819 if (!msg) 10820 return -ENOMEM; 10821 10822 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 10823 NL80211_CMD_GET_COALESCE); 10824 if (!hdr) 10825 goto nla_put_failure; 10826 10827 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) 10828 goto nla_put_failure; 10829 10830 genlmsg_end(msg, hdr); 10831 return genlmsg_reply(msg, info); 10832 10833 nla_put_failure: 10834 nlmsg_free(msg); 10835 return -ENOBUFS; 10836 } 10837 10838 void cfg80211_rdev_free_coalesce(struct cfg80211_registered_device *rdev) 10839 { 10840 struct cfg80211_coalesce *coalesce = rdev->coalesce; 10841 int i, j; 10842 struct cfg80211_coalesce_rules *rule; 10843 10844 if (!coalesce) 10845 return; 10846 10847 for (i = 0; i < coalesce->n_rules; i++) { 10848 rule = &coalesce->rules[i]; 10849 for (j = 0; j < rule->n_patterns; j++) 10850 kfree(rule->patterns[j].mask); 10851 kfree(rule->patterns); 10852 } 10853 kfree(coalesce->rules); 10854 kfree(coalesce); 10855 rdev->coalesce = NULL; 10856 } 10857 10858 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev, 10859 struct nlattr *rule, 10860 struct cfg80211_coalesce_rules *new_rule) 10861 { 10862 int err, i; 10863 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 10864 struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat; 10865 int rem, pat_len, mask_len, pkt_offset, n_patterns = 0; 10866 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 10867 10868 err = nla_parse_nested(tb, NL80211_ATTR_COALESCE_RULE_MAX, rule, 10869 nl80211_coalesce_policy, NULL); 10870 if (err) 10871 return err; 10872 10873 if (tb[NL80211_ATTR_COALESCE_RULE_DELAY]) 10874 new_rule->delay = 10875 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]); 10876 if (new_rule->delay > coalesce->max_delay) 10877 return -EINVAL; 10878 10879 if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION]) 10880 new_rule->condition = 10881 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]); 10882 if (new_rule->condition != NL80211_COALESCE_CONDITION_MATCH && 10883 new_rule->condition != NL80211_COALESCE_CONDITION_NO_MATCH) 10884 return -EINVAL; 10885 10886 if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN]) 10887 return -EINVAL; 10888 10889 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 10890 rem) 10891 n_patterns++; 10892 if (n_patterns > coalesce->n_patterns) 10893 return -EINVAL; 10894 10895 new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]), 10896 GFP_KERNEL); 10897 if (!new_rule->patterns) 10898 return -ENOMEM; 10899 10900 new_rule->n_patterns = n_patterns; 10901 i = 0; 10902 10903 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 10904 rem) { 10905 u8 *mask_pat; 10906 10907 nla_parse_nested(pat_tb, MAX_NL80211_PKTPAT, pat, 10908 nl80211_packet_pattern_policy, NULL); 10909 if (!pat_tb[NL80211_PKTPAT_MASK] || 10910 !pat_tb[NL80211_PKTPAT_PATTERN]) 10911 return -EINVAL; 10912 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 10913 mask_len = DIV_ROUND_UP(pat_len, 8); 10914 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 10915 return -EINVAL; 10916 if (pat_len > coalesce->pattern_max_len || 10917 pat_len < coalesce->pattern_min_len) 10918 return -EINVAL; 10919 10920 if (!pat_tb[NL80211_PKTPAT_OFFSET]) 10921 pkt_offset = 0; 10922 else 10923 pkt_offset = nla_get_u32(pat_tb[NL80211_PKTPAT_OFFSET]); 10924 if (pkt_offset > coalesce->max_pkt_offset) 10925 return -EINVAL; 10926 new_rule->patterns[i].pkt_offset = pkt_offset; 10927 10928 mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL); 10929 if (!mask_pat) 10930 return -ENOMEM; 10931 10932 new_rule->patterns[i].mask = mask_pat; 10933 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]), 10934 mask_len); 10935 10936 mask_pat += mask_len; 10937 new_rule->patterns[i].pattern = mask_pat; 10938 new_rule->patterns[i].pattern_len = pat_len; 10939 memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 10940 pat_len); 10941 i++; 10942 } 10943 10944 return 0; 10945 } 10946 10947 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info) 10948 { 10949 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 10950 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 10951 struct cfg80211_coalesce new_coalesce = {}; 10952 struct cfg80211_coalesce *n_coalesce; 10953 int err, rem_rule, n_rules = 0, i, j; 10954 struct nlattr *rule; 10955 struct cfg80211_coalesce_rules *tmp_rule; 10956 10957 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) 10958 return -EOPNOTSUPP; 10959 10960 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { 10961 cfg80211_rdev_free_coalesce(rdev); 10962 rdev_set_coalesce(rdev, NULL); 10963 return 0; 10964 } 10965 10966 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 10967 rem_rule) 10968 n_rules++; 10969 if (n_rules > coalesce->n_rules) 10970 return -EINVAL; 10971 10972 new_coalesce.rules = kcalloc(n_rules, sizeof(new_coalesce.rules[0]), 10973 GFP_KERNEL); 10974 if (!new_coalesce.rules) 10975 return -ENOMEM; 10976 10977 new_coalesce.n_rules = n_rules; 10978 i = 0; 10979 10980 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 10981 rem_rule) { 10982 err = nl80211_parse_coalesce_rule(rdev, rule, 10983 &new_coalesce.rules[i]); 10984 if (err) 10985 goto error; 10986 10987 i++; 10988 } 10989 10990 err = rdev_set_coalesce(rdev, &new_coalesce); 10991 if (err) 10992 goto error; 10993 10994 n_coalesce = kmemdup(&new_coalesce, sizeof(new_coalesce), GFP_KERNEL); 10995 if (!n_coalesce) { 10996 err = -ENOMEM; 10997 goto error; 10998 } 10999 cfg80211_rdev_free_coalesce(rdev); 11000 rdev->coalesce = n_coalesce; 11001 11002 return 0; 11003 error: 11004 for (i = 0; i < new_coalesce.n_rules; i++) { 11005 tmp_rule = &new_coalesce.rules[i]; 11006 for (j = 0; j < tmp_rule->n_patterns; j++) 11007 kfree(tmp_rule->patterns[j].mask); 11008 kfree(tmp_rule->patterns); 11009 } 11010 kfree(new_coalesce.rules); 11011 11012 return err; 11013 } 11014 11015 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info) 11016 { 11017 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11018 struct net_device *dev = info->user_ptr[1]; 11019 struct wireless_dev *wdev = dev->ieee80211_ptr; 11020 struct nlattr *tb[NUM_NL80211_REKEY_DATA]; 11021 struct cfg80211_gtk_rekey_data rekey_data; 11022 int err; 11023 11024 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) 11025 return -EINVAL; 11026 11027 err = nla_parse_nested(tb, MAX_NL80211_REKEY_DATA, 11028 info->attrs[NL80211_ATTR_REKEY_DATA], 11029 nl80211_rekey_policy, info->extack); 11030 if (err) 11031 return err; 11032 11033 if (!tb[NL80211_REKEY_DATA_REPLAY_CTR] || !tb[NL80211_REKEY_DATA_KEK] || 11034 !tb[NL80211_REKEY_DATA_KCK]) 11035 return -EINVAL; 11036 if (nla_len(tb[NL80211_REKEY_DATA_REPLAY_CTR]) != NL80211_REPLAY_CTR_LEN) 11037 return -ERANGE; 11038 if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN) 11039 return -ERANGE; 11040 if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN) 11041 return -ERANGE; 11042 11043 rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]); 11044 rekey_data.kck = nla_data(tb[NL80211_REKEY_DATA_KCK]); 11045 rekey_data.replay_ctr = nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]); 11046 11047 wdev_lock(wdev); 11048 if (!wdev->current_bss) { 11049 err = -ENOTCONN; 11050 goto out; 11051 } 11052 11053 if (!rdev->ops->set_rekey_data) { 11054 err = -EOPNOTSUPP; 11055 goto out; 11056 } 11057 11058 err = rdev_set_rekey_data(rdev, dev, &rekey_data); 11059 out: 11060 wdev_unlock(wdev); 11061 return err; 11062 } 11063 11064 static int nl80211_register_unexpected_frame(struct sk_buff *skb, 11065 struct genl_info *info) 11066 { 11067 struct net_device *dev = info->user_ptr[1]; 11068 struct wireless_dev *wdev = dev->ieee80211_ptr; 11069 11070 if (wdev->iftype != NL80211_IFTYPE_AP && 11071 wdev->iftype != NL80211_IFTYPE_P2P_GO) 11072 return -EINVAL; 11073 11074 if (wdev->ap_unexpected_nlportid) 11075 return -EBUSY; 11076 11077 wdev->ap_unexpected_nlportid = info->snd_portid; 11078 return 0; 11079 } 11080 11081 static int nl80211_probe_client(struct sk_buff *skb, 11082 struct genl_info *info) 11083 { 11084 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11085 struct net_device *dev = info->user_ptr[1]; 11086 struct wireless_dev *wdev = dev->ieee80211_ptr; 11087 struct sk_buff *msg; 11088 void *hdr; 11089 const u8 *addr; 11090 u64 cookie; 11091 int err; 11092 11093 if (wdev->iftype != NL80211_IFTYPE_AP && 11094 wdev->iftype != NL80211_IFTYPE_P2P_GO) 11095 return -EOPNOTSUPP; 11096 11097 if (!info->attrs[NL80211_ATTR_MAC]) 11098 return -EINVAL; 11099 11100 if (!rdev->ops->probe_client) 11101 return -EOPNOTSUPP; 11102 11103 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 11104 if (!msg) 11105 return -ENOMEM; 11106 11107 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 11108 NL80211_CMD_PROBE_CLIENT); 11109 if (!hdr) { 11110 err = -ENOBUFS; 11111 goto free_msg; 11112 } 11113 11114 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 11115 11116 err = rdev_probe_client(rdev, dev, addr, &cookie); 11117 if (err) 11118 goto free_msg; 11119 11120 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 11121 NL80211_ATTR_PAD)) 11122 goto nla_put_failure; 11123 11124 genlmsg_end(msg, hdr); 11125 11126 return genlmsg_reply(msg, info); 11127 11128 nla_put_failure: 11129 err = -ENOBUFS; 11130 free_msg: 11131 nlmsg_free(msg); 11132 return err; 11133 } 11134 11135 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info) 11136 { 11137 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11138 struct cfg80211_beacon_registration *reg, *nreg; 11139 int rv; 11140 11141 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) 11142 return -EOPNOTSUPP; 11143 11144 nreg = kzalloc(sizeof(*nreg), GFP_KERNEL); 11145 if (!nreg) 11146 return -ENOMEM; 11147 11148 /* First, check if already registered. */ 11149 spin_lock_bh(&rdev->beacon_registrations_lock); 11150 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 11151 if (reg->nlportid == info->snd_portid) { 11152 rv = -EALREADY; 11153 goto out_err; 11154 } 11155 } 11156 /* Add it to the list */ 11157 nreg->nlportid = info->snd_portid; 11158 list_add(&nreg->list, &rdev->beacon_registrations); 11159 11160 spin_unlock_bh(&rdev->beacon_registrations_lock); 11161 11162 return 0; 11163 out_err: 11164 spin_unlock_bh(&rdev->beacon_registrations_lock); 11165 kfree(nreg); 11166 return rv; 11167 } 11168 11169 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info) 11170 { 11171 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11172 struct wireless_dev *wdev = info->user_ptr[1]; 11173 int err; 11174 11175 if (!rdev->ops->start_p2p_device) 11176 return -EOPNOTSUPP; 11177 11178 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 11179 return -EOPNOTSUPP; 11180 11181 if (wdev_running(wdev)) 11182 return 0; 11183 11184 if (rfkill_blocked(rdev->rfkill)) 11185 return -ERFKILL; 11186 11187 err = rdev_start_p2p_device(rdev, wdev); 11188 if (err) 11189 return err; 11190 11191 wdev->is_running = true; 11192 rdev->opencount++; 11193 11194 return 0; 11195 } 11196 11197 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info) 11198 { 11199 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11200 struct wireless_dev *wdev = info->user_ptr[1]; 11201 11202 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 11203 return -EOPNOTSUPP; 11204 11205 if (!rdev->ops->stop_p2p_device) 11206 return -EOPNOTSUPP; 11207 11208 cfg80211_stop_p2p_device(rdev, wdev); 11209 11210 return 0; 11211 } 11212 11213 static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info) 11214 { 11215 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11216 struct wireless_dev *wdev = info->user_ptr[1]; 11217 struct cfg80211_nan_conf conf = {}; 11218 int err; 11219 11220 if (wdev->iftype != NL80211_IFTYPE_NAN) 11221 return -EOPNOTSUPP; 11222 11223 if (wdev_running(wdev)) 11224 return -EEXIST; 11225 11226 if (rfkill_blocked(rdev->rfkill)) 11227 return -ERFKILL; 11228 11229 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) 11230 return -EINVAL; 11231 11232 conf.master_pref = 11233 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); 11234 if (!conf.master_pref) 11235 return -EINVAL; 11236 11237 if (info->attrs[NL80211_ATTR_BANDS]) { 11238 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); 11239 11240 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) 11241 return -EOPNOTSUPP; 11242 11243 if (bands && !(bands & BIT(NL80211_BAND_2GHZ))) 11244 return -EINVAL; 11245 11246 conf.bands = bands; 11247 } 11248 11249 err = rdev_start_nan(rdev, wdev, &conf); 11250 if (err) 11251 return err; 11252 11253 wdev->is_running = true; 11254 rdev->opencount++; 11255 11256 return 0; 11257 } 11258 11259 static int nl80211_stop_nan(struct sk_buff *skb, struct genl_info *info) 11260 { 11261 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11262 struct wireless_dev *wdev = info->user_ptr[1]; 11263 11264 if (wdev->iftype != NL80211_IFTYPE_NAN) 11265 return -EOPNOTSUPP; 11266 11267 cfg80211_stop_nan(rdev, wdev); 11268 11269 return 0; 11270 } 11271 11272 static int validate_nan_filter(struct nlattr *filter_attr) 11273 { 11274 struct nlattr *attr; 11275 int len = 0, n_entries = 0, rem; 11276 11277 nla_for_each_nested(attr, filter_attr, rem) { 11278 len += nla_len(attr); 11279 n_entries++; 11280 } 11281 11282 if (len >= U8_MAX) 11283 return -EINVAL; 11284 11285 return n_entries; 11286 } 11287 11288 static int handle_nan_filter(struct nlattr *attr_filter, 11289 struct cfg80211_nan_func *func, 11290 bool tx) 11291 { 11292 struct nlattr *attr; 11293 int n_entries, rem, i; 11294 struct cfg80211_nan_func_filter *filter; 11295 11296 n_entries = validate_nan_filter(attr_filter); 11297 if (n_entries < 0) 11298 return n_entries; 11299 11300 BUILD_BUG_ON(sizeof(*func->rx_filters) != sizeof(*func->tx_filters)); 11301 11302 filter = kcalloc(n_entries, sizeof(*func->rx_filters), GFP_KERNEL); 11303 if (!filter) 11304 return -ENOMEM; 11305 11306 i = 0; 11307 nla_for_each_nested(attr, attr_filter, rem) { 11308 filter[i].filter = nla_memdup(attr, GFP_KERNEL); 11309 filter[i].len = nla_len(attr); 11310 i++; 11311 } 11312 if (tx) { 11313 func->num_tx_filters = n_entries; 11314 func->tx_filters = filter; 11315 } else { 11316 func->num_rx_filters = n_entries; 11317 func->rx_filters = filter; 11318 } 11319 11320 return 0; 11321 } 11322 11323 static int nl80211_nan_add_func(struct sk_buff *skb, 11324 struct genl_info *info) 11325 { 11326 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11327 struct wireless_dev *wdev = info->user_ptr[1]; 11328 struct nlattr *tb[NUM_NL80211_NAN_FUNC_ATTR], *func_attr; 11329 struct cfg80211_nan_func *func; 11330 struct sk_buff *msg = NULL; 11331 void *hdr = NULL; 11332 int err = 0; 11333 11334 if (wdev->iftype != NL80211_IFTYPE_NAN) 11335 return -EOPNOTSUPP; 11336 11337 if (!wdev_running(wdev)) 11338 return -ENOTCONN; 11339 11340 if (!info->attrs[NL80211_ATTR_NAN_FUNC]) 11341 return -EINVAL; 11342 11343 err = nla_parse_nested(tb, NL80211_NAN_FUNC_ATTR_MAX, 11344 info->attrs[NL80211_ATTR_NAN_FUNC], 11345 nl80211_nan_func_policy, info->extack); 11346 if (err) 11347 return err; 11348 11349 func = kzalloc(sizeof(*func), GFP_KERNEL); 11350 if (!func) 11351 return -ENOMEM; 11352 11353 func->cookie = wdev->wiphy->cookie_counter++; 11354 11355 if (!tb[NL80211_NAN_FUNC_TYPE] || 11356 nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]) > NL80211_NAN_FUNC_MAX_TYPE) { 11357 err = -EINVAL; 11358 goto out; 11359 } 11360 11361 11362 func->type = nla_get_u8(tb[NL80211_NAN_FUNC_TYPE]); 11363 11364 if (!tb[NL80211_NAN_FUNC_SERVICE_ID]) { 11365 err = -EINVAL; 11366 goto out; 11367 } 11368 11369 memcpy(func->service_id, nla_data(tb[NL80211_NAN_FUNC_SERVICE_ID]), 11370 sizeof(func->service_id)); 11371 11372 func->close_range = 11373 nla_get_flag(tb[NL80211_NAN_FUNC_CLOSE_RANGE]); 11374 11375 if (tb[NL80211_NAN_FUNC_SERVICE_INFO]) { 11376 func->serv_spec_info_len = 11377 nla_len(tb[NL80211_NAN_FUNC_SERVICE_INFO]); 11378 func->serv_spec_info = 11379 kmemdup(nla_data(tb[NL80211_NAN_FUNC_SERVICE_INFO]), 11380 func->serv_spec_info_len, 11381 GFP_KERNEL); 11382 if (!func->serv_spec_info) { 11383 err = -ENOMEM; 11384 goto out; 11385 } 11386 } 11387 11388 if (tb[NL80211_NAN_FUNC_TTL]) 11389 func->ttl = nla_get_u32(tb[NL80211_NAN_FUNC_TTL]); 11390 11391 switch (func->type) { 11392 case NL80211_NAN_FUNC_PUBLISH: 11393 if (!tb[NL80211_NAN_FUNC_PUBLISH_TYPE]) { 11394 err = -EINVAL; 11395 goto out; 11396 } 11397 11398 func->publish_type = 11399 nla_get_u8(tb[NL80211_NAN_FUNC_PUBLISH_TYPE]); 11400 func->publish_bcast = 11401 nla_get_flag(tb[NL80211_NAN_FUNC_PUBLISH_BCAST]); 11402 11403 if ((!(func->publish_type & NL80211_NAN_SOLICITED_PUBLISH)) && 11404 func->publish_bcast) { 11405 err = -EINVAL; 11406 goto out; 11407 } 11408 break; 11409 case NL80211_NAN_FUNC_SUBSCRIBE: 11410 func->subscribe_active = 11411 nla_get_flag(tb[NL80211_NAN_FUNC_SUBSCRIBE_ACTIVE]); 11412 break; 11413 case NL80211_NAN_FUNC_FOLLOW_UP: 11414 if (!tb[NL80211_NAN_FUNC_FOLLOW_UP_ID] || 11415 !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] || 11416 !tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]) { 11417 err = -EINVAL; 11418 goto out; 11419 } 11420 11421 func->followup_id = 11422 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_ID]); 11423 func->followup_reqid = 11424 nla_get_u8(tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]); 11425 memcpy(func->followup_dest.addr, 11426 nla_data(tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]), 11427 sizeof(func->followup_dest.addr)); 11428 if (func->ttl) { 11429 err = -EINVAL; 11430 goto out; 11431 } 11432 break; 11433 default: 11434 err = -EINVAL; 11435 goto out; 11436 } 11437 11438 if (tb[NL80211_NAN_FUNC_SRF]) { 11439 struct nlattr *srf_tb[NUM_NL80211_NAN_SRF_ATTR]; 11440 11441 err = nla_parse_nested(srf_tb, NL80211_NAN_SRF_ATTR_MAX, 11442 tb[NL80211_NAN_FUNC_SRF], 11443 nl80211_nan_srf_policy, info->extack); 11444 if (err) 11445 goto out; 11446 11447 func->srf_include = 11448 nla_get_flag(srf_tb[NL80211_NAN_SRF_INCLUDE]); 11449 11450 if (srf_tb[NL80211_NAN_SRF_BF]) { 11451 if (srf_tb[NL80211_NAN_SRF_MAC_ADDRS] || 11452 !srf_tb[NL80211_NAN_SRF_BF_IDX]) { 11453 err = -EINVAL; 11454 goto out; 11455 } 11456 11457 func->srf_bf_len = 11458 nla_len(srf_tb[NL80211_NAN_SRF_BF]); 11459 func->srf_bf = 11460 kmemdup(nla_data(srf_tb[NL80211_NAN_SRF_BF]), 11461 func->srf_bf_len, GFP_KERNEL); 11462 if (!func->srf_bf) { 11463 err = -ENOMEM; 11464 goto out; 11465 } 11466 11467 func->srf_bf_idx = 11468 nla_get_u8(srf_tb[NL80211_NAN_SRF_BF_IDX]); 11469 } else { 11470 struct nlattr *attr, *mac_attr = 11471 srf_tb[NL80211_NAN_SRF_MAC_ADDRS]; 11472 int n_entries, rem, i = 0; 11473 11474 if (!mac_attr) { 11475 err = -EINVAL; 11476 goto out; 11477 } 11478 11479 n_entries = validate_acl_mac_addrs(mac_attr); 11480 if (n_entries <= 0) { 11481 err = -EINVAL; 11482 goto out; 11483 } 11484 11485 func->srf_num_macs = n_entries; 11486 func->srf_macs = 11487 kzalloc(sizeof(*func->srf_macs) * n_entries, 11488 GFP_KERNEL); 11489 if (!func->srf_macs) { 11490 err = -ENOMEM; 11491 goto out; 11492 } 11493 11494 nla_for_each_nested(attr, mac_attr, rem) 11495 memcpy(func->srf_macs[i++].addr, nla_data(attr), 11496 sizeof(*func->srf_macs)); 11497 } 11498 } 11499 11500 if (tb[NL80211_NAN_FUNC_TX_MATCH_FILTER]) { 11501 err = handle_nan_filter(tb[NL80211_NAN_FUNC_TX_MATCH_FILTER], 11502 func, true); 11503 if (err) 11504 goto out; 11505 } 11506 11507 if (tb[NL80211_NAN_FUNC_RX_MATCH_FILTER]) { 11508 err = handle_nan_filter(tb[NL80211_NAN_FUNC_RX_MATCH_FILTER], 11509 func, false); 11510 if (err) 11511 goto out; 11512 } 11513 11514 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 11515 if (!msg) { 11516 err = -ENOMEM; 11517 goto out; 11518 } 11519 11520 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 11521 NL80211_CMD_ADD_NAN_FUNCTION); 11522 /* This can't really happen - we just allocated 4KB */ 11523 if (WARN_ON(!hdr)) { 11524 err = -ENOMEM; 11525 goto out; 11526 } 11527 11528 err = rdev_add_nan_func(rdev, wdev, func); 11529 out: 11530 if (err < 0) { 11531 cfg80211_free_nan_func(func); 11532 nlmsg_free(msg); 11533 return err; 11534 } 11535 11536 /* propagate the instance id and cookie to userspace */ 11537 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, func->cookie, 11538 NL80211_ATTR_PAD)) 11539 goto nla_put_failure; 11540 11541 func_attr = nla_nest_start(msg, NL80211_ATTR_NAN_FUNC); 11542 if (!func_attr) 11543 goto nla_put_failure; 11544 11545 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, 11546 func->instance_id)) 11547 goto nla_put_failure; 11548 11549 nla_nest_end(msg, func_attr); 11550 11551 genlmsg_end(msg, hdr); 11552 return genlmsg_reply(msg, info); 11553 11554 nla_put_failure: 11555 nlmsg_free(msg); 11556 return -ENOBUFS; 11557 } 11558 11559 static int nl80211_nan_del_func(struct sk_buff *skb, 11560 struct genl_info *info) 11561 { 11562 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11563 struct wireless_dev *wdev = info->user_ptr[1]; 11564 u64 cookie; 11565 11566 if (wdev->iftype != NL80211_IFTYPE_NAN) 11567 return -EOPNOTSUPP; 11568 11569 if (!wdev_running(wdev)) 11570 return -ENOTCONN; 11571 11572 if (!info->attrs[NL80211_ATTR_COOKIE]) 11573 return -EINVAL; 11574 11575 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 11576 11577 rdev_del_nan_func(rdev, wdev, cookie); 11578 11579 return 0; 11580 } 11581 11582 static int nl80211_nan_change_config(struct sk_buff *skb, 11583 struct genl_info *info) 11584 { 11585 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11586 struct wireless_dev *wdev = info->user_ptr[1]; 11587 struct cfg80211_nan_conf conf = {}; 11588 u32 changed = 0; 11589 11590 if (wdev->iftype != NL80211_IFTYPE_NAN) 11591 return -EOPNOTSUPP; 11592 11593 if (!wdev_running(wdev)) 11594 return -ENOTCONN; 11595 11596 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { 11597 conf.master_pref = 11598 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]); 11599 if (conf.master_pref <= 1 || conf.master_pref == 255) 11600 return -EINVAL; 11601 11602 changed |= CFG80211_NAN_CONF_CHANGED_PREF; 11603 } 11604 11605 if (info->attrs[NL80211_ATTR_BANDS]) { 11606 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]); 11607 11608 if (bands & ~(u32)wdev->wiphy->nan_supported_bands) 11609 return -EOPNOTSUPP; 11610 11611 if (bands && !(bands & BIT(NL80211_BAND_2GHZ))) 11612 return -EINVAL; 11613 11614 conf.bands = bands; 11615 changed |= CFG80211_NAN_CONF_CHANGED_BANDS; 11616 } 11617 11618 if (!changed) 11619 return -EINVAL; 11620 11621 return rdev_nan_change_conf(rdev, wdev, &conf, changed); 11622 } 11623 11624 void cfg80211_nan_match(struct wireless_dev *wdev, 11625 struct cfg80211_nan_match_params *match, gfp_t gfp) 11626 { 11627 struct wiphy *wiphy = wdev->wiphy; 11628 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 11629 struct nlattr *match_attr, *local_func_attr, *peer_func_attr; 11630 struct sk_buff *msg; 11631 void *hdr; 11632 11633 if (WARN_ON(!match->inst_id || !match->peer_inst_id || !match->addr)) 11634 return; 11635 11636 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 11637 if (!msg) 11638 return; 11639 11640 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_MATCH); 11641 if (!hdr) { 11642 nlmsg_free(msg); 11643 return; 11644 } 11645 11646 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 11647 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 11648 wdev->netdev->ifindex)) || 11649 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 11650 NL80211_ATTR_PAD)) 11651 goto nla_put_failure; 11652 11653 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, match->cookie, 11654 NL80211_ATTR_PAD) || 11655 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, match->addr)) 11656 goto nla_put_failure; 11657 11658 match_attr = nla_nest_start(msg, NL80211_ATTR_NAN_MATCH); 11659 if (!match_attr) 11660 goto nla_put_failure; 11661 11662 local_func_attr = nla_nest_start(msg, NL80211_NAN_MATCH_FUNC_LOCAL); 11663 if (!local_func_attr) 11664 goto nla_put_failure; 11665 11666 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->inst_id)) 11667 goto nla_put_failure; 11668 11669 nla_nest_end(msg, local_func_attr); 11670 11671 peer_func_attr = nla_nest_start(msg, NL80211_NAN_MATCH_FUNC_PEER); 11672 if (!peer_func_attr) 11673 goto nla_put_failure; 11674 11675 if (nla_put_u8(msg, NL80211_NAN_FUNC_TYPE, match->type) || 11676 nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, match->peer_inst_id)) 11677 goto nla_put_failure; 11678 11679 if (match->info && match->info_len && 11680 nla_put(msg, NL80211_NAN_FUNC_SERVICE_INFO, match->info_len, 11681 match->info)) 11682 goto nla_put_failure; 11683 11684 nla_nest_end(msg, peer_func_attr); 11685 nla_nest_end(msg, match_attr); 11686 genlmsg_end(msg, hdr); 11687 11688 if (!wdev->owner_nlportid) 11689 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 11690 msg, 0, NL80211_MCGRP_NAN, gfp); 11691 else 11692 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 11693 wdev->owner_nlportid); 11694 11695 return; 11696 11697 nla_put_failure: 11698 nlmsg_free(msg); 11699 } 11700 EXPORT_SYMBOL(cfg80211_nan_match); 11701 11702 void cfg80211_nan_func_terminated(struct wireless_dev *wdev, 11703 u8 inst_id, 11704 enum nl80211_nan_func_term_reason reason, 11705 u64 cookie, gfp_t gfp) 11706 { 11707 struct wiphy *wiphy = wdev->wiphy; 11708 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 11709 struct sk_buff *msg; 11710 struct nlattr *func_attr; 11711 void *hdr; 11712 11713 if (WARN_ON(!inst_id)) 11714 return; 11715 11716 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 11717 if (!msg) 11718 return; 11719 11720 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_NAN_FUNCTION); 11721 if (!hdr) { 11722 nlmsg_free(msg); 11723 return; 11724 } 11725 11726 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 11727 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 11728 wdev->netdev->ifindex)) || 11729 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 11730 NL80211_ATTR_PAD)) 11731 goto nla_put_failure; 11732 11733 if (nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 11734 NL80211_ATTR_PAD)) 11735 goto nla_put_failure; 11736 11737 func_attr = nla_nest_start(msg, NL80211_ATTR_NAN_FUNC); 11738 if (!func_attr) 11739 goto nla_put_failure; 11740 11741 if (nla_put_u8(msg, NL80211_NAN_FUNC_INSTANCE_ID, inst_id) || 11742 nla_put_u8(msg, NL80211_NAN_FUNC_TERM_REASON, reason)) 11743 goto nla_put_failure; 11744 11745 nla_nest_end(msg, func_attr); 11746 genlmsg_end(msg, hdr); 11747 11748 if (!wdev->owner_nlportid) 11749 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), 11750 msg, 0, NL80211_MCGRP_NAN, gfp); 11751 else 11752 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 11753 wdev->owner_nlportid); 11754 11755 return; 11756 11757 nla_put_failure: 11758 nlmsg_free(msg); 11759 } 11760 EXPORT_SYMBOL(cfg80211_nan_func_terminated); 11761 11762 static int nl80211_get_protocol_features(struct sk_buff *skb, 11763 struct genl_info *info) 11764 { 11765 void *hdr; 11766 struct sk_buff *msg; 11767 11768 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 11769 if (!msg) 11770 return -ENOMEM; 11771 11772 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 11773 NL80211_CMD_GET_PROTOCOL_FEATURES); 11774 if (!hdr) 11775 goto nla_put_failure; 11776 11777 if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES, 11778 NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP)) 11779 goto nla_put_failure; 11780 11781 genlmsg_end(msg, hdr); 11782 return genlmsg_reply(msg, info); 11783 11784 nla_put_failure: 11785 kfree_skb(msg); 11786 return -ENOBUFS; 11787 } 11788 11789 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info) 11790 { 11791 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11792 struct cfg80211_update_ft_ies_params ft_params; 11793 struct net_device *dev = info->user_ptr[1]; 11794 11795 if (!rdev->ops->update_ft_ies) 11796 return -EOPNOTSUPP; 11797 11798 if (!info->attrs[NL80211_ATTR_MDID] || 11799 !is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) 11800 return -EINVAL; 11801 11802 memset(&ft_params, 0, sizeof(ft_params)); 11803 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); 11804 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 11805 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 11806 11807 return rdev_update_ft_ies(rdev, dev, &ft_params); 11808 } 11809 11810 static int nl80211_crit_protocol_start(struct sk_buff *skb, 11811 struct genl_info *info) 11812 { 11813 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11814 struct wireless_dev *wdev = info->user_ptr[1]; 11815 enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC; 11816 u16 duration; 11817 int ret; 11818 11819 if (!rdev->ops->crit_proto_start) 11820 return -EOPNOTSUPP; 11821 11822 if (WARN_ON(!rdev->ops->crit_proto_stop)) 11823 return -EINVAL; 11824 11825 if (rdev->crit_proto_nlportid) 11826 return -EBUSY; 11827 11828 /* determine protocol if provided */ 11829 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) 11830 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); 11831 11832 if (proto >= NUM_NL80211_CRIT_PROTO) 11833 return -EINVAL; 11834 11835 /* timeout must be provided */ 11836 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) 11837 return -EINVAL; 11838 11839 duration = 11840 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); 11841 11842 if (duration > NL80211_CRIT_PROTO_MAX_DURATION) 11843 return -ERANGE; 11844 11845 ret = rdev_crit_proto_start(rdev, wdev, proto, duration); 11846 if (!ret) 11847 rdev->crit_proto_nlportid = info->snd_portid; 11848 11849 return ret; 11850 } 11851 11852 static int nl80211_crit_protocol_stop(struct sk_buff *skb, 11853 struct genl_info *info) 11854 { 11855 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11856 struct wireless_dev *wdev = info->user_ptr[1]; 11857 11858 if (!rdev->ops->crit_proto_stop) 11859 return -EOPNOTSUPP; 11860 11861 if (rdev->crit_proto_nlportid) { 11862 rdev->crit_proto_nlportid = 0; 11863 rdev_crit_proto_stop(rdev, wdev); 11864 } 11865 return 0; 11866 } 11867 11868 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info) 11869 { 11870 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 11871 struct wireless_dev *wdev = 11872 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs); 11873 int i, err; 11874 u32 vid, subcmd; 11875 11876 if (!rdev->wiphy.vendor_commands) 11877 return -EOPNOTSUPP; 11878 11879 if (IS_ERR(wdev)) { 11880 err = PTR_ERR(wdev); 11881 if (err != -EINVAL) 11882 return err; 11883 wdev = NULL; 11884 } else if (wdev->wiphy != &rdev->wiphy) { 11885 return -EINVAL; 11886 } 11887 11888 if (!info->attrs[NL80211_ATTR_VENDOR_ID] || 11889 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD]) 11890 return -EINVAL; 11891 11892 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]); 11893 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]); 11894 for (i = 0; i < rdev->wiphy.n_vendor_commands; i++) { 11895 const struct wiphy_vendor_command *vcmd; 11896 void *data = NULL; 11897 int len = 0; 11898 11899 vcmd = &rdev->wiphy.vendor_commands[i]; 11900 11901 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) 11902 continue; 11903 11904 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | 11905 WIPHY_VENDOR_CMD_NEED_NETDEV)) { 11906 if (!wdev) 11907 return -EINVAL; 11908 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && 11909 !wdev->netdev) 11910 return -EINVAL; 11911 11912 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { 11913 if (!wdev_running(wdev)) 11914 return -ENETDOWN; 11915 } 11916 11917 if (!vcmd->doit) 11918 return -EOPNOTSUPP; 11919 } else { 11920 wdev = NULL; 11921 } 11922 11923 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { 11924 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); 11925 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); 11926 } 11927 11928 rdev->cur_cmd_info = info; 11929 err = rdev->wiphy.vendor_commands[i].doit(&rdev->wiphy, wdev, 11930 data, len); 11931 rdev->cur_cmd_info = NULL; 11932 return err; 11933 } 11934 11935 return -EOPNOTSUPP; 11936 } 11937 11938 static int nl80211_prepare_vendor_dump(struct sk_buff *skb, 11939 struct netlink_callback *cb, 11940 struct cfg80211_registered_device **rdev, 11941 struct wireless_dev **wdev) 11942 { 11943 struct nlattr **attrbuf = genl_family_attrbuf(&nl80211_fam); 11944 u32 vid, subcmd; 11945 unsigned int i; 11946 int vcmd_idx = -1; 11947 int err; 11948 void *data = NULL; 11949 unsigned int data_len = 0; 11950 11951 if (cb->args[0]) { 11952 /* subtract the 1 again here */ 11953 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); 11954 struct wireless_dev *tmp; 11955 11956 if (!wiphy) 11957 return -ENODEV; 11958 *rdev = wiphy_to_rdev(wiphy); 11959 *wdev = NULL; 11960 11961 if (cb->args[1]) { 11962 list_for_each_entry(tmp, &wiphy->wdev_list, list) { 11963 if (tmp->identifier == cb->args[1] - 1) { 11964 *wdev = tmp; 11965 break; 11966 } 11967 } 11968 } 11969 11970 /* keep rtnl locked in successful case */ 11971 return 0; 11972 } 11973 11974 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, attrbuf, 11975 nl80211_fam.maxattr, nl80211_policy, NULL); 11976 if (err) 11977 return err; 11978 11979 if (!attrbuf[NL80211_ATTR_VENDOR_ID] || 11980 !attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) 11981 return -EINVAL; 11982 11983 *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), attrbuf); 11984 if (IS_ERR(*wdev)) 11985 *wdev = NULL; 11986 11987 *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), attrbuf); 11988 if (IS_ERR(*rdev)) 11989 return PTR_ERR(*rdev); 11990 11991 vid = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_ID]); 11992 subcmd = nla_get_u32(attrbuf[NL80211_ATTR_VENDOR_SUBCMD]); 11993 11994 for (i = 0; i < (*rdev)->wiphy.n_vendor_commands; i++) { 11995 const struct wiphy_vendor_command *vcmd; 11996 11997 vcmd = &(*rdev)->wiphy.vendor_commands[i]; 11998 11999 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) 12000 continue; 12001 12002 if (!vcmd->dumpit) 12003 return -EOPNOTSUPP; 12004 12005 vcmd_idx = i; 12006 break; 12007 } 12008 12009 if (vcmd_idx < 0) 12010 return -EOPNOTSUPP; 12011 12012 if (attrbuf[NL80211_ATTR_VENDOR_DATA]) { 12013 data = nla_data(attrbuf[NL80211_ATTR_VENDOR_DATA]); 12014 data_len = nla_len(attrbuf[NL80211_ATTR_VENDOR_DATA]); 12015 } 12016 12017 /* 0 is the first index - add 1 to parse only once */ 12018 cb->args[0] = (*rdev)->wiphy_idx + 1; 12019 /* add 1 to know if it was NULL */ 12020 cb->args[1] = *wdev ? (*wdev)->identifier + 1 : 0; 12021 cb->args[2] = vcmd_idx; 12022 cb->args[3] = (unsigned long)data; 12023 cb->args[4] = data_len; 12024 12025 /* keep rtnl locked in successful case */ 12026 return 0; 12027 } 12028 12029 static int nl80211_vendor_cmd_dump(struct sk_buff *skb, 12030 struct netlink_callback *cb) 12031 { 12032 struct cfg80211_registered_device *rdev; 12033 struct wireless_dev *wdev; 12034 unsigned int vcmd_idx; 12035 const struct wiphy_vendor_command *vcmd; 12036 void *data; 12037 int data_len; 12038 int err; 12039 struct nlattr *vendor_data; 12040 12041 rtnl_lock(); 12042 err = nl80211_prepare_vendor_dump(skb, cb, &rdev, &wdev); 12043 if (err) 12044 goto out; 12045 12046 vcmd_idx = cb->args[2]; 12047 data = (void *)cb->args[3]; 12048 data_len = cb->args[4]; 12049 vcmd = &rdev->wiphy.vendor_commands[vcmd_idx]; 12050 12051 if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | 12052 WIPHY_VENDOR_CMD_NEED_NETDEV)) { 12053 if (!wdev) { 12054 err = -EINVAL; 12055 goto out; 12056 } 12057 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && 12058 !wdev->netdev) { 12059 err = -EINVAL; 12060 goto out; 12061 } 12062 12063 if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { 12064 if (!wdev_running(wdev)) { 12065 err = -ENETDOWN; 12066 goto out; 12067 } 12068 } 12069 } 12070 12071 while (1) { 12072 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 12073 cb->nlh->nlmsg_seq, NLM_F_MULTI, 12074 NL80211_CMD_VENDOR); 12075 if (!hdr) 12076 break; 12077 12078 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 12079 (wdev && nla_put_u64_64bit(skb, NL80211_ATTR_WDEV, 12080 wdev_id(wdev), 12081 NL80211_ATTR_PAD))) { 12082 genlmsg_cancel(skb, hdr); 12083 break; 12084 } 12085 12086 vendor_data = nla_nest_start(skb, NL80211_ATTR_VENDOR_DATA); 12087 if (!vendor_data) { 12088 genlmsg_cancel(skb, hdr); 12089 break; 12090 } 12091 12092 err = vcmd->dumpit(&rdev->wiphy, wdev, skb, data, data_len, 12093 (unsigned long *)&cb->args[5]); 12094 nla_nest_end(skb, vendor_data); 12095 12096 if (err == -ENOBUFS || err == -ENOENT) { 12097 genlmsg_cancel(skb, hdr); 12098 break; 12099 } else if (err) { 12100 genlmsg_cancel(skb, hdr); 12101 goto out; 12102 } 12103 12104 genlmsg_end(skb, hdr); 12105 } 12106 12107 err = skb->len; 12108 out: 12109 rtnl_unlock(); 12110 return err; 12111 } 12112 12113 struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy, 12114 enum nl80211_commands cmd, 12115 enum nl80211_attrs attr, 12116 int approxlen) 12117 { 12118 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 12119 12120 if (WARN_ON(!rdev->cur_cmd_info)) 12121 return NULL; 12122 12123 return __cfg80211_alloc_vendor_skb(rdev, NULL, approxlen, 12124 rdev->cur_cmd_info->snd_portid, 12125 rdev->cur_cmd_info->snd_seq, 12126 cmd, attr, NULL, GFP_KERNEL); 12127 } 12128 EXPORT_SYMBOL(__cfg80211_alloc_reply_skb); 12129 12130 int cfg80211_vendor_cmd_reply(struct sk_buff *skb) 12131 { 12132 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 12133 void *hdr = ((void **)skb->cb)[1]; 12134 struct nlattr *data = ((void **)skb->cb)[2]; 12135 12136 /* clear CB data for netlink core to own from now on */ 12137 memset(skb->cb, 0, sizeof(skb->cb)); 12138 12139 if (WARN_ON(!rdev->cur_cmd_info)) { 12140 kfree_skb(skb); 12141 return -EINVAL; 12142 } 12143 12144 nla_nest_end(skb, data); 12145 genlmsg_end(skb, hdr); 12146 return genlmsg_reply(skb, rdev->cur_cmd_info); 12147 } 12148 EXPORT_SYMBOL_GPL(cfg80211_vendor_cmd_reply); 12149 12150 static int nl80211_set_qos_map(struct sk_buff *skb, 12151 struct genl_info *info) 12152 { 12153 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12154 struct cfg80211_qos_map *qos_map = NULL; 12155 struct net_device *dev = info->user_ptr[1]; 12156 u8 *pos, len, num_des, des_len, des; 12157 int ret; 12158 12159 if (!rdev->ops->set_qos_map) 12160 return -EOPNOTSUPP; 12161 12162 if (info->attrs[NL80211_ATTR_QOS_MAP]) { 12163 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]); 12164 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]); 12165 12166 if (len % 2 || len < IEEE80211_QOS_MAP_LEN_MIN || 12167 len > IEEE80211_QOS_MAP_LEN_MAX) 12168 return -EINVAL; 12169 12170 qos_map = kzalloc(sizeof(struct cfg80211_qos_map), GFP_KERNEL); 12171 if (!qos_map) 12172 return -ENOMEM; 12173 12174 num_des = (len - IEEE80211_QOS_MAP_LEN_MIN) >> 1; 12175 if (num_des) { 12176 des_len = num_des * 12177 sizeof(struct cfg80211_dscp_exception); 12178 memcpy(qos_map->dscp_exception, pos, des_len); 12179 qos_map->num_des = num_des; 12180 for (des = 0; des < num_des; des++) { 12181 if (qos_map->dscp_exception[des].up > 7) { 12182 kfree(qos_map); 12183 return -EINVAL; 12184 } 12185 } 12186 pos += des_len; 12187 } 12188 memcpy(qos_map->up, pos, IEEE80211_QOS_MAP_LEN_MIN); 12189 } 12190 12191 wdev_lock(dev->ieee80211_ptr); 12192 ret = nl80211_key_allowed(dev->ieee80211_ptr); 12193 if (!ret) 12194 ret = rdev_set_qos_map(rdev, dev, qos_map); 12195 wdev_unlock(dev->ieee80211_ptr); 12196 12197 kfree(qos_map); 12198 return ret; 12199 } 12200 12201 static int nl80211_add_tx_ts(struct sk_buff *skb, struct genl_info *info) 12202 { 12203 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12204 struct net_device *dev = info->user_ptr[1]; 12205 struct wireless_dev *wdev = dev->ieee80211_ptr; 12206 const u8 *peer; 12207 u8 tsid, up; 12208 u16 admitted_time = 0; 12209 int err; 12210 12211 if (!(rdev->wiphy.features & NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)) 12212 return -EOPNOTSUPP; 12213 12214 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] || 12215 !info->attrs[NL80211_ATTR_USER_PRIO]) 12216 return -EINVAL; 12217 12218 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); 12219 if (tsid >= IEEE80211_NUM_TIDS) 12220 return -EINVAL; 12221 12222 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]); 12223 if (up >= IEEE80211_NUM_UPS) 12224 return -EINVAL; 12225 12226 /* WMM uses TIDs 0-7 even for TSPEC */ 12227 if (tsid >= IEEE80211_FIRST_TSPEC_TSID) { 12228 /* TODO: handle 802.11 TSPEC/admission control 12229 * need more attributes for that (e.g. BA session requirement); 12230 * change the WMM adminssion test above to allow both then 12231 */ 12232 return -EINVAL; 12233 } 12234 12235 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 12236 12237 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) { 12238 admitted_time = 12239 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]); 12240 if (!admitted_time) 12241 return -EINVAL; 12242 } 12243 12244 wdev_lock(wdev); 12245 switch (wdev->iftype) { 12246 case NL80211_IFTYPE_STATION: 12247 case NL80211_IFTYPE_P2P_CLIENT: 12248 if (wdev->current_bss) 12249 break; 12250 err = -ENOTCONN; 12251 goto out; 12252 default: 12253 err = -EOPNOTSUPP; 12254 goto out; 12255 } 12256 12257 err = rdev_add_tx_ts(rdev, dev, tsid, peer, up, admitted_time); 12258 12259 out: 12260 wdev_unlock(wdev); 12261 return err; 12262 } 12263 12264 static int nl80211_del_tx_ts(struct sk_buff *skb, struct genl_info *info) 12265 { 12266 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12267 struct net_device *dev = info->user_ptr[1]; 12268 struct wireless_dev *wdev = dev->ieee80211_ptr; 12269 const u8 *peer; 12270 u8 tsid; 12271 int err; 12272 12273 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC]) 12274 return -EINVAL; 12275 12276 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]); 12277 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 12278 12279 wdev_lock(wdev); 12280 err = rdev_del_tx_ts(rdev, dev, tsid, peer); 12281 wdev_unlock(wdev); 12282 12283 return err; 12284 } 12285 12286 static int nl80211_tdls_channel_switch(struct sk_buff *skb, 12287 struct genl_info *info) 12288 { 12289 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12290 struct net_device *dev = info->user_ptr[1]; 12291 struct wireless_dev *wdev = dev->ieee80211_ptr; 12292 struct cfg80211_chan_def chandef = {}; 12293 const u8 *addr; 12294 u8 oper_class; 12295 int err; 12296 12297 if (!rdev->ops->tdls_channel_switch || 12298 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) 12299 return -EOPNOTSUPP; 12300 12301 switch (dev->ieee80211_ptr->iftype) { 12302 case NL80211_IFTYPE_STATION: 12303 case NL80211_IFTYPE_P2P_CLIENT: 12304 break; 12305 default: 12306 return -EOPNOTSUPP; 12307 } 12308 12309 if (!info->attrs[NL80211_ATTR_MAC] || 12310 !info->attrs[NL80211_ATTR_OPER_CLASS]) 12311 return -EINVAL; 12312 12313 err = nl80211_parse_chandef(rdev, info, &chandef); 12314 if (err) 12315 return err; 12316 12317 /* 12318 * Don't allow wide channels on the 2.4Ghz band, as per IEEE802.11-2012 12319 * section 10.22.6.2.1. Disallow 5/10Mhz channels as well for now, the 12320 * specification is not defined for them. 12321 */ 12322 if (chandef.chan->band == NL80211_BAND_2GHZ && 12323 chandef.width != NL80211_CHAN_WIDTH_20_NOHT && 12324 chandef.width != NL80211_CHAN_WIDTH_20) 12325 return -EINVAL; 12326 12327 /* we will be active on the TDLS link */ 12328 if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &chandef, 12329 wdev->iftype)) 12330 return -EINVAL; 12331 12332 /* don't allow switching to DFS channels */ 12333 if (cfg80211_chandef_dfs_required(wdev->wiphy, &chandef, wdev->iftype)) 12334 return -EINVAL; 12335 12336 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 12337 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]); 12338 12339 wdev_lock(wdev); 12340 err = rdev_tdls_channel_switch(rdev, dev, addr, oper_class, &chandef); 12341 wdev_unlock(wdev); 12342 12343 return err; 12344 } 12345 12346 static int nl80211_tdls_cancel_channel_switch(struct sk_buff *skb, 12347 struct genl_info *info) 12348 { 12349 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12350 struct net_device *dev = info->user_ptr[1]; 12351 struct wireless_dev *wdev = dev->ieee80211_ptr; 12352 const u8 *addr; 12353 12354 if (!rdev->ops->tdls_channel_switch || 12355 !rdev->ops->tdls_cancel_channel_switch || 12356 !(rdev->wiphy.features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH)) 12357 return -EOPNOTSUPP; 12358 12359 switch (dev->ieee80211_ptr->iftype) { 12360 case NL80211_IFTYPE_STATION: 12361 case NL80211_IFTYPE_P2P_CLIENT: 12362 break; 12363 default: 12364 return -EOPNOTSUPP; 12365 } 12366 12367 if (!info->attrs[NL80211_ATTR_MAC]) 12368 return -EINVAL; 12369 12370 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 12371 12372 wdev_lock(wdev); 12373 rdev_tdls_cancel_channel_switch(rdev, dev, addr); 12374 wdev_unlock(wdev); 12375 12376 return 0; 12377 } 12378 12379 static int nl80211_set_multicast_to_unicast(struct sk_buff *skb, 12380 struct genl_info *info) 12381 { 12382 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12383 struct net_device *dev = info->user_ptr[1]; 12384 struct wireless_dev *wdev = dev->ieee80211_ptr; 12385 const struct nlattr *nla; 12386 bool enabled; 12387 12388 if (!rdev->ops->set_multicast_to_unicast) 12389 return -EOPNOTSUPP; 12390 12391 if (wdev->iftype != NL80211_IFTYPE_AP && 12392 wdev->iftype != NL80211_IFTYPE_P2P_GO) 12393 return -EOPNOTSUPP; 12394 12395 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED]; 12396 enabled = nla_get_flag(nla); 12397 12398 return rdev_set_multicast_to_unicast(rdev, dev, enabled); 12399 } 12400 12401 static int nl80211_set_pmk(struct sk_buff *skb, struct genl_info *info) 12402 { 12403 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12404 struct net_device *dev = info->user_ptr[1]; 12405 struct wireless_dev *wdev = dev->ieee80211_ptr; 12406 struct cfg80211_pmk_conf pmk_conf = {}; 12407 int ret; 12408 12409 if (wdev->iftype != NL80211_IFTYPE_STATION && 12410 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 12411 return -EOPNOTSUPP; 12412 12413 if (!wiphy_ext_feature_isset(&rdev->wiphy, 12414 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 12415 return -EOPNOTSUPP; 12416 12417 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK]) 12418 return -EINVAL; 12419 12420 wdev_lock(wdev); 12421 if (!wdev->current_bss) { 12422 ret = -ENOTCONN; 12423 goto out; 12424 } 12425 12426 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]); 12427 if (memcmp(pmk_conf.aa, wdev->current_bss->pub.bssid, ETH_ALEN)) { 12428 ret = -EINVAL; 12429 goto out; 12430 } 12431 12432 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]); 12433 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]); 12434 if (pmk_conf.pmk_len != WLAN_PMK_LEN && 12435 pmk_conf.pmk_len != WLAN_PMK_LEN_SUITE_B_192) { 12436 ret = -EINVAL; 12437 goto out; 12438 } 12439 12440 if (info->attrs[NL80211_ATTR_PMKR0_NAME]) { 12441 int r0_name_len = nla_len(info->attrs[NL80211_ATTR_PMKR0_NAME]); 12442 12443 if (r0_name_len != WLAN_PMK_NAME_LEN) { 12444 ret = -EINVAL; 12445 goto out; 12446 } 12447 12448 pmk_conf.pmk_r0_name = 12449 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]); 12450 } 12451 12452 ret = rdev_set_pmk(rdev, dev, &pmk_conf); 12453 out: 12454 wdev_unlock(wdev); 12455 return ret; 12456 } 12457 12458 static int nl80211_del_pmk(struct sk_buff *skb, struct genl_info *info) 12459 { 12460 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12461 struct net_device *dev = info->user_ptr[1]; 12462 struct wireless_dev *wdev = dev->ieee80211_ptr; 12463 const u8 *aa; 12464 int ret; 12465 12466 if (wdev->iftype != NL80211_IFTYPE_STATION && 12467 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 12468 return -EOPNOTSUPP; 12469 12470 if (!wiphy_ext_feature_isset(&rdev->wiphy, 12471 NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X)) 12472 return -EOPNOTSUPP; 12473 12474 if (!info->attrs[NL80211_ATTR_MAC]) 12475 return -EINVAL; 12476 12477 wdev_lock(wdev); 12478 aa = nla_data(info->attrs[NL80211_ATTR_MAC]); 12479 ret = rdev_del_pmk(rdev, dev, aa); 12480 wdev_unlock(wdev); 12481 12482 return ret; 12483 } 12484 12485 static int nl80211_external_auth(struct sk_buff *skb, struct genl_info *info) 12486 { 12487 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 12488 struct net_device *dev = info->user_ptr[1]; 12489 struct cfg80211_external_auth_params params; 12490 12491 if (!rdev->ops->external_auth) 12492 return -EOPNOTSUPP; 12493 12494 if (!info->attrs[NL80211_ATTR_SSID]) 12495 return -EINVAL; 12496 12497 if (!info->attrs[NL80211_ATTR_BSSID]) 12498 return -EINVAL; 12499 12500 if (!info->attrs[NL80211_ATTR_STATUS_CODE]) 12501 return -EINVAL; 12502 12503 memset(¶ms, 0, sizeof(params)); 12504 12505 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 12506 if (params.ssid.ssid_len == 0 || 12507 params.ssid.ssid_len > IEEE80211_MAX_SSID_LEN) 12508 return -EINVAL; 12509 memcpy(params.ssid.ssid, nla_data(info->attrs[NL80211_ATTR_SSID]), 12510 params.ssid.ssid_len); 12511 12512 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]), 12513 ETH_ALEN); 12514 12515 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 12516 12517 return rdev_external_auth(rdev, dev, ¶ms); 12518 } 12519 12520 #define NL80211_FLAG_NEED_WIPHY 0x01 12521 #define NL80211_FLAG_NEED_NETDEV 0x02 12522 #define NL80211_FLAG_NEED_RTNL 0x04 12523 #define NL80211_FLAG_CHECK_NETDEV_UP 0x08 12524 #define NL80211_FLAG_NEED_NETDEV_UP (NL80211_FLAG_NEED_NETDEV |\ 12525 NL80211_FLAG_CHECK_NETDEV_UP) 12526 #define NL80211_FLAG_NEED_WDEV 0x10 12527 /* If a netdev is associated, it must be UP, P2P must be started */ 12528 #define NL80211_FLAG_NEED_WDEV_UP (NL80211_FLAG_NEED_WDEV |\ 12529 NL80211_FLAG_CHECK_NETDEV_UP) 12530 #define NL80211_FLAG_CLEAR_SKB 0x20 12531 12532 static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, 12533 struct genl_info *info) 12534 { 12535 struct cfg80211_registered_device *rdev; 12536 struct wireless_dev *wdev; 12537 struct net_device *dev; 12538 bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL; 12539 12540 if (rtnl) 12541 rtnl_lock(); 12542 12543 if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) { 12544 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 12545 if (IS_ERR(rdev)) { 12546 if (rtnl) 12547 rtnl_unlock(); 12548 return PTR_ERR(rdev); 12549 } 12550 info->user_ptr[0] = rdev; 12551 } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV || 12552 ops->internal_flags & NL80211_FLAG_NEED_WDEV) { 12553 ASSERT_RTNL(); 12554 12555 wdev = __cfg80211_wdev_from_attrs(genl_info_net(info), 12556 info->attrs); 12557 if (IS_ERR(wdev)) { 12558 if (rtnl) 12559 rtnl_unlock(); 12560 return PTR_ERR(wdev); 12561 } 12562 12563 dev = wdev->netdev; 12564 rdev = wiphy_to_rdev(wdev->wiphy); 12565 12566 if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) { 12567 if (!dev) { 12568 if (rtnl) 12569 rtnl_unlock(); 12570 return -EINVAL; 12571 } 12572 12573 info->user_ptr[1] = dev; 12574 } else { 12575 info->user_ptr[1] = wdev; 12576 } 12577 12578 if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && 12579 !wdev_running(wdev)) { 12580 if (rtnl) 12581 rtnl_unlock(); 12582 return -ENETDOWN; 12583 } 12584 12585 if (dev) 12586 dev_hold(dev); 12587 12588 info->user_ptr[0] = rdev; 12589 } 12590 12591 return 0; 12592 } 12593 12594 static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb, 12595 struct genl_info *info) 12596 { 12597 if (info->user_ptr[1]) { 12598 if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) { 12599 struct wireless_dev *wdev = info->user_ptr[1]; 12600 12601 if (wdev->netdev) 12602 dev_put(wdev->netdev); 12603 } else { 12604 dev_put(info->user_ptr[1]); 12605 } 12606 } 12607 12608 if (ops->internal_flags & NL80211_FLAG_NEED_RTNL) 12609 rtnl_unlock(); 12610 12611 /* If needed, clear the netlink message payload from the SKB 12612 * as it might contain key data that shouldn't stick around on 12613 * the heap after the SKB is freed. The netlink message header 12614 * is still needed for further processing, so leave it intact. 12615 */ 12616 if (ops->internal_flags & NL80211_FLAG_CLEAR_SKB) { 12617 struct nlmsghdr *nlh = nlmsg_hdr(skb); 12618 12619 memset(nlmsg_data(nlh), 0, nlmsg_len(nlh)); 12620 } 12621 } 12622 12623 static const struct genl_ops nl80211_ops[] = { 12624 { 12625 .cmd = NL80211_CMD_GET_WIPHY, 12626 .doit = nl80211_get_wiphy, 12627 .dumpit = nl80211_dump_wiphy, 12628 .done = nl80211_dump_wiphy_done, 12629 .policy = nl80211_policy, 12630 /* can be retrieved by unprivileged users */ 12631 .internal_flags = NL80211_FLAG_NEED_WIPHY | 12632 NL80211_FLAG_NEED_RTNL, 12633 }, 12634 { 12635 .cmd = NL80211_CMD_SET_WIPHY, 12636 .doit = nl80211_set_wiphy, 12637 .policy = nl80211_policy, 12638 .flags = GENL_UNS_ADMIN_PERM, 12639 .internal_flags = NL80211_FLAG_NEED_RTNL, 12640 }, 12641 { 12642 .cmd = NL80211_CMD_GET_INTERFACE, 12643 .doit = nl80211_get_interface, 12644 .dumpit = nl80211_dump_interface, 12645 .policy = nl80211_policy, 12646 /* can be retrieved by unprivileged users */ 12647 .internal_flags = NL80211_FLAG_NEED_WDEV | 12648 NL80211_FLAG_NEED_RTNL, 12649 }, 12650 { 12651 .cmd = NL80211_CMD_SET_INTERFACE, 12652 .doit = nl80211_set_interface, 12653 .policy = nl80211_policy, 12654 .flags = GENL_UNS_ADMIN_PERM, 12655 .internal_flags = NL80211_FLAG_NEED_NETDEV | 12656 NL80211_FLAG_NEED_RTNL, 12657 }, 12658 { 12659 .cmd = NL80211_CMD_NEW_INTERFACE, 12660 .doit = nl80211_new_interface, 12661 .policy = nl80211_policy, 12662 .flags = GENL_UNS_ADMIN_PERM, 12663 .internal_flags = NL80211_FLAG_NEED_WIPHY | 12664 NL80211_FLAG_NEED_RTNL, 12665 }, 12666 { 12667 .cmd = NL80211_CMD_DEL_INTERFACE, 12668 .doit = nl80211_del_interface, 12669 .policy = nl80211_policy, 12670 .flags = GENL_UNS_ADMIN_PERM, 12671 .internal_flags = NL80211_FLAG_NEED_WDEV | 12672 NL80211_FLAG_NEED_RTNL, 12673 }, 12674 { 12675 .cmd = NL80211_CMD_GET_KEY, 12676 .doit = nl80211_get_key, 12677 .policy = nl80211_policy, 12678 .flags = GENL_UNS_ADMIN_PERM, 12679 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12680 NL80211_FLAG_NEED_RTNL, 12681 }, 12682 { 12683 .cmd = NL80211_CMD_SET_KEY, 12684 .doit = nl80211_set_key, 12685 .policy = nl80211_policy, 12686 .flags = GENL_UNS_ADMIN_PERM, 12687 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12688 NL80211_FLAG_NEED_RTNL | 12689 NL80211_FLAG_CLEAR_SKB, 12690 }, 12691 { 12692 .cmd = NL80211_CMD_NEW_KEY, 12693 .doit = nl80211_new_key, 12694 .policy = nl80211_policy, 12695 .flags = GENL_UNS_ADMIN_PERM, 12696 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12697 NL80211_FLAG_NEED_RTNL | 12698 NL80211_FLAG_CLEAR_SKB, 12699 }, 12700 { 12701 .cmd = NL80211_CMD_DEL_KEY, 12702 .doit = nl80211_del_key, 12703 .policy = nl80211_policy, 12704 .flags = GENL_UNS_ADMIN_PERM, 12705 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12706 NL80211_FLAG_NEED_RTNL, 12707 }, 12708 { 12709 .cmd = NL80211_CMD_SET_BEACON, 12710 .policy = nl80211_policy, 12711 .flags = GENL_UNS_ADMIN_PERM, 12712 .doit = nl80211_set_beacon, 12713 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12714 NL80211_FLAG_NEED_RTNL, 12715 }, 12716 { 12717 .cmd = NL80211_CMD_START_AP, 12718 .policy = nl80211_policy, 12719 .flags = GENL_UNS_ADMIN_PERM, 12720 .doit = nl80211_start_ap, 12721 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12722 NL80211_FLAG_NEED_RTNL, 12723 }, 12724 { 12725 .cmd = NL80211_CMD_STOP_AP, 12726 .policy = nl80211_policy, 12727 .flags = GENL_UNS_ADMIN_PERM, 12728 .doit = nl80211_stop_ap, 12729 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12730 NL80211_FLAG_NEED_RTNL, 12731 }, 12732 { 12733 .cmd = NL80211_CMD_GET_STATION, 12734 .doit = nl80211_get_station, 12735 .dumpit = nl80211_dump_station, 12736 .policy = nl80211_policy, 12737 .internal_flags = NL80211_FLAG_NEED_NETDEV | 12738 NL80211_FLAG_NEED_RTNL, 12739 }, 12740 { 12741 .cmd = NL80211_CMD_SET_STATION, 12742 .doit = nl80211_set_station, 12743 .policy = nl80211_policy, 12744 .flags = GENL_UNS_ADMIN_PERM, 12745 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12746 NL80211_FLAG_NEED_RTNL, 12747 }, 12748 { 12749 .cmd = NL80211_CMD_NEW_STATION, 12750 .doit = nl80211_new_station, 12751 .policy = nl80211_policy, 12752 .flags = GENL_UNS_ADMIN_PERM, 12753 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12754 NL80211_FLAG_NEED_RTNL, 12755 }, 12756 { 12757 .cmd = NL80211_CMD_DEL_STATION, 12758 .doit = nl80211_del_station, 12759 .policy = nl80211_policy, 12760 .flags = GENL_UNS_ADMIN_PERM, 12761 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12762 NL80211_FLAG_NEED_RTNL, 12763 }, 12764 { 12765 .cmd = NL80211_CMD_GET_MPATH, 12766 .doit = nl80211_get_mpath, 12767 .dumpit = nl80211_dump_mpath, 12768 .policy = nl80211_policy, 12769 .flags = GENL_UNS_ADMIN_PERM, 12770 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12771 NL80211_FLAG_NEED_RTNL, 12772 }, 12773 { 12774 .cmd = NL80211_CMD_GET_MPP, 12775 .doit = nl80211_get_mpp, 12776 .dumpit = nl80211_dump_mpp, 12777 .policy = nl80211_policy, 12778 .flags = GENL_UNS_ADMIN_PERM, 12779 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12780 NL80211_FLAG_NEED_RTNL, 12781 }, 12782 { 12783 .cmd = NL80211_CMD_SET_MPATH, 12784 .doit = nl80211_set_mpath, 12785 .policy = nl80211_policy, 12786 .flags = GENL_UNS_ADMIN_PERM, 12787 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12788 NL80211_FLAG_NEED_RTNL, 12789 }, 12790 { 12791 .cmd = NL80211_CMD_NEW_MPATH, 12792 .doit = nl80211_new_mpath, 12793 .policy = nl80211_policy, 12794 .flags = GENL_UNS_ADMIN_PERM, 12795 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12796 NL80211_FLAG_NEED_RTNL, 12797 }, 12798 { 12799 .cmd = NL80211_CMD_DEL_MPATH, 12800 .doit = nl80211_del_mpath, 12801 .policy = nl80211_policy, 12802 .flags = GENL_UNS_ADMIN_PERM, 12803 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12804 NL80211_FLAG_NEED_RTNL, 12805 }, 12806 { 12807 .cmd = NL80211_CMD_SET_BSS, 12808 .doit = nl80211_set_bss, 12809 .policy = nl80211_policy, 12810 .flags = GENL_UNS_ADMIN_PERM, 12811 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12812 NL80211_FLAG_NEED_RTNL, 12813 }, 12814 { 12815 .cmd = NL80211_CMD_GET_REG, 12816 .doit = nl80211_get_reg_do, 12817 .dumpit = nl80211_get_reg_dump, 12818 .policy = nl80211_policy, 12819 .internal_flags = NL80211_FLAG_NEED_RTNL, 12820 /* can be retrieved by unprivileged users */ 12821 }, 12822 #ifdef CONFIG_CFG80211_CRDA_SUPPORT 12823 { 12824 .cmd = NL80211_CMD_SET_REG, 12825 .doit = nl80211_set_reg, 12826 .policy = nl80211_policy, 12827 .flags = GENL_ADMIN_PERM, 12828 .internal_flags = NL80211_FLAG_NEED_RTNL, 12829 }, 12830 #endif 12831 { 12832 .cmd = NL80211_CMD_REQ_SET_REG, 12833 .doit = nl80211_req_set_reg, 12834 .policy = nl80211_policy, 12835 .flags = GENL_ADMIN_PERM, 12836 }, 12837 { 12838 .cmd = NL80211_CMD_RELOAD_REGDB, 12839 .doit = nl80211_reload_regdb, 12840 .policy = nl80211_policy, 12841 .flags = GENL_ADMIN_PERM, 12842 }, 12843 { 12844 .cmd = NL80211_CMD_GET_MESH_CONFIG, 12845 .doit = nl80211_get_mesh_config, 12846 .policy = nl80211_policy, 12847 /* can be retrieved by unprivileged users */ 12848 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12849 NL80211_FLAG_NEED_RTNL, 12850 }, 12851 { 12852 .cmd = NL80211_CMD_SET_MESH_CONFIG, 12853 .doit = nl80211_update_mesh_config, 12854 .policy = nl80211_policy, 12855 .flags = GENL_UNS_ADMIN_PERM, 12856 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12857 NL80211_FLAG_NEED_RTNL, 12858 }, 12859 { 12860 .cmd = NL80211_CMD_TRIGGER_SCAN, 12861 .doit = nl80211_trigger_scan, 12862 .policy = nl80211_policy, 12863 .flags = GENL_UNS_ADMIN_PERM, 12864 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 12865 NL80211_FLAG_NEED_RTNL, 12866 }, 12867 { 12868 .cmd = NL80211_CMD_ABORT_SCAN, 12869 .doit = nl80211_abort_scan, 12870 .policy = nl80211_policy, 12871 .flags = GENL_UNS_ADMIN_PERM, 12872 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 12873 NL80211_FLAG_NEED_RTNL, 12874 }, 12875 { 12876 .cmd = NL80211_CMD_GET_SCAN, 12877 .policy = nl80211_policy, 12878 .dumpit = nl80211_dump_scan, 12879 }, 12880 { 12881 .cmd = NL80211_CMD_START_SCHED_SCAN, 12882 .doit = nl80211_start_sched_scan, 12883 .policy = nl80211_policy, 12884 .flags = GENL_UNS_ADMIN_PERM, 12885 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12886 NL80211_FLAG_NEED_RTNL, 12887 }, 12888 { 12889 .cmd = NL80211_CMD_STOP_SCHED_SCAN, 12890 .doit = nl80211_stop_sched_scan, 12891 .policy = nl80211_policy, 12892 .flags = GENL_UNS_ADMIN_PERM, 12893 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12894 NL80211_FLAG_NEED_RTNL, 12895 }, 12896 { 12897 .cmd = NL80211_CMD_AUTHENTICATE, 12898 .doit = nl80211_authenticate, 12899 .policy = nl80211_policy, 12900 .flags = GENL_UNS_ADMIN_PERM, 12901 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12902 NL80211_FLAG_NEED_RTNL | 12903 NL80211_FLAG_CLEAR_SKB, 12904 }, 12905 { 12906 .cmd = NL80211_CMD_ASSOCIATE, 12907 .doit = nl80211_associate, 12908 .policy = nl80211_policy, 12909 .flags = GENL_UNS_ADMIN_PERM, 12910 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12911 NL80211_FLAG_NEED_RTNL, 12912 }, 12913 { 12914 .cmd = NL80211_CMD_DEAUTHENTICATE, 12915 .doit = nl80211_deauthenticate, 12916 .policy = nl80211_policy, 12917 .flags = GENL_UNS_ADMIN_PERM, 12918 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12919 NL80211_FLAG_NEED_RTNL, 12920 }, 12921 { 12922 .cmd = NL80211_CMD_DISASSOCIATE, 12923 .doit = nl80211_disassociate, 12924 .policy = nl80211_policy, 12925 .flags = GENL_UNS_ADMIN_PERM, 12926 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12927 NL80211_FLAG_NEED_RTNL, 12928 }, 12929 { 12930 .cmd = NL80211_CMD_JOIN_IBSS, 12931 .doit = nl80211_join_ibss, 12932 .policy = nl80211_policy, 12933 .flags = GENL_UNS_ADMIN_PERM, 12934 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12935 NL80211_FLAG_NEED_RTNL, 12936 }, 12937 { 12938 .cmd = NL80211_CMD_LEAVE_IBSS, 12939 .doit = nl80211_leave_ibss, 12940 .policy = nl80211_policy, 12941 .flags = GENL_UNS_ADMIN_PERM, 12942 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12943 NL80211_FLAG_NEED_RTNL, 12944 }, 12945 #ifdef CONFIG_NL80211_TESTMODE 12946 { 12947 .cmd = NL80211_CMD_TESTMODE, 12948 .doit = nl80211_testmode_do, 12949 .dumpit = nl80211_testmode_dump, 12950 .policy = nl80211_policy, 12951 .flags = GENL_UNS_ADMIN_PERM, 12952 .internal_flags = NL80211_FLAG_NEED_WIPHY | 12953 NL80211_FLAG_NEED_RTNL, 12954 }, 12955 #endif 12956 { 12957 .cmd = NL80211_CMD_CONNECT, 12958 .doit = nl80211_connect, 12959 .policy = nl80211_policy, 12960 .flags = GENL_UNS_ADMIN_PERM, 12961 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12962 NL80211_FLAG_NEED_RTNL, 12963 }, 12964 { 12965 .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS, 12966 .doit = nl80211_update_connect_params, 12967 .policy = nl80211_policy, 12968 .flags = GENL_ADMIN_PERM, 12969 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12970 NL80211_FLAG_NEED_RTNL, 12971 }, 12972 { 12973 .cmd = NL80211_CMD_DISCONNECT, 12974 .doit = nl80211_disconnect, 12975 .policy = nl80211_policy, 12976 .flags = GENL_UNS_ADMIN_PERM, 12977 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12978 NL80211_FLAG_NEED_RTNL, 12979 }, 12980 { 12981 .cmd = NL80211_CMD_SET_WIPHY_NETNS, 12982 .doit = nl80211_wiphy_netns, 12983 .policy = nl80211_policy, 12984 .flags = GENL_UNS_ADMIN_PERM, 12985 .internal_flags = NL80211_FLAG_NEED_WIPHY | 12986 NL80211_FLAG_NEED_RTNL, 12987 }, 12988 { 12989 .cmd = NL80211_CMD_GET_SURVEY, 12990 .policy = nl80211_policy, 12991 .dumpit = nl80211_dump_survey, 12992 }, 12993 { 12994 .cmd = NL80211_CMD_SET_PMKSA, 12995 .doit = nl80211_setdel_pmksa, 12996 .policy = nl80211_policy, 12997 .flags = GENL_UNS_ADMIN_PERM, 12998 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 12999 NL80211_FLAG_NEED_RTNL, 13000 }, 13001 { 13002 .cmd = NL80211_CMD_DEL_PMKSA, 13003 .doit = nl80211_setdel_pmksa, 13004 .policy = nl80211_policy, 13005 .flags = GENL_UNS_ADMIN_PERM, 13006 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13007 NL80211_FLAG_NEED_RTNL, 13008 }, 13009 { 13010 .cmd = NL80211_CMD_FLUSH_PMKSA, 13011 .doit = nl80211_flush_pmksa, 13012 .policy = nl80211_policy, 13013 .flags = GENL_UNS_ADMIN_PERM, 13014 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13015 NL80211_FLAG_NEED_RTNL, 13016 }, 13017 { 13018 .cmd = NL80211_CMD_REMAIN_ON_CHANNEL, 13019 .doit = nl80211_remain_on_channel, 13020 .policy = nl80211_policy, 13021 .flags = GENL_UNS_ADMIN_PERM, 13022 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 13023 NL80211_FLAG_NEED_RTNL, 13024 }, 13025 { 13026 .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 13027 .doit = nl80211_cancel_remain_on_channel, 13028 .policy = nl80211_policy, 13029 .flags = GENL_UNS_ADMIN_PERM, 13030 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 13031 NL80211_FLAG_NEED_RTNL, 13032 }, 13033 { 13034 .cmd = NL80211_CMD_SET_TX_BITRATE_MASK, 13035 .doit = nl80211_set_tx_bitrate_mask, 13036 .policy = nl80211_policy, 13037 .flags = GENL_UNS_ADMIN_PERM, 13038 .internal_flags = NL80211_FLAG_NEED_NETDEV | 13039 NL80211_FLAG_NEED_RTNL, 13040 }, 13041 { 13042 .cmd = NL80211_CMD_REGISTER_FRAME, 13043 .doit = nl80211_register_mgmt, 13044 .policy = nl80211_policy, 13045 .flags = GENL_UNS_ADMIN_PERM, 13046 .internal_flags = NL80211_FLAG_NEED_WDEV | 13047 NL80211_FLAG_NEED_RTNL, 13048 }, 13049 { 13050 .cmd = NL80211_CMD_FRAME, 13051 .doit = nl80211_tx_mgmt, 13052 .policy = nl80211_policy, 13053 .flags = GENL_UNS_ADMIN_PERM, 13054 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 13055 NL80211_FLAG_NEED_RTNL, 13056 }, 13057 { 13058 .cmd = NL80211_CMD_FRAME_WAIT_CANCEL, 13059 .doit = nl80211_tx_mgmt_cancel_wait, 13060 .policy = nl80211_policy, 13061 .flags = GENL_UNS_ADMIN_PERM, 13062 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 13063 NL80211_FLAG_NEED_RTNL, 13064 }, 13065 { 13066 .cmd = NL80211_CMD_SET_POWER_SAVE, 13067 .doit = nl80211_set_power_save, 13068 .policy = nl80211_policy, 13069 .flags = GENL_UNS_ADMIN_PERM, 13070 .internal_flags = NL80211_FLAG_NEED_NETDEV | 13071 NL80211_FLAG_NEED_RTNL, 13072 }, 13073 { 13074 .cmd = NL80211_CMD_GET_POWER_SAVE, 13075 .doit = nl80211_get_power_save, 13076 .policy = nl80211_policy, 13077 /* can be retrieved by unprivileged users */ 13078 .internal_flags = NL80211_FLAG_NEED_NETDEV | 13079 NL80211_FLAG_NEED_RTNL, 13080 }, 13081 { 13082 .cmd = NL80211_CMD_SET_CQM, 13083 .doit = nl80211_set_cqm, 13084 .policy = nl80211_policy, 13085 .flags = GENL_UNS_ADMIN_PERM, 13086 .internal_flags = NL80211_FLAG_NEED_NETDEV | 13087 NL80211_FLAG_NEED_RTNL, 13088 }, 13089 { 13090 .cmd = NL80211_CMD_SET_CHANNEL, 13091 .doit = nl80211_set_channel, 13092 .policy = nl80211_policy, 13093 .flags = GENL_UNS_ADMIN_PERM, 13094 .internal_flags = NL80211_FLAG_NEED_NETDEV | 13095 NL80211_FLAG_NEED_RTNL, 13096 }, 13097 { 13098 .cmd = NL80211_CMD_SET_WDS_PEER, 13099 .doit = nl80211_set_wds_peer, 13100 .policy = nl80211_policy, 13101 .flags = GENL_UNS_ADMIN_PERM, 13102 .internal_flags = NL80211_FLAG_NEED_NETDEV | 13103 NL80211_FLAG_NEED_RTNL, 13104 }, 13105 { 13106 .cmd = NL80211_CMD_JOIN_MESH, 13107 .doit = nl80211_join_mesh, 13108 .policy = nl80211_policy, 13109 .flags = GENL_UNS_ADMIN_PERM, 13110 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13111 NL80211_FLAG_NEED_RTNL, 13112 }, 13113 { 13114 .cmd = NL80211_CMD_LEAVE_MESH, 13115 .doit = nl80211_leave_mesh, 13116 .policy = nl80211_policy, 13117 .flags = GENL_UNS_ADMIN_PERM, 13118 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13119 NL80211_FLAG_NEED_RTNL, 13120 }, 13121 { 13122 .cmd = NL80211_CMD_JOIN_OCB, 13123 .doit = nl80211_join_ocb, 13124 .policy = nl80211_policy, 13125 .flags = GENL_UNS_ADMIN_PERM, 13126 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13127 NL80211_FLAG_NEED_RTNL, 13128 }, 13129 { 13130 .cmd = NL80211_CMD_LEAVE_OCB, 13131 .doit = nl80211_leave_ocb, 13132 .policy = nl80211_policy, 13133 .flags = GENL_UNS_ADMIN_PERM, 13134 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13135 NL80211_FLAG_NEED_RTNL, 13136 }, 13137 #ifdef CONFIG_PM 13138 { 13139 .cmd = NL80211_CMD_GET_WOWLAN, 13140 .doit = nl80211_get_wowlan, 13141 .policy = nl80211_policy, 13142 /* can be retrieved by unprivileged users */ 13143 .internal_flags = NL80211_FLAG_NEED_WIPHY | 13144 NL80211_FLAG_NEED_RTNL, 13145 }, 13146 { 13147 .cmd = NL80211_CMD_SET_WOWLAN, 13148 .doit = nl80211_set_wowlan, 13149 .policy = nl80211_policy, 13150 .flags = GENL_UNS_ADMIN_PERM, 13151 .internal_flags = NL80211_FLAG_NEED_WIPHY | 13152 NL80211_FLAG_NEED_RTNL, 13153 }, 13154 #endif 13155 { 13156 .cmd = NL80211_CMD_SET_REKEY_OFFLOAD, 13157 .doit = nl80211_set_rekey_data, 13158 .policy = nl80211_policy, 13159 .flags = GENL_UNS_ADMIN_PERM, 13160 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13161 NL80211_FLAG_NEED_RTNL | 13162 NL80211_FLAG_CLEAR_SKB, 13163 }, 13164 { 13165 .cmd = NL80211_CMD_TDLS_MGMT, 13166 .doit = nl80211_tdls_mgmt, 13167 .policy = nl80211_policy, 13168 .flags = GENL_UNS_ADMIN_PERM, 13169 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13170 NL80211_FLAG_NEED_RTNL, 13171 }, 13172 { 13173 .cmd = NL80211_CMD_TDLS_OPER, 13174 .doit = nl80211_tdls_oper, 13175 .policy = nl80211_policy, 13176 .flags = GENL_UNS_ADMIN_PERM, 13177 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13178 NL80211_FLAG_NEED_RTNL, 13179 }, 13180 { 13181 .cmd = NL80211_CMD_UNEXPECTED_FRAME, 13182 .doit = nl80211_register_unexpected_frame, 13183 .policy = nl80211_policy, 13184 .flags = GENL_UNS_ADMIN_PERM, 13185 .internal_flags = NL80211_FLAG_NEED_NETDEV | 13186 NL80211_FLAG_NEED_RTNL, 13187 }, 13188 { 13189 .cmd = NL80211_CMD_PROBE_CLIENT, 13190 .doit = nl80211_probe_client, 13191 .policy = nl80211_policy, 13192 .flags = GENL_UNS_ADMIN_PERM, 13193 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13194 NL80211_FLAG_NEED_RTNL, 13195 }, 13196 { 13197 .cmd = NL80211_CMD_REGISTER_BEACONS, 13198 .doit = nl80211_register_beacons, 13199 .policy = nl80211_policy, 13200 .flags = GENL_UNS_ADMIN_PERM, 13201 .internal_flags = NL80211_FLAG_NEED_WIPHY | 13202 NL80211_FLAG_NEED_RTNL, 13203 }, 13204 { 13205 .cmd = NL80211_CMD_SET_NOACK_MAP, 13206 .doit = nl80211_set_noack_map, 13207 .policy = nl80211_policy, 13208 .flags = GENL_UNS_ADMIN_PERM, 13209 .internal_flags = NL80211_FLAG_NEED_NETDEV | 13210 NL80211_FLAG_NEED_RTNL, 13211 }, 13212 { 13213 .cmd = NL80211_CMD_START_P2P_DEVICE, 13214 .doit = nl80211_start_p2p_device, 13215 .policy = nl80211_policy, 13216 .flags = GENL_UNS_ADMIN_PERM, 13217 .internal_flags = NL80211_FLAG_NEED_WDEV | 13218 NL80211_FLAG_NEED_RTNL, 13219 }, 13220 { 13221 .cmd = NL80211_CMD_STOP_P2P_DEVICE, 13222 .doit = nl80211_stop_p2p_device, 13223 .policy = nl80211_policy, 13224 .flags = GENL_UNS_ADMIN_PERM, 13225 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 13226 NL80211_FLAG_NEED_RTNL, 13227 }, 13228 { 13229 .cmd = NL80211_CMD_START_NAN, 13230 .doit = nl80211_start_nan, 13231 .policy = nl80211_policy, 13232 .flags = GENL_ADMIN_PERM, 13233 .internal_flags = NL80211_FLAG_NEED_WDEV | 13234 NL80211_FLAG_NEED_RTNL, 13235 }, 13236 { 13237 .cmd = NL80211_CMD_STOP_NAN, 13238 .doit = nl80211_stop_nan, 13239 .policy = nl80211_policy, 13240 .flags = GENL_ADMIN_PERM, 13241 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 13242 NL80211_FLAG_NEED_RTNL, 13243 }, 13244 { 13245 .cmd = NL80211_CMD_ADD_NAN_FUNCTION, 13246 .doit = nl80211_nan_add_func, 13247 .policy = nl80211_policy, 13248 .flags = GENL_ADMIN_PERM, 13249 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 13250 NL80211_FLAG_NEED_RTNL, 13251 }, 13252 { 13253 .cmd = NL80211_CMD_DEL_NAN_FUNCTION, 13254 .doit = nl80211_nan_del_func, 13255 .policy = nl80211_policy, 13256 .flags = GENL_ADMIN_PERM, 13257 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 13258 NL80211_FLAG_NEED_RTNL, 13259 }, 13260 { 13261 .cmd = NL80211_CMD_CHANGE_NAN_CONFIG, 13262 .doit = nl80211_nan_change_config, 13263 .policy = nl80211_policy, 13264 .flags = GENL_ADMIN_PERM, 13265 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 13266 NL80211_FLAG_NEED_RTNL, 13267 }, 13268 { 13269 .cmd = NL80211_CMD_SET_MCAST_RATE, 13270 .doit = nl80211_set_mcast_rate, 13271 .policy = nl80211_policy, 13272 .flags = GENL_UNS_ADMIN_PERM, 13273 .internal_flags = NL80211_FLAG_NEED_NETDEV | 13274 NL80211_FLAG_NEED_RTNL, 13275 }, 13276 { 13277 .cmd = NL80211_CMD_SET_MAC_ACL, 13278 .doit = nl80211_set_mac_acl, 13279 .policy = nl80211_policy, 13280 .flags = GENL_UNS_ADMIN_PERM, 13281 .internal_flags = NL80211_FLAG_NEED_NETDEV | 13282 NL80211_FLAG_NEED_RTNL, 13283 }, 13284 { 13285 .cmd = NL80211_CMD_RADAR_DETECT, 13286 .doit = nl80211_start_radar_detection, 13287 .policy = nl80211_policy, 13288 .flags = GENL_UNS_ADMIN_PERM, 13289 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13290 NL80211_FLAG_NEED_RTNL, 13291 }, 13292 { 13293 .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES, 13294 .doit = nl80211_get_protocol_features, 13295 .policy = nl80211_policy, 13296 }, 13297 { 13298 .cmd = NL80211_CMD_UPDATE_FT_IES, 13299 .doit = nl80211_update_ft_ies, 13300 .policy = nl80211_policy, 13301 .flags = GENL_UNS_ADMIN_PERM, 13302 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13303 NL80211_FLAG_NEED_RTNL, 13304 }, 13305 { 13306 .cmd = NL80211_CMD_CRIT_PROTOCOL_START, 13307 .doit = nl80211_crit_protocol_start, 13308 .policy = nl80211_policy, 13309 .flags = GENL_UNS_ADMIN_PERM, 13310 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 13311 NL80211_FLAG_NEED_RTNL, 13312 }, 13313 { 13314 .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP, 13315 .doit = nl80211_crit_protocol_stop, 13316 .policy = nl80211_policy, 13317 .flags = GENL_UNS_ADMIN_PERM, 13318 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 13319 NL80211_FLAG_NEED_RTNL, 13320 }, 13321 { 13322 .cmd = NL80211_CMD_GET_COALESCE, 13323 .doit = nl80211_get_coalesce, 13324 .policy = nl80211_policy, 13325 .internal_flags = NL80211_FLAG_NEED_WIPHY | 13326 NL80211_FLAG_NEED_RTNL, 13327 }, 13328 { 13329 .cmd = NL80211_CMD_SET_COALESCE, 13330 .doit = nl80211_set_coalesce, 13331 .policy = nl80211_policy, 13332 .flags = GENL_UNS_ADMIN_PERM, 13333 .internal_flags = NL80211_FLAG_NEED_WIPHY | 13334 NL80211_FLAG_NEED_RTNL, 13335 }, 13336 { 13337 .cmd = NL80211_CMD_CHANNEL_SWITCH, 13338 .doit = nl80211_channel_switch, 13339 .policy = nl80211_policy, 13340 .flags = GENL_UNS_ADMIN_PERM, 13341 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13342 NL80211_FLAG_NEED_RTNL, 13343 }, 13344 { 13345 .cmd = NL80211_CMD_VENDOR, 13346 .doit = nl80211_vendor_cmd, 13347 .dumpit = nl80211_vendor_cmd_dump, 13348 .policy = nl80211_policy, 13349 .flags = GENL_UNS_ADMIN_PERM, 13350 .internal_flags = NL80211_FLAG_NEED_WIPHY | 13351 NL80211_FLAG_NEED_RTNL, 13352 }, 13353 { 13354 .cmd = NL80211_CMD_SET_QOS_MAP, 13355 .doit = nl80211_set_qos_map, 13356 .policy = nl80211_policy, 13357 .flags = GENL_UNS_ADMIN_PERM, 13358 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13359 NL80211_FLAG_NEED_RTNL, 13360 }, 13361 { 13362 .cmd = NL80211_CMD_ADD_TX_TS, 13363 .doit = nl80211_add_tx_ts, 13364 .policy = nl80211_policy, 13365 .flags = GENL_UNS_ADMIN_PERM, 13366 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13367 NL80211_FLAG_NEED_RTNL, 13368 }, 13369 { 13370 .cmd = NL80211_CMD_DEL_TX_TS, 13371 .doit = nl80211_del_tx_ts, 13372 .policy = nl80211_policy, 13373 .flags = GENL_UNS_ADMIN_PERM, 13374 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13375 NL80211_FLAG_NEED_RTNL, 13376 }, 13377 { 13378 .cmd = NL80211_CMD_TDLS_CHANNEL_SWITCH, 13379 .doit = nl80211_tdls_channel_switch, 13380 .policy = nl80211_policy, 13381 .flags = GENL_UNS_ADMIN_PERM, 13382 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13383 NL80211_FLAG_NEED_RTNL, 13384 }, 13385 { 13386 .cmd = NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH, 13387 .doit = nl80211_tdls_cancel_channel_switch, 13388 .policy = nl80211_policy, 13389 .flags = GENL_UNS_ADMIN_PERM, 13390 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13391 NL80211_FLAG_NEED_RTNL, 13392 }, 13393 { 13394 .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST, 13395 .doit = nl80211_set_multicast_to_unicast, 13396 .policy = nl80211_policy, 13397 .flags = GENL_UNS_ADMIN_PERM, 13398 .internal_flags = NL80211_FLAG_NEED_NETDEV | 13399 NL80211_FLAG_NEED_RTNL, 13400 }, 13401 { 13402 .cmd = NL80211_CMD_SET_PMK, 13403 .doit = nl80211_set_pmk, 13404 .policy = nl80211_policy, 13405 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13406 NL80211_FLAG_NEED_RTNL, 13407 }, 13408 { 13409 .cmd = NL80211_CMD_DEL_PMK, 13410 .doit = nl80211_del_pmk, 13411 .policy = nl80211_policy, 13412 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13413 NL80211_FLAG_NEED_RTNL, 13414 }, 13415 { 13416 .cmd = NL80211_CMD_EXTERNAL_AUTH, 13417 .doit = nl80211_external_auth, 13418 .policy = nl80211_policy, 13419 .flags = GENL_ADMIN_PERM, 13420 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 13421 NL80211_FLAG_NEED_RTNL, 13422 }, 13423 13424 }; 13425 13426 static struct genl_family nl80211_fam __ro_after_init = { 13427 .name = NL80211_GENL_NAME, /* have users key off the name instead */ 13428 .hdrsize = 0, /* no private header */ 13429 .version = 1, /* no particular meaning now */ 13430 .maxattr = NL80211_ATTR_MAX, 13431 .netnsok = true, 13432 .pre_doit = nl80211_pre_doit, 13433 .post_doit = nl80211_post_doit, 13434 .module = THIS_MODULE, 13435 .ops = nl80211_ops, 13436 .n_ops = ARRAY_SIZE(nl80211_ops), 13437 .mcgrps = nl80211_mcgrps, 13438 .n_mcgrps = ARRAY_SIZE(nl80211_mcgrps), 13439 }; 13440 13441 /* notification functions */ 13442 13443 void nl80211_notify_wiphy(struct cfg80211_registered_device *rdev, 13444 enum nl80211_commands cmd) 13445 { 13446 struct sk_buff *msg; 13447 struct nl80211_dump_wiphy_state state = {}; 13448 13449 WARN_ON(cmd != NL80211_CMD_NEW_WIPHY && 13450 cmd != NL80211_CMD_DEL_WIPHY); 13451 13452 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 13453 if (!msg) 13454 return; 13455 13456 if (nl80211_send_wiphy(rdev, cmd, msg, 0, 0, 0, &state) < 0) { 13457 nlmsg_free(msg); 13458 return; 13459 } 13460 13461 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 13462 NL80211_MCGRP_CONFIG, GFP_KERNEL); 13463 } 13464 13465 void nl80211_notify_iface(struct cfg80211_registered_device *rdev, 13466 struct wireless_dev *wdev, 13467 enum nl80211_commands cmd) 13468 { 13469 struct sk_buff *msg; 13470 13471 WARN_ON(cmd != NL80211_CMD_NEW_INTERFACE && 13472 cmd != NL80211_CMD_DEL_INTERFACE); 13473 13474 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 13475 if (!msg) 13476 return; 13477 13478 if (nl80211_send_iface(msg, 0, 0, 0, rdev, wdev, 13479 cmd == NL80211_CMD_DEL_INTERFACE) < 0) { 13480 nlmsg_free(msg); 13481 return; 13482 } 13483 13484 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 13485 NL80211_MCGRP_CONFIG, GFP_KERNEL); 13486 } 13487 13488 static int nl80211_add_scan_req(struct sk_buff *msg, 13489 struct cfg80211_registered_device *rdev) 13490 { 13491 struct cfg80211_scan_request *req = rdev->scan_req; 13492 struct nlattr *nest; 13493 int i; 13494 13495 if (WARN_ON(!req)) 13496 return 0; 13497 13498 nest = nla_nest_start(msg, NL80211_ATTR_SCAN_SSIDS); 13499 if (!nest) 13500 goto nla_put_failure; 13501 for (i = 0; i < req->n_ssids; i++) { 13502 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid)) 13503 goto nla_put_failure; 13504 } 13505 nla_nest_end(msg, nest); 13506 13507 nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES); 13508 if (!nest) 13509 goto nla_put_failure; 13510 for (i = 0; i < req->n_channels; i++) { 13511 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) 13512 goto nla_put_failure; 13513 } 13514 nla_nest_end(msg, nest); 13515 13516 if (req->ie && 13517 nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie)) 13518 goto nla_put_failure; 13519 13520 if (req->flags && 13521 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags)) 13522 goto nla_put_failure; 13523 13524 if (req->info.scan_start_tsf && 13525 (nla_put_u64_64bit(msg, NL80211_ATTR_SCAN_START_TIME_TSF, 13526 req->info.scan_start_tsf, NL80211_BSS_PAD) || 13527 nla_put(msg, NL80211_ATTR_SCAN_START_TIME_TSF_BSSID, ETH_ALEN, 13528 req->info.tsf_bssid))) 13529 goto nla_put_failure; 13530 13531 return 0; 13532 nla_put_failure: 13533 return -ENOBUFS; 13534 } 13535 13536 static int nl80211_prep_scan_msg(struct sk_buff *msg, 13537 struct cfg80211_registered_device *rdev, 13538 struct wireless_dev *wdev, 13539 u32 portid, u32 seq, int flags, 13540 u32 cmd) 13541 { 13542 void *hdr; 13543 13544 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 13545 if (!hdr) 13546 return -1; 13547 13548 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 13549 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 13550 wdev->netdev->ifindex)) || 13551 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 13552 NL80211_ATTR_PAD)) 13553 goto nla_put_failure; 13554 13555 /* ignore errors and send incomplete event anyway */ 13556 nl80211_add_scan_req(msg, rdev); 13557 13558 genlmsg_end(msg, hdr); 13559 return 0; 13560 13561 nla_put_failure: 13562 genlmsg_cancel(msg, hdr); 13563 return -EMSGSIZE; 13564 } 13565 13566 static int 13567 nl80211_prep_sched_scan_msg(struct sk_buff *msg, 13568 struct cfg80211_sched_scan_request *req, u32 cmd) 13569 { 13570 void *hdr; 13571 13572 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 13573 if (!hdr) 13574 return -1; 13575 13576 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, 13577 wiphy_to_rdev(req->wiphy)->wiphy_idx) || 13578 nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) || 13579 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid, 13580 NL80211_ATTR_PAD)) 13581 goto nla_put_failure; 13582 13583 genlmsg_end(msg, hdr); 13584 return 0; 13585 13586 nla_put_failure: 13587 genlmsg_cancel(msg, hdr); 13588 return -EMSGSIZE; 13589 } 13590 13591 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev, 13592 struct wireless_dev *wdev) 13593 { 13594 struct sk_buff *msg; 13595 13596 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 13597 if (!msg) 13598 return; 13599 13600 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0, 13601 NL80211_CMD_TRIGGER_SCAN) < 0) { 13602 nlmsg_free(msg); 13603 return; 13604 } 13605 13606 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 13607 NL80211_MCGRP_SCAN, GFP_KERNEL); 13608 } 13609 13610 struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev, 13611 struct wireless_dev *wdev, bool aborted) 13612 { 13613 struct sk_buff *msg; 13614 13615 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 13616 if (!msg) 13617 return NULL; 13618 13619 if (nl80211_prep_scan_msg(msg, rdev, wdev, 0, 0, 0, 13620 aborted ? NL80211_CMD_SCAN_ABORTED : 13621 NL80211_CMD_NEW_SCAN_RESULTS) < 0) { 13622 nlmsg_free(msg); 13623 return NULL; 13624 } 13625 13626 return msg; 13627 } 13628 13629 /* send message created by nl80211_build_scan_msg() */ 13630 void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev, 13631 struct sk_buff *msg) 13632 { 13633 if (!msg) 13634 return; 13635 13636 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 13637 NL80211_MCGRP_SCAN, GFP_KERNEL); 13638 } 13639 13640 void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd) 13641 { 13642 struct sk_buff *msg; 13643 13644 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 13645 if (!msg) 13646 return; 13647 13648 if (nl80211_prep_sched_scan_msg(msg, req, cmd) < 0) { 13649 nlmsg_free(msg); 13650 return; 13651 } 13652 13653 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0, 13654 NL80211_MCGRP_SCAN, GFP_KERNEL); 13655 } 13656 13657 static bool nl80211_reg_change_event_fill(struct sk_buff *msg, 13658 struct regulatory_request *request) 13659 { 13660 /* Userspace can always count this one always being set */ 13661 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) 13662 goto nla_put_failure; 13663 13664 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { 13665 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 13666 NL80211_REGDOM_TYPE_WORLD)) 13667 goto nla_put_failure; 13668 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { 13669 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 13670 NL80211_REGDOM_TYPE_CUSTOM_WORLD)) 13671 goto nla_put_failure; 13672 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || 13673 request->intersect) { 13674 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 13675 NL80211_REGDOM_TYPE_INTERSECTION)) 13676 goto nla_put_failure; 13677 } else { 13678 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 13679 NL80211_REGDOM_TYPE_COUNTRY) || 13680 nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, 13681 request->alpha2)) 13682 goto nla_put_failure; 13683 } 13684 13685 if (request->wiphy_idx != WIPHY_IDX_INVALID) { 13686 struct wiphy *wiphy = wiphy_idx_to_wiphy(request->wiphy_idx); 13687 13688 if (wiphy && 13689 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) 13690 goto nla_put_failure; 13691 13692 if (wiphy && 13693 wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && 13694 nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) 13695 goto nla_put_failure; 13696 } 13697 13698 return true; 13699 13700 nla_put_failure: 13701 return false; 13702 } 13703 13704 /* 13705 * This can happen on global regulatory changes or device specific settings 13706 * based on custom regulatory domains. 13707 */ 13708 void nl80211_common_reg_change_event(enum nl80211_commands cmd_id, 13709 struct regulatory_request *request) 13710 { 13711 struct sk_buff *msg; 13712 void *hdr; 13713 13714 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 13715 if (!msg) 13716 return; 13717 13718 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd_id); 13719 if (!hdr) { 13720 nlmsg_free(msg); 13721 return; 13722 } 13723 13724 if (nl80211_reg_change_event_fill(msg, request) == false) 13725 goto nla_put_failure; 13726 13727 genlmsg_end(msg, hdr); 13728 13729 rcu_read_lock(); 13730 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 13731 NL80211_MCGRP_REGULATORY, GFP_ATOMIC); 13732 rcu_read_unlock(); 13733 13734 return; 13735 13736 nla_put_failure: 13737 nlmsg_free(msg); 13738 } 13739 13740 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev, 13741 struct net_device *netdev, 13742 const u8 *buf, size_t len, 13743 enum nl80211_commands cmd, gfp_t gfp, 13744 int uapsd_queues) 13745 { 13746 struct sk_buff *msg; 13747 void *hdr; 13748 13749 msg = nlmsg_new(100 + len, gfp); 13750 if (!msg) 13751 return; 13752 13753 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 13754 if (!hdr) { 13755 nlmsg_free(msg); 13756 return; 13757 } 13758 13759 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 13760 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 13761 nla_put(msg, NL80211_ATTR_FRAME, len, buf)) 13762 goto nla_put_failure; 13763 13764 if (uapsd_queues >= 0) { 13765 struct nlattr *nla_wmm = 13766 nla_nest_start(msg, NL80211_ATTR_STA_WME); 13767 if (!nla_wmm) 13768 goto nla_put_failure; 13769 13770 if (nla_put_u8(msg, NL80211_STA_WME_UAPSD_QUEUES, 13771 uapsd_queues)) 13772 goto nla_put_failure; 13773 13774 nla_nest_end(msg, nla_wmm); 13775 } 13776 13777 genlmsg_end(msg, hdr); 13778 13779 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 13780 NL80211_MCGRP_MLME, gfp); 13781 return; 13782 13783 nla_put_failure: 13784 nlmsg_free(msg); 13785 } 13786 13787 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev, 13788 struct net_device *netdev, const u8 *buf, 13789 size_t len, gfp_t gfp) 13790 { 13791 nl80211_send_mlme_event(rdev, netdev, buf, len, 13792 NL80211_CMD_AUTHENTICATE, gfp, -1); 13793 } 13794 13795 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev, 13796 struct net_device *netdev, const u8 *buf, 13797 size_t len, gfp_t gfp, int uapsd_queues) 13798 { 13799 nl80211_send_mlme_event(rdev, netdev, buf, len, 13800 NL80211_CMD_ASSOCIATE, gfp, uapsd_queues); 13801 } 13802 13803 void nl80211_send_deauth(struct cfg80211_registered_device *rdev, 13804 struct net_device *netdev, const u8 *buf, 13805 size_t len, gfp_t gfp) 13806 { 13807 nl80211_send_mlme_event(rdev, netdev, buf, len, 13808 NL80211_CMD_DEAUTHENTICATE, gfp, -1); 13809 } 13810 13811 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev, 13812 struct net_device *netdev, const u8 *buf, 13813 size_t len, gfp_t gfp) 13814 { 13815 nl80211_send_mlme_event(rdev, netdev, buf, len, 13816 NL80211_CMD_DISASSOCIATE, gfp, -1); 13817 } 13818 13819 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf, 13820 size_t len) 13821 { 13822 struct wireless_dev *wdev = dev->ieee80211_ptr; 13823 struct wiphy *wiphy = wdev->wiphy; 13824 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 13825 const struct ieee80211_mgmt *mgmt = (void *)buf; 13826 u32 cmd; 13827 13828 if (WARN_ON(len < 2)) 13829 return; 13830 13831 if (ieee80211_is_deauth(mgmt->frame_control)) 13832 cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE; 13833 else 13834 cmd = NL80211_CMD_UNPROT_DISASSOCIATE; 13835 13836 trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len); 13837 nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC, -1); 13838 } 13839 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt); 13840 13841 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev, 13842 struct net_device *netdev, int cmd, 13843 const u8 *addr, gfp_t gfp) 13844 { 13845 struct sk_buff *msg; 13846 void *hdr; 13847 13848 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 13849 if (!msg) 13850 return; 13851 13852 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 13853 if (!hdr) { 13854 nlmsg_free(msg); 13855 return; 13856 } 13857 13858 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 13859 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 13860 nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 13861 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) 13862 goto nla_put_failure; 13863 13864 genlmsg_end(msg, hdr); 13865 13866 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 13867 NL80211_MCGRP_MLME, gfp); 13868 return; 13869 13870 nla_put_failure: 13871 nlmsg_free(msg); 13872 } 13873 13874 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev, 13875 struct net_device *netdev, const u8 *addr, 13876 gfp_t gfp) 13877 { 13878 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE, 13879 addr, gfp); 13880 } 13881 13882 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev, 13883 struct net_device *netdev, const u8 *addr, 13884 gfp_t gfp) 13885 { 13886 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE, 13887 addr, gfp); 13888 } 13889 13890 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev, 13891 struct net_device *netdev, 13892 struct cfg80211_connect_resp_params *cr, 13893 gfp_t gfp) 13894 { 13895 struct sk_buff *msg; 13896 void *hdr; 13897 13898 msg = nlmsg_new(100 + cr->req_ie_len + cr->resp_ie_len + 13899 cr->fils_kek_len + cr->pmk_len + 13900 (cr->pmkid ? WLAN_PMKID_LEN : 0), gfp); 13901 if (!msg) 13902 return; 13903 13904 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT); 13905 if (!hdr) { 13906 nlmsg_free(msg); 13907 return; 13908 } 13909 13910 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 13911 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 13912 (cr->bssid && 13913 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cr->bssid)) || 13914 nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, 13915 cr->status < 0 ? WLAN_STATUS_UNSPECIFIED_FAILURE : 13916 cr->status) || 13917 (cr->status < 0 && 13918 (nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 13919 nla_put_u32(msg, NL80211_ATTR_TIMEOUT_REASON, 13920 cr->timeout_reason))) || 13921 (cr->req_ie && 13922 nla_put(msg, NL80211_ATTR_REQ_IE, cr->req_ie_len, cr->req_ie)) || 13923 (cr->resp_ie && 13924 nla_put(msg, NL80211_ATTR_RESP_IE, cr->resp_ie_len, 13925 cr->resp_ie)) || 13926 (cr->update_erp_next_seq_num && 13927 nla_put_u16(msg, NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM, 13928 cr->fils_erp_next_seq_num)) || 13929 (cr->status == WLAN_STATUS_SUCCESS && 13930 ((cr->fils_kek && 13931 nla_put(msg, NL80211_ATTR_FILS_KEK, cr->fils_kek_len, 13932 cr->fils_kek)) || 13933 (cr->pmk && 13934 nla_put(msg, NL80211_ATTR_PMK, cr->pmk_len, cr->pmk)) || 13935 (cr->pmkid && 13936 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, cr->pmkid))))) 13937 goto nla_put_failure; 13938 13939 genlmsg_end(msg, hdr); 13940 13941 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 13942 NL80211_MCGRP_MLME, gfp); 13943 return; 13944 13945 nla_put_failure: 13946 nlmsg_free(msg); 13947 } 13948 13949 void nl80211_send_roamed(struct cfg80211_registered_device *rdev, 13950 struct net_device *netdev, 13951 struct cfg80211_roam_info *info, gfp_t gfp) 13952 { 13953 struct sk_buff *msg; 13954 void *hdr; 13955 const u8 *bssid = info->bss ? info->bss->bssid : info->bssid; 13956 13957 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len, gfp); 13958 if (!msg) 13959 return; 13960 13961 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM); 13962 if (!hdr) { 13963 nlmsg_free(msg); 13964 return; 13965 } 13966 13967 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 13968 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 13969 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid) || 13970 (info->req_ie && 13971 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len, 13972 info->req_ie)) || 13973 (info->resp_ie && 13974 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len, 13975 info->resp_ie))) 13976 goto nla_put_failure; 13977 13978 genlmsg_end(msg, hdr); 13979 13980 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 13981 NL80211_MCGRP_MLME, gfp); 13982 return; 13983 13984 nla_put_failure: 13985 nlmsg_free(msg); 13986 } 13987 13988 void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev, 13989 struct net_device *netdev, const u8 *bssid) 13990 { 13991 struct sk_buff *msg; 13992 void *hdr; 13993 13994 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 13995 if (!msg) 13996 return; 13997 13998 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PORT_AUTHORIZED); 13999 if (!hdr) { 14000 nlmsg_free(msg); 14001 return; 14002 } 14003 14004 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 14005 goto nla_put_failure; 14006 14007 genlmsg_end(msg, hdr); 14008 14009 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14010 NL80211_MCGRP_MLME, GFP_KERNEL); 14011 return; 14012 14013 nla_put_failure: 14014 nlmsg_free(msg); 14015 } 14016 14017 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev, 14018 struct net_device *netdev, u16 reason, 14019 const u8 *ie, size_t ie_len, bool from_ap) 14020 { 14021 struct sk_buff *msg; 14022 void *hdr; 14023 14024 msg = nlmsg_new(100 + ie_len, GFP_KERNEL); 14025 if (!msg) 14026 return; 14027 14028 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT); 14029 if (!hdr) { 14030 nlmsg_free(msg); 14031 return; 14032 } 14033 14034 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 14035 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 14036 (reason && 14037 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) || 14038 (from_ap && 14039 nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) || 14040 (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie))) 14041 goto nla_put_failure; 14042 14043 genlmsg_end(msg, hdr); 14044 14045 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14046 NL80211_MCGRP_MLME, GFP_KERNEL); 14047 return; 14048 14049 nla_put_failure: 14050 nlmsg_free(msg); 14051 } 14052 14053 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev, 14054 struct net_device *netdev, const u8 *bssid, 14055 gfp_t gfp) 14056 { 14057 struct sk_buff *msg; 14058 void *hdr; 14059 14060 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 14061 if (!msg) 14062 return; 14063 14064 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS); 14065 if (!hdr) { 14066 nlmsg_free(msg); 14067 return; 14068 } 14069 14070 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 14071 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 14072 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 14073 goto nla_put_failure; 14074 14075 genlmsg_end(msg, hdr); 14076 14077 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14078 NL80211_MCGRP_MLME, gfp); 14079 return; 14080 14081 nla_put_failure: 14082 nlmsg_free(msg); 14083 } 14084 14085 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr, 14086 const u8* ie, u8 ie_len, gfp_t gfp) 14087 { 14088 struct wireless_dev *wdev = dev->ieee80211_ptr; 14089 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 14090 struct sk_buff *msg; 14091 void *hdr; 14092 14093 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) 14094 return; 14095 14096 trace_cfg80211_notify_new_peer_candidate(dev, addr); 14097 14098 msg = nlmsg_new(100 + ie_len, gfp); 14099 if (!msg) 14100 return; 14101 14102 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE); 14103 if (!hdr) { 14104 nlmsg_free(msg); 14105 return; 14106 } 14107 14108 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 14109 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 14110 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 14111 (ie_len && ie && 14112 nla_put(msg, NL80211_ATTR_IE, ie_len , ie))) 14113 goto nla_put_failure; 14114 14115 genlmsg_end(msg, hdr); 14116 14117 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14118 NL80211_MCGRP_MLME, gfp); 14119 return; 14120 14121 nla_put_failure: 14122 nlmsg_free(msg); 14123 } 14124 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate); 14125 14126 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev, 14127 struct net_device *netdev, const u8 *addr, 14128 enum nl80211_key_type key_type, int key_id, 14129 const u8 *tsc, gfp_t gfp) 14130 { 14131 struct sk_buff *msg; 14132 void *hdr; 14133 14134 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 14135 if (!msg) 14136 return; 14137 14138 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE); 14139 if (!hdr) { 14140 nlmsg_free(msg); 14141 return; 14142 } 14143 14144 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 14145 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 14146 (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) || 14147 nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) || 14148 (key_id != -1 && 14149 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) || 14150 (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc))) 14151 goto nla_put_failure; 14152 14153 genlmsg_end(msg, hdr); 14154 14155 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14156 NL80211_MCGRP_MLME, gfp); 14157 return; 14158 14159 nla_put_failure: 14160 nlmsg_free(msg); 14161 } 14162 14163 void nl80211_send_beacon_hint_event(struct wiphy *wiphy, 14164 struct ieee80211_channel *channel_before, 14165 struct ieee80211_channel *channel_after) 14166 { 14167 struct sk_buff *msg; 14168 void *hdr; 14169 struct nlattr *nl_freq; 14170 14171 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); 14172 if (!msg) 14173 return; 14174 14175 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT); 14176 if (!hdr) { 14177 nlmsg_free(msg); 14178 return; 14179 } 14180 14181 /* 14182 * Since we are applying the beacon hint to a wiphy we know its 14183 * wiphy_idx is valid 14184 */ 14185 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 14186 goto nla_put_failure; 14187 14188 /* Before */ 14189 nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_BEFORE); 14190 if (!nl_freq) 14191 goto nla_put_failure; 14192 if (nl80211_msg_put_channel(msg, channel_before, false)) 14193 goto nla_put_failure; 14194 nla_nest_end(msg, nl_freq); 14195 14196 /* After */ 14197 nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_AFTER); 14198 if (!nl_freq) 14199 goto nla_put_failure; 14200 if (nl80211_msg_put_channel(msg, channel_after, false)) 14201 goto nla_put_failure; 14202 nla_nest_end(msg, nl_freq); 14203 14204 genlmsg_end(msg, hdr); 14205 14206 rcu_read_lock(); 14207 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 14208 NL80211_MCGRP_REGULATORY, GFP_ATOMIC); 14209 rcu_read_unlock(); 14210 14211 return; 14212 14213 nla_put_failure: 14214 nlmsg_free(msg); 14215 } 14216 14217 static void nl80211_send_remain_on_chan_event( 14218 int cmd, struct cfg80211_registered_device *rdev, 14219 struct wireless_dev *wdev, u64 cookie, 14220 struct ieee80211_channel *chan, 14221 unsigned int duration, gfp_t gfp) 14222 { 14223 struct sk_buff *msg; 14224 void *hdr; 14225 14226 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 14227 if (!msg) 14228 return; 14229 14230 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 14231 if (!hdr) { 14232 nlmsg_free(msg); 14233 return; 14234 } 14235 14236 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 14237 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 14238 wdev->netdev->ifindex)) || 14239 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 14240 NL80211_ATTR_PAD) || 14241 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || 14242 nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 14243 NL80211_CHAN_NO_HT) || 14244 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 14245 NL80211_ATTR_PAD)) 14246 goto nla_put_failure; 14247 14248 if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL && 14249 nla_put_u32(msg, NL80211_ATTR_DURATION, duration)) 14250 goto nla_put_failure; 14251 14252 genlmsg_end(msg, hdr); 14253 14254 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14255 NL80211_MCGRP_MLME, gfp); 14256 return; 14257 14258 nla_put_failure: 14259 nlmsg_free(msg); 14260 } 14261 14262 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie, 14263 struct ieee80211_channel *chan, 14264 unsigned int duration, gfp_t gfp) 14265 { 14266 struct wiphy *wiphy = wdev->wiphy; 14267 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 14268 14269 trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration); 14270 nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL, 14271 rdev, wdev, cookie, chan, 14272 duration, gfp); 14273 } 14274 EXPORT_SYMBOL(cfg80211_ready_on_channel); 14275 14276 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie, 14277 struct ieee80211_channel *chan, 14278 gfp_t gfp) 14279 { 14280 struct wiphy *wiphy = wdev->wiphy; 14281 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 14282 14283 trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan); 14284 nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 14285 rdev, wdev, cookie, chan, 0, gfp); 14286 } 14287 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired); 14288 14289 void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr, 14290 struct station_info *sinfo, gfp_t gfp) 14291 { 14292 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 14293 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 14294 struct sk_buff *msg; 14295 14296 trace_cfg80211_new_sta(dev, mac_addr, sinfo); 14297 14298 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 14299 if (!msg) 14300 return; 14301 14302 if (nl80211_send_station(msg, NL80211_CMD_NEW_STATION, 0, 0, 0, 14303 rdev, dev, mac_addr, sinfo) < 0) { 14304 nlmsg_free(msg); 14305 return; 14306 } 14307 14308 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14309 NL80211_MCGRP_MLME, gfp); 14310 } 14311 EXPORT_SYMBOL(cfg80211_new_sta); 14312 14313 void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr, 14314 struct station_info *sinfo, gfp_t gfp) 14315 { 14316 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 14317 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 14318 struct sk_buff *msg; 14319 struct station_info empty_sinfo = {}; 14320 14321 if (!sinfo) 14322 sinfo = &empty_sinfo; 14323 14324 trace_cfg80211_del_sta(dev, mac_addr); 14325 14326 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 14327 if (!msg) 14328 return; 14329 14330 if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0, 14331 rdev, dev, mac_addr, sinfo) < 0) { 14332 nlmsg_free(msg); 14333 return; 14334 } 14335 14336 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14337 NL80211_MCGRP_MLME, gfp); 14338 } 14339 EXPORT_SYMBOL(cfg80211_del_sta_sinfo); 14340 14341 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr, 14342 enum nl80211_connect_failed_reason reason, 14343 gfp_t gfp) 14344 { 14345 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 14346 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 14347 struct sk_buff *msg; 14348 void *hdr; 14349 14350 msg = nlmsg_new(NLMSG_GOODSIZE, gfp); 14351 if (!msg) 14352 return; 14353 14354 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED); 14355 if (!hdr) { 14356 nlmsg_free(msg); 14357 return; 14358 } 14359 14360 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 14361 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 14362 nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason)) 14363 goto nla_put_failure; 14364 14365 genlmsg_end(msg, hdr); 14366 14367 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14368 NL80211_MCGRP_MLME, gfp); 14369 return; 14370 14371 nla_put_failure: 14372 nlmsg_free(msg); 14373 } 14374 EXPORT_SYMBOL(cfg80211_conn_failed); 14375 14376 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd, 14377 const u8 *addr, gfp_t gfp) 14378 { 14379 struct wireless_dev *wdev = dev->ieee80211_ptr; 14380 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 14381 struct sk_buff *msg; 14382 void *hdr; 14383 u32 nlportid = READ_ONCE(wdev->ap_unexpected_nlportid); 14384 14385 if (!nlportid) 14386 return false; 14387 14388 msg = nlmsg_new(100, gfp); 14389 if (!msg) 14390 return true; 14391 14392 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 14393 if (!hdr) { 14394 nlmsg_free(msg); 14395 return true; 14396 } 14397 14398 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 14399 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 14400 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) 14401 goto nla_put_failure; 14402 14403 genlmsg_end(msg, hdr); 14404 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 14405 return true; 14406 14407 nla_put_failure: 14408 nlmsg_free(msg); 14409 return true; 14410 } 14411 14412 bool cfg80211_rx_spurious_frame(struct net_device *dev, 14413 const u8 *addr, gfp_t gfp) 14414 { 14415 struct wireless_dev *wdev = dev->ieee80211_ptr; 14416 bool ret; 14417 14418 trace_cfg80211_rx_spurious_frame(dev, addr); 14419 14420 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 14421 wdev->iftype != NL80211_IFTYPE_P2P_GO)) { 14422 trace_cfg80211_return_bool(false); 14423 return false; 14424 } 14425 ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME, 14426 addr, gfp); 14427 trace_cfg80211_return_bool(ret); 14428 return ret; 14429 } 14430 EXPORT_SYMBOL(cfg80211_rx_spurious_frame); 14431 14432 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev, 14433 const u8 *addr, gfp_t gfp) 14434 { 14435 struct wireless_dev *wdev = dev->ieee80211_ptr; 14436 bool ret; 14437 14438 trace_cfg80211_rx_unexpected_4addr_frame(dev, addr); 14439 14440 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 14441 wdev->iftype != NL80211_IFTYPE_P2P_GO && 14442 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { 14443 trace_cfg80211_return_bool(false); 14444 return false; 14445 } 14446 ret = __nl80211_unexpected_frame(dev, 14447 NL80211_CMD_UNEXPECTED_4ADDR_FRAME, 14448 addr, gfp); 14449 trace_cfg80211_return_bool(ret); 14450 return ret; 14451 } 14452 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame); 14453 14454 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, 14455 struct wireless_dev *wdev, u32 nlportid, 14456 int freq, int sig_dbm, 14457 const u8 *buf, size_t len, u32 flags, gfp_t gfp) 14458 { 14459 struct net_device *netdev = wdev->netdev; 14460 struct sk_buff *msg; 14461 void *hdr; 14462 14463 msg = nlmsg_new(100 + len, gfp); 14464 if (!msg) 14465 return -ENOMEM; 14466 14467 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 14468 if (!hdr) { 14469 nlmsg_free(msg); 14470 return -ENOMEM; 14471 } 14472 14473 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 14474 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 14475 netdev->ifindex)) || 14476 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 14477 NL80211_ATTR_PAD) || 14478 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) || 14479 (sig_dbm && 14480 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) || 14481 nla_put(msg, NL80211_ATTR_FRAME, len, buf) || 14482 (flags && 14483 nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, flags))) 14484 goto nla_put_failure; 14485 14486 genlmsg_end(msg, hdr); 14487 14488 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 14489 14490 nla_put_failure: 14491 nlmsg_free(msg); 14492 return -ENOBUFS; 14493 } 14494 14495 void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie, 14496 const u8 *buf, size_t len, bool ack, gfp_t gfp) 14497 { 14498 struct wiphy *wiphy = wdev->wiphy; 14499 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 14500 struct net_device *netdev = wdev->netdev; 14501 struct sk_buff *msg; 14502 void *hdr; 14503 14504 trace_cfg80211_mgmt_tx_status(wdev, cookie, ack); 14505 14506 msg = nlmsg_new(100 + len, gfp); 14507 if (!msg) 14508 return; 14509 14510 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME_TX_STATUS); 14511 if (!hdr) { 14512 nlmsg_free(msg); 14513 return; 14514 } 14515 14516 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 14517 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 14518 netdev->ifindex)) || 14519 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 14520 NL80211_ATTR_PAD) || 14521 nla_put(msg, NL80211_ATTR_FRAME, len, buf) || 14522 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 14523 NL80211_ATTR_PAD) || 14524 (ack && nla_put_flag(msg, NL80211_ATTR_ACK))) 14525 goto nla_put_failure; 14526 14527 genlmsg_end(msg, hdr); 14528 14529 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14530 NL80211_MCGRP_MLME, gfp); 14531 return; 14532 14533 nla_put_failure: 14534 nlmsg_free(msg); 14535 } 14536 EXPORT_SYMBOL(cfg80211_mgmt_tx_status); 14537 14538 static struct sk_buff *cfg80211_prepare_cqm(struct net_device *dev, 14539 const char *mac, gfp_t gfp) 14540 { 14541 struct wireless_dev *wdev = dev->ieee80211_ptr; 14542 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 14543 struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 14544 void **cb; 14545 14546 if (!msg) 14547 return NULL; 14548 14549 cb = (void **)msg->cb; 14550 14551 cb[0] = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM); 14552 if (!cb[0]) { 14553 nlmsg_free(msg); 14554 return NULL; 14555 } 14556 14557 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 14558 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 14559 goto nla_put_failure; 14560 14561 if (mac && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac)) 14562 goto nla_put_failure; 14563 14564 cb[1] = nla_nest_start(msg, NL80211_ATTR_CQM); 14565 if (!cb[1]) 14566 goto nla_put_failure; 14567 14568 cb[2] = rdev; 14569 14570 return msg; 14571 nla_put_failure: 14572 nlmsg_free(msg); 14573 return NULL; 14574 } 14575 14576 static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp) 14577 { 14578 void **cb = (void **)msg->cb; 14579 struct cfg80211_registered_device *rdev = cb[2]; 14580 14581 nla_nest_end(msg, cb[1]); 14582 genlmsg_end(msg, cb[0]); 14583 14584 memset(msg->cb, 0, sizeof(msg->cb)); 14585 14586 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14587 NL80211_MCGRP_MLME, gfp); 14588 } 14589 14590 void cfg80211_cqm_rssi_notify(struct net_device *dev, 14591 enum nl80211_cqm_rssi_threshold_event rssi_event, 14592 s32 rssi_level, gfp_t gfp) 14593 { 14594 struct sk_buff *msg; 14595 struct wireless_dev *wdev = dev->ieee80211_ptr; 14596 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 14597 14598 trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level); 14599 14600 if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW && 14601 rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH)) 14602 return; 14603 14604 if (wdev->cqm_config) { 14605 wdev->cqm_config->last_rssi_event_value = rssi_level; 14606 14607 cfg80211_cqm_rssi_update(rdev, dev); 14608 14609 if (rssi_level == 0) 14610 rssi_level = wdev->cqm_config->last_rssi_event_value; 14611 } 14612 14613 msg = cfg80211_prepare_cqm(dev, NULL, gfp); 14614 if (!msg) 14615 return; 14616 14617 if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT, 14618 rssi_event)) 14619 goto nla_put_failure; 14620 14621 if (rssi_level && nla_put_s32(msg, NL80211_ATTR_CQM_RSSI_LEVEL, 14622 rssi_level)) 14623 goto nla_put_failure; 14624 14625 cfg80211_send_cqm(msg, gfp); 14626 14627 return; 14628 14629 nla_put_failure: 14630 nlmsg_free(msg); 14631 } 14632 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify); 14633 14634 void cfg80211_cqm_txe_notify(struct net_device *dev, 14635 const u8 *peer, u32 num_packets, 14636 u32 rate, u32 intvl, gfp_t gfp) 14637 { 14638 struct sk_buff *msg; 14639 14640 msg = cfg80211_prepare_cqm(dev, peer, gfp); 14641 if (!msg) 14642 return; 14643 14644 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets)) 14645 goto nla_put_failure; 14646 14647 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate)) 14648 goto nla_put_failure; 14649 14650 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl)) 14651 goto nla_put_failure; 14652 14653 cfg80211_send_cqm(msg, gfp); 14654 return; 14655 14656 nla_put_failure: 14657 nlmsg_free(msg); 14658 } 14659 EXPORT_SYMBOL(cfg80211_cqm_txe_notify); 14660 14661 void cfg80211_cqm_pktloss_notify(struct net_device *dev, 14662 const u8 *peer, u32 num_packets, gfp_t gfp) 14663 { 14664 struct sk_buff *msg; 14665 14666 trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets); 14667 14668 msg = cfg80211_prepare_cqm(dev, peer, gfp); 14669 if (!msg) 14670 return; 14671 14672 if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets)) 14673 goto nla_put_failure; 14674 14675 cfg80211_send_cqm(msg, gfp); 14676 return; 14677 14678 nla_put_failure: 14679 nlmsg_free(msg); 14680 } 14681 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify); 14682 14683 void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp) 14684 { 14685 struct sk_buff *msg; 14686 14687 msg = cfg80211_prepare_cqm(dev, NULL, gfp); 14688 if (!msg) 14689 return; 14690 14691 if (nla_put_flag(msg, NL80211_ATTR_CQM_BEACON_LOSS_EVENT)) 14692 goto nla_put_failure; 14693 14694 cfg80211_send_cqm(msg, gfp); 14695 return; 14696 14697 nla_put_failure: 14698 nlmsg_free(msg); 14699 } 14700 EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify); 14701 14702 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev, 14703 struct net_device *netdev, const u8 *bssid, 14704 const u8 *replay_ctr, gfp_t gfp) 14705 { 14706 struct sk_buff *msg; 14707 struct nlattr *rekey_attr; 14708 void *hdr; 14709 14710 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 14711 if (!msg) 14712 return; 14713 14714 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD); 14715 if (!hdr) { 14716 nlmsg_free(msg); 14717 return; 14718 } 14719 14720 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 14721 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 14722 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 14723 goto nla_put_failure; 14724 14725 rekey_attr = nla_nest_start(msg, NL80211_ATTR_REKEY_DATA); 14726 if (!rekey_attr) 14727 goto nla_put_failure; 14728 14729 if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR, 14730 NL80211_REPLAY_CTR_LEN, replay_ctr)) 14731 goto nla_put_failure; 14732 14733 nla_nest_end(msg, rekey_attr); 14734 14735 genlmsg_end(msg, hdr); 14736 14737 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14738 NL80211_MCGRP_MLME, gfp); 14739 return; 14740 14741 nla_put_failure: 14742 nlmsg_free(msg); 14743 } 14744 14745 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid, 14746 const u8 *replay_ctr, gfp_t gfp) 14747 { 14748 struct wireless_dev *wdev = dev->ieee80211_ptr; 14749 struct wiphy *wiphy = wdev->wiphy; 14750 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 14751 14752 trace_cfg80211_gtk_rekey_notify(dev, bssid); 14753 nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp); 14754 } 14755 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify); 14756 14757 static void 14758 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev, 14759 struct net_device *netdev, int index, 14760 const u8 *bssid, bool preauth, gfp_t gfp) 14761 { 14762 struct sk_buff *msg; 14763 struct nlattr *attr; 14764 void *hdr; 14765 14766 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 14767 if (!msg) 14768 return; 14769 14770 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE); 14771 if (!hdr) { 14772 nlmsg_free(msg); 14773 return; 14774 } 14775 14776 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 14777 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 14778 goto nla_put_failure; 14779 14780 attr = nla_nest_start(msg, NL80211_ATTR_PMKSA_CANDIDATE); 14781 if (!attr) 14782 goto nla_put_failure; 14783 14784 if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) || 14785 nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) || 14786 (preauth && 14787 nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH))) 14788 goto nla_put_failure; 14789 14790 nla_nest_end(msg, attr); 14791 14792 genlmsg_end(msg, hdr); 14793 14794 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14795 NL80211_MCGRP_MLME, gfp); 14796 return; 14797 14798 nla_put_failure: 14799 nlmsg_free(msg); 14800 } 14801 14802 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index, 14803 const u8 *bssid, bool preauth, gfp_t gfp) 14804 { 14805 struct wireless_dev *wdev = dev->ieee80211_ptr; 14806 struct wiphy *wiphy = wdev->wiphy; 14807 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 14808 14809 trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth); 14810 nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp); 14811 } 14812 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify); 14813 14814 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev, 14815 struct net_device *netdev, 14816 struct cfg80211_chan_def *chandef, 14817 gfp_t gfp, 14818 enum nl80211_commands notif, 14819 u8 count) 14820 { 14821 struct sk_buff *msg; 14822 void *hdr; 14823 14824 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 14825 if (!msg) 14826 return; 14827 14828 hdr = nl80211hdr_put(msg, 0, 0, 0, notif); 14829 if (!hdr) { 14830 nlmsg_free(msg); 14831 return; 14832 } 14833 14834 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 14835 goto nla_put_failure; 14836 14837 if (nl80211_send_chandef(msg, chandef)) 14838 goto nla_put_failure; 14839 14840 if ((notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) && 14841 (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count))) 14842 goto nla_put_failure; 14843 14844 genlmsg_end(msg, hdr); 14845 14846 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14847 NL80211_MCGRP_MLME, gfp); 14848 return; 14849 14850 nla_put_failure: 14851 nlmsg_free(msg); 14852 } 14853 14854 void cfg80211_ch_switch_notify(struct net_device *dev, 14855 struct cfg80211_chan_def *chandef) 14856 { 14857 struct wireless_dev *wdev = dev->ieee80211_ptr; 14858 struct wiphy *wiphy = wdev->wiphy; 14859 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 14860 14861 ASSERT_WDEV_LOCK(wdev); 14862 14863 trace_cfg80211_ch_switch_notify(dev, chandef); 14864 14865 wdev->chandef = *chandef; 14866 wdev->preset_chandef = *chandef; 14867 nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL, 14868 NL80211_CMD_CH_SWITCH_NOTIFY, 0); 14869 } 14870 EXPORT_SYMBOL(cfg80211_ch_switch_notify); 14871 14872 void cfg80211_ch_switch_started_notify(struct net_device *dev, 14873 struct cfg80211_chan_def *chandef, 14874 u8 count) 14875 { 14876 struct wireless_dev *wdev = dev->ieee80211_ptr; 14877 struct wiphy *wiphy = wdev->wiphy; 14878 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 14879 14880 trace_cfg80211_ch_switch_started_notify(dev, chandef); 14881 14882 nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL, 14883 NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, count); 14884 } 14885 EXPORT_SYMBOL(cfg80211_ch_switch_started_notify); 14886 14887 void 14888 nl80211_radar_notify(struct cfg80211_registered_device *rdev, 14889 const struct cfg80211_chan_def *chandef, 14890 enum nl80211_radar_event event, 14891 struct net_device *netdev, gfp_t gfp) 14892 { 14893 struct sk_buff *msg; 14894 void *hdr; 14895 14896 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 14897 if (!msg) 14898 return; 14899 14900 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT); 14901 if (!hdr) { 14902 nlmsg_free(msg); 14903 return; 14904 } 14905 14906 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 14907 goto nla_put_failure; 14908 14909 /* NOP and radar events don't need a netdev parameter */ 14910 if (netdev) { 14911 struct wireless_dev *wdev = netdev->ieee80211_ptr; 14912 14913 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 14914 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 14915 NL80211_ATTR_PAD)) 14916 goto nla_put_failure; 14917 } 14918 14919 if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event)) 14920 goto nla_put_failure; 14921 14922 if (nl80211_send_chandef(msg, chandef)) 14923 goto nla_put_failure; 14924 14925 genlmsg_end(msg, hdr); 14926 14927 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14928 NL80211_MCGRP_MLME, gfp); 14929 return; 14930 14931 nla_put_failure: 14932 nlmsg_free(msg); 14933 } 14934 14935 void cfg80211_sta_opmode_change_notify(struct net_device *dev, const u8 *mac, 14936 struct sta_opmode_info *sta_opmode, 14937 gfp_t gfp) 14938 { 14939 struct sk_buff *msg; 14940 struct wireless_dev *wdev = dev->ieee80211_ptr; 14941 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 14942 void *hdr; 14943 14944 if (WARN_ON(!mac)) 14945 return; 14946 14947 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 14948 if (!msg) 14949 return; 14950 14951 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STA_OPMODE_CHANGED); 14952 if (!hdr) { 14953 nlmsg_free(msg); 14954 return; 14955 } 14956 14957 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 14958 goto nla_put_failure; 14959 14960 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 14961 goto nla_put_failure; 14962 14963 if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac)) 14964 goto nla_put_failure; 14965 14966 if ((sta_opmode->changed & STA_OPMODE_SMPS_MODE_CHANGED) && 14967 nla_put_u8(msg, NL80211_ATTR_SMPS_MODE, sta_opmode->smps_mode)) 14968 goto nla_put_failure; 14969 14970 if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && 14971 nla_put_u8(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) 14972 goto nla_put_failure; 14973 14974 if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && 14975 nla_put_u8(msg, NL80211_ATTR_NSS, sta_opmode->rx_nss)) 14976 goto nla_put_failure; 14977 14978 genlmsg_end(msg, hdr); 14979 14980 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 14981 NL80211_MCGRP_MLME, gfp); 14982 14983 return; 14984 14985 nla_put_failure: 14986 nlmsg_free(msg); 14987 } 14988 EXPORT_SYMBOL(cfg80211_sta_opmode_change_notify); 14989 14990 void cfg80211_probe_status(struct net_device *dev, const u8 *addr, 14991 u64 cookie, bool acked, s32 ack_signal, 14992 bool is_valid_ack_signal, gfp_t gfp) 14993 { 14994 struct wireless_dev *wdev = dev->ieee80211_ptr; 14995 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 14996 struct sk_buff *msg; 14997 void *hdr; 14998 14999 trace_cfg80211_probe_status(dev, addr, cookie, acked); 15000 15001 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 15002 15003 if (!msg) 15004 return; 15005 15006 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_CLIENT); 15007 if (!hdr) { 15008 nlmsg_free(msg); 15009 return; 15010 } 15011 15012 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15013 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 15014 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 15015 nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie, 15016 NL80211_ATTR_PAD) || 15017 (acked && nla_put_flag(msg, NL80211_ATTR_ACK)) || 15018 (is_valid_ack_signal && nla_put_s32(msg, NL80211_ATTR_ACK_SIGNAL, 15019 ack_signal))) 15020 goto nla_put_failure; 15021 15022 genlmsg_end(msg, hdr); 15023 15024 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15025 NL80211_MCGRP_MLME, gfp); 15026 return; 15027 15028 nla_put_failure: 15029 nlmsg_free(msg); 15030 } 15031 EXPORT_SYMBOL(cfg80211_probe_status); 15032 15033 void cfg80211_report_obss_beacon(struct wiphy *wiphy, 15034 const u8 *frame, size_t len, 15035 int freq, int sig_dbm) 15036 { 15037 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 15038 struct sk_buff *msg; 15039 void *hdr; 15040 struct cfg80211_beacon_registration *reg; 15041 15042 trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm); 15043 15044 spin_lock_bh(&rdev->beacon_registrations_lock); 15045 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 15046 msg = nlmsg_new(len + 100, GFP_ATOMIC); 15047 if (!msg) { 15048 spin_unlock_bh(&rdev->beacon_registrations_lock); 15049 return; 15050 } 15051 15052 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 15053 if (!hdr) 15054 goto nla_put_failure; 15055 15056 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15057 (freq && 15058 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq)) || 15059 (sig_dbm && 15060 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) || 15061 nla_put(msg, NL80211_ATTR_FRAME, len, frame)) 15062 goto nla_put_failure; 15063 15064 genlmsg_end(msg, hdr); 15065 15066 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); 15067 } 15068 spin_unlock_bh(&rdev->beacon_registrations_lock); 15069 return; 15070 15071 nla_put_failure: 15072 spin_unlock_bh(&rdev->beacon_registrations_lock); 15073 nlmsg_free(msg); 15074 } 15075 EXPORT_SYMBOL(cfg80211_report_obss_beacon); 15076 15077 #ifdef CONFIG_PM 15078 static int cfg80211_net_detect_results(struct sk_buff *msg, 15079 struct cfg80211_wowlan_wakeup *wakeup) 15080 { 15081 struct cfg80211_wowlan_nd_info *nd = wakeup->net_detect; 15082 struct nlattr *nl_results, *nl_match, *nl_freqs; 15083 int i, j; 15084 15085 nl_results = nla_nest_start( 15086 msg, NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS); 15087 if (!nl_results) 15088 return -EMSGSIZE; 15089 15090 for (i = 0; i < nd->n_matches; i++) { 15091 struct cfg80211_wowlan_nd_match *match = nd->matches[i]; 15092 15093 nl_match = nla_nest_start(msg, i); 15094 if (!nl_match) 15095 break; 15096 15097 /* The SSID attribute is optional in nl80211, but for 15098 * simplicity reasons it's always present in the 15099 * cfg80211 structure. If a driver can't pass the 15100 * SSID, that needs to be changed. A zero length SSID 15101 * is still a valid SSID (wildcard), so it cannot be 15102 * used for this purpose. 15103 */ 15104 if (nla_put(msg, NL80211_ATTR_SSID, match->ssid.ssid_len, 15105 match->ssid.ssid)) { 15106 nla_nest_cancel(msg, nl_match); 15107 goto out; 15108 } 15109 15110 if (match->n_channels) { 15111 nl_freqs = nla_nest_start( 15112 msg, NL80211_ATTR_SCAN_FREQUENCIES); 15113 if (!nl_freqs) { 15114 nla_nest_cancel(msg, nl_match); 15115 goto out; 15116 } 15117 15118 for (j = 0; j < match->n_channels; j++) { 15119 if (nla_put_u32(msg, j, match->channels[j])) { 15120 nla_nest_cancel(msg, nl_freqs); 15121 nla_nest_cancel(msg, nl_match); 15122 goto out; 15123 } 15124 } 15125 15126 nla_nest_end(msg, nl_freqs); 15127 } 15128 15129 nla_nest_end(msg, nl_match); 15130 } 15131 15132 out: 15133 nla_nest_end(msg, nl_results); 15134 return 0; 15135 } 15136 15137 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev, 15138 struct cfg80211_wowlan_wakeup *wakeup, 15139 gfp_t gfp) 15140 { 15141 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 15142 struct sk_buff *msg; 15143 void *hdr; 15144 int size = 200; 15145 15146 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); 15147 15148 if (wakeup) 15149 size += wakeup->packet_present_len; 15150 15151 msg = nlmsg_new(size, gfp); 15152 if (!msg) 15153 return; 15154 15155 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN); 15156 if (!hdr) 15157 goto free_msg; 15158 15159 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15160 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 15161 NL80211_ATTR_PAD)) 15162 goto free_msg; 15163 15164 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 15165 wdev->netdev->ifindex)) 15166 goto free_msg; 15167 15168 if (wakeup) { 15169 struct nlattr *reasons; 15170 15171 reasons = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS); 15172 if (!reasons) 15173 goto free_msg; 15174 15175 if (wakeup->disconnect && 15176 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) 15177 goto free_msg; 15178 if (wakeup->magic_pkt && 15179 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) 15180 goto free_msg; 15181 if (wakeup->gtk_rekey_failure && 15182 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) 15183 goto free_msg; 15184 if (wakeup->eap_identity_req && 15185 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) 15186 goto free_msg; 15187 if (wakeup->four_way_handshake && 15188 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) 15189 goto free_msg; 15190 if (wakeup->rfkill_release && 15191 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)) 15192 goto free_msg; 15193 15194 if (wakeup->pattern_idx >= 0 && 15195 nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN, 15196 wakeup->pattern_idx)) 15197 goto free_msg; 15198 15199 if (wakeup->tcp_match && 15200 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH)) 15201 goto free_msg; 15202 15203 if (wakeup->tcp_connlost && 15204 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST)) 15205 goto free_msg; 15206 15207 if (wakeup->tcp_nomoretokens && 15208 nla_put_flag(msg, 15209 NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS)) 15210 goto free_msg; 15211 15212 if (wakeup->packet) { 15213 u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211; 15214 u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN; 15215 15216 if (!wakeup->packet_80211) { 15217 pkt_attr = 15218 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023; 15219 len_attr = 15220 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN; 15221 } 15222 15223 if (wakeup->packet_len && 15224 nla_put_u32(msg, len_attr, wakeup->packet_len)) 15225 goto free_msg; 15226 15227 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, 15228 wakeup->packet)) 15229 goto free_msg; 15230 } 15231 15232 if (wakeup->net_detect && 15233 cfg80211_net_detect_results(msg, wakeup)) 15234 goto free_msg; 15235 15236 nla_nest_end(msg, reasons); 15237 } 15238 15239 genlmsg_end(msg, hdr); 15240 15241 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15242 NL80211_MCGRP_MLME, gfp); 15243 return; 15244 15245 free_msg: 15246 nlmsg_free(msg); 15247 } 15248 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup); 15249 #endif 15250 15251 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer, 15252 enum nl80211_tdls_operation oper, 15253 u16 reason_code, gfp_t gfp) 15254 { 15255 struct wireless_dev *wdev = dev->ieee80211_ptr; 15256 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 15257 struct sk_buff *msg; 15258 void *hdr; 15259 15260 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, 15261 reason_code); 15262 15263 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 15264 if (!msg) 15265 return; 15266 15267 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER); 15268 if (!hdr) { 15269 nlmsg_free(msg); 15270 return; 15271 } 15272 15273 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15274 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 15275 nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) || 15276 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) || 15277 (reason_code > 0 && 15278 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code))) 15279 goto nla_put_failure; 15280 15281 genlmsg_end(msg, hdr); 15282 15283 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15284 NL80211_MCGRP_MLME, gfp); 15285 return; 15286 15287 nla_put_failure: 15288 nlmsg_free(msg); 15289 } 15290 EXPORT_SYMBOL(cfg80211_tdls_oper_request); 15291 15292 static int nl80211_netlink_notify(struct notifier_block * nb, 15293 unsigned long state, 15294 void *_notify) 15295 { 15296 struct netlink_notify *notify = _notify; 15297 struct cfg80211_registered_device *rdev; 15298 struct wireless_dev *wdev; 15299 struct cfg80211_beacon_registration *reg, *tmp; 15300 15301 if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC) 15302 return NOTIFY_DONE; 15303 15304 rcu_read_lock(); 15305 15306 list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) { 15307 struct cfg80211_sched_scan_request *sched_scan_req; 15308 15309 list_for_each_entry_rcu(sched_scan_req, 15310 &rdev->sched_scan_req_list, 15311 list) { 15312 if (sched_scan_req->owner_nlportid == notify->portid) { 15313 sched_scan_req->nl_owner_dead = true; 15314 schedule_work(&rdev->sched_scan_stop_wk); 15315 } 15316 } 15317 15318 list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) { 15319 cfg80211_mlme_unregister_socket(wdev, notify->portid); 15320 15321 if (wdev->owner_nlportid == notify->portid) { 15322 wdev->nl_owner_dead = true; 15323 schedule_work(&rdev->destroy_work); 15324 } else if (wdev->conn_owner_nlportid == notify->portid) { 15325 schedule_work(&wdev->disconnect_wk); 15326 } 15327 } 15328 15329 spin_lock_bh(&rdev->beacon_registrations_lock); 15330 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, 15331 list) { 15332 if (reg->nlportid == notify->portid) { 15333 list_del(®->list); 15334 kfree(reg); 15335 break; 15336 } 15337 } 15338 spin_unlock_bh(&rdev->beacon_registrations_lock); 15339 } 15340 15341 rcu_read_unlock(); 15342 15343 /* 15344 * It is possible that the user space process that is controlling the 15345 * indoor setting disappeared, so notify the regulatory core. 15346 */ 15347 regulatory_netlink_notify(notify->portid); 15348 return NOTIFY_OK; 15349 } 15350 15351 static struct notifier_block nl80211_netlink_notifier = { 15352 .notifier_call = nl80211_netlink_notify, 15353 }; 15354 15355 void cfg80211_ft_event(struct net_device *netdev, 15356 struct cfg80211_ft_event_params *ft_event) 15357 { 15358 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; 15359 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 15360 struct sk_buff *msg; 15361 void *hdr; 15362 15363 trace_cfg80211_ft_event(wiphy, netdev, ft_event); 15364 15365 if (!ft_event->target_ap) 15366 return; 15367 15368 msg = nlmsg_new(100 + ft_event->ric_ies_len, GFP_KERNEL); 15369 if (!msg) 15370 return; 15371 15372 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT); 15373 if (!hdr) 15374 goto out; 15375 15376 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15377 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 15378 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) 15379 goto out; 15380 15381 if (ft_event->ies && 15382 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) 15383 goto out; 15384 if (ft_event->ric_ies && 15385 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, 15386 ft_event->ric_ies)) 15387 goto out; 15388 15389 genlmsg_end(msg, hdr); 15390 15391 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 15392 NL80211_MCGRP_MLME, GFP_KERNEL); 15393 return; 15394 out: 15395 nlmsg_free(msg); 15396 } 15397 EXPORT_SYMBOL(cfg80211_ft_event); 15398 15399 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp) 15400 { 15401 struct cfg80211_registered_device *rdev; 15402 struct sk_buff *msg; 15403 void *hdr; 15404 u32 nlportid; 15405 15406 rdev = wiphy_to_rdev(wdev->wiphy); 15407 if (!rdev->crit_proto_nlportid) 15408 return; 15409 15410 nlportid = rdev->crit_proto_nlportid; 15411 rdev->crit_proto_nlportid = 0; 15412 15413 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 15414 if (!msg) 15415 return; 15416 15417 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP); 15418 if (!hdr) 15419 goto nla_put_failure; 15420 15421 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15422 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 15423 NL80211_ATTR_PAD)) 15424 goto nla_put_failure; 15425 15426 genlmsg_end(msg, hdr); 15427 15428 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 15429 return; 15430 15431 nla_put_failure: 15432 nlmsg_free(msg); 15433 } 15434 EXPORT_SYMBOL(cfg80211_crit_proto_stopped); 15435 15436 void nl80211_send_ap_stopped(struct wireless_dev *wdev) 15437 { 15438 struct wiphy *wiphy = wdev->wiphy; 15439 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 15440 struct sk_buff *msg; 15441 void *hdr; 15442 15443 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 15444 if (!msg) 15445 return; 15446 15447 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP); 15448 if (!hdr) 15449 goto out; 15450 15451 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15452 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) || 15453 nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev), 15454 NL80211_ATTR_PAD)) 15455 goto out; 15456 15457 genlmsg_end(msg, hdr); 15458 15459 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0, 15460 NL80211_MCGRP_MLME, GFP_KERNEL); 15461 return; 15462 out: 15463 nlmsg_free(msg); 15464 } 15465 15466 int cfg80211_external_auth_request(struct net_device *dev, 15467 struct cfg80211_external_auth_params *params, 15468 gfp_t gfp) 15469 { 15470 struct wireless_dev *wdev = dev->ieee80211_ptr; 15471 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 15472 struct sk_buff *msg; 15473 void *hdr; 15474 15475 if (!wdev->conn_owner_nlportid) 15476 return -EINVAL; 15477 15478 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 15479 if (!msg) 15480 return -ENOMEM; 15481 15482 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_EXTERNAL_AUTH); 15483 if (!hdr) 15484 goto nla_put_failure; 15485 15486 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 15487 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 15488 nla_put_u32(msg, NL80211_ATTR_AKM_SUITES, params->key_mgmt_suite) || 15489 nla_put_u32(msg, NL80211_ATTR_EXTERNAL_AUTH_ACTION, 15490 params->action) || 15491 nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid) || 15492 nla_put(msg, NL80211_ATTR_SSID, params->ssid.ssid_len, 15493 params->ssid.ssid)) 15494 goto nla_put_failure; 15495 15496 genlmsg_end(msg, hdr); 15497 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, 15498 wdev->conn_owner_nlportid); 15499 return 0; 15500 15501 nla_put_failure: 15502 nlmsg_free(msg); 15503 return -ENOBUFS; 15504 } 15505 EXPORT_SYMBOL(cfg80211_external_auth_request); 15506 15507 /* initialisation/exit functions */ 15508 15509 int __init nl80211_init(void) 15510 { 15511 int err; 15512 15513 err = genl_register_family(&nl80211_fam); 15514 if (err) 15515 return err; 15516 15517 err = netlink_register_notifier(&nl80211_netlink_notifier); 15518 if (err) 15519 goto err_out; 15520 15521 return 0; 15522 err_out: 15523 genl_unregister_family(&nl80211_fam); 15524 return err; 15525 } 15526 15527 void nl80211_exit(void) 15528 { 15529 netlink_unregister_notifier(&nl80211_netlink_notifier); 15530 genl_unregister_family(&nl80211_fam); 15531 } 15532