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