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