1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Some IBSS support code for cfg80211. 4 * 5 * Copyright 2009 Johannes Berg <johannes@sipsolutions.net> 6 */ 7 8 #include <linux/etherdevice.h> 9 #include <linux/if_arp.h> 10 #include <linux/slab.h> 11 #include <linux/export.h> 12 #include <net/cfg80211.h> 13 #include "wext-compat.h" 14 #include "nl80211.h" 15 #include "rdev-ops.h" 16 17 18 void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, 19 struct ieee80211_channel *channel) 20 { 21 struct wireless_dev *wdev = dev->ieee80211_ptr; 22 struct cfg80211_bss *bss; 23 #ifdef CONFIG_CFG80211_WEXT 24 union iwreq_data wrqu; 25 #endif 26 27 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_ADHOC)) 28 return; 29 30 if (!wdev->ssid_len) 31 return; 32 33 bss = cfg80211_get_bss(wdev->wiphy, channel, bssid, NULL, 0, 34 IEEE80211_BSS_TYPE_IBSS, IEEE80211_PRIVACY_ANY); 35 36 if (WARN_ON(!bss)) 37 return; 38 39 if (wdev->current_bss) { 40 cfg80211_unhold_bss(wdev->current_bss); 41 cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub); 42 } 43 44 cfg80211_hold_bss(bss_from_pub(bss)); 45 wdev->current_bss = bss_from_pub(bss); 46 47 if (!(wdev->wiphy->flags & WIPHY_FLAG_HAS_STATIC_WEP)) 48 cfg80211_upload_connect_keys(wdev); 49 50 nl80211_send_ibss_bssid(wiphy_to_rdev(wdev->wiphy), dev, bssid, 51 GFP_KERNEL); 52 #ifdef CONFIG_CFG80211_WEXT 53 memset(&wrqu, 0, sizeof(wrqu)); 54 memcpy(wrqu.ap_addr.sa_data, bssid, ETH_ALEN); 55 wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL); 56 #endif 57 } 58 59 void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, 60 struct ieee80211_channel *channel, gfp_t gfp) 61 { 62 struct wireless_dev *wdev = dev->ieee80211_ptr; 63 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 64 struct cfg80211_event *ev; 65 unsigned long flags; 66 67 trace_cfg80211_ibss_joined(dev, bssid, channel); 68 69 if (WARN_ON(!channel)) 70 return; 71 72 ev = kzalloc(sizeof(*ev), gfp); 73 if (!ev) 74 return; 75 76 ev->type = EVENT_IBSS_JOINED; 77 memcpy(ev->ij.bssid, bssid, ETH_ALEN); 78 ev->ij.channel = channel; 79 80 spin_lock_irqsave(&wdev->event_lock, flags); 81 list_add_tail(&ev->list, &wdev->event_list); 82 spin_unlock_irqrestore(&wdev->event_lock, flags); 83 queue_work(cfg80211_wq, &rdev->event_work); 84 } 85 EXPORT_SYMBOL(cfg80211_ibss_joined); 86 87 int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev, 88 struct net_device *dev, 89 struct cfg80211_ibss_params *params, 90 struct cfg80211_cached_keys *connkeys) 91 { 92 struct wireless_dev *wdev = dev->ieee80211_ptr; 93 int err; 94 95 ASSERT_RTNL(); 96 ASSERT_WDEV_LOCK(wdev); 97 98 if (wdev->ssid_len) 99 return -EALREADY; 100 101 if (!params->basic_rates) { 102 /* 103 * If no rates were explicitly configured, 104 * use the mandatory rate set for 11b or 105 * 11a for maximum compatibility. 106 */ 107 struct ieee80211_supported_band *sband = 108 rdev->wiphy.bands[params->chandef.chan->band]; 109 int j; 110 u32 flag = params->chandef.chan->band == NL80211_BAND_5GHZ ? 111 IEEE80211_RATE_MANDATORY_A : 112 IEEE80211_RATE_MANDATORY_B; 113 114 for (j = 0; j < sband->n_bitrates; j++) { 115 if (sband->bitrates[j].flags & flag) 116 params->basic_rates |= BIT(j); 117 } 118 } 119 120 if (WARN_ON(connkeys && connkeys->def < 0)) 121 return -EINVAL; 122 123 if (WARN_ON(wdev->connect_keys)) 124 kzfree(wdev->connect_keys); 125 wdev->connect_keys = connkeys; 126 127 wdev->ibss_fixed = params->channel_fixed; 128 wdev->ibss_dfs_possible = params->userspace_handles_dfs; 129 wdev->chandef = params->chandef; 130 if (connkeys) { 131 params->wep_keys = connkeys->params; 132 params->wep_tx_key = connkeys->def; 133 } 134 135 #ifdef CONFIG_CFG80211_WEXT 136 wdev->wext.ibss.chandef = params->chandef; 137 #endif 138 err = rdev_join_ibss(rdev, dev, params); 139 if (err) { 140 wdev->connect_keys = NULL; 141 return err; 142 } 143 144 memcpy(wdev->ssid, params->ssid, params->ssid_len); 145 wdev->ssid_len = params->ssid_len; 146 147 return 0; 148 } 149 150 static void __cfg80211_clear_ibss(struct net_device *dev, bool nowext) 151 { 152 struct wireless_dev *wdev = dev->ieee80211_ptr; 153 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 154 int i; 155 156 ASSERT_WDEV_LOCK(wdev); 157 158 kzfree(wdev->connect_keys); 159 wdev->connect_keys = NULL; 160 161 rdev_set_qos_map(rdev, dev, NULL); 162 163 /* 164 * Delete all the keys ... pairwise keys can't really 165 * exist any more anyway, but default keys might. 166 */ 167 if (rdev->ops->del_key) 168 for (i = 0; i < 6; i++) 169 rdev_del_key(rdev, dev, i, false, NULL); 170 171 if (wdev->current_bss) { 172 cfg80211_unhold_bss(wdev->current_bss); 173 cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub); 174 } 175 176 wdev->current_bss = NULL; 177 wdev->ssid_len = 0; 178 memset(&wdev->chandef, 0, sizeof(wdev->chandef)); 179 #ifdef CONFIG_CFG80211_WEXT 180 if (!nowext) 181 wdev->wext.ibss.ssid_len = 0; 182 #endif 183 cfg80211_sched_dfs_chan_update(rdev); 184 } 185 186 void cfg80211_clear_ibss(struct net_device *dev, bool nowext) 187 { 188 struct wireless_dev *wdev = dev->ieee80211_ptr; 189 190 wdev_lock(wdev); 191 __cfg80211_clear_ibss(dev, nowext); 192 wdev_unlock(wdev); 193 } 194 195 int __cfg80211_leave_ibss(struct cfg80211_registered_device *rdev, 196 struct net_device *dev, bool nowext) 197 { 198 struct wireless_dev *wdev = dev->ieee80211_ptr; 199 int err; 200 201 ASSERT_WDEV_LOCK(wdev); 202 203 if (!wdev->ssid_len) 204 return -ENOLINK; 205 206 err = rdev_leave_ibss(rdev, dev); 207 208 if (err) 209 return err; 210 211 wdev->conn_owner_nlportid = 0; 212 __cfg80211_clear_ibss(dev, nowext); 213 214 return 0; 215 } 216 217 int cfg80211_leave_ibss(struct cfg80211_registered_device *rdev, 218 struct net_device *dev, bool nowext) 219 { 220 struct wireless_dev *wdev = dev->ieee80211_ptr; 221 int err; 222 223 wdev_lock(wdev); 224 err = __cfg80211_leave_ibss(rdev, dev, nowext); 225 wdev_unlock(wdev); 226 227 return err; 228 } 229 230 #ifdef CONFIG_CFG80211_WEXT 231 int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev, 232 struct wireless_dev *wdev) 233 { 234 struct cfg80211_cached_keys *ck = NULL; 235 enum nl80211_band band; 236 int i, err; 237 238 ASSERT_WDEV_LOCK(wdev); 239 240 if (!wdev->wext.ibss.beacon_interval) 241 wdev->wext.ibss.beacon_interval = 100; 242 243 /* try to find an IBSS channel if none requested ... */ 244 if (!wdev->wext.ibss.chandef.chan) { 245 struct ieee80211_channel *new_chan = NULL; 246 247 for (band = 0; band < NUM_NL80211_BANDS; band++) { 248 struct ieee80211_supported_band *sband; 249 struct ieee80211_channel *chan; 250 251 sband = rdev->wiphy.bands[band]; 252 if (!sband) 253 continue; 254 255 for (i = 0; i < sband->n_channels; i++) { 256 chan = &sband->channels[i]; 257 if (chan->flags & IEEE80211_CHAN_NO_IR) 258 continue; 259 if (chan->flags & IEEE80211_CHAN_DISABLED) 260 continue; 261 new_chan = chan; 262 break; 263 } 264 265 if (new_chan) 266 break; 267 } 268 269 if (!new_chan) 270 return -EINVAL; 271 272 cfg80211_chandef_create(&wdev->wext.ibss.chandef, new_chan, 273 NL80211_CHAN_NO_HT); 274 } 275 276 /* don't join -- SSID is not there */ 277 if (!wdev->wext.ibss.ssid_len) 278 return 0; 279 280 if (!netif_running(wdev->netdev)) 281 return 0; 282 283 if (wdev->wext.keys) 284 wdev->wext.keys->def = wdev->wext.default_key; 285 286 wdev->wext.ibss.privacy = wdev->wext.default_key != -1; 287 288 if (wdev->wext.keys && wdev->wext.keys->def != -1) { 289 ck = kmemdup(wdev->wext.keys, sizeof(*ck), GFP_KERNEL); 290 if (!ck) 291 return -ENOMEM; 292 for (i = 0; i < CFG80211_MAX_WEP_KEYS; i++) 293 ck->params[i].key = ck->data[i]; 294 } 295 err = __cfg80211_join_ibss(rdev, wdev->netdev, 296 &wdev->wext.ibss, ck); 297 if (err) 298 kfree(ck); 299 300 return err; 301 } 302 303 int cfg80211_ibss_wext_siwfreq(struct net_device *dev, 304 struct iw_request_info *info, 305 struct iw_freq *wextfreq, char *extra) 306 { 307 struct wireless_dev *wdev = dev->ieee80211_ptr; 308 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 309 struct ieee80211_channel *chan = NULL; 310 int err, freq; 311 312 /* call only for ibss! */ 313 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_ADHOC)) 314 return -EINVAL; 315 316 if (!rdev->ops->join_ibss) 317 return -EOPNOTSUPP; 318 319 freq = cfg80211_wext_freq(wextfreq); 320 if (freq < 0) 321 return freq; 322 323 if (freq) { 324 chan = ieee80211_get_channel(wdev->wiphy, freq); 325 if (!chan) 326 return -EINVAL; 327 if (chan->flags & IEEE80211_CHAN_NO_IR || 328 chan->flags & IEEE80211_CHAN_DISABLED) 329 return -EINVAL; 330 } 331 332 if (wdev->wext.ibss.chandef.chan == chan) 333 return 0; 334 335 wdev_lock(wdev); 336 err = 0; 337 if (wdev->ssid_len) 338 err = __cfg80211_leave_ibss(rdev, dev, true); 339 wdev_unlock(wdev); 340 341 if (err) 342 return err; 343 344 if (chan) { 345 cfg80211_chandef_create(&wdev->wext.ibss.chandef, chan, 346 NL80211_CHAN_NO_HT); 347 wdev->wext.ibss.channel_fixed = true; 348 } else { 349 /* cfg80211_ibss_wext_join will pick one if needed */ 350 wdev->wext.ibss.channel_fixed = false; 351 } 352 353 wdev_lock(wdev); 354 err = cfg80211_ibss_wext_join(rdev, wdev); 355 wdev_unlock(wdev); 356 357 return err; 358 } 359 360 int cfg80211_ibss_wext_giwfreq(struct net_device *dev, 361 struct iw_request_info *info, 362 struct iw_freq *freq, char *extra) 363 { 364 struct wireless_dev *wdev = dev->ieee80211_ptr; 365 struct ieee80211_channel *chan = NULL; 366 367 /* call only for ibss! */ 368 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_ADHOC)) 369 return -EINVAL; 370 371 wdev_lock(wdev); 372 if (wdev->current_bss) 373 chan = wdev->current_bss->pub.channel; 374 else if (wdev->wext.ibss.chandef.chan) 375 chan = wdev->wext.ibss.chandef.chan; 376 wdev_unlock(wdev); 377 378 if (chan) { 379 freq->m = chan->center_freq; 380 freq->e = 6; 381 return 0; 382 } 383 384 /* no channel if not joining */ 385 return -EINVAL; 386 } 387 388 int cfg80211_ibss_wext_siwessid(struct net_device *dev, 389 struct iw_request_info *info, 390 struct iw_point *data, char *ssid) 391 { 392 struct wireless_dev *wdev = dev->ieee80211_ptr; 393 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 394 size_t len = data->length; 395 int err; 396 397 /* call only for ibss! */ 398 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_ADHOC)) 399 return -EINVAL; 400 401 if (!rdev->ops->join_ibss) 402 return -EOPNOTSUPP; 403 404 wdev_lock(wdev); 405 err = 0; 406 if (wdev->ssid_len) 407 err = __cfg80211_leave_ibss(rdev, dev, true); 408 wdev_unlock(wdev); 409 410 if (err) 411 return err; 412 413 /* iwconfig uses nul termination in SSID.. */ 414 if (len > 0 && ssid[len - 1] == '\0') 415 len--; 416 417 memcpy(wdev->ssid, ssid, len); 418 wdev->wext.ibss.ssid = wdev->ssid; 419 wdev->wext.ibss.ssid_len = len; 420 421 wdev_lock(wdev); 422 err = cfg80211_ibss_wext_join(rdev, wdev); 423 wdev_unlock(wdev); 424 425 return err; 426 } 427 428 int cfg80211_ibss_wext_giwessid(struct net_device *dev, 429 struct iw_request_info *info, 430 struct iw_point *data, char *ssid) 431 { 432 struct wireless_dev *wdev = dev->ieee80211_ptr; 433 434 /* call only for ibss! */ 435 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_ADHOC)) 436 return -EINVAL; 437 438 data->flags = 0; 439 440 wdev_lock(wdev); 441 if (wdev->ssid_len) { 442 data->flags = 1; 443 data->length = wdev->ssid_len; 444 memcpy(ssid, wdev->ssid, data->length); 445 } else if (wdev->wext.ibss.ssid && wdev->wext.ibss.ssid_len) { 446 data->flags = 1; 447 data->length = wdev->wext.ibss.ssid_len; 448 memcpy(ssid, wdev->wext.ibss.ssid, data->length); 449 } 450 wdev_unlock(wdev); 451 452 return 0; 453 } 454 455 int cfg80211_ibss_wext_siwap(struct net_device *dev, 456 struct iw_request_info *info, 457 struct sockaddr *ap_addr, char *extra) 458 { 459 struct wireless_dev *wdev = dev->ieee80211_ptr; 460 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 461 u8 *bssid = ap_addr->sa_data; 462 int err; 463 464 /* call only for ibss! */ 465 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_ADHOC)) 466 return -EINVAL; 467 468 if (!rdev->ops->join_ibss) 469 return -EOPNOTSUPP; 470 471 if (ap_addr->sa_family != ARPHRD_ETHER) 472 return -EINVAL; 473 474 /* automatic mode */ 475 if (is_zero_ether_addr(bssid) || is_broadcast_ether_addr(bssid)) 476 bssid = NULL; 477 478 if (bssid && !is_valid_ether_addr(bssid)) 479 return -EINVAL; 480 481 /* both automatic */ 482 if (!bssid && !wdev->wext.ibss.bssid) 483 return 0; 484 485 /* fixed already - and no change */ 486 if (wdev->wext.ibss.bssid && bssid && 487 ether_addr_equal(bssid, wdev->wext.ibss.bssid)) 488 return 0; 489 490 wdev_lock(wdev); 491 err = 0; 492 if (wdev->ssid_len) 493 err = __cfg80211_leave_ibss(rdev, dev, true); 494 wdev_unlock(wdev); 495 496 if (err) 497 return err; 498 499 if (bssid) { 500 memcpy(wdev->wext.bssid, bssid, ETH_ALEN); 501 wdev->wext.ibss.bssid = wdev->wext.bssid; 502 } else 503 wdev->wext.ibss.bssid = NULL; 504 505 wdev_lock(wdev); 506 err = cfg80211_ibss_wext_join(rdev, wdev); 507 wdev_unlock(wdev); 508 509 return err; 510 } 511 512 int cfg80211_ibss_wext_giwap(struct net_device *dev, 513 struct iw_request_info *info, 514 struct sockaddr *ap_addr, char *extra) 515 { 516 struct wireless_dev *wdev = dev->ieee80211_ptr; 517 518 /* call only for ibss! */ 519 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_ADHOC)) 520 return -EINVAL; 521 522 ap_addr->sa_family = ARPHRD_ETHER; 523 524 wdev_lock(wdev); 525 if (wdev->current_bss) 526 memcpy(ap_addr->sa_data, wdev->current_bss->pub.bssid, ETH_ALEN); 527 else if (wdev->wext.ibss.bssid) 528 memcpy(ap_addr->sa_data, wdev->wext.ibss.bssid, ETH_ALEN); 529 else 530 eth_zero_addr(ap_addr->sa_data); 531 532 wdev_unlock(wdev); 533 534 return 0; 535 } 536 #endif 537