1 /* 2 * This is the new netlink-based wireless configuration interface. 3 * 4 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net> 5 */ 6 7 #include <linux/if.h> 8 #include <linux/module.h> 9 #include <linux/err.h> 10 #include <linux/slab.h> 11 #include <linux/list.h> 12 #include <linux/if_ether.h> 13 #include <linux/ieee80211.h> 14 #include <linux/nl80211.h> 15 #include <linux/rtnetlink.h> 16 #include <linux/netlink.h> 17 #include <linux/etherdevice.h> 18 #include <net/net_namespace.h> 19 #include <net/genetlink.h> 20 #include <net/cfg80211.h> 21 #include <net/sock.h> 22 #include <net/inet_connection_sock.h> 23 #include "core.h" 24 #include "nl80211.h" 25 #include "reg.h" 26 #include "rdev-ops.h" 27 28 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, 29 struct genl_info *info, 30 struct cfg80211_crypto_settings *settings, 31 int cipher_limit); 32 33 static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, 34 struct genl_info *info); 35 static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb, 36 struct genl_info *info); 37 38 /* the netlink family */ 39 static struct genl_family nl80211_fam = { 40 .id = GENL_ID_GENERATE, /* don't bother with a hardcoded ID */ 41 .name = NL80211_GENL_NAME, /* have users key off the name instead */ 42 .hdrsize = 0, /* no private header */ 43 .version = 1, /* no particular meaning now */ 44 .maxattr = NL80211_ATTR_MAX, 45 .netnsok = true, 46 .pre_doit = nl80211_pre_doit, 47 .post_doit = nl80211_post_doit, 48 }; 49 50 /* multicast groups */ 51 enum nl80211_multicast_groups { 52 NL80211_MCGRP_CONFIG, 53 NL80211_MCGRP_SCAN, 54 NL80211_MCGRP_REGULATORY, 55 NL80211_MCGRP_MLME, 56 NL80211_MCGRP_TESTMODE /* keep last - ifdef! */ 57 }; 58 59 static const struct genl_multicast_group nl80211_mcgrps[] = { 60 [NL80211_MCGRP_CONFIG] = { .name = "config", }, 61 [NL80211_MCGRP_SCAN] = { .name = "scan", }, 62 [NL80211_MCGRP_REGULATORY] = { .name = "regulatory", }, 63 [NL80211_MCGRP_MLME] = { .name = "mlme", }, 64 #ifdef CONFIG_NL80211_TESTMODE 65 [NL80211_MCGRP_TESTMODE] = { .name = "testmode", } 66 #endif 67 }; 68 69 /* returns ERR_PTR values */ 70 static struct wireless_dev * 71 __cfg80211_wdev_from_attrs(struct net *netns, struct nlattr **attrs) 72 { 73 struct cfg80211_registered_device *rdev; 74 struct wireless_dev *result = NULL; 75 bool have_ifidx = attrs[NL80211_ATTR_IFINDEX]; 76 bool have_wdev_id = attrs[NL80211_ATTR_WDEV]; 77 u64 wdev_id; 78 int wiphy_idx = -1; 79 int ifidx = -1; 80 81 ASSERT_RTNL(); 82 83 if (!have_ifidx && !have_wdev_id) 84 return ERR_PTR(-EINVAL); 85 86 if (have_ifidx) 87 ifidx = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]); 88 if (have_wdev_id) { 89 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]); 90 wiphy_idx = wdev_id >> 32; 91 } 92 93 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 94 struct wireless_dev *wdev; 95 96 if (wiphy_net(&rdev->wiphy) != netns) 97 continue; 98 99 if (have_wdev_id && rdev->wiphy_idx != wiphy_idx) 100 continue; 101 102 list_for_each_entry(wdev, &rdev->wdev_list, list) { 103 if (have_ifidx && wdev->netdev && 104 wdev->netdev->ifindex == ifidx) { 105 result = wdev; 106 break; 107 } 108 if (have_wdev_id && wdev->identifier == (u32)wdev_id) { 109 result = wdev; 110 break; 111 } 112 } 113 114 if (result) 115 break; 116 } 117 118 if (result) 119 return result; 120 return ERR_PTR(-ENODEV); 121 } 122 123 static struct cfg80211_registered_device * 124 __cfg80211_rdev_from_attrs(struct net *netns, struct nlattr **attrs) 125 { 126 struct cfg80211_registered_device *rdev = NULL, *tmp; 127 struct net_device *netdev; 128 129 ASSERT_RTNL(); 130 131 if (!attrs[NL80211_ATTR_WIPHY] && 132 !attrs[NL80211_ATTR_IFINDEX] && 133 !attrs[NL80211_ATTR_WDEV]) 134 return ERR_PTR(-EINVAL); 135 136 if (attrs[NL80211_ATTR_WIPHY]) 137 rdev = cfg80211_rdev_by_wiphy_idx( 138 nla_get_u32(attrs[NL80211_ATTR_WIPHY])); 139 140 if (attrs[NL80211_ATTR_WDEV]) { 141 u64 wdev_id = nla_get_u64(attrs[NL80211_ATTR_WDEV]); 142 struct wireless_dev *wdev; 143 bool found = false; 144 145 tmp = cfg80211_rdev_by_wiphy_idx(wdev_id >> 32); 146 if (tmp) { 147 /* make sure wdev exists */ 148 list_for_each_entry(wdev, &tmp->wdev_list, list) { 149 if (wdev->identifier != (u32)wdev_id) 150 continue; 151 found = true; 152 break; 153 } 154 155 if (!found) 156 tmp = NULL; 157 158 if (rdev && tmp != rdev) 159 return ERR_PTR(-EINVAL); 160 rdev = tmp; 161 } 162 } 163 164 if (attrs[NL80211_ATTR_IFINDEX]) { 165 int ifindex = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]); 166 netdev = dev_get_by_index(netns, ifindex); 167 if (netdev) { 168 if (netdev->ieee80211_ptr) 169 tmp = wiphy_to_dev( 170 netdev->ieee80211_ptr->wiphy); 171 else 172 tmp = NULL; 173 174 dev_put(netdev); 175 176 /* not wireless device -- return error */ 177 if (!tmp) 178 return ERR_PTR(-EINVAL); 179 180 /* mismatch -- return error */ 181 if (rdev && tmp != rdev) 182 return ERR_PTR(-EINVAL); 183 184 rdev = tmp; 185 } 186 } 187 188 if (!rdev) 189 return ERR_PTR(-ENODEV); 190 191 if (netns != wiphy_net(&rdev->wiphy)) 192 return ERR_PTR(-ENODEV); 193 194 return rdev; 195 } 196 197 /* 198 * This function returns a pointer to the driver 199 * that the genl_info item that is passed refers to. 200 * 201 * The result of this can be a PTR_ERR and hence must 202 * be checked with IS_ERR() for errors. 203 */ 204 static struct cfg80211_registered_device * 205 cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info) 206 { 207 return __cfg80211_rdev_from_attrs(netns, info->attrs); 208 } 209 210 /* policy for the attributes */ 211 static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = { 212 [NL80211_ATTR_WIPHY] = { .type = NLA_U32 }, 213 [NL80211_ATTR_WIPHY_NAME] = { .type = NLA_NUL_STRING, 214 .len = 20-1 }, 215 [NL80211_ATTR_WIPHY_TXQ_PARAMS] = { .type = NLA_NESTED }, 216 217 [NL80211_ATTR_WIPHY_FREQ] = { .type = NLA_U32 }, 218 [NL80211_ATTR_WIPHY_CHANNEL_TYPE] = { .type = NLA_U32 }, 219 [NL80211_ATTR_CHANNEL_WIDTH] = { .type = NLA_U32 }, 220 [NL80211_ATTR_CENTER_FREQ1] = { .type = NLA_U32 }, 221 [NL80211_ATTR_CENTER_FREQ2] = { .type = NLA_U32 }, 222 223 [NL80211_ATTR_WIPHY_RETRY_SHORT] = { .type = NLA_U8 }, 224 [NL80211_ATTR_WIPHY_RETRY_LONG] = { .type = NLA_U8 }, 225 [NL80211_ATTR_WIPHY_FRAG_THRESHOLD] = { .type = NLA_U32 }, 226 [NL80211_ATTR_WIPHY_RTS_THRESHOLD] = { .type = NLA_U32 }, 227 [NL80211_ATTR_WIPHY_COVERAGE_CLASS] = { .type = NLA_U8 }, 228 229 [NL80211_ATTR_IFTYPE] = { .type = NLA_U32 }, 230 [NL80211_ATTR_IFINDEX] = { .type = NLA_U32 }, 231 [NL80211_ATTR_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ-1 }, 232 233 [NL80211_ATTR_MAC] = { .len = ETH_ALEN }, 234 [NL80211_ATTR_PREV_BSSID] = { .len = ETH_ALEN }, 235 236 [NL80211_ATTR_KEY] = { .type = NLA_NESTED, }, 237 [NL80211_ATTR_KEY_DATA] = { .type = NLA_BINARY, 238 .len = WLAN_MAX_KEY_LEN }, 239 [NL80211_ATTR_KEY_IDX] = { .type = NLA_U8 }, 240 [NL80211_ATTR_KEY_CIPHER] = { .type = NLA_U32 }, 241 [NL80211_ATTR_KEY_DEFAULT] = { .type = NLA_FLAG }, 242 [NL80211_ATTR_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 }, 243 [NL80211_ATTR_KEY_TYPE] = { .type = NLA_U32 }, 244 245 [NL80211_ATTR_BEACON_INTERVAL] = { .type = NLA_U32 }, 246 [NL80211_ATTR_DTIM_PERIOD] = { .type = NLA_U32 }, 247 [NL80211_ATTR_BEACON_HEAD] = { .type = NLA_BINARY, 248 .len = IEEE80211_MAX_DATA_LEN }, 249 [NL80211_ATTR_BEACON_TAIL] = { .type = NLA_BINARY, 250 .len = IEEE80211_MAX_DATA_LEN }, 251 [NL80211_ATTR_STA_AID] = { .type = NLA_U16 }, 252 [NL80211_ATTR_STA_FLAGS] = { .type = NLA_NESTED }, 253 [NL80211_ATTR_STA_LISTEN_INTERVAL] = { .type = NLA_U16 }, 254 [NL80211_ATTR_STA_SUPPORTED_RATES] = { .type = NLA_BINARY, 255 .len = NL80211_MAX_SUPP_RATES }, 256 [NL80211_ATTR_STA_PLINK_ACTION] = { .type = NLA_U8 }, 257 [NL80211_ATTR_STA_VLAN] = { .type = NLA_U32 }, 258 [NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ }, 259 [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY, 260 .len = IEEE80211_MAX_MESH_ID_LEN }, 261 [NL80211_ATTR_MPATH_NEXT_HOP] = { .type = NLA_U32 }, 262 263 [NL80211_ATTR_REG_ALPHA2] = { .type = NLA_STRING, .len = 2 }, 264 [NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED }, 265 266 [NL80211_ATTR_BSS_CTS_PROT] = { .type = NLA_U8 }, 267 [NL80211_ATTR_BSS_SHORT_PREAMBLE] = { .type = NLA_U8 }, 268 [NL80211_ATTR_BSS_SHORT_SLOT_TIME] = { .type = NLA_U8 }, 269 [NL80211_ATTR_BSS_BASIC_RATES] = { .type = NLA_BINARY, 270 .len = NL80211_MAX_SUPP_RATES }, 271 [NL80211_ATTR_BSS_HT_OPMODE] = { .type = NLA_U16 }, 272 273 [NL80211_ATTR_MESH_CONFIG] = { .type = NLA_NESTED }, 274 [NL80211_ATTR_SUPPORT_MESH_AUTH] = { .type = NLA_FLAG }, 275 276 [NL80211_ATTR_HT_CAPABILITY] = { .len = NL80211_HT_CAPABILITY_LEN }, 277 278 [NL80211_ATTR_MGMT_SUBTYPE] = { .type = NLA_U8 }, 279 [NL80211_ATTR_IE] = { .type = NLA_BINARY, 280 .len = IEEE80211_MAX_DATA_LEN }, 281 [NL80211_ATTR_SCAN_FREQUENCIES] = { .type = NLA_NESTED }, 282 [NL80211_ATTR_SCAN_SSIDS] = { .type = NLA_NESTED }, 283 284 [NL80211_ATTR_SSID] = { .type = NLA_BINARY, 285 .len = IEEE80211_MAX_SSID_LEN }, 286 [NL80211_ATTR_AUTH_TYPE] = { .type = NLA_U32 }, 287 [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 }, 288 [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG }, 289 [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG }, 290 [NL80211_ATTR_USE_MFP] = { .type = NLA_U32 }, 291 [NL80211_ATTR_STA_FLAGS2] = { 292 .len = sizeof(struct nl80211_sta_flag_update), 293 }, 294 [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG }, 295 [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 }, 296 [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG }, 297 [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG }, 298 [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 }, 299 [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 }, 300 [NL80211_ATTR_PID] = { .type = NLA_U32 }, 301 [NL80211_ATTR_4ADDR] = { .type = NLA_U8 }, 302 [NL80211_ATTR_PMKID] = { .type = NLA_BINARY, 303 .len = WLAN_PMKID_LEN }, 304 [NL80211_ATTR_DURATION] = { .type = NLA_U32 }, 305 [NL80211_ATTR_COOKIE] = { .type = NLA_U64 }, 306 [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED }, 307 [NL80211_ATTR_FRAME] = { .type = NLA_BINARY, 308 .len = IEEE80211_MAX_DATA_LEN }, 309 [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, }, 310 [NL80211_ATTR_PS_STATE] = { .type = NLA_U32 }, 311 [NL80211_ATTR_CQM] = { .type = NLA_NESTED, }, 312 [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG }, 313 [NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 }, 314 [NL80211_ATTR_WIPHY_TX_POWER_SETTING] = { .type = NLA_U32 }, 315 [NL80211_ATTR_WIPHY_TX_POWER_LEVEL] = { .type = NLA_U32 }, 316 [NL80211_ATTR_FRAME_TYPE] = { .type = NLA_U16 }, 317 [NL80211_ATTR_WIPHY_ANTENNA_TX] = { .type = NLA_U32 }, 318 [NL80211_ATTR_WIPHY_ANTENNA_RX] = { .type = NLA_U32 }, 319 [NL80211_ATTR_MCAST_RATE] = { .type = NLA_U32 }, 320 [NL80211_ATTR_OFFCHANNEL_TX_OK] = { .type = NLA_FLAG }, 321 [NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED }, 322 [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED }, 323 [NL80211_ATTR_STA_PLINK_STATE] = { .type = NLA_U8 }, 324 [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 }, 325 [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED }, 326 [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED }, 327 [NL80211_ATTR_HIDDEN_SSID] = { .type = NLA_U32 }, 328 [NL80211_ATTR_IE_PROBE_RESP] = { .type = NLA_BINARY, 329 .len = IEEE80211_MAX_DATA_LEN }, 330 [NL80211_ATTR_IE_ASSOC_RESP] = { .type = NLA_BINARY, 331 .len = IEEE80211_MAX_DATA_LEN }, 332 [NL80211_ATTR_ROAM_SUPPORT] = { .type = NLA_FLAG }, 333 [NL80211_ATTR_SCHED_SCAN_MATCH] = { .type = NLA_NESTED }, 334 [NL80211_ATTR_TX_NO_CCK_RATE] = { .type = NLA_FLAG }, 335 [NL80211_ATTR_TDLS_ACTION] = { .type = NLA_U8 }, 336 [NL80211_ATTR_TDLS_DIALOG_TOKEN] = { .type = NLA_U8 }, 337 [NL80211_ATTR_TDLS_OPERATION] = { .type = NLA_U8 }, 338 [NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG }, 339 [NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG }, 340 [NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG }, 341 [NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY, 342 .len = IEEE80211_MAX_DATA_LEN }, 343 [NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 }, 344 [NL80211_ATTR_DISABLE_HT] = { .type = NLA_FLAG }, 345 [NL80211_ATTR_HT_CAPABILITY_MASK] = { 346 .len = NL80211_HT_CAPABILITY_LEN 347 }, 348 [NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 }, 349 [NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 }, 350 [NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 }, 351 [NL80211_ATTR_WDEV] = { .type = NLA_U64 }, 352 [NL80211_ATTR_USER_REG_HINT_TYPE] = { .type = NLA_U32 }, 353 [NL80211_ATTR_SAE_DATA] = { .type = NLA_BINARY, }, 354 [NL80211_ATTR_VHT_CAPABILITY] = { .len = NL80211_VHT_CAPABILITY_LEN }, 355 [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 }, 356 [NL80211_ATTR_P2P_CTWINDOW] = { .type = NLA_U8 }, 357 [NL80211_ATTR_P2P_OPPPS] = { .type = NLA_U8 }, 358 [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 }, 359 [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED }, 360 [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 }, 361 [NL80211_ATTR_STA_EXT_CAPABILITY] = { .type = NLA_BINARY, }, 362 [NL80211_ATTR_SPLIT_WIPHY_DUMP] = { .type = NLA_FLAG, }, 363 [NL80211_ATTR_DISABLE_VHT] = { .type = NLA_FLAG }, 364 [NL80211_ATTR_VHT_CAPABILITY_MASK] = { 365 .len = NL80211_VHT_CAPABILITY_LEN, 366 }, 367 [NL80211_ATTR_MDID] = { .type = NLA_U16 }, 368 [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY, 369 .len = IEEE80211_MAX_DATA_LEN }, 370 [NL80211_ATTR_PEER_AID] = { .type = NLA_U16 }, 371 [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 }, 372 [NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG }, 373 [NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED }, 374 [NL80211_ATTR_CSA_C_OFF_BEACON] = { .type = NLA_U16 }, 375 [NL80211_ATTR_CSA_C_OFF_PRESP] = { .type = NLA_U16 }, 376 [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = { .type = NLA_BINARY }, 377 [NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = { .type = NLA_BINARY }, 378 [NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG }, 379 }; 380 381 /* policy for the key attributes */ 382 static const struct nla_policy nl80211_key_policy[NL80211_KEY_MAX + 1] = { 383 [NL80211_KEY_DATA] = { .type = NLA_BINARY, .len = WLAN_MAX_KEY_LEN }, 384 [NL80211_KEY_IDX] = { .type = NLA_U8 }, 385 [NL80211_KEY_CIPHER] = { .type = NLA_U32 }, 386 [NL80211_KEY_SEQ] = { .type = NLA_BINARY, .len = 16 }, 387 [NL80211_KEY_DEFAULT] = { .type = NLA_FLAG }, 388 [NL80211_KEY_DEFAULT_MGMT] = { .type = NLA_FLAG }, 389 [NL80211_KEY_TYPE] = { .type = NLA_U32 }, 390 [NL80211_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED }, 391 }; 392 393 /* policy for the key default flags */ 394 static const struct nla_policy 395 nl80211_key_default_policy[NUM_NL80211_KEY_DEFAULT_TYPES] = { 396 [NL80211_KEY_DEFAULT_TYPE_UNICAST] = { .type = NLA_FLAG }, 397 [NL80211_KEY_DEFAULT_TYPE_MULTICAST] = { .type = NLA_FLAG }, 398 }; 399 400 /* policy for WoWLAN attributes */ 401 static const struct nla_policy 402 nl80211_wowlan_policy[NUM_NL80211_WOWLAN_TRIG] = { 403 [NL80211_WOWLAN_TRIG_ANY] = { .type = NLA_FLAG }, 404 [NL80211_WOWLAN_TRIG_DISCONNECT] = { .type = NLA_FLAG }, 405 [NL80211_WOWLAN_TRIG_MAGIC_PKT] = { .type = NLA_FLAG }, 406 [NL80211_WOWLAN_TRIG_PKT_PATTERN] = { .type = NLA_NESTED }, 407 [NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE] = { .type = NLA_FLAG }, 408 [NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST] = { .type = NLA_FLAG }, 409 [NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE] = { .type = NLA_FLAG }, 410 [NL80211_WOWLAN_TRIG_RFKILL_RELEASE] = { .type = NLA_FLAG }, 411 [NL80211_WOWLAN_TRIG_TCP_CONNECTION] = { .type = NLA_NESTED }, 412 }; 413 414 static const struct nla_policy 415 nl80211_wowlan_tcp_policy[NUM_NL80211_WOWLAN_TCP] = { 416 [NL80211_WOWLAN_TCP_SRC_IPV4] = { .type = NLA_U32 }, 417 [NL80211_WOWLAN_TCP_DST_IPV4] = { .type = NLA_U32 }, 418 [NL80211_WOWLAN_TCP_DST_MAC] = { .len = ETH_ALEN }, 419 [NL80211_WOWLAN_TCP_SRC_PORT] = { .type = NLA_U16 }, 420 [NL80211_WOWLAN_TCP_DST_PORT] = { .type = NLA_U16 }, 421 [NL80211_WOWLAN_TCP_DATA_PAYLOAD] = { .len = 1 }, 422 [NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ] = { 423 .len = sizeof(struct nl80211_wowlan_tcp_data_seq) 424 }, 425 [NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN] = { 426 .len = sizeof(struct nl80211_wowlan_tcp_data_token) 427 }, 428 [NL80211_WOWLAN_TCP_DATA_INTERVAL] = { .type = NLA_U32 }, 429 [NL80211_WOWLAN_TCP_WAKE_PAYLOAD] = { .len = 1 }, 430 [NL80211_WOWLAN_TCP_WAKE_MASK] = { .len = 1 }, 431 }; 432 433 /* policy for coalesce rule attributes */ 434 static const struct nla_policy 435 nl80211_coalesce_policy[NUM_NL80211_ATTR_COALESCE_RULE] = { 436 [NL80211_ATTR_COALESCE_RULE_DELAY] = { .type = NLA_U32 }, 437 [NL80211_ATTR_COALESCE_RULE_CONDITION] = { .type = NLA_U32 }, 438 [NL80211_ATTR_COALESCE_RULE_PKT_PATTERN] = { .type = NLA_NESTED }, 439 }; 440 441 /* policy for GTK rekey offload attributes */ 442 static const struct nla_policy 443 nl80211_rekey_policy[NUM_NL80211_REKEY_DATA] = { 444 [NL80211_REKEY_DATA_KEK] = { .len = NL80211_KEK_LEN }, 445 [NL80211_REKEY_DATA_KCK] = { .len = NL80211_KCK_LEN }, 446 [NL80211_REKEY_DATA_REPLAY_CTR] = { .len = NL80211_REPLAY_CTR_LEN }, 447 }; 448 449 static const struct nla_policy 450 nl80211_match_policy[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1] = { 451 [NL80211_SCHED_SCAN_MATCH_ATTR_SSID] = { .type = NLA_BINARY, 452 .len = IEEE80211_MAX_SSID_LEN }, 453 [NL80211_SCHED_SCAN_MATCH_ATTR_RSSI] = { .type = NLA_U32 }, 454 }; 455 456 static int nl80211_prepare_wdev_dump(struct sk_buff *skb, 457 struct netlink_callback *cb, 458 struct cfg80211_registered_device **rdev, 459 struct wireless_dev **wdev) 460 { 461 int err; 462 463 rtnl_lock(); 464 465 if (!cb->args[0]) { 466 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, 467 nl80211_fam.attrbuf, nl80211_fam.maxattr, 468 nl80211_policy); 469 if (err) 470 goto out_unlock; 471 472 *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), 473 nl80211_fam.attrbuf); 474 if (IS_ERR(*wdev)) { 475 err = PTR_ERR(*wdev); 476 goto out_unlock; 477 } 478 *rdev = wiphy_to_dev((*wdev)->wiphy); 479 /* 0 is the first index - add 1 to parse only once */ 480 cb->args[0] = (*rdev)->wiphy_idx + 1; 481 cb->args[1] = (*wdev)->identifier; 482 } else { 483 /* subtract the 1 again here */ 484 struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); 485 struct wireless_dev *tmp; 486 487 if (!wiphy) { 488 err = -ENODEV; 489 goto out_unlock; 490 } 491 *rdev = wiphy_to_dev(wiphy); 492 *wdev = NULL; 493 494 list_for_each_entry(tmp, &(*rdev)->wdev_list, list) { 495 if (tmp->identifier == cb->args[1]) { 496 *wdev = tmp; 497 break; 498 } 499 } 500 501 if (!*wdev) { 502 err = -ENODEV; 503 goto out_unlock; 504 } 505 } 506 507 return 0; 508 out_unlock: 509 rtnl_unlock(); 510 return err; 511 } 512 513 static void nl80211_finish_wdev_dump(struct cfg80211_registered_device *rdev) 514 { 515 rtnl_unlock(); 516 } 517 518 /* IE validation */ 519 static bool is_valid_ie_attr(const struct nlattr *attr) 520 { 521 const u8 *pos; 522 int len; 523 524 if (!attr) 525 return true; 526 527 pos = nla_data(attr); 528 len = nla_len(attr); 529 530 while (len) { 531 u8 elemlen; 532 533 if (len < 2) 534 return false; 535 len -= 2; 536 537 elemlen = pos[1]; 538 if (elemlen > len) 539 return false; 540 541 len -= elemlen; 542 pos += 2 + elemlen; 543 } 544 545 return true; 546 } 547 548 /* message building helper */ 549 static inline void *nl80211hdr_put(struct sk_buff *skb, u32 portid, u32 seq, 550 int flags, u8 cmd) 551 { 552 /* since there is no private header just add the generic one */ 553 return genlmsg_put(skb, portid, seq, &nl80211_fam, flags, cmd); 554 } 555 556 static int nl80211_msg_put_channel(struct sk_buff *msg, 557 struct ieee80211_channel *chan, 558 bool large) 559 { 560 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_FREQ, 561 chan->center_freq)) 562 goto nla_put_failure; 563 564 if ((chan->flags & IEEE80211_CHAN_DISABLED) && 565 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DISABLED)) 566 goto nla_put_failure; 567 if (chan->flags & IEEE80211_CHAN_NO_IR) { 568 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IR)) 569 goto nla_put_failure; 570 if (nla_put_flag(msg, __NL80211_FREQUENCY_ATTR_NO_IBSS)) 571 goto nla_put_failure; 572 } 573 if (chan->flags & IEEE80211_CHAN_RADAR) { 574 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR)) 575 goto nla_put_failure; 576 if (large) { 577 u32 time; 578 579 time = elapsed_jiffies_msecs(chan->dfs_state_entered); 580 581 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_STATE, 582 chan->dfs_state)) 583 goto nla_put_failure; 584 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME, 585 time)) 586 goto nla_put_failure; 587 } 588 } 589 590 if (large) { 591 if ((chan->flags & IEEE80211_CHAN_NO_HT40MINUS) && 592 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_MINUS)) 593 goto nla_put_failure; 594 if ((chan->flags & IEEE80211_CHAN_NO_HT40PLUS) && 595 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_HT40_PLUS)) 596 goto nla_put_failure; 597 if ((chan->flags & IEEE80211_CHAN_NO_80MHZ) && 598 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_80MHZ)) 599 goto nla_put_failure; 600 if ((chan->flags & IEEE80211_CHAN_NO_160MHZ) && 601 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_160MHZ)) 602 goto nla_put_failure; 603 } 604 605 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER, 606 DBM_TO_MBM(chan->max_power))) 607 goto nla_put_failure; 608 609 return 0; 610 611 nla_put_failure: 612 return -ENOBUFS; 613 } 614 615 /* netlink command implementations */ 616 617 struct key_parse { 618 struct key_params p; 619 int idx; 620 int type; 621 bool def, defmgmt; 622 bool def_uni, def_multi; 623 }; 624 625 static int nl80211_parse_key_new(struct nlattr *key, struct key_parse *k) 626 { 627 struct nlattr *tb[NL80211_KEY_MAX + 1]; 628 int err = nla_parse_nested(tb, NL80211_KEY_MAX, key, 629 nl80211_key_policy); 630 if (err) 631 return err; 632 633 k->def = !!tb[NL80211_KEY_DEFAULT]; 634 k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT]; 635 636 if (k->def) { 637 k->def_uni = true; 638 k->def_multi = true; 639 } 640 if (k->defmgmt) 641 k->def_multi = true; 642 643 if (tb[NL80211_KEY_IDX]) 644 k->idx = nla_get_u8(tb[NL80211_KEY_IDX]); 645 646 if (tb[NL80211_KEY_DATA]) { 647 k->p.key = nla_data(tb[NL80211_KEY_DATA]); 648 k->p.key_len = nla_len(tb[NL80211_KEY_DATA]); 649 } 650 651 if (tb[NL80211_KEY_SEQ]) { 652 k->p.seq = nla_data(tb[NL80211_KEY_SEQ]); 653 k->p.seq_len = nla_len(tb[NL80211_KEY_SEQ]); 654 } 655 656 if (tb[NL80211_KEY_CIPHER]) 657 k->p.cipher = nla_get_u32(tb[NL80211_KEY_CIPHER]); 658 659 if (tb[NL80211_KEY_TYPE]) { 660 k->type = nla_get_u32(tb[NL80211_KEY_TYPE]); 661 if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES) 662 return -EINVAL; 663 } 664 665 if (tb[NL80211_KEY_DEFAULT_TYPES]) { 666 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES]; 667 err = nla_parse_nested(kdt, NUM_NL80211_KEY_DEFAULT_TYPES - 1, 668 tb[NL80211_KEY_DEFAULT_TYPES], 669 nl80211_key_default_policy); 670 if (err) 671 return err; 672 673 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; 674 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; 675 } 676 677 return 0; 678 } 679 680 static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k) 681 { 682 if (info->attrs[NL80211_ATTR_KEY_DATA]) { 683 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]); 684 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]); 685 } 686 687 if (info->attrs[NL80211_ATTR_KEY_SEQ]) { 688 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]); 689 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]); 690 } 691 692 if (info->attrs[NL80211_ATTR_KEY_IDX]) 693 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); 694 695 if (info->attrs[NL80211_ATTR_KEY_CIPHER]) 696 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]); 697 698 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT]; 699 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT]; 700 701 if (k->def) { 702 k->def_uni = true; 703 k->def_multi = true; 704 } 705 if (k->defmgmt) 706 k->def_multi = true; 707 708 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { 709 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); 710 if (k->type < 0 || k->type >= NUM_NL80211_KEYTYPES) 711 return -EINVAL; 712 } 713 714 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) { 715 struct nlattr *kdt[NUM_NL80211_KEY_DEFAULT_TYPES]; 716 int err = nla_parse_nested( 717 kdt, NUM_NL80211_KEY_DEFAULT_TYPES - 1, 718 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES], 719 nl80211_key_default_policy); 720 if (err) 721 return err; 722 723 k->def_uni = kdt[NL80211_KEY_DEFAULT_TYPE_UNICAST]; 724 k->def_multi = kdt[NL80211_KEY_DEFAULT_TYPE_MULTICAST]; 725 } 726 727 return 0; 728 } 729 730 static int nl80211_parse_key(struct genl_info *info, struct key_parse *k) 731 { 732 int err; 733 734 memset(k, 0, sizeof(*k)); 735 k->idx = -1; 736 k->type = -1; 737 738 if (info->attrs[NL80211_ATTR_KEY]) 739 err = nl80211_parse_key_new(info->attrs[NL80211_ATTR_KEY], k); 740 else 741 err = nl80211_parse_key_old(info, k); 742 743 if (err) 744 return err; 745 746 if (k->def && k->defmgmt) 747 return -EINVAL; 748 749 if (k->defmgmt) { 750 if (k->def_uni || !k->def_multi) 751 return -EINVAL; 752 } 753 754 if (k->idx != -1) { 755 if (k->defmgmt) { 756 if (k->idx < 4 || k->idx > 5) 757 return -EINVAL; 758 } else if (k->def) { 759 if (k->idx < 0 || k->idx > 3) 760 return -EINVAL; 761 } else { 762 if (k->idx < 0 || k->idx > 5) 763 return -EINVAL; 764 } 765 } 766 767 return 0; 768 } 769 770 static struct cfg80211_cached_keys * 771 nl80211_parse_connkeys(struct cfg80211_registered_device *rdev, 772 struct nlattr *keys, bool *no_ht) 773 { 774 struct key_parse parse; 775 struct nlattr *key; 776 struct cfg80211_cached_keys *result; 777 int rem, err, def = 0; 778 779 result = kzalloc(sizeof(*result), GFP_KERNEL); 780 if (!result) 781 return ERR_PTR(-ENOMEM); 782 783 result->def = -1; 784 result->defmgmt = -1; 785 786 nla_for_each_nested(key, keys, rem) { 787 memset(&parse, 0, sizeof(parse)); 788 parse.idx = -1; 789 790 err = nl80211_parse_key_new(key, &parse); 791 if (err) 792 goto error; 793 err = -EINVAL; 794 if (!parse.p.key) 795 goto error; 796 if (parse.idx < 0 || parse.idx > 4) 797 goto error; 798 if (parse.def) { 799 if (def) 800 goto error; 801 def = 1; 802 result->def = parse.idx; 803 if (!parse.def_uni || !parse.def_multi) 804 goto error; 805 } else if (parse.defmgmt) 806 goto error; 807 err = cfg80211_validate_key_settings(rdev, &parse.p, 808 parse.idx, false, NULL); 809 if (err) 810 goto error; 811 result->params[parse.idx].cipher = parse.p.cipher; 812 result->params[parse.idx].key_len = parse.p.key_len; 813 result->params[parse.idx].key = result->data[parse.idx]; 814 memcpy(result->data[parse.idx], parse.p.key, parse.p.key_len); 815 816 if (parse.p.cipher == WLAN_CIPHER_SUITE_WEP40 || 817 parse.p.cipher == WLAN_CIPHER_SUITE_WEP104) { 818 if (no_ht) 819 *no_ht = true; 820 } 821 } 822 823 return result; 824 error: 825 kfree(result); 826 return ERR_PTR(err); 827 } 828 829 static int nl80211_key_allowed(struct wireless_dev *wdev) 830 { 831 ASSERT_WDEV_LOCK(wdev); 832 833 switch (wdev->iftype) { 834 case NL80211_IFTYPE_AP: 835 case NL80211_IFTYPE_AP_VLAN: 836 case NL80211_IFTYPE_P2P_GO: 837 case NL80211_IFTYPE_MESH_POINT: 838 break; 839 case NL80211_IFTYPE_ADHOC: 840 case NL80211_IFTYPE_STATION: 841 case NL80211_IFTYPE_P2P_CLIENT: 842 if (!wdev->current_bss) 843 return -ENOLINK; 844 break; 845 default: 846 return -EINVAL; 847 } 848 849 return 0; 850 } 851 852 static int nl80211_put_iftypes(struct sk_buff *msg, u32 attr, u16 ifmodes) 853 { 854 struct nlattr *nl_modes = nla_nest_start(msg, attr); 855 int i; 856 857 if (!nl_modes) 858 goto nla_put_failure; 859 860 i = 0; 861 while (ifmodes) { 862 if ((ifmodes & 1) && nla_put_flag(msg, i)) 863 goto nla_put_failure; 864 ifmodes >>= 1; 865 i++; 866 } 867 868 nla_nest_end(msg, nl_modes); 869 return 0; 870 871 nla_put_failure: 872 return -ENOBUFS; 873 } 874 875 static int nl80211_put_iface_combinations(struct wiphy *wiphy, 876 struct sk_buff *msg, 877 bool large) 878 { 879 struct nlattr *nl_combis; 880 int i, j; 881 882 nl_combis = nla_nest_start(msg, 883 NL80211_ATTR_INTERFACE_COMBINATIONS); 884 if (!nl_combis) 885 goto nla_put_failure; 886 887 for (i = 0; i < wiphy->n_iface_combinations; i++) { 888 const struct ieee80211_iface_combination *c; 889 struct nlattr *nl_combi, *nl_limits; 890 891 c = &wiphy->iface_combinations[i]; 892 893 nl_combi = nla_nest_start(msg, i + 1); 894 if (!nl_combi) 895 goto nla_put_failure; 896 897 nl_limits = nla_nest_start(msg, NL80211_IFACE_COMB_LIMITS); 898 if (!nl_limits) 899 goto nla_put_failure; 900 901 for (j = 0; j < c->n_limits; j++) { 902 struct nlattr *nl_limit; 903 904 nl_limit = nla_nest_start(msg, j + 1); 905 if (!nl_limit) 906 goto nla_put_failure; 907 if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX, 908 c->limits[j].max)) 909 goto nla_put_failure; 910 if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES, 911 c->limits[j].types)) 912 goto nla_put_failure; 913 nla_nest_end(msg, nl_limit); 914 } 915 916 nla_nest_end(msg, nl_limits); 917 918 if (c->beacon_int_infra_match && 919 nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH)) 920 goto nla_put_failure; 921 if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS, 922 c->num_different_channels) || 923 nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM, 924 c->max_interfaces)) 925 goto nla_put_failure; 926 if (large && 927 nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS, 928 c->radar_detect_widths)) 929 goto nla_put_failure; 930 931 nla_nest_end(msg, nl_combi); 932 } 933 934 nla_nest_end(msg, nl_combis); 935 936 return 0; 937 nla_put_failure: 938 return -ENOBUFS; 939 } 940 941 #ifdef CONFIG_PM 942 static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev, 943 struct sk_buff *msg) 944 { 945 const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan->tcp; 946 struct nlattr *nl_tcp; 947 948 if (!tcp) 949 return 0; 950 951 nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION); 952 if (!nl_tcp) 953 return -ENOBUFS; 954 955 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 956 tcp->data_payload_max)) 957 return -ENOBUFS; 958 959 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 960 tcp->data_payload_max)) 961 return -ENOBUFS; 962 963 if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ)) 964 return -ENOBUFS; 965 966 if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 967 sizeof(*tcp->tok), tcp->tok)) 968 return -ENOBUFS; 969 970 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 971 tcp->data_interval_max)) 972 return -ENOBUFS; 973 974 if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 975 tcp->wake_payload_max)) 976 return -ENOBUFS; 977 978 nla_nest_end(msg, nl_tcp); 979 return 0; 980 } 981 982 static int nl80211_send_wowlan(struct sk_buff *msg, 983 struct cfg80211_registered_device *dev, 984 bool large) 985 { 986 struct nlattr *nl_wowlan; 987 988 if (!dev->wiphy.wowlan) 989 return 0; 990 991 nl_wowlan = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED); 992 if (!nl_wowlan) 993 return -ENOBUFS; 994 995 if (((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_ANY) && 996 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 997 ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_DISCONNECT) && 998 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 999 ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT) && 1000 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 1001 ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY) && 1002 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED)) || 1003 ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && 1004 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 1005 ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ) && 1006 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 1007 ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE) && 1008 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 1009 ((dev->wiphy.wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE) && 1010 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 1011 return -ENOBUFS; 1012 1013 if (dev->wiphy.wowlan->n_patterns) { 1014 struct nl80211_pattern_support pat = { 1015 .max_patterns = dev->wiphy.wowlan->n_patterns, 1016 .min_pattern_len = dev->wiphy.wowlan->pattern_min_len, 1017 .max_pattern_len = dev->wiphy.wowlan->pattern_max_len, 1018 .max_pkt_offset = dev->wiphy.wowlan->max_pkt_offset, 1019 }; 1020 1021 if (nla_put(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN, 1022 sizeof(pat), &pat)) 1023 return -ENOBUFS; 1024 } 1025 1026 if (large && nl80211_send_wowlan_tcp_caps(dev, msg)) 1027 return -ENOBUFS; 1028 1029 nla_nest_end(msg, nl_wowlan); 1030 1031 return 0; 1032 } 1033 #endif 1034 1035 static int nl80211_send_coalesce(struct sk_buff *msg, 1036 struct cfg80211_registered_device *dev) 1037 { 1038 struct nl80211_coalesce_rule_support rule; 1039 1040 if (!dev->wiphy.coalesce) 1041 return 0; 1042 1043 rule.max_rules = dev->wiphy.coalesce->n_rules; 1044 rule.max_delay = dev->wiphy.coalesce->max_delay; 1045 rule.pat.max_patterns = dev->wiphy.coalesce->n_patterns; 1046 rule.pat.min_pattern_len = dev->wiphy.coalesce->pattern_min_len; 1047 rule.pat.max_pattern_len = dev->wiphy.coalesce->pattern_max_len; 1048 rule.pat.max_pkt_offset = dev->wiphy.coalesce->max_pkt_offset; 1049 1050 if (nla_put(msg, NL80211_ATTR_COALESCE_RULE, sizeof(rule), &rule)) 1051 return -ENOBUFS; 1052 1053 return 0; 1054 } 1055 1056 static int nl80211_send_band_rateinfo(struct sk_buff *msg, 1057 struct ieee80211_supported_band *sband) 1058 { 1059 struct nlattr *nl_rates, *nl_rate; 1060 struct ieee80211_rate *rate; 1061 int i; 1062 1063 /* add HT info */ 1064 if (sband->ht_cap.ht_supported && 1065 (nla_put(msg, NL80211_BAND_ATTR_HT_MCS_SET, 1066 sizeof(sband->ht_cap.mcs), 1067 &sband->ht_cap.mcs) || 1068 nla_put_u16(msg, NL80211_BAND_ATTR_HT_CAPA, 1069 sband->ht_cap.cap) || 1070 nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_FACTOR, 1071 sband->ht_cap.ampdu_factor) || 1072 nla_put_u8(msg, NL80211_BAND_ATTR_HT_AMPDU_DENSITY, 1073 sband->ht_cap.ampdu_density))) 1074 return -ENOBUFS; 1075 1076 /* add VHT info */ 1077 if (sband->vht_cap.vht_supported && 1078 (nla_put(msg, NL80211_BAND_ATTR_VHT_MCS_SET, 1079 sizeof(sband->vht_cap.vht_mcs), 1080 &sband->vht_cap.vht_mcs) || 1081 nla_put_u32(msg, NL80211_BAND_ATTR_VHT_CAPA, 1082 sband->vht_cap.cap))) 1083 return -ENOBUFS; 1084 1085 /* add bitrates */ 1086 nl_rates = nla_nest_start(msg, NL80211_BAND_ATTR_RATES); 1087 if (!nl_rates) 1088 return -ENOBUFS; 1089 1090 for (i = 0; i < sband->n_bitrates; i++) { 1091 nl_rate = nla_nest_start(msg, i); 1092 if (!nl_rate) 1093 return -ENOBUFS; 1094 1095 rate = &sband->bitrates[i]; 1096 if (nla_put_u32(msg, NL80211_BITRATE_ATTR_RATE, 1097 rate->bitrate)) 1098 return -ENOBUFS; 1099 if ((rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && 1100 nla_put_flag(msg, 1101 NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE)) 1102 return -ENOBUFS; 1103 1104 nla_nest_end(msg, nl_rate); 1105 } 1106 1107 nla_nest_end(msg, nl_rates); 1108 1109 return 0; 1110 } 1111 1112 static int 1113 nl80211_send_mgmt_stypes(struct sk_buff *msg, 1114 const struct ieee80211_txrx_stypes *mgmt_stypes) 1115 { 1116 u16 stypes; 1117 struct nlattr *nl_ftypes, *nl_ifs; 1118 enum nl80211_iftype ift; 1119 int i; 1120 1121 if (!mgmt_stypes) 1122 return 0; 1123 1124 nl_ifs = nla_nest_start(msg, NL80211_ATTR_TX_FRAME_TYPES); 1125 if (!nl_ifs) 1126 return -ENOBUFS; 1127 1128 for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) { 1129 nl_ftypes = nla_nest_start(msg, ift); 1130 if (!nl_ftypes) 1131 return -ENOBUFS; 1132 i = 0; 1133 stypes = mgmt_stypes[ift].tx; 1134 while (stypes) { 1135 if ((stypes & 1) && 1136 nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE, 1137 (i << 4) | IEEE80211_FTYPE_MGMT)) 1138 return -ENOBUFS; 1139 stypes >>= 1; 1140 i++; 1141 } 1142 nla_nest_end(msg, nl_ftypes); 1143 } 1144 1145 nla_nest_end(msg, nl_ifs); 1146 1147 nl_ifs = nla_nest_start(msg, NL80211_ATTR_RX_FRAME_TYPES); 1148 if (!nl_ifs) 1149 return -ENOBUFS; 1150 1151 for (ift = 0; ift < NUM_NL80211_IFTYPES; ift++) { 1152 nl_ftypes = nla_nest_start(msg, ift); 1153 if (!nl_ftypes) 1154 return -ENOBUFS; 1155 i = 0; 1156 stypes = mgmt_stypes[ift].rx; 1157 while (stypes) { 1158 if ((stypes & 1) && 1159 nla_put_u16(msg, NL80211_ATTR_FRAME_TYPE, 1160 (i << 4) | IEEE80211_FTYPE_MGMT)) 1161 return -ENOBUFS; 1162 stypes >>= 1; 1163 i++; 1164 } 1165 nla_nest_end(msg, nl_ftypes); 1166 } 1167 nla_nest_end(msg, nl_ifs); 1168 1169 return 0; 1170 } 1171 1172 struct nl80211_dump_wiphy_state { 1173 s64 filter_wiphy; 1174 long start; 1175 long split_start, band_start, chan_start; 1176 bool split; 1177 }; 1178 1179 static int nl80211_send_wiphy(struct cfg80211_registered_device *dev, 1180 struct sk_buff *msg, u32 portid, u32 seq, 1181 int flags, struct nl80211_dump_wiphy_state *state) 1182 { 1183 void *hdr; 1184 struct nlattr *nl_bands, *nl_band; 1185 struct nlattr *nl_freqs, *nl_freq; 1186 struct nlattr *nl_cmds; 1187 enum ieee80211_band band; 1188 struct ieee80211_channel *chan; 1189 int i; 1190 const struct ieee80211_txrx_stypes *mgmt_stypes = 1191 dev->wiphy.mgmt_stypes; 1192 u32 features; 1193 1194 hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_WIPHY); 1195 if (!hdr) 1196 return -ENOBUFS; 1197 1198 if (WARN_ON(!state)) 1199 return -EINVAL; 1200 1201 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, dev->wiphy_idx) || 1202 nla_put_string(msg, NL80211_ATTR_WIPHY_NAME, 1203 wiphy_name(&dev->wiphy)) || 1204 nla_put_u32(msg, NL80211_ATTR_GENERATION, 1205 cfg80211_rdev_list_generation)) 1206 goto nla_put_failure; 1207 1208 switch (state->split_start) { 1209 case 0: 1210 if (nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_SHORT, 1211 dev->wiphy.retry_short) || 1212 nla_put_u8(msg, NL80211_ATTR_WIPHY_RETRY_LONG, 1213 dev->wiphy.retry_long) || 1214 nla_put_u32(msg, NL80211_ATTR_WIPHY_FRAG_THRESHOLD, 1215 dev->wiphy.frag_threshold) || 1216 nla_put_u32(msg, NL80211_ATTR_WIPHY_RTS_THRESHOLD, 1217 dev->wiphy.rts_threshold) || 1218 nla_put_u8(msg, NL80211_ATTR_WIPHY_COVERAGE_CLASS, 1219 dev->wiphy.coverage_class) || 1220 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCAN_SSIDS, 1221 dev->wiphy.max_scan_ssids) || 1222 nla_put_u8(msg, NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS, 1223 dev->wiphy.max_sched_scan_ssids) || 1224 nla_put_u16(msg, NL80211_ATTR_MAX_SCAN_IE_LEN, 1225 dev->wiphy.max_scan_ie_len) || 1226 nla_put_u16(msg, NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN, 1227 dev->wiphy.max_sched_scan_ie_len) || 1228 nla_put_u8(msg, NL80211_ATTR_MAX_MATCH_SETS, 1229 dev->wiphy.max_match_sets)) 1230 goto nla_put_failure; 1231 1232 if ((dev->wiphy.flags & WIPHY_FLAG_IBSS_RSN) && 1233 nla_put_flag(msg, NL80211_ATTR_SUPPORT_IBSS_RSN)) 1234 goto nla_put_failure; 1235 if ((dev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) && 1236 nla_put_flag(msg, NL80211_ATTR_SUPPORT_MESH_AUTH)) 1237 goto nla_put_failure; 1238 if ((dev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) && 1239 nla_put_flag(msg, NL80211_ATTR_SUPPORT_AP_UAPSD)) 1240 goto nla_put_failure; 1241 if ((dev->wiphy.flags & WIPHY_FLAG_SUPPORTS_FW_ROAM) && 1242 nla_put_flag(msg, NL80211_ATTR_ROAM_SUPPORT)) 1243 goto nla_put_failure; 1244 if ((dev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) && 1245 nla_put_flag(msg, NL80211_ATTR_TDLS_SUPPORT)) 1246 goto nla_put_failure; 1247 if ((dev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP) && 1248 nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP)) 1249 goto nla_put_failure; 1250 state->split_start++; 1251 if (state->split) 1252 break; 1253 case 1: 1254 if (nla_put(msg, NL80211_ATTR_CIPHER_SUITES, 1255 sizeof(u32) * dev->wiphy.n_cipher_suites, 1256 dev->wiphy.cipher_suites)) 1257 goto nla_put_failure; 1258 1259 if (nla_put_u8(msg, NL80211_ATTR_MAX_NUM_PMKIDS, 1260 dev->wiphy.max_num_pmkids)) 1261 goto nla_put_failure; 1262 1263 if ((dev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && 1264 nla_put_flag(msg, NL80211_ATTR_CONTROL_PORT_ETHERTYPE)) 1265 goto nla_put_failure; 1266 1267 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX, 1268 dev->wiphy.available_antennas_tx) || 1269 nla_put_u32(msg, NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX, 1270 dev->wiphy.available_antennas_rx)) 1271 goto nla_put_failure; 1272 1273 if ((dev->wiphy.flags & WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD) && 1274 nla_put_u32(msg, NL80211_ATTR_PROBE_RESP_OFFLOAD, 1275 dev->wiphy.probe_resp_offload)) 1276 goto nla_put_failure; 1277 1278 if ((dev->wiphy.available_antennas_tx || 1279 dev->wiphy.available_antennas_rx) && 1280 dev->ops->get_antenna) { 1281 u32 tx_ant = 0, rx_ant = 0; 1282 int res; 1283 res = rdev_get_antenna(dev, &tx_ant, &rx_ant); 1284 if (!res) { 1285 if (nla_put_u32(msg, 1286 NL80211_ATTR_WIPHY_ANTENNA_TX, 1287 tx_ant) || 1288 nla_put_u32(msg, 1289 NL80211_ATTR_WIPHY_ANTENNA_RX, 1290 rx_ant)) 1291 goto nla_put_failure; 1292 } 1293 } 1294 1295 state->split_start++; 1296 if (state->split) 1297 break; 1298 case 2: 1299 if (nl80211_put_iftypes(msg, NL80211_ATTR_SUPPORTED_IFTYPES, 1300 dev->wiphy.interface_modes)) 1301 goto nla_put_failure; 1302 state->split_start++; 1303 if (state->split) 1304 break; 1305 case 3: 1306 nl_bands = nla_nest_start(msg, NL80211_ATTR_WIPHY_BANDS); 1307 if (!nl_bands) 1308 goto nla_put_failure; 1309 1310 for (band = state->band_start; 1311 band < IEEE80211_NUM_BANDS; band++) { 1312 struct ieee80211_supported_band *sband; 1313 1314 sband = dev->wiphy.bands[band]; 1315 1316 if (!sband) 1317 continue; 1318 1319 nl_band = nla_nest_start(msg, band); 1320 if (!nl_band) 1321 goto nla_put_failure; 1322 1323 switch (state->chan_start) { 1324 case 0: 1325 if (nl80211_send_band_rateinfo(msg, sband)) 1326 goto nla_put_failure; 1327 state->chan_start++; 1328 if (state->split) 1329 break; 1330 default: 1331 /* add frequencies */ 1332 nl_freqs = nla_nest_start( 1333 msg, NL80211_BAND_ATTR_FREQS); 1334 if (!nl_freqs) 1335 goto nla_put_failure; 1336 1337 for (i = state->chan_start - 1; 1338 i < sband->n_channels; 1339 i++) { 1340 nl_freq = nla_nest_start(msg, i); 1341 if (!nl_freq) 1342 goto nla_put_failure; 1343 1344 chan = &sband->channels[i]; 1345 1346 if (nl80211_msg_put_channel( 1347 msg, chan, 1348 state->split)) 1349 goto nla_put_failure; 1350 1351 nla_nest_end(msg, nl_freq); 1352 if (state->split) 1353 break; 1354 } 1355 if (i < sband->n_channels) 1356 state->chan_start = i + 2; 1357 else 1358 state->chan_start = 0; 1359 nla_nest_end(msg, nl_freqs); 1360 } 1361 1362 nla_nest_end(msg, nl_band); 1363 1364 if (state->split) { 1365 /* start again here */ 1366 if (state->chan_start) 1367 band--; 1368 break; 1369 } 1370 } 1371 nla_nest_end(msg, nl_bands); 1372 1373 if (band < IEEE80211_NUM_BANDS) 1374 state->band_start = band + 1; 1375 else 1376 state->band_start = 0; 1377 1378 /* if bands & channels are done, continue outside */ 1379 if (state->band_start == 0 && state->chan_start == 0) 1380 state->split_start++; 1381 if (state->split) 1382 break; 1383 case 4: 1384 nl_cmds = nla_nest_start(msg, NL80211_ATTR_SUPPORTED_COMMANDS); 1385 if (!nl_cmds) 1386 goto nla_put_failure; 1387 1388 i = 0; 1389 #define CMD(op, n) \ 1390 do { \ 1391 if (dev->ops->op) { \ 1392 i++; \ 1393 if (nla_put_u32(msg, i, NL80211_CMD_ ## n)) \ 1394 goto nla_put_failure; \ 1395 } \ 1396 } while (0) 1397 1398 CMD(add_virtual_intf, NEW_INTERFACE); 1399 CMD(change_virtual_intf, SET_INTERFACE); 1400 CMD(add_key, NEW_KEY); 1401 CMD(start_ap, START_AP); 1402 CMD(add_station, NEW_STATION); 1403 CMD(add_mpath, NEW_MPATH); 1404 CMD(update_mesh_config, SET_MESH_CONFIG); 1405 CMD(change_bss, SET_BSS); 1406 CMD(auth, AUTHENTICATE); 1407 CMD(assoc, ASSOCIATE); 1408 CMD(deauth, DEAUTHENTICATE); 1409 CMD(disassoc, DISASSOCIATE); 1410 CMD(join_ibss, JOIN_IBSS); 1411 CMD(join_mesh, JOIN_MESH); 1412 CMD(set_pmksa, SET_PMKSA); 1413 CMD(del_pmksa, DEL_PMKSA); 1414 CMD(flush_pmksa, FLUSH_PMKSA); 1415 if (dev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) 1416 CMD(remain_on_channel, REMAIN_ON_CHANNEL); 1417 CMD(set_bitrate_mask, SET_TX_BITRATE_MASK); 1418 CMD(mgmt_tx, FRAME); 1419 CMD(mgmt_tx_cancel_wait, FRAME_WAIT_CANCEL); 1420 if (dev->wiphy.flags & WIPHY_FLAG_NETNS_OK) { 1421 i++; 1422 if (nla_put_u32(msg, i, NL80211_CMD_SET_WIPHY_NETNS)) 1423 goto nla_put_failure; 1424 } 1425 if (dev->ops->set_monitor_channel || dev->ops->start_ap || 1426 dev->ops->join_mesh) { 1427 i++; 1428 if (nla_put_u32(msg, i, NL80211_CMD_SET_CHANNEL)) 1429 goto nla_put_failure; 1430 } 1431 CMD(set_wds_peer, SET_WDS_PEER); 1432 if (dev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) { 1433 CMD(tdls_mgmt, TDLS_MGMT); 1434 CMD(tdls_oper, TDLS_OPER); 1435 } 1436 if (dev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN) 1437 CMD(sched_scan_start, START_SCHED_SCAN); 1438 CMD(probe_client, PROBE_CLIENT); 1439 CMD(set_noack_map, SET_NOACK_MAP); 1440 if (dev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS) { 1441 i++; 1442 if (nla_put_u32(msg, i, NL80211_CMD_REGISTER_BEACONS)) 1443 goto nla_put_failure; 1444 } 1445 CMD(start_p2p_device, START_P2P_DEVICE); 1446 CMD(set_mcast_rate, SET_MCAST_RATE); 1447 if (state->split) { 1448 CMD(crit_proto_start, CRIT_PROTOCOL_START); 1449 CMD(crit_proto_stop, CRIT_PROTOCOL_STOP); 1450 if (dev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH) 1451 CMD(channel_switch, CHANNEL_SWITCH); 1452 } 1453 1454 #ifdef CONFIG_NL80211_TESTMODE 1455 CMD(testmode_cmd, TESTMODE); 1456 #endif 1457 1458 #undef CMD 1459 1460 if (dev->ops->connect || dev->ops->auth) { 1461 i++; 1462 if (nla_put_u32(msg, i, NL80211_CMD_CONNECT)) 1463 goto nla_put_failure; 1464 } 1465 1466 if (dev->ops->disconnect || dev->ops->deauth) { 1467 i++; 1468 if (nla_put_u32(msg, i, NL80211_CMD_DISCONNECT)) 1469 goto nla_put_failure; 1470 } 1471 1472 nla_nest_end(msg, nl_cmds); 1473 state->split_start++; 1474 if (state->split) 1475 break; 1476 case 5: 1477 if (dev->ops->remain_on_channel && 1478 (dev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL) && 1479 nla_put_u32(msg, 1480 NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION, 1481 dev->wiphy.max_remain_on_channel_duration)) 1482 goto nla_put_failure; 1483 1484 if ((dev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX) && 1485 nla_put_flag(msg, NL80211_ATTR_OFFCHANNEL_TX_OK)) 1486 goto nla_put_failure; 1487 1488 if (nl80211_send_mgmt_stypes(msg, mgmt_stypes)) 1489 goto nla_put_failure; 1490 state->split_start++; 1491 if (state->split) 1492 break; 1493 case 6: 1494 #ifdef CONFIG_PM 1495 if (nl80211_send_wowlan(msg, dev, state->split)) 1496 goto nla_put_failure; 1497 state->split_start++; 1498 if (state->split) 1499 break; 1500 #else 1501 state->split_start++; 1502 #endif 1503 case 7: 1504 if (nl80211_put_iftypes(msg, NL80211_ATTR_SOFTWARE_IFTYPES, 1505 dev->wiphy.software_iftypes)) 1506 goto nla_put_failure; 1507 1508 if (nl80211_put_iface_combinations(&dev->wiphy, msg, 1509 state->split)) 1510 goto nla_put_failure; 1511 1512 state->split_start++; 1513 if (state->split) 1514 break; 1515 case 8: 1516 if ((dev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME) && 1517 nla_put_u32(msg, NL80211_ATTR_DEVICE_AP_SME, 1518 dev->wiphy.ap_sme_capa)) 1519 goto nla_put_failure; 1520 1521 features = dev->wiphy.features; 1522 /* 1523 * We can only add the per-channel limit information if the 1524 * dump is split, otherwise it makes it too big. Therefore 1525 * only advertise it in that case. 1526 */ 1527 if (state->split) 1528 features |= NL80211_FEATURE_ADVERTISE_CHAN_LIMITS; 1529 if (nla_put_u32(msg, NL80211_ATTR_FEATURE_FLAGS, features)) 1530 goto nla_put_failure; 1531 1532 if (dev->wiphy.ht_capa_mod_mask && 1533 nla_put(msg, NL80211_ATTR_HT_CAPABILITY_MASK, 1534 sizeof(*dev->wiphy.ht_capa_mod_mask), 1535 dev->wiphy.ht_capa_mod_mask)) 1536 goto nla_put_failure; 1537 1538 if (dev->wiphy.flags & WIPHY_FLAG_HAVE_AP_SME && 1539 dev->wiphy.max_acl_mac_addrs && 1540 nla_put_u32(msg, NL80211_ATTR_MAC_ACL_MAX, 1541 dev->wiphy.max_acl_mac_addrs)) 1542 goto nla_put_failure; 1543 1544 /* 1545 * Any information below this point is only available to 1546 * applications that can deal with it being split. This 1547 * helps ensure that newly added capabilities don't break 1548 * older tools by overrunning their buffers. 1549 * 1550 * We still increment split_start so that in the split 1551 * case we'll continue with more data in the next round, 1552 * but break unconditionally so unsplit data stops here. 1553 */ 1554 state->split_start++; 1555 break; 1556 case 9: 1557 if (dev->wiphy.extended_capabilities && 1558 (nla_put(msg, NL80211_ATTR_EXT_CAPA, 1559 dev->wiphy.extended_capabilities_len, 1560 dev->wiphy.extended_capabilities) || 1561 nla_put(msg, NL80211_ATTR_EXT_CAPA_MASK, 1562 dev->wiphy.extended_capabilities_len, 1563 dev->wiphy.extended_capabilities_mask))) 1564 goto nla_put_failure; 1565 1566 if (dev->wiphy.vht_capa_mod_mask && 1567 nla_put(msg, NL80211_ATTR_VHT_CAPABILITY_MASK, 1568 sizeof(*dev->wiphy.vht_capa_mod_mask), 1569 dev->wiphy.vht_capa_mod_mask)) 1570 goto nla_put_failure; 1571 1572 state->split_start++; 1573 break; 1574 case 10: 1575 if (nl80211_send_coalesce(msg, dev)) 1576 goto nla_put_failure; 1577 1578 if ((dev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) && 1579 (nla_put_flag(msg, NL80211_ATTR_SUPPORT_5_MHZ) || 1580 nla_put_flag(msg, NL80211_ATTR_SUPPORT_10_MHZ))) 1581 goto nla_put_failure; 1582 1583 /* done */ 1584 state->split_start = 0; 1585 break; 1586 } 1587 return genlmsg_end(msg, hdr); 1588 1589 nla_put_failure: 1590 genlmsg_cancel(msg, hdr); 1591 return -EMSGSIZE; 1592 } 1593 1594 static int nl80211_dump_wiphy_parse(struct sk_buff *skb, 1595 struct netlink_callback *cb, 1596 struct nl80211_dump_wiphy_state *state) 1597 { 1598 struct nlattr **tb = nl80211_fam.attrbuf; 1599 int ret = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, 1600 tb, nl80211_fam.maxattr, nl80211_policy); 1601 /* ignore parse errors for backward compatibility */ 1602 if (ret) 1603 return 0; 1604 1605 state->split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; 1606 if (tb[NL80211_ATTR_WIPHY]) 1607 state->filter_wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]); 1608 if (tb[NL80211_ATTR_WDEV]) 1609 state->filter_wiphy = nla_get_u64(tb[NL80211_ATTR_WDEV]) >> 32; 1610 if (tb[NL80211_ATTR_IFINDEX]) { 1611 struct net_device *netdev; 1612 struct cfg80211_registered_device *rdev; 1613 int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]); 1614 1615 netdev = dev_get_by_index(sock_net(skb->sk), ifidx); 1616 if (!netdev) 1617 return -ENODEV; 1618 if (netdev->ieee80211_ptr) { 1619 rdev = wiphy_to_dev( 1620 netdev->ieee80211_ptr->wiphy); 1621 state->filter_wiphy = rdev->wiphy_idx; 1622 } 1623 dev_put(netdev); 1624 } 1625 1626 return 0; 1627 } 1628 1629 static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb) 1630 { 1631 int idx = 0, ret; 1632 struct nl80211_dump_wiphy_state *state = (void *)cb->args[0]; 1633 struct cfg80211_registered_device *dev; 1634 1635 rtnl_lock(); 1636 if (!state) { 1637 state = kzalloc(sizeof(*state), GFP_KERNEL); 1638 if (!state) { 1639 rtnl_unlock(); 1640 return -ENOMEM; 1641 } 1642 state->filter_wiphy = -1; 1643 ret = nl80211_dump_wiphy_parse(skb, cb, state); 1644 if (ret) { 1645 kfree(state); 1646 rtnl_unlock(); 1647 return ret; 1648 } 1649 cb->args[0] = (long)state; 1650 } 1651 1652 list_for_each_entry(dev, &cfg80211_rdev_list, list) { 1653 if (!net_eq(wiphy_net(&dev->wiphy), sock_net(skb->sk))) 1654 continue; 1655 if (++idx <= state->start) 1656 continue; 1657 if (state->filter_wiphy != -1 && 1658 state->filter_wiphy != dev->wiphy_idx) 1659 continue; 1660 /* attempt to fit multiple wiphy data chunks into the skb */ 1661 do { 1662 ret = nl80211_send_wiphy(dev, skb, 1663 NETLINK_CB(cb->skb).portid, 1664 cb->nlh->nlmsg_seq, 1665 NLM_F_MULTI, state); 1666 if (ret < 0) { 1667 /* 1668 * If sending the wiphy data didn't fit (ENOBUFS 1669 * or EMSGSIZE returned), this SKB is still 1670 * empty (so it's not too big because another 1671 * wiphy dataset is already in the skb) and 1672 * we've not tried to adjust the dump allocation 1673 * yet ... then adjust the alloc size to be 1674 * bigger, and return 1 but with the empty skb. 1675 * This results in an empty message being RX'ed 1676 * in userspace, but that is ignored. 1677 * 1678 * We can then retry with the larger buffer. 1679 */ 1680 if ((ret == -ENOBUFS || ret == -EMSGSIZE) && 1681 !skb->len && 1682 cb->min_dump_alloc < 4096) { 1683 cb->min_dump_alloc = 4096; 1684 rtnl_unlock(); 1685 return 1; 1686 } 1687 idx--; 1688 break; 1689 } 1690 } while (state->split_start > 0); 1691 break; 1692 } 1693 rtnl_unlock(); 1694 1695 state->start = idx; 1696 1697 return skb->len; 1698 } 1699 1700 static int nl80211_dump_wiphy_done(struct netlink_callback *cb) 1701 { 1702 kfree((void *)cb->args[0]); 1703 return 0; 1704 } 1705 1706 static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info) 1707 { 1708 struct sk_buff *msg; 1709 struct cfg80211_registered_device *dev = info->user_ptr[0]; 1710 struct nl80211_dump_wiphy_state state = {}; 1711 1712 msg = nlmsg_new(4096, GFP_KERNEL); 1713 if (!msg) 1714 return -ENOMEM; 1715 1716 if (nl80211_send_wiphy(dev, msg, info->snd_portid, info->snd_seq, 0, 1717 &state) < 0) { 1718 nlmsg_free(msg); 1719 return -ENOBUFS; 1720 } 1721 1722 return genlmsg_reply(msg, info); 1723 } 1724 1725 static const struct nla_policy txq_params_policy[NL80211_TXQ_ATTR_MAX + 1] = { 1726 [NL80211_TXQ_ATTR_QUEUE] = { .type = NLA_U8 }, 1727 [NL80211_TXQ_ATTR_TXOP] = { .type = NLA_U16 }, 1728 [NL80211_TXQ_ATTR_CWMIN] = { .type = NLA_U16 }, 1729 [NL80211_TXQ_ATTR_CWMAX] = { .type = NLA_U16 }, 1730 [NL80211_TXQ_ATTR_AIFS] = { .type = NLA_U8 }, 1731 }; 1732 1733 static int parse_txq_params(struct nlattr *tb[], 1734 struct ieee80211_txq_params *txq_params) 1735 { 1736 if (!tb[NL80211_TXQ_ATTR_AC] || !tb[NL80211_TXQ_ATTR_TXOP] || 1737 !tb[NL80211_TXQ_ATTR_CWMIN] || !tb[NL80211_TXQ_ATTR_CWMAX] || 1738 !tb[NL80211_TXQ_ATTR_AIFS]) 1739 return -EINVAL; 1740 1741 txq_params->ac = nla_get_u8(tb[NL80211_TXQ_ATTR_AC]); 1742 txq_params->txop = nla_get_u16(tb[NL80211_TXQ_ATTR_TXOP]); 1743 txq_params->cwmin = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMIN]); 1744 txq_params->cwmax = nla_get_u16(tb[NL80211_TXQ_ATTR_CWMAX]); 1745 txq_params->aifs = nla_get_u8(tb[NL80211_TXQ_ATTR_AIFS]); 1746 1747 if (txq_params->ac >= NL80211_NUM_ACS) 1748 return -EINVAL; 1749 1750 return 0; 1751 } 1752 1753 static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev) 1754 { 1755 /* 1756 * You can only set the channel explicitly for WDS interfaces, 1757 * all others have their channel managed via their respective 1758 * "establish a connection" command (connect, join, ...) 1759 * 1760 * For AP/GO and mesh mode, the channel can be set with the 1761 * channel userspace API, but is only stored and passed to the 1762 * low-level driver when the AP starts or the mesh is joined. 1763 * This is for backward compatibility, userspace can also give 1764 * the channel in the start-ap or join-mesh commands instead. 1765 * 1766 * Monitors are special as they are normally slaved to 1767 * whatever else is going on, so they have their own special 1768 * operation to set the monitor channel if possible. 1769 */ 1770 return !wdev || 1771 wdev->iftype == NL80211_IFTYPE_AP || 1772 wdev->iftype == NL80211_IFTYPE_MESH_POINT || 1773 wdev->iftype == NL80211_IFTYPE_MONITOR || 1774 wdev->iftype == NL80211_IFTYPE_P2P_GO; 1775 } 1776 1777 static int nl80211_parse_chandef(struct cfg80211_registered_device *rdev, 1778 struct genl_info *info, 1779 struct cfg80211_chan_def *chandef) 1780 { 1781 u32 control_freq; 1782 1783 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 1784 return -EINVAL; 1785 1786 control_freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]); 1787 1788 chandef->chan = ieee80211_get_channel(&rdev->wiphy, control_freq); 1789 chandef->width = NL80211_CHAN_WIDTH_20_NOHT; 1790 chandef->center_freq1 = control_freq; 1791 chandef->center_freq2 = 0; 1792 1793 /* Primary channel not allowed */ 1794 if (!chandef->chan || chandef->chan->flags & IEEE80211_CHAN_DISABLED) 1795 return -EINVAL; 1796 1797 if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) { 1798 enum nl80211_channel_type chantype; 1799 1800 chantype = nla_get_u32( 1801 info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]); 1802 1803 switch (chantype) { 1804 case NL80211_CHAN_NO_HT: 1805 case NL80211_CHAN_HT20: 1806 case NL80211_CHAN_HT40PLUS: 1807 case NL80211_CHAN_HT40MINUS: 1808 cfg80211_chandef_create(chandef, chandef->chan, 1809 chantype); 1810 break; 1811 default: 1812 return -EINVAL; 1813 } 1814 } else if (info->attrs[NL80211_ATTR_CHANNEL_WIDTH]) { 1815 chandef->width = 1816 nla_get_u32(info->attrs[NL80211_ATTR_CHANNEL_WIDTH]); 1817 if (info->attrs[NL80211_ATTR_CENTER_FREQ1]) 1818 chandef->center_freq1 = 1819 nla_get_u32( 1820 info->attrs[NL80211_ATTR_CENTER_FREQ1]); 1821 if (info->attrs[NL80211_ATTR_CENTER_FREQ2]) 1822 chandef->center_freq2 = 1823 nla_get_u32( 1824 info->attrs[NL80211_ATTR_CENTER_FREQ2]); 1825 } 1826 1827 if (!cfg80211_chandef_valid(chandef)) 1828 return -EINVAL; 1829 1830 if (!cfg80211_chandef_usable(&rdev->wiphy, chandef, 1831 IEEE80211_CHAN_DISABLED)) 1832 return -EINVAL; 1833 1834 if ((chandef->width == NL80211_CHAN_WIDTH_5 || 1835 chandef->width == NL80211_CHAN_WIDTH_10) && 1836 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ)) 1837 return -EINVAL; 1838 1839 return 0; 1840 } 1841 1842 static int __nl80211_set_channel(struct cfg80211_registered_device *rdev, 1843 struct wireless_dev *wdev, 1844 struct genl_info *info) 1845 { 1846 struct cfg80211_chan_def chandef; 1847 int result; 1848 enum nl80211_iftype iftype = NL80211_IFTYPE_MONITOR; 1849 1850 if (wdev) 1851 iftype = wdev->iftype; 1852 1853 if (!nl80211_can_set_dev_channel(wdev)) 1854 return -EOPNOTSUPP; 1855 1856 result = nl80211_parse_chandef(rdev, info, &chandef); 1857 if (result) 1858 return result; 1859 1860 switch (iftype) { 1861 case NL80211_IFTYPE_AP: 1862 case NL80211_IFTYPE_P2P_GO: 1863 if (wdev->beacon_interval) { 1864 result = -EBUSY; 1865 break; 1866 } 1867 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &chandef)) { 1868 result = -EINVAL; 1869 break; 1870 } 1871 wdev->preset_chandef = chandef; 1872 result = 0; 1873 break; 1874 case NL80211_IFTYPE_MESH_POINT: 1875 result = cfg80211_set_mesh_channel(rdev, wdev, &chandef); 1876 break; 1877 case NL80211_IFTYPE_MONITOR: 1878 result = cfg80211_set_monitor_channel(rdev, &chandef); 1879 break; 1880 default: 1881 result = -EINVAL; 1882 } 1883 1884 return result; 1885 } 1886 1887 static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info) 1888 { 1889 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 1890 struct net_device *netdev = info->user_ptr[1]; 1891 1892 return __nl80211_set_channel(rdev, netdev->ieee80211_ptr, info); 1893 } 1894 1895 static int nl80211_set_wds_peer(struct sk_buff *skb, struct genl_info *info) 1896 { 1897 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 1898 struct net_device *dev = info->user_ptr[1]; 1899 struct wireless_dev *wdev = dev->ieee80211_ptr; 1900 const u8 *bssid; 1901 1902 if (!info->attrs[NL80211_ATTR_MAC]) 1903 return -EINVAL; 1904 1905 if (netif_running(dev)) 1906 return -EBUSY; 1907 1908 if (!rdev->ops->set_wds_peer) 1909 return -EOPNOTSUPP; 1910 1911 if (wdev->iftype != NL80211_IFTYPE_WDS) 1912 return -EOPNOTSUPP; 1913 1914 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 1915 return rdev_set_wds_peer(rdev, dev, bssid); 1916 } 1917 1918 1919 static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) 1920 { 1921 struct cfg80211_registered_device *rdev; 1922 struct net_device *netdev = NULL; 1923 struct wireless_dev *wdev; 1924 int result = 0, rem_txq_params = 0; 1925 struct nlattr *nl_txq_params; 1926 u32 changed; 1927 u8 retry_short = 0, retry_long = 0; 1928 u32 frag_threshold = 0, rts_threshold = 0; 1929 u8 coverage_class = 0; 1930 1931 ASSERT_RTNL(); 1932 1933 /* 1934 * Try to find the wiphy and netdev. Normally this 1935 * function shouldn't need the netdev, but this is 1936 * done for backward compatibility -- previously 1937 * setting the channel was done per wiphy, but now 1938 * it is per netdev. Previous userland like hostapd 1939 * also passed a netdev to set_wiphy, so that it is 1940 * possible to let that go to the right netdev! 1941 */ 1942 1943 if (info->attrs[NL80211_ATTR_IFINDEX]) { 1944 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]); 1945 1946 netdev = dev_get_by_index(genl_info_net(info), ifindex); 1947 if (netdev && netdev->ieee80211_ptr) 1948 rdev = wiphy_to_dev(netdev->ieee80211_ptr->wiphy); 1949 else 1950 netdev = NULL; 1951 } 1952 1953 if (!netdev) { 1954 rdev = __cfg80211_rdev_from_attrs(genl_info_net(info), 1955 info->attrs); 1956 if (IS_ERR(rdev)) 1957 return PTR_ERR(rdev); 1958 wdev = NULL; 1959 netdev = NULL; 1960 result = 0; 1961 } else 1962 wdev = netdev->ieee80211_ptr; 1963 1964 /* 1965 * end workaround code, by now the rdev is available 1966 * and locked, and wdev may or may not be NULL. 1967 */ 1968 1969 if (info->attrs[NL80211_ATTR_WIPHY_NAME]) 1970 result = cfg80211_dev_rename( 1971 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME])); 1972 1973 if (result) 1974 goto bad_res; 1975 1976 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) { 1977 struct ieee80211_txq_params txq_params; 1978 struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1]; 1979 1980 if (!rdev->ops->set_txq_params) { 1981 result = -EOPNOTSUPP; 1982 goto bad_res; 1983 } 1984 1985 if (!netdev) { 1986 result = -EINVAL; 1987 goto bad_res; 1988 } 1989 1990 if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 1991 netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 1992 result = -EINVAL; 1993 goto bad_res; 1994 } 1995 1996 if (!netif_running(netdev)) { 1997 result = -ENETDOWN; 1998 goto bad_res; 1999 } 2000 2001 nla_for_each_nested(nl_txq_params, 2002 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], 2003 rem_txq_params) { 2004 nla_parse(tb, NL80211_TXQ_ATTR_MAX, 2005 nla_data(nl_txq_params), 2006 nla_len(nl_txq_params), 2007 txq_params_policy); 2008 result = parse_txq_params(tb, &txq_params); 2009 if (result) 2010 goto bad_res; 2011 2012 result = rdev_set_txq_params(rdev, netdev, 2013 &txq_params); 2014 if (result) 2015 goto bad_res; 2016 } 2017 } 2018 2019 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 2020 result = __nl80211_set_channel(rdev, 2021 nl80211_can_set_dev_channel(wdev) ? wdev : NULL, 2022 info); 2023 if (result) 2024 goto bad_res; 2025 } 2026 2027 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) { 2028 struct wireless_dev *txp_wdev = wdev; 2029 enum nl80211_tx_power_setting type; 2030 int idx, mbm = 0; 2031 2032 if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER)) 2033 txp_wdev = NULL; 2034 2035 if (!rdev->ops->set_tx_power) { 2036 result = -EOPNOTSUPP; 2037 goto bad_res; 2038 } 2039 2040 idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING; 2041 type = nla_get_u32(info->attrs[idx]); 2042 2043 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] && 2044 (type != NL80211_TX_POWER_AUTOMATIC)) { 2045 result = -EINVAL; 2046 goto bad_res; 2047 } 2048 2049 if (type != NL80211_TX_POWER_AUTOMATIC) { 2050 idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL; 2051 mbm = nla_get_u32(info->attrs[idx]); 2052 } 2053 2054 result = rdev_set_tx_power(rdev, txp_wdev, type, mbm); 2055 if (result) 2056 goto bad_res; 2057 } 2058 2059 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && 2060 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { 2061 u32 tx_ant, rx_ant; 2062 if ((!rdev->wiphy.available_antennas_tx && 2063 !rdev->wiphy.available_antennas_rx) || 2064 !rdev->ops->set_antenna) { 2065 result = -EOPNOTSUPP; 2066 goto bad_res; 2067 } 2068 2069 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]); 2070 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]); 2071 2072 /* reject antenna configurations which don't match the 2073 * available antenna masks, except for the "all" mask */ 2074 if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) || 2075 (~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) { 2076 result = -EINVAL; 2077 goto bad_res; 2078 } 2079 2080 tx_ant = tx_ant & rdev->wiphy.available_antennas_tx; 2081 rx_ant = rx_ant & rdev->wiphy.available_antennas_rx; 2082 2083 result = rdev_set_antenna(rdev, tx_ant, rx_ant); 2084 if (result) 2085 goto bad_res; 2086 } 2087 2088 changed = 0; 2089 2090 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) { 2091 retry_short = nla_get_u8( 2092 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]); 2093 if (retry_short == 0) { 2094 result = -EINVAL; 2095 goto bad_res; 2096 } 2097 changed |= WIPHY_PARAM_RETRY_SHORT; 2098 } 2099 2100 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) { 2101 retry_long = nla_get_u8( 2102 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]); 2103 if (retry_long == 0) { 2104 result = -EINVAL; 2105 goto bad_res; 2106 } 2107 changed |= WIPHY_PARAM_RETRY_LONG; 2108 } 2109 2110 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) { 2111 frag_threshold = nla_get_u32( 2112 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]); 2113 if (frag_threshold < 256) { 2114 result = -EINVAL; 2115 goto bad_res; 2116 } 2117 if (frag_threshold != (u32) -1) { 2118 /* 2119 * Fragments (apart from the last one) are required to 2120 * have even length. Make the fragmentation code 2121 * simpler by stripping LSB should someone try to use 2122 * odd threshold value. 2123 */ 2124 frag_threshold &= ~0x1; 2125 } 2126 changed |= WIPHY_PARAM_FRAG_THRESHOLD; 2127 } 2128 2129 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) { 2130 rts_threshold = nla_get_u32( 2131 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]); 2132 changed |= WIPHY_PARAM_RTS_THRESHOLD; 2133 } 2134 2135 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) { 2136 coverage_class = nla_get_u8( 2137 info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]); 2138 changed |= WIPHY_PARAM_COVERAGE_CLASS; 2139 } 2140 2141 if (changed) { 2142 u8 old_retry_short, old_retry_long; 2143 u32 old_frag_threshold, old_rts_threshold; 2144 u8 old_coverage_class; 2145 2146 if (!rdev->ops->set_wiphy_params) { 2147 result = -EOPNOTSUPP; 2148 goto bad_res; 2149 } 2150 2151 old_retry_short = rdev->wiphy.retry_short; 2152 old_retry_long = rdev->wiphy.retry_long; 2153 old_frag_threshold = rdev->wiphy.frag_threshold; 2154 old_rts_threshold = rdev->wiphy.rts_threshold; 2155 old_coverage_class = rdev->wiphy.coverage_class; 2156 2157 if (changed & WIPHY_PARAM_RETRY_SHORT) 2158 rdev->wiphy.retry_short = retry_short; 2159 if (changed & WIPHY_PARAM_RETRY_LONG) 2160 rdev->wiphy.retry_long = retry_long; 2161 if (changed & WIPHY_PARAM_FRAG_THRESHOLD) 2162 rdev->wiphy.frag_threshold = frag_threshold; 2163 if (changed & WIPHY_PARAM_RTS_THRESHOLD) 2164 rdev->wiphy.rts_threshold = rts_threshold; 2165 if (changed & WIPHY_PARAM_COVERAGE_CLASS) 2166 rdev->wiphy.coverage_class = coverage_class; 2167 2168 result = rdev_set_wiphy_params(rdev, changed); 2169 if (result) { 2170 rdev->wiphy.retry_short = old_retry_short; 2171 rdev->wiphy.retry_long = old_retry_long; 2172 rdev->wiphy.frag_threshold = old_frag_threshold; 2173 rdev->wiphy.rts_threshold = old_rts_threshold; 2174 rdev->wiphy.coverage_class = old_coverage_class; 2175 } 2176 } 2177 2178 bad_res: 2179 if (netdev) 2180 dev_put(netdev); 2181 return result; 2182 } 2183 2184 static inline u64 wdev_id(struct wireless_dev *wdev) 2185 { 2186 return (u64)wdev->identifier | 2187 ((u64)wiphy_to_dev(wdev->wiphy)->wiphy_idx << 32); 2188 } 2189 2190 static int nl80211_send_chandef(struct sk_buff *msg, 2191 const struct cfg80211_chan_def *chandef) 2192 { 2193 WARN_ON(!cfg80211_chandef_valid(chandef)); 2194 2195 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, 2196 chandef->chan->center_freq)) 2197 return -ENOBUFS; 2198 switch (chandef->width) { 2199 case NL80211_CHAN_WIDTH_20_NOHT: 2200 case NL80211_CHAN_WIDTH_20: 2201 case NL80211_CHAN_WIDTH_40: 2202 if (nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 2203 cfg80211_get_chandef_type(chandef))) 2204 return -ENOBUFS; 2205 break; 2206 default: 2207 break; 2208 } 2209 if (nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, chandef->width)) 2210 return -ENOBUFS; 2211 if (nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, chandef->center_freq1)) 2212 return -ENOBUFS; 2213 if (chandef->center_freq2 && 2214 nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, chandef->center_freq2)) 2215 return -ENOBUFS; 2216 return 0; 2217 } 2218 2219 static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags, 2220 struct cfg80211_registered_device *rdev, 2221 struct wireless_dev *wdev) 2222 { 2223 struct net_device *dev = wdev->netdev; 2224 void *hdr; 2225 2226 hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_INTERFACE); 2227 if (!hdr) 2228 return -1; 2229 2230 if (dev && 2231 (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 2232 nla_put_string(msg, NL80211_ATTR_IFNAME, dev->name))) 2233 goto nla_put_failure; 2234 2235 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 2236 nla_put_u32(msg, NL80211_ATTR_IFTYPE, wdev->iftype) || 2237 nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) || 2238 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, wdev_address(wdev)) || 2239 nla_put_u32(msg, NL80211_ATTR_GENERATION, 2240 rdev->devlist_generation ^ 2241 (cfg80211_rdev_list_generation << 2))) 2242 goto nla_put_failure; 2243 2244 if (rdev->ops->get_channel) { 2245 int ret; 2246 struct cfg80211_chan_def chandef; 2247 2248 ret = rdev_get_channel(rdev, wdev, &chandef); 2249 if (ret == 0) { 2250 if (nl80211_send_chandef(msg, &chandef)) 2251 goto nla_put_failure; 2252 } 2253 } 2254 2255 if (wdev->ssid_len) { 2256 if (nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid)) 2257 goto nla_put_failure; 2258 } 2259 2260 return genlmsg_end(msg, hdr); 2261 2262 nla_put_failure: 2263 genlmsg_cancel(msg, hdr); 2264 return -EMSGSIZE; 2265 } 2266 2267 static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *cb) 2268 { 2269 int wp_idx = 0; 2270 int if_idx = 0; 2271 int wp_start = cb->args[0]; 2272 int if_start = cb->args[1]; 2273 struct cfg80211_registered_device *rdev; 2274 struct wireless_dev *wdev; 2275 2276 rtnl_lock(); 2277 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 2278 if (!net_eq(wiphy_net(&rdev->wiphy), sock_net(skb->sk))) 2279 continue; 2280 if (wp_idx < wp_start) { 2281 wp_idx++; 2282 continue; 2283 } 2284 if_idx = 0; 2285 2286 list_for_each_entry(wdev, &rdev->wdev_list, list) { 2287 if (if_idx < if_start) { 2288 if_idx++; 2289 continue; 2290 } 2291 if (nl80211_send_iface(skb, NETLINK_CB(cb->skb).portid, 2292 cb->nlh->nlmsg_seq, NLM_F_MULTI, 2293 rdev, wdev) < 0) { 2294 goto out; 2295 } 2296 if_idx++; 2297 } 2298 2299 wp_idx++; 2300 } 2301 out: 2302 rtnl_unlock(); 2303 2304 cb->args[0] = wp_idx; 2305 cb->args[1] = if_idx; 2306 2307 return skb->len; 2308 } 2309 2310 static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info) 2311 { 2312 struct sk_buff *msg; 2313 struct cfg80211_registered_device *dev = info->user_ptr[0]; 2314 struct wireless_dev *wdev = info->user_ptr[1]; 2315 2316 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 2317 if (!msg) 2318 return -ENOMEM; 2319 2320 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, 2321 dev, wdev) < 0) { 2322 nlmsg_free(msg); 2323 return -ENOBUFS; 2324 } 2325 2326 return genlmsg_reply(msg, info); 2327 } 2328 2329 static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = { 2330 [NL80211_MNTR_FLAG_FCSFAIL] = { .type = NLA_FLAG }, 2331 [NL80211_MNTR_FLAG_PLCPFAIL] = { .type = NLA_FLAG }, 2332 [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG }, 2333 [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG }, 2334 [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG }, 2335 [NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG }, 2336 }; 2337 2338 static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags) 2339 { 2340 struct nlattr *flags[NL80211_MNTR_FLAG_MAX + 1]; 2341 int flag; 2342 2343 *mntrflags = 0; 2344 2345 if (!nla) 2346 return -EINVAL; 2347 2348 if (nla_parse_nested(flags, NL80211_MNTR_FLAG_MAX, 2349 nla, mntr_flags_policy)) 2350 return -EINVAL; 2351 2352 for (flag = 1; flag <= NL80211_MNTR_FLAG_MAX; flag++) 2353 if (flags[flag]) 2354 *mntrflags |= (1<<flag); 2355 2356 return 0; 2357 } 2358 2359 static int nl80211_valid_4addr(struct cfg80211_registered_device *rdev, 2360 struct net_device *netdev, u8 use_4addr, 2361 enum nl80211_iftype iftype) 2362 { 2363 if (!use_4addr) { 2364 if (netdev && (netdev->priv_flags & IFF_BRIDGE_PORT)) 2365 return -EBUSY; 2366 return 0; 2367 } 2368 2369 switch (iftype) { 2370 case NL80211_IFTYPE_AP_VLAN: 2371 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP) 2372 return 0; 2373 break; 2374 case NL80211_IFTYPE_STATION: 2375 if (rdev->wiphy.flags & WIPHY_FLAG_4ADDR_STATION) 2376 return 0; 2377 break; 2378 default: 2379 break; 2380 } 2381 2382 return -EOPNOTSUPP; 2383 } 2384 2385 static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info) 2386 { 2387 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2388 struct vif_params params; 2389 int err; 2390 enum nl80211_iftype otype, ntype; 2391 struct net_device *dev = info->user_ptr[1]; 2392 u32 _flags, *flags = NULL; 2393 bool change = false; 2394 2395 memset(¶ms, 0, sizeof(params)); 2396 2397 otype = ntype = dev->ieee80211_ptr->iftype; 2398 2399 if (info->attrs[NL80211_ATTR_IFTYPE]) { 2400 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); 2401 if (otype != ntype) 2402 change = true; 2403 if (ntype > NL80211_IFTYPE_MAX) 2404 return -EINVAL; 2405 } 2406 2407 if (info->attrs[NL80211_ATTR_MESH_ID]) { 2408 struct wireless_dev *wdev = dev->ieee80211_ptr; 2409 2410 if (ntype != NL80211_IFTYPE_MESH_POINT) 2411 return -EINVAL; 2412 if (netif_running(dev)) 2413 return -EBUSY; 2414 2415 wdev_lock(wdev); 2416 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN != 2417 IEEE80211_MAX_MESH_ID_LEN); 2418 wdev->mesh_id_up_len = 2419 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 2420 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]), 2421 wdev->mesh_id_up_len); 2422 wdev_unlock(wdev); 2423 } 2424 2425 if (info->attrs[NL80211_ATTR_4ADDR]) { 2426 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); 2427 change = true; 2428 err = nl80211_valid_4addr(rdev, dev, params.use_4addr, ntype); 2429 if (err) 2430 return err; 2431 } else { 2432 params.use_4addr = -1; 2433 } 2434 2435 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) { 2436 if (ntype != NL80211_IFTYPE_MONITOR) 2437 return -EINVAL; 2438 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS], 2439 &_flags); 2440 if (err) 2441 return err; 2442 2443 flags = &_flags; 2444 change = true; 2445 } 2446 2447 if (flags && (*flags & MONITOR_FLAG_ACTIVE) && 2448 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) 2449 return -EOPNOTSUPP; 2450 2451 if (change) 2452 err = cfg80211_change_iface(rdev, dev, ntype, flags, ¶ms); 2453 else 2454 err = 0; 2455 2456 if (!err && params.use_4addr != -1) 2457 dev->ieee80211_ptr->use_4addr = params.use_4addr; 2458 2459 return err; 2460 } 2461 2462 static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) 2463 { 2464 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2465 struct vif_params params; 2466 struct wireless_dev *wdev; 2467 struct sk_buff *msg; 2468 int err; 2469 enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED; 2470 u32 flags; 2471 2472 memset(¶ms, 0, sizeof(params)); 2473 2474 if (!info->attrs[NL80211_ATTR_IFNAME]) 2475 return -EINVAL; 2476 2477 if (info->attrs[NL80211_ATTR_IFTYPE]) { 2478 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]); 2479 if (type > NL80211_IFTYPE_MAX) 2480 return -EINVAL; 2481 } 2482 2483 if (!rdev->ops->add_virtual_intf || 2484 !(rdev->wiphy.interface_modes & (1 << type))) 2485 return -EOPNOTSUPP; 2486 2487 if (type == NL80211_IFTYPE_P2P_DEVICE && info->attrs[NL80211_ATTR_MAC]) { 2488 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC], 2489 ETH_ALEN); 2490 if (!is_valid_ether_addr(params.macaddr)) 2491 return -EADDRNOTAVAIL; 2492 } 2493 2494 if (info->attrs[NL80211_ATTR_4ADDR]) { 2495 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]); 2496 err = nl80211_valid_4addr(rdev, NULL, params.use_4addr, type); 2497 if (err) 2498 return err; 2499 } 2500 2501 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 2502 if (!msg) 2503 return -ENOMEM; 2504 2505 err = parse_monitor_flags(type == NL80211_IFTYPE_MONITOR ? 2506 info->attrs[NL80211_ATTR_MNTR_FLAGS] : NULL, 2507 &flags); 2508 2509 if (!err && (flags & MONITOR_FLAG_ACTIVE) && 2510 !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) 2511 return -EOPNOTSUPP; 2512 2513 wdev = rdev_add_virtual_intf(rdev, 2514 nla_data(info->attrs[NL80211_ATTR_IFNAME]), 2515 type, err ? NULL : &flags, ¶ms); 2516 if (IS_ERR(wdev)) { 2517 nlmsg_free(msg); 2518 return PTR_ERR(wdev); 2519 } 2520 2521 switch (type) { 2522 case NL80211_IFTYPE_MESH_POINT: 2523 if (!info->attrs[NL80211_ATTR_MESH_ID]) 2524 break; 2525 wdev_lock(wdev); 2526 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN != 2527 IEEE80211_MAX_MESH_ID_LEN); 2528 wdev->mesh_id_up_len = 2529 nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 2530 memcpy(wdev->ssid, nla_data(info->attrs[NL80211_ATTR_MESH_ID]), 2531 wdev->mesh_id_up_len); 2532 wdev_unlock(wdev); 2533 break; 2534 case NL80211_IFTYPE_P2P_DEVICE: 2535 /* 2536 * P2P Device doesn't have a netdev, so doesn't go 2537 * through the netdev notifier and must be added here 2538 */ 2539 mutex_init(&wdev->mtx); 2540 INIT_LIST_HEAD(&wdev->event_list); 2541 spin_lock_init(&wdev->event_lock); 2542 INIT_LIST_HEAD(&wdev->mgmt_registrations); 2543 spin_lock_init(&wdev->mgmt_registrations_lock); 2544 2545 wdev->identifier = ++rdev->wdev_id; 2546 list_add_rcu(&wdev->list, &rdev->wdev_list); 2547 rdev->devlist_generation++; 2548 break; 2549 default: 2550 break; 2551 } 2552 2553 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0, 2554 rdev, wdev) < 0) { 2555 nlmsg_free(msg); 2556 return -ENOBUFS; 2557 } 2558 2559 return genlmsg_reply(msg, info); 2560 } 2561 2562 static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info) 2563 { 2564 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2565 struct wireless_dev *wdev = info->user_ptr[1]; 2566 2567 if (!rdev->ops->del_virtual_intf) 2568 return -EOPNOTSUPP; 2569 2570 /* 2571 * If we remove a wireless device without a netdev then clear 2572 * user_ptr[1] so that nl80211_post_doit won't dereference it 2573 * to check if it needs to do dev_put(). Otherwise it crashes 2574 * since the wdev has been freed, unlike with a netdev where 2575 * we need the dev_put() for the netdev to really be freed. 2576 */ 2577 if (!wdev->netdev) 2578 info->user_ptr[1] = NULL; 2579 2580 return rdev_del_virtual_intf(rdev, wdev); 2581 } 2582 2583 static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info) 2584 { 2585 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2586 struct net_device *dev = info->user_ptr[1]; 2587 u16 noack_map; 2588 2589 if (!info->attrs[NL80211_ATTR_NOACK_MAP]) 2590 return -EINVAL; 2591 2592 if (!rdev->ops->set_noack_map) 2593 return -EOPNOTSUPP; 2594 2595 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]); 2596 2597 return rdev_set_noack_map(rdev, dev, noack_map); 2598 } 2599 2600 struct get_key_cookie { 2601 struct sk_buff *msg; 2602 int error; 2603 int idx; 2604 }; 2605 2606 static void get_key_callback(void *c, struct key_params *params) 2607 { 2608 struct nlattr *key; 2609 struct get_key_cookie *cookie = c; 2610 2611 if ((params->key && 2612 nla_put(cookie->msg, NL80211_ATTR_KEY_DATA, 2613 params->key_len, params->key)) || 2614 (params->seq && 2615 nla_put(cookie->msg, NL80211_ATTR_KEY_SEQ, 2616 params->seq_len, params->seq)) || 2617 (params->cipher && 2618 nla_put_u32(cookie->msg, NL80211_ATTR_KEY_CIPHER, 2619 params->cipher))) 2620 goto nla_put_failure; 2621 2622 key = nla_nest_start(cookie->msg, NL80211_ATTR_KEY); 2623 if (!key) 2624 goto nla_put_failure; 2625 2626 if ((params->key && 2627 nla_put(cookie->msg, NL80211_KEY_DATA, 2628 params->key_len, params->key)) || 2629 (params->seq && 2630 nla_put(cookie->msg, NL80211_KEY_SEQ, 2631 params->seq_len, params->seq)) || 2632 (params->cipher && 2633 nla_put_u32(cookie->msg, NL80211_KEY_CIPHER, 2634 params->cipher))) 2635 goto nla_put_failure; 2636 2637 if (nla_put_u8(cookie->msg, NL80211_ATTR_KEY_IDX, cookie->idx)) 2638 goto nla_put_failure; 2639 2640 nla_nest_end(cookie->msg, key); 2641 2642 return; 2643 nla_put_failure: 2644 cookie->error = 1; 2645 } 2646 2647 static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) 2648 { 2649 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2650 int err; 2651 struct net_device *dev = info->user_ptr[1]; 2652 u8 key_idx = 0; 2653 const u8 *mac_addr = NULL; 2654 bool pairwise; 2655 struct get_key_cookie cookie = { 2656 .error = 0, 2657 }; 2658 void *hdr; 2659 struct sk_buff *msg; 2660 2661 if (info->attrs[NL80211_ATTR_KEY_IDX]) 2662 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]); 2663 2664 if (key_idx > 5) 2665 return -EINVAL; 2666 2667 if (info->attrs[NL80211_ATTR_MAC]) 2668 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 2669 2670 pairwise = !!mac_addr; 2671 if (info->attrs[NL80211_ATTR_KEY_TYPE]) { 2672 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]); 2673 if (kt >= NUM_NL80211_KEYTYPES) 2674 return -EINVAL; 2675 if (kt != NL80211_KEYTYPE_GROUP && 2676 kt != NL80211_KEYTYPE_PAIRWISE) 2677 return -EINVAL; 2678 pairwise = kt == NL80211_KEYTYPE_PAIRWISE; 2679 } 2680 2681 if (!rdev->ops->get_key) 2682 return -EOPNOTSUPP; 2683 2684 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 2685 if (!msg) 2686 return -ENOMEM; 2687 2688 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 2689 NL80211_CMD_NEW_KEY); 2690 if (!hdr) 2691 goto nla_put_failure; 2692 2693 cookie.msg = msg; 2694 cookie.idx = key_idx; 2695 2696 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 2697 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_idx)) 2698 goto nla_put_failure; 2699 if (mac_addr && 2700 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr)) 2701 goto nla_put_failure; 2702 2703 if (pairwise && mac_addr && 2704 !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) 2705 return -ENOENT; 2706 2707 err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie, 2708 get_key_callback); 2709 2710 if (err) 2711 goto free_msg; 2712 2713 if (cookie.error) 2714 goto nla_put_failure; 2715 2716 genlmsg_end(msg, hdr); 2717 return genlmsg_reply(msg, info); 2718 2719 nla_put_failure: 2720 err = -ENOBUFS; 2721 free_msg: 2722 nlmsg_free(msg); 2723 return err; 2724 } 2725 2726 static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info) 2727 { 2728 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2729 struct key_parse key; 2730 int err; 2731 struct net_device *dev = info->user_ptr[1]; 2732 2733 err = nl80211_parse_key(info, &key); 2734 if (err) 2735 return err; 2736 2737 if (key.idx < 0) 2738 return -EINVAL; 2739 2740 /* only support setting default key */ 2741 if (!key.def && !key.defmgmt) 2742 return -EINVAL; 2743 2744 wdev_lock(dev->ieee80211_ptr); 2745 2746 if (key.def) { 2747 if (!rdev->ops->set_default_key) { 2748 err = -EOPNOTSUPP; 2749 goto out; 2750 } 2751 2752 err = nl80211_key_allowed(dev->ieee80211_ptr); 2753 if (err) 2754 goto out; 2755 2756 err = rdev_set_default_key(rdev, dev, key.idx, 2757 key.def_uni, key.def_multi); 2758 2759 if (err) 2760 goto out; 2761 2762 #ifdef CONFIG_CFG80211_WEXT 2763 dev->ieee80211_ptr->wext.default_key = key.idx; 2764 #endif 2765 } else { 2766 if (key.def_uni || !key.def_multi) { 2767 err = -EINVAL; 2768 goto out; 2769 } 2770 2771 if (!rdev->ops->set_default_mgmt_key) { 2772 err = -EOPNOTSUPP; 2773 goto out; 2774 } 2775 2776 err = nl80211_key_allowed(dev->ieee80211_ptr); 2777 if (err) 2778 goto out; 2779 2780 err = rdev_set_default_mgmt_key(rdev, dev, key.idx); 2781 if (err) 2782 goto out; 2783 2784 #ifdef CONFIG_CFG80211_WEXT 2785 dev->ieee80211_ptr->wext.default_mgmt_key = key.idx; 2786 #endif 2787 } 2788 2789 out: 2790 wdev_unlock(dev->ieee80211_ptr); 2791 2792 return err; 2793 } 2794 2795 static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info) 2796 { 2797 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2798 int err; 2799 struct net_device *dev = info->user_ptr[1]; 2800 struct key_parse key; 2801 const u8 *mac_addr = NULL; 2802 2803 err = nl80211_parse_key(info, &key); 2804 if (err) 2805 return err; 2806 2807 if (!key.p.key) 2808 return -EINVAL; 2809 2810 if (info->attrs[NL80211_ATTR_MAC]) 2811 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 2812 2813 if (key.type == -1) { 2814 if (mac_addr) 2815 key.type = NL80211_KEYTYPE_PAIRWISE; 2816 else 2817 key.type = NL80211_KEYTYPE_GROUP; 2818 } 2819 2820 /* for now */ 2821 if (key.type != NL80211_KEYTYPE_PAIRWISE && 2822 key.type != NL80211_KEYTYPE_GROUP) 2823 return -EINVAL; 2824 2825 if (!rdev->ops->add_key) 2826 return -EOPNOTSUPP; 2827 2828 if (cfg80211_validate_key_settings(rdev, &key.p, key.idx, 2829 key.type == NL80211_KEYTYPE_PAIRWISE, 2830 mac_addr)) 2831 return -EINVAL; 2832 2833 wdev_lock(dev->ieee80211_ptr); 2834 err = nl80211_key_allowed(dev->ieee80211_ptr); 2835 if (!err) 2836 err = rdev_add_key(rdev, dev, key.idx, 2837 key.type == NL80211_KEYTYPE_PAIRWISE, 2838 mac_addr, &key.p); 2839 wdev_unlock(dev->ieee80211_ptr); 2840 2841 return err; 2842 } 2843 2844 static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info) 2845 { 2846 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2847 int err; 2848 struct net_device *dev = info->user_ptr[1]; 2849 u8 *mac_addr = NULL; 2850 struct key_parse key; 2851 2852 err = nl80211_parse_key(info, &key); 2853 if (err) 2854 return err; 2855 2856 if (info->attrs[NL80211_ATTR_MAC]) 2857 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 2858 2859 if (key.type == -1) { 2860 if (mac_addr) 2861 key.type = NL80211_KEYTYPE_PAIRWISE; 2862 else 2863 key.type = NL80211_KEYTYPE_GROUP; 2864 } 2865 2866 /* for now */ 2867 if (key.type != NL80211_KEYTYPE_PAIRWISE && 2868 key.type != NL80211_KEYTYPE_GROUP) 2869 return -EINVAL; 2870 2871 if (!rdev->ops->del_key) 2872 return -EOPNOTSUPP; 2873 2874 wdev_lock(dev->ieee80211_ptr); 2875 err = nl80211_key_allowed(dev->ieee80211_ptr); 2876 2877 if (key.type == NL80211_KEYTYPE_PAIRWISE && mac_addr && 2878 !(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN)) 2879 err = -ENOENT; 2880 2881 if (!err) 2882 err = rdev_del_key(rdev, dev, key.idx, 2883 key.type == NL80211_KEYTYPE_PAIRWISE, 2884 mac_addr); 2885 2886 #ifdef CONFIG_CFG80211_WEXT 2887 if (!err) { 2888 if (key.idx == dev->ieee80211_ptr->wext.default_key) 2889 dev->ieee80211_ptr->wext.default_key = -1; 2890 else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key) 2891 dev->ieee80211_ptr->wext.default_mgmt_key = -1; 2892 } 2893 #endif 2894 wdev_unlock(dev->ieee80211_ptr); 2895 2896 return err; 2897 } 2898 2899 /* This function returns an error or the number of nested attributes */ 2900 static int validate_acl_mac_addrs(struct nlattr *nl_attr) 2901 { 2902 struct nlattr *attr; 2903 int n_entries = 0, tmp; 2904 2905 nla_for_each_nested(attr, nl_attr, tmp) { 2906 if (nla_len(attr) != ETH_ALEN) 2907 return -EINVAL; 2908 2909 n_entries++; 2910 } 2911 2912 return n_entries; 2913 } 2914 2915 /* 2916 * This function parses ACL information and allocates memory for ACL data. 2917 * On successful return, the calling function is responsible to free the 2918 * ACL buffer returned by this function. 2919 */ 2920 static struct cfg80211_acl_data *parse_acl_data(struct wiphy *wiphy, 2921 struct genl_info *info) 2922 { 2923 enum nl80211_acl_policy acl_policy; 2924 struct nlattr *attr; 2925 struct cfg80211_acl_data *acl; 2926 int i = 0, n_entries, tmp; 2927 2928 if (!wiphy->max_acl_mac_addrs) 2929 return ERR_PTR(-EOPNOTSUPP); 2930 2931 if (!info->attrs[NL80211_ATTR_ACL_POLICY]) 2932 return ERR_PTR(-EINVAL); 2933 2934 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]); 2935 if (acl_policy != NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED && 2936 acl_policy != NL80211_ACL_POLICY_DENY_UNLESS_LISTED) 2937 return ERR_PTR(-EINVAL); 2938 2939 if (!info->attrs[NL80211_ATTR_MAC_ADDRS]) 2940 return ERR_PTR(-EINVAL); 2941 2942 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]); 2943 if (n_entries < 0) 2944 return ERR_PTR(n_entries); 2945 2946 if (n_entries > wiphy->max_acl_mac_addrs) 2947 return ERR_PTR(-ENOTSUPP); 2948 2949 acl = kzalloc(sizeof(*acl) + (sizeof(struct mac_address) * n_entries), 2950 GFP_KERNEL); 2951 if (!acl) 2952 return ERR_PTR(-ENOMEM); 2953 2954 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { 2955 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); 2956 i++; 2957 } 2958 2959 acl->n_acl_entries = n_entries; 2960 acl->acl_policy = acl_policy; 2961 2962 return acl; 2963 } 2964 2965 static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info) 2966 { 2967 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 2968 struct net_device *dev = info->user_ptr[1]; 2969 struct cfg80211_acl_data *acl; 2970 int err; 2971 2972 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 2973 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 2974 return -EOPNOTSUPP; 2975 2976 if (!dev->ieee80211_ptr->beacon_interval) 2977 return -EINVAL; 2978 2979 acl = parse_acl_data(&rdev->wiphy, info); 2980 if (IS_ERR(acl)) 2981 return PTR_ERR(acl); 2982 2983 err = rdev_set_mac_acl(rdev, dev, acl); 2984 2985 kfree(acl); 2986 2987 return err; 2988 } 2989 2990 static int nl80211_parse_beacon(struct nlattr *attrs[], 2991 struct cfg80211_beacon_data *bcn) 2992 { 2993 bool haveinfo = false; 2994 2995 if (!is_valid_ie_attr(attrs[NL80211_ATTR_BEACON_TAIL]) || 2996 !is_valid_ie_attr(attrs[NL80211_ATTR_IE]) || 2997 !is_valid_ie_attr(attrs[NL80211_ATTR_IE_PROBE_RESP]) || 2998 !is_valid_ie_attr(attrs[NL80211_ATTR_IE_ASSOC_RESP])) 2999 return -EINVAL; 3000 3001 memset(bcn, 0, sizeof(*bcn)); 3002 3003 if (attrs[NL80211_ATTR_BEACON_HEAD]) { 3004 bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]); 3005 bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]); 3006 if (!bcn->head_len) 3007 return -EINVAL; 3008 haveinfo = true; 3009 } 3010 3011 if (attrs[NL80211_ATTR_BEACON_TAIL]) { 3012 bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]); 3013 bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]); 3014 haveinfo = true; 3015 } 3016 3017 if (!haveinfo) 3018 return -EINVAL; 3019 3020 if (attrs[NL80211_ATTR_IE]) { 3021 bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]); 3022 bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]); 3023 } 3024 3025 if (attrs[NL80211_ATTR_IE_PROBE_RESP]) { 3026 bcn->proberesp_ies = 3027 nla_data(attrs[NL80211_ATTR_IE_PROBE_RESP]); 3028 bcn->proberesp_ies_len = 3029 nla_len(attrs[NL80211_ATTR_IE_PROBE_RESP]); 3030 } 3031 3032 if (attrs[NL80211_ATTR_IE_ASSOC_RESP]) { 3033 bcn->assocresp_ies = 3034 nla_data(attrs[NL80211_ATTR_IE_ASSOC_RESP]); 3035 bcn->assocresp_ies_len = 3036 nla_len(attrs[NL80211_ATTR_IE_ASSOC_RESP]); 3037 } 3038 3039 if (attrs[NL80211_ATTR_PROBE_RESP]) { 3040 bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]); 3041 bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]); 3042 } 3043 3044 return 0; 3045 } 3046 3047 static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev, 3048 struct cfg80211_ap_settings *params) 3049 { 3050 struct wireless_dev *wdev; 3051 bool ret = false; 3052 3053 list_for_each_entry(wdev, &rdev->wdev_list, list) { 3054 if (wdev->iftype != NL80211_IFTYPE_AP && 3055 wdev->iftype != NL80211_IFTYPE_P2P_GO) 3056 continue; 3057 3058 if (!wdev->preset_chandef.chan) 3059 continue; 3060 3061 params->chandef = wdev->preset_chandef; 3062 ret = true; 3063 break; 3064 } 3065 3066 return ret; 3067 } 3068 3069 static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev, 3070 enum nl80211_auth_type auth_type, 3071 enum nl80211_commands cmd) 3072 { 3073 if (auth_type > NL80211_AUTHTYPE_MAX) 3074 return false; 3075 3076 switch (cmd) { 3077 case NL80211_CMD_AUTHENTICATE: 3078 if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) && 3079 auth_type == NL80211_AUTHTYPE_SAE) 3080 return false; 3081 return true; 3082 case NL80211_CMD_CONNECT: 3083 case NL80211_CMD_START_AP: 3084 /* SAE not supported yet */ 3085 if (auth_type == NL80211_AUTHTYPE_SAE) 3086 return false; 3087 return true; 3088 default: 3089 return false; 3090 } 3091 } 3092 3093 static int nl80211_start_ap(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 struct wireless_dev *wdev = dev->ieee80211_ptr; 3098 struct cfg80211_ap_settings params; 3099 int err; 3100 u8 radar_detect_width = 0; 3101 3102 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 3103 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 3104 return -EOPNOTSUPP; 3105 3106 if (!rdev->ops->start_ap) 3107 return -EOPNOTSUPP; 3108 3109 if (wdev->beacon_interval) 3110 return -EALREADY; 3111 3112 memset(¶ms, 0, sizeof(params)); 3113 3114 /* these are required for START_AP */ 3115 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] || 3116 !info->attrs[NL80211_ATTR_DTIM_PERIOD] || 3117 !info->attrs[NL80211_ATTR_BEACON_HEAD]) 3118 return -EINVAL; 3119 3120 err = nl80211_parse_beacon(info->attrs, ¶ms.beacon); 3121 if (err) 3122 return err; 3123 3124 params.beacon_interval = 3125 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 3126 params.dtim_period = 3127 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 3128 3129 err = cfg80211_validate_beacon_int(rdev, params.beacon_interval); 3130 if (err) 3131 return err; 3132 3133 /* 3134 * In theory, some of these attributes should be required here 3135 * but since they were not used when the command was originally 3136 * added, keep them optional for old user space programs to let 3137 * them continue to work with drivers that do not need the 3138 * additional information -- drivers must check! 3139 */ 3140 if (info->attrs[NL80211_ATTR_SSID]) { 3141 params.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 3142 params.ssid_len = 3143 nla_len(info->attrs[NL80211_ATTR_SSID]); 3144 if (params.ssid_len == 0 || 3145 params.ssid_len > IEEE80211_MAX_SSID_LEN) 3146 return -EINVAL; 3147 } 3148 3149 if (info->attrs[NL80211_ATTR_HIDDEN_SSID]) { 3150 params.hidden_ssid = nla_get_u32( 3151 info->attrs[NL80211_ATTR_HIDDEN_SSID]); 3152 if (params.hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE && 3153 params.hidden_ssid != NL80211_HIDDEN_SSID_ZERO_LEN && 3154 params.hidden_ssid != NL80211_HIDDEN_SSID_ZERO_CONTENTS) 3155 return -EINVAL; 3156 } 3157 3158 params.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 3159 3160 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 3161 params.auth_type = nla_get_u32( 3162 info->attrs[NL80211_ATTR_AUTH_TYPE]); 3163 if (!nl80211_valid_auth_type(rdev, params.auth_type, 3164 NL80211_CMD_START_AP)) 3165 return -EINVAL; 3166 } else 3167 params.auth_type = NL80211_AUTHTYPE_AUTOMATIC; 3168 3169 err = nl80211_crypto_settings(rdev, info, ¶ms.crypto, 3170 NL80211_MAX_NR_CIPHER_SUITES); 3171 if (err) 3172 return err; 3173 3174 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) { 3175 if (!(rdev->wiphy.features & NL80211_FEATURE_INACTIVITY_TIMER)) 3176 return -EOPNOTSUPP; 3177 params.inactivity_timeout = nla_get_u16( 3178 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]); 3179 } 3180 3181 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 3182 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 3183 return -EINVAL; 3184 params.p2p_ctwindow = 3185 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 3186 if (params.p2p_ctwindow > 127) 3187 return -EINVAL; 3188 if (params.p2p_ctwindow != 0 && 3189 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) 3190 return -EINVAL; 3191 } 3192 3193 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 3194 u8 tmp; 3195 3196 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 3197 return -EINVAL; 3198 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 3199 if (tmp > 1) 3200 return -EINVAL; 3201 params.p2p_opp_ps = tmp; 3202 if (params.p2p_opp_ps != 0 && 3203 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) 3204 return -EINVAL; 3205 } 3206 3207 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 3208 err = nl80211_parse_chandef(rdev, info, ¶ms.chandef); 3209 if (err) 3210 return err; 3211 } else if (wdev->preset_chandef.chan) { 3212 params.chandef = wdev->preset_chandef; 3213 } else if (!nl80211_get_ap_channel(rdev, ¶ms)) 3214 return -EINVAL; 3215 3216 if (!cfg80211_reg_can_beacon(&rdev->wiphy, ¶ms.chandef)) 3217 return -EINVAL; 3218 3219 err = cfg80211_chandef_dfs_required(wdev->wiphy, ¶ms.chandef); 3220 if (err < 0) 3221 return err; 3222 if (err) { 3223 radar_detect_width = BIT(params.chandef.width); 3224 params.radar_required = true; 3225 } 3226 3227 err = cfg80211_can_use_iftype_chan(rdev, wdev, wdev->iftype, 3228 params.chandef.chan, 3229 CHAN_MODE_SHARED, 3230 radar_detect_width); 3231 if (err) 3232 return err; 3233 3234 if (info->attrs[NL80211_ATTR_ACL_POLICY]) { 3235 params.acl = parse_acl_data(&rdev->wiphy, info); 3236 if (IS_ERR(params.acl)) 3237 return PTR_ERR(params.acl); 3238 } 3239 3240 wdev_lock(wdev); 3241 err = rdev_start_ap(rdev, dev, ¶ms); 3242 if (!err) { 3243 wdev->preset_chandef = params.chandef; 3244 wdev->beacon_interval = params.beacon_interval; 3245 wdev->channel = params.chandef.chan; 3246 wdev->ssid_len = params.ssid_len; 3247 memcpy(wdev->ssid, params.ssid, wdev->ssid_len); 3248 } 3249 wdev_unlock(wdev); 3250 3251 kfree(params.acl); 3252 3253 return err; 3254 } 3255 3256 static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info) 3257 { 3258 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3259 struct net_device *dev = info->user_ptr[1]; 3260 struct wireless_dev *wdev = dev->ieee80211_ptr; 3261 struct cfg80211_beacon_data params; 3262 int err; 3263 3264 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 3265 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 3266 return -EOPNOTSUPP; 3267 3268 if (!rdev->ops->change_beacon) 3269 return -EOPNOTSUPP; 3270 3271 if (!wdev->beacon_interval) 3272 return -EINVAL; 3273 3274 err = nl80211_parse_beacon(info->attrs, ¶ms); 3275 if (err) 3276 return err; 3277 3278 wdev_lock(wdev); 3279 err = rdev_change_beacon(rdev, dev, ¶ms); 3280 wdev_unlock(wdev); 3281 3282 return err; 3283 } 3284 3285 static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info) 3286 { 3287 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3288 struct net_device *dev = info->user_ptr[1]; 3289 3290 return cfg80211_stop_ap(rdev, dev); 3291 } 3292 3293 static const struct nla_policy sta_flags_policy[NL80211_STA_FLAG_MAX + 1] = { 3294 [NL80211_STA_FLAG_AUTHORIZED] = { .type = NLA_FLAG }, 3295 [NL80211_STA_FLAG_SHORT_PREAMBLE] = { .type = NLA_FLAG }, 3296 [NL80211_STA_FLAG_WME] = { .type = NLA_FLAG }, 3297 [NL80211_STA_FLAG_MFP] = { .type = NLA_FLAG }, 3298 [NL80211_STA_FLAG_AUTHENTICATED] = { .type = NLA_FLAG }, 3299 [NL80211_STA_FLAG_TDLS_PEER] = { .type = NLA_FLAG }, 3300 }; 3301 3302 static int parse_station_flags(struct genl_info *info, 3303 enum nl80211_iftype iftype, 3304 struct station_parameters *params) 3305 { 3306 struct nlattr *flags[NL80211_STA_FLAG_MAX + 1]; 3307 struct nlattr *nla; 3308 int flag; 3309 3310 /* 3311 * Try parsing the new attribute first so userspace 3312 * can specify both for older kernels. 3313 */ 3314 nla = info->attrs[NL80211_ATTR_STA_FLAGS2]; 3315 if (nla) { 3316 struct nl80211_sta_flag_update *sta_flags; 3317 3318 sta_flags = nla_data(nla); 3319 params->sta_flags_mask = sta_flags->mask; 3320 params->sta_flags_set = sta_flags->set; 3321 params->sta_flags_set &= params->sta_flags_mask; 3322 if ((params->sta_flags_mask | 3323 params->sta_flags_set) & BIT(__NL80211_STA_FLAG_INVALID)) 3324 return -EINVAL; 3325 return 0; 3326 } 3327 3328 /* if present, parse the old attribute */ 3329 3330 nla = info->attrs[NL80211_ATTR_STA_FLAGS]; 3331 if (!nla) 3332 return 0; 3333 3334 if (nla_parse_nested(flags, NL80211_STA_FLAG_MAX, 3335 nla, sta_flags_policy)) 3336 return -EINVAL; 3337 3338 /* 3339 * Only allow certain flags for interface types so that 3340 * other attributes are silently ignored. Remember that 3341 * this is backward compatibility code with old userspace 3342 * and shouldn't be hit in other cases anyway. 3343 */ 3344 switch (iftype) { 3345 case NL80211_IFTYPE_AP: 3346 case NL80211_IFTYPE_AP_VLAN: 3347 case NL80211_IFTYPE_P2P_GO: 3348 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 3349 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 3350 BIT(NL80211_STA_FLAG_WME) | 3351 BIT(NL80211_STA_FLAG_MFP); 3352 break; 3353 case NL80211_IFTYPE_P2P_CLIENT: 3354 case NL80211_IFTYPE_STATION: 3355 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHORIZED) | 3356 BIT(NL80211_STA_FLAG_TDLS_PEER); 3357 break; 3358 case NL80211_IFTYPE_MESH_POINT: 3359 params->sta_flags_mask = BIT(NL80211_STA_FLAG_AUTHENTICATED) | 3360 BIT(NL80211_STA_FLAG_MFP) | 3361 BIT(NL80211_STA_FLAG_AUTHORIZED); 3362 default: 3363 return -EINVAL; 3364 } 3365 3366 for (flag = 1; flag <= NL80211_STA_FLAG_MAX; flag++) { 3367 if (flags[flag]) { 3368 params->sta_flags_set |= (1<<flag); 3369 3370 /* no longer support new API additions in old API */ 3371 if (flag > NL80211_STA_FLAG_MAX_OLD_API) 3372 return -EINVAL; 3373 } 3374 } 3375 3376 return 0; 3377 } 3378 3379 static bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info, 3380 int attr) 3381 { 3382 struct nlattr *rate; 3383 u32 bitrate; 3384 u16 bitrate_compat; 3385 3386 rate = nla_nest_start(msg, attr); 3387 if (!rate) 3388 return false; 3389 3390 /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */ 3391 bitrate = cfg80211_calculate_bitrate(info); 3392 /* report 16-bit bitrate only if we can */ 3393 bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0; 3394 if (bitrate > 0 && 3395 nla_put_u32(msg, NL80211_RATE_INFO_BITRATE32, bitrate)) 3396 return false; 3397 if (bitrate_compat > 0 && 3398 nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat)) 3399 return false; 3400 3401 if (info->flags & RATE_INFO_FLAGS_MCS) { 3402 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) 3403 return false; 3404 if (info->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH && 3405 nla_put_flag(msg, NL80211_RATE_INFO_40_MHZ_WIDTH)) 3406 return false; 3407 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 3408 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 3409 return false; 3410 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) { 3411 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs)) 3412 return false; 3413 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) 3414 return false; 3415 if (info->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH && 3416 nla_put_flag(msg, NL80211_RATE_INFO_40_MHZ_WIDTH)) 3417 return false; 3418 if (info->flags & RATE_INFO_FLAGS_80_MHZ_WIDTH && 3419 nla_put_flag(msg, NL80211_RATE_INFO_80_MHZ_WIDTH)) 3420 return false; 3421 if (info->flags & RATE_INFO_FLAGS_80P80_MHZ_WIDTH && 3422 nla_put_flag(msg, NL80211_RATE_INFO_80P80_MHZ_WIDTH)) 3423 return false; 3424 if (info->flags & RATE_INFO_FLAGS_160_MHZ_WIDTH && 3425 nla_put_flag(msg, NL80211_RATE_INFO_160_MHZ_WIDTH)) 3426 return false; 3427 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 3428 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 3429 return false; 3430 } 3431 3432 nla_nest_end(msg, rate); 3433 return true; 3434 } 3435 3436 static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal, 3437 int id) 3438 { 3439 void *attr; 3440 int i = 0; 3441 3442 if (!mask) 3443 return true; 3444 3445 attr = nla_nest_start(msg, id); 3446 if (!attr) 3447 return false; 3448 3449 for (i = 0; i < IEEE80211_MAX_CHAINS; i++) { 3450 if (!(mask & BIT(i))) 3451 continue; 3452 3453 if (nla_put_u8(msg, i, signal[i])) 3454 return false; 3455 } 3456 3457 nla_nest_end(msg, attr); 3458 3459 return true; 3460 } 3461 3462 static int nl80211_send_station(struct sk_buff *msg, u32 portid, u32 seq, 3463 int flags, 3464 struct cfg80211_registered_device *rdev, 3465 struct net_device *dev, 3466 const u8 *mac_addr, struct station_info *sinfo) 3467 { 3468 void *hdr; 3469 struct nlattr *sinfoattr, *bss_param; 3470 3471 hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_STATION); 3472 if (!hdr) 3473 return -1; 3474 3475 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 3476 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 3477 nla_put_u32(msg, NL80211_ATTR_GENERATION, sinfo->generation)) 3478 goto nla_put_failure; 3479 3480 sinfoattr = nla_nest_start(msg, NL80211_ATTR_STA_INFO); 3481 if (!sinfoattr) 3482 goto nla_put_failure; 3483 if ((sinfo->filled & STATION_INFO_CONNECTED_TIME) && 3484 nla_put_u32(msg, NL80211_STA_INFO_CONNECTED_TIME, 3485 sinfo->connected_time)) 3486 goto nla_put_failure; 3487 if ((sinfo->filled & STATION_INFO_INACTIVE_TIME) && 3488 nla_put_u32(msg, NL80211_STA_INFO_INACTIVE_TIME, 3489 sinfo->inactive_time)) 3490 goto nla_put_failure; 3491 if ((sinfo->filled & (STATION_INFO_RX_BYTES | 3492 STATION_INFO_RX_BYTES64)) && 3493 nla_put_u32(msg, NL80211_STA_INFO_RX_BYTES, 3494 (u32)sinfo->rx_bytes)) 3495 goto nla_put_failure; 3496 if ((sinfo->filled & (STATION_INFO_TX_BYTES | 3497 STATION_INFO_TX_BYTES64)) && 3498 nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES, 3499 (u32)sinfo->tx_bytes)) 3500 goto nla_put_failure; 3501 if ((sinfo->filled & STATION_INFO_RX_BYTES64) && 3502 nla_put_u64(msg, NL80211_STA_INFO_RX_BYTES64, 3503 sinfo->rx_bytes)) 3504 goto nla_put_failure; 3505 if ((sinfo->filled & STATION_INFO_TX_BYTES64) && 3506 nla_put_u64(msg, NL80211_STA_INFO_TX_BYTES64, 3507 sinfo->tx_bytes)) 3508 goto nla_put_failure; 3509 if ((sinfo->filled & STATION_INFO_LLID) && 3510 nla_put_u16(msg, NL80211_STA_INFO_LLID, sinfo->llid)) 3511 goto nla_put_failure; 3512 if ((sinfo->filled & STATION_INFO_PLID) && 3513 nla_put_u16(msg, NL80211_STA_INFO_PLID, sinfo->plid)) 3514 goto nla_put_failure; 3515 if ((sinfo->filled & STATION_INFO_PLINK_STATE) && 3516 nla_put_u8(msg, NL80211_STA_INFO_PLINK_STATE, 3517 sinfo->plink_state)) 3518 goto nla_put_failure; 3519 switch (rdev->wiphy.signal_type) { 3520 case CFG80211_SIGNAL_TYPE_MBM: 3521 if ((sinfo->filled & STATION_INFO_SIGNAL) && 3522 nla_put_u8(msg, NL80211_STA_INFO_SIGNAL, 3523 sinfo->signal)) 3524 goto nla_put_failure; 3525 if ((sinfo->filled & STATION_INFO_SIGNAL_AVG) && 3526 nla_put_u8(msg, NL80211_STA_INFO_SIGNAL_AVG, 3527 sinfo->signal_avg)) 3528 goto nla_put_failure; 3529 break; 3530 default: 3531 break; 3532 } 3533 if (sinfo->filled & STATION_INFO_CHAIN_SIGNAL) { 3534 if (!nl80211_put_signal(msg, sinfo->chains, 3535 sinfo->chain_signal, 3536 NL80211_STA_INFO_CHAIN_SIGNAL)) 3537 goto nla_put_failure; 3538 } 3539 if (sinfo->filled & STATION_INFO_CHAIN_SIGNAL_AVG) { 3540 if (!nl80211_put_signal(msg, sinfo->chains, 3541 sinfo->chain_signal_avg, 3542 NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) 3543 goto nla_put_failure; 3544 } 3545 if (sinfo->filled & STATION_INFO_TX_BITRATE) { 3546 if (!nl80211_put_sta_rate(msg, &sinfo->txrate, 3547 NL80211_STA_INFO_TX_BITRATE)) 3548 goto nla_put_failure; 3549 } 3550 if (sinfo->filled & STATION_INFO_RX_BITRATE) { 3551 if (!nl80211_put_sta_rate(msg, &sinfo->rxrate, 3552 NL80211_STA_INFO_RX_BITRATE)) 3553 goto nla_put_failure; 3554 } 3555 if ((sinfo->filled & STATION_INFO_RX_PACKETS) && 3556 nla_put_u32(msg, NL80211_STA_INFO_RX_PACKETS, 3557 sinfo->rx_packets)) 3558 goto nla_put_failure; 3559 if ((sinfo->filled & STATION_INFO_TX_PACKETS) && 3560 nla_put_u32(msg, NL80211_STA_INFO_TX_PACKETS, 3561 sinfo->tx_packets)) 3562 goto nla_put_failure; 3563 if ((sinfo->filled & STATION_INFO_TX_RETRIES) && 3564 nla_put_u32(msg, NL80211_STA_INFO_TX_RETRIES, 3565 sinfo->tx_retries)) 3566 goto nla_put_failure; 3567 if ((sinfo->filled & STATION_INFO_TX_FAILED) && 3568 nla_put_u32(msg, NL80211_STA_INFO_TX_FAILED, 3569 sinfo->tx_failed)) 3570 goto nla_put_failure; 3571 if ((sinfo->filled & STATION_INFO_BEACON_LOSS_COUNT) && 3572 nla_put_u32(msg, NL80211_STA_INFO_BEACON_LOSS, 3573 sinfo->beacon_loss_count)) 3574 goto nla_put_failure; 3575 if ((sinfo->filled & STATION_INFO_LOCAL_PM) && 3576 nla_put_u32(msg, NL80211_STA_INFO_LOCAL_PM, 3577 sinfo->local_pm)) 3578 goto nla_put_failure; 3579 if ((sinfo->filled & STATION_INFO_PEER_PM) && 3580 nla_put_u32(msg, NL80211_STA_INFO_PEER_PM, 3581 sinfo->peer_pm)) 3582 goto nla_put_failure; 3583 if ((sinfo->filled & STATION_INFO_NONPEER_PM) && 3584 nla_put_u32(msg, NL80211_STA_INFO_NONPEER_PM, 3585 sinfo->nonpeer_pm)) 3586 goto nla_put_failure; 3587 if (sinfo->filled & STATION_INFO_BSS_PARAM) { 3588 bss_param = nla_nest_start(msg, NL80211_STA_INFO_BSS_PARAM); 3589 if (!bss_param) 3590 goto nla_put_failure; 3591 3592 if (((sinfo->bss_param.flags & BSS_PARAM_FLAGS_CTS_PROT) && 3593 nla_put_flag(msg, NL80211_STA_BSS_PARAM_CTS_PROT)) || 3594 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_PREAMBLE) && 3595 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_PREAMBLE)) || 3596 ((sinfo->bss_param.flags & BSS_PARAM_FLAGS_SHORT_SLOT_TIME) && 3597 nla_put_flag(msg, NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME)) || 3598 nla_put_u8(msg, NL80211_STA_BSS_PARAM_DTIM_PERIOD, 3599 sinfo->bss_param.dtim_period) || 3600 nla_put_u16(msg, NL80211_STA_BSS_PARAM_BEACON_INTERVAL, 3601 sinfo->bss_param.beacon_interval)) 3602 goto nla_put_failure; 3603 3604 nla_nest_end(msg, bss_param); 3605 } 3606 if ((sinfo->filled & STATION_INFO_STA_FLAGS) && 3607 nla_put(msg, NL80211_STA_INFO_STA_FLAGS, 3608 sizeof(struct nl80211_sta_flag_update), 3609 &sinfo->sta_flags)) 3610 goto nla_put_failure; 3611 if ((sinfo->filled & STATION_INFO_T_OFFSET) && 3612 nla_put_u64(msg, NL80211_STA_INFO_T_OFFSET, 3613 sinfo->t_offset)) 3614 goto nla_put_failure; 3615 nla_nest_end(msg, sinfoattr); 3616 3617 if ((sinfo->filled & STATION_INFO_ASSOC_REQ_IES) && 3618 nla_put(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, 3619 sinfo->assoc_req_ies)) 3620 goto nla_put_failure; 3621 3622 return genlmsg_end(msg, hdr); 3623 3624 nla_put_failure: 3625 genlmsg_cancel(msg, hdr); 3626 return -EMSGSIZE; 3627 } 3628 3629 static int nl80211_dump_station(struct sk_buff *skb, 3630 struct netlink_callback *cb) 3631 { 3632 struct station_info sinfo; 3633 struct cfg80211_registered_device *dev; 3634 struct wireless_dev *wdev; 3635 u8 mac_addr[ETH_ALEN]; 3636 int sta_idx = cb->args[2]; 3637 int err; 3638 3639 err = nl80211_prepare_wdev_dump(skb, cb, &dev, &wdev); 3640 if (err) 3641 return err; 3642 3643 if (!wdev->netdev) { 3644 err = -EINVAL; 3645 goto out_err; 3646 } 3647 3648 if (!dev->ops->dump_station) { 3649 err = -EOPNOTSUPP; 3650 goto out_err; 3651 } 3652 3653 while (1) { 3654 memset(&sinfo, 0, sizeof(sinfo)); 3655 err = rdev_dump_station(dev, wdev->netdev, sta_idx, 3656 mac_addr, &sinfo); 3657 if (err == -ENOENT) 3658 break; 3659 if (err) 3660 goto out_err; 3661 3662 if (nl80211_send_station(skb, 3663 NETLINK_CB(cb->skb).portid, 3664 cb->nlh->nlmsg_seq, NLM_F_MULTI, 3665 dev, wdev->netdev, mac_addr, 3666 &sinfo) < 0) 3667 goto out; 3668 3669 sta_idx++; 3670 } 3671 3672 3673 out: 3674 cb->args[2] = sta_idx; 3675 err = skb->len; 3676 out_err: 3677 nl80211_finish_wdev_dump(dev); 3678 3679 return err; 3680 } 3681 3682 static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info) 3683 { 3684 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3685 struct net_device *dev = info->user_ptr[1]; 3686 struct station_info sinfo; 3687 struct sk_buff *msg; 3688 u8 *mac_addr = NULL; 3689 int err; 3690 3691 memset(&sinfo, 0, sizeof(sinfo)); 3692 3693 if (!info->attrs[NL80211_ATTR_MAC]) 3694 return -EINVAL; 3695 3696 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 3697 3698 if (!rdev->ops->get_station) 3699 return -EOPNOTSUPP; 3700 3701 err = rdev_get_station(rdev, dev, mac_addr, &sinfo); 3702 if (err) 3703 return err; 3704 3705 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 3706 if (!msg) 3707 return -ENOMEM; 3708 3709 if (nl80211_send_station(msg, info->snd_portid, info->snd_seq, 0, 3710 rdev, dev, mac_addr, &sinfo) < 0) { 3711 nlmsg_free(msg); 3712 return -ENOBUFS; 3713 } 3714 3715 return genlmsg_reply(msg, info); 3716 } 3717 3718 int cfg80211_check_station_change(struct wiphy *wiphy, 3719 struct station_parameters *params, 3720 enum cfg80211_station_type statype) 3721 { 3722 if (params->listen_interval != -1) 3723 return -EINVAL; 3724 if (params->aid) 3725 return -EINVAL; 3726 3727 /* When you run into this, adjust the code below for the new flag */ 3728 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7); 3729 3730 switch (statype) { 3731 case CFG80211_STA_MESH_PEER_KERNEL: 3732 case CFG80211_STA_MESH_PEER_USER: 3733 /* 3734 * No ignoring the TDLS flag here -- the userspace mesh 3735 * code doesn't have the bug of including TDLS in the 3736 * mask everywhere. 3737 */ 3738 if (params->sta_flags_mask & 3739 ~(BIT(NL80211_STA_FLAG_AUTHENTICATED) | 3740 BIT(NL80211_STA_FLAG_MFP) | 3741 BIT(NL80211_STA_FLAG_AUTHORIZED))) 3742 return -EINVAL; 3743 break; 3744 case CFG80211_STA_TDLS_PEER_SETUP: 3745 case CFG80211_STA_TDLS_PEER_ACTIVE: 3746 if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 3747 return -EINVAL; 3748 /* ignore since it can't change */ 3749 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 3750 break; 3751 default: 3752 /* disallow mesh-specific things */ 3753 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) 3754 return -EINVAL; 3755 if (params->local_pm) 3756 return -EINVAL; 3757 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) 3758 return -EINVAL; 3759 } 3760 3761 if (statype != CFG80211_STA_TDLS_PEER_SETUP && 3762 statype != CFG80211_STA_TDLS_PEER_ACTIVE) { 3763 /* TDLS can't be set, ... */ 3764 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) 3765 return -EINVAL; 3766 /* 3767 * ... but don't bother the driver with it. This works around 3768 * a hostapd/wpa_supplicant issue -- it always includes the 3769 * TLDS_PEER flag in the mask even for AP mode. 3770 */ 3771 params->sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 3772 } 3773 3774 if (statype != CFG80211_STA_TDLS_PEER_SETUP) { 3775 /* reject other things that can't change */ 3776 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) 3777 return -EINVAL; 3778 if (params->sta_modify_mask & STATION_PARAM_APPLY_CAPABILITY) 3779 return -EINVAL; 3780 if (params->supported_rates) 3781 return -EINVAL; 3782 if (params->ext_capab || params->ht_capa || params->vht_capa) 3783 return -EINVAL; 3784 } 3785 3786 if (statype != CFG80211_STA_AP_CLIENT) { 3787 if (params->vlan) 3788 return -EINVAL; 3789 } 3790 3791 switch (statype) { 3792 case CFG80211_STA_AP_MLME_CLIENT: 3793 /* Use this only for authorizing/unauthorizing a station */ 3794 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))) 3795 return -EOPNOTSUPP; 3796 break; 3797 case CFG80211_STA_AP_CLIENT: 3798 /* accept only the listed bits */ 3799 if (params->sta_flags_mask & 3800 ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 3801 BIT(NL80211_STA_FLAG_AUTHENTICATED) | 3802 BIT(NL80211_STA_FLAG_ASSOCIATED) | 3803 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | 3804 BIT(NL80211_STA_FLAG_WME) | 3805 BIT(NL80211_STA_FLAG_MFP))) 3806 return -EINVAL; 3807 3808 /* but authenticated/associated only if driver handles it */ 3809 if (!(wiphy->features & NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 3810 params->sta_flags_mask & 3811 (BIT(NL80211_STA_FLAG_AUTHENTICATED) | 3812 BIT(NL80211_STA_FLAG_ASSOCIATED))) 3813 return -EINVAL; 3814 break; 3815 case CFG80211_STA_IBSS: 3816 case CFG80211_STA_AP_STA: 3817 /* reject any changes other than AUTHORIZED */ 3818 if (params->sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED)) 3819 return -EINVAL; 3820 break; 3821 case CFG80211_STA_TDLS_PEER_SETUP: 3822 /* reject any changes other than AUTHORIZED or WME */ 3823 if (params->sta_flags_mask & ~(BIT(NL80211_STA_FLAG_AUTHORIZED) | 3824 BIT(NL80211_STA_FLAG_WME))) 3825 return -EINVAL; 3826 /* force (at least) rates when authorizing */ 3827 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED) && 3828 !params->supported_rates) 3829 return -EINVAL; 3830 break; 3831 case CFG80211_STA_TDLS_PEER_ACTIVE: 3832 /* reject any changes */ 3833 return -EINVAL; 3834 case CFG80211_STA_MESH_PEER_KERNEL: 3835 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) 3836 return -EINVAL; 3837 break; 3838 case CFG80211_STA_MESH_PEER_USER: 3839 if (params->plink_action != NL80211_PLINK_ACTION_NO_ACTION) 3840 return -EINVAL; 3841 break; 3842 } 3843 3844 return 0; 3845 } 3846 EXPORT_SYMBOL(cfg80211_check_station_change); 3847 3848 /* 3849 * Get vlan interface making sure it is running and on the right wiphy. 3850 */ 3851 static struct net_device *get_vlan(struct genl_info *info, 3852 struct cfg80211_registered_device *rdev) 3853 { 3854 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN]; 3855 struct net_device *v; 3856 int ret; 3857 3858 if (!vlanattr) 3859 return NULL; 3860 3861 v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr)); 3862 if (!v) 3863 return ERR_PTR(-ENODEV); 3864 3865 if (!v->ieee80211_ptr || v->ieee80211_ptr->wiphy != &rdev->wiphy) { 3866 ret = -EINVAL; 3867 goto error; 3868 } 3869 3870 if (v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && 3871 v->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 3872 v->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) { 3873 ret = -EINVAL; 3874 goto error; 3875 } 3876 3877 if (!netif_running(v)) { 3878 ret = -ENETDOWN; 3879 goto error; 3880 } 3881 3882 return v; 3883 error: 3884 dev_put(v); 3885 return ERR_PTR(ret); 3886 } 3887 3888 static struct nla_policy 3889 nl80211_sta_wme_policy[NL80211_STA_WME_MAX + 1] __read_mostly = { 3890 [NL80211_STA_WME_UAPSD_QUEUES] = { .type = NLA_U8 }, 3891 [NL80211_STA_WME_MAX_SP] = { .type = NLA_U8 }, 3892 }; 3893 3894 static int nl80211_parse_sta_wme(struct genl_info *info, 3895 struct station_parameters *params) 3896 { 3897 struct nlattr *tb[NL80211_STA_WME_MAX + 1]; 3898 struct nlattr *nla; 3899 int err; 3900 3901 /* parse WME attributes if present */ 3902 if (!info->attrs[NL80211_ATTR_STA_WME]) 3903 return 0; 3904 3905 nla = info->attrs[NL80211_ATTR_STA_WME]; 3906 err = nla_parse_nested(tb, NL80211_STA_WME_MAX, nla, 3907 nl80211_sta_wme_policy); 3908 if (err) 3909 return err; 3910 3911 if (tb[NL80211_STA_WME_UAPSD_QUEUES]) 3912 params->uapsd_queues = nla_get_u8( 3913 tb[NL80211_STA_WME_UAPSD_QUEUES]); 3914 if (params->uapsd_queues & ~IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK) 3915 return -EINVAL; 3916 3917 if (tb[NL80211_STA_WME_MAX_SP]) 3918 params->max_sp = nla_get_u8(tb[NL80211_STA_WME_MAX_SP]); 3919 3920 if (params->max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK) 3921 return -EINVAL; 3922 3923 params->sta_modify_mask |= STATION_PARAM_APPLY_UAPSD; 3924 3925 return 0; 3926 } 3927 3928 static int nl80211_parse_sta_channel_info(struct genl_info *info, 3929 struct station_parameters *params) 3930 { 3931 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) { 3932 params->supported_channels = 3933 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 3934 params->supported_channels_len = 3935 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]); 3936 /* 3937 * Need to include at least one (first channel, number of 3938 * channels) tuple for each subband, and must have proper 3939 * tuples for the rest of the data as well. 3940 */ 3941 if (params->supported_channels_len < 2) 3942 return -EINVAL; 3943 if (params->supported_channels_len % 2) 3944 return -EINVAL; 3945 } 3946 3947 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) { 3948 params->supported_oper_classes = 3949 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 3950 params->supported_oper_classes_len = 3951 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]); 3952 /* 3953 * The value of the Length field of the Supported Operating 3954 * Classes element is between 2 and 253. 3955 */ 3956 if (params->supported_oper_classes_len < 2 || 3957 params->supported_oper_classes_len > 253) 3958 return -EINVAL; 3959 } 3960 return 0; 3961 } 3962 3963 static int nl80211_set_station_tdls(struct genl_info *info, 3964 struct station_parameters *params) 3965 { 3966 int err; 3967 /* Dummy STA entry gets updated once the peer capabilities are known */ 3968 if (info->attrs[NL80211_ATTR_PEER_AID]) 3969 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 3970 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 3971 params->ht_capa = 3972 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 3973 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 3974 params->vht_capa = 3975 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 3976 3977 err = nl80211_parse_sta_channel_info(info, params); 3978 if (err) 3979 return err; 3980 3981 return nl80211_parse_sta_wme(info, params); 3982 } 3983 3984 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) 3985 { 3986 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 3987 struct net_device *dev = info->user_ptr[1]; 3988 struct station_parameters params; 3989 u8 *mac_addr; 3990 int err; 3991 3992 memset(¶ms, 0, sizeof(params)); 3993 3994 params.listen_interval = -1; 3995 3996 if (!rdev->ops->change_station) 3997 return -EOPNOTSUPP; 3998 3999 if (info->attrs[NL80211_ATTR_STA_AID]) 4000 return -EINVAL; 4001 4002 if (!info->attrs[NL80211_ATTR_MAC]) 4003 return -EINVAL; 4004 4005 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 4006 4007 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) { 4008 params.supported_rates = 4009 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 4010 params.supported_rates_len = 4011 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 4012 } 4013 4014 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 4015 params.capability = 4016 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 4017 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 4018 } 4019 4020 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 4021 params.ext_capab = 4022 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 4023 params.ext_capab_len = 4024 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 4025 } 4026 4027 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 4028 return -EINVAL; 4029 4030 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) 4031 return -EINVAL; 4032 4033 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) { 4034 params.plink_action = 4035 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 4036 if (params.plink_action >= NUM_NL80211_PLINK_ACTIONS) 4037 return -EINVAL; 4038 } 4039 4040 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) { 4041 params.plink_state = 4042 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]); 4043 if (params.plink_state >= NUM_NL80211_PLINK_STATES) 4044 return -EINVAL; 4045 params.sta_modify_mask |= STATION_PARAM_APPLY_PLINK_STATE; 4046 } 4047 4048 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]) { 4049 enum nl80211_mesh_power_mode pm = nla_get_u32( 4050 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]); 4051 4052 if (pm <= NL80211_MESH_POWER_UNKNOWN || 4053 pm > NL80211_MESH_POWER_MAX) 4054 return -EINVAL; 4055 4056 params.local_pm = pm; 4057 } 4058 4059 /* Include parameters for TDLS peer (will check later) */ 4060 err = nl80211_set_station_tdls(info, ¶ms); 4061 if (err) 4062 return err; 4063 4064 params.vlan = get_vlan(info, rdev); 4065 if (IS_ERR(params.vlan)) 4066 return PTR_ERR(params.vlan); 4067 4068 switch (dev->ieee80211_ptr->iftype) { 4069 case NL80211_IFTYPE_AP: 4070 case NL80211_IFTYPE_AP_VLAN: 4071 case NL80211_IFTYPE_P2P_GO: 4072 case NL80211_IFTYPE_P2P_CLIENT: 4073 case NL80211_IFTYPE_STATION: 4074 case NL80211_IFTYPE_ADHOC: 4075 case NL80211_IFTYPE_MESH_POINT: 4076 break; 4077 default: 4078 err = -EOPNOTSUPP; 4079 goto out_put_vlan; 4080 } 4081 4082 /* driver will call cfg80211_check_station_change() */ 4083 err = rdev_change_station(rdev, dev, mac_addr, ¶ms); 4084 4085 out_put_vlan: 4086 if (params.vlan) 4087 dev_put(params.vlan); 4088 4089 return err; 4090 } 4091 4092 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info) 4093 { 4094 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4095 int err; 4096 struct net_device *dev = info->user_ptr[1]; 4097 struct station_parameters params; 4098 u8 *mac_addr = NULL; 4099 4100 memset(¶ms, 0, sizeof(params)); 4101 4102 if (!rdev->ops->add_station) 4103 return -EOPNOTSUPP; 4104 4105 if (!info->attrs[NL80211_ATTR_MAC]) 4106 return -EINVAL; 4107 4108 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]) 4109 return -EINVAL; 4110 4111 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) 4112 return -EINVAL; 4113 4114 if (!info->attrs[NL80211_ATTR_STA_AID] && 4115 !info->attrs[NL80211_ATTR_PEER_AID]) 4116 return -EINVAL; 4117 4118 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 4119 params.supported_rates = 4120 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 4121 params.supported_rates_len = 4122 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); 4123 params.listen_interval = 4124 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); 4125 4126 if (info->attrs[NL80211_ATTR_PEER_AID]) 4127 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]); 4128 else 4129 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); 4130 if (!params.aid || params.aid > IEEE80211_MAX_AID) 4131 return -EINVAL; 4132 4133 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) { 4134 params.capability = 4135 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]); 4136 params.sta_modify_mask |= STATION_PARAM_APPLY_CAPABILITY; 4137 } 4138 4139 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) { 4140 params.ext_capab = 4141 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 4142 params.ext_capab_len = 4143 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]); 4144 } 4145 4146 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) 4147 params.ht_capa = 4148 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]); 4149 4150 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) 4151 params.vht_capa = 4152 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]); 4153 4154 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION]) { 4155 params.plink_action = 4156 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]); 4157 if (params.plink_action >= NUM_NL80211_PLINK_ACTIONS) 4158 return -EINVAL; 4159 } 4160 4161 err = nl80211_parse_sta_channel_info(info, ¶ms); 4162 if (err) 4163 return err; 4164 4165 err = nl80211_parse_sta_wme(info, ¶ms); 4166 if (err) 4167 return err; 4168 4169 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) 4170 return -EINVAL; 4171 4172 /* When you run into this, adjust the code below for the new flag */ 4173 BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7); 4174 4175 switch (dev->ieee80211_ptr->iftype) { 4176 case NL80211_IFTYPE_AP: 4177 case NL80211_IFTYPE_AP_VLAN: 4178 case NL80211_IFTYPE_P2P_GO: 4179 /* ignore WME attributes if iface/sta is not capable */ 4180 if (!(rdev->wiphy.flags & WIPHY_FLAG_AP_UAPSD) || 4181 !(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) 4182 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 4183 4184 /* TDLS peers cannot be added */ 4185 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 4186 info->attrs[NL80211_ATTR_PEER_AID]) 4187 return -EINVAL; 4188 /* but don't bother the driver with it */ 4189 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_TDLS_PEER); 4190 4191 /* allow authenticated/associated only if driver handles it */ 4192 if (!(rdev->wiphy.features & 4193 NL80211_FEATURE_FULL_AP_CLIENT_STATE) && 4194 params.sta_flags_mask & 4195 (BIT(NL80211_STA_FLAG_AUTHENTICATED) | 4196 BIT(NL80211_STA_FLAG_ASSOCIATED))) 4197 return -EINVAL; 4198 4199 /* must be last in here for error handling */ 4200 params.vlan = get_vlan(info, rdev); 4201 if (IS_ERR(params.vlan)) 4202 return PTR_ERR(params.vlan); 4203 break; 4204 case NL80211_IFTYPE_MESH_POINT: 4205 /* ignore uAPSD data */ 4206 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 4207 4208 /* associated is disallowed */ 4209 if (params.sta_flags_mask & BIT(NL80211_STA_FLAG_ASSOCIATED)) 4210 return -EINVAL; 4211 /* TDLS peers cannot be added */ 4212 if ((params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) || 4213 info->attrs[NL80211_ATTR_PEER_AID]) 4214 return -EINVAL; 4215 break; 4216 case NL80211_IFTYPE_STATION: 4217 case NL80211_IFTYPE_P2P_CLIENT: 4218 /* ignore uAPSD data */ 4219 params.sta_modify_mask &= ~STATION_PARAM_APPLY_UAPSD; 4220 4221 /* these are disallowed */ 4222 if (params.sta_flags_mask & 4223 (BIT(NL80211_STA_FLAG_ASSOCIATED) | 4224 BIT(NL80211_STA_FLAG_AUTHENTICATED))) 4225 return -EINVAL; 4226 /* Only TDLS peers can be added */ 4227 if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) 4228 return -EINVAL; 4229 /* Can only add if TDLS ... */ 4230 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)) 4231 return -EOPNOTSUPP; 4232 /* ... with external setup is supported */ 4233 if (!(rdev->wiphy.flags & WIPHY_FLAG_TDLS_EXTERNAL_SETUP)) 4234 return -EOPNOTSUPP; 4235 /* 4236 * Older wpa_supplicant versions always mark the TDLS peer 4237 * as authorized, but it shouldn't yet be. 4238 */ 4239 params.sta_flags_mask &= ~BIT(NL80211_STA_FLAG_AUTHORIZED); 4240 break; 4241 default: 4242 return -EOPNOTSUPP; 4243 } 4244 4245 /* be aware of params.vlan when changing code here */ 4246 4247 err = rdev_add_station(rdev, dev, mac_addr, ¶ms); 4248 4249 if (params.vlan) 4250 dev_put(params.vlan); 4251 return err; 4252 } 4253 4254 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info) 4255 { 4256 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4257 struct net_device *dev = info->user_ptr[1]; 4258 u8 *mac_addr = NULL; 4259 4260 if (info->attrs[NL80211_ATTR_MAC]) 4261 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 4262 4263 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 4264 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN && 4265 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT && 4266 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4267 return -EINVAL; 4268 4269 if (!rdev->ops->del_station) 4270 return -EOPNOTSUPP; 4271 4272 return rdev_del_station(rdev, dev, mac_addr); 4273 } 4274 4275 static int nl80211_send_mpath(struct sk_buff *msg, u32 portid, u32 seq, 4276 int flags, struct net_device *dev, 4277 u8 *dst, u8 *next_hop, 4278 struct mpath_info *pinfo) 4279 { 4280 void *hdr; 4281 struct nlattr *pinfoattr; 4282 4283 hdr = nl80211hdr_put(msg, portid, seq, flags, NL80211_CMD_NEW_STATION); 4284 if (!hdr) 4285 return -1; 4286 4287 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 4288 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, dst) || 4289 nla_put(msg, NL80211_ATTR_MPATH_NEXT_HOP, ETH_ALEN, next_hop) || 4290 nla_put_u32(msg, NL80211_ATTR_GENERATION, pinfo->generation)) 4291 goto nla_put_failure; 4292 4293 pinfoattr = nla_nest_start(msg, NL80211_ATTR_MPATH_INFO); 4294 if (!pinfoattr) 4295 goto nla_put_failure; 4296 if ((pinfo->filled & MPATH_INFO_FRAME_QLEN) && 4297 nla_put_u32(msg, NL80211_MPATH_INFO_FRAME_QLEN, 4298 pinfo->frame_qlen)) 4299 goto nla_put_failure; 4300 if (((pinfo->filled & MPATH_INFO_SN) && 4301 nla_put_u32(msg, NL80211_MPATH_INFO_SN, pinfo->sn)) || 4302 ((pinfo->filled & MPATH_INFO_METRIC) && 4303 nla_put_u32(msg, NL80211_MPATH_INFO_METRIC, 4304 pinfo->metric)) || 4305 ((pinfo->filled & MPATH_INFO_EXPTIME) && 4306 nla_put_u32(msg, NL80211_MPATH_INFO_EXPTIME, 4307 pinfo->exptime)) || 4308 ((pinfo->filled & MPATH_INFO_FLAGS) && 4309 nla_put_u8(msg, NL80211_MPATH_INFO_FLAGS, 4310 pinfo->flags)) || 4311 ((pinfo->filled & MPATH_INFO_DISCOVERY_TIMEOUT) && 4312 nla_put_u32(msg, NL80211_MPATH_INFO_DISCOVERY_TIMEOUT, 4313 pinfo->discovery_timeout)) || 4314 ((pinfo->filled & MPATH_INFO_DISCOVERY_RETRIES) && 4315 nla_put_u8(msg, NL80211_MPATH_INFO_DISCOVERY_RETRIES, 4316 pinfo->discovery_retries))) 4317 goto nla_put_failure; 4318 4319 nla_nest_end(msg, pinfoattr); 4320 4321 return genlmsg_end(msg, hdr); 4322 4323 nla_put_failure: 4324 genlmsg_cancel(msg, hdr); 4325 return -EMSGSIZE; 4326 } 4327 4328 static int nl80211_dump_mpath(struct sk_buff *skb, 4329 struct netlink_callback *cb) 4330 { 4331 struct mpath_info pinfo; 4332 struct cfg80211_registered_device *dev; 4333 struct wireless_dev *wdev; 4334 u8 dst[ETH_ALEN]; 4335 u8 next_hop[ETH_ALEN]; 4336 int path_idx = cb->args[2]; 4337 int err; 4338 4339 err = nl80211_prepare_wdev_dump(skb, cb, &dev, &wdev); 4340 if (err) 4341 return err; 4342 4343 if (!dev->ops->dump_mpath) { 4344 err = -EOPNOTSUPP; 4345 goto out_err; 4346 } 4347 4348 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) { 4349 err = -EOPNOTSUPP; 4350 goto out_err; 4351 } 4352 4353 while (1) { 4354 err = rdev_dump_mpath(dev, wdev->netdev, path_idx, dst, 4355 next_hop, &pinfo); 4356 if (err == -ENOENT) 4357 break; 4358 if (err) 4359 goto out_err; 4360 4361 if (nl80211_send_mpath(skb, NETLINK_CB(cb->skb).portid, 4362 cb->nlh->nlmsg_seq, NLM_F_MULTI, 4363 wdev->netdev, dst, next_hop, 4364 &pinfo) < 0) 4365 goto out; 4366 4367 path_idx++; 4368 } 4369 4370 4371 out: 4372 cb->args[2] = path_idx; 4373 err = skb->len; 4374 out_err: 4375 nl80211_finish_wdev_dump(dev); 4376 return err; 4377 } 4378 4379 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info) 4380 { 4381 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4382 int err; 4383 struct net_device *dev = info->user_ptr[1]; 4384 struct mpath_info pinfo; 4385 struct sk_buff *msg; 4386 u8 *dst = NULL; 4387 u8 next_hop[ETH_ALEN]; 4388 4389 memset(&pinfo, 0, sizeof(pinfo)); 4390 4391 if (!info->attrs[NL80211_ATTR_MAC]) 4392 return -EINVAL; 4393 4394 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 4395 4396 if (!rdev->ops->get_mpath) 4397 return -EOPNOTSUPP; 4398 4399 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 4400 return -EOPNOTSUPP; 4401 4402 err = rdev_get_mpath(rdev, dev, dst, next_hop, &pinfo); 4403 if (err) 4404 return err; 4405 4406 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 4407 if (!msg) 4408 return -ENOMEM; 4409 4410 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0, 4411 dev, dst, next_hop, &pinfo) < 0) { 4412 nlmsg_free(msg); 4413 return -ENOBUFS; 4414 } 4415 4416 return genlmsg_reply(msg, info); 4417 } 4418 4419 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info) 4420 { 4421 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4422 struct net_device *dev = info->user_ptr[1]; 4423 u8 *dst = NULL; 4424 u8 *next_hop = NULL; 4425 4426 if (!info->attrs[NL80211_ATTR_MAC]) 4427 return -EINVAL; 4428 4429 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 4430 return -EINVAL; 4431 4432 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 4433 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 4434 4435 if (!rdev->ops->change_mpath) 4436 return -EOPNOTSUPP; 4437 4438 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 4439 return -EOPNOTSUPP; 4440 4441 return rdev_change_mpath(rdev, dev, dst, next_hop); 4442 } 4443 4444 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info) 4445 { 4446 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4447 struct net_device *dev = info->user_ptr[1]; 4448 u8 *dst = NULL; 4449 u8 *next_hop = NULL; 4450 4451 if (!info->attrs[NL80211_ATTR_MAC]) 4452 return -EINVAL; 4453 4454 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]) 4455 return -EINVAL; 4456 4457 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 4458 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]); 4459 4460 if (!rdev->ops->add_mpath) 4461 return -EOPNOTSUPP; 4462 4463 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 4464 return -EOPNOTSUPP; 4465 4466 return rdev_add_mpath(rdev, dev, dst, next_hop); 4467 } 4468 4469 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info) 4470 { 4471 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4472 struct net_device *dev = info->user_ptr[1]; 4473 u8 *dst = NULL; 4474 4475 if (info->attrs[NL80211_ATTR_MAC]) 4476 dst = nla_data(info->attrs[NL80211_ATTR_MAC]); 4477 4478 if (!rdev->ops->del_mpath) 4479 return -EOPNOTSUPP; 4480 4481 return rdev_del_mpath(rdev, dev, dst); 4482 } 4483 4484 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info) 4485 { 4486 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4487 struct net_device *dev = info->user_ptr[1]; 4488 struct wireless_dev *wdev = dev->ieee80211_ptr; 4489 struct bss_parameters params; 4490 int err; 4491 4492 memset(¶ms, 0, sizeof(params)); 4493 /* default to not changing parameters */ 4494 params.use_cts_prot = -1; 4495 params.use_short_preamble = -1; 4496 params.use_short_slot_time = -1; 4497 params.ap_isolate = -1; 4498 params.ht_opmode = -1; 4499 params.p2p_ctwindow = -1; 4500 params.p2p_opp_ps = -1; 4501 4502 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT]) 4503 params.use_cts_prot = 4504 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]); 4505 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]) 4506 params.use_short_preamble = 4507 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]); 4508 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]) 4509 params.use_short_slot_time = 4510 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]); 4511 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 4512 params.basic_rates = 4513 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 4514 params.basic_rates_len = 4515 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 4516 } 4517 if (info->attrs[NL80211_ATTR_AP_ISOLATE]) 4518 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]); 4519 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE]) 4520 params.ht_opmode = 4521 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]); 4522 4523 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) { 4524 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4525 return -EINVAL; 4526 params.p2p_ctwindow = 4527 nla_get_s8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]); 4528 if (params.p2p_ctwindow < 0) 4529 return -EINVAL; 4530 if (params.p2p_ctwindow != 0 && 4531 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_CTWIN)) 4532 return -EINVAL; 4533 } 4534 4535 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) { 4536 u8 tmp; 4537 4538 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4539 return -EINVAL; 4540 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]); 4541 if (tmp > 1) 4542 return -EINVAL; 4543 params.p2p_opp_ps = tmp; 4544 if (params.p2p_opp_ps && 4545 !(rdev->wiphy.features & NL80211_FEATURE_P2P_GO_OPPPS)) 4546 return -EINVAL; 4547 } 4548 4549 if (!rdev->ops->change_bss) 4550 return -EOPNOTSUPP; 4551 4552 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 4553 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 4554 return -EOPNOTSUPP; 4555 4556 wdev_lock(wdev); 4557 err = rdev_change_bss(rdev, dev, ¶ms); 4558 wdev_unlock(wdev); 4559 4560 return err; 4561 } 4562 4563 static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = { 4564 [NL80211_ATTR_REG_RULE_FLAGS] = { .type = NLA_U32 }, 4565 [NL80211_ATTR_FREQ_RANGE_START] = { .type = NLA_U32 }, 4566 [NL80211_ATTR_FREQ_RANGE_END] = { .type = NLA_U32 }, 4567 [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 }, 4568 [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 }, 4569 [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 }, 4570 }; 4571 4572 static int parse_reg_rule(struct nlattr *tb[], 4573 struct ieee80211_reg_rule *reg_rule) 4574 { 4575 struct ieee80211_freq_range *freq_range = ®_rule->freq_range; 4576 struct ieee80211_power_rule *power_rule = ®_rule->power_rule; 4577 4578 if (!tb[NL80211_ATTR_REG_RULE_FLAGS]) 4579 return -EINVAL; 4580 if (!tb[NL80211_ATTR_FREQ_RANGE_START]) 4581 return -EINVAL; 4582 if (!tb[NL80211_ATTR_FREQ_RANGE_END]) 4583 return -EINVAL; 4584 if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]) 4585 return -EINVAL; 4586 if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]) 4587 return -EINVAL; 4588 4589 reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]); 4590 4591 freq_range->start_freq_khz = 4592 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]); 4593 freq_range->end_freq_khz = 4594 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]); 4595 freq_range->max_bandwidth_khz = 4596 nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]); 4597 4598 power_rule->max_eirp = 4599 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]); 4600 4601 if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]) 4602 power_rule->max_antenna_gain = 4603 nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]); 4604 4605 return 0; 4606 } 4607 4608 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info) 4609 { 4610 int r; 4611 char *data = NULL; 4612 enum nl80211_user_reg_hint_type user_reg_hint_type; 4613 4614 /* 4615 * You should only get this when cfg80211 hasn't yet initialized 4616 * completely when built-in to the kernel right between the time 4617 * window between nl80211_init() and regulatory_init(), if that is 4618 * even possible. 4619 */ 4620 if (unlikely(!rcu_access_pointer(cfg80211_regdomain))) 4621 return -EINPROGRESS; 4622 4623 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 4624 return -EINVAL; 4625 4626 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 4627 4628 if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]) 4629 user_reg_hint_type = 4630 nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]); 4631 else 4632 user_reg_hint_type = NL80211_USER_REG_HINT_USER; 4633 4634 switch (user_reg_hint_type) { 4635 case NL80211_USER_REG_HINT_USER: 4636 case NL80211_USER_REG_HINT_CELL_BASE: 4637 break; 4638 default: 4639 return -EINVAL; 4640 } 4641 4642 r = regulatory_hint_user(data, user_reg_hint_type); 4643 4644 return r; 4645 } 4646 4647 static int nl80211_get_mesh_config(struct sk_buff *skb, 4648 struct genl_info *info) 4649 { 4650 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4651 struct net_device *dev = info->user_ptr[1]; 4652 struct wireless_dev *wdev = dev->ieee80211_ptr; 4653 struct mesh_config cur_params; 4654 int err = 0; 4655 void *hdr; 4656 struct nlattr *pinfoattr; 4657 struct sk_buff *msg; 4658 4659 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 4660 return -EOPNOTSUPP; 4661 4662 if (!rdev->ops->get_mesh_config) 4663 return -EOPNOTSUPP; 4664 4665 wdev_lock(wdev); 4666 /* If not connected, get default parameters */ 4667 if (!wdev->mesh_id_len) 4668 memcpy(&cur_params, &default_mesh_config, sizeof(cur_params)); 4669 else 4670 err = rdev_get_mesh_config(rdev, dev, &cur_params); 4671 wdev_unlock(wdev); 4672 4673 if (err) 4674 return err; 4675 4676 /* Draw up a netlink message to send back */ 4677 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 4678 if (!msg) 4679 return -ENOMEM; 4680 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 4681 NL80211_CMD_GET_MESH_CONFIG); 4682 if (!hdr) 4683 goto out; 4684 pinfoattr = nla_nest_start(msg, NL80211_ATTR_MESH_CONFIG); 4685 if (!pinfoattr) 4686 goto nla_put_failure; 4687 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 4688 nla_put_u16(msg, NL80211_MESHCONF_RETRY_TIMEOUT, 4689 cur_params.dot11MeshRetryTimeout) || 4690 nla_put_u16(msg, NL80211_MESHCONF_CONFIRM_TIMEOUT, 4691 cur_params.dot11MeshConfirmTimeout) || 4692 nla_put_u16(msg, NL80211_MESHCONF_HOLDING_TIMEOUT, 4693 cur_params.dot11MeshHoldingTimeout) || 4694 nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS, 4695 cur_params.dot11MeshMaxPeerLinks) || 4696 nla_put_u8(msg, NL80211_MESHCONF_MAX_RETRIES, 4697 cur_params.dot11MeshMaxRetries) || 4698 nla_put_u8(msg, NL80211_MESHCONF_TTL, 4699 cur_params.dot11MeshTTL) || 4700 nla_put_u8(msg, NL80211_MESHCONF_ELEMENT_TTL, 4701 cur_params.element_ttl) || 4702 nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS, 4703 cur_params.auto_open_plinks) || 4704 nla_put_u32(msg, NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 4705 cur_params.dot11MeshNbrOffsetMaxNeighbor) || 4706 nla_put_u8(msg, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 4707 cur_params.dot11MeshHWMPmaxPREQretries) || 4708 nla_put_u32(msg, NL80211_MESHCONF_PATH_REFRESH_TIME, 4709 cur_params.path_refresh_time) || 4710 nla_put_u16(msg, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 4711 cur_params.min_discovery_timeout) || 4712 nla_put_u32(msg, NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 4713 cur_params.dot11MeshHWMPactivePathTimeout) || 4714 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 4715 cur_params.dot11MeshHWMPpreqMinInterval) || 4716 nla_put_u16(msg, NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 4717 cur_params.dot11MeshHWMPperrMinInterval) || 4718 nla_put_u16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 4719 cur_params.dot11MeshHWMPnetDiameterTraversalTime) || 4720 nla_put_u8(msg, NL80211_MESHCONF_HWMP_ROOTMODE, 4721 cur_params.dot11MeshHWMPRootMode) || 4722 nla_put_u16(msg, NL80211_MESHCONF_HWMP_RANN_INTERVAL, 4723 cur_params.dot11MeshHWMPRannInterval) || 4724 nla_put_u8(msg, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 4725 cur_params.dot11MeshGateAnnouncementProtocol) || 4726 nla_put_u8(msg, NL80211_MESHCONF_FORWARDING, 4727 cur_params.dot11MeshForwarding) || 4728 nla_put_u32(msg, NL80211_MESHCONF_RSSI_THRESHOLD, 4729 cur_params.rssi_threshold) || 4730 nla_put_u32(msg, NL80211_MESHCONF_HT_OPMODE, 4731 cur_params.ht_opmode) || 4732 nla_put_u32(msg, NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 4733 cur_params.dot11MeshHWMPactivePathToRootTimeout) || 4734 nla_put_u16(msg, NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 4735 cur_params.dot11MeshHWMProotInterval) || 4736 nla_put_u16(msg, NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 4737 cur_params.dot11MeshHWMPconfirmationInterval) || 4738 nla_put_u32(msg, NL80211_MESHCONF_POWER_MODE, 4739 cur_params.power_mode) || 4740 nla_put_u16(msg, NL80211_MESHCONF_AWAKE_WINDOW, 4741 cur_params.dot11MeshAwakeWindowDuration) || 4742 nla_put_u32(msg, NL80211_MESHCONF_PLINK_TIMEOUT, 4743 cur_params.plink_timeout)) 4744 goto nla_put_failure; 4745 nla_nest_end(msg, pinfoattr); 4746 genlmsg_end(msg, hdr); 4747 return genlmsg_reply(msg, info); 4748 4749 nla_put_failure: 4750 genlmsg_cancel(msg, hdr); 4751 out: 4752 nlmsg_free(msg); 4753 return -ENOBUFS; 4754 } 4755 4756 static const struct nla_policy nl80211_meshconf_params_policy[NL80211_MESHCONF_ATTR_MAX+1] = { 4757 [NL80211_MESHCONF_RETRY_TIMEOUT] = { .type = NLA_U16 }, 4758 [NL80211_MESHCONF_CONFIRM_TIMEOUT] = { .type = NLA_U16 }, 4759 [NL80211_MESHCONF_HOLDING_TIMEOUT] = { .type = NLA_U16 }, 4760 [NL80211_MESHCONF_MAX_PEER_LINKS] = { .type = NLA_U16 }, 4761 [NL80211_MESHCONF_MAX_RETRIES] = { .type = NLA_U8 }, 4762 [NL80211_MESHCONF_TTL] = { .type = NLA_U8 }, 4763 [NL80211_MESHCONF_ELEMENT_TTL] = { .type = NLA_U8 }, 4764 [NL80211_MESHCONF_AUTO_OPEN_PLINKS] = { .type = NLA_U8 }, 4765 [NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR] = { .type = NLA_U32 }, 4766 [NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES] = { .type = NLA_U8 }, 4767 [NL80211_MESHCONF_PATH_REFRESH_TIME] = { .type = NLA_U32 }, 4768 [NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT] = { .type = NLA_U16 }, 4769 [NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT] = { .type = NLA_U32 }, 4770 [NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL] = { .type = NLA_U16 }, 4771 [NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL] = { .type = NLA_U16 }, 4772 [NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME] = { .type = NLA_U16 }, 4773 [NL80211_MESHCONF_HWMP_ROOTMODE] = { .type = NLA_U8 }, 4774 [NL80211_MESHCONF_HWMP_RANN_INTERVAL] = { .type = NLA_U16 }, 4775 [NL80211_MESHCONF_GATE_ANNOUNCEMENTS] = { .type = NLA_U8 }, 4776 [NL80211_MESHCONF_FORWARDING] = { .type = NLA_U8 }, 4777 [NL80211_MESHCONF_RSSI_THRESHOLD] = { .type = NLA_U32 }, 4778 [NL80211_MESHCONF_HT_OPMODE] = { .type = NLA_U16 }, 4779 [NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT] = { .type = NLA_U32 }, 4780 [NL80211_MESHCONF_HWMP_ROOT_INTERVAL] = { .type = NLA_U16 }, 4781 [NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL] = { .type = NLA_U16 }, 4782 [NL80211_MESHCONF_POWER_MODE] = { .type = NLA_U32 }, 4783 [NL80211_MESHCONF_AWAKE_WINDOW] = { .type = NLA_U16 }, 4784 [NL80211_MESHCONF_PLINK_TIMEOUT] = { .type = NLA_U32 }, 4785 }; 4786 4787 static const struct nla_policy 4788 nl80211_mesh_setup_params_policy[NL80211_MESH_SETUP_ATTR_MAX+1] = { 4789 [NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC] = { .type = NLA_U8 }, 4790 [NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL] = { .type = NLA_U8 }, 4791 [NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC] = { .type = NLA_U8 }, 4792 [NL80211_MESH_SETUP_USERSPACE_AUTH] = { .type = NLA_FLAG }, 4793 [NL80211_MESH_SETUP_AUTH_PROTOCOL] = { .type = NLA_U8 }, 4794 [NL80211_MESH_SETUP_USERSPACE_MPM] = { .type = NLA_FLAG }, 4795 [NL80211_MESH_SETUP_IE] = { .type = NLA_BINARY, 4796 .len = IEEE80211_MAX_DATA_LEN }, 4797 [NL80211_MESH_SETUP_USERSPACE_AMPE] = { .type = NLA_FLAG }, 4798 }; 4799 4800 static int nl80211_parse_mesh_config(struct genl_info *info, 4801 struct mesh_config *cfg, 4802 u32 *mask_out) 4803 { 4804 struct nlattr *tb[NL80211_MESHCONF_ATTR_MAX + 1]; 4805 u32 mask = 0; 4806 4807 #define FILL_IN_MESH_PARAM_IF_SET(tb, cfg, param, min, max, mask, attr, fn) \ 4808 do { \ 4809 if (tb[attr]) { \ 4810 if (fn(tb[attr]) < min || fn(tb[attr]) > max) \ 4811 return -EINVAL; \ 4812 cfg->param = fn(tb[attr]); \ 4813 mask |= (1 << (attr - 1)); \ 4814 } \ 4815 } while (0) 4816 4817 4818 if (!info->attrs[NL80211_ATTR_MESH_CONFIG]) 4819 return -EINVAL; 4820 if (nla_parse_nested(tb, NL80211_MESHCONF_ATTR_MAX, 4821 info->attrs[NL80211_ATTR_MESH_CONFIG], 4822 nl80211_meshconf_params_policy)) 4823 return -EINVAL; 4824 4825 /* This makes sure that there aren't more than 32 mesh config 4826 * parameters (otherwise our bitfield scheme would not work.) */ 4827 BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32); 4828 4829 /* Fill in the params struct */ 4830 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshRetryTimeout, 1, 255, 4831 mask, NL80211_MESHCONF_RETRY_TIMEOUT, 4832 nla_get_u16); 4833 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshConfirmTimeout, 1, 255, 4834 mask, NL80211_MESHCONF_CONFIRM_TIMEOUT, 4835 nla_get_u16); 4836 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHoldingTimeout, 1, 255, 4837 mask, NL80211_MESHCONF_HOLDING_TIMEOUT, 4838 nla_get_u16); 4839 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxPeerLinks, 0, 255, 4840 mask, NL80211_MESHCONF_MAX_PEER_LINKS, 4841 nla_get_u16); 4842 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshMaxRetries, 0, 16, 4843 mask, NL80211_MESHCONF_MAX_RETRIES, 4844 nla_get_u8); 4845 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshTTL, 1, 255, 4846 mask, NL80211_MESHCONF_TTL, nla_get_u8); 4847 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, element_ttl, 1, 255, 4848 mask, NL80211_MESHCONF_ELEMENT_TTL, 4849 nla_get_u8); 4850 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, auto_open_plinks, 0, 1, 4851 mask, NL80211_MESHCONF_AUTO_OPEN_PLINKS, 4852 nla_get_u8); 4853 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshNbrOffsetMaxNeighbor, 4854 1, 255, mask, 4855 NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, 4856 nla_get_u32); 4857 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPmaxPREQretries, 0, 255, 4858 mask, NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, 4859 nla_get_u8); 4860 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, path_refresh_time, 1, 65535, 4861 mask, NL80211_MESHCONF_PATH_REFRESH_TIME, 4862 nla_get_u32); 4863 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, min_discovery_timeout, 1, 65535, 4864 mask, NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, 4865 nla_get_u16); 4866 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathTimeout, 4867 1, 65535, mask, 4868 NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, 4869 nla_get_u32); 4870 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPpreqMinInterval, 4871 1, 65535, mask, 4872 NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, 4873 nla_get_u16); 4874 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPperrMinInterval, 4875 1, 65535, mask, 4876 NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, 4877 nla_get_u16); 4878 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 4879 dot11MeshHWMPnetDiameterTraversalTime, 4880 1, 65535, mask, 4881 NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, 4882 nla_get_u16); 4883 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRootMode, 0, 4, 4884 mask, NL80211_MESHCONF_HWMP_ROOTMODE, 4885 nla_get_u8); 4886 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPRannInterval, 1, 65535, 4887 mask, NL80211_MESHCONF_HWMP_RANN_INTERVAL, 4888 nla_get_u16); 4889 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 4890 dot11MeshGateAnnouncementProtocol, 0, 1, 4891 mask, NL80211_MESHCONF_GATE_ANNOUNCEMENTS, 4892 nla_get_u8); 4893 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, 0, 1, 4894 mask, NL80211_MESHCONF_FORWARDING, 4895 nla_get_u8); 4896 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, -255, 0, 4897 mask, NL80211_MESHCONF_RSSI_THRESHOLD, 4898 nla_get_s32); 4899 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, ht_opmode, 0, 16, 4900 mask, NL80211_MESHCONF_HT_OPMODE, 4901 nla_get_u16); 4902 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMPactivePathToRootTimeout, 4903 1, 65535, mask, 4904 NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, 4905 nla_get_u32); 4906 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshHWMProotInterval, 1, 65535, 4907 mask, NL80211_MESHCONF_HWMP_ROOT_INTERVAL, 4908 nla_get_u16); 4909 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, 4910 dot11MeshHWMPconfirmationInterval, 4911 1, 65535, mask, 4912 NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, 4913 nla_get_u16); 4914 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, power_mode, 4915 NL80211_MESH_POWER_ACTIVE, 4916 NL80211_MESH_POWER_MAX, 4917 mask, NL80211_MESHCONF_POWER_MODE, 4918 nla_get_u32); 4919 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshAwakeWindowDuration, 4920 0, 65535, mask, 4921 NL80211_MESHCONF_AWAKE_WINDOW, nla_get_u16); 4922 FILL_IN_MESH_PARAM_IF_SET(tb, cfg, plink_timeout, 1, 0xffffffff, 4923 mask, NL80211_MESHCONF_PLINK_TIMEOUT, 4924 nla_get_u32); 4925 if (mask_out) 4926 *mask_out = mask; 4927 4928 return 0; 4929 4930 #undef FILL_IN_MESH_PARAM_IF_SET 4931 } 4932 4933 static int nl80211_parse_mesh_setup(struct genl_info *info, 4934 struct mesh_setup *setup) 4935 { 4936 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4937 struct nlattr *tb[NL80211_MESH_SETUP_ATTR_MAX + 1]; 4938 4939 if (!info->attrs[NL80211_ATTR_MESH_SETUP]) 4940 return -EINVAL; 4941 if (nla_parse_nested(tb, NL80211_MESH_SETUP_ATTR_MAX, 4942 info->attrs[NL80211_ATTR_MESH_SETUP], 4943 nl80211_mesh_setup_params_policy)) 4944 return -EINVAL; 4945 4946 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC]) 4947 setup->sync_method = 4948 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC])) ? 4949 IEEE80211_SYNC_METHOD_VENDOR : 4950 IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET; 4951 4952 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL]) 4953 setup->path_sel_proto = 4954 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL])) ? 4955 IEEE80211_PATH_PROTOCOL_VENDOR : 4956 IEEE80211_PATH_PROTOCOL_HWMP; 4957 4958 if (tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC]) 4959 setup->path_metric = 4960 (nla_get_u8(tb[NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC])) ? 4961 IEEE80211_PATH_METRIC_VENDOR : 4962 IEEE80211_PATH_METRIC_AIRTIME; 4963 4964 4965 if (tb[NL80211_MESH_SETUP_IE]) { 4966 struct nlattr *ieattr = 4967 tb[NL80211_MESH_SETUP_IE]; 4968 if (!is_valid_ie_attr(ieattr)) 4969 return -EINVAL; 4970 setup->ie = nla_data(ieattr); 4971 setup->ie_len = nla_len(ieattr); 4972 } 4973 if (tb[NL80211_MESH_SETUP_USERSPACE_MPM] && 4974 !(rdev->wiphy.features & NL80211_FEATURE_USERSPACE_MPM)) 4975 return -EINVAL; 4976 setup->user_mpm = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_MPM]); 4977 setup->is_authenticated = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AUTH]); 4978 setup->is_secure = nla_get_flag(tb[NL80211_MESH_SETUP_USERSPACE_AMPE]); 4979 if (setup->is_secure) 4980 setup->user_mpm = true; 4981 4982 if (tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]) { 4983 if (!setup->user_mpm) 4984 return -EINVAL; 4985 setup->auth_id = 4986 nla_get_u8(tb[NL80211_MESH_SETUP_AUTH_PROTOCOL]); 4987 } 4988 4989 return 0; 4990 } 4991 4992 static int nl80211_update_mesh_config(struct sk_buff *skb, 4993 struct genl_info *info) 4994 { 4995 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 4996 struct net_device *dev = info->user_ptr[1]; 4997 struct wireless_dev *wdev = dev->ieee80211_ptr; 4998 struct mesh_config cfg; 4999 u32 mask; 5000 int err; 5001 5002 if (wdev->iftype != NL80211_IFTYPE_MESH_POINT) 5003 return -EOPNOTSUPP; 5004 5005 if (!rdev->ops->update_mesh_config) 5006 return -EOPNOTSUPP; 5007 5008 err = nl80211_parse_mesh_config(info, &cfg, &mask); 5009 if (err) 5010 return err; 5011 5012 wdev_lock(wdev); 5013 if (!wdev->mesh_id_len) 5014 err = -ENOLINK; 5015 5016 if (!err) 5017 err = rdev_update_mesh_config(rdev, dev, mask, &cfg); 5018 5019 wdev_unlock(wdev); 5020 5021 return err; 5022 } 5023 5024 static int nl80211_get_reg(struct sk_buff *skb, struct genl_info *info) 5025 { 5026 const struct ieee80211_regdomain *regdom; 5027 struct sk_buff *msg; 5028 void *hdr = NULL; 5029 struct nlattr *nl_reg_rules; 5030 unsigned int i; 5031 5032 if (!cfg80211_regdomain) 5033 return -EINVAL; 5034 5035 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 5036 if (!msg) 5037 return -ENOBUFS; 5038 5039 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 5040 NL80211_CMD_GET_REG); 5041 if (!hdr) 5042 goto put_failure; 5043 5044 if (reg_last_request_cell_base() && 5045 nla_put_u32(msg, NL80211_ATTR_USER_REG_HINT_TYPE, 5046 NL80211_USER_REG_HINT_CELL_BASE)) 5047 goto nla_put_failure; 5048 5049 rcu_read_lock(); 5050 regdom = rcu_dereference(cfg80211_regdomain); 5051 5052 if (nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, regdom->alpha2) || 5053 (regdom->dfs_region && 5054 nla_put_u8(msg, NL80211_ATTR_DFS_REGION, regdom->dfs_region))) 5055 goto nla_put_failure_rcu; 5056 5057 nl_reg_rules = nla_nest_start(msg, NL80211_ATTR_REG_RULES); 5058 if (!nl_reg_rules) 5059 goto nla_put_failure_rcu; 5060 5061 for (i = 0; i < regdom->n_reg_rules; i++) { 5062 struct nlattr *nl_reg_rule; 5063 const struct ieee80211_reg_rule *reg_rule; 5064 const struct ieee80211_freq_range *freq_range; 5065 const struct ieee80211_power_rule *power_rule; 5066 5067 reg_rule = ®dom->reg_rules[i]; 5068 freq_range = ®_rule->freq_range; 5069 power_rule = ®_rule->power_rule; 5070 5071 nl_reg_rule = nla_nest_start(msg, i); 5072 if (!nl_reg_rule) 5073 goto nla_put_failure_rcu; 5074 5075 if (nla_put_u32(msg, NL80211_ATTR_REG_RULE_FLAGS, 5076 reg_rule->flags) || 5077 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_START, 5078 freq_range->start_freq_khz) || 5079 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_END, 5080 freq_range->end_freq_khz) || 5081 nla_put_u32(msg, NL80211_ATTR_FREQ_RANGE_MAX_BW, 5082 freq_range->max_bandwidth_khz) || 5083 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN, 5084 power_rule->max_antenna_gain) || 5085 nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP, 5086 power_rule->max_eirp)) 5087 goto nla_put_failure_rcu; 5088 5089 nla_nest_end(msg, nl_reg_rule); 5090 } 5091 rcu_read_unlock(); 5092 5093 nla_nest_end(msg, nl_reg_rules); 5094 5095 genlmsg_end(msg, hdr); 5096 return genlmsg_reply(msg, info); 5097 5098 nla_put_failure_rcu: 5099 rcu_read_unlock(); 5100 nla_put_failure: 5101 genlmsg_cancel(msg, hdr); 5102 put_failure: 5103 nlmsg_free(msg); 5104 return -EMSGSIZE; 5105 } 5106 5107 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info) 5108 { 5109 struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1]; 5110 struct nlattr *nl_reg_rule; 5111 char *alpha2 = NULL; 5112 int rem_reg_rules = 0, r = 0; 5113 u32 num_rules = 0, rule_idx = 0, size_of_regd; 5114 enum nl80211_dfs_regions dfs_region = NL80211_DFS_UNSET; 5115 struct ieee80211_regdomain *rd = NULL; 5116 5117 if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) 5118 return -EINVAL; 5119 5120 if (!info->attrs[NL80211_ATTR_REG_RULES]) 5121 return -EINVAL; 5122 5123 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]); 5124 5125 if (info->attrs[NL80211_ATTR_DFS_REGION]) 5126 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]); 5127 5128 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 5129 rem_reg_rules) { 5130 num_rules++; 5131 if (num_rules > NL80211_MAX_SUPP_REG_RULES) 5132 return -EINVAL; 5133 } 5134 5135 if (!reg_is_valid_request(alpha2)) 5136 return -EINVAL; 5137 5138 size_of_regd = sizeof(struct ieee80211_regdomain) + 5139 num_rules * sizeof(struct ieee80211_reg_rule); 5140 5141 rd = kzalloc(size_of_regd, GFP_KERNEL); 5142 if (!rd) 5143 return -ENOMEM; 5144 5145 rd->n_reg_rules = num_rules; 5146 rd->alpha2[0] = alpha2[0]; 5147 rd->alpha2[1] = alpha2[1]; 5148 5149 /* 5150 * Disable DFS master mode if the DFS region was 5151 * not supported or known on this kernel. 5152 */ 5153 if (reg_supported_dfs_region(dfs_region)) 5154 rd->dfs_region = dfs_region; 5155 5156 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES], 5157 rem_reg_rules) { 5158 nla_parse(tb, NL80211_REG_RULE_ATTR_MAX, 5159 nla_data(nl_reg_rule), nla_len(nl_reg_rule), 5160 reg_rule_policy); 5161 r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]); 5162 if (r) 5163 goto bad_reg; 5164 5165 rule_idx++; 5166 5167 if (rule_idx > NL80211_MAX_SUPP_REG_RULES) { 5168 r = -EINVAL; 5169 goto bad_reg; 5170 } 5171 } 5172 5173 r = set_regdom(rd); 5174 /* set_regdom took ownership */ 5175 rd = NULL; 5176 5177 bad_reg: 5178 kfree(rd); 5179 return r; 5180 } 5181 5182 static int validate_scan_freqs(struct nlattr *freqs) 5183 { 5184 struct nlattr *attr1, *attr2; 5185 int n_channels = 0, tmp1, tmp2; 5186 5187 nla_for_each_nested(attr1, freqs, tmp1) { 5188 n_channels++; 5189 /* 5190 * Some hardware has a limited channel list for 5191 * scanning, and it is pretty much nonsensical 5192 * to scan for a channel twice, so disallow that 5193 * and don't require drivers to check that the 5194 * channel list they get isn't longer than what 5195 * they can scan, as long as they can scan all 5196 * the channels they registered at once. 5197 */ 5198 nla_for_each_nested(attr2, freqs, tmp2) 5199 if (attr1 != attr2 && 5200 nla_get_u32(attr1) == nla_get_u32(attr2)) 5201 return 0; 5202 } 5203 5204 return n_channels; 5205 } 5206 5207 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) 5208 { 5209 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5210 struct wireless_dev *wdev = info->user_ptr[1]; 5211 struct cfg80211_scan_request *request; 5212 struct nlattr *attr; 5213 struct wiphy *wiphy; 5214 int err, tmp, n_ssids = 0, n_channels, i; 5215 size_t ie_len; 5216 5217 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) 5218 return -EINVAL; 5219 5220 wiphy = &rdev->wiphy; 5221 5222 if (!rdev->ops->scan) 5223 return -EOPNOTSUPP; 5224 5225 if (rdev->scan_req) { 5226 err = -EBUSY; 5227 goto unlock; 5228 } 5229 5230 if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 5231 n_channels = validate_scan_freqs( 5232 info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]); 5233 if (!n_channels) { 5234 err = -EINVAL; 5235 goto unlock; 5236 } 5237 } else { 5238 enum ieee80211_band band; 5239 n_channels = 0; 5240 5241 for (band = 0; band < IEEE80211_NUM_BANDS; band++) 5242 if (wiphy->bands[band]) 5243 n_channels += wiphy->bands[band]->n_channels; 5244 } 5245 5246 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) 5247 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) 5248 n_ssids++; 5249 5250 if (n_ssids > wiphy->max_scan_ssids) { 5251 err = -EINVAL; 5252 goto unlock; 5253 } 5254 5255 if (info->attrs[NL80211_ATTR_IE]) 5256 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 5257 else 5258 ie_len = 0; 5259 5260 if (ie_len > wiphy->max_scan_ie_len) { 5261 err = -EINVAL; 5262 goto unlock; 5263 } 5264 5265 request = kzalloc(sizeof(*request) 5266 + sizeof(*request->ssids) * n_ssids 5267 + sizeof(*request->channels) * n_channels 5268 + ie_len, GFP_KERNEL); 5269 if (!request) { 5270 err = -ENOMEM; 5271 goto unlock; 5272 } 5273 5274 if (n_ssids) 5275 request->ssids = (void *)&request->channels[n_channels]; 5276 request->n_ssids = n_ssids; 5277 if (ie_len) { 5278 if (request->ssids) 5279 request->ie = (void *)(request->ssids + n_ssids); 5280 else 5281 request->ie = (void *)(request->channels + n_channels); 5282 } 5283 5284 i = 0; 5285 if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 5286 /* user specified, bail out if channel not found */ 5287 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_FREQUENCIES], tmp) { 5288 struct ieee80211_channel *chan; 5289 5290 chan = ieee80211_get_channel(wiphy, nla_get_u32(attr)); 5291 5292 if (!chan) { 5293 err = -EINVAL; 5294 goto out_free; 5295 } 5296 5297 /* ignore disabled channels */ 5298 if (chan->flags & IEEE80211_CHAN_DISABLED) 5299 continue; 5300 5301 request->channels[i] = chan; 5302 i++; 5303 } 5304 } else { 5305 enum ieee80211_band band; 5306 5307 /* all channels */ 5308 for (band = 0; band < IEEE80211_NUM_BANDS; band++) { 5309 int j; 5310 if (!wiphy->bands[band]) 5311 continue; 5312 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 5313 struct ieee80211_channel *chan; 5314 5315 chan = &wiphy->bands[band]->channels[j]; 5316 5317 if (chan->flags & IEEE80211_CHAN_DISABLED) 5318 continue; 5319 5320 request->channels[i] = chan; 5321 i++; 5322 } 5323 } 5324 } 5325 5326 if (!i) { 5327 err = -EINVAL; 5328 goto out_free; 5329 } 5330 5331 request->n_channels = i; 5332 5333 i = 0; 5334 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) { 5335 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) { 5336 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 5337 err = -EINVAL; 5338 goto out_free; 5339 } 5340 request->ssids[i].ssid_len = nla_len(attr); 5341 memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr)); 5342 i++; 5343 } 5344 } 5345 5346 if (info->attrs[NL80211_ATTR_IE]) { 5347 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 5348 memcpy((void *)request->ie, 5349 nla_data(info->attrs[NL80211_ATTR_IE]), 5350 request->ie_len); 5351 } 5352 5353 for (i = 0; i < IEEE80211_NUM_BANDS; i++) 5354 if (wiphy->bands[i]) 5355 request->rates[i] = 5356 (1 << wiphy->bands[i]->n_bitrates) - 1; 5357 5358 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { 5359 nla_for_each_nested(attr, 5360 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES], 5361 tmp) { 5362 enum ieee80211_band band = nla_type(attr); 5363 5364 if (band < 0 || band >= IEEE80211_NUM_BANDS) { 5365 err = -EINVAL; 5366 goto out_free; 5367 } 5368 5369 if (!wiphy->bands[band]) 5370 continue; 5371 5372 err = ieee80211_get_ratemask(wiphy->bands[band], 5373 nla_data(attr), 5374 nla_len(attr), 5375 &request->rates[band]); 5376 if (err) 5377 goto out_free; 5378 } 5379 } 5380 5381 if (info->attrs[NL80211_ATTR_SCAN_FLAGS]) { 5382 request->flags = nla_get_u32( 5383 info->attrs[NL80211_ATTR_SCAN_FLAGS]); 5384 if ((request->flags & NL80211_SCAN_FLAG_LOW_PRIORITY) && 5385 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) { 5386 err = -EOPNOTSUPP; 5387 goto out_free; 5388 } 5389 } 5390 5391 request->no_cck = 5392 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 5393 5394 request->wdev = wdev; 5395 request->wiphy = &rdev->wiphy; 5396 request->scan_start = jiffies; 5397 5398 rdev->scan_req = request; 5399 err = rdev_scan(rdev, request); 5400 5401 if (!err) { 5402 nl80211_send_scan_start(rdev, wdev); 5403 if (wdev->netdev) 5404 dev_hold(wdev->netdev); 5405 } else { 5406 out_free: 5407 rdev->scan_req = NULL; 5408 kfree(request); 5409 } 5410 5411 unlock: 5412 return err; 5413 } 5414 5415 static int nl80211_start_sched_scan(struct sk_buff *skb, 5416 struct genl_info *info) 5417 { 5418 struct cfg80211_sched_scan_request *request; 5419 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5420 struct net_device *dev = info->user_ptr[1]; 5421 struct nlattr *attr; 5422 struct wiphy *wiphy; 5423 int err, tmp, n_ssids = 0, n_match_sets = 0, n_channels, i; 5424 u32 interval; 5425 enum ieee80211_band band; 5426 size_t ie_len; 5427 struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1]; 5428 5429 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN) || 5430 !rdev->ops->sched_scan_start) 5431 return -EOPNOTSUPP; 5432 5433 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) 5434 return -EINVAL; 5435 5436 if (!info->attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]) 5437 return -EINVAL; 5438 5439 interval = nla_get_u32(info->attrs[NL80211_ATTR_SCHED_SCAN_INTERVAL]); 5440 if (interval == 0) 5441 return -EINVAL; 5442 5443 wiphy = &rdev->wiphy; 5444 5445 if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 5446 n_channels = validate_scan_freqs( 5447 info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]); 5448 if (!n_channels) 5449 return -EINVAL; 5450 } else { 5451 n_channels = 0; 5452 5453 for (band = 0; band < IEEE80211_NUM_BANDS; band++) 5454 if (wiphy->bands[band]) 5455 n_channels += wiphy->bands[band]->n_channels; 5456 } 5457 5458 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) 5459 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], 5460 tmp) 5461 n_ssids++; 5462 5463 if (n_ssids > wiphy->max_sched_scan_ssids) 5464 return -EINVAL; 5465 5466 if (info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) 5467 nla_for_each_nested(attr, 5468 info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 5469 tmp) 5470 n_match_sets++; 5471 5472 if (n_match_sets > wiphy->max_match_sets) 5473 return -EINVAL; 5474 5475 if (info->attrs[NL80211_ATTR_IE]) 5476 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 5477 else 5478 ie_len = 0; 5479 5480 if (ie_len > wiphy->max_sched_scan_ie_len) 5481 return -EINVAL; 5482 5483 if (rdev->sched_scan_req) { 5484 err = -EINPROGRESS; 5485 goto out; 5486 } 5487 5488 request = kzalloc(sizeof(*request) 5489 + sizeof(*request->ssids) * n_ssids 5490 + sizeof(*request->match_sets) * n_match_sets 5491 + sizeof(*request->channels) * n_channels 5492 + ie_len, GFP_KERNEL); 5493 if (!request) { 5494 err = -ENOMEM; 5495 goto out; 5496 } 5497 5498 if (n_ssids) 5499 request->ssids = (void *)&request->channels[n_channels]; 5500 request->n_ssids = n_ssids; 5501 if (ie_len) { 5502 if (request->ssids) 5503 request->ie = (void *)(request->ssids + n_ssids); 5504 else 5505 request->ie = (void *)(request->channels + n_channels); 5506 } 5507 5508 if (n_match_sets) { 5509 if (request->ie) 5510 request->match_sets = (void *)(request->ie + ie_len); 5511 else if (request->ssids) 5512 request->match_sets = 5513 (void *)(request->ssids + n_ssids); 5514 else 5515 request->match_sets = 5516 (void *)(request->channels + n_channels); 5517 } 5518 request->n_match_sets = n_match_sets; 5519 5520 i = 0; 5521 if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) { 5522 /* user specified, bail out if channel not found */ 5523 nla_for_each_nested(attr, 5524 info->attrs[NL80211_ATTR_SCAN_FREQUENCIES], 5525 tmp) { 5526 struct ieee80211_channel *chan; 5527 5528 chan = ieee80211_get_channel(wiphy, nla_get_u32(attr)); 5529 5530 if (!chan) { 5531 err = -EINVAL; 5532 goto out_free; 5533 } 5534 5535 /* ignore disabled channels */ 5536 if (chan->flags & IEEE80211_CHAN_DISABLED) 5537 continue; 5538 5539 request->channels[i] = chan; 5540 i++; 5541 } 5542 } else { 5543 /* all channels */ 5544 for (band = 0; band < IEEE80211_NUM_BANDS; band++) { 5545 int j; 5546 if (!wiphy->bands[band]) 5547 continue; 5548 for (j = 0; j < wiphy->bands[band]->n_channels; j++) { 5549 struct ieee80211_channel *chan; 5550 5551 chan = &wiphy->bands[band]->channels[j]; 5552 5553 if (chan->flags & IEEE80211_CHAN_DISABLED) 5554 continue; 5555 5556 request->channels[i] = chan; 5557 i++; 5558 } 5559 } 5560 } 5561 5562 if (!i) { 5563 err = -EINVAL; 5564 goto out_free; 5565 } 5566 5567 request->n_channels = i; 5568 5569 i = 0; 5570 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) { 5571 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], 5572 tmp) { 5573 if (nla_len(attr) > IEEE80211_MAX_SSID_LEN) { 5574 err = -EINVAL; 5575 goto out_free; 5576 } 5577 request->ssids[i].ssid_len = nla_len(attr); 5578 memcpy(request->ssids[i].ssid, nla_data(attr), 5579 nla_len(attr)); 5580 i++; 5581 } 5582 } 5583 5584 i = 0; 5585 if (info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) { 5586 nla_for_each_nested(attr, 5587 info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH], 5588 tmp) { 5589 struct nlattr *ssid, *rssi; 5590 5591 nla_parse(tb, NL80211_SCHED_SCAN_MATCH_ATTR_MAX, 5592 nla_data(attr), nla_len(attr), 5593 nl80211_match_policy); 5594 ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID]; 5595 if (ssid) { 5596 if (nla_len(ssid) > IEEE80211_MAX_SSID_LEN) { 5597 err = -EINVAL; 5598 goto out_free; 5599 } 5600 memcpy(request->match_sets[i].ssid.ssid, 5601 nla_data(ssid), nla_len(ssid)); 5602 request->match_sets[i].ssid.ssid_len = 5603 nla_len(ssid); 5604 } 5605 rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI]; 5606 if (rssi) 5607 request->rssi_thold = nla_get_u32(rssi); 5608 else 5609 request->rssi_thold = 5610 NL80211_SCAN_RSSI_THOLD_OFF; 5611 i++; 5612 } 5613 } 5614 5615 if (info->attrs[NL80211_ATTR_IE]) { 5616 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 5617 memcpy((void *)request->ie, 5618 nla_data(info->attrs[NL80211_ATTR_IE]), 5619 request->ie_len); 5620 } 5621 5622 if (info->attrs[NL80211_ATTR_SCAN_FLAGS]) { 5623 request->flags = nla_get_u32( 5624 info->attrs[NL80211_ATTR_SCAN_FLAGS]); 5625 if ((request->flags & NL80211_SCAN_FLAG_LOW_PRIORITY) && 5626 !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) { 5627 err = -EOPNOTSUPP; 5628 goto out_free; 5629 } 5630 } 5631 5632 request->dev = dev; 5633 request->wiphy = &rdev->wiphy; 5634 request->interval = interval; 5635 request->scan_start = jiffies; 5636 5637 err = rdev_sched_scan_start(rdev, dev, request); 5638 if (!err) { 5639 rdev->sched_scan_req = request; 5640 nl80211_send_sched_scan(rdev, dev, 5641 NL80211_CMD_START_SCHED_SCAN); 5642 goto out; 5643 } 5644 5645 out_free: 5646 kfree(request); 5647 out: 5648 return err; 5649 } 5650 5651 static int nl80211_stop_sched_scan(struct sk_buff *skb, 5652 struct genl_info *info) 5653 { 5654 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5655 5656 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN) || 5657 !rdev->ops->sched_scan_stop) 5658 return -EOPNOTSUPP; 5659 5660 return __cfg80211_stop_sched_scan(rdev, false); 5661 } 5662 5663 static int nl80211_start_radar_detection(struct sk_buff *skb, 5664 struct genl_info *info) 5665 { 5666 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5667 struct net_device *dev = info->user_ptr[1]; 5668 struct wireless_dev *wdev = dev->ieee80211_ptr; 5669 struct cfg80211_chan_def chandef; 5670 int err; 5671 5672 err = nl80211_parse_chandef(rdev, info, &chandef); 5673 if (err) 5674 return err; 5675 5676 if (netif_carrier_ok(dev)) 5677 return -EBUSY; 5678 5679 if (wdev->cac_started) 5680 return -EBUSY; 5681 5682 err = cfg80211_chandef_dfs_required(wdev->wiphy, &chandef); 5683 if (err < 0) 5684 return err; 5685 5686 if (err == 0) 5687 return -EINVAL; 5688 5689 if (!cfg80211_chandef_dfs_usable(wdev->wiphy, &chandef)) 5690 return -EINVAL; 5691 5692 if (!rdev->ops->start_radar_detection) 5693 return -EOPNOTSUPP; 5694 5695 err = cfg80211_can_use_iftype_chan(rdev, wdev, wdev->iftype, 5696 chandef.chan, CHAN_MODE_SHARED, 5697 BIT(chandef.width)); 5698 if (err) 5699 return err; 5700 5701 err = rdev->ops->start_radar_detection(&rdev->wiphy, dev, &chandef); 5702 if (!err) { 5703 wdev->channel = chandef.chan; 5704 wdev->cac_started = true; 5705 wdev->cac_start_time = jiffies; 5706 } 5707 return err; 5708 } 5709 5710 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info) 5711 { 5712 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 5713 struct net_device *dev = info->user_ptr[1]; 5714 struct wireless_dev *wdev = dev->ieee80211_ptr; 5715 struct cfg80211_csa_settings params; 5716 /* csa_attrs is defined static to avoid waste of stack size - this 5717 * function is called under RTNL lock, so this should not be a problem. 5718 */ 5719 static struct nlattr *csa_attrs[NL80211_ATTR_MAX+1]; 5720 u8 radar_detect_width = 0; 5721 int err; 5722 bool need_new_beacon = false; 5723 5724 if (!rdev->ops->channel_switch || 5725 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH)) 5726 return -EOPNOTSUPP; 5727 5728 switch (dev->ieee80211_ptr->iftype) { 5729 case NL80211_IFTYPE_AP: 5730 case NL80211_IFTYPE_P2P_GO: 5731 need_new_beacon = true; 5732 5733 /* useless if AP is not running */ 5734 if (!wdev->beacon_interval) 5735 return -EINVAL; 5736 break; 5737 case NL80211_IFTYPE_ADHOC: 5738 case NL80211_IFTYPE_MESH_POINT: 5739 break; 5740 default: 5741 return -EOPNOTSUPP; 5742 } 5743 5744 memset(¶ms, 0, sizeof(params)); 5745 5746 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 5747 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]) 5748 return -EINVAL; 5749 5750 /* only important for AP, IBSS and mesh create IEs internally */ 5751 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES]) 5752 return -EINVAL; 5753 5754 params.count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]); 5755 5756 if (!need_new_beacon) 5757 goto skip_beacons; 5758 5759 err = nl80211_parse_beacon(info->attrs, ¶ms.beacon_after); 5760 if (err) 5761 return err; 5762 5763 err = nla_parse_nested(csa_attrs, NL80211_ATTR_MAX, 5764 info->attrs[NL80211_ATTR_CSA_IES], 5765 nl80211_policy); 5766 if (err) 5767 return err; 5768 5769 err = nl80211_parse_beacon(csa_attrs, ¶ms.beacon_csa); 5770 if (err) 5771 return err; 5772 5773 if (!csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]) 5774 return -EINVAL; 5775 5776 params.counter_offset_beacon = 5777 nla_get_u16(csa_attrs[NL80211_ATTR_CSA_C_OFF_BEACON]); 5778 if (params.counter_offset_beacon >= params.beacon_csa.tail_len) 5779 return -EINVAL; 5780 5781 /* sanity check - counters should be the same */ 5782 if (params.beacon_csa.tail[params.counter_offset_beacon] != 5783 params.count) 5784 return -EINVAL; 5785 5786 if (csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]) { 5787 params.counter_offset_presp = 5788 nla_get_u16(csa_attrs[NL80211_ATTR_CSA_C_OFF_PRESP]); 5789 if (params.counter_offset_presp >= 5790 params.beacon_csa.probe_resp_len) 5791 return -EINVAL; 5792 5793 if (params.beacon_csa.probe_resp[params.counter_offset_presp] != 5794 params.count) 5795 return -EINVAL; 5796 } 5797 5798 skip_beacons: 5799 err = nl80211_parse_chandef(rdev, info, ¶ms.chandef); 5800 if (err) 5801 return err; 5802 5803 if (!cfg80211_reg_can_beacon(&rdev->wiphy, ¶ms.chandef)) 5804 return -EINVAL; 5805 5806 if (dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || 5807 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO || 5808 dev->ieee80211_ptr->iftype == NL80211_IFTYPE_ADHOC) { 5809 err = cfg80211_chandef_dfs_required(wdev->wiphy, 5810 ¶ms.chandef); 5811 if (err < 0) { 5812 return err; 5813 } else if (err) { 5814 radar_detect_width = BIT(params.chandef.width); 5815 params.radar_required = true; 5816 } 5817 } 5818 5819 err = cfg80211_can_use_iftype_chan(rdev, wdev, wdev->iftype, 5820 params.chandef.chan, 5821 CHAN_MODE_SHARED, 5822 radar_detect_width); 5823 if (err) 5824 return err; 5825 5826 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX]) 5827 params.block_tx = true; 5828 5829 wdev_lock(wdev); 5830 err = rdev_channel_switch(rdev, dev, ¶ms); 5831 wdev_unlock(wdev); 5832 5833 return err; 5834 } 5835 5836 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb, 5837 u32 seq, int flags, 5838 struct cfg80211_registered_device *rdev, 5839 struct wireless_dev *wdev, 5840 struct cfg80211_internal_bss *intbss) 5841 { 5842 struct cfg80211_bss *res = &intbss->pub; 5843 const struct cfg80211_bss_ies *ies; 5844 void *hdr; 5845 struct nlattr *bss; 5846 bool tsf = false; 5847 5848 ASSERT_WDEV_LOCK(wdev); 5849 5850 hdr = nl80211hdr_put(msg, NETLINK_CB(cb->skb).portid, seq, flags, 5851 NL80211_CMD_NEW_SCAN_RESULTS); 5852 if (!hdr) 5853 return -1; 5854 5855 genl_dump_check_consistent(cb, hdr, &nl80211_fam); 5856 5857 if (nla_put_u32(msg, NL80211_ATTR_GENERATION, rdev->bss_generation)) 5858 goto nla_put_failure; 5859 if (wdev->netdev && 5860 nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex)) 5861 goto nla_put_failure; 5862 if (nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev))) 5863 goto nla_put_failure; 5864 5865 bss = nla_nest_start(msg, NL80211_ATTR_BSS); 5866 if (!bss) 5867 goto nla_put_failure; 5868 if ((!is_zero_ether_addr(res->bssid) && 5869 nla_put(msg, NL80211_BSS_BSSID, ETH_ALEN, res->bssid))) 5870 goto nla_put_failure; 5871 5872 rcu_read_lock(); 5873 ies = rcu_dereference(res->ies); 5874 if (ies) { 5875 if (nla_put_u64(msg, NL80211_BSS_TSF, ies->tsf)) 5876 goto fail_unlock_rcu; 5877 tsf = true; 5878 if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, 5879 ies->len, ies->data)) 5880 goto fail_unlock_rcu; 5881 } 5882 ies = rcu_dereference(res->beacon_ies); 5883 if (ies) { 5884 if (!tsf && nla_put_u64(msg, NL80211_BSS_TSF, ies->tsf)) 5885 goto fail_unlock_rcu; 5886 if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, 5887 ies->len, ies->data)) 5888 goto fail_unlock_rcu; 5889 } 5890 rcu_read_unlock(); 5891 5892 if (res->beacon_interval && 5893 nla_put_u16(msg, NL80211_BSS_BEACON_INTERVAL, res->beacon_interval)) 5894 goto nla_put_failure; 5895 if (nla_put_u16(msg, NL80211_BSS_CAPABILITY, res->capability) || 5896 nla_put_u32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq) || 5897 nla_put_u32(msg, NL80211_BSS_CHAN_WIDTH, res->scan_width) || 5898 nla_put_u32(msg, NL80211_BSS_SEEN_MS_AGO, 5899 jiffies_to_msecs(jiffies - intbss->ts))) 5900 goto nla_put_failure; 5901 5902 switch (rdev->wiphy.signal_type) { 5903 case CFG80211_SIGNAL_TYPE_MBM: 5904 if (nla_put_u32(msg, NL80211_BSS_SIGNAL_MBM, res->signal)) 5905 goto nla_put_failure; 5906 break; 5907 case CFG80211_SIGNAL_TYPE_UNSPEC: 5908 if (nla_put_u8(msg, NL80211_BSS_SIGNAL_UNSPEC, res->signal)) 5909 goto nla_put_failure; 5910 break; 5911 default: 5912 break; 5913 } 5914 5915 switch (wdev->iftype) { 5916 case NL80211_IFTYPE_P2P_CLIENT: 5917 case NL80211_IFTYPE_STATION: 5918 if (intbss == wdev->current_bss && 5919 nla_put_u32(msg, NL80211_BSS_STATUS, 5920 NL80211_BSS_STATUS_ASSOCIATED)) 5921 goto nla_put_failure; 5922 break; 5923 case NL80211_IFTYPE_ADHOC: 5924 if (intbss == wdev->current_bss && 5925 nla_put_u32(msg, NL80211_BSS_STATUS, 5926 NL80211_BSS_STATUS_IBSS_JOINED)) 5927 goto nla_put_failure; 5928 break; 5929 default: 5930 break; 5931 } 5932 5933 nla_nest_end(msg, bss); 5934 5935 return genlmsg_end(msg, hdr); 5936 5937 fail_unlock_rcu: 5938 rcu_read_unlock(); 5939 nla_put_failure: 5940 genlmsg_cancel(msg, hdr); 5941 return -EMSGSIZE; 5942 } 5943 5944 static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb) 5945 { 5946 struct cfg80211_registered_device *rdev; 5947 struct cfg80211_internal_bss *scan; 5948 struct wireless_dev *wdev; 5949 int start = cb->args[2], idx = 0; 5950 int err; 5951 5952 err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev); 5953 if (err) 5954 return err; 5955 5956 wdev_lock(wdev); 5957 spin_lock_bh(&rdev->bss_lock); 5958 cfg80211_bss_expire(rdev); 5959 5960 cb->seq = rdev->bss_generation; 5961 5962 list_for_each_entry(scan, &rdev->bss_list, list) { 5963 if (++idx <= start) 5964 continue; 5965 if (nl80211_send_bss(skb, cb, 5966 cb->nlh->nlmsg_seq, NLM_F_MULTI, 5967 rdev, wdev, scan) < 0) { 5968 idx--; 5969 break; 5970 } 5971 } 5972 5973 spin_unlock_bh(&rdev->bss_lock); 5974 wdev_unlock(wdev); 5975 5976 cb->args[2] = idx; 5977 nl80211_finish_wdev_dump(rdev); 5978 5979 return skb->len; 5980 } 5981 5982 static int nl80211_send_survey(struct sk_buff *msg, u32 portid, u32 seq, 5983 int flags, struct net_device *dev, 5984 struct survey_info *survey) 5985 { 5986 void *hdr; 5987 struct nlattr *infoattr; 5988 5989 hdr = nl80211hdr_put(msg, portid, seq, flags, 5990 NL80211_CMD_NEW_SURVEY_RESULTS); 5991 if (!hdr) 5992 return -ENOMEM; 5993 5994 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 5995 goto nla_put_failure; 5996 5997 infoattr = nla_nest_start(msg, NL80211_ATTR_SURVEY_INFO); 5998 if (!infoattr) 5999 goto nla_put_failure; 6000 6001 if (nla_put_u32(msg, NL80211_SURVEY_INFO_FREQUENCY, 6002 survey->channel->center_freq)) 6003 goto nla_put_failure; 6004 6005 if ((survey->filled & SURVEY_INFO_NOISE_DBM) && 6006 nla_put_u8(msg, NL80211_SURVEY_INFO_NOISE, survey->noise)) 6007 goto nla_put_failure; 6008 if ((survey->filled & SURVEY_INFO_IN_USE) && 6009 nla_put_flag(msg, NL80211_SURVEY_INFO_IN_USE)) 6010 goto nla_put_failure; 6011 if ((survey->filled & SURVEY_INFO_CHANNEL_TIME) && 6012 nla_put_u64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME, 6013 survey->channel_time)) 6014 goto nla_put_failure; 6015 if ((survey->filled & SURVEY_INFO_CHANNEL_TIME_BUSY) && 6016 nla_put_u64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY, 6017 survey->channel_time_busy)) 6018 goto nla_put_failure; 6019 if ((survey->filled & SURVEY_INFO_CHANNEL_TIME_EXT_BUSY) && 6020 nla_put_u64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY, 6021 survey->channel_time_ext_busy)) 6022 goto nla_put_failure; 6023 if ((survey->filled & SURVEY_INFO_CHANNEL_TIME_RX) && 6024 nla_put_u64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME_RX, 6025 survey->channel_time_rx)) 6026 goto nla_put_failure; 6027 if ((survey->filled & SURVEY_INFO_CHANNEL_TIME_TX) && 6028 nla_put_u64(msg, NL80211_SURVEY_INFO_CHANNEL_TIME_TX, 6029 survey->channel_time_tx)) 6030 goto nla_put_failure; 6031 6032 nla_nest_end(msg, infoattr); 6033 6034 return genlmsg_end(msg, hdr); 6035 6036 nla_put_failure: 6037 genlmsg_cancel(msg, hdr); 6038 return -EMSGSIZE; 6039 } 6040 6041 static int nl80211_dump_survey(struct sk_buff *skb, 6042 struct netlink_callback *cb) 6043 { 6044 struct survey_info survey; 6045 struct cfg80211_registered_device *dev; 6046 struct wireless_dev *wdev; 6047 int survey_idx = cb->args[2]; 6048 int res; 6049 6050 res = nl80211_prepare_wdev_dump(skb, cb, &dev, &wdev); 6051 if (res) 6052 return res; 6053 6054 if (!wdev->netdev) { 6055 res = -EINVAL; 6056 goto out_err; 6057 } 6058 6059 if (!dev->ops->dump_survey) { 6060 res = -EOPNOTSUPP; 6061 goto out_err; 6062 } 6063 6064 while (1) { 6065 struct ieee80211_channel *chan; 6066 6067 res = rdev_dump_survey(dev, wdev->netdev, survey_idx, &survey); 6068 if (res == -ENOENT) 6069 break; 6070 if (res) 6071 goto out_err; 6072 6073 /* Survey without a channel doesn't make sense */ 6074 if (!survey.channel) { 6075 res = -EINVAL; 6076 goto out; 6077 } 6078 6079 chan = ieee80211_get_channel(&dev->wiphy, 6080 survey.channel->center_freq); 6081 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) { 6082 survey_idx++; 6083 continue; 6084 } 6085 6086 if (nl80211_send_survey(skb, 6087 NETLINK_CB(cb->skb).portid, 6088 cb->nlh->nlmsg_seq, NLM_F_MULTI, 6089 wdev->netdev, &survey) < 0) 6090 goto out; 6091 survey_idx++; 6092 } 6093 6094 out: 6095 cb->args[2] = survey_idx; 6096 res = skb->len; 6097 out_err: 6098 nl80211_finish_wdev_dump(dev); 6099 return res; 6100 } 6101 6102 static bool nl80211_valid_wpa_versions(u32 wpa_versions) 6103 { 6104 return !(wpa_versions & ~(NL80211_WPA_VERSION_1 | 6105 NL80211_WPA_VERSION_2)); 6106 } 6107 6108 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info) 6109 { 6110 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6111 struct net_device *dev = info->user_ptr[1]; 6112 struct ieee80211_channel *chan; 6113 const u8 *bssid, *ssid, *ie = NULL, *sae_data = NULL; 6114 int err, ssid_len, ie_len = 0, sae_data_len = 0; 6115 enum nl80211_auth_type auth_type; 6116 struct key_parse key; 6117 bool local_state_change; 6118 6119 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) 6120 return -EINVAL; 6121 6122 if (!info->attrs[NL80211_ATTR_MAC]) 6123 return -EINVAL; 6124 6125 if (!info->attrs[NL80211_ATTR_AUTH_TYPE]) 6126 return -EINVAL; 6127 6128 if (!info->attrs[NL80211_ATTR_SSID]) 6129 return -EINVAL; 6130 6131 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 6132 return -EINVAL; 6133 6134 err = nl80211_parse_key(info, &key); 6135 if (err) 6136 return err; 6137 6138 if (key.idx >= 0) { 6139 if (key.type != -1 && key.type != NL80211_KEYTYPE_GROUP) 6140 return -EINVAL; 6141 if (!key.p.key || !key.p.key_len) 6142 return -EINVAL; 6143 if ((key.p.cipher != WLAN_CIPHER_SUITE_WEP40 || 6144 key.p.key_len != WLAN_KEY_LEN_WEP40) && 6145 (key.p.cipher != WLAN_CIPHER_SUITE_WEP104 || 6146 key.p.key_len != WLAN_KEY_LEN_WEP104)) 6147 return -EINVAL; 6148 if (key.idx > 4) 6149 return -EINVAL; 6150 } else { 6151 key.p.key_len = 0; 6152 key.p.key = NULL; 6153 } 6154 6155 if (key.idx >= 0) { 6156 int i; 6157 bool ok = false; 6158 for (i = 0; i < rdev->wiphy.n_cipher_suites; i++) { 6159 if (key.p.cipher == rdev->wiphy.cipher_suites[i]) { 6160 ok = true; 6161 break; 6162 } 6163 } 6164 if (!ok) 6165 return -EINVAL; 6166 } 6167 6168 if (!rdev->ops->auth) 6169 return -EOPNOTSUPP; 6170 6171 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 6172 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 6173 return -EOPNOTSUPP; 6174 6175 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 6176 chan = ieee80211_get_channel(&rdev->wiphy, 6177 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); 6178 if (!chan || (chan->flags & IEEE80211_CHAN_DISABLED)) 6179 return -EINVAL; 6180 6181 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 6182 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 6183 6184 if (info->attrs[NL80211_ATTR_IE]) { 6185 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 6186 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 6187 } 6188 6189 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 6190 if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE)) 6191 return -EINVAL; 6192 6193 if (auth_type == NL80211_AUTHTYPE_SAE && 6194 !info->attrs[NL80211_ATTR_SAE_DATA]) 6195 return -EINVAL; 6196 6197 if (info->attrs[NL80211_ATTR_SAE_DATA]) { 6198 if (auth_type != NL80211_AUTHTYPE_SAE) 6199 return -EINVAL; 6200 sae_data = nla_data(info->attrs[NL80211_ATTR_SAE_DATA]); 6201 sae_data_len = nla_len(info->attrs[NL80211_ATTR_SAE_DATA]); 6202 /* need to include at least Auth Transaction and Status Code */ 6203 if (sae_data_len < 4) 6204 return -EINVAL; 6205 } 6206 6207 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 6208 6209 /* 6210 * Since we no longer track auth state, ignore 6211 * requests to only change local state. 6212 */ 6213 if (local_state_change) 6214 return 0; 6215 6216 wdev_lock(dev->ieee80211_ptr); 6217 err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, 6218 ssid, ssid_len, ie, ie_len, 6219 key.p.key, key.p.key_len, key.idx, 6220 sae_data, sae_data_len); 6221 wdev_unlock(dev->ieee80211_ptr); 6222 return err; 6223 } 6224 6225 static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev, 6226 struct genl_info *info, 6227 struct cfg80211_crypto_settings *settings, 6228 int cipher_limit) 6229 { 6230 memset(settings, 0, sizeof(*settings)); 6231 6232 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT]; 6233 6234 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) { 6235 u16 proto; 6236 proto = nla_get_u16( 6237 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]); 6238 settings->control_port_ethertype = cpu_to_be16(proto); 6239 if (!(rdev->wiphy.flags & WIPHY_FLAG_CONTROL_PORT_PROTOCOL) && 6240 proto != ETH_P_PAE) 6241 return -EINVAL; 6242 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]) 6243 settings->control_port_no_encrypt = true; 6244 } else 6245 settings->control_port_ethertype = cpu_to_be16(ETH_P_PAE); 6246 6247 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) { 6248 void *data; 6249 int len, i; 6250 6251 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 6252 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]); 6253 settings->n_ciphers_pairwise = len / sizeof(u32); 6254 6255 if (len % sizeof(u32)) 6256 return -EINVAL; 6257 6258 if (settings->n_ciphers_pairwise > cipher_limit) 6259 return -EINVAL; 6260 6261 memcpy(settings->ciphers_pairwise, data, len); 6262 6263 for (i = 0; i < settings->n_ciphers_pairwise; i++) 6264 if (!cfg80211_supported_cipher_suite( 6265 &rdev->wiphy, 6266 settings->ciphers_pairwise[i])) 6267 return -EINVAL; 6268 } 6269 6270 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) { 6271 settings->cipher_group = 6272 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]); 6273 if (!cfg80211_supported_cipher_suite(&rdev->wiphy, 6274 settings->cipher_group)) 6275 return -EINVAL; 6276 } 6277 6278 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) { 6279 settings->wpa_versions = 6280 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]); 6281 if (!nl80211_valid_wpa_versions(settings->wpa_versions)) 6282 return -EINVAL; 6283 } 6284 6285 if (info->attrs[NL80211_ATTR_AKM_SUITES]) { 6286 void *data; 6287 int len; 6288 6289 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]); 6290 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]); 6291 settings->n_akm_suites = len / sizeof(u32); 6292 6293 if (len % sizeof(u32)) 6294 return -EINVAL; 6295 6296 if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES) 6297 return -EINVAL; 6298 6299 memcpy(settings->akm_suites, data, len); 6300 } 6301 6302 return 0; 6303 } 6304 6305 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info) 6306 { 6307 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6308 struct net_device *dev = info->user_ptr[1]; 6309 struct ieee80211_channel *chan; 6310 struct cfg80211_assoc_request req = {}; 6311 const u8 *bssid, *ssid; 6312 int err, ssid_len = 0; 6313 6314 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) 6315 return -EINVAL; 6316 6317 if (!info->attrs[NL80211_ATTR_MAC] || 6318 !info->attrs[NL80211_ATTR_SSID] || 6319 !info->attrs[NL80211_ATTR_WIPHY_FREQ]) 6320 return -EINVAL; 6321 6322 if (!rdev->ops->assoc) 6323 return -EOPNOTSUPP; 6324 6325 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 6326 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 6327 return -EOPNOTSUPP; 6328 6329 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 6330 6331 chan = ieee80211_get_channel(&rdev->wiphy, 6332 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); 6333 if (!chan || (chan->flags & IEEE80211_CHAN_DISABLED)) 6334 return -EINVAL; 6335 6336 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 6337 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 6338 6339 if (info->attrs[NL80211_ATTR_IE]) { 6340 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 6341 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 6342 } 6343 6344 if (info->attrs[NL80211_ATTR_USE_MFP]) { 6345 enum nl80211_mfp mfp = 6346 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 6347 if (mfp == NL80211_MFP_REQUIRED) 6348 req.use_mfp = true; 6349 else if (mfp != NL80211_MFP_NO) 6350 return -EINVAL; 6351 } 6352 6353 if (info->attrs[NL80211_ATTR_PREV_BSSID]) 6354 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]); 6355 6356 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 6357 req.flags |= ASSOC_REQ_DISABLE_HT; 6358 6359 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 6360 memcpy(&req.ht_capa_mask, 6361 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 6362 sizeof(req.ht_capa_mask)); 6363 6364 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 6365 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 6366 return -EINVAL; 6367 memcpy(&req.ht_capa, 6368 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 6369 sizeof(req.ht_capa)); 6370 } 6371 6372 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 6373 req.flags |= ASSOC_REQ_DISABLE_VHT; 6374 6375 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 6376 memcpy(&req.vht_capa_mask, 6377 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 6378 sizeof(req.vht_capa_mask)); 6379 6380 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 6381 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 6382 return -EINVAL; 6383 memcpy(&req.vht_capa, 6384 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 6385 sizeof(req.vht_capa)); 6386 } 6387 6388 err = nl80211_crypto_settings(rdev, info, &req.crypto, 1); 6389 if (!err) { 6390 wdev_lock(dev->ieee80211_ptr); 6391 err = cfg80211_mlme_assoc(rdev, dev, chan, bssid, 6392 ssid, ssid_len, &req); 6393 wdev_unlock(dev->ieee80211_ptr); 6394 } 6395 6396 return err; 6397 } 6398 6399 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info) 6400 { 6401 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6402 struct net_device *dev = info->user_ptr[1]; 6403 const u8 *ie = NULL, *bssid; 6404 int ie_len = 0, err; 6405 u16 reason_code; 6406 bool local_state_change; 6407 6408 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) 6409 return -EINVAL; 6410 6411 if (!info->attrs[NL80211_ATTR_MAC]) 6412 return -EINVAL; 6413 6414 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 6415 return -EINVAL; 6416 6417 if (!rdev->ops->deauth) 6418 return -EOPNOTSUPP; 6419 6420 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 6421 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 6422 return -EOPNOTSUPP; 6423 6424 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 6425 6426 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 6427 if (reason_code == 0) { 6428 /* Reason Code 0 is reserved */ 6429 return -EINVAL; 6430 } 6431 6432 if (info->attrs[NL80211_ATTR_IE]) { 6433 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 6434 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 6435 } 6436 6437 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 6438 6439 wdev_lock(dev->ieee80211_ptr); 6440 err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code, 6441 local_state_change); 6442 wdev_unlock(dev->ieee80211_ptr); 6443 return err; 6444 } 6445 6446 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) 6447 { 6448 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6449 struct net_device *dev = info->user_ptr[1]; 6450 const u8 *ie = NULL, *bssid; 6451 int ie_len = 0, err; 6452 u16 reason_code; 6453 bool local_state_change; 6454 6455 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) 6456 return -EINVAL; 6457 6458 if (!info->attrs[NL80211_ATTR_MAC]) 6459 return -EINVAL; 6460 6461 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 6462 return -EINVAL; 6463 6464 if (!rdev->ops->disassoc) 6465 return -EOPNOTSUPP; 6466 6467 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 6468 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 6469 return -EOPNOTSUPP; 6470 6471 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 6472 6473 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 6474 if (reason_code == 0) { 6475 /* Reason Code 0 is reserved */ 6476 return -EINVAL; 6477 } 6478 6479 if (info->attrs[NL80211_ATTR_IE]) { 6480 ie = nla_data(info->attrs[NL80211_ATTR_IE]); 6481 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 6482 } 6483 6484 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; 6485 6486 wdev_lock(dev->ieee80211_ptr); 6487 err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code, 6488 local_state_change); 6489 wdev_unlock(dev->ieee80211_ptr); 6490 return err; 6491 } 6492 6493 static bool 6494 nl80211_parse_mcast_rate(struct cfg80211_registered_device *rdev, 6495 int mcast_rate[IEEE80211_NUM_BANDS], 6496 int rateval) 6497 { 6498 struct wiphy *wiphy = &rdev->wiphy; 6499 bool found = false; 6500 int band, i; 6501 6502 for (band = 0; band < IEEE80211_NUM_BANDS; band++) { 6503 struct ieee80211_supported_band *sband; 6504 6505 sband = wiphy->bands[band]; 6506 if (!sband) 6507 continue; 6508 6509 for (i = 0; i < sband->n_bitrates; i++) { 6510 if (sband->bitrates[i].bitrate == rateval) { 6511 mcast_rate[band] = i + 1; 6512 found = true; 6513 break; 6514 } 6515 } 6516 } 6517 6518 return found; 6519 } 6520 6521 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info) 6522 { 6523 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6524 struct net_device *dev = info->user_ptr[1]; 6525 struct cfg80211_ibss_params ibss; 6526 struct wiphy *wiphy; 6527 struct cfg80211_cached_keys *connkeys = NULL; 6528 int err; 6529 6530 memset(&ibss, 0, sizeof(ibss)); 6531 6532 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) 6533 return -EINVAL; 6534 6535 if (!info->attrs[NL80211_ATTR_SSID] || 6536 !nla_len(info->attrs[NL80211_ATTR_SSID])) 6537 return -EINVAL; 6538 6539 ibss.beacon_interval = 100; 6540 6541 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { 6542 ibss.beacon_interval = 6543 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 6544 if (ibss.beacon_interval < 1 || ibss.beacon_interval > 10000) 6545 return -EINVAL; 6546 } 6547 6548 if (!rdev->ops->join_ibss) 6549 return -EOPNOTSUPP; 6550 6551 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 6552 return -EOPNOTSUPP; 6553 6554 wiphy = &rdev->wiphy; 6555 6556 if (info->attrs[NL80211_ATTR_MAC]) { 6557 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 6558 6559 if (!is_valid_ether_addr(ibss.bssid)) 6560 return -EINVAL; 6561 } 6562 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 6563 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 6564 6565 if (info->attrs[NL80211_ATTR_IE]) { 6566 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 6567 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 6568 } 6569 6570 err = nl80211_parse_chandef(rdev, info, &ibss.chandef); 6571 if (err) 6572 return err; 6573 6574 if (!cfg80211_reg_can_beacon(&rdev->wiphy, &ibss.chandef)) 6575 return -EINVAL; 6576 6577 switch (ibss.chandef.width) { 6578 case NL80211_CHAN_WIDTH_5: 6579 case NL80211_CHAN_WIDTH_10: 6580 case NL80211_CHAN_WIDTH_20_NOHT: 6581 break; 6582 case NL80211_CHAN_WIDTH_20: 6583 case NL80211_CHAN_WIDTH_40: 6584 if (rdev->wiphy.features & NL80211_FEATURE_HT_IBSS) 6585 break; 6586 default: 6587 return -EINVAL; 6588 } 6589 6590 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED]; 6591 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY]; 6592 6593 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 6594 u8 *rates = 6595 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 6596 int n_rates = 6597 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 6598 struct ieee80211_supported_band *sband = 6599 wiphy->bands[ibss.chandef.chan->band]; 6600 6601 err = ieee80211_get_ratemask(sband, rates, n_rates, 6602 &ibss.basic_rates); 6603 if (err) 6604 return err; 6605 } 6606 6607 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 6608 memcpy(&ibss.ht_capa_mask, 6609 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 6610 sizeof(ibss.ht_capa_mask)); 6611 6612 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 6613 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 6614 return -EINVAL; 6615 memcpy(&ibss.ht_capa, 6616 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 6617 sizeof(ibss.ht_capa)); 6618 } 6619 6620 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 6621 !nl80211_parse_mcast_rate(rdev, ibss.mcast_rate, 6622 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 6623 return -EINVAL; 6624 6625 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) { 6626 bool no_ht = false; 6627 6628 connkeys = nl80211_parse_connkeys(rdev, 6629 info->attrs[NL80211_ATTR_KEYS], 6630 &no_ht); 6631 if (IS_ERR(connkeys)) 6632 return PTR_ERR(connkeys); 6633 6634 if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) && 6635 no_ht) { 6636 kfree(connkeys); 6637 return -EINVAL; 6638 } 6639 } 6640 6641 ibss.control_port = 6642 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]); 6643 6644 ibss.userspace_handles_dfs = 6645 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]); 6646 6647 err = cfg80211_join_ibss(rdev, dev, &ibss, connkeys); 6648 if (err) 6649 kfree(connkeys); 6650 return err; 6651 } 6652 6653 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info) 6654 { 6655 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6656 struct net_device *dev = info->user_ptr[1]; 6657 6658 if (!rdev->ops->leave_ibss) 6659 return -EOPNOTSUPP; 6660 6661 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC) 6662 return -EOPNOTSUPP; 6663 6664 return cfg80211_leave_ibss(rdev, dev, false); 6665 } 6666 6667 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info) 6668 { 6669 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6670 struct net_device *dev = info->user_ptr[1]; 6671 int mcast_rate[IEEE80211_NUM_BANDS]; 6672 u32 nla_rate; 6673 int err; 6674 6675 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC && 6676 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) 6677 return -EOPNOTSUPP; 6678 6679 if (!rdev->ops->set_mcast_rate) 6680 return -EOPNOTSUPP; 6681 6682 memset(mcast_rate, 0, sizeof(mcast_rate)); 6683 6684 if (!info->attrs[NL80211_ATTR_MCAST_RATE]) 6685 return -EINVAL; 6686 6687 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]); 6688 if (!nl80211_parse_mcast_rate(rdev, mcast_rate, nla_rate)) 6689 return -EINVAL; 6690 6691 err = rdev->ops->set_mcast_rate(&rdev->wiphy, dev, mcast_rate); 6692 6693 return err; 6694 } 6695 6696 6697 #ifdef CONFIG_NL80211_TESTMODE 6698 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) 6699 { 6700 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6701 struct wireless_dev *wdev = 6702 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs); 6703 int err; 6704 6705 if (!rdev->ops->testmode_cmd) 6706 return -EOPNOTSUPP; 6707 6708 if (IS_ERR(wdev)) { 6709 err = PTR_ERR(wdev); 6710 if (err != -EINVAL) 6711 return err; 6712 wdev = NULL; 6713 } else if (wdev->wiphy != &rdev->wiphy) { 6714 return -EINVAL; 6715 } 6716 6717 if (!info->attrs[NL80211_ATTR_TESTDATA]) 6718 return -EINVAL; 6719 6720 rdev->testmode_info = info; 6721 err = rdev_testmode_cmd(rdev, wdev, 6722 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), 6723 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); 6724 rdev->testmode_info = NULL; 6725 6726 return err; 6727 } 6728 6729 static int nl80211_testmode_dump(struct sk_buff *skb, 6730 struct netlink_callback *cb) 6731 { 6732 struct cfg80211_registered_device *rdev; 6733 int err; 6734 long phy_idx; 6735 void *data = NULL; 6736 int data_len = 0; 6737 6738 rtnl_lock(); 6739 6740 if (cb->args[0]) { 6741 /* 6742 * 0 is a valid index, but not valid for args[0], 6743 * so we need to offset by 1. 6744 */ 6745 phy_idx = cb->args[0] - 1; 6746 } else { 6747 err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, 6748 nl80211_fam.attrbuf, nl80211_fam.maxattr, 6749 nl80211_policy); 6750 if (err) 6751 goto out_err; 6752 6753 rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), 6754 nl80211_fam.attrbuf); 6755 if (IS_ERR(rdev)) { 6756 err = PTR_ERR(rdev); 6757 goto out_err; 6758 } 6759 phy_idx = rdev->wiphy_idx; 6760 rdev = NULL; 6761 6762 if (nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA]) 6763 cb->args[1] = 6764 (long)nl80211_fam.attrbuf[NL80211_ATTR_TESTDATA]; 6765 } 6766 6767 if (cb->args[1]) { 6768 data = nla_data((void *)cb->args[1]); 6769 data_len = nla_len((void *)cb->args[1]); 6770 } 6771 6772 rdev = cfg80211_rdev_by_wiphy_idx(phy_idx); 6773 if (!rdev) { 6774 err = -ENOENT; 6775 goto out_err; 6776 } 6777 6778 if (!rdev->ops->testmode_dump) { 6779 err = -EOPNOTSUPP; 6780 goto out_err; 6781 } 6782 6783 while (1) { 6784 void *hdr = nl80211hdr_put(skb, NETLINK_CB(cb->skb).portid, 6785 cb->nlh->nlmsg_seq, NLM_F_MULTI, 6786 NL80211_CMD_TESTMODE); 6787 struct nlattr *tmdata; 6788 6789 if (!hdr) 6790 break; 6791 6792 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, phy_idx)) { 6793 genlmsg_cancel(skb, hdr); 6794 break; 6795 } 6796 6797 tmdata = nla_nest_start(skb, NL80211_ATTR_TESTDATA); 6798 if (!tmdata) { 6799 genlmsg_cancel(skb, hdr); 6800 break; 6801 } 6802 err = rdev_testmode_dump(rdev, skb, cb, data, data_len); 6803 nla_nest_end(skb, tmdata); 6804 6805 if (err == -ENOBUFS || err == -ENOENT) { 6806 genlmsg_cancel(skb, hdr); 6807 break; 6808 } else if (err) { 6809 genlmsg_cancel(skb, hdr); 6810 goto out_err; 6811 } 6812 6813 genlmsg_end(skb, hdr); 6814 } 6815 6816 err = skb->len; 6817 /* see above */ 6818 cb->args[0] = phy_idx + 1; 6819 out_err: 6820 rtnl_unlock(); 6821 return err; 6822 } 6823 6824 static struct sk_buff * 6825 __cfg80211_testmode_alloc_skb(struct cfg80211_registered_device *rdev, 6826 int approxlen, u32 portid, u32 seq, gfp_t gfp) 6827 { 6828 struct sk_buff *skb; 6829 void *hdr; 6830 struct nlattr *data; 6831 6832 skb = nlmsg_new(approxlen + 100, gfp); 6833 if (!skb) 6834 return NULL; 6835 6836 hdr = nl80211hdr_put(skb, portid, seq, 0, NL80211_CMD_TESTMODE); 6837 if (!hdr) { 6838 kfree_skb(skb); 6839 return NULL; 6840 } 6841 6842 if (nla_put_u32(skb, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 6843 goto nla_put_failure; 6844 data = nla_nest_start(skb, NL80211_ATTR_TESTDATA); 6845 6846 ((void **)skb->cb)[0] = rdev; 6847 ((void **)skb->cb)[1] = hdr; 6848 ((void **)skb->cb)[2] = data; 6849 6850 return skb; 6851 6852 nla_put_failure: 6853 kfree_skb(skb); 6854 return NULL; 6855 } 6856 6857 struct sk_buff *cfg80211_testmode_alloc_reply_skb(struct wiphy *wiphy, 6858 int approxlen) 6859 { 6860 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 6861 6862 if (WARN_ON(!rdev->testmode_info)) 6863 return NULL; 6864 6865 return __cfg80211_testmode_alloc_skb(rdev, approxlen, 6866 rdev->testmode_info->snd_portid, 6867 rdev->testmode_info->snd_seq, 6868 GFP_KERNEL); 6869 } 6870 EXPORT_SYMBOL(cfg80211_testmode_alloc_reply_skb); 6871 6872 int cfg80211_testmode_reply(struct sk_buff *skb) 6873 { 6874 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 6875 void *hdr = ((void **)skb->cb)[1]; 6876 struct nlattr *data = ((void **)skb->cb)[2]; 6877 6878 if (WARN_ON(!rdev->testmode_info)) { 6879 kfree_skb(skb); 6880 return -EINVAL; 6881 } 6882 6883 nla_nest_end(skb, data); 6884 genlmsg_end(skb, hdr); 6885 return genlmsg_reply(skb, rdev->testmode_info); 6886 } 6887 EXPORT_SYMBOL(cfg80211_testmode_reply); 6888 6889 struct sk_buff *cfg80211_testmode_alloc_event_skb(struct wiphy *wiphy, 6890 int approxlen, gfp_t gfp) 6891 { 6892 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 6893 6894 return __cfg80211_testmode_alloc_skb(rdev, approxlen, 0, 0, gfp); 6895 } 6896 EXPORT_SYMBOL(cfg80211_testmode_alloc_event_skb); 6897 6898 void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp) 6899 { 6900 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; 6901 void *hdr = ((void **)skb->cb)[1]; 6902 struct nlattr *data = ((void **)skb->cb)[2]; 6903 6904 nla_nest_end(skb, data); 6905 genlmsg_end(skb, hdr); 6906 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), skb, 0, 6907 NL80211_MCGRP_TESTMODE, gfp); 6908 } 6909 EXPORT_SYMBOL(cfg80211_testmode_event); 6910 #endif 6911 6912 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info) 6913 { 6914 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6915 struct net_device *dev = info->user_ptr[1]; 6916 struct cfg80211_connect_params connect; 6917 struct wiphy *wiphy; 6918 struct cfg80211_cached_keys *connkeys = NULL; 6919 int err; 6920 6921 memset(&connect, 0, sizeof(connect)); 6922 6923 if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) 6924 return -EINVAL; 6925 6926 if (!info->attrs[NL80211_ATTR_SSID] || 6927 !nla_len(info->attrs[NL80211_ATTR_SSID])) 6928 return -EINVAL; 6929 6930 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) { 6931 connect.auth_type = 6932 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]); 6933 if (!nl80211_valid_auth_type(rdev, connect.auth_type, 6934 NL80211_CMD_CONNECT)) 6935 return -EINVAL; 6936 } else 6937 connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC; 6938 6939 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY]; 6940 6941 err = nl80211_crypto_settings(rdev, info, &connect.crypto, 6942 NL80211_MAX_NR_CIPHER_SUITES); 6943 if (err) 6944 return err; 6945 6946 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 6947 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 6948 return -EOPNOTSUPP; 6949 6950 wiphy = &rdev->wiphy; 6951 6952 connect.bg_scan_period = -1; 6953 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] && 6954 (wiphy->flags & WIPHY_FLAG_SUPPORTS_FW_ROAM)) { 6955 connect.bg_scan_period = 6956 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]); 6957 } 6958 6959 if (info->attrs[NL80211_ATTR_MAC]) 6960 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 6961 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]); 6962 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]); 6963 6964 if (info->attrs[NL80211_ATTR_IE]) { 6965 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 6966 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 6967 } 6968 6969 if (info->attrs[NL80211_ATTR_USE_MFP]) { 6970 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); 6971 if (connect.mfp != NL80211_MFP_REQUIRED && 6972 connect.mfp != NL80211_MFP_NO) 6973 return -EINVAL; 6974 } else { 6975 connect.mfp = NL80211_MFP_NO; 6976 } 6977 6978 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 6979 connect.channel = 6980 ieee80211_get_channel(wiphy, 6981 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ])); 6982 if (!connect.channel || 6983 connect.channel->flags & IEEE80211_CHAN_DISABLED) 6984 return -EINVAL; 6985 } 6986 6987 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) { 6988 connkeys = nl80211_parse_connkeys(rdev, 6989 info->attrs[NL80211_ATTR_KEYS], NULL); 6990 if (IS_ERR(connkeys)) 6991 return PTR_ERR(connkeys); 6992 } 6993 6994 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT])) 6995 connect.flags |= ASSOC_REQ_DISABLE_HT; 6996 6997 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) 6998 memcpy(&connect.ht_capa_mask, 6999 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]), 7000 sizeof(connect.ht_capa_mask)); 7001 7002 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { 7003 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { 7004 kfree(connkeys); 7005 return -EINVAL; 7006 } 7007 memcpy(&connect.ht_capa, 7008 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), 7009 sizeof(connect.ht_capa)); 7010 } 7011 7012 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT])) 7013 connect.flags |= ASSOC_REQ_DISABLE_VHT; 7014 7015 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) 7016 memcpy(&connect.vht_capa_mask, 7017 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]), 7018 sizeof(connect.vht_capa_mask)); 7019 7020 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) { 7021 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) { 7022 kfree(connkeys); 7023 return -EINVAL; 7024 } 7025 memcpy(&connect.vht_capa, 7026 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]), 7027 sizeof(connect.vht_capa)); 7028 } 7029 7030 wdev_lock(dev->ieee80211_ptr); 7031 err = cfg80211_connect(rdev, dev, &connect, connkeys, NULL); 7032 wdev_unlock(dev->ieee80211_ptr); 7033 if (err) 7034 kfree(connkeys); 7035 return err; 7036 } 7037 7038 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info) 7039 { 7040 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7041 struct net_device *dev = info->user_ptr[1]; 7042 u16 reason; 7043 int ret; 7044 7045 if (!info->attrs[NL80211_ATTR_REASON_CODE]) 7046 reason = WLAN_REASON_DEAUTH_LEAVING; 7047 else 7048 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]); 7049 7050 if (reason == 0) 7051 return -EINVAL; 7052 7053 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 7054 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 7055 return -EOPNOTSUPP; 7056 7057 wdev_lock(dev->ieee80211_ptr); 7058 ret = cfg80211_disconnect(rdev, dev, reason, true); 7059 wdev_unlock(dev->ieee80211_ptr); 7060 return ret; 7061 } 7062 7063 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info) 7064 { 7065 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7066 struct net *net; 7067 int err; 7068 u32 pid; 7069 7070 if (!info->attrs[NL80211_ATTR_PID]) 7071 return -EINVAL; 7072 7073 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]); 7074 7075 net = get_net_ns_by_pid(pid); 7076 if (IS_ERR(net)) 7077 return PTR_ERR(net); 7078 7079 err = 0; 7080 7081 /* check if anything to do */ 7082 if (!net_eq(wiphy_net(&rdev->wiphy), net)) 7083 err = cfg80211_switch_netns(rdev, net); 7084 7085 put_net(net); 7086 return err; 7087 } 7088 7089 static int nl80211_setdel_pmksa(struct sk_buff *skb, struct genl_info *info) 7090 { 7091 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7092 int (*rdev_ops)(struct wiphy *wiphy, struct net_device *dev, 7093 struct cfg80211_pmksa *pmksa) = NULL; 7094 struct net_device *dev = info->user_ptr[1]; 7095 struct cfg80211_pmksa pmksa; 7096 7097 memset(&pmksa, 0, sizeof(struct cfg80211_pmksa)); 7098 7099 if (!info->attrs[NL80211_ATTR_MAC]) 7100 return -EINVAL; 7101 7102 if (!info->attrs[NL80211_ATTR_PMKID]) 7103 return -EINVAL; 7104 7105 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]); 7106 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]); 7107 7108 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 7109 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 7110 return -EOPNOTSUPP; 7111 7112 switch (info->genlhdr->cmd) { 7113 case NL80211_CMD_SET_PMKSA: 7114 rdev_ops = rdev->ops->set_pmksa; 7115 break; 7116 case NL80211_CMD_DEL_PMKSA: 7117 rdev_ops = rdev->ops->del_pmksa; 7118 break; 7119 default: 7120 WARN_ON(1); 7121 break; 7122 } 7123 7124 if (!rdev_ops) 7125 return -EOPNOTSUPP; 7126 7127 return rdev_ops(&rdev->wiphy, dev, &pmksa); 7128 } 7129 7130 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info) 7131 { 7132 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7133 struct net_device *dev = info->user_ptr[1]; 7134 7135 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION && 7136 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_CLIENT) 7137 return -EOPNOTSUPP; 7138 7139 if (!rdev->ops->flush_pmksa) 7140 return -EOPNOTSUPP; 7141 7142 return rdev_flush_pmksa(rdev, dev); 7143 } 7144 7145 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info) 7146 { 7147 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7148 struct net_device *dev = info->user_ptr[1]; 7149 u8 action_code, dialog_token; 7150 u16 status_code; 7151 u8 *peer; 7152 7153 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 7154 !rdev->ops->tdls_mgmt) 7155 return -EOPNOTSUPP; 7156 7157 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] || 7158 !info->attrs[NL80211_ATTR_STATUS_CODE] || 7159 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] || 7160 !info->attrs[NL80211_ATTR_IE] || 7161 !info->attrs[NL80211_ATTR_MAC]) 7162 return -EINVAL; 7163 7164 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 7165 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]); 7166 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]); 7167 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]); 7168 7169 return rdev_tdls_mgmt(rdev, dev, peer, action_code, 7170 dialog_token, status_code, 7171 nla_data(info->attrs[NL80211_ATTR_IE]), 7172 nla_len(info->attrs[NL80211_ATTR_IE])); 7173 } 7174 7175 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info) 7176 { 7177 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7178 struct net_device *dev = info->user_ptr[1]; 7179 enum nl80211_tdls_operation operation; 7180 u8 *peer; 7181 7182 if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) || 7183 !rdev->ops->tdls_oper) 7184 return -EOPNOTSUPP; 7185 7186 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] || 7187 !info->attrs[NL80211_ATTR_MAC]) 7188 return -EINVAL; 7189 7190 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]); 7191 peer = nla_data(info->attrs[NL80211_ATTR_MAC]); 7192 7193 return rdev_tdls_oper(rdev, dev, peer, operation); 7194 } 7195 7196 static int nl80211_remain_on_channel(struct sk_buff *skb, 7197 struct genl_info *info) 7198 { 7199 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7200 struct wireless_dev *wdev = info->user_ptr[1]; 7201 struct cfg80211_chan_def chandef; 7202 struct sk_buff *msg; 7203 void *hdr; 7204 u64 cookie; 7205 u32 duration; 7206 int err; 7207 7208 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] || 7209 !info->attrs[NL80211_ATTR_DURATION]) 7210 return -EINVAL; 7211 7212 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 7213 7214 if (!rdev->ops->remain_on_channel || 7215 !(rdev->wiphy.flags & WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL)) 7216 return -EOPNOTSUPP; 7217 7218 /* 7219 * We should be on that channel for at least a minimum amount of 7220 * time (10ms) but no longer than the driver supports. 7221 */ 7222 if (duration < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 7223 duration > rdev->wiphy.max_remain_on_channel_duration) 7224 return -EINVAL; 7225 7226 err = nl80211_parse_chandef(rdev, info, &chandef); 7227 if (err) 7228 return err; 7229 7230 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 7231 if (!msg) 7232 return -ENOMEM; 7233 7234 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 7235 NL80211_CMD_REMAIN_ON_CHANNEL); 7236 if (!hdr) { 7237 err = -ENOBUFS; 7238 goto free_msg; 7239 } 7240 7241 err = rdev_remain_on_channel(rdev, wdev, chandef.chan, 7242 duration, &cookie); 7243 7244 if (err) 7245 goto free_msg; 7246 7247 if (nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie)) 7248 goto nla_put_failure; 7249 7250 genlmsg_end(msg, hdr); 7251 7252 return genlmsg_reply(msg, info); 7253 7254 nla_put_failure: 7255 err = -ENOBUFS; 7256 free_msg: 7257 nlmsg_free(msg); 7258 return err; 7259 } 7260 7261 static int nl80211_cancel_remain_on_channel(struct sk_buff *skb, 7262 struct genl_info *info) 7263 { 7264 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7265 struct wireless_dev *wdev = info->user_ptr[1]; 7266 u64 cookie; 7267 7268 if (!info->attrs[NL80211_ATTR_COOKIE]) 7269 return -EINVAL; 7270 7271 if (!rdev->ops->cancel_remain_on_channel) 7272 return -EOPNOTSUPP; 7273 7274 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 7275 7276 return rdev_cancel_remain_on_channel(rdev, wdev, cookie); 7277 } 7278 7279 static u32 rateset_to_mask(struct ieee80211_supported_band *sband, 7280 u8 *rates, u8 rates_len) 7281 { 7282 u8 i; 7283 u32 mask = 0; 7284 7285 for (i = 0; i < rates_len; i++) { 7286 int rate = (rates[i] & 0x7f) * 5; 7287 int ridx; 7288 for (ridx = 0; ridx < sband->n_bitrates; ridx++) { 7289 struct ieee80211_rate *srate = 7290 &sband->bitrates[ridx]; 7291 if (rate == srate->bitrate) { 7292 mask |= 1 << ridx; 7293 break; 7294 } 7295 } 7296 if (ridx == sband->n_bitrates) 7297 return 0; /* rate not found */ 7298 } 7299 7300 return mask; 7301 } 7302 7303 static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband, 7304 u8 *rates, u8 rates_len, 7305 u8 mcs[IEEE80211_HT_MCS_MASK_LEN]) 7306 { 7307 u8 i; 7308 7309 memset(mcs, 0, IEEE80211_HT_MCS_MASK_LEN); 7310 7311 for (i = 0; i < rates_len; i++) { 7312 int ridx, rbit; 7313 7314 ridx = rates[i] / 8; 7315 rbit = BIT(rates[i] % 8); 7316 7317 /* check validity */ 7318 if ((ridx < 0) || (ridx >= IEEE80211_HT_MCS_MASK_LEN)) 7319 return false; 7320 7321 /* check availability */ 7322 if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) 7323 mcs[ridx] |= rbit; 7324 else 7325 return false; 7326 } 7327 7328 return true; 7329 } 7330 7331 static const struct nla_policy nl80211_txattr_policy[NL80211_TXRATE_MAX + 1] = { 7332 [NL80211_TXRATE_LEGACY] = { .type = NLA_BINARY, 7333 .len = NL80211_MAX_SUPP_RATES }, 7334 [NL80211_TXRATE_MCS] = { .type = NLA_BINARY, 7335 .len = NL80211_MAX_SUPP_HT_RATES }, 7336 }; 7337 7338 static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb, 7339 struct genl_info *info) 7340 { 7341 struct nlattr *tb[NL80211_TXRATE_MAX + 1]; 7342 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7343 struct cfg80211_bitrate_mask mask; 7344 int rem, i; 7345 struct net_device *dev = info->user_ptr[1]; 7346 struct nlattr *tx_rates; 7347 struct ieee80211_supported_band *sband; 7348 7349 if (info->attrs[NL80211_ATTR_TX_RATES] == NULL) 7350 return -EINVAL; 7351 7352 if (!rdev->ops->set_bitrate_mask) 7353 return -EOPNOTSUPP; 7354 7355 memset(&mask, 0, sizeof(mask)); 7356 /* Default to all rates enabled */ 7357 for (i = 0; i < IEEE80211_NUM_BANDS; i++) { 7358 sband = rdev->wiphy.bands[i]; 7359 mask.control[i].legacy = 7360 sband ? (1 << sband->n_bitrates) - 1 : 0; 7361 if (sband) 7362 memcpy(mask.control[i].mcs, 7363 sband->ht_cap.mcs.rx_mask, 7364 sizeof(mask.control[i].mcs)); 7365 else 7366 memset(mask.control[i].mcs, 0, 7367 sizeof(mask.control[i].mcs)); 7368 } 7369 7370 /* 7371 * The nested attribute uses enum nl80211_band as the index. This maps 7372 * directly to the enum ieee80211_band values used in cfg80211. 7373 */ 7374 BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8); 7375 nla_for_each_nested(tx_rates, info->attrs[NL80211_ATTR_TX_RATES], rem) 7376 { 7377 enum ieee80211_band band = nla_type(tx_rates); 7378 if (band < 0 || band >= IEEE80211_NUM_BANDS) 7379 return -EINVAL; 7380 sband = rdev->wiphy.bands[band]; 7381 if (sband == NULL) 7382 return -EINVAL; 7383 nla_parse(tb, NL80211_TXRATE_MAX, nla_data(tx_rates), 7384 nla_len(tx_rates), nl80211_txattr_policy); 7385 if (tb[NL80211_TXRATE_LEGACY]) { 7386 mask.control[band].legacy = rateset_to_mask( 7387 sband, 7388 nla_data(tb[NL80211_TXRATE_LEGACY]), 7389 nla_len(tb[NL80211_TXRATE_LEGACY])); 7390 if ((mask.control[band].legacy == 0) && 7391 nla_len(tb[NL80211_TXRATE_LEGACY])) 7392 return -EINVAL; 7393 } 7394 if (tb[NL80211_TXRATE_MCS]) { 7395 if (!ht_rateset_to_mask( 7396 sband, 7397 nla_data(tb[NL80211_TXRATE_MCS]), 7398 nla_len(tb[NL80211_TXRATE_MCS]), 7399 mask.control[band].mcs)) 7400 return -EINVAL; 7401 } 7402 7403 if (mask.control[band].legacy == 0) { 7404 /* don't allow empty legacy rates if HT 7405 * is not even supported. */ 7406 if (!rdev->wiphy.bands[band]->ht_cap.ht_supported) 7407 return -EINVAL; 7408 7409 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) 7410 if (mask.control[band].mcs[i]) 7411 break; 7412 7413 /* legacy and mcs rates may not be both empty */ 7414 if (i == IEEE80211_HT_MCS_MASK_LEN) 7415 return -EINVAL; 7416 } 7417 } 7418 7419 return rdev_set_bitrate_mask(rdev, dev, NULL, &mask); 7420 } 7421 7422 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info) 7423 { 7424 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7425 struct wireless_dev *wdev = info->user_ptr[1]; 7426 u16 frame_type = IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION; 7427 7428 if (!info->attrs[NL80211_ATTR_FRAME_MATCH]) 7429 return -EINVAL; 7430 7431 if (info->attrs[NL80211_ATTR_FRAME_TYPE]) 7432 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]); 7433 7434 switch (wdev->iftype) { 7435 case NL80211_IFTYPE_STATION: 7436 case NL80211_IFTYPE_ADHOC: 7437 case NL80211_IFTYPE_P2P_CLIENT: 7438 case NL80211_IFTYPE_AP: 7439 case NL80211_IFTYPE_AP_VLAN: 7440 case NL80211_IFTYPE_MESH_POINT: 7441 case NL80211_IFTYPE_P2P_GO: 7442 case NL80211_IFTYPE_P2P_DEVICE: 7443 break; 7444 default: 7445 return -EOPNOTSUPP; 7446 } 7447 7448 /* not much point in registering if we can't reply */ 7449 if (!rdev->ops->mgmt_tx) 7450 return -EOPNOTSUPP; 7451 7452 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type, 7453 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]), 7454 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH])); 7455 } 7456 7457 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info) 7458 { 7459 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7460 struct wireless_dev *wdev = info->user_ptr[1]; 7461 struct cfg80211_chan_def chandef; 7462 int err; 7463 void *hdr = NULL; 7464 u64 cookie; 7465 struct sk_buff *msg = NULL; 7466 struct cfg80211_mgmt_tx_params params = { 7467 .dont_wait_for_ack = 7468 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK], 7469 }; 7470 7471 if (!info->attrs[NL80211_ATTR_FRAME]) 7472 return -EINVAL; 7473 7474 if (!rdev->ops->mgmt_tx) 7475 return -EOPNOTSUPP; 7476 7477 switch (wdev->iftype) { 7478 case NL80211_IFTYPE_P2P_DEVICE: 7479 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ]) 7480 return -EINVAL; 7481 case NL80211_IFTYPE_STATION: 7482 case NL80211_IFTYPE_ADHOC: 7483 case NL80211_IFTYPE_P2P_CLIENT: 7484 case NL80211_IFTYPE_AP: 7485 case NL80211_IFTYPE_AP_VLAN: 7486 case NL80211_IFTYPE_MESH_POINT: 7487 case NL80211_IFTYPE_P2P_GO: 7488 break; 7489 default: 7490 return -EOPNOTSUPP; 7491 } 7492 7493 if (info->attrs[NL80211_ATTR_DURATION]) { 7494 if (!(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 7495 return -EINVAL; 7496 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]); 7497 7498 /* 7499 * We should wait on the channel for at least a minimum amount 7500 * of time (10ms) but no longer than the driver supports. 7501 */ 7502 if (params.wait < NL80211_MIN_REMAIN_ON_CHANNEL_TIME || 7503 params.wait > rdev->wiphy.max_remain_on_channel_duration) 7504 return -EINVAL; 7505 7506 } 7507 7508 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK]; 7509 7510 if (params.offchan && !(rdev->wiphy.flags & WIPHY_FLAG_OFFCHAN_TX)) 7511 return -EINVAL; 7512 7513 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 7514 7515 /* get the channel if any has been specified, otherwise pass NULL to 7516 * the driver. The latter will use the current one 7517 */ 7518 chandef.chan = NULL; 7519 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 7520 err = nl80211_parse_chandef(rdev, info, &chandef); 7521 if (err) 7522 return err; 7523 } 7524 7525 if (!chandef.chan && params.offchan) 7526 return -EINVAL; 7527 7528 if (!params.dont_wait_for_ack) { 7529 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 7530 if (!msg) 7531 return -ENOMEM; 7532 7533 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 7534 NL80211_CMD_FRAME); 7535 if (!hdr) { 7536 err = -ENOBUFS; 7537 goto free_msg; 7538 } 7539 } 7540 7541 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]); 7542 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]); 7543 params.chan = chandef.chan; 7544 err = cfg80211_mlme_mgmt_tx(rdev, wdev, ¶ms, &cookie); 7545 if (err) 7546 goto free_msg; 7547 7548 if (msg) { 7549 if (nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie)) 7550 goto nla_put_failure; 7551 7552 genlmsg_end(msg, hdr); 7553 return genlmsg_reply(msg, info); 7554 } 7555 7556 return 0; 7557 7558 nla_put_failure: 7559 err = -ENOBUFS; 7560 free_msg: 7561 nlmsg_free(msg); 7562 return err; 7563 } 7564 7565 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info) 7566 { 7567 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7568 struct wireless_dev *wdev = info->user_ptr[1]; 7569 u64 cookie; 7570 7571 if (!info->attrs[NL80211_ATTR_COOKIE]) 7572 return -EINVAL; 7573 7574 if (!rdev->ops->mgmt_tx_cancel_wait) 7575 return -EOPNOTSUPP; 7576 7577 switch (wdev->iftype) { 7578 case NL80211_IFTYPE_STATION: 7579 case NL80211_IFTYPE_ADHOC: 7580 case NL80211_IFTYPE_P2P_CLIENT: 7581 case NL80211_IFTYPE_AP: 7582 case NL80211_IFTYPE_AP_VLAN: 7583 case NL80211_IFTYPE_P2P_GO: 7584 case NL80211_IFTYPE_P2P_DEVICE: 7585 break; 7586 default: 7587 return -EOPNOTSUPP; 7588 } 7589 7590 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]); 7591 7592 return rdev_mgmt_tx_cancel_wait(rdev, wdev, cookie); 7593 } 7594 7595 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info) 7596 { 7597 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7598 struct wireless_dev *wdev; 7599 struct net_device *dev = info->user_ptr[1]; 7600 u8 ps_state; 7601 bool state; 7602 int err; 7603 7604 if (!info->attrs[NL80211_ATTR_PS_STATE]) 7605 return -EINVAL; 7606 7607 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]); 7608 7609 if (ps_state != NL80211_PS_DISABLED && ps_state != NL80211_PS_ENABLED) 7610 return -EINVAL; 7611 7612 wdev = dev->ieee80211_ptr; 7613 7614 if (!rdev->ops->set_power_mgmt) 7615 return -EOPNOTSUPP; 7616 7617 state = (ps_state == NL80211_PS_ENABLED) ? true : false; 7618 7619 if (state == wdev->ps) 7620 return 0; 7621 7622 err = rdev_set_power_mgmt(rdev, dev, state, wdev->ps_timeout); 7623 if (!err) 7624 wdev->ps = state; 7625 return err; 7626 } 7627 7628 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info) 7629 { 7630 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7631 enum nl80211_ps_state ps_state; 7632 struct wireless_dev *wdev; 7633 struct net_device *dev = info->user_ptr[1]; 7634 struct sk_buff *msg; 7635 void *hdr; 7636 int err; 7637 7638 wdev = dev->ieee80211_ptr; 7639 7640 if (!rdev->ops->set_power_mgmt) 7641 return -EOPNOTSUPP; 7642 7643 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 7644 if (!msg) 7645 return -ENOMEM; 7646 7647 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 7648 NL80211_CMD_GET_POWER_SAVE); 7649 if (!hdr) { 7650 err = -ENOBUFS; 7651 goto free_msg; 7652 } 7653 7654 if (wdev->ps) 7655 ps_state = NL80211_PS_ENABLED; 7656 else 7657 ps_state = NL80211_PS_DISABLED; 7658 7659 if (nla_put_u32(msg, NL80211_ATTR_PS_STATE, ps_state)) 7660 goto nla_put_failure; 7661 7662 genlmsg_end(msg, hdr); 7663 return genlmsg_reply(msg, info); 7664 7665 nla_put_failure: 7666 err = -ENOBUFS; 7667 free_msg: 7668 nlmsg_free(msg); 7669 return err; 7670 } 7671 7672 static struct nla_policy 7673 nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] __read_mostly = { 7674 [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_U32 }, 7675 [NL80211_ATTR_CQM_RSSI_HYST] = { .type = NLA_U32 }, 7676 [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 }, 7677 [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 }, 7678 [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 }, 7679 [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 }, 7680 }; 7681 7682 static int nl80211_set_cqm_txe(struct genl_info *info, 7683 u32 rate, u32 pkts, u32 intvl) 7684 { 7685 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7686 struct net_device *dev = info->user_ptr[1]; 7687 struct wireless_dev *wdev = dev->ieee80211_ptr; 7688 7689 if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL) 7690 return -EINVAL; 7691 7692 if (!rdev->ops->set_cqm_txe_config) 7693 return -EOPNOTSUPP; 7694 7695 if (wdev->iftype != NL80211_IFTYPE_STATION && 7696 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 7697 return -EOPNOTSUPP; 7698 7699 return rdev_set_cqm_txe_config(rdev, dev, rate, pkts, intvl); 7700 } 7701 7702 static int nl80211_set_cqm_rssi(struct genl_info *info, 7703 s32 threshold, u32 hysteresis) 7704 { 7705 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7706 struct net_device *dev = info->user_ptr[1]; 7707 struct wireless_dev *wdev = dev->ieee80211_ptr; 7708 7709 if (threshold > 0) 7710 return -EINVAL; 7711 7712 /* disabling - hysteresis should also be zero then */ 7713 if (threshold == 0) 7714 hysteresis = 0; 7715 7716 if (!rdev->ops->set_cqm_rssi_config) 7717 return -EOPNOTSUPP; 7718 7719 if (wdev->iftype != NL80211_IFTYPE_STATION && 7720 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) 7721 return -EOPNOTSUPP; 7722 7723 return rdev_set_cqm_rssi_config(rdev, dev, threshold, hysteresis); 7724 } 7725 7726 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info) 7727 { 7728 struct nlattr *attrs[NL80211_ATTR_CQM_MAX + 1]; 7729 struct nlattr *cqm; 7730 int err; 7731 7732 cqm = info->attrs[NL80211_ATTR_CQM]; 7733 if (!cqm) 7734 return -EINVAL; 7735 7736 err = nla_parse_nested(attrs, NL80211_ATTR_CQM_MAX, cqm, 7737 nl80211_attr_cqm_policy); 7738 if (err) 7739 return err; 7740 7741 if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] && 7742 attrs[NL80211_ATTR_CQM_RSSI_HYST]) { 7743 s32 threshold = nla_get_s32(attrs[NL80211_ATTR_CQM_RSSI_THOLD]); 7744 u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]); 7745 7746 return nl80211_set_cqm_rssi(info, threshold, hysteresis); 7747 } 7748 7749 if (attrs[NL80211_ATTR_CQM_TXE_RATE] && 7750 attrs[NL80211_ATTR_CQM_TXE_PKTS] && 7751 attrs[NL80211_ATTR_CQM_TXE_INTVL]) { 7752 u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]); 7753 u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]); 7754 u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]); 7755 7756 return nl80211_set_cqm_txe(info, rate, pkts, intvl); 7757 } 7758 7759 return -EINVAL; 7760 } 7761 7762 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info) 7763 { 7764 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7765 struct net_device *dev = info->user_ptr[1]; 7766 struct mesh_config cfg; 7767 struct mesh_setup setup; 7768 int err; 7769 7770 /* start with default */ 7771 memcpy(&cfg, &default_mesh_config, sizeof(cfg)); 7772 memcpy(&setup, &default_mesh_setup, sizeof(setup)); 7773 7774 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) { 7775 /* and parse parameters if given */ 7776 err = nl80211_parse_mesh_config(info, &cfg, NULL); 7777 if (err) 7778 return err; 7779 } 7780 7781 if (!info->attrs[NL80211_ATTR_MESH_ID] || 7782 !nla_len(info->attrs[NL80211_ATTR_MESH_ID])) 7783 return -EINVAL; 7784 7785 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); 7786 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); 7787 7788 if (info->attrs[NL80211_ATTR_MCAST_RATE] && 7789 !nl80211_parse_mcast_rate(rdev, setup.mcast_rate, 7790 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 7791 return -EINVAL; 7792 7793 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) { 7794 setup.beacon_interval = 7795 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]); 7796 if (setup.beacon_interval < 10 || 7797 setup.beacon_interval > 10000) 7798 return -EINVAL; 7799 } 7800 7801 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) { 7802 setup.dtim_period = 7803 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]); 7804 if (setup.dtim_period < 1 || setup.dtim_period > 100) 7805 return -EINVAL; 7806 } 7807 7808 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { 7809 /* parse additional setup parameters if given */ 7810 err = nl80211_parse_mesh_setup(info, &setup); 7811 if (err) 7812 return err; 7813 } 7814 7815 if (setup.user_mpm) 7816 cfg.auto_open_plinks = false; 7817 7818 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) { 7819 err = nl80211_parse_chandef(rdev, info, &setup.chandef); 7820 if (err) 7821 return err; 7822 } else { 7823 /* cfg80211_join_mesh() will sort it out */ 7824 setup.chandef.chan = NULL; 7825 } 7826 7827 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) { 7828 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 7829 int n_rates = 7830 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]); 7831 struct ieee80211_supported_band *sband; 7832 7833 if (!setup.chandef.chan) 7834 return -EINVAL; 7835 7836 sband = rdev->wiphy.bands[setup.chandef.chan->band]; 7837 7838 err = ieee80211_get_ratemask(sband, rates, n_rates, 7839 &setup.basic_rates); 7840 if (err) 7841 return err; 7842 } 7843 7844 return cfg80211_join_mesh(rdev, dev, &setup, &cfg); 7845 } 7846 7847 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info) 7848 { 7849 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7850 struct net_device *dev = info->user_ptr[1]; 7851 7852 return cfg80211_leave_mesh(rdev, dev); 7853 } 7854 7855 #ifdef CONFIG_PM 7856 static int nl80211_send_wowlan_patterns(struct sk_buff *msg, 7857 struct cfg80211_registered_device *rdev) 7858 { 7859 struct cfg80211_wowlan *wowlan = rdev->wiphy.wowlan_config; 7860 struct nlattr *nl_pats, *nl_pat; 7861 int i, pat_len; 7862 7863 if (!wowlan->n_patterns) 7864 return 0; 7865 7866 nl_pats = nla_nest_start(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN); 7867 if (!nl_pats) 7868 return -ENOBUFS; 7869 7870 for (i = 0; i < wowlan->n_patterns; i++) { 7871 nl_pat = nla_nest_start(msg, i + 1); 7872 if (!nl_pat) 7873 return -ENOBUFS; 7874 pat_len = wowlan->patterns[i].pattern_len; 7875 if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8), 7876 wowlan->patterns[i].mask) || 7877 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 7878 wowlan->patterns[i].pattern) || 7879 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 7880 wowlan->patterns[i].pkt_offset)) 7881 return -ENOBUFS; 7882 nla_nest_end(msg, nl_pat); 7883 } 7884 nla_nest_end(msg, nl_pats); 7885 7886 return 0; 7887 } 7888 7889 static int nl80211_send_wowlan_tcp(struct sk_buff *msg, 7890 struct cfg80211_wowlan_tcp *tcp) 7891 { 7892 struct nlattr *nl_tcp; 7893 7894 if (!tcp) 7895 return 0; 7896 7897 nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION); 7898 if (!nl_tcp) 7899 return -ENOBUFS; 7900 7901 if (nla_put_be32(msg, NL80211_WOWLAN_TCP_SRC_IPV4, tcp->src) || 7902 nla_put_be32(msg, NL80211_WOWLAN_TCP_DST_IPV4, tcp->dst) || 7903 nla_put(msg, NL80211_WOWLAN_TCP_DST_MAC, ETH_ALEN, tcp->dst_mac) || 7904 nla_put_u16(msg, NL80211_WOWLAN_TCP_SRC_PORT, tcp->src_port) || 7905 nla_put_u16(msg, NL80211_WOWLAN_TCP_DST_PORT, tcp->dst_port) || 7906 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD, 7907 tcp->payload_len, tcp->payload) || 7908 nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL, 7909 tcp->data_interval) || 7910 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD, 7911 tcp->wake_len, tcp->wake_data) || 7912 nla_put(msg, NL80211_WOWLAN_TCP_WAKE_MASK, 7913 DIV_ROUND_UP(tcp->wake_len, 8), tcp->wake_mask)) 7914 return -ENOBUFS; 7915 7916 if (tcp->payload_seq.len && 7917 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ, 7918 sizeof(tcp->payload_seq), &tcp->payload_seq)) 7919 return -ENOBUFS; 7920 7921 if (tcp->payload_tok.len && 7922 nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN, 7923 sizeof(tcp->payload_tok) + tcp->tokens_size, 7924 &tcp->payload_tok)) 7925 return -ENOBUFS; 7926 7927 nla_nest_end(msg, nl_tcp); 7928 7929 return 0; 7930 } 7931 7932 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info) 7933 { 7934 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7935 struct sk_buff *msg; 7936 void *hdr; 7937 u32 size = NLMSG_DEFAULT_SIZE; 7938 7939 if (!rdev->wiphy.wowlan) 7940 return -EOPNOTSUPP; 7941 7942 if (rdev->wiphy.wowlan_config && rdev->wiphy.wowlan_config->tcp) { 7943 /* adjust size to have room for all the data */ 7944 size += rdev->wiphy.wowlan_config->tcp->tokens_size + 7945 rdev->wiphy.wowlan_config->tcp->payload_len + 7946 rdev->wiphy.wowlan_config->tcp->wake_len + 7947 rdev->wiphy.wowlan_config->tcp->wake_len / 8; 7948 } 7949 7950 msg = nlmsg_new(size, GFP_KERNEL); 7951 if (!msg) 7952 return -ENOMEM; 7953 7954 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 7955 NL80211_CMD_GET_WOWLAN); 7956 if (!hdr) 7957 goto nla_put_failure; 7958 7959 if (rdev->wiphy.wowlan_config) { 7960 struct nlattr *nl_wowlan; 7961 7962 nl_wowlan = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS); 7963 if (!nl_wowlan) 7964 goto nla_put_failure; 7965 7966 if ((rdev->wiphy.wowlan_config->any && 7967 nla_put_flag(msg, NL80211_WOWLAN_TRIG_ANY)) || 7968 (rdev->wiphy.wowlan_config->disconnect && 7969 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) || 7970 (rdev->wiphy.wowlan_config->magic_pkt && 7971 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) || 7972 (rdev->wiphy.wowlan_config->gtk_rekey_failure && 7973 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) || 7974 (rdev->wiphy.wowlan_config->eap_identity_req && 7975 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) || 7976 (rdev->wiphy.wowlan_config->four_way_handshake && 7977 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) || 7978 (rdev->wiphy.wowlan_config->rfkill_release && 7979 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE))) 7980 goto nla_put_failure; 7981 7982 if (nl80211_send_wowlan_patterns(msg, rdev)) 7983 goto nla_put_failure; 7984 7985 if (nl80211_send_wowlan_tcp(msg, 7986 rdev->wiphy.wowlan_config->tcp)) 7987 goto nla_put_failure; 7988 7989 nla_nest_end(msg, nl_wowlan); 7990 } 7991 7992 genlmsg_end(msg, hdr); 7993 return genlmsg_reply(msg, info); 7994 7995 nla_put_failure: 7996 nlmsg_free(msg); 7997 return -ENOBUFS; 7998 } 7999 8000 static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev, 8001 struct nlattr *attr, 8002 struct cfg80211_wowlan *trig) 8003 { 8004 struct nlattr *tb[NUM_NL80211_WOWLAN_TCP]; 8005 struct cfg80211_wowlan_tcp *cfg; 8006 struct nl80211_wowlan_tcp_data_token *tok = NULL; 8007 struct nl80211_wowlan_tcp_data_seq *seq = NULL; 8008 u32 size; 8009 u32 data_size, wake_size, tokens_size = 0, wake_mask_size; 8010 int err, port; 8011 8012 if (!rdev->wiphy.wowlan->tcp) 8013 return -EINVAL; 8014 8015 err = nla_parse(tb, MAX_NL80211_WOWLAN_TCP, 8016 nla_data(attr), nla_len(attr), 8017 nl80211_wowlan_tcp_policy); 8018 if (err) 8019 return err; 8020 8021 if (!tb[NL80211_WOWLAN_TCP_SRC_IPV4] || 8022 !tb[NL80211_WOWLAN_TCP_DST_IPV4] || 8023 !tb[NL80211_WOWLAN_TCP_DST_MAC] || 8024 !tb[NL80211_WOWLAN_TCP_DST_PORT] || 8025 !tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD] || 8026 !tb[NL80211_WOWLAN_TCP_DATA_INTERVAL] || 8027 !tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD] || 8028 !tb[NL80211_WOWLAN_TCP_WAKE_MASK]) 8029 return -EINVAL; 8030 8031 data_size = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]); 8032 if (data_size > rdev->wiphy.wowlan->tcp->data_payload_max) 8033 return -EINVAL; 8034 8035 if (nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) > 8036 rdev->wiphy.wowlan->tcp->data_interval_max || 8037 nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]) == 0) 8038 return -EINVAL; 8039 8040 wake_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]); 8041 if (wake_size > rdev->wiphy.wowlan->tcp->wake_payload_max) 8042 return -EINVAL; 8043 8044 wake_mask_size = nla_len(tb[NL80211_WOWLAN_TCP_WAKE_MASK]); 8045 if (wake_mask_size != DIV_ROUND_UP(wake_size, 8)) 8046 return -EINVAL; 8047 8048 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]) { 8049 u32 tokln = nla_len(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 8050 8051 tok = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN]); 8052 tokens_size = tokln - sizeof(*tok); 8053 8054 if (!tok->len || tokens_size % tok->len) 8055 return -EINVAL; 8056 if (!rdev->wiphy.wowlan->tcp->tok) 8057 return -EINVAL; 8058 if (tok->len > rdev->wiphy.wowlan->tcp->tok->max_len) 8059 return -EINVAL; 8060 if (tok->len < rdev->wiphy.wowlan->tcp->tok->min_len) 8061 return -EINVAL; 8062 if (tokens_size > rdev->wiphy.wowlan->tcp->tok->bufsize) 8063 return -EINVAL; 8064 if (tok->offset + tok->len > data_size) 8065 return -EINVAL; 8066 } 8067 8068 if (tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]) { 8069 seq = nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ]); 8070 if (!rdev->wiphy.wowlan->tcp->seq) 8071 return -EINVAL; 8072 if (seq->len == 0 || seq->len > 4) 8073 return -EINVAL; 8074 if (seq->len + seq->offset > data_size) 8075 return -EINVAL; 8076 } 8077 8078 size = sizeof(*cfg); 8079 size += data_size; 8080 size += wake_size + wake_mask_size; 8081 size += tokens_size; 8082 8083 cfg = kzalloc(size, GFP_KERNEL); 8084 if (!cfg) 8085 return -ENOMEM; 8086 cfg->src = nla_get_be32(tb[NL80211_WOWLAN_TCP_SRC_IPV4]); 8087 cfg->dst = nla_get_be32(tb[NL80211_WOWLAN_TCP_DST_IPV4]); 8088 memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), 8089 ETH_ALEN); 8090 if (tb[NL80211_WOWLAN_TCP_SRC_PORT]) 8091 port = nla_get_u16(tb[NL80211_WOWLAN_TCP_SRC_PORT]); 8092 else 8093 port = 0; 8094 #ifdef CONFIG_INET 8095 /* allocate a socket and port for it and use it */ 8096 err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, 8097 IPPROTO_TCP, &cfg->sock, 1); 8098 if (err) { 8099 kfree(cfg); 8100 return err; 8101 } 8102 if (inet_csk_get_port(cfg->sock->sk, port)) { 8103 sock_release(cfg->sock); 8104 kfree(cfg); 8105 return -EADDRINUSE; 8106 } 8107 cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; 8108 #else 8109 if (!port) { 8110 kfree(cfg); 8111 return -EINVAL; 8112 } 8113 cfg->src_port = port; 8114 #endif 8115 8116 cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); 8117 cfg->payload_len = data_size; 8118 cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size; 8119 memcpy((void *)cfg->payload, 8120 nla_data(tb[NL80211_WOWLAN_TCP_DATA_PAYLOAD]), 8121 data_size); 8122 if (seq) 8123 cfg->payload_seq = *seq; 8124 cfg->data_interval = nla_get_u32(tb[NL80211_WOWLAN_TCP_DATA_INTERVAL]); 8125 cfg->wake_len = wake_size; 8126 cfg->wake_data = (u8 *)cfg + sizeof(*cfg) + tokens_size + data_size; 8127 memcpy((void *)cfg->wake_data, 8128 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_PAYLOAD]), 8129 wake_size); 8130 cfg->wake_mask = (u8 *)cfg + sizeof(*cfg) + tokens_size + 8131 data_size + wake_size; 8132 memcpy((void *)cfg->wake_mask, 8133 nla_data(tb[NL80211_WOWLAN_TCP_WAKE_MASK]), 8134 wake_mask_size); 8135 if (tok) { 8136 cfg->tokens_size = tokens_size; 8137 memcpy(&cfg->payload_tok, tok, sizeof(*tok) + tokens_size); 8138 } 8139 8140 trig->tcp = cfg; 8141 8142 return 0; 8143 } 8144 8145 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info) 8146 { 8147 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8148 struct nlattr *tb[NUM_NL80211_WOWLAN_TRIG]; 8149 struct cfg80211_wowlan new_triggers = {}; 8150 struct cfg80211_wowlan *ntrig; 8151 const struct wiphy_wowlan_support *wowlan = rdev->wiphy.wowlan; 8152 int err, i; 8153 bool prev_enabled = rdev->wiphy.wowlan_config; 8154 8155 if (!wowlan) 8156 return -EOPNOTSUPP; 8157 8158 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) { 8159 cfg80211_rdev_free_wowlan(rdev); 8160 rdev->wiphy.wowlan_config = NULL; 8161 goto set_wakeup; 8162 } 8163 8164 err = nla_parse(tb, MAX_NL80211_WOWLAN_TRIG, 8165 nla_data(info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]), 8166 nla_len(info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]), 8167 nl80211_wowlan_policy); 8168 if (err) 8169 return err; 8170 8171 if (tb[NL80211_WOWLAN_TRIG_ANY]) { 8172 if (!(wowlan->flags & WIPHY_WOWLAN_ANY)) 8173 return -EINVAL; 8174 new_triggers.any = true; 8175 } 8176 8177 if (tb[NL80211_WOWLAN_TRIG_DISCONNECT]) { 8178 if (!(wowlan->flags & WIPHY_WOWLAN_DISCONNECT)) 8179 return -EINVAL; 8180 new_triggers.disconnect = true; 8181 } 8182 8183 if (tb[NL80211_WOWLAN_TRIG_MAGIC_PKT]) { 8184 if (!(wowlan->flags & WIPHY_WOWLAN_MAGIC_PKT)) 8185 return -EINVAL; 8186 new_triggers.magic_pkt = true; 8187 } 8188 8189 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED]) 8190 return -EINVAL; 8191 8192 if (tb[NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE]) { 8193 if (!(wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE)) 8194 return -EINVAL; 8195 new_triggers.gtk_rekey_failure = true; 8196 } 8197 8198 if (tb[NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST]) { 8199 if (!(wowlan->flags & WIPHY_WOWLAN_EAP_IDENTITY_REQ)) 8200 return -EINVAL; 8201 new_triggers.eap_identity_req = true; 8202 } 8203 8204 if (tb[NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE]) { 8205 if (!(wowlan->flags & WIPHY_WOWLAN_4WAY_HANDSHAKE)) 8206 return -EINVAL; 8207 new_triggers.four_way_handshake = true; 8208 } 8209 8210 if (tb[NL80211_WOWLAN_TRIG_RFKILL_RELEASE]) { 8211 if (!(wowlan->flags & WIPHY_WOWLAN_RFKILL_RELEASE)) 8212 return -EINVAL; 8213 new_triggers.rfkill_release = true; 8214 } 8215 8216 if (tb[NL80211_WOWLAN_TRIG_PKT_PATTERN]) { 8217 struct nlattr *pat; 8218 int n_patterns = 0; 8219 int rem, pat_len, mask_len, pkt_offset; 8220 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 8221 8222 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 8223 rem) 8224 n_patterns++; 8225 if (n_patterns > wowlan->n_patterns) 8226 return -EINVAL; 8227 8228 new_triggers.patterns = kcalloc(n_patterns, 8229 sizeof(new_triggers.patterns[0]), 8230 GFP_KERNEL); 8231 if (!new_triggers.patterns) 8232 return -ENOMEM; 8233 8234 new_triggers.n_patterns = n_patterns; 8235 i = 0; 8236 8237 nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], 8238 rem) { 8239 nla_parse(pat_tb, MAX_NL80211_PKTPAT, nla_data(pat), 8240 nla_len(pat), NULL); 8241 err = -EINVAL; 8242 if (!pat_tb[NL80211_PKTPAT_MASK] || 8243 !pat_tb[NL80211_PKTPAT_PATTERN]) 8244 goto error; 8245 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 8246 mask_len = DIV_ROUND_UP(pat_len, 8); 8247 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 8248 goto error; 8249 if (pat_len > wowlan->pattern_max_len || 8250 pat_len < wowlan->pattern_min_len) 8251 goto error; 8252 8253 if (!pat_tb[NL80211_PKTPAT_OFFSET]) 8254 pkt_offset = 0; 8255 else 8256 pkt_offset = nla_get_u32( 8257 pat_tb[NL80211_PKTPAT_OFFSET]); 8258 if (pkt_offset > wowlan->max_pkt_offset) 8259 goto error; 8260 new_triggers.patterns[i].pkt_offset = pkt_offset; 8261 8262 new_triggers.patterns[i].mask = 8263 kmalloc(mask_len + pat_len, GFP_KERNEL); 8264 if (!new_triggers.patterns[i].mask) { 8265 err = -ENOMEM; 8266 goto error; 8267 } 8268 new_triggers.patterns[i].pattern = 8269 new_triggers.patterns[i].mask + mask_len; 8270 memcpy(new_triggers.patterns[i].mask, 8271 nla_data(pat_tb[NL80211_PKTPAT_MASK]), 8272 mask_len); 8273 new_triggers.patterns[i].pattern_len = pat_len; 8274 memcpy(new_triggers.patterns[i].pattern, 8275 nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), 8276 pat_len); 8277 i++; 8278 } 8279 } 8280 8281 if (tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION]) { 8282 err = nl80211_parse_wowlan_tcp( 8283 rdev, tb[NL80211_WOWLAN_TRIG_TCP_CONNECTION], 8284 &new_triggers); 8285 if (err) 8286 goto error; 8287 } 8288 8289 ntrig = kmemdup(&new_triggers, sizeof(new_triggers), GFP_KERNEL); 8290 if (!ntrig) { 8291 err = -ENOMEM; 8292 goto error; 8293 } 8294 cfg80211_rdev_free_wowlan(rdev); 8295 rdev->wiphy.wowlan_config = ntrig; 8296 8297 set_wakeup: 8298 if (rdev->ops->set_wakeup && 8299 prev_enabled != !!rdev->wiphy.wowlan_config) 8300 rdev_set_wakeup(rdev, rdev->wiphy.wowlan_config); 8301 8302 return 0; 8303 error: 8304 for (i = 0; i < new_triggers.n_patterns; i++) 8305 kfree(new_triggers.patterns[i].mask); 8306 kfree(new_triggers.patterns); 8307 if (new_triggers.tcp && new_triggers.tcp->sock) 8308 sock_release(new_triggers.tcp->sock); 8309 kfree(new_triggers.tcp); 8310 return err; 8311 } 8312 #endif 8313 8314 static int nl80211_send_coalesce_rules(struct sk_buff *msg, 8315 struct cfg80211_registered_device *rdev) 8316 { 8317 struct nlattr *nl_pats, *nl_pat, *nl_rule, *nl_rules; 8318 int i, j, pat_len; 8319 struct cfg80211_coalesce_rules *rule; 8320 8321 if (!rdev->coalesce->n_rules) 8322 return 0; 8323 8324 nl_rules = nla_nest_start(msg, NL80211_ATTR_COALESCE_RULE); 8325 if (!nl_rules) 8326 return -ENOBUFS; 8327 8328 for (i = 0; i < rdev->coalesce->n_rules; i++) { 8329 nl_rule = nla_nest_start(msg, i + 1); 8330 if (!nl_rule) 8331 return -ENOBUFS; 8332 8333 rule = &rdev->coalesce->rules[i]; 8334 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_DELAY, 8335 rule->delay)) 8336 return -ENOBUFS; 8337 8338 if (nla_put_u32(msg, NL80211_ATTR_COALESCE_RULE_CONDITION, 8339 rule->condition)) 8340 return -ENOBUFS; 8341 8342 nl_pats = nla_nest_start(msg, 8343 NL80211_ATTR_COALESCE_RULE_PKT_PATTERN); 8344 if (!nl_pats) 8345 return -ENOBUFS; 8346 8347 for (j = 0; j < rule->n_patterns; j++) { 8348 nl_pat = nla_nest_start(msg, j + 1); 8349 if (!nl_pat) 8350 return -ENOBUFS; 8351 pat_len = rule->patterns[j].pattern_len; 8352 if (nla_put(msg, NL80211_PKTPAT_MASK, 8353 DIV_ROUND_UP(pat_len, 8), 8354 rule->patterns[j].mask) || 8355 nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len, 8356 rule->patterns[j].pattern) || 8357 nla_put_u32(msg, NL80211_PKTPAT_OFFSET, 8358 rule->patterns[j].pkt_offset)) 8359 return -ENOBUFS; 8360 nla_nest_end(msg, nl_pat); 8361 } 8362 nla_nest_end(msg, nl_pats); 8363 nla_nest_end(msg, nl_rule); 8364 } 8365 nla_nest_end(msg, nl_rules); 8366 8367 return 0; 8368 } 8369 8370 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info) 8371 { 8372 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8373 struct sk_buff *msg; 8374 void *hdr; 8375 8376 if (!rdev->wiphy.coalesce) 8377 return -EOPNOTSUPP; 8378 8379 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 8380 if (!msg) 8381 return -ENOMEM; 8382 8383 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 8384 NL80211_CMD_GET_COALESCE); 8385 if (!hdr) 8386 goto nla_put_failure; 8387 8388 if (rdev->coalesce && nl80211_send_coalesce_rules(msg, rdev)) 8389 goto nla_put_failure; 8390 8391 genlmsg_end(msg, hdr); 8392 return genlmsg_reply(msg, info); 8393 8394 nla_put_failure: 8395 nlmsg_free(msg); 8396 return -ENOBUFS; 8397 } 8398 8399 void cfg80211_rdev_free_coalesce(struct cfg80211_registered_device *rdev) 8400 { 8401 struct cfg80211_coalesce *coalesce = rdev->coalesce; 8402 int i, j; 8403 struct cfg80211_coalesce_rules *rule; 8404 8405 if (!coalesce) 8406 return; 8407 8408 for (i = 0; i < coalesce->n_rules; i++) { 8409 rule = &coalesce->rules[i]; 8410 for (j = 0; j < rule->n_patterns; j++) 8411 kfree(rule->patterns[j].mask); 8412 kfree(rule->patterns); 8413 } 8414 kfree(coalesce->rules); 8415 kfree(coalesce); 8416 rdev->coalesce = NULL; 8417 } 8418 8419 static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev, 8420 struct nlattr *rule, 8421 struct cfg80211_coalesce_rules *new_rule) 8422 { 8423 int err, i; 8424 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 8425 struct nlattr *tb[NUM_NL80211_ATTR_COALESCE_RULE], *pat; 8426 int rem, pat_len, mask_len, pkt_offset, n_patterns = 0; 8427 struct nlattr *pat_tb[NUM_NL80211_PKTPAT]; 8428 8429 err = nla_parse(tb, NL80211_ATTR_COALESCE_RULE_MAX, nla_data(rule), 8430 nla_len(rule), nl80211_coalesce_policy); 8431 if (err) 8432 return err; 8433 8434 if (tb[NL80211_ATTR_COALESCE_RULE_DELAY]) 8435 new_rule->delay = 8436 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_DELAY]); 8437 if (new_rule->delay > coalesce->max_delay) 8438 return -EINVAL; 8439 8440 if (tb[NL80211_ATTR_COALESCE_RULE_CONDITION]) 8441 new_rule->condition = 8442 nla_get_u32(tb[NL80211_ATTR_COALESCE_RULE_CONDITION]); 8443 if (new_rule->condition != NL80211_COALESCE_CONDITION_MATCH && 8444 new_rule->condition != NL80211_COALESCE_CONDITION_NO_MATCH) 8445 return -EINVAL; 8446 8447 if (!tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN]) 8448 return -EINVAL; 8449 8450 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 8451 rem) 8452 n_patterns++; 8453 if (n_patterns > coalesce->n_patterns) 8454 return -EINVAL; 8455 8456 new_rule->patterns = kcalloc(n_patterns, sizeof(new_rule->patterns[0]), 8457 GFP_KERNEL); 8458 if (!new_rule->patterns) 8459 return -ENOMEM; 8460 8461 new_rule->n_patterns = n_patterns; 8462 i = 0; 8463 8464 nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], 8465 rem) { 8466 nla_parse(pat_tb, MAX_NL80211_PKTPAT, nla_data(pat), 8467 nla_len(pat), NULL); 8468 if (!pat_tb[NL80211_PKTPAT_MASK] || 8469 !pat_tb[NL80211_PKTPAT_PATTERN]) 8470 return -EINVAL; 8471 pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]); 8472 mask_len = DIV_ROUND_UP(pat_len, 8); 8473 if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len) 8474 return -EINVAL; 8475 if (pat_len > coalesce->pattern_max_len || 8476 pat_len < coalesce->pattern_min_len) 8477 return -EINVAL; 8478 8479 if (!pat_tb[NL80211_PKTPAT_OFFSET]) 8480 pkt_offset = 0; 8481 else 8482 pkt_offset = nla_get_u32(pat_tb[NL80211_PKTPAT_OFFSET]); 8483 if (pkt_offset > coalesce->max_pkt_offset) 8484 return -EINVAL; 8485 new_rule->patterns[i].pkt_offset = pkt_offset; 8486 8487 new_rule->patterns[i].mask = 8488 kmalloc(mask_len + pat_len, GFP_KERNEL); 8489 if (!new_rule->patterns[i].mask) 8490 return -ENOMEM; 8491 new_rule->patterns[i].pattern = 8492 new_rule->patterns[i].mask + mask_len; 8493 memcpy(new_rule->patterns[i].mask, 8494 nla_data(pat_tb[NL80211_PKTPAT_MASK]), mask_len); 8495 new_rule->patterns[i].pattern_len = pat_len; 8496 memcpy(new_rule->patterns[i].pattern, 8497 nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), pat_len); 8498 i++; 8499 } 8500 8501 return 0; 8502 } 8503 8504 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info) 8505 { 8506 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8507 const struct wiphy_coalesce_support *coalesce = rdev->wiphy.coalesce; 8508 struct cfg80211_coalesce new_coalesce = {}; 8509 struct cfg80211_coalesce *n_coalesce; 8510 int err, rem_rule, n_rules = 0, i, j; 8511 struct nlattr *rule; 8512 struct cfg80211_coalesce_rules *tmp_rule; 8513 8514 if (!rdev->wiphy.coalesce || !rdev->ops->set_coalesce) 8515 return -EOPNOTSUPP; 8516 8517 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) { 8518 cfg80211_rdev_free_coalesce(rdev); 8519 rdev->ops->set_coalesce(&rdev->wiphy, NULL); 8520 return 0; 8521 } 8522 8523 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 8524 rem_rule) 8525 n_rules++; 8526 if (n_rules > coalesce->n_rules) 8527 return -EINVAL; 8528 8529 new_coalesce.rules = kcalloc(n_rules, sizeof(new_coalesce.rules[0]), 8530 GFP_KERNEL); 8531 if (!new_coalesce.rules) 8532 return -ENOMEM; 8533 8534 new_coalesce.n_rules = n_rules; 8535 i = 0; 8536 8537 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE], 8538 rem_rule) { 8539 err = nl80211_parse_coalesce_rule(rdev, rule, 8540 &new_coalesce.rules[i]); 8541 if (err) 8542 goto error; 8543 8544 i++; 8545 } 8546 8547 err = rdev->ops->set_coalesce(&rdev->wiphy, &new_coalesce); 8548 if (err) 8549 goto error; 8550 8551 n_coalesce = kmemdup(&new_coalesce, sizeof(new_coalesce), GFP_KERNEL); 8552 if (!n_coalesce) { 8553 err = -ENOMEM; 8554 goto error; 8555 } 8556 cfg80211_rdev_free_coalesce(rdev); 8557 rdev->coalesce = n_coalesce; 8558 8559 return 0; 8560 error: 8561 for (i = 0; i < new_coalesce.n_rules; i++) { 8562 tmp_rule = &new_coalesce.rules[i]; 8563 for (j = 0; j < tmp_rule->n_patterns; j++) 8564 kfree(tmp_rule->patterns[j].mask); 8565 kfree(tmp_rule->patterns); 8566 } 8567 kfree(new_coalesce.rules); 8568 8569 return err; 8570 } 8571 8572 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info) 8573 { 8574 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8575 struct net_device *dev = info->user_ptr[1]; 8576 struct wireless_dev *wdev = dev->ieee80211_ptr; 8577 struct nlattr *tb[NUM_NL80211_REKEY_DATA]; 8578 struct cfg80211_gtk_rekey_data rekey_data; 8579 int err; 8580 8581 if (!info->attrs[NL80211_ATTR_REKEY_DATA]) 8582 return -EINVAL; 8583 8584 err = nla_parse(tb, MAX_NL80211_REKEY_DATA, 8585 nla_data(info->attrs[NL80211_ATTR_REKEY_DATA]), 8586 nla_len(info->attrs[NL80211_ATTR_REKEY_DATA]), 8587 nl80211_rekey_policy); 8588 if (err) 8589 return err; 8590 8591 if (nla_len(tb[NL80211_REKEY_DATA_REPLAY_CTR]) != NL80211_REPLAY_CTR_LEN) 8592 return -ERANGE; 8593 if (nla_len(tb[NL80211_REKEY_DATA_KEK]) != NL80211_KEK_LEN) 8594 return -ERANGE; 8595 if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN) 8596 return -ERANGE; 8597 8598 memcpy(rekey_data.kek, nla_data(tb[NL80211_REKEY_DATA_KEK]), 8599 NL80211_KEK_LEN); 8600 memcpy(rekey_data.kck, nla_data(tb[NL80211_REKEY_DATA_KCK]), 8601 NL80211_KCK_LEN); 8602 memcpy(rekey_data.replay_ctr, 8603 nla_data(tb[NL80211_REKEY_DATA_REPLAY_CTR]), 8604 NL80211_REPLAY_CTR_LEN); 8605 8606 wdev_lock(wdev); 8607 if (!wdev->current_bss) { 8608 err = -ENOTCONN; 8609 goto out; 8610 } 8611 8612 if (!rdev->ops->set_rekey_data) { 8613 err = -EOPNOTSUPP; 8614 goto out; 8615 } 8616 8617 err = rdev_set_rekey_data(rdev, dev, &rekey_data); 8618 out: 8619 wdev_unlock(wdev); 8620 return err; 8621 } 8622 8623 static int nl80211_register_unexpected_frame(struct sk_buff *skb, 8624 struct genl_info *info) 8625 { 8626 struct net_device *dev = info->user_ptr[1]; 8627 struct wireless_dev *wdev = dev->ieee80211_ptr; 8628 8629 if (wdev->iftype != NL80211_IFTYPE_AP && 8630 wdev->iftype != NL80211_IFTYPE_P2P_GO) 8631 return -EINVAL; 8632 8633 if (wdev->ap_unexpected_nlportid) 8634 return -EBUSY; 8635 8636 wdev->ap_unexpected_nlportid = info->snd_portid; 8637 return 0; 8638 } 8639 8640 static int nl80211_probe_client(struct sk_buff *skb, 8641 struct genl_info *info) 8642 { 8643 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8644 struct net_device *dev = info->user_ptr[1]; 8645 struct wireless_dev *wdev = dev->ieee80211_ptr; 8646 struct sk_buff *msg; 8647 void *hdr; 8648 const u8 *addr; 8649 u64 cookie; 8650 int err; 8651 8652 if (wdev->iftype != NL80211_IFTYPE_AP && 8653 wdev->iftype != NL80211_IFTYPE_P2P_GO) 8654 return -EOPNOTSUPP; 8655 8656 if (!info->attrs[NL80211_ATTR_MAC]) 8657 return -EINVAL; 8658 8659 if (!rdev->ops->probe_client) 8660 return -EOPNOTSUPP; 8661 8662 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 8663 if (!msg) 8664 return -ENOMEM; 8665 8666 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 8667 NL80211_CMD_PROBE_CLIENT); 8668 if (!hdr) { 8669 err = -ENOBUFS; 8670 goto free_msg; 8671 } 8672 8673 addr = nla_data(info->attrs[NL80211_ATTR_MAC]); 8674 8675 err = rdev_probe_client(rdev, dev, addr, &cookie); 8676 if (err) 8677 goto free_msg; 8678 8679 if (nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie)) 8680 goto nla_put_failure; 8681 8682 genlmsg_end(msg, hdr); 8683 8684 return genlmsg_reply(msg, info); 8685 8686 nla_put_failure: 8687 err = -ENOBUFS; 8688 free_msg: 8689 nlmsg_free(msg); 8690 return err; 8691 } 8692 8693 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info) 8694 { 8695 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8696 struct cfg80211_beacon_registration *reg, *nreg; 8697 int rv; 8698 8699 if (!(rdev->wiphy.flags & WIPHY_FLAG_REPORTS_OBSS)) 8700 return -EOPNOTSUPP; 8701 8702 nreg = kzalloc(sizeof(*nreg), GFP_KERNEL); 8703 if (!nreg) 8704 return -ENOMEM; 8705 8706 /* First, check if already registered. */ 8707 spin_lock_bh(&rdev->beacon_registrations_lock); 8708 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 8709 if (reg->nlportid == info->snd_portid) { 8710 rv = -EALREADY; 8711 goto out_err; 8712 } 8713 } 8714 /* Add it to the list */ 8715 nreg->nlportid = info->snd_portid; 8716 list_add(&nreg->list, &rdev->beacon_registrations); 8717 8718 spin_unlock_bh(&rdev->beacon_registrations_lock); 8719 8720 return 0; 8721 out_err: 8722 spin_unlock_bh(&rdev->beacon_registrations_lock); 8723 kfree(nreg); 8724 return rv; 8725 } 8726 8727 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info) 8728 { 8729 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8730 struct wireless_dev *wdev = info->user_ptr[1]; 8731 int err; 8732 8733 if (!rdev->ops->start_p2p_device) 8734 return -EOPNOTSUPP; 8735 8736 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 8737 return -EOPNOTSUPP; 8738 8739 if (wdev->p2p_started) 8740 return 0; 8741 8742 err = cfg80211_can_add_interface(rdev, wdev->iftype); 8743 if (err) 8744 return err; 8745 8746 err = rdev_start_p2p_device(rdev, wdev); 8747 if (err) 8748 return err; 8749 8750 wdev->p2p_started = true; 8751 rdev->opencount++; 8752 8753 return 0; 8754 } 8755 8756 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info) 8757 { 8758 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8759 struct wireless_dev *wdev = info->user_ptr[1]; 8760 8761 if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) 8762 return -EOPNOTSUPP; 8763 8764 if (!rdev->ops->stop_p2p_device) 8765 return -EOPNOTSUPP; 8766 8767 cfg80211_stop_p2p_device(rdev, wdev); 8768 8769 return 0; 8770 } 8771 8772 static int nl80211_get_protocol_features(struct sk_buff *skb, 8773 struct genl_info *info) 8774 { 8775 void *hdr; 8776 struct sk_buff *msg; 8777 8778 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 8779 if (!msg) 8780 return -ENOMEM; 8781 8782 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0, 8783 NL80211_CMD_GET_PROTOCOL_FEATURES); 8784 if (!hdr) 8785 goto nla_put_failure; 8786 8787 if (nla_put_u32(msg, NL80211_ATTR_PROTOCOL_FEATURES, 8788 NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP)) 8789 goto nla_put_failure; 8790 8791 genlmsg_end(msg, hdr); 8792 return genlmsg_reply(msg, info); 8793 8794 nla_put_failure: 8795 kfree_skb(msg); 8796 return -ENOBUFS; 8797 } 8798 8799 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info) 8800 { 8801 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8802 struct cfg80211_update_ft_ies_params ft_params; 8803 struct net_device *dev = info->user_ptr[1]; 8804 8805 if (!rdev->ops->update_ft_ies) 8806 return -EOPNOTSUPP; 8807 8808 if (!info->attrs[NL80211_ATTR_MDID] || 8809 !is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) 8810 return -EINVAL; 8811 8812 memset(&ft_params, 0, sizeof(ft_params)); 8813 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]); 8814 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]); 8815 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); 8816 8817 return rdev_update_ft_ies(rdev, dev, &ft_params); 8818 } 8819 8820 static int nl80211_crit_protocol_start(struct sk_buff *skb, 8821 struct genl_info *info) 8822 { 8823 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8824 struct wireless_dev *wdev = info->user_ptr[1]; 8825 enum nl80211_crit_proto_id proto = NL80211_CRIT_PROTO_UNSPEC; 8826 u16 duration; 8827 int ret; 8828 8829 if (!rdev->ops->crit_proto_start) 8830 return -EOPNOTSUPP; 8831 8832 if (WARN_ON(!rdev->ops->crit_proto_stop)) 8833 return -EINVAL; 8834 8835 if (rdev->crit_proto_nlportid) 8836 return -EBUSY; 8837 8838 /* determine protocol if provided */ 8839 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID]) 8840 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]); 8841 8842 if (proto >= NUM_NL80211_CRIT_PROTO) 8843 return -EINVAL; 8844 8845 /* timeout must be provided */ 8846 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]) 8847 return -EINVAL; 8848 8849 duration = 8850 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]); 8851 8852 if (duration > NL80211_CRIT_PROTO_MAX_DURATION) 8853 return -ERANGE; 8854 8855 ret = rdev_crit_proto_start(rdev, wdev, proto, duration); 8856 if (!ret) 8857 rdev->crit_proto_nlportid = info->snd_portid; 8858 8859 return ret; 8860 } 8861 8862 static int nl80211_crit_protocol_stop(struct sk_buff *skb, 8863 struct genl_info *info) 8864 { 8865 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 8866 struct wireless_dev *wdev = info->user_ptr[1]; 8867 8868 if (!rdev->ops->crit_proto_stop) 8869 return -EOPNOTSUPP; 8870 8871 if (rdev->crit_proto_nlportid) { 8872 rdev->crit_proto_nlportid = 0; 8873 rdev_crit_proto_stop(rdev, wdev); 8874 } 8875 return 0; 8876 } 8877 8878 #define NL80211_FLAG_NEED_WIPHY 0x01 8879 #define NL80211_FLAG_NEED_NETDEV 0x02 8880 #define NL80211_FLAG_NEED_RTNL 0x04 8881 #define NL80211_FLAG_CHECK_NETDEV_UP 0x08 8882 #define NL80211_FLAG_NEED_NETDEV_UP (NL80211_FLAG_NEED_NETDEV |\ 8883 NL80211_FLAG_CHECK_NETDEV_UP) 8884 #define NL80211_FLAG_NEED_WDEV 0x10 8885 /* If a netdev is associated, it must be UP, P2P must be started */ 8886 #define NL80211_FLAG_NEED_WDEV_UP (NL80211_FLAG_NEED_WDEV |\ 8887 NL80211_FLAG_CHECK_NETDEV_UP) 8888 8889 static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, 8890 struct genl_info *info) 8891 { 8892 struct cfg80211_registered_device *rdev; 8893 struct wireless_dev *wdev; 8894 struct net_device *dev; 8895 bool rtnl = ops->internal_flags & NL80211_FLAG_NEED_RTNL; 8896 8897 if (rtnl) 8898 rtnl_lock(); 8899 8900 if (ops->internal_flags & NL80211_FLAG_NEED_WIPHY) { 8901 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); 8902 if (IS_ERR(rdev)) { 8903 if (rtnl) 8904 rtnl_unlock(); 8905 return PTR_ERR(rdev); 8906 } 8907 info->user_ptr[0] = rdev; 8908 } else if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV || 8909 ops->internal_flags & NL80211_FLAG_NEED_WDEV) { 8910 ASSERT_RTNL(); 8911 8912 wdev = __cfg80211_wdev_from_attrs(genl_info_net(info), 8913 info->attrs); 8914 if (IS_ERR(wdev)) { 8915 if (rtnl) 8916 rtnl_unlock(); 8917 return PTR_ERR(wdev); 8918 } 8919 8920 dev = wdev->netdev; 8921 rdev = wiphy_to_dev(wdev->wiphy); 8922 8923 if (ops->internal_flags & NL80211_FLAG_NEED_NETDEV) { 8924 if (!dev) { 8925 if (rtnl) 8926 rtnl_unlock(); 8927 return -EINVAL; 8928 } 8929 8930 info->user_ptr[1] = dev; 8931 } else { 8932 info->user_ptr[1] = wdev; 8933 } 8934 8935 if (dev) { 8936 if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && 8937 !netif_running(dev)) { 8938 if (rtnl) 8939 rtnl_unlock(); 8940 return -ENETDOWN; 8941 } 8942 8943 dev_hold(dev); 8944 } else if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP) { 8945 if (!wdev->p2p_started) { 8946 if (rtnl) 8947 rtnl_unlock(); 8948 return -ENETDOWN; 8949 } 8950 } 8951 8952 info->user_ptr[0] = rdev; 8953 } 8954 8955 return 0; 8956 } 8957 8958 static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb, 8959 struct genl_info *info) 8960 { 8961 if (info->user_ptr[1]) { 8962 if (ops->internal_flags & NL80211_FLAG_NEED_WDEV) { 8963 struct wireless_dev *wdev = info->user_ptr[1]; 8964 8965 if (wdev->netdev) 8966 dev_put(wdev->netdev); 8967 } else { 8968 dev_put(info->user_ptr[1]); 8969 } 8970 } 8971 if (ops->internal_flags & NL80211_FLAG_NEED_RTNL) 8972 rtnl_unlock(); 8973 } 8974 8975 static const struct genl_ops nl80211_ops[] = { 8976 { 8977 .cmd = NL80211_CMD_GET_WIPHY, 8978 .doit = nl80211_get_wiphy, 8979 .dumpit = nl80211_dump_wiphy, 8980 .done = nl80211_dump_wiphy_done, 8981 .policy = nl80211_policy, 8982 /* can be retrieved by unprivileged users */ 8983 .internal_flags = NL80211_FLAG_NEED_WIPHY | 8984 NL80211_FLAG_NEED_RTNL, 8985 }, 8986 { 8987 .cmd = NL80211_CMD_SET_WIPHY, 8988 .doit = nl80211_set_wiphy, 8989 .policy = nl80211_policy, 8990 .flags = GENL_ADMIN_PERM, 8991 .internal_flags = NL80211_FLAG_NEED_RTNL, 8992 }, 8993 { 8994 .cmd = NL80211_CMD_GET_INTERFACE, 8995 .doit = nl80211_get_interface, 8996 .dumpit = nl80211_dump_interface, 8997 .policy = nl80211_policy, 8998 /* can be retrieved by unprivileged users */ 8999 .internal_flags = NL80211_FLAG_NEED_WDEV | 9000 NL80211_FLAG_NEED_RTNL, 9001 }, 9002 { 9003 .cmd = NL80211_CMD_SET_INTERFACE, 9004 .doit = nl80211_set_interface, 9005 .policy = nl80211_policy, 9006 .flags = GENL_ADMIN_PERM, 9007 .internal_flags = NL80211_FLAG_NEED_NETDEV | 9008 NL80211_FLAG_NEED_RTNL, 9009 }, 9010 { 9011 .cmd = NL80211_CMD_NEW_INTERFACE, 9012 .doit = nl80211_new_interface, 9013 .policy = nl80211_policy, 9014 .flags = GENL_ADMIN_PERM, 9015 .internal_flags = NL80211_FLAG_NEED_WIPHY | 9016 NL80211_FLAG_NEED_RTNL, 9017 }, 9018 { 9019 .cmd = NL80211_CMD_DEL_INTERFACE, 9020 .doit = nl80211_del_interface, 9021 .policy = nl80211_policy, 9022 .flags = GENL_ADMIN_PERM, 9023 .internal_flags = NL80211_FLAG_NEED_WDEV | 9024 NL80211_FLAG_NEED_RTNL, 9025 }, 9026 { 9027 .cmd = NL80211_CMD_GET_KEY, 9028 .doit = nl80211_get_key, 9029 .policy = nl80211_policy, 9030 .flags = GENL_ADMIN_PERM, 9031 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9032 NL80211_FLAG_NEED_RTNL, 9033 }, 9034 { 9035 .cmd = NL80211_CMD_SET_KEY, 9036 .doit = nl80211_set_key, 9037 .policy = nl80211_policy, 9038 .flags = GENL_ADMIN_PERM, 9039 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9040 NL80211_FLAG_NEED_RTNL, 9041 }, 9042 { 9043 .cmd = NL80211_CMD_NEW_KEY, 9044 .doit = nl80211_new_key, 9045 .policy = nl80211_policy, 9046 .flags = GENL_ADMIN_PERM, 9047 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9048 NL80211_FLAG_NEED_RTNL, 9049 }, 9050 { 9051 .cmd = NL80211_CMD_DEL_KEY, 9052 .doit = nl80211_del_key, 9053 .policy = nl80211_policy, 9054 .flags = GENL_ADMIN_PERM, 9055 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9056 NL80211_FLAG_NEED_RTNL, 9057 }, 9058 { 9059 .cmd = NL80211_CMD_SET_BEACON, 9060 .policy = nl80211_policy, 9061 .flags = GENL_ADMIN_PERM, 9062 .doit = nl80211_set_beacon, 9063 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9064 NL80211_FLAG_NEED_RTNL, 9065 }, 9066 { 9067 .cmd = NL80211_CMD_START_AP, 9068 .policy = nl80211_policy, 9069 .flags = GENL_ADMIN_PERM, 9070 .doit = nl80211_start_ap, 9071 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9072 NL80211_FLAG_NEED_RTNL, 9073 }, 9074 { 9075 .cmd = NL80211_CMD_STOP_AP, 9076 .policy = nl80211_policy, 9077 .flags = GENL_ADMIN_PERM, 9078 .doit = nl80211_stop_ap, 9079 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9080 NL80211_FLAG_NEED_RTNL, 9081 }, 9082 { 9083 .cmd = NL80211_CMD_GET_STATION, 9084 .doit = nl80211_get_station, 9085 .dumpit = nl80211_dump_station, 9086 .policy = nl80211_policy, 9087 .internal_flags = NL80211_FLAG_NEED_NETDEV | 9088 NL80211_FLAG_NEED_RTNL, 9089 }, 9090 { 9091 .cmd = NL80211_CMD_SET_STATION, 9092 .doit = nl80211_set_station, 9093 .policy = nl80211_policy, 9094 .flags = GENL_ADMIN_PERM, 9095 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9096 NL80211_FLAG_NEED_RTNL, 9097 }, 9098 { 9099 .cmd = NL80211_CMD_NEW_STATION, 9100 .doit = nl80211_new_station, 9101 .policy = nl80211_policy, 9102 .flags = GENL_ADMIN_PERM, 9103 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9104 NL80211_FLAG_NEED_RTNL, 9105 }, 9106 { 9107 .cmd = NL80211_CMD_DEL_STATION, 9108 .doit = nl80211_del_station, 9109 .policy = nl80211_policy, 9110 .flags = GENL_ADMIN_PERM, 9111 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9112 NL80211_FLAG_NEED_RTNL, 9113 }, 9114 { 9115 .cmd = NL80211_CMD_GET_MPATH, 9116 .doit = nl80211_get_mpath, 9117 .dumpit = nl80211_dump_mpath, 9118 .policy = nl80211_policy, 9119 .flags = GENL_ADMIN_PERM, 9120 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9121 NL80211_FLAG_NEED_RTNL, 9122 }, 9123 { 9124 .cmd = NL80211_CMD_SET_MPATH, 9125 .doit = nl80211_set_mpath, 9126 .policy = nl80211_policy, 9127 .flags = GENL_ADMIN_PERM, 9128 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9129 NL80211_FLAG_NEED_RTNL, 9130 }, 9131 { 9132 .cmd = NL80211_CMD_NEW_MPATH, 9133 .doit = nl80211_new_mpath, 9134 .policy = nl80211_policy, 9135 .flags = GENL_ADMIN_PERM, 9136 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9137 NL80211_FLAG_NEED_RTNL, 9138 }, 9139 { 9140 .cmd = NL80211_CMD_DEL_MPATH, 9141 .doit = nl80211_del_mpath, 9142 .policy = nl80211_policy, 9143 .flags = GENL_ADMIN_PERM, 9144 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9145 NL80211_FLAG_NEED_RTNL, 9146 }, 9147 { 9148 .cmd = NL80211_CMD_SET_BSS, 9149 .doit = nl80211_set_bss, 9150 .policy = nl80211_policy, 9151 .flags = GENL_ADMIN_PERM, 9152 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9153 NL80211_FLAG_NEED_RTNL, 9154 }, 9155 { 9156 .cmd = NL80211_CMD_GET_REG, 9157 .doit = nl80211_get_reg, 9158 .policy = nl80211_policy, 9159 .internal_flags = NL80211_FLAG_NEED_RTNL, 9160 /* can be retrieved by unprivileged users */ 9161 }, 9162 { 9163 .cmd = NL80211_CMD_SET_REG, 9164 .doit = nl80211_set_reg, 9165 .policy = nl80211_policy, 9166 .flags = GENL_ADMIN_PERM, 9167 .internal_flags = NL80211_FLAG_NEED_RTNL, 9168 }, 9169 { 9170 .cmd = NL80211_CMD_REQ_SET_REG, 9171 .doit = nl80211_req_set_reg, 9172 .policy = nl80211_policy, 9173 .flags = GENL_ADMIN_PERM, 9174 }, 9175 { 9176 .cmd = NL80211_CMD_GET_MESH_CONFIG, 9177 .doit = nl80211_get_mesh_config, 9178 .policy = nl80211_policy, 9179 /* can be retrieved by unprivileged users */ 9180 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9181 NL80211_FLAG_NEED_RTNL, 9182 }, 9183 { 9184 .cmd = NL80211_CMD_SET_MESH_CONFIG, 9185 .doit = nl80211_update_mesh_config, 9186 .policy = nl80211_policy, 9187 .flags = GENL_ADMIN_PERM, 9188 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9189 NL80211_FLAG_NEED_RTNL, 9190 }, 9191 { 9192 .cmd = NL80211_CMD_TRIGGER_SCAN, 9193 .doit = nl80211_trigger_scan, 9194 .policy = nl80211_policy, 9195 .flags = GENL_ADMIN_PERM, 9196 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 9197 NL80211_FLAG_NEED_RTNL, 9198 }, 9199 { 9200 .cmd = NL80211_CMD_GET_SCAN, 9201 .policy = nl80211_policy, 9202 .dumpit = nl80211_dump_scan, 9203 }, 9204 { 9205 .cmd = NL80211_CMD_START_SCHED_SCAN, 9206 .doit = nl80211_start_sched_scan, 9207 .policy = nl80211_policy, 9208 .flags = GENL_ADMIN_PERM, 9209 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9210 NL80211_FLAG_NEED_RTNL, 9211 }, 9212 { 9213 .cmd = NL80211_CMD_STOP_SCHED_SCAN, 9214 .doit = nl80211_stop_sched_scan, 9215 .policy = nl80211_policy, 9216 .flags = GENL_ADMIN_PERM, 9217 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9218 NL80211_FLAG_NEED_RTNL, 9219 }, 9220 { 9221 .cmd = NL80211_CMD_AUTHENTICATE, 9222 .doit = nl80211_authenticate, 9223 .policy = nl80211_policy, 9224 .flags = GENL_ADMIN_PERM, 9225 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9226 NL80211_FLAG_NEED_RTNL, 9227 }, 9228 { 9229 .cmd = NL80211_CMD_ASSOCIATE, 9230 .doit = nl80211_associate, 9231 .policy = nl80211_policy, 9232 .flags = GENL_ADMIN_PERM, 9233 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9234 NL80211_FLAG_NEED_RTNL, 9235 }, 9236 { 9237 .cmd = NL80211_CMD_DEAUTHENTICATE, 9238 .doit = nl80211_deauthenticate, 9239 .policy = nl80211_policy, 9240 .flags = GENL_ADMIN_PERM, 9241 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9242 NL80211_FLAG_NEED_RTNL, 9243 }, 9244 { 9245 .cmd = NL80211_CMD_DISASSOCIATE, 9246 .doit = nl80211_disassociate, 9247 .policy = nl80211_policy, 9248 .flags = GENL_ADMIN_PERM, 9249 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9250 NL80211_FLAG_NEED_RTNL, 9251 }, 9252 { 9253 .cmd = NL80211_CMD_JOIN_IBSS, 9254 .doit = nl80211_join_ibss, 9255 .policy = nl80211_policy, 9256 .flags = GENL_ADMIN_PERM, 9257 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9258 NL80211_FLAG_NEED_RTNL, 9259 }, 9260 { 9261 .cmd = NL80211_CMD_LEAVE_IBSS, 9262 .doit = nl80211_leave_ibss, 9263 .policy = nl80211_policy, 9264 .flags = GENL_ADMIN_PERM, 9265 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9266 NL80211_FLAG_NEED_RTNL, 9267 }, 9268 #ifdef CONFIG_NL80211_TESTMODE 9269 { 9270 .cmd = NL80211_CMD_TESTMODE, 9271 .doit = nl80211_testmode_do, 9272 .dumpit = nl80211_testmode_dump, 9273 .policy = nl80211_policy, 9274 .flags = GENL_ADMIN_PERM, 9275 .internal_flags = NL80211_FLAG_NEED_WIPHY | 9276 NL80211_FLAG_NEED_RTNL, 9277 }, 9278 #endif 9279 { 9280 .cmd = NL80211_CMD_CONNECT, 9281 .doit = nl80211_connect, 9282 .policy = nl80211_policy, 9283 .flags = GENL_ADMIN_PERM, 9284 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9285 NL80211_FLAG_NEED_RTNL, 9286 }, 9287 { 9288 .cmd = NL80211_CMD_DISCONNECT, 9289 .doit = nl80211_disconnect, 9290 .policy = nl80211_policy, 9291 .flags = GENL_ADMIN_PERM, 9292 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9293 NL80211_FLAG_NEED_RTNL, 9294 }, 9295 { 9296 .cmd = NL80211_CMD_SET_WIPHY_NETNS, 9297 .doit = nl80211_wiphy_netns, 9298 .policy = nl80211_policy, 9299 .flags = GENL_ADMIN_PERM, 9300 .internal_flags = NL80211_FLAG_NEED_WIPHY | 9301 NL80211_FLAG_NEED_RTNL, 9302 }, 9303 { 9304 .cmd = NL80211_CMD_GET_SURVEY, 9305 .policy = nl80211_policy, 9306 .dumpit = nl80211_dump_survey, 9307 }, 9308 { 9309 .cmd = NL80211_CMD_SET_PMKSA, 9310 .doit = nl80211_setdel_pmksa, 9311 .policy = nl80211_policy, 9312 .flags = GENL_ADMIN_PERM, 9313 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9314 NL80211_FLAG_NEED_RTNL, 9315 }, 9316 { 9317 .cmd = NL80211_CMD_DEL_PMKSA, 9318 .doit = nl80211_setdel_pmksa, 9319 .policy = nl80211_policy, 9320 .flags = GENL_ADMIN_PERM, 9321 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9322 NL80211_FLAG_NEED_RTNL, 9323 }, 9324 { 9325 .cmd = NL80211_CMD_FLUSH_PMKSA, 9326 .doit = nl80211_flush_pmksa, 9327 .policy = nl80211_policy, 9328 .flags = GENL_ADMIN_PERM, 9329 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9330 NL80211_FLAG_NEED_RTNL, 9331 }, 9332 { 9333 .cmd = NL80211_CMD_REMAIN_ON_CHANNEL, 9334 .doit = nl80211_remain_on_channel, 9335 .policy = nl80211_policy, 9336 .flags = GENL_ADMIN_PERM, 9337 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 9338 NL80211_FLAG_NEED_RTNL, 9339 }, 9340 { 9341 .cmd = NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 9342 .doit = nl80211_cancel_remain_on_channel, 9343 .policy = nl80211_policy, 9344 .flags = GENL_ADMIN_PERM, 9345 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 9346 NL80211_FLAG_NEED_RTNL, 9347 }, 9348 { 9349 .cmd = NL80211_CMD_SET_TX_BITRATE_MASK, 9350 .doit = nl80211_set_tx_bitrate_mask, 9351 .policy = nl80211_policy, 9352 .flags = GENL_ADMIN_PERM, 9353 .internal_flags = NL80211_FLAG_NEED_NETDEV | 9354 NL80211_FLAG_NEED_RTNL, 9355 }, 9356 { 9357 .cmd = NL80211_CMD_REGISTER_FRAME, 9358 .doit = nl80211_register_mgmt, 9359 .policy = nl80211_policy, 9360 .flags = GENL_ADMIN_PERM, 9361 .internal_flags = NL80211_FLAG_NEED_WDEV | 9362 NL80211_FLAG_NEED_RTNL, 9363 }, 9364 { 9365 .cmd = NL80211_CMD_FRAME, 9366 .doit = nl80211_tx_mgmt, 9367 .policy = nl80211_policy, 9368 .flags = GENL_ADMIN_PERM, 9369 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 9370 NL80211_FLAG_NEED_RTNL, 9371 }, 9372 { 9373 .cmd = NL80211_CMD_FRAME_WAIT_CANCEL, 9374 .doit = nl80211_tx_mgmt_cancel_wait, 9375 .policy = nl80211_policy, 9376 .flags = GENL_ADMIN_PERM, 9377 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 9378 NL80211_FLAG_NEED_RTNL, 9379 }, 9380 { 9381 .cmd = NL80211_CMD_SET_POWER_SAVE, 9382 .doit = nl80211_set_power_save, 9383 .policy = nl80211_policy, 9384 .flags = GENL_ADMIN_PERM, 9385 .internal_flags = NL80211_FLAG_NEED_NETDEV | 9386 NL80211_FLAG_NEED_RTNL, 9387 }, 9388 { 9389 .cmd = NL80211_CMD_GET_POWER_SAVE, 9390 .doit = nl80211_get_power_save, 9391 .policy = nl80211_policy, 9392 /* can be retrieved by unprivileged users */ 9393 .internal_flags = NL80211_FLAG_NEED_NETDEV | 9394 NL80211_FLAG_NEED_RTNL, 9395 }, 9396 { 9397 .cmd = NL80211_CMD_SET_CQM, 9398 .doit = nl80211_set_cqm, 9399 .policy = nl80211_policy, 9400 .flags = GENL_ADMIN_PERM, 9401 .internal_flags = NL80211_FLAG_NEED_NETDEV | 9402 NL80211_FLAG_NEED_RTNL, 9403 }, 9404 { 9405 .cmd = NL80211_CMD_SET_CHANNEL, 9406 .doit = nl80211_set_channel, 9407 .policy = nl80211_policy, 9408 .flags = GENL_ADMIN_PERM, 9409 .internal_flags = NL80211_FLAG_NEED_NETDEV | 9410 NL80211_FLAG_NEED_RTNL, 9411 }, 9412 { 9413 .cmd = NL80211_CMD_SET_WDS_PEER, 9414 .doit = nl80211_set_wds_peer, 9415 .policy = nl80211_policy, 9416 .flags = GENL_ADMIN_PERM, 9417 .internal_flags = NL80211_FLAG_NEED_NETDEV | 9418 NL80211_FLAG_NEED_RTNL, 9419 }, 9420 { 9421 .cmd = NL80211_CMD_JOIN_MESH, 9422 .doit = nl80211_join_mesh, 9423 .policy = nl80211_policy, 9424 .flags = GENL_ADMIN_PERM, 9425 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9426 NL80211_FLAG_NEED_RTNL, 9427 }, 9428 { 9429 .cmd = NL80211_CMD_LEAVE_MESH, 9430 .doit = nl80211_leave_mesh, 9431 .policy = nl80211_policy, 9432 .flags = GENL_ADMIN_PERM, 9433 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9434 NL80211_FLAG_NEED_RTNL, 9435 }, 9436 #ifdef CONFIG_PM 9437 { 9438 .cmd = NL80211_CMD_GET_WOWLAN, 9439 .doit = nl80211_get_wowlan, 9440 .policy = nl80211_policy, 9441 /* can be retrieved by unprivileged users */ 9442 .internal_flags = NL80211_FLAG_NEED_WIPHY | 9443 NL80211_FLAG_NEED_RTNL, 9444 }, 9445 { 9446 .cmd = NL80211_CMD_SET_WOWLAN, 9447 .doit = nl80211_set_wowlan, 9448 .policy = nl80211_policy, 9449 .flags = GENL_ADMIN_PERM, 9450 .internal_flags = NL80211_FLAG_NEED_WIPHY | 9451 NL80211_FLAG_NEED_RTNL, 9452 }, 9453 #endif 9454 { 9455 .cmd = NL80211_CMD_SET_REKEY_OFFLOAD, 9456 .doit = nl80211_set_rekey_data, 9457 .policy = nl80211_policy, 9458 .flags = GENL_ADMIN_PERM, 9459 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9460 NL80211_FLAG_NEED_RTNL, 9461 }, 9462 { 9463 .cmd = NL80211_CMD_TDLS_MGMT, 9464 .doit = nl80211_tdls_mgmt, 9465 .policy = nl80211_policy, 9466 .flags = GENL_ADMIN_PERM, 9467 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9468 NL80211_FLAG_NEED_RTNL, 9469 }, 9470 { 9471 .cmd = NL80211_CMD_TDLS_OPER, 9472 .doit = nl80211_tdls_oper, 9473 .policy = nl80211_policy, 9474 .flags = GENL_ADMIN_PERM, 9475 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9476 NL80211_FLAG_NEED_RTNL, 9477 }, 9478 { 9479 .cmd = NL80211_CMD_UNEXPECTED_FRAME, 9480 .doit = nl80211_register_unexpected_frame, 9481 .policy = nl80211_policy, 9482 .flags = GENL_ADMIN_PERM, 9483 .internal_flags = NL80211_FLAG_NEED_NETDEV | 9484 NL80211_FLAG_NEED_RTNL, 9485 }, 9486 { 9487 .cmd = NL80211_CMD_PROBE_CLIENT, 9488 .doit = nl80211_probe_client, 9489 .policy = nl80211_policy, 9490 .flags = GENL_ADMIN_PERM, 9491 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9492 NL80211_FLAG_NEED_RTNL, 9493 }, 9494 { 9495 .cmd = NL80211_CMD_REGISTER_BEACONS, 9496 .doit = nl80211_register_beacons, 9497 .policy = nl80211_policy, 9498 .flags = GENL_ADMIN_PERM, 9499 .internal_flags = NL80211_FLAG_NEED_WIPHY | 9500 NL80211_FLAG_NEED_RTNL, 9501 }, 9502 { 9503 .cmd = NL80211_CMD_SET_NOACK_MAP, 9504 .doit = nl80211_set_noack_map, 9505 .policy = nl80211_policy, 9506 .flags = GENL_ADMIN_PERM, 9507 .internal_flags = NL80211_FLAG_NEED_NETDEV | 9508 NL80211_FLAG_NEED_RTNL, 9509 }, 9510 { 9511 .cmd = NL80211_CMD_START_P2P_DEVICE, 9512 .doit = nl80211_start_p2p_device, 9513 .policy = nl80211_policy, 9514 .flags = GENL_ADMIN_PERM, 9515 .internal_flags = NL80211_FLAG_NEED_WDEV | 9516 NL80211_FLAG_NEED_RTNL, 9517 }, 9518 { 9519 .cmd = NL80211_CMD_STOP_P2P_DEVICE, 9520 .doit = nl80211_stop_p2p_device, 9521 .policy = nl80211_policy, 9522 .flags = GENL_ADMIN_PERM, 9523 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 9524 NL80211_FLAG_NEED_RTNL, 9525 }, 9526 { 9527 .cmd = NL80211_CMD_SET_MCAST_RATE, 9528 .doit = nl80211_set_mcast_rate, 9529 .policy = nl80211_policy, 9530 .flags = GENL_ADMIN_PERM, 9531 .internal_flags = NL80211_FLAG_NEED_NETDEV | 9532 NL80211_FLAG_NEED_RTNL, 9533 }, 9534 { 9535 .cmd = NL80211_CMD_SET_MAC_ACL, 9536 .doit = nl80211_set_mac_acl, 9537 .policy = nl80211_policy, 9538 .flags = GENL_ADMIN_PERM, 9539 .internal_flags = NL80211_FLAG_NEED_NETDEV | 9540 NL80211_FLAG_NEED_RTNL, 9541 }, 9542 { 9543 .cmd = NL80211_CMD_RADAR_DETECT, 9544 .doit = nl80211_start_radar_detection, 9545 .policy = nl80211_policy, 9546 .flags = GENL_ADMIN_PERM, 9547 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9548 NL80211_FLAG_NEED_RTNL, 9549 }, 9550 { 9551 .cmd = NL80211_CMD_GET_PROTOCOL_FEATURES, 9552 .doit = nl80211_get_protocol_features, 9553 .policy = nl80211_policy, 9554 }, 9555 { 9556 .cmd = NL80211_CMD_UPDATE_FT_IES, 9557 .doit = nl80211_update_ft_ies, 9558 .policy = nl80211_policy, 9559 .flags = GENL_ADMIN_PERM, 9560 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9561 NL80211_FLAG_NEED_RTNL, 9562 }, 9563 { 9564 .cmd = NL80211_CMD_CRIT_PROTOCOL_START, 9565 .doit = nl80211_crit_protocol_start, 9566 .policy = nl80211_policy, 9567 .flags = GENL_ADMIN_PERM, 9568 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 9569 NL80211_FLAG_NEED_RTNL, 9570 }, 9571 { 9572 .cmd = NL80211_CMD_CRIT_PROTOCOL_STOP, 9573 .doit = nl80211_crit_protocol_stop, 9574 .policy = nl80211_policy, 9575 .flags = GENL_ADMIN_PERM, 9576 .internal_flags = NL80211_FLAG_NEED_WDEV_UP | 9577 NL80211_FLAG_NEED_RTNL, 9578 }, 9579 { 9580 .cmd = NL80211_CMD_GET_COALESCE, 9581 .doit = nl80211_get_coalesce, 9582 .policy = nl80211_policy, 9583 .internal_flags = NL80211_FLAG_NEED_WIPHY | 9584 NL80211_FLAG_NEED_RTNL, 9585 }, 9586 { 9587 .cmd = NL80211_CMD_SET_COALESCE, 9588 .doit = nl80211_set_coalesce, 9589 .policy = nl80211_policy, 9590 .flags = GENL_ADMIN_PERM, 9591 .internal_flags = NL80211_FLAG_NEED_WIPHY | 9592 NL80211_FLAG_NEED_RTNL, 9593 }, 9594 { 9595 .cmd = NL80211_CMD_CHANNEL_SWITCH, 9596 .doit = nl80211_channel_switch, 9597 .policy = nl80211_policy, 9598 .flags = GENL_ADMIN_PERM, 9599 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | 9600 NL80211_FLAG_NEED_RTNL, 9601 }, 9602 }; 9603 9604 /* notification functions */ 9605 9606 void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev) 9607 { 9608 struct sk_buff *msg; 9609 struct nl80211_dump_wiphy_state state = {}; 9610 9611 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9612 if (!msg) 9613 return; 9614 9615 if (nl80211_send_wiphy(rdev, msg, 0, 0, 0, &state) < 0) { 9616 nlmsg_free(msg); 9617 return; 9618 } 9619 9620 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 9621 NL80211_MCGRP_CONFIG, GFP_KERNEL); 9622 } 9623 9624 static int nl80211_add_scan_req(struct sk_buff *msg, 9625 struct cfg80211_registered_device *rdev) 9626 { 9627 struct cfg80211_scan_request *req = rdev->scan_req; 9628 struct nlattr *nest; 9629 int i; 9630 9631 if (WARN_ON(!req)) 9632 return 0; 9633 9634 nest = nla_nest_start(msg, NL80211_ATTR_SCAN_SSIDS); 9635 if (!nest) 9636 goto nla_put_failure; 9637 for (i = 0; i < req->n_ssids; i++) { 9638 if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid)) 9639 goto nla_put_failure; 9640 } 9641 nla_nest_end(msg, nest); 9642 9643 nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES); 9644 if (!nest) 9645 goto nla_put_failure; 9646 for (i = 0; i < req->n_channels; i++) { 9647 if (nla_put_u32(msg, i, req->channels[i]->center_freq)) 9648 goto nla_put_failure; 9649 } 9650 nla_nest_end(msg, nest); 9651 9652 if (req->ie && 9653 nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie)) 9654 goto nla_put_failure; 9655 9656 if (req->flags && 9657 nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags)) 9658 goto nla_put_failure; 9659 9660 return 0; 9661 nla_put_failure: 9662 return -ENOBUFS; 9663 } 9664 9665 static int nl80211_send_scan_msg(struct sk_buff *msg, 9666 struct cfg80211_registered_device *rdev, 9667 struct wireless_dev *wdev, 9668 u32 portid, u32 seq, int flags, 9669 u32 cmd) 9670 { 9671 void *hdr; 9672 9673 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 9674 if (!hdr) 9675 return -1; 9676 9677 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 9678 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 9679 wdev->netdev->ifindex)) || 9680 nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev))) 9681 goto nla_put_failure; 9682 9683 /* ignore errors and send incomplete event anyway */ 9684 nl80211_add_scan_req(msg, rdev); 9685 9686 return genlmsg_end(msg, hdr); 9687 9688 nla_put_failure: 9689 genlmsg_cancel(msg, hdr); 9690 return -EMSGSIZE; 9691 } 9692 9693 static int 9694 nl80211_send_sched_scan_msg(struct sk_buff *msg, 9695 struct cfg80211_registered_device *rdev, 9696 struct net_device *netdev, 9697 u32 portid, u32 seq, int flags, u32 cmd) 9698 { 9699 void *hdr; 9700 9701 hdr = nl80211hdr_put(msg, portid, seq, flags, cmd); 9702 if (!hdr) 9703 return -1; 9704 9705 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 9706 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 9707 goto nla_put_failure; 9708 9709 return genlmsg_end(msg, hdr); 9710 9711 nla_put_failure: 9712 genlmsg_cancel(msg, hdr); 9713 return -EMSGSIZE; 9714 } 9715 9716 void nl80211_send_scan_start(struct cfg80211_registered_device *rdev, 9717 struct wireless_dev *wdev) 9718 { 9719 struct sk_buff *msg; 9720 9721 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9722 if (!msg) 9723 return; 9724 9725 if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0, 9726 NL80211_CMD_TRIGGER_SCAN) < 0) { 9727 nlmsg_free(msg); 9728 return; 9729 } 9730 9731 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 9732 NL80211_MCGRP_SCAN, GFP_KERNEL); 9733 } 9734 9735 void nl80211_send_scan_done(struct cfg80211_registered_device *rdev, 9736 struct wireless_dev *wdev) 9737 { 9738 struct sk_buff *msg; 9739 9740 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9741 if (!msg) 9742 return; 9743 9744 if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0, 9745 NL80211_CMD_NEW_SCAN_RESULTS) < 0) { 9746 nlmsg_free(msg); 9747 return; 9748 } 9749 9750 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 9751 NL80211_MCGRP_SCAN, GFP_KERNEL); 9752 } 9753 9754 void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev, 9755 struct wireless_dev *wdev) 9756 { 9757 struct sk_buff *msg; 9758 9759 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9760 if (!msg) 9761 return; 9762 9763 if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0, 9764 NL80211_CMD_SCAN_ABORTED) < 0) { 9765 nlmsg_free(msg); 9766 return; 9767 } 9768 9769 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 9770 NL80211_MCGRP_SCAN, GFP_KERNEL); 9771 } 9772 9773 void nl80211_send_sched_scan_results(struct cfg80211_registered_device *rdev, 9774 struct net_device *netdev) 9775 { 9776 struct sk_buff *msg; 9777 9778 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9779 if (!msg) 9780 return; 9781 9782 if (nl80211_send_sched_scan_msg(msg, rdev, netdev, 0, 0, 0, 9783 NL80211_CMD_SCHED_SCAN_RESULTS) < 0) { 9784 nlmsg_free(msg); 9785 return; 9786 } 9787 9788 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 9789 NL80211_MCGRP_SCAN, GFP_KERNEL); 9790 } 9791 9792 void nl80211_send_sched_scan(struct cfg80211_registered_device *rdev, 9793 struct net_device *netdev, u32 cmd) 9794 { 9795 struct sk_buff *msg; 9796 9797 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9798 if (!msg) 9799 return; 9800 9801 if (nl80211_send_sched_scan_msg(msg, rdev, netdev, 0, 0, 0, cmd) < 0) { 9802 nlmsg_free(msg); 9803 return; 9804 } 9805 9806 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 9807 NL80211_MCGRP_SCAN, GFP_KERNEL); 9808 } 9809 9810 /* 9811 * This can happen on global regulatory changes or device specific settings 9812 * based on custom world regulatory domains. 9813 */ 9814 void nl80211_send_reg_change_event(struct regulatory_request *request) 9815 { 9816 struct sk_buff *msg; 9817 void *hdr; 9818 9819 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 9820 if (!msg) 9821 return; 9822 9823 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_CHANGE); 9824 if (!hdr) { 9825 nlmsg_free(msg); 9826 return; 9827 } 9828 9829 /* Userspace can always count this one always being set */ 9830 if (nla_put_u8(msg, NL80211_ATTR_REG_INITIATOR, request->initiator)) 9831 goto nla_put_failure; 9832 9833 if (request->alpha2[0] == '0' && request->alpha2[1] == '0') { 9834 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 9835 NL80211_REGDOM_TYPE_WORLD)) 9836 goto nla_put_failure; 9837 } else if (request->alpha2[0] == '9' && request->alpha2[1] == '9') { 9838 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 9839 NL80211_REGDOM_TYPE_CUSTOM_WORLD)) 9840 goto nla_put_failure; 9841 } else if ((request->alpha2[0] == '9' && request->alpha2[1] == '8') || 9842 request->intersect) { 9843 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 9844 NL80211_REGDOM_TYPE_INTERSECTION)) 9845 goto nla_put_failure; 9846 } else { 9847 if (nla_put_u8(msg, NL80211_ATTR_REG_TYPE, 9848 NL80211_REGDOM_TYPE_COUNTRY) || 9849 nla_put_string(msg, NL80211_ATTR_REG_ALPHA2, 9850 request->alpha2)) 9851 goto nla_put_failure; 9852 } 9853 9854 if (request->wiphy_idx != WIPHY_IDX_INVALID && 9855 nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) 9856 goto nla_put_failure; 9857 9858 genlmsg_end(msg, hdr); 9859 9860 rcu_read_lock(); 9861 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 9862 NL80211_MCGRP_REGULATORY, GFP_ATOMIC); 9863 rcu_read_unlock(); 9864 9865 return; 9866 9867 nla_put_failure: 9868 genlmsg_cancel(msg, hdr); 9869 nlmsg_free(msg); 9870 } 9871 9872 static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev, 9873 struct net_device *netdev, 9874 const u8 *buf, size_t len, 9875 enum nl80211_commands cmd, gfp_t gfp) 9876 { 9877 struct sk_buff *msg; 9878 void *hdr; 9879 9880 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 9881 if (!msg) 9882 return; 9883 9884 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 9885 if (!hdr) { 9886 nlmsg_free(msg); 9887 return; 9888 } 9889 9890 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 9891 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 9892 nla_put(msg, NL80211_ATTR_FRAME, len, buf)) 9893 goto nla_put_failure; 9894 9895 genlmsg_end(msg, hdr); 9896 9897 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 9898 NL80211_MCGRP_MLME, gfp); 9899 return; 9900 9901 nla_put_failure: 9902 genlmsg_cancel(msg, hdr); 9903 nlmsg_free(msg); 9904 } 9905 9906 void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev, 9907 struct net_device *netdev, const u8 *buf, 9908 size_t len, gfp_t gfp) 9909 { 9910 nl80211_send_mlme_event(rdev, netdev, buf, len, 9911 NL80211_CMD_AUTHENTICATE, gfp); 9912 } 9913 9914 void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev, 9915 struct net_device *netdev, const u8 *buf, 9916 size_t len, gfp_t gfp) 9917 { 9918 nl80211_send_mlme_event(rdev, netdev, buf, len, 9919 NL80211_CMD_ASSOCIATE, gfp); 9920 } 9921 9922 void nl80211_send_deauth(struct cfg80211_registered_device *rdev, 9923 struct net_device *netdev, const u8 *buf, 9924 size_t len, gfp_t gfp) 9925 { 9926 nl80211_send_mlme_event(rdev, netdev, buf, len, 9927 NL80211_CMD_DEAUTHENTICATE, gfp); 9928 } 9929 9930 void nl80211_send_disassoc(struct cfg80211_registered_device *rdev, 9931 struct net_device *netdev, const u8 *buf, 9932 size_t len, gfp_t gfp) 9933 { 9934 nl80211_send_mlme_event(rdev, netdev, buf, len, 9935 NL80211_CMD_DISASSOCIATE, gfp); 9936 } 9937 9938 void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf, 9939 size_t len) 9940 { 9941 struct wireless_dev *wdev = dev->ieee80211_ptr; 9942 struct wiphy *wiphy = wdev->wiphy; 9943 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 9944 const struct ieee80211_mgmt *mgmt = (void *)buf; 9945 u32 cmd; 9946 9947 if (WARN_ON(len < 2)) 9948 return; 9949 9950 if (ieee80211_is_deauth(mgmt->frame_control)) 9951 cmd = NL80211_CMD_UNPROT_DEAUTHENTICATE; 9952 else 9953 cmd = NL80211_CMD_UNPROT_DISASSOCIATE; 9954 9955 trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len); 9956 nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC); 9957 } 9958 EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt); 9959 9960 static void nl80211_send_mlme_timeout(struct cfg80211_registered_device *rdev, 9961 struct net_device *netdev, int cmd, 9962 const u8 *addr, gfp_t gfp) 9963 { 9964 struct sk_buff *msg; 9965 void *hdr; 9966 9967 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 9968 if (!msg) 9969 return; 9970 9971 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 9972 if (!hdr) { 9973 nlmsg_free(msg); 9974 return; 9975 } 9976 9977 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 9978 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 9979 nla_put_flag(msg, NL80211_ATTR_TIMED_OUT) || 9980 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) 9981 goto nla_put_failure; 9982 9983 genlmsg_end(msg, hdr); 9984 9985 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 9986 NL80211_MCGRP_MLME, gfp); 9987 return; 9988 9989 nla_put_failure: 9990 genlmsg_cancel(msg, hdr); 9991 nlmsg_free(msg); 9992 } 9993 9994 void nl80211_send_auth_timeout(struct cfg80211_registered_device *rdev, 9995 struct net_device *netdev, const u8 *addr, 9996 gfp_t gfp) 9997 { 9998 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_AUTHENTICATE, 9999 addr, gfp); 10000 } 10001 10002 void nl80211_send_assoc_timeout(struct cfg80211_registered_device *rdev, 10003 struct net_device *netdev, const u8 *addr, 10004 gfp_t gfp) 10005 { 10006 nl80211_send_mlme_timeout(rdev, netdev, NL80211_CMD_ASSOCIATE, 10007 addr, gfp); 10008 } 10009 10010 void nl80211_send_connect_result(struct cfg80211_registered_device *rdev, 10011 struct net_device *netdev, const u8 *bssid, 10012 const u8 *req_ie, size_t req_ie_len, 10013 const u8 *resp_ie, size_t resp_ie_len, 10014 u16 status, gfp_t gfp) 10015 { 10016 struct sk_buff *msg; 10017 void *hdr; 10018 10019 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 10020 if (!msg) 10021 return; 10022 10023 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONNECT); 10024 if (!hdr) { 10025 nlmsg_free(msg); 10026 return; 10027 } 10028 10029 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 10030 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 10031 (bssid && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) || 10032 nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, status) || 10033 (req_ie && 10034 nla_put(msg, NL80211_ATTR_REQ_IE, req_ie_len, req_ie)) || 10035 (resp_ie && 10036 nla_put(msg, NL80211_ATTR_RESP_IE, resp_ie_len, resp_ie))) 10037 goto nla_put_failure; 10038 10039 genlmsg_end(msg, hdr); 10040 10041 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 10042 NL80211_MCGRP_MLME, gfp); 10043 return; 10044 10045 nla_put_failure: 10046 genlmsg_cancel(msg, hdr); 10047 nlmsg_free(msg); 10048 10049 } 10050 10051 void nl80211_send_roamed(struct cfg80211_registered_device *rdev, 10052 struct net_device *netdev, const u8 *bssid, 10053 const u8 *req_ie, size_t req_ie_len, 10054 const u8 *resp_ie, size_t resp_ie_len, gfp_t gfp) 10055 { 10056 struct sk_buff *msg; 10057 void *hdr; 10058 10059 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 10060 if (!msg) 10061 return; 10062 10063 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_ROAM); 10064 if (!hdr) { 10065 nlmsg_free(msg); 10066 return; 10067 } 10068 10069 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 10070 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 10071 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid) || 10072 (req_ie && 10073 nla_put(msg, NL80211_ATTR_REQ_IE, req_ie_len, req_ie)) || 10074 (resp_ie && 10075 nla_put(msg, NL80211_ATTR_RESP_IE, resp_ie_len, resp_ie))) 10076 goto nla_put_failure; 10077 10078 genlmsg_end(msg, hdr); 10079 10080 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 10081 NL80211_MCGRP_MLME, gfp); 10082 return; 10083 10084 nla_put_failure: 10085 genlmsg_cancel(msg, hdr); 10086 nlmsg_free(msg); 10087 10088 } 10089 10090 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev, 10091 struct net_device *netdev, u16 reason, 10092 const u8 *ie, size_t ie_len, bool from_ap) 10093 { 10094 struct sk_buff *msg; 10095 void *hdr; 10096 10097 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 10098 if (!msg) 10099 return; 10100 10101 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DISCONNECT); 10102 if (!hdr) { 10103 nlmsg_free(msg); 10104 return; 10105 } 10106 10107 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 10108 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 10109 (from_ap && reason && 10110 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason)) || 10111 (from_ap && 10112 nla_put_flag(msg, NL80211_ATTR_DISCONNECTED_BY_AP)) || 10113 (ie && nla_put(msg, NL80211_ATTR_IE, ie_len, ie))) 10114 goto nla_put_failure; 10115 10116 genlmsg_end(msg, hdr); 10117 10118 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 10119 NL80211_MCGRP_MLME, GFP_KERNEL); 10120 return; 10121 10122 nla_put_failure: 10123 genlmsg_cancel(msg, hdr); 10124 nlmsg_free(msg); 10125 10126 } 10127 10128 void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev, 10129 struct net_device *netdev, const u8 *bssid, 10130 gfp_t gfp) 10131 { 10132 struct sk_buff *msg; 10133 void *hdr; 10134 10135 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 10136 if (!msg) 10137 return; 10138 10139 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_JOIN_IBSS); 10140 if (!hdr) { 10141 nlmsg_free(msg); 10142 return; 10143 } 10144 10145 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 10146 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 10147 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 10148 goto nla_put_failure; 10149 10150 genlmsg_end(msg, hdr); 10151 10152 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 10153 NL80211_MCGRP_MLME, gfp); 10154 return; 10155 10156 nla_put_failure: 10157 genlmsg_cancel(msg, hdr); 10158 nlmsg_free(msg); 10159 } 10160 10161 void cfg80211_notify_new_peer_candidate(struct net_device *dev, const u8 *addr, 10162 const u8* ie, u8 ie_len, gfp_t gfp) 10163 { 10164 struct wireless_dev *wdev = dev->ieee80211_ptr; 10165 struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); 10166 struct sk_buff *msg; 10167 void *hdr; 10168 10169 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT)) 10170 return; 10171 10172 trace_cfg80211_notify_new_peer_candidate(dev, addr); 10173 10174 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 10175 if (!msg) 10176 return; 10177 10178 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NEW_PEER_CANDIDATE); 10179 if (!hdr) { 10180 nlmsg_free(msg); 10181 return; 10182 } 10183 10184 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 10185 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 10186 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 10187 (ie_len && ie && 10188 nla_put(msg, NL80211_ATTR_IE, ie_len , ie))) 10189 goto nla_put_failure; 10190 10191 genlmsg_end(msg, hdr); 10192 10193 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 10194 NL80211_MCGRP_MLME, gfp); 10195 return; 10196 10197 nla_put_failure: 10198 genlmsg_cancel(msg, hdr); 10199 nlmsg_free(msg); 10200 } 10201 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate); 10202 10203 void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev, 10204 struct net_device *netdev, const u8 *addr, 10205 enum nl80211_key_type key_type, int key_id, 10206 const u8 *tsc, gfp_t gfp) 10207 { 10208 struct sk_buff *msg; 10209 void *hdr; 10210 10211 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 10212 if (!msg) 10213 return; 10214 10215 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_MICHAEL_MIC_FAILURE); 10216 if (!hdr) { 10217 nlmsg_free(msg); 10218 return; 10219 } 10220 10221 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 10222 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 10223 (addr && nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) || 10224 nla_put_u32(msg, NL80211_ATTR_KEY_TYPE, key_type) || 10225 (key_id != -1 && 10226 nla_put_u8(msg, NL80211_ATTR_KEY_IDX, key_id)) || 10227 (tsc && nla_put(msg, NL80211_ATTR_KEY_SEQ, 6, tsc))) 10228 goto nla_put_failure; 10229 10230 genlmsg_end(msg, hdr); 10231 10232 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 10233 NL80211_MCGRP_MLME, gfp); 10234 return; 10235 10236 nla_put_failure: 10237 genlmsg_cancel(msg, hdr); 10238 nlmsg_free(msg); 10239 } 10240 10241 void nl80211_send_beacon_hint_event(struct wiphy *wiphy, 10242 struct ieee80211_channel *channel_before, 10243 struct ieee80211_channel *channel_after) 10244 { 10245 struct sk_buff *msg; 10246 void *hdr; 10247 struct nlattr *nl_freq; 10248 10249 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); 10250 if (!msg) 10251 return; 10252 10253 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_REG_BEACON_HINT); 10254 if (!hdr) { 10255 nlmsg_free(msg); 10256 return; 10257 } 10258 10259 /* 10260 * Since we are applying the beacon hint to a wiphy we know its 10261 * wiphy_idx is valid 10262 */ 10263 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) 10264 goto nla_put_failure; 10265 10266 /* Before */ 10267 nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_BEFORE); 10268 if (!nl_freq) 10269 goto nla_put_failure; 10270 if (nl80211_msg_put_channel(msg, channel_before, false)) 10271 goto nla_put_failure; 10272 nla_nest_end(msg, nl_freq); 10273 10274 /* After */ 10275 nl_freq = nla_nest_start(msg, NL80211_ATTR_FREQ_AFTER); 10276 if (!nl_freq) 10277 goto nla_put_failure; 10278 if (nl80211_msg_put_channel(msg, channel_after, false)) 10279 goto nla_put_failure; 10280 nla_nest_end(msg, nl_freq); 10281 10282 genlmsg_end(msg, hdr); 10283 10284 rcu_read_lock(); 10285 genlmsg_multicast_allns(&nl80211_fam, msg, 0, 10286 NL80211_MCGRP_REGULATORY, GFP_ATOMIC); 10287 rcu_read_unlock(); 10288 10289 return; 10290 10291 nla_put_failure: 10292 genlmsg_cancel(msg, hdr); 10293 nlmsg_free(msg); 10294 } 10295 10296 static void nl80211_send_remain_on_chan_event( 10297 int cmd, struct cfg80211_registered_device *rdev, 10298 struct wireless_dev *wdev, u64 cookie, 10299 struct ieee80211_channel *chan, 10300 unsigned int duration, gfp_t gfp) 10301 { 10302 struct sk_buff *msg; 10303 void *hdr; 10304 10305 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 10306 if (!msg) 10307 return; 10308 10309 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 10310 if (!hdr) { 10311 nlmsg_free(msg); 10312 return; 10313 } 10314 10315 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 10316 (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 10317 wdev->netdev->ifindex)) || 10318 nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) || 10319 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, chan->center_freq) || 10320 nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, 10321 NL80211_CHAN_NO_HT) || 10322 nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie)) 10323 goto nla_put_failure; 10324 10325 if (cmd == NL80211_CMD_REMAIN_ON_CHANNEL && 10326 nla_put_u32(msg, NL80211_ATTR_DURATION, duration)) 10327 goto nla_put_failure; 10328 10329 genlmsg_end(msg, hdr); 10330 10331 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 10332 NL80211_MCGRP_MLME, gfp); 10333 return; 10334 10335 nla_put_failure: 10336 genlmsg_cancel(msg, hdr); 10337 nlmsg_free(msg); 10338 } 10339 10340 void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie, 10341 struct ieee80211_channel *chan, 10342 unsigned int duration, gfp_t gfp) 10343 { 10344 struct wiphy *wiphy = wdev->wiphy; 10345 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 10346 10347 trace_cfg80211_ready_on_channel(wdev, cookie, chan, duration); 10348 nl80211_send_remain_on_chan_event(NL80211_CMD_REMAIN_ON_CHANNEL, 10349 rdev, wdev, cookie, chan, 10350 duration, gfp); 10351 } 10352 EXPORT_SYMBOL(cfg80211_ready_on_channel); 10353 10354 void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie, 10355 struct ieee80211_channel *chan, 10356 gfp_t gfp) 10357 { 10358 struct wiphy *wiphy = wdev->wiphy; 10359 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 10360 10361 trace_cfg80211_ready_on_channel_expired(wdev, cookie, chan); 10362 nl80211_send_remain_on_chan_event(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL, 10363 rdev, wdev, cookie, chan, 0, gfp); 10364 } 10365 EXPORT_SYMBOL(cfg80211_remain_on_channel_expired); 10366 10367 void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr, 10368 struct station_info *sinfo, gfp_t gfp) 10369 { 10370 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 10371 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 10372 struct sk_buff *msg; 10373 10374 trace_cfg80211_new_sta(dev, mac_addr, sinfo); 10375 10376 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 10377 if (!msg) 10378 return; 10379 10380 if (nl80211_send_station(msg, 0, 0, 0, 10381 rdev, dev, mac_addr, sinfo) < 0) { 10382 nlmsg_free(msg); 10383 return; 10384 } 10385 10386 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 10387 NL80211_MCGRP_MLME, gfp); 10388 } 10389 EXPORT_SYMBOL(cfg80211_new_sta); 10390 10391 void cfg80211_del_sta(struct net_device *dev, const u8 *mac_addr, gfp_t gfp) 10392 { 10393 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 10394 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 10395 struct sk_buff *msg; 10396 void *hdr; 10397 10398 trace_cfg80211_del_sta(dev, mac_addr); 10399 10400 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 10401 if (!msg) 10402 return; 10403 10404 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_DEL_STATION); 10405 if (!hdr) { 10406 nlmsg_free(msg); 10407 return; 10408 } 10409 10410 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 10411 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr)) 10412 goto nla_put_failure; 10413 10414 genlmsg_end(msg, hdr); 10415 10416 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 10417 NL80211_MCGRP_MLME, gfp); 10418 return; 10419 10420 nla_put_failure: 10421 genlmsg_cancel(msg, hdr); 10422 nlmsg_free(msg); 10423 } 10424 EXPORT_SYMBOL(cfg80211_del_sta); 10425 10426 void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr, 10427 enum nl80211_connect_failed_reason reason, 10428 gfp_t gfp) 10429 { 10430 struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; 10431 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 10432 struct sk_buff *msg; 10433 void *hdr; 10434 10435 msg = nlmsg_new(NLMSG_GOODSIZE, gfp); 10436 if (!msg) 10437 return; 10438 10439 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED); 10440 if (!hdr) { 10441 nlmsg_free(msg); 10442 return; 10443 } 10444 10445 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 10446 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || 10447 nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason)) 10448 goto nla_put_failure; 10449 10450 genlmsg_end(msg, hdr); 10451 10452 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 10453 NL80211_MCGRP_MLME, gfp); 10454 return; 10455 10456 nla_put_failure: 10457 genlmsg_cancel(msg, hdr); 10458 nlmsg_free(msg); 10459 } 10460 EXPORT_SYMBOL(cfg80211_conn_failed); 10461 10462 static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd, 10463 const u8 *addr, gfp_t gfp) 10464 { 10465 struct wireless_dev *wdev = dev->ieee80211_ptr; 10466 struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); 10467 struct sk_buff *msg; 10468 void *hdr; 10469 u32 nlportid = ACCESS_ONCE(wdev->ap_unexpected_nlportid); 10470 10471 if (!nlportid) 10472 return false; 10473 10474 msg = nlmsg_new(100, gfp); 10475 if (!msg) 10476 return true; 10477 10478 hdr = nl80211hdr_put(msg, 0, 0, 0, cmd); 10479 if (!hdr) { 10480 nlmsg_free(msg); 10481 return true; 10482 } 10483 10484 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 10485 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 10486 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr)) 10487 goto nla_put_failure; 10488 10489 genlmsg_end(msg, hdr); 10490 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 10491 return true; 10492 10493 nla_put_failure: 10494 genlmsg_cancel(msg, hdr); 10495 nlmsg_free(msg); 10496 return true; 10497 } 10498 10499 bool cfg80211_rx_spurious_frame(struct net_device *dev, 10500 const u8 *addr, gfp_t gfp) 10501 { 10502 struct wireless_dev *wdev = dev->ieee80211_ptr; 10503 bool ret; 10504 10505 trace_cfg80211_rx_spurious_frame(dev, addr); 10506 10507 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 10508 wdev->iftype != NL80211_IFTYPE_P2P_GO)) { 10509 trace_cfg80211_return_bool(false); 10510 return false; 10511 } 10512 ret = __nl80211_unexpected_frame(dev, NL80211_CMD_UNEXPECTED_FRAME, 10513 addr, gfp); 10514 trace_cfg80211_return_bool(ret); 10515 return ret; 10516 } 10517 EXPORT_SYMBOL(cfg80211_rx_spurious_frame); 10518 10519 bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev, 10520 const u8 *addr, gfp_t gfp) 10521 { 10522 struct wireless_dev *wdev = dev->ieee80211_ptr; 10523 bool ret; 10524 10525 trace_cfg80211_rx_unexpected_4addr_frame(dev, addr); 10526 10527 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 10528 wdev->iftype != NL80211_IFTYPE_P2P_GO && 10529 wdev->iftype != NL80211_IFTYPE_AP_VLAN)) { 10530 trace_cfg80211_return_bool(false); 10531 return false; 10532 } 10533 ret = __nl80211_unexpected_frame(dev, 10534 NL80211_CMD_UNEXPECTED_4ADDR_FRAME, 10535 addr, gfp); 10536 trace_cfg80211_return_bool(ret); 10537 return ret; 10538 } 10539 EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame); 10540 10541 int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, 10542 struct wireless_dev *wdev, u32 nlportid, 10543 int freq, int sig_dbm, 10544 const u8 *buf, size_t len, u32 flags, gfp_t gfp) 10545 { 10546 struct net_device *netdev = wdev->netdev; 10547 struct sk_buff *msg; 10548 void *hdr; 10549 10550 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 10551 if (!msg) 10552 return -ENOMEM; 10553 10554 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 10555 if (!hdr) { 10556 nlmsg_free(msg); 10557 return -ENOMEM; 10558 } 10559 10560 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 10561 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 10562 netdev->ifindex)) || 10563 nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) || 10564 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) || 10565 (sig_dbm && 10566 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) || 10567 nla_put(msg, NL80211_ATTR_FRAME, len, buf) || 10568 (flags && 10569 nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, flags))) 10570 goto nla_put_failure; 10571 10572 genlmsg_end(msg, hdr); 10573 10574 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 10575 10576 nla_put_failure: 10577 genlmsg_cancel(msg, hdr); 10578 nlmsg_free(msg); 10579 return -ENOBUFS; 10580 } 10581 10582 void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie, 10583 const u8 *buf, size_t len, bool ack, gfp_t gfp) 10584 { 10585 struct wiphy *wiphy = wdev->wiphy; 10586 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 10587 struct net_device *netdev = wdev->netdev; 10588 struct sk_buff *msg; 10589 void *hdr; 10590 10591 trace_cfg80211_mgmt_tx_status(wdev, cookie, ack); 10592 10593 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 10594 if (!msg) 10595 return; 10596 10597 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME_TX_STATUS); 10598 if (!hdr) { 10599 nlmsg_free(msg); 10600 return; 10601 } 10602 10603 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 10604 (netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 10605 netdev->ifindex)) || 10606 nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) || 10607 nla_put(msg, NL80211_ATTR_FRAME, len, buf) || 10608 nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie) || 10609 (ack && nla_put_flag(msg, NL80211_ATTR_ACK))) 10610 goto nla_put_failure; 10611 10612 genlmsg_end(msg, hdr); 10613 10614 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 10615 NL80211_MCGRP_MLME, gfp); 10616 return; 10617 10618 nla_put_failure: 10619 genlmsg_cancel(msg, hdr); 10620 nlmsg_free(msg); 10621 } 10622 EXPORT_SYMBOL(cfg80211_mgmt_tx_status); 10623 10624 void cfg80211_cqm_rssi_notify(struct net_device *dev, 10625 enum nl80211_cqm_rssi_threshold_event rssi_event, 10626 gfp_t gfp) 10627 { 10628 struct wireless_dev *wdev = dev->ieee80211_ptr; 10629 struct wiphy *wiphy = wdev->wiphy; 10630 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 10631 struct sk_buff *msg; 10632 struct nlattr *pinfoattr; 10633 void *hdr; 10634 10635 trace_cfg80211_cqm_rssi_notify(dev, rssi_event); 10636 10637 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 10638 if (!msg) 10639 return; 10640 10641 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM); 10642 if (!hdr) { 10643 nlmsg_free(msg); 10644 return; 10645 } 10646 10647 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 10648 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex)) 10649 goto nla_put_failure; 10650 10651 pinfoattr = nla_nest_start(msg, NL80211_ATTR_CQM); 10652 if (!pinfoattr) 10653 goto nla_put_failure; 10654 10655 if (nla_put_u32(msg, NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT, 10656 rssi_event)) 10657 goto nla_put_failure; 10658 10659 nla_nest_end(msg, pinfoattr); 10660 10661 genlmsg_end(msg, hdr); 10662 10663 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 10664 NL80211_MCGRP_MLME, gfp); 10665 return; 10666 10667 nla_put_failure: 10668 genlmsg_cancel(msg, hdr); 10669 nlmsg_free(msg); 10670 } 10671 EXPORT_SYMBOL(cfg80211_cqm_rssi_notify); 10672 10673 static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev, 10674 struct net_device *netdev, const u8 *bssid, 10675 const u8 *replay_ctr, gfp_t gfp) 10676 { 10677 struct sk_buff *msg; 10678 struct nlattr *rekey_attr; 10679 void *hdr; 10680 10681 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 10682 if (!msg) 10683 return; 10684 10685 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_REKEY_OFFLOAD); 10686 if (!hdr) { 10687 nlmsg_free(msg); 10688 return; 10689 } 10690 10691 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 10692 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 10693 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) 10694 goto nla_put_failure; 10695 10696 rekey_attr = nla_nest_start(msg, NL80211_ATTR_REKEY_DATA); 10697 if (!rekey_attr) 10698 goto nla_put_failure; 10699 10700 if (nla_put(msg, NL80211_REKEY_DATA_REPLAY_CTR, 10701 NL80211_REPLAY_CTR_LEN, replay_ctr)) 10702 goto nla_put_failure; 10703 10704 nla_nest_end(msg, rekey_attr); 10705 10706 genlmsg_end(msg, hdr); 10707 10708 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 10709 NL80211_MCGRP_MLME, gfp); 10710 return; 10711 10712 nla_put_failure: 10713 genlmsg_cancel(msg, hdr); 10714 nlmsg_free(msg); 10715 } 10716 10717 void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid, 10718 const u8 *replay_ctr, gfp_t gfp) 10719 { 10720 struct wireless_dev *wdev = dev->ieee80211_ptr; 10721 struct wiphy *wiphy = wdev->wiphy; 10722 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 10723 10724 trace_cfg80211_gtk_rekey_notify(dev, bssid); 10725 nl80211_gtk_rekey_notify(rdev, dev, bssid, replay_ctr, gfp); 10726 } 10727 EXPORT_SYMBOL(cfg80211_gtk_rekey_notify); 10728 10729 static void 10730 nl80211_pmksa_candidate_notify(struct cfg80211_registered_device *rdev, 10731 struct net_device *netdev, int index, 10732 const u8 *bssid, bool preauth, gfp_t gfp) 10733 { 10734 struct sk_buff *msg; 10735 struct nlattr *attr; 10736 void *hdr; 10737 10738 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 10739 if (!msg) 10740 return; 10741 10742 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PMKSA_CANDIDATE); 10743 if (!hdr) { 10744 nlmsg_free(msg); 10745 return; 10746 } 10747 10748 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 10749 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 10750 goto nla_put_failure; 10751 10752 attr = nla_nest_start(msg, NL80211_ATTR_PMKSA_CANDIDATE); 10753 if (!attr) 10754 goto nla_put_failure; 10755 10756 if (nla_put_u32(msg, NL80211_PMKSA_CANDIDATE_INDEX, index) || 10757 nla_put(msg, NL80211_PMKSA_CANDIDATE_BSSID, ETH_ALEN, bssid) || 10758 (preauth && 10759 nla_put_flag(msg, NL80211_PMKSA_CANDIDATE_PREAUTH))) 10760 goto nla_put_failure; 10761 10762 nla_nest_end(msg, attr); 10763 10764 genlmsg_end(msg, hdr); 10765 10766 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 10767 NL80211_MCGRP_MLME, gfp); 10768 return; 10769 10770 nla_put_failure: 10771 genlmsg_cancel(msg, hdr); 10772 nlmsg_free(msg); 10773 } 10774 10775 void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index, 10776 const u8 *bssid, bool preauth, gfp_t gfp) 10777 { 10778 struct wireless_dev *wdev = dev->ieee80211_ptr; 10779 struct wiphy *wiphy = wdev->wiphy; 10780 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 10781 10782 trace_cfg80211_pmksa_candidate_notify(dev, index, bssid, preauth); 10783 nl80211_pmksa_candidate_notify(rdev, dev, index, bssid, preauth, gfp); 10784 } 10785 EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify); 10786 10787 static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev, 10788 struct net_device *netdev, 10789 struct cfg80211_chan_def *chandef, 10790 gfp_t gfp) 10791 { 10792 struct sk_buff *msg; 10793 void *hdr; 10794 10795 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 10796 if (!msg) 10797 return; 10798 10799 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CH_SWITCH_NOTIFY); 10800 if (!hdr) { 10801 nlmsg_free(msg); 10802 return; 10803 } 10804 10805 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex)) 10806 goto nla_put_failure; 10807 10808 if (nl80211_send_chandef(msg, chandef)) 10809 goto nla_put_failure; 10810 10811 genlmsg_end(msg, hdr); 10812 10813 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 10814 NL80211_MCGRP_MLME, gfp); 10815 return; 10816 10817 nla_put_failure: 10818 genlmsg_cancel(msg, hdr); 10819 nlmsg_free(msg); 10820 } 10821 10822 void cfg80211_ch_switch_notify(struct net_device *dev, 10823 struct cfg80211_chan_def *chandef) 10824 { 10825 struct wireless_dev *wdev = dev->ieee80211_ptr; 10826 struct wiphy *wiphy = wdev->wiphy; 10827 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 10828 10829 ASSERT_WDEV_LOCK(wdev); 10830 10831 trace_cfg80211_ch_switch_notify(dev, chandef); 10832 10833 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP && 10834 wdev->iftype != NL80211_IFTYPE_P2P_GO && 10835 wdev->iftype != NL80211_IFTYPE_ADHOC && 10836 wdev->iftype != NL80211_IFTYPE_MESH_POINT)) 10837 return; 10838 10839 wdev->channel = chandef->chan; 10840 nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL); 10841 } 10842 EXPORT_SYMBOL(cfg80211_ch_switch_notify); 10843 10844 void cfg80211_cqm_txe_notify(struct net_device *dev, 10845 const u8 *peer, u32 num_packets, 10846 u32 rate, u32 intvl, gfp_t gfp) 10847 { 10848 struct wireless_dev *wdev = dev->ieee80211_ptr; 10849 struct wiphy *wiphy = wdev->wiphy; 10850 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 10851 struct sk_buff *msg; 10852 struct nlattr *pinfoattr; 10853 void *hdr; 10854 10855 msg = nlmsg_new(NLMSG_GOODSIZE, gfp); 10856 if (!msg) 10857 return; 10858 10859 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM); 10860 if (!hdr) { 10861 nlmsg_free(msg); 10862 return; 10863 } 10864 10865 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 10866 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 10867 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer)) 10868 goto nla_put_failure; 10869 10870 pinfoattr = nla_nest_start(msg, NL80211_ATTR_CQM); 10871 if (!pinfoattr) 10872 goto nla_put_failure; 10873 10874 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_PKTS, num_packets)) 10875 goto nla_put_failure; 10876 10877 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_RATE, rate)) 10878 goto nla_put_failure; 10879 10880 if (nla_put_u32(msg, NL80211_ATTR_CQM_TXE_INTVL, intvl)) 10881 goto nla_put_failure; 10882 10883 nla_nest_end(msg, pinfoattr); 10884 10885 genlmsg_end(msg, hdr); 10886 10887 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 10888 NL80211_MCGRP_MLME, gfp); 10889 return; 10890 10891 nla_put_failure: 10892 genlmsg_cancel(msg, hdr); 10893 nlmsg_free(msg); 10894 } 10895 EXPORT_SYMBOL(cfg80211_cqm_txe_notify); 10896 10897 void 10898 nl80211_radar_notify(struct cfg80211_registered_device *rdev, 10899 const struct cfg80211_chan_def *chandef, 10900 enum nl80211_radar_event event, 10901 struct net_device *netdev, gfp_t gfp) 10902 { 10903 struct sk_buff *msg; 10904 void *hdr; 10905 10906 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 10907 if (!msg) 10908 return; 10909 10910 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_RADAR_DETECT); 10911 if (!hdr) { 10912 nlmsg_free(msg); 10913 return; 10914 } 10915 10916 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx)) 10917 goto nla_put_failure; 10918 10919 /* NOP and radar events don't need a netdev parameter */ 10920 if (netdev) { 10921 struct wireless_dev *wdev = netdev->ieee80211_ptr; 10922 10923 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 10924 nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev))) 10925 goto nla_put_failure; 10926 } 10927 10928 if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event)) 10929 goto nla_put_failure; 10930 10931 if (nl80211_send_chandef(msg, chandef)) 10932 goto nla_put_failure; 10933 10934 genlmsg_end(msg, hdr); 10935 10936 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 10937 NL80211_MCGRP_MLME, gfp); 10938 return; 10939 10940 nla_put_failure: 10941 genlmsg_cancel(msg, hdr); 10942 nlmsg_free(msg); 10943 } 10944 10945 void cfg80211_cqm_pktloss_notify(struct net_device *dev, 10946 const u8 *peer, u32 num_packets, gfp_t gfp) 10947 { 10948 struct wireless_dev *wdev = dev->ieee80211_ptr; 10949 struct wiphy *wiphy = wdev->wiphy; 10950 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 10951 struct sk_buff *msg; 10952 struct nlattr *pinfoattr; 10953 void *hdr; 10954 10955 trace_cfg80211_cqm_pktloss_notify(dev, peer, num_packets); 10956 10957 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 10958 if (!msg) 10959 return; 10960 10961 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NOTIFY_CQM); 10962 if (!hdr) { 10963 nlmsg_free(msg); 10964 return; 10965 } 10966 10967 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 10968 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 10969 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer)) 10970 goto nla_put_failure; 10971 10972 pinfoattr = nla_nest_start(msg, NL80211_ATTR_CQM); 10973 if (!pinfoattr) 10974 goto nla_put_failure; 10975 10976 if (nla_put_u32(msg, NL80211_ATTR_CQM_PKT_LOSS_EVENT, num_packets)) 10977 goto nla_put_failure; 10978 10979 nla_nest_end(msg, pinfoattr); 10980 10981 genlmsg_end(msg, hdr); 10982 10983 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 10984 NL80211_MCGRP_MLME, gfp); 10985 return; 10986 10987 nla_put_failure: 10988 genlmsg_cancel(msg, hdr); 10989 nlmsg_free(msg); 10990 } 10991 EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify); 10992 10993 void cfg80211_probe_status(struct net_device *dev, const u8 *addr, 10994 u64 cookie, bool acked, gfp_t gfp) 10995 { 10996 struct wireless_dev *wdev = dev->ieee80211_ptr; 10997 struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); 10998 struct sk_buff *msg; 10999 void *hdr; 11000 11001 trace_cfg80211_probe_status(dev, addr, cookie, acked); 11002 11003 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 11004 11005 if (!msg) 11006 return; 11007 11008 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_PROBE_CLIENT); 11009 if (!hdr) { 11010 nlmsg_free(msg); 11011 return; 11012 } 11013 11014 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 11015 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 11016 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) || 11017 nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie) || 11018 (acked && nla_put_flag(msg, NL80211_ATTR_ACK))) 11019 goto nla_put_failure; 11020 11021 genlmsg_end(msg, hdr); 11022 11023 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 11024 NL80211_MCGRP_MLME, gfp); 11025 return; 11026 11027 nla_put_failure: 11028 genlmsg_cancel(msg, hdr); 11029 nlmsg_free(msg); 11030 } 11031 EXPORT_SYMBOL(cfg80211_probe_status); 11032 11033 void cfg80211_report_obss_beacon(struct wiphy *wiphy, 11034 const u8 *frame, size_t len, 11035 int freq, int sig_dbm) 11036 { 11037 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 11038 struct sk_buff *msg; 11039 void *hdr; 11040 struct cfg80211_beacon_registration *reg; 11041 11042 trace_cfg80211_report_obss_beacon(wiphy, frame, len, freq, sig_dbm); 11043 11044 spin_lock_bh(&rdev->beacon_registrations_lock); 11045 list_for_each_entry(reg, &rdev->beacon_registrations, list) { 11046 msg = nlmsg_new(len + 100, GFP_ATOMIC); 11047 if (!msg) { 11048 spin_unlock_bh(&rdev->beacon_registrations_lock); 11049 return; 11050 } 11051 11052 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FRAME); 11053 if (!hdr) 11054 goto nla_put_failure; 11055 11056 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 11057 (freq && 11058 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq)) || 11059 (sig_dbm && 11060 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) || 11061 nla_put(msg, NL80211_ATTR_FRAME, len, frame)) 11062 goto nla_put_failure; 11063 11064 genlmsg_end(msg, hdr); 11065 11066 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, reg->nlportid); 11067 } 11068 spin_unlock_bh(&rdev->beacon_registrations_lock); 11069 return; 11070 11071 nla_put_failure: 11072 spin_unlock_bh(&rdev->beacon_registrations_lock); 11073 if (hdr) 11074 genlmsg_cancel(msg, hdr); 11075 nlmsg_free(msg); 11076 } 11077 EXPORT_SYMBOL(cfg80211_report_obss_beacon); 11078 11079 #ifdef CONFIG_PM 11080 void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev, 11081 struct cfg80211_wowlan_wakeup *wakeup, 11082 gfp_t gfp) 11083 { 11084 struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); 11085 struct sk_buff *msg; 11086 void *hdr; 11087 int size = 200; 11088 11089 trace_cfg80211_report_wowlan_wakeup(wdev->wiphy, wdev, wakeup); 11090 11091 if (wakeup) 11092 size += wakeup->packet_present_len; 11093 11094 msg = nlmsg_new(size, gfp); 11095 if (!msg) 11096 return; 11097 11098 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SET_WOWLAN); 11099 if (!hdr) 11100 goto free_msg; 11101 11102 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 11103 nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev))) 11104 goto free_msg; 11105 11106 if (wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX, 11107 wdev->netdev->ifindex)) 11108 goto free_msg; 11109 11110 if (wakeup) { 11111 struct nlattr *reasons; 11112 11113 reasons = nla_nest_start(msg, NL80211_ATTR_WOWLAN_TRIGGERS); 11114 if (!reasons) 11115 goto free_msg; 11116 11117 if (wakeup->disconnect && 11118 nla_put_flag(msg, NL80211_WOWLAN_TRIG_DISCONNECT)) 11119 goto free_msg; 11120 if (wakeup->magic_pkt && 11121 nla_put_flag(msg, NL80211_WOWLAN_TRIG_MAGIC_PKT)) 11122 goto free_msg; 11123 if (wakeup->gtk_rekey_failure && 11124 nla_put_flag(msg, NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE)) 11125 goto free_msg; 11126 if (wakeup->eap_identity_req && 11127 nla_put_flag(msg, NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST)) 11128 goto free_msg; 11129 if (wakeup->four_way_handshake && 11130 nla_put_flag(msg, NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE)) 11131 goto free_msg; 11132 if (wakeup->rfkill_release && 11133 nla_put_flag(msg, NL80211_WOWLAN_TRIG_RFKILL_RELEASE)) 11134 goto free_msg; 11135 11136 if (wakeup->pattern_idx >= 0 && 11137 nla_put_u32(msg, NL80211_WOWLAN_TRIG_PKT_PATTERN, 11138 wakeup->pattern_idx)) 11139 goto free_msg; 11140 11141 if (wakeup->tcp_match && 11142 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH)) 11143 goto free_msg; 11144 11145 if (wakeup->tcp_connlost && 11146 nla_put_flag(msg, NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST)) 11147 goto free_msg; 11148 11149 if (wakeup->tcp_nomoretokens && 11150 nla_put_flag(msg, 11151 NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS)) 11152 goto free_msg; 11153 11154 if (wakeup->packet) { 11155 u32 pkt_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211; 11156 u32 len_attr = NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN; 11157 11158 if (!wakeup->packet_80211) { 11159 pkt_attr = 11160 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023; 11161 len_attr = 11162 NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN; 11163 } 11164 11165 if (wakeup->packet_len && 11166 nla_put_u32(msg, len_attr, wakeup->packet_len)) 11167 goto free_msg; 11168 11169 if (nla_put(msg, pkt_attr, wakeup->packet_present_len, 11170 wakeup->packet)) 11171 goto free_msg; 11172 } 11173 11174 nla_nest_end(msg, reasons); 11175 } 11176 11177 genlmsg_end(msg, hdr); 11178 11179 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 11180 NL80211_MCGRP_MLME, gfp); 11181 return; 11182 11183 free_msg: 11184 nlmsg_free(msg); 11185 } 11186 EXPORT_SYMBOL(cfg80211_report_wowlan_wakeup); 11187 #endif 11188 11189 void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer, 11190 enum nl80211_tdls_operation oper, 11191 u16 reason_code, gfp_t gfp) 11192 { 11193 struct wireless_dev *wdev = dev->ieee80211_ptr; 11194 struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); 11195 struct sk_buff *msg; 11196 void *hdr; 11197 11198 trace_cfg80211_tdls_oper_request(wdev->wiphy, dev, peer, oper, 11199 reason_code); 11200 11201 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 11202 if (!msg) 11203 return; 11204 11205 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_TDLS_OPER); 11206 if (!hdr) { 11207 nlmsg_free(msg); 11208 return; 11209 } 11210 11211 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 11212 nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || 11213 nla_put_u8(msg, NL80211_ATTR_TDLS_OPERATION, oper) || 11214 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, peer) || 11215 (reason_code > 0 && 11216 nla_put_u16(msg, NL80211_ATTR_REASON_CODE, reason_code))) 11217 goto nla_put_failure; 11218 11219 genlmsg_end(msg, hdr); 11220 11221 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 11222 NL80211_MCGRP_MLME, gfp); 11223 return; 11224 11225 nla_put_failure: 11226 genlmsg_cancel(msg, hdr); 11227 nlmsg_free(msg); 11228 } 11229 EXPORT_SYMBOL(cfg80211_tdls_oper_request); 11230 11231 static int nl80211_netlink_notify(struct notifier_block * nb, 11232 unsigned long state, 11233 void *_notify) 11234 { 11235 struct netlink_notify *notify = _notify; 11236 struct cfg80211_registered_device *rdev; 11237 struct wireless_dev *wdev; 11238 struct cfg80211_beacon_registration *reg, *tmp; 11239 11240 if (state != NETLINK_URELEASE) 11241 return NOTIFY_DONE; 11242 11243 rcu_read_lock(); 11244 11245 list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) { 11246 list_for_each_entry_rcu(wdev, &rdev->wdev_list, list) 11247 cfg80211_mlme_unregister_socket(wdev, notify->portid); 11248 11249 spin_lock_bh(&rdev->beacon_registrations_lock); 11250 list_for_each_entry_safe(reg, tmp, &rdev->beacon_registrations, 11251 list) { 11252 if (reg->nlportid == notify->portid) { 11253 list_del(®->list); 11254 kfree(reg); 11255 break; 11256 } 11257 } 11258 spin_unlock_bh(&rdev->beacon_registrations_lock); 11259 } 11260 11261 rcu_read_unlock(); 11262 11263 return NOTIFY_DONE; 11264 } 11265 11266 static struct notifier_block nl80211_netlink_notifier = { 11267 .notifier_call = nl80211_netlink_notify, 11268 }; 11269 11270 void cfg80211_ft_event(struct net_device *netdev, 11271 struct cfg80211_ft_event_params *ft_event) 11272 { 11273 struct wiphy *wiphy = netdev->ieee80211_ptr->wiphy; 11274 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 11275 struct sk_buff *msg; 11276 void *hdr; 11277 11278 trace_cfg80211_ft_event(wiphy, netdev, ft_event); 11279 11280 if (!ft_event->target_ap) 11281 return; 11282 11283 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); 11284 if (!msg) 11285 return; 11286 11287 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_FT_EVENT); 11288 if (!hdr) 11289 goto out; 11290 11291 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 11292 nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex) || 11293 nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, ft_event->target_ap)) 11294 goto out; 11295 11296 if (ft_event->ies && 11297 nla_put(msg, NL80211_ATTR_IE, ft_event->ies_len, ft_event->ies)) 11298 goto out; 11299 if (ft_event->ric_ies && 11300 nla_put(msg, NL80211_ATTR_IE_RIC, ft_event->ric_ies_len, 11301 ft_event->ric_ies)) 11302 goto out; 11303 11304 genlmsg_end(msg, hdr); 11305 11306 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, 11307 NL80211_MCGRP_MLME, GFP_KERNEL); 11308 return; 11309 out: 11310 nlmsg_free(msg); 11311 } 11312 EXPORT_SYMBOL(cfg80211_ft_event); 11313 11314 void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp) 11315 { 11316 struct cfg80211_registered_device *rdev; 11317 struct sk_buff *msg; 11318 void *hdr; 11319 u32 nlportid; 11320 11321 rdev = wiphy_to_dev(wdev->wiphy); 11322 if (!rdev->crit_proto_nlportid) 11323 return; 11324 11325 nlportid = rdev->crit_proto_nlportid; 11326 rdev->crit_proto_nlportid = 0; 11327 11328 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp); 11329 if (!msg) 11330 return; 11331 11332 hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CRIT_PROTOCOL_STOP); 11333 if (!hdr) 11334 goto nla_put_failure; 11335 11336 if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || 11337 nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev))) 11338 goto nla_put_failure; 11339 11340 genlmsg_end(msg, hdr); 11341 11342 genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); 11343 return; 11344 11345 nla_put_failure: 11346 if (hdr) 11347 genlmsg_cancel(msg, hdr); 11348 nlmsg_free(msg); 11349 11350 } 11351 EXPORT_SYMBOL(cfg80211_crit_proto_stopped); 11352 11353 /* initialisation/exit functions */ 11354 11355 int nl80211_init(void) 11356 { 11357 int err; 11358 11359 err = genl_register_family_with_ops_groups(&nl80211_fam, nl80211_ops, 11360 nl80211_mcgrps); 11361 if (err) 11362 return err; 11363 11364 err = netlink_register_notifier(&nl80211_netlink_notifier); 11365 if (err) 11366 goto err_out; 11367 11368 return 0; 11369 err_out: 11370 genl_unregister_family(&nl80211_fam); 11371 return err; 11372 } 11373 11374 void nl80211_exit(void) 11375 { 11376 netlink_unregister_notifier(&nl80211_netlink_notifier); 11377 genl_unregister_family(&nl80211_fam); 11378 } 11379