ibss.c revision 2d0ddec5b2b859f06116f631fc0ffe94fbceb556
1/* 2 * IBSS mode implementation 3 * Copyright 2003-2008, Jouni Malinen <j@w1.fi> 4 * Copyright 2004, Instant802 Networks, Inc. 5 * Copyright 2005, Devicescape Software, Inc. 6 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> 7 * Copyright 2007, Michael Wu <flamingice@sourmilk.net> 8 * Copyright 2009, Johannes Berg <johannes@sipsolutions.net> 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License version 2 as 12 * published by the Free Software Foundation. 13 */ 14 15#include <linux/delay.h> 16#include <linux/if_ether.h> 17#include <linux/skbuff.h> 18#include <linux/if_arp.h> 19#include <linux/etherdevice.h> 20#include <linux/rtnetlink.h> 21#include <net/mac80211.h> 22#include <asm/unaligned.h> 23 24#include "ieee80211_i.h" 25#include "rate.h" 26 27#define IEEE80211_SCAN_INTERVAL (2 * HZ) 28#define IEEE80211_SCAN_INTERVAL_SLOW (15 * HZ) 29#define IEEE80211_IBSS_JOIN_TIMEOUT (7 * HZ) 30 31#define IEEE80211_IBSS_MERGE_INTERVAL (30 * HZ) 32#define IEEE80211_IBSS_MERGE_DELAY 0x400000 33#define IEEE80211_IBSS_INACTIVITY_LIMIT (60 * HZ) 34 35#define IEEE80211_IBSS_MAX_STA_ENTRIES 128 36 37 38static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata, 39 struct ieee80211_mgmt *mgmt, 40 size_t len) 41{ 42 u16 auth_alg, auth_transaction, status_code; 43 44 if (len < 24 + 6) 45 return; 46 47 auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg); 48 auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction); 49 status_code = le16_to_cpu(mgmt->u.auth.status_code); 50 51 /* 52 * IEEE 802.11 standard does not require authentication in IBSS 53 * networks and most implementations do not seem to use it. 54 * However, try to reply to authentication attempts if someone 55 * has actually implemented this. 56 */ 57 if (auth_alg == WLAN_AUTH_OPEN && auth_transaction == 1) 58 ieee80211_send_auth(sdata, 2, WLAN_AUTH_OPEN, NULL, 0, 59 sdata->u.ibss.bssid, 0); 60} 61 62static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata, 63 const u8 *bssid, const int beacon_int, 64 struct ieee80211_channel *chan, 65 const size_t supp_rates_len, 66 const u8 *supp_rates, 67 const u16 capability, u64 tsf) 68{ 69 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; 70 struct ieee80211_local *local = sdata->local; 71 int rates, i, j; 72 struct sk_buff *skb; 73 struct ieee80211_mgmt *mgmt; 74 u8 *pos; 75 struct ieee80211_supported_band *sband; 76 u32 bss_change; 77 78 if (local->ops->reset_tsf) { 79 /* Reset own TSF to allow time synchronization work. */ 80 local->ops->reset_tsf(local_to_hw(local)); 81 } 82 83 skb = ifibss->skb; 84 rcu_assign_pointer(ifibss->presp, NULL); 85 synchronize_rcu(); 86 skb->data = skb->head; 87 skb->len = 0; 88 skb_reset_tail_pointer(skb); 89 skb_reserve(skb, sdata->local->hw.extra_tx_headroom); 90 91 if (memcmp(ifibss->bssid, bssid, ETH_ALEN)) 92 sta_info_flush(sdata->local, sdata); 93 94 memcpy(ifibss->bssid, bssid, ETH_ALEN); 95 96 sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0; 97 98 local->oper_channel = chan; 99 local->oper_channel_type = NL80211_CHAN_NO_HT; 100 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL); 101 102 sband = local->hw.wiphy->bands[chan->band]; 103 104 /* Build IBSS probe response */ 105 mgmt = (void *) skb_put(skb, 24 + sizeof(mgmt->u.beacon)); 106 memset(mgmt, 0, 24 + sizeof(mgmt->u.beacon)); 107 mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 108 IEEE80211_STYPE_PROBE_RESP); 109 memset(mgmt->da, 0xff, ETH_ALEN); 110 memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN); 111 memcpy(mgmt->bssid, ifibss->bssid, ETH_ALEN); 112 mgmt->u.beacon.beacon_int = cpu_to_le16(beacon_int); 113 mgmt->u.beacon.timestamp = cpu_to_le64(tsf); 114 mgmt->u.beacon.capab_info = cpu_to_le16(capability); 115 116 pos = skb_put(skb, 2 + ifibss->ssid_len); 117 *pos++ = WLAN_EID_SSID; 118 *pos++ = ifibss->ssid_len; 119 memcpy(pos, ifibss->ssid, ifibss->ssid_len); 120 121 rates = supp_rates_len; 122 if (rates > 8) 123 rates = 8; 124 pos = skb_put(skb, 2 + rates); 125 *pos++ = WLAN_EID_SUPP_RATES; 126 *pos++ = rates; 127 memcpy(pos, supp_rates, rates); 128 129 if (sband->band == IEEE80211_BAND_2GHZ) { 130 pos = skb_put(skb, 2 + 1); 131 *pos++ = WLAN_EID_DS_PARAMS; 132 *pos++ = 1; 133 *pos++ = ieee80211_frequency_to_channel(chan->center_freq); 134 } 135 136 pos = skb_put(skb, 2 + 2); 137 *pos++ = WLAN_EID_IBSS_PARAMS; 138 *pos++ = 2; 139 /* FIX: set ATIM window based on scan results */ 140 *pos++ = 0; 141 *pos++ = 0; 142 143 if (supp_rates_len > 8) { 144 rates = supp_rates_len - 8; 145 pos = skb_put(skb, 2 + rates); 146 *pos++ = WLAN_EID_EXT_SUPP_RATES; 147 *pos++ = rates; 148 memcpy(pos, &supp_rates[8], rates); 149 } 150 151 if (ifibss->ie_len) 152 memcpy(skb_put(skb, ifibss->ie_len), 153 ifibss->ie, ifibss->ie_len); 154 155 rcu_assign_pointer(ifibss->presp, skb); 156 157 sdata->vif.bss_conf.beacon_int = beacon_int; 158 bss_change = BSS_CHANGED_BEACON_INT; 159 bss_change |= ieee80211_reset_erp_info(sdata); 160 bss_change |= BSS_CHANGED_BSSID; 161 bss_change |= BSS_CHANGED_BEACON; 162 bss_change |= BSS_CHANGED_BEACON_ENABLED; 163 ieee80211_bss_info_change_notify(sdata, bss_change); 164 165 rates = 0; 166 for (i = 0; i < supp_rates_len; i++) { 167 int bitrate = (supp_rates[i] & 0x7f) * 5; 168 for (j = 0; j < sband->n_bitrates; j++) 169 if (sband->bitrates[j].bitrate == bitrate) 170 rates |= BIT(j); 171 } 172 173 ieee80211_sta_def_wmm_params(sdata, supp_rates_len, supp_rates); 174 175 ifibss->state = IEEE80211_IBSS_MLME_JOINED; 176 mod_timer(&ifibss->timer, 177 round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL)); 178 179 cfg80211_inform_bss_frame(local->hw.wiphy, local->hw.conf.channel, 180 mgmt, skb->len, 0, GFP_KERNEL); 181 cfg80211_ibss_joined(sdata->dev, ifibss->bssid, GFP_KERNEL); 182} 183 184static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata, 185 struct ieee80211_bss *bss) 186{ 187 u16 beacon_int = bss->cbss.beacon_interval; 188 189 if (beacon_int < 10) 190 beacon_int = 10; 191 192 __ieee80211_sta_join_ibss(sdata, bss->cbss.bssid, 193 beacon_int, 194 bss->cbss.channel, 195 bss->supp_rates_len, bss->supp_rates, 196 bss->cbss.capability, 197 bss->cbss.tsf); 198} 199 200static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, 201 struct ieee80211_mgmt *mgmt, 202 size_t len, 203 struct ieee80211_rx_status *rx_status, 204 struct ieee802_11_elems *elems, 205 bool beacon) 206{ 207 struct ieee80211_local *local = sdata->local; 208 int freq; 209 struct ieee80211_bss *bss; 210 struct sta_info *sta; 211 struct ieee80211_channel *channel; 212 u64 beacon_timestamp, rx_timestamp; 213 u32 supp_rates = 0; 214 enum ieee80211_band band = rx_status->band; 215 216 if (elems->ds_params && elems->ds_params_len == 1) 217 freq = ieee80211_channel_to_frequency(elems->ds_params[0]); 218 else 219 freq = rx_status->freq; 220 221 channel = ieee80211_get_channel(local->hw.wiphy, freq); 222 223 if (!channel || channel->flags & IEEE80211_CHAN_DISABLED) 224 return; 225 226 if (sdata->vif.type == NL80211_IFTYPE_ADHOC && elems->supp_rates && 227 memcmp(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN) == 0) { 228 supp_rates = ieee80211_sta_get_rates(local, elems, band); 229 230 rcu_read_lock(); 231 232 sta = sta_info_get(local, mgmt->sa); 233 if (sta) { 234 u32 prev_rates; 235 236 prev_rates = sta->sta.supp_rates[band]; 237 /* make sure mandatory rates are always added */ 238 sta->sta.supp_rates[band] = supp_rates | 239 ieee80211_mandatory_rates(local, band); 240 241#ifdef CONFIG_MAC80211_IBSS_DEBUG 242 if (sta->sta.supp_rates[band] != prev_rates) 243 printk(KERN_DEBUG "%s: updated supp_rates set " 244 "for %pM based on beacon info (0x%llx | " 245 "0x%llx -> 0x%llx)\n", 246 sdata->dev->name, 247 sta->sta.addr, 248 (unsigned long long) prev_rates, 249 (unsigned long long) supp_rates, 250 (unsigned long long) sta->sta.supp_rates[band]); 251#endif 252 } else 253 ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa, supp_rates); 254 255 rcu_read_unlock(); 256 } 257 258 bss = ieee80211_bss_info_update(local, rx_status, mgmt, len, elems, 259 channel, beacon); 260 if (!bss) 261 return; 262 263 /* was just updated in ieee80211_bss_info_update */ 264 beacon_timestamp = bss->cbss.tsf; 265 266 /* check if we need to merge IBSS */ 267 268 /* merge only on beacons (???) */ 269 if (!beacon) 270 goto put_bss; 271 272 /* we use a fixed BSSID */ 273 if (sdata->u.ibss.bssid) 274 goto put_bss; 275 276 /* not an IBSS */ 277 if (!(bss->cbss.capability & WLAN_CAPABILITY_IBSS)) 278 goto put_bss; 279 280 /* different channel */ 281 if (bss->cbss.channel != local->oper_channel) 282 goto put_bss; 283 284 /* different SSID */ 285 if (elems->ssid_len != sdata->u.ibss.ssid_len || 286 memcmp(elems->ssid, sdata->u.ibss.ssid, 287 sdata->u.ibss.ssid_len)) 288 goto put_bss; 289 290 /* same BSSID */ 291 if (memcmp(bss->cbss.bssid, sdata->u.ibss.bssid, ETH_ALEN) == 0) 292 goto put_bss; 293 294 if (rx_status->flag & RX_FLAG_TSFT) { 295 /* 296 * For correct IBSS merging we need mactime; since mactime is 297 * defined as the time the first data symbol of the frame hits 298 * the PHY, and the timestamp of the beacon is defined as "the 299 * time that the data symbol containing the first bit of the 300 * timestamp is transmitted to the PHY plus the transmitting 301 * STA's delays through its local PHY from the MAC-PHY 302 * interface to its interface with the WM" (802.11 11.1.2) 303 * - equals the time this bit arrives at the receiver - we have 304 * to take into account the offset between the two. 305 * 306 * E.g. at 1 MBit that means mactime is 192 usec earlier 307 * (=24 bytes * 8 usecs/byte) than the beacon timestamp. 308 */ 309 int rate; 310 311 if (rx_status->flag & RX_FLAG_HT) 312 rate = 65; /* TODO: HT rates */ 313 else 314 rate = local->hw.wiphy->bands[band]-> 315 bitrates[rx_status->rate_idx].bitrate; 316 317 rx_timestamp = rx_status->mactime + (24 * 8 * 10 / rate); 318 } else if (local && local->ops && local->ops->get_tsf) 319 /* second best option: get current TSF */ 320 rx_timestamp = local->ops->get_tsf(local_to_hw(local)); 321 else 322 /* can't merge without knowing the TSF */ 323 rx_timestamp = -1LLU; 324 325#ifdef CONFIG_MAC80211_IBSS_DEBUG 326 printk(KERN_DEBUG "RX beacon SA=%pM BSSID=" 327 "%pM TSF=0x%llx BCN=0x%llx diff=%lld @%lu\n", 328 mgmt->sa, mgmt->bssid, 329 (unsigned long long)rx_timestamp, 330 (unsigned long long)beacon_timestamp, 331 (unsigned long long)(rx_timestamp - beacon_timestamp), 332 jiffies); 333#endif 334 335 /* give slow hardware some time to do the TSF sync */ 336 if (rx_timestamp < IEEE80211_IBSS_MERGE_DELAY) 337 goto put_bss; 338 339 if (beacon_timestamp > rx_timestamp) { 340#ifdef CONFIG_MAC80211_IBSS_DEBUG 341 printk(KERN_DEBUG "%s: beacon TSF higher than " 342 "local TSF - IBSS merge with BSSID %pM\n", 343 sdata->dev->name, mgmt->bssid); 344#endif 345 ieee80211_sta_join_ibss(sdata, bss); 346 ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa, supp_rates); 347 } 348 349 put_bss: 350 ieee80211_rx_bss_put(local, bss); 351} 352 353/* 354 * Add a new IBSS station, will also be called by the RX code when, 355 * in IBSS mode, receiving a frame from a yet-unknown station, hence 356 * must be callable in atomic context. 357 */ 358struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, 359 u8 *bssid,u8 *addr, u32 supp_rates) 360{ 361 struct ieee80211_local *local = sdata->local; 362 struct sta_info *sta; 363 int band = local->hw.conf.channel->band; 364 365 /* 366 * XXX: Consider removing the least recently used entry and 367 * allow new one to be added. 368 */ 369 if (local->num_sta >= IEEE80211_IBSS_MAX_STA_ENTRIES) { 370 if (net_ratelimit()) 371 printk(KERN_DEBUG "%s: No room for a new IBSS STA entry %pM\n", 372 sdata->dev->name, addr); 373 return NULL; 374 } 375 376 if (compare_ether_addr(bssid, sdata->u.ibss.bssid)) 377 return NULL; 378 379#ifdef CONFIG_MAC80211_VERBOSE_DEBUG 380 printk(KERN_DEBUG "%s: Adding new IBSS station %pM (dev=%s)\n", 381 wiphy_name(local->hw.wiphy), addr, sdata->dev->name); 382#endif 383 384 sta = sta_info_alloc(sdata, addr, GFP_ATOMIC); 385 if (!sta) 386 return NULL; 387 388 set_sta_flags(sta, WLAN_STA_AUTHORIZED); 389 390 /* make sure mandatory rates are always added */ 391 sta->sta.supp_rates[band] = supp_rates | 392 ieee80211_mandatory_rates(local, band); 393 394 rate_control_rate_init(sta); 395 396 if (sta_info_insert(sta)) 397 return NULL; 398 399 return sta; 400} 401 402static int ieee80211_sta_active_ibss(struct ieee80211_sub_if_data *sdata) 403{ 404 struct ieee80211_local *local = sdata->local; 405 int active = 0; 406 struct sta_info *sta; 407 408 rcu_read_lock(); 409 410 list_for_each_entry_rcu(sta, &local->sta_list, list) { 411 if (sta->sdata == sdata && 412 time_after(sta->last_rx + IEEE80211_IBSS_MERGE_INTERVAL, 413 jiffies)) { 414 active++; 415 break; 416 } 417 } 418 419 rcu_read_unlock(); 420 421 return active; 422} 423 424 425static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata) 426{ 427 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; 428 429 mod_timer(&ifibss->timer, 430 round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL)); 431 432 ieee80211_sta_expire(sdata, IEEE80211_IBSS_INACTIVITY_LIMIT); 433 434 if (ieee80211_sta_active_ibss(sdata)) 435 return; 436 437 if (ifibss->fixed_channel) 438 return; 439 440 printk(KERN_DEBUG "%s: No active IBSS STAs - trying to scan for other " 441 "IBSS networks with same SSID (merge)\n", sdata->dev->name); 442 443 ieee80211_request_internal_scan(sdata, ifibss->ssid, ifibss->ssid_len); 444} 445 446static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata) 447{ 448 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; 449 struct ieee80211_local *local = sdata->local; 450 struct ieee80211_supported_band *sband; 451 u8 *pos; 452 u8 bssid[ETH_ALEN]; 453 u8 supp_rates[IEEE80211_MAX_SUPP_RATES]; 454 u16 capability; 455 int i; 456 457 if (ifibss->fixed_bssid) { 458 memcpy(bssid, ifibss->bssid, ETH_ALEN); 459 } else { 460 /* Generate random, not broadcast, locally administered BSSID. Mix in 461 * own MAC address to make sure that devices that do not have proper 462 * random number generator get different BSSID. */ 463 get_random_bytes(bssid, ETH_ALEN); 464 for (i = 0; i < ETH_ALEN; i++) 465 bssid[i] ^= sdata->dev->dev_addr[i]; 466 bssid[0] &= ~0x01; 467 bssid[0] |= 0x02; 468 } 469 470 printk(KERN_DEBUG "%s: Creating new IBSS network, BSSID %pM\n", 471 sdata->dev->name, bssid); 472 473 sband = local->hw.wiphy->bands[ifibss->channel->band]; 474 475 capability = WLAN_CAPABILITY_IBSS; 476 477 if (sdata->default_key) 478 capability |= WLAN_CAPABILITY_PRIVACY; 479 else 480 sdata->drop_unencrypted = 0; 481 482 pos = supp_rates; 483 for (i = 0; i < sband->n_bitrates; i++) { 484 int rate = sband->bitrates[i].bitrate; 485 *pos++ = (u8) (rate / 5); 486 } 487 488 __ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int, 489 ifibss->channel, sband->n_bitrates, 490 supp_rates, capability, 0); 491} 492 493static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata) 494{ 495 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; 496 struct ieee80211_local *local = sdata->local; 497 struct ieee80211_bss *bss; 498 struct ieee80211_channel *chan = NULL; 499 const u8 *bssid = NULL; 500 int active_ibss; 501 502 active_ibss = ieee80211_sta_active_ibss(sdata); 503#ifdef CONFIG_MAC80211_IBSS_DEBUG 504 printk(KERN_DEBUG "%s: sta_find_ibss (active_ibss=%d)\n", 505 sdata->dev->name, active_ibss); 506#endif /* CONFIG_MAC80211_IBSS_DEBUG */ 507 508 if (active_ibss) 509 return; 510 511 if (ifibss->fixed_bssid) 512 bssid = ifibss->bssid; 513 if (ifibss->fixed_channel) 514 chan = ifibss->channel; 515 if (!is_zero_ether_addr(ifibss->bssid)) 516 bssid = ifibss->bssid; 517 bss = (void *)cfg80211_get_bss(local->hw.wiphy, chan, bssid, 518 ifibss->ssid, ifibss->ssid_len, 519 WLAN_CAPABILITY_IBSS, 520 WLAN_CAPABILITY_IBSS); 521 522#ifdef CONFIG_MAC80211_IBSS_DEBUG 523 if (bss) 524 printk(KERN_DEBUG " sta_find_ibss: selected %pM current " 525 "%pM\n", bss->cbss.bssid, ifibss->bssid); 526#endif /* CONFIG_MAC80211_IBSS_DEBUG */ 527 528 if (bss && memcmp(ifibss->bssid, bss->cbss.bssid, ETH_ALEN)) { 529 printk(KERN_DEBUG "%s: Selected IBSS BSSID %pM" 530 " based on configured SSID\n", 531 sdata->dev->name, bss->cbss.bssid); 532 533 ieee80211_sta_join_ibss(sdata, bss); 534 ieee80211_rx_bss_put(local, bss); 535 return; 536 } else if (bss) 537 ieee80211_rx_bss_put(local, bss); 538 539#ifdef CONFIG_MAC80211_IBSS_DEBUG 540 printk(KERN_DEBUG " did not try to join ibss\n"); 541#endif /* CONFIG_MAC80211_IBSS_DEBUG */ 542 543 /* Selected IBSS not found in current scan results - try to scan */ 544 if (ifibss->state == IEEE80211_IBSS_MLME_JOINED && 545 !ieee80211_sta_active_ibss(sdata)) { 546 mod_timer(&ifibss->timer, 547 round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL)); 548 } else if (time_after(jiffies, ifibss->last_scan_completed + 549 IEEE80211_SCAN_INTERVAL)) { 550 printk(KERN_DEBUG "%s: Trigger new scan to find an IBSS to " 551 "join\n", sdata->dev->name); 552 553 ieee80211_request_internal_scan(sdata, ifibss->ssid, 554 ifibss->ssid_len); 555 } else if (ifibss->state != IEEE80211_IBSS_MLME_JOINED) { 556 int interval = IEEE80211_SCAN_INTERVAL; 557 558 if (time_after(jiffies, ifibss->ibss_join_req + 559 IEEE80211_IBSS_JOIN_TIMEOUT)) { 560 if (!(local->oper_channel->flags & IEEE80211_CHAN_NO_IBSS)) { 561 ieee80211_sta_create_ibss(sdata); 562 return; 563 } 564 printk(KERN_DEBUG "%s: IBSS not allowed on" 565 " %d MHz\n", sdata->dev->name, 566 local->hw.conf.channel->center_freq); 567 568 /* No IBSS found - decrease scan interval and continue 569 * scanning. */ 570 interval = IEEE80211_SCAN_INTERVAL_SLOW; 571 } 572 573 ifibss->state = IEEE80211_IBSS_MLME_SEARCH; 574 mod_timer(&ifibss->timer, 575 round_jiffies(jiffies + interval)); 576 } 577} 578 579static void ieee80211_rx_mgmt_probe_req(struct ieee80211_sub_if_data *sdata, 580 struct ieee80211_mgmt *mgmt, 581 size_t len) 582{ 583 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; 584 struct ieee80211_local *local = sdata->local; 585 int tx_last_beacon; 586 struct sk_buff *skb; 587 struct ieee80211_mgmt *resp; 588 u8 *pos, *end; 589 590 if (ifibss->state != IEEE80211_IBSS_MLME_JOINED || 591 len < 24 + 2 || !ifibss->presp) 592 return; 593 594 if (local->ops->tx_last_beacon) 595 tx_last_beacon = local->ops->tx_last_beacon(local_to_hw(local)); 596 else 597 tx_last_beacon = 1; 598 599#ifdef CONFIG_MAC80211_IBSS_DEBUG 600 printk(KERN_DEBUG "%s: RX ProbeReq SA=%pM DA=%pM BSSID=%pM" 601 " (tx_last_beacon=%d)\n", 602 sdata->dev->name, mgmt->sa, mgmt->da, 603 mgmt->bssid, tx_last_beacon); 604#endif /* CONFIG_MAC80211_IBSS_DEBUG */ 605 606 if (!tx_last_beacon) 607 return; 608 609 if (memcmp(mgmt->bssid, ifibss->bssid, ETH_ALEN) != 0 && 610 memcmp(mgmt->bssid, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) != 0) 611 return; 612 613 end = ((u8 *) mgmt) + len; 614 pos = mgmt->u.probe_req.variable; 615 if (pos[0] != WLAN_EID_SSID || 616 pos + 2 + pos[1] > end) { 617#ifdef CONFIG_MAC80211_IBSS_DEBUG 618 printk(KERN_DEBUG "%s: Invalid SSID IE in ProbeReq " 619 "from %pM\n", 620 sdata->dev->name, mgmt->sa); 621#endif 622 return; 623 } 624 if (pos[1] != 0 && 625 (pos[1] != ifibss->ssid_len || 626 !memcmp(pos + 2, ifibss->ssid, ifibss->ssid_len))) { 627 /* Ignore ProbeReq for foreign SSID */ 628 return; 629 } 630 631 /* Reply with ProbeResp */ 632 skb = skb_copy(ifibss->presp, GFP_KERNEL); 633 if (!skb) 634 return; 635 636 resp = (struct ieee80211_mgmt *) skb->data; 637 memcpy(resp->da, mgmt->sa, ETH_ALEN); 638#ifdef CONFIG_MAC80211_IBSS_DEBUG 639 printk(KERN_DEBUG "%s: Sending ProbeResp to %pM\n", 640 sdata->dev->name, resp->da); 641#endif /* CONFIG_MAC80211_IBSS_DEBUG */ 642 ieee80211_tx_skb(sdata, skb, 0); 643} 644 645static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata, 646 struct ieee80211_mgmt *mgmt, 647 size_t len, 648 struct ieee80211_rx_status *rx_status) 649{ 650 size_t baselen; 651 struct ieee802_11_elems elems; 652 653 if (memcmp(mgmt->da, sdata->dev->dev_addr, ETH_ALEN)) 654 return; /* ignore ProbeResp to foreign address */ 655 656 baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt; 657 if (baselen > len) 658 return; 659 660 ieee802_11_parse_elems(mgmt->u.probe_resp.variable, len - baselen, 661 &elems); 662 663 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems, false); 664} 665 666static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, 667 struct ieee80211_mgmt *mgmt, 668 size_t len, 669 struct ieee80211_rx_status *rx_status) 670{ 671 size_t baselen; 672 struct ieee802_11_elems elems; 673 674 /* Process beacon from the current BSS */ 675 baselen = (u8 *) mgmt->u.beacon.variable - (u8 *) mgmt; 676 if (baselen > len) 677 return; 678 679 ieee802_11_parse_elems(mgmt->u.beacon.variable, len - baselen, &elems); 680 681 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems, true); 682} 683 684static void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, 685 struct sk_buff *skb) 686{ 687 struct ieee80211_rx_status *rx_status; 688 struct ieee80211_mgmt *mgmt; 689 u16 fc; 690 691 rx_status = (struct ieee80211_rx_status *) skb->cb; 692 mgmt = (struct ieee80211_mgmt *) skb->data; 693 fc = le16_to_cpu(mgmt->frame_control); 694 695 switch (fc & IEEE80211_FCTL_STYPE) { 696 case IEEE80211_STYPE_PROBE_REQ: 697 ieee80211_rx_mgmt_probe_req(sdata, mgmt, skb->len); 698 break; 699 case IEEE80211_STYPE_PROBE_RESP: 700 ieee80211_rx_mgmt_probe_resp(sdata, mgmt, skb->len, 701 rx_status); 702 break; 703 case IEEE80211_STYPE_BEACON: 704 ieee80211_rx_mgmt_beacon(sdata, mgmt, skb->len, 705 rx_status); 706 break; 707 case IEEE80211_STYPE_AUTH: 708 ieee80211_rx_mgmt_auth_ibss(sdata, mgmt, skb->len); 709 break; 710 } 711 712 kfree_skb(skb); 713} 714 715static void ieee80211_ibss_work(struct work_struct *work) 716{ 717 struct ieee80211_sub_if_data *sdata = 718 container_of(work, struct ieee80211_sub_if_data, u.ibss.work); 719 struct ieee80211_local *local = sdata->local; 720 struct ieee80211_if_ibss *ifibss; 721 struct sk_buff *skb; 722 723 if (!netif_running(sdata->dev)) 724 return; 725 726 if (local->sw_scanning || local->hw_scanning) 727 return; 728 729 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_ADHOC)) 730 return; 731 ifibss = &sdata->u.ibss; 732 733 while ((skb = skb_dequeue(&ifibss->skb_queue))) 734 ieee80211_ibss_rx_queued_mgmt(sdata, skb); 735 736 if (!test_and_clear_bit(IEEE80211_IBSS_REQ_RUN, &ifibss->request)) 737 return; 738 739 switch (ifibss->state) { 740 case IEEE80211_IBSS_MLME_SEARCH: 741 ieee80211_sta_find_ibss(sdata); 742 break; 743 case IEEE80211_IBSS_MLME_JOINED: 744 ieee80211_sta_merge_ibss(sdata); 745 break; 746 default: 747 WARN_ON(1); 748 break; 749 } 750} 751 752static void ieee80211_ibss_timer(unsigned long data) 753{ 754 struct ieee80211_sub_if_data *sdata = 755 (struct ieee80211_sub_if_data *) data; 756 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; 757 struct ieee80211_local *local = sdata->local; 758 759 set_bit(IEEE80211_IBSS_REQ_RUN, &ifibss->request); 760 queue_work(local->hw.workqueue, &ifibss->work); 761} 762 763void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata) 764{ 765 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; 766 767 INIT_WORK(&ifibss->work, ieee80211_ibss_work); 768 setup_timer(&ifibss->timer, ieee80211_ibss_timer, 769 (unsigned long) sdata); 770 skb_queue_head_init(&ifibss->skb_queue); 771} 772 773/* scan finished notification */ 774void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local) 775{ 776 struct ieee80211_sub_if_data *sdata; 777 778 mutex_lock(&local->iflist_mtx); 779 list_for_each_entry(sdata, &local->interfaces, list) { 780 if (!netif_running(sdata->dev)) 781 continue; 782 if (sdata->vif.type != NL80211_IFTYPE_ADHOC) 783 continue; 784 if (!sdata->u.ibss.ssid_len) 785 continue; 786 sdata->u.ibss.last_scan_completed = jiffies; 787 ieee80211_sta_find_ibss(sdata); 788 } 789 mutex_unlock(&local->iflist_mtx); 790} 791 792ieee80211_rx_result 793ieee80211_ibss_rx_mgmt(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb, 794 struct ieee80211_rx_status *rx_status) 795{ 796 struct ieee80211_local *local = sdata->local; 797 struct ieee80211_mgmt *mgmt; 798 u16 fc; 799 800 if (skb->len < 24) 801 return RX_DROP_MONITOR; 802 803 mgmt = (struct ieee80211_mgmt *) skb->data; 804 fc = le16_to_cpu(mgmt->frame_control); 805 806 switch (fc & IEEE80211_FCTL_STYPE) { 807 case IEEE80211_STYPE_PROBE_RESP: 808 case IEEE80211_STYPE_BEACON: 809 memcpy(skb->cb, rx_status, sizeof(*rx_status)); 810 case IEEE80211_STYPE_PROBE_REQ: 811 case IEEE80211_STYPE_AUTH: 812 skb_queue_tail(&sdata->u.ibss.skb_queue, skb); 813 queue_work(local->hw.workqueue, &sdata->u.ibss.work); 814 return RX_QUEUED; 815 } 816 817 return RX_DROP_MONITOR; 818} 819 820int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata, 821 struct cfg80211_ibss_params *params) 822{ 823 struct sk_buff *skb; 824 825 if (params->bssid) { 826 memcpy(sdata->u.ibss.bssid, params->bssid, ETH_ALEN); 827 sdata->u.ibss.fixed_bssid = true; 828 } else 829 sdata->u.ibss.fixed_bssid = false; 830 831 sdata->vif.bss_conf.beacon_int = params->beacon_interval; 832 833 sdata->u.ibss.channel = params->channel; 834 sdata->u.ibss.fixed_channel = params->channel_fixed; 835 836 if (params->ie) { 837 sdata->u.ibss.ie = kmemdup(params->ie, params->ie_len, 838 GFP_KERNEL); 839 if (sdata->u.ibss.ie) 840 sdata->u.ibss.ie_len = params->ie_len; 841 } 842 843 skb = dev_alloc_skb(sdata->local->hw.extra_tx_headroom + 844 36 /* bitrates */ + 845 34 /* SSID */ + 846 3 /* DS params */ + 847 4 /* IBSS params */ + 848 params->ie_len); 849 if (!skb) 850 return -ENOMEM; 851 852 sdata->u.ibss.skb = skb; 853 sdata->u.ibss.state = IEEE80211_IBSS_MLME_SEARCH; 854 sdata->u.ibss.ibss_join_req = jiffies; 855 856 memcpy(sdata->u.ibss.ssid, params->ssid, IEEE80211_MAX_SSID_LEN); 857 858 /* 859 * The ssid_len setting below is used to see whether 860 * we are active, and we need all other settings 861 * before that may get visible. 862 */ 863 mb(); 864 865 sdata->u.ibss.ssid_len = params->ssid_len; 866 867 set_bit(IEEE80211_IBSS_REQ_RUN, &sdata->u.ibss.request); 868 queue_work(sdata->local->hw.workqueue, &sdata->u.ibss.work); 869 870 return 0; 871} 872 873int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata) 874{ 875 struct sk_buff *skb; 876 877 del_timer_sync(&sdata->u.ibss.timer); 878 clear_bit(IEEE80211_IBSS_REQ_RUN, &sdata->u.ibss.request); 879 cancel_work_sync(&sdata->u.ibss.work); 880 clear_bit(IEEE80211_IBSS_REQ_RUN, &sdata->u.ibss.request); 881 882 sta_info_flush(sdata->local, sdata); 883 884 /* remove beacon */ 885 kfree(sdata->u.ibss.ie); 886 skb = sdata->u.ibss.presp; 887 rcu_assign_pointer(sdata->u.ibss.presp, NULL); 888 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED); 889 synchronize_rcu(); 890 kfree_skb(skb); 891 892 skb_queue_purge(&sdata->u.ibss.skb_queue); 893 memset(sdata->u.ibss.bssid, 0, ETH_ALEN); 894 895 return 0; 896} 897