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