linux/net/mac80211/cfg.c
<<
>>
Prefs
   1/*
   2 * mac80211 configuration hooks for cfg80211
   3 *
   4 * Copyright 2006-2010  Johannes Berg <johannes@sipsolutions.net>
   5 *
   6 * This file is GPLv2 as found in COPYING.
   7 */
   8
   9#include <linux/ieee80211.h>
  10#include <linux/nl80211.h>
  11#include <linux/rtnetlink.h>
  12#include <linux/slab.h>
  13#include <net/net_namespace.h>
  14#include <linux/rcupdate.h>
  15#include <net/cfg80211.h>
  16#include "ieee80211_i.h"
  17#include "driver-ops.h"
  18#include "cfg.h"
  19#include "rate.h"
  20#include "mesh.h"
  21
  22static bool nl80211_type_check(enum nl80211_iftype type)
  23{
  24        switch (type) {
  25        case NL80211_IFTYPE_ADHOC:
  26        case NL80211_IFTYPE_STATION:
  27        case NL80211_IFTYPE_MONITOR:
  28#ifdef CONFIG_MAC80211_MESH
  29        case NL80211_IFTYPE_MESH_POINT:
  30#endif
  31        case NL80211_IFTYPE_AP:
  32        case NL80211_IFTYPE_AP_VLAN:
  33        case NL80211_IFTYPE_WDS:
  34                return true;
  35        default:
  36                return false;
  37        }
  38}
  39
  40static bool nl80211_params_check(enum nl80211_iftype type,
  41                                 struct vif_params *params)
  42{
  43        if (!nl80211_type_check(type))
  44                return false;
  45
  46        return true;
  47}
  48
  49static int ieee80211_add_iface(struct wiphy *wiphy, char *name,
  50                               enum nl80211_iftype type, u32 *flags,
  51                               struct vif_params *params)
  52{
  53        struct ieee80211_local *local = wiphy_priv(wiphy);
  54        struct net_device *dev;
  55        struct ieee80211_sub_if_data *sdata;
  56        int err;
  57
  58        if (!nl80211_params_check(type, params))
  59                return -EINVAL;
  60
  61        err = ieee80211_if_add(local, name, &dev, type, params);
  62        if (err || type != NL80211_IFTYPE_MONITOR || !flags)
  63                return err;
  64
  65        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  66        sdata->u.mntr_flags = *flags;
  67        return 0;
  68}
  69
  70static int ieee80211_del_iface(struct wiphy *wiphy, struct net_device *dev)
  71{
  72        ieee80211_if_remove(IEEE80211_DEV_TO_SUB_IF(dev));
  73
  74        return 0;
  75}
  76
  77static int ieee80211_change_iface(struct wiphy *wiphy,
  78                                  struct net_device *dev,
  79                                  enum nl80211_iftype type, u32 *flags,
  80                                  struct vif_params *params)
  81{
  82        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  83        int ret;
  84
  85        if (ieee80211_sdata_running(sdata))
  86                return -EBUSY;
  87
  88        if (!nl80211_params_check(type, params))
  89                return -EINVAL;
  90
  91        ret = ieee80211_if_change_type(sdata, type);
  92        if (ret)
  93                return ret;
  94
  95        if (ieee80211_vif_is_mesh(&sdata->vif) && params->mesh_id_len)
  96                ieee80211_sdata_set_mesh_id(sdata,
  97                                            params->mesh_id_len,
  98                                            params->mesh_id);
  99
 100        if (type == NL80211_IFTYPE_AP_VLAN &&
 101            params && params->use_4addr == 0)
 102                rcu_assign_pointer(sdata->u.vlan.sta, NULL);
 103        else if (type == NL80211_IFTYPE_STATION &&
 104                 params && params->use_4addr >= 0)
 105                sdata->u.mgd.use_4addr = params->use_4addr;
 106
 107        if (sdata->vif.type == NL80211_IFTYPE_MONITOR && flags)
 108                sdata->u.mntr_flags = *flags;
 109
 110        return 0;
 111}
 112
 113static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
 114                             u8 key_idx, const u8 *mac_addr,
 115                             struct key_params *params)
 116{
 117        struct ieee80211_sub_if_data *sdata;
 118        struct sta_info *sta = NULL;
 119        enum ieee80211_key_alg alg;
 120        struct ieee80211_key *key;
 121        int err;
 122
 123        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 124
 125        switch (params->cipher) {
 126        case WLAN_CIPHER_SUITE_WEP40:
 127        case WLAN_CIPHER_SUITE_WEP104:
 128                alg = ALG_WEP;
 129                break;
 130        case WLAN_CIPHER_SUITE_TKIP:
 131                alg = ALG_TKIP;
 132                break;
 133        case WLAN_CIPHER_SUITE_CCMP:
 134                alg = ALG_CCMP;
 135                break;
 136        case WLAN_CIPHER_SUITE_AES_CMAC:
 137                alg = ALG_AES_CMAC;
 138                break;
 139        default:
 140                return -EINVAL;
 141        }
 142
 143        key = ieee80211_key_alloc(alg, key_idx, params->key_len, params->key,
 144                                  params->seq_len, params->seq);
 145        if (!key)
 146                return -ENOMEM;
 147
 148        rcu_read_lock();
 149
 150        if (mac_addr) {
 151                sta = sta_info_get_bss(sdata, mac_addr);
 152                if (!sta) {
 153                        ieee80211_key_free(key);
 154                        err = -ENOENT;
 155                        goto out_unlock;
 156                }
 157        }
 158
 159        ieee80211_key_link(key, sdata, sta);
 160
 161        err = 0;
 162 out_unlock:
 163        rcu_read_unlock();
 164
 165        return err;
 166}
 167
 168static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev,
 169                             u8 key_idx, const u8 *mac_addr)
 170{
 171        struct ieee80211_sub_if_data *sdata;
 172        struct sta_info *sta;
 173        int ret;
 174
 175        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 176
 177        rcu_read_lock();
 178
 179        if (mac_addr) {
 180                ret = -ENOENT;
 181
 182                sta = sta_info_get_bss(sdata, mac_addr);
 183                if (!sta)
 184                        goto out_unlock;
 185
 186                if (sta->key) {
 187                        ieee80211_key_free(sta->key);
 188                        WARN_ON(sta->key);
 189                        ret = 0;
 190                }
 191
 192                goto out_unlock;
 193        }
 194
 195        if (!sdata->keys[key_idx]) {
 196                ret = -ENOENT;
 197                goto out_unlock;
 198        }
 199
 200        ieee80211_key_free(sdata->keys[key_idx]);
 201        WARN_ON(sdata->keys[key_idx]);
 202
 203        ret = 0;
 204 out_unlock:
 205        rcu_read_unlock();
 206
 207        return ret;
 208}
 209
 210static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
 211                             u8 key_idx, const u8 *mac_addr, void *cookie,
 212                             void (*callback)(void *cookie,
 213                                              struct key_params *params))
 214{
 215        struct ieee80211_sub_if_data *sdata;
 216        struct sta_info *sta = NULL;
 217        u8 seq[6] = {0};
 218        struct key_params params;
 219        struct ieee80211_key *key;
 220        u32 iv32;
 221        u16 iv16;
 222        int err = -ENOENT;
 223
 224        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 225
 226        rcu_read_lock();
 227
 228        if (mac_addr) {
 229                sta = sta_info_get_bss(sdata, mac_addr);
 230                if (!sta)
 231                        goto out;
 232
 233                key = sta->key;
 234        } else
 235                key = sdata->keys[key_idx];
 236
 237        if (!key)
 238                goto out;
 239
 240        memset(&params, 0, sizeof(params));
 241
 242        switch (key->conf.alg) {
 243        case ALG_TKIP:
 244                params.cipher = WLAN_CIPHER_SUITE_TKIP;
 245
 246                iv32 = key->u.tkip.tx.iv32;
 247                iv16 = key->u.tkip.tx.iv16;
 248
 249                if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)
 250                        drv_get_tkip_seq(sdata->local,
 251                                         key->conf.hw_key_idx,
 252                                         &iv32, &iv16);
 253
 254                seq[0] = iv16 & 0xff;
 255                seq[1] = (iv16 >> 8) & 0xff;
 256                seq[2] = iv32 & 0xff;
 257                seq[3] = (iv32 >> 8) & 0xff;
 258                seq[4] = (iv32 >> 16) & 0xff;
 259                seq[5] = (iv32 >> 24) & 0xff;
 260                params.seq = seq;
 261                params.seq_len = 6;
 262                break;
 263        case ALG_CCMP:
 264                params.cipher = WLAN_CIPHER_SUITE_CCMP;
 265                seq[0] = key->u.ccmp.tx_pn[5];
 266                seq[1] = key->u.ccmp.tx_pn[4];
 267                seq[2] = key->u.ccmp.tx_pn[3];
 268                seq[3] = key->u.ccmp.tx_pn[2];
 269                seq[4] = key->u.ccmp.tx_pn[1];
 270                seq[5] = key->u.ccmp.tx_pn[0];
 271                params.seq = seq;
 272                params.seq_len = 6;
 273                break;
 274        case ALG_WEP:
 275                if (key->conf.keylen == 5)
 276                        params.cipher = WLAN_CIPHER_SUITE_WEP40;
 277                else
 278                        params.cipher = WLAN_CIPHER_SUITE_WEP104;
 279                break;
 280        case ALG_AES_CMAC:
 281                params.cipher = WLAN_CIPHER_SUITE_AES_CMAC;
 282                seq[0] = key->u.aes_cmac.tx_pn[5];
 283                seq[1] = key->u.aes_cmac.tx_pn[4];
 284                seq[2] = key->u.aes_cmac.tx_pn[3];
 285                seq[3] = key->u.aes_cmac.tx_pn[2];
 286                seq[4] = key->u.aes_cmac.tx_pn[1];
 287                seq[5] = key->u.aes_cmac.tx_pn[0];
 288                params.seq = seq;
 289                params.seq_len = 6;
 290                break;
 291        }
 292
 293        params.key = key->conf.key;
 294        params.key_len = key->conf.keylen;
 295
 296        callback(cookie, &params);
 297        err = 0;
 298
 299 out:
 300        rcu_read_unlock();
 301        return err;
 302}
 303
 304static int ieee80211_config_default_key(struct wiphy *wiphy,
 305                                        struct net_device *dev,
 306                                        u8 key_idx)
 307{
 308        struct ieee80211_sub_if_data *sdata;
 309
 310        rcu_read_lock();
 311
 312        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 313        ieee80211_set_default_key(sdata, key_idx);
 314
 315        rcu_read_unlock();
 316
 317        return 0;
 318}
 319
 320static int ieee80211_config_default_mgmt_key(struct wiphy *wiphy,
 321                                             struct net_device *dev,
 322                                             u8 key_idx)
 323{
 324        struct ieee80211_sub_if_data *sdata;
 325
 326        rcu_read_lock();
 327
 328        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 329        ieee80211_set_default_mgmt_key(sdata, key_idx);
 330
 331        rcu_read_unlock();
 332
 333        return 0;
 334}
 335
 336static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
 337{
 338        struct ieee80211_sub_if_data *sdata = sta->sdata;
 339
 340        sinfo->generation = sdata->local->sta_generation;
 341
 342        sinfo->filled = STATION_INFO_INACTIVE_TIME |
 343                        STATION_INFO_RX_BYTES |
 344                        STATION_INFO_TX_BYTES |
 345                        STATION_INFO_RX_PACKETS |
 346                        STATION_INFO_TX_PACKETS |
 347                        STATION_INFO_TX_BITRATE;
 348
 349        sinfo->inactive_time = jiffies_to_msecs(jiffies - sta->last_rx);
 350        sinfo->rx_bytes = sta->rx_bytes;
 351        sinfo->tx_bytes = sta->tx_bytes;
 352        sinfo->rx_packets = sta->rx_packets;
 353        sinfo->tx_packets = sta->tx_packets;
 354
 355        if ((sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) ||
 356            (sta->local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)) {
 357                sinfo->filled |= STATION_INFO_SIGNAL;
 358                sinfo->signal = (s8)sta->last_signal;
 359        }
 360
 361        sinfo->txrate.flags = 0;
 362        if (sta->last_tx_rate.flags & IEEE80211_TX_RC_MCS)
 363                sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS;
 364        if (sta->last_tx_rate.flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
 365                sinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH;
 366        if (sta->last_tx_rate.flags & IEEE80211_TX_RC_SHORT_GI)
 367                sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
 368
 369        if (!(sta->last_tx_rate.flags & IEEE80211_TX_RC_MCS)) {
 370                struct ieee80211_supported_band *sband;
 371                sband = sta->local->hw.wiphy->bands[
 372                                sta->local->hw.conf.channel->band];
 373                sinfo->txrate.legacy =
 374                        sband->bitrates[sta->last_tx_rate.idx].bitrate;
 375        } else
 376                sinfo->txrate.mcs = sta->last_tx_rate.idx;
 377
 378        if (ieee80211_vif_is_mesh(&sdata->vif)) {
 379#ifdef CONFIG_MAC80211_MESH
 380                sinfo->filled |= STATION_INFO_LLID |
 381                                 STATION_INFO_PLID |
 382                                 STATION_INFO_PLINK_STATE;
 383
 384                sinfo->llid = le16_to_cpu(sta->llid);
 385                sinfo->plid = le16_to_cpu(sta->plid);
 386                sinfo->plink_state = sta->plink_state;
 387#endif
 388        }
 389}
 390
 391
 392static int ieee80211_dump_station(struct wiphy *wiphy, struct net_device *dev,
 393                                 int idx, u8 *mac, struct station_info *sinfo)
 394{
 395        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 396        struct sta_info *sta;
 397        int ret = -ENOENT;
 398
 399        rcu_read_lock();
 400
 401        sta = sta_info_get_by_idx(sdata, idx);
 402        if (sta) {
 403                ret = 0;
 404                memcpy(mac, sta->sta.addr, ETH_ALEN);
 405                sta_set_sinfo(sta, sinfo);
 406        }
 407
 408        rcu_read_unlock();
 409
 410        return ret;
 411}
 412
 413static int ieee80211_dump_survey(struct wiphy *wiphy, struct net_device *dev,
 414                                 int idx, struct survey_info *survey)
 415{
 416        struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
 417
 418        if (!local->ops->get_survey)
 419                return -EOPNOTSUPP;
 420
 421        return drv_get_survey(local, idx, survey);
 422}
 423
 424static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev,
 425                                 u8 *mac, struct station_info *sinfo)
 426{
 427        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 428        struct sta_info *sta;
 429        int ret = -ENOENT;
 430
 431        rcu_read_lock();
 432
 433        sta = sta_info_get_bss(sdata, mac);
 434        if (sta) {
 435                ret = 0;
 436                sta_set_sinfo(sta, sinfo);
 437        }
 438
 439        rcu_read_unlock();
 440
 441        return ret;
 442}
 443
 444/*
 445 * This handles both adding a beacon and setting new beacon info
 446 */
 447static int ieee80211_config_beacon(struct ieee80211_sub_if_data *sdata,
 448                                   struct beacon_parameters *params)
 449{
 450        struct beacon_data *new, *old;
 451        int new_head_len, new_tail_len;
 452        int size;
 453        int err = -EINVAL;
 454
 455        old = sdata->u.ap.beacon;
 456
 457        /* head must not be zero-length */
 458        if (params->head && !params->head_len)
 459                return -EINVAL;
 460
 461        /*
 462         * This is a kludge. beacon interval should really be part
 463         * of the beacon information.
 464         */
 465        if (params->interval &&
 466            (sdata->vif.bss_conf.beacon_int != params->interval)) {
 467                sdata->vif.bss_conf.beacon_int = params->interval;
 468                ieee80211_bss_info_change_notify(sdata,
 469                                                 BSS_CHANGED_BEACON_INT);
 470        }
 471
 472        /* Need to have a beacon head if we don't have one yet */
 473        if (!params->head && !old)
 474                return err;
 475
 476        /* sorry, no way to start beaconing without dtim period */
 477        if (!params->dtim_period && !old)
 478                return err;
 479
 480        /* new or old head? */
 481        if (params->head)
 482                new_head_len = params->head_len;
 483        else
 484                new_head_len = old->head_len;
 485
 486        /* new or old tail? */
 487        if (params->tail || !old)
 488                /* params->tail_len will be zero for !params->tail */
 489                new_tail_len = params->tail_len;
 490        else
 491                new_tail_len = old->tail_len;
 492
 493        size = sizeof(*new) + new_head_len + new_tail_len;
 494
 495        new = kzalloc(size, GFP_KERNEL);
 496        if (!new)
 497                return -ENOMEM;
 498
 499        /* start filling the new info now */
 500
 501        /* new or old dtim period? */
 502        if (params->dtim_period)
 503                new->dtim_period = params->dtim_period;
 504        else
 505                new->dtim_period = old->dtim_period;
 506
 507        /*
 508         * pointers go into the block we allocated,
 509         * memory is | beacon_data | head | tail |
 510         */
 511        new->head = ((u8 *) new) + sizeof(*new);
 512        new->tail = new->head + new_head_len;
 513        new->head_len = new_head_len;
 514        new->tail_len = new_tail_len;
 515
 516        /* copy in head */
 517        if (params->head)
 518                memcpy(new->head, params->head, new_head_len);
 519        else
 520                memcpy(new->head, old->head, new_head_len);
 521
 522        /* copy in optional tail */
 523        if (params->tail)
 524                memcpy(new->tail, params->tail, new_tail_len);
 525        else
 526                if (old)
 527                        memcpy(new->tail, old->tail, new_tail_len);
 528
 529        sdata->vif.bss_conf.dtim_period = new->dtim_period;
 530
 531        rcu_assign_pointer(sdata->u.ap.beacon, new);
 532
 533        synchronize_rcu();
 534
 535        kfree(old);
 536
 537        ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED |
 538                                                BSS_CHANGED_BEACON);
 539        return 0;
 540}
 541
 542static int ieee80211_add_beacon(struct wiphy *wiphy, struct net_device *dev,
 543                                struct beacon_parameters *params)
 544{
 545        struct ieee80211_sub_if_data *sdata;
 546        struct beacon_data *old;
 547
 548        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 549
 550        old = sdata->u.ap.beacon;
 551
 552        if (old)
 553                return -EALREADY;
 554
 555        return ieee80211_config_beacon(sdata, params);
 556}
 557
 558static int ieee80211_set_beacon(struct wiphy *wiphy, struct net_device *dev,
 559                                struct beacon_parameters *params)
 560{
 561        struct ieee80211_sub_if_data *sdata;
 562        struct beacon_data *old;
 563
 564        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 565
 566        old = sdata->u.ap.beacon;
 567
 568        if (!old)
 569                return -ENOENT;
 570
 571        return ieee80211_config_beacon(sdata, params);
 572}
 573
 574static int ieee80211_del_beacon(struct wiphy *wiphy, struct net_device *dev)
 575{
 576        struct ieee80211_sub_if_data *sdata;
 577        struct beacon_data *old;
 578
 579        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 580
 581        old = sdata->u.ap.beacon;
 582
 583        if (!old)
 584                return -ENOENT;
 585
 586        rcu_assign_pointer(sdata->u.ap.beacon, NULL);
 587        synchronize_rcu();
 588        kfree(old);
 589
 590        ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
 591        return 0;
 592}
 593
 594/* Layer 2 Update frame (802.2 Type 1 LLC XID Update response) */
 595struct iapp_layer2_update {
 596        u8 da[ETH_ALEN];        /* broadcast */
 597        u8 sa[ETH_ALEN];        /* STA addr */
 598        __be16 len;             /* 6 */
 599        u8 dsap;                /* 0 */
 600        u8 ssap;                /* 0 */
 601        u8 control;
 602        u8 xid_info[3];
 603} __attribute__ ((packed));
 604
 605static void ieee80211_send_layer2_update(struct sta_info *sta)
 606{
 607        struct iapp_layer2_update *msg;
 608        struct sk_buff *skb;
 609
 610        /* Send Level 2 Update Frame to update forwarding tables in layer 2
 611         * bridge devices */
 612
 613        skb = dev_alloc_skb(sizeof(*msg));
 614        if (!skb)
 615                return;
 616        msg = (struct iapp_layer2_update *)skb_put(skb, sizeof(*msg));
 617
 618        /* 802.2 Type 1 Logical Link Control (LLC) Exchange Identifier (XID)
 619         * Update response frame; IEEE Std 802.2-1998, 5.4.1.2.1 */
 620
 621        memset(msg->da, 0xff, ETH_ALEN);
 622        memcpy(msg->sa, sta->sta.addr, ETH_ALEN);
 623        msg->len = htons(6);
 624        msg->dsap = 0;
 625        msg->ssap = 0x01;       /* NULL LSAP, CR Bit: Response */
 626        msg->control = 0xaf;    /* XID response lsb.1111F101.
 627                                 * F=0 (no poll command; unsolicited frame) */
 628        msg->xid_info[0] = 0x81;        /* XID format identifier */
 629        msg->xid_info[1] = 1;   /* LLC types/classes: Type 1 LLC */
 630        msg->xid_info[2] = 0;   /* XID sender's receive window size (RW) */
 631
 632        skb->dev = sta->sdata->dev;
 633        skb->protocol = eth_type_trans(skb, sta->sdata->dev);
 634        memset(skb->cb, 0, sizeof(skb->cb));
 635        netif_rx_ni(skb);
 636}
 637
 638static void sta_apply_parameters(struct ieee80211_local *local,
 639                                 struct sta_info *sta,
 640                                 struct station_parameters *params)
 641{
 642        u32 rates;
 643        int i, j;
 644        struct ieee80211_supported_band *sband;
 645        struct ieee80211_sub_if_data *sdata = sta->sdata;
 646        u32 mask, set;
 647
 648        sband = local->hw.wiphy->bands[local->oper_channel->band];
 649
 650        spin_lock_bh(&sta->lock);
 651        mask = params->sta_flags_mask;
 652        set = params->sta_flags_set;
 653
 654        if (mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
 655                sta->flags &= ~WLAN_STA_AUTHORIZED;
 656                if (set & BIT(NL80211_STA_FLAG_AUTHORIZED))
 657                        sta->flags |= WLAN_STA_AUTHORIZED;
 658        }
 659
 660        if (mask & BIT(NL80211_STA_FLAG_SHORT_PREAMBLE)) {
 661                sta->flags &= ~WLAN_STA_SHORT_PREAMBLE;
 662                if (set & BIT(NL80211_STA_FLAG_SHORT_PREAMBLE))
 663                        sta->flags |= WLAN_STA_SHORT_PREAMBLE;
 664        }
 665
 666        if (mask & BIT(NL80211_STA_FLAG_WME)) {
 667                sta->flags &= ~WLAN_STA_WME;
 668                if (set & BIT(NL80211_STA_FLAG_WME))
 669                        sta->flags |= WLAN_STA_WME;
 670        }
 671
 672        if (mask & BIT(NL80211_STA_FLAG_MFP)) {
 673                sta->flags &= ~WLAN_STA_MFP;
 674                if (set & BIT(NL80211_STA_FLAG_MFP))
 675                        sta->flags |= WLAN_STA_MFP;
 676        }
 677        spin_unlock_bh(&sta->lock);
 678
 679        /*
 680         * cfg80211 validates this (1-2007) and allows setting the AID
 681         * only when creating a new station entry
 682         */
 683        if (params->aid)
 684                sta->sta.aid = params->aid;
 685
 686        /*
 687         * FIXME: updating the following information is racy when this
 688         *        function is called from ieee80211_change_station().
 689         *        However, all this information should be static so
 690         *        maybe we should just reject attemps to change it.
 691         */
 692
 693        if (params->listen_interval >= 0)
 694                sta->listen_interval = params->listen_interval;
 695
 696        if (params->supported_rates) {
 697                rates = 0;
 698
 699                for (i = 0; i < params->supported_rates_len; i++) {
 700                        int rate = (params->supported_rates[i] & 0x7f) * 5;
 701                        for (j = 0; j < sband->n_bitrates; j++) {
 702                                if (sband->bitrates[j].bitrate == rate)
 703                                        rates |= BIT(j);
 704                        }
 705                }
 706                sta->sta.supp_rates[local->oper_channel->band] = rates;
 707        }
 708
 709        if (params->ht_capa)
 710                ieee80211_ht_cap_ie_to_sta_ht_cap(sband,
 711                                                  params->ht_capa,
 712                                                  &sta->sta.ht_cap);
 713
 714        if (ieee80211_vif_is_mesh(&sdata->vif) && params->plink_action) {
 715                switch (params->plink_action) {
 716                case PLINK_ACTION_OPEN:
 717                        mesh_plink_open(sta);
 718                        break;
 719                case PLINK_ACTION_BLOCK:
 720                        mesh_plink_block(sta);
 721                        break;
 722                }
 723        }
 724}
 725
 726static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
 727                                 u8 *mac, struct station_parameters *params)
 728{
 729        struct ieee80211_local *local = wiphy_priv(wiphy);
 730        struct sta_info *sta;
 731        struct ieee80211_sub_if_data *sdata;
 732        int err;
 733        int layer2_update;
 734
 735        if (params->vlan) {
 736                sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
 737
 738                if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
 739                    sdata->vif.type != NL80211_IFTYPE_AP)
 740                        return -EINVAL;
 741        } else
 742                sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 743
 744        if (compare_ether_addr(mac, sdata->vif.addr) == 0)
 745                return -EINVAL;
 746
 747        if (is_multicast_ether_addr(mac))
 748                return -EINVAL;
 749
 750        sta = sta_info_alloc(sdata, mac, GFP_KERNEL);
 751        if (!sta)
 752                return -ENOMEM;
 753
 754        sta->flags = WLAN_STA_AUTH | WLAN_STA_ASSOC;
 755
 756        sta_apply_parameters(local, sta, params);
 757
 758        rate_control_rate_init(sta);
 759
 760        layer2_update = sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
 761                sdata->vif.type == NL80211_IFTYPE_AP;
 762
 763        err = sta_info_insert_rcu(sta);
 764        if (err) {
 765                rcu_read_unlock();
 766                return err;
 767        }
 768
 769        if (layer2_update)
 770                ieee80211_send_layer2_update(sta);
 771
 772        rcu_read_unlock();
 773
 774        return 0;
 775}
 776
 777static int ieee80211_del_station(struct wiphy *wiphy, struct net_device *dev,
 778                                 u8 *mac)
 779{
 780        struct ieee80211_local *local = wiphy_priv(wiphy);
 781        struct ieee80211_sub_if_data *sdata;
 782
 783        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 784
 785        if (mac)
 786                return sta_info_destroy_addr_bss(sdata, mac);
 787
 788        sta_info_flush(local, sdata);
 789        return 0;
 790}
 791
 792static int ieee80211_change_station(struct wiphy *wiphy,
 793                                    struct net_device *dev,
 794                                    u8 *mac,
 795                                    struct station_parameters *params)
 796{
 797        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 798        struct ieee80211_local *local = wiphy_priv(wiphy);
 799        struct sta_info *sta;
 800        struct ieee80211_sub_if_data *vlansdata;
 801
 802        rcu_read_lock();
 803
 804        sta = sta_info_get_bss(sdata, mac);
 805        if (!sta) {
 806                rcu_read_unlock();
 807                return -ENOENT;
 808        }
 809
 810        if (params->vlan && params->vlan != sta->sdata->dev) {
 811                vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
 812
 813                if (vlansdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
 814                    vlansdata->vif.type != NL80211_IFTYPE_AP) {
 815                        rcu_read_unlock();
 816                        return -EINVAL;
 817                }
 818
 819                if (params->vlan->ieee80211_ptr->use_4addr) {
 820                        if (vlansdata->u.vlan.sta) {
 821                                rcu_read_unlock();
 822                                return -EBUSY;
 823                        }
 824
 825                        rcu_assign_pointer(vlansdata->u.vlan.sta, sta);
 826                }
 827
 828                sta->sdata = vlansdata;
 829                ieee80211_send_layer2_update(sta);
 830        }
 831
 832        sta_apply_parameters(local, sta, params);
 833
 834        rcu_read_unlock();
 835
 836        return 0;
 837}
 838
 839#ifdef CONFIG_MAC80211_MESH
 840static int ieee80211_add_mpath(struct wiphy *wiphy, struct net_device *dev,
 841                                 u8 *dst, u8 *next_hop)
 842{
 843        struct ieee80211_sub_if_data *sdata;
 844        struct mesh_path *mpath;
 845        struct sta_info *sta;
 846        int err;
 847
 848        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 849
 850        rcu_read_lock();
 851        sta = sta_info_get(sdata, next_hop);
 852        if (!sta) {
 853                rcu_read_unlock();
 854                return -ENOENT;
 855        }
 856
 857        err = mesh_path_add(dst, sdata);
 858        if (err) {
 859                rcu_read_unlock();
 860                return err;
 861        }
 862
 863        mpath = mesh_path_lookup(dst, sdata);
 864        if (!mpath) {
 865                rcu_read_unlock();
 866                return -ENXIO;
 867        }
 868        mesh_path_fix_nexthop(mpath, sta);
 869
 870        rcu_read_unlock();
 871        return 0;
 872}
 873
 874static int ieee80211_del_mpath(struct wiphy *wiphy, struct net_device *dev,
 875                                 u8 *dst)
 876{
 877        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 878
 879        if (dst)
 880                return mesh_path_del(dst, sdata);
 881
 882        mesh_path_flush(sdata);
 883        return 0;
 884}
 885
 886static int ieee80211_change_mpath(struct wiphy *wiphy,
 887                                    struct net_device *dev,
 888                                    u8 *dst, u8 *next_hop)
 889{
 890        struct ieee80211_sub_if_data *sdata;
 891        struct mesh_path *mpath;
 892        struct sta_info *sta;
 893
 894        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 895
 896        rcu_read_lock();
 897
 898        sta = sta_info_get(sdata, next_hop);
 899        if (!sta) {
 900                rcu_read_unlock();
 901                return -ENOENT;
 902        }
 903
 904        mpath = mesh_path_lookup(dst, sdata);
 905        if (!mpath) {
 906                rcu_read_unlock();
 907                return -ENOENT;
 908        }
 909
 910        mesh_path_fix_nexthop(mpath, sta);
 911
 912        rcu_read_unlock();
 913        return 0;
 914}
 915
 916static void mpath_set_pinfo(struct mesh_path *mpath, u8 *next_hop,
 917                            struct mpath_info *pinfo)
 918{
 919        if (mpath->next_hop)
 920                memcpy(next_hop, mpath->next_hop->sta.addr, ETH_ALEN);
 921        else
 922                memset(next_hop, 0, ETH_ALEN);
 923
 924        pinfo->generation = mesh_paths_generation;
 925
 926        pinfo->filled = MPATH_INFO_FRAME_QLEN |
 927                        MPATH_INFO_SN |
 928                        MPATH_INFO_METRIC |
 929                        MPATH_INFO_EXPTIME |
 930                        MPATH_INFO_DISCOVERY_TIMEOUT |
 931                        MPATH_INFO_DISCOVERY_RETRIES |
 932                        MPATH_INFO_FLAGS;
 933
 934        pinfo->frame_qlen = mpath->frame_queue.qlen;
 935        pinfo->sn = mpath->sn;
 936        pinfo->metric = mpath->metric;
 937        if (time_before(jiffies, mpath->exp_time))
 938                pinfo->exptime = jiffies_to_msecs(mpath->exp_time - jiffies);
 939        pinfo->discovery_timeout =
 940                        jiffies_to_msecs(mpath->discovery_timeout);
 941        pinfo->discovery_retries = mpath->discovery_retries;
 942        pinfo->flags = 0;
 943        if (mpath->flags & MESH_PATH_ACTIVE)
 944                pinfo->flags |= NL80211_MPATH_FLAG_ACTIVE;
 945        if (mpath->flags & MESH_PATH_RESOLVING)
 946                pinfo->flags |= NL80211_MPATH_FLAG_RESOLVING;
 947        if (mpath->flags & MESH_PATH_SN_VALID)
 948                pinfo->flags |= NL80211_MPATH_FLAG_SN_VALID;
 949        if (mpath->flags & MESH_PATH_FIXED)
 950                pinfo->flags |= NL80211_MPATH_FLAG_FIXED;
 951        if (mpath->flags & MESH_PATH_RESOLVING)
 952                pinfo->flags |= NL80211_MPATH_FLAG_RESOLVING;
 953
 954        pinfo->flags = mpath->flags;
 955}
 956
 957static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev,
 958                               u8 *dst, u8 *next_hop, struct mpath_info *pinfo)
 959
 960{
 961        struct ieee80211_sub_if_data *sdata;
 962        struct mesh_path *mpath;
 963
 964        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 965
 966        rcu_read_lock();
 967        mpath = mesh_path_lookup(dst, sdata);
 968        if (!mpath) {
 969                rcu_read_unlock();
 970                return -ENOENT;
 971        }
 972        memcpy(dst, mpath->dst, ETH_ALEN);
 973        mpath_set_pinfo(mpath, next_hop, pinfo);
 974        rcu_read_unlock();
 975        return 0;
 976}
 977
 978static int ieee80211_dump_mpath(struct wiphy *wiphy, struct net_device *dev,
 979                                 int idx, u8 *dst, u8 *next_hop,
 980                                 struct mpath_info *pinfo)
 981{
 982        struct ieee80211_sub_if_data *sdata;
 983        struct mesh_path *mpath;
 984
 985        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 986
 987        rcu_read_lock();
 988        mpath = mesh_path_lookup_by_idx(idx, sdata);
 989        if (!mpath) {
 990                rcu_read_unlock();
 991                return -ENOENT;
 992        }
 993        memcpy(dst, mpath->dst, ETH_ALEN);
 994        mpath_set_pinfo(mpath, next_hop, pinfo);
 995        rcu_read_unlock();
 996        return 0;
 997}
 998
 999static int ieee80211_get_mesh_params(struct wiphy *wiphy,
1000                                struct net_device *dev,
1001                                struct mesh_config *conf)
1002{
1003        struct ieee80211_sub_if_data *sdata;
1004        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1005
1006        memcpy(conf, &(sdata->u.mesh.mshcfg), sizeof(struct mesh_config));
1007        return 0;
1008}
1009
1010static inline bool _chg_mesh_attr(enum nl80211_meshconf_params parm, u32 mask)
1011{
1012        return (mask >> (parm-1)) & 0x1;
1013}
1014
1015static int ieee80211_set_mesh_params(struct wiphy *wiphy,
1016                                struct net_device *dev,
1017                                const struct mesh_config *nconf, u32 mask)
1018{
1019        struct mesh_config *conf;
1020        struct ieee80211_sub_if_data *sdata;
1021        struct ieee80211_if_mesh *ifmsh;
1022
1023        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1024        ifmsh = &sdata->u.mesh;
1025
1026        /* Set the config options which we are interested in setting */
1027        conf = &(sdata->u.mesh.mshcfg);
1028        if (_chg_mesh_attr(NL80211_MESHCONF_RETRY_TIMEOUT, mask))
1029                conf->dot11MeshRetryTimeout = nconf->dot11MeshRetryTimeout;
1030        if (_chg_mesh_attr(NL80211_MESHCONF_CONFIRM_TIMEOUT, mask))
1031                conf->dot11MeshConfirmTimeout = nconf->dot11MeshConfirmTimeout;
1032        if (_chg_mesh_attr(NL80211_MESHCONF_HOLDING_TIMEOUT, mask))
1033                conf->dot11MeshHoldingTimeout = nconf->dot11MeshHoldingTimeout;
1034        if (_chg_mesh_attr(NL80211_MESHCONF_MAX_PEER_LINKS, mask))
1035                conf->dot11MeshMaxPeerLinks = nconf->dot11MeshMaxPeerLinks;
1036        if (_chg_mesh_attr(NL80211_MESHCONF_MAX_RETRIES, mask))
1037                conf->dot11MeshMaxRetries = nconf->dot11MeshMaxRetries;
1038        if (_chg_mesh_attr(NL80211_MESHCONF_TTL, mask))
1039                conf->dot11MeshTTL = nconf->dot11MeshTTL;
1040        if (_chg_mesh_attr(NL80211_MESHCONF_AUTO_OPEN_PLINKS, mask))
1041                conf->auto_open_plinks = nconf->auto_open_plinks;
1042        if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, mask))
1043                conf->dot11MeshHWMPmaxPREQretries =
1044                        nconf->dot11MeshHWMPmaxPREQretries;
1045        if (_chg_mesh_attr(NL80211_MESHCONF_PATH_REFRESH_TIME, mask))
1046                conf->path_refresh_time = nconf->path_refresh_time;
1047        if (_chg_mesh_attr(NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, mask))
1048                conf->min_discovery_timeout = nconf->min_discovery_timeout;
1049        if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, mask))
1050                conf->dot11MeshHWMPactivePathTimeout =
1051                        nconf->dot11MeshHWMPactivePathTimeout;
1052        if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, mask))
1053                conf->dot11MeshHWMPpreqMinInterval =
1054                        nconf->dot11MeshHWMPpreqMinInterval;
1055        if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
1056                           mask))
1057                conf->dot11MeshHWMPnetDiameterTraversalTime =
1058                        nconf->dot11MeshHWMPnetDiameterTraversalTime;
1059        if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ROOTMODE, mask)) {
1060                conf->dot11MeshHWMPRootMode = nconf->dot11MeshHWMPRootMode;
1061                ieee80211_mesh_root_setup(ifmsh);
1062        }
1063        return 0;
1064}
1065
1066#endif
1067
1068static int ieee80211_change_bss(struct wiphy *wiphy,
1069                                struct net_device *dev,
1070                                struct bss_parameters *params)
1071{
1072        struct ieee80211_sub_if_data *sdata;
1073        u32 changed = 0;
1074
1075        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1076
1077        if (params->use_cts_prot >= 0) {
1078                sdata->vif.bss_conf.use_cts_prot = params->use_cts_prot;
1079                changed |= BSS_CHANGED_ERP_CTS_PROT;
1080        }
1081        if (params->use_short_preamble >= 0) {
1082                sdata->vif.bss_conf.use_short_preamble =
1083                        params->use_short_preamble;
1084                changed |= BSS_CHANGED_ERP_PREAMBLE;
1085        }
1086
1087        if (!sdata->vif.bss_conf.use_short_slot &&
1088            sdata->local->hw.conf.channel->band == IEEE80211_BAND_5GHZ) {
1089                sdata->vif.bss_conf.use_short_slot = true;
1090                changed |= BSS_CHANGED_ERP_SLOT;
1091        }
1092
1093        if (params->use_short_slot_time >= 0) {
1094                sdata->vif.bss_conf.use_short_slot =
1095                        params->use_short_slot_time;
1096                changed |= BSS_CHANGED_ERP_SLOT;
1097        }
1098
1099        if (params->basic_rates) {
1100                int i, j;
1101                u32 rates = 0;
1102                struct ieee80211_local *local = wiphy_priv(wiphy);
1103                struct ieee80211_supported_band *sband =
1104                        wiphy->bands[local->oper_channel->band];
1105
1106                for (i = 0; i < params->basic_rates_len; i++) {
1107                        int rate = (params->basic_rates[i] & 0x7f) * 5;
1108                        for (j = 0; j < sband->n_bitrates; j++) {
1109                                if (sband->bitrates[j].bitrate == rate)
1110                                        rates |= BIT(j);
1111                        }
1112                }
1113                sdata->vif.bss_conf.basic_rates = rates;
1114                changed |= BSS_CHANGED_BASIC_RATES;
1115        }
1116
1117        if (params->ap_isolate >= 0) {
1118                if (params->ap_isolate)
1119                        sdata->flags |= IEEE80211_SDATA_DONT_BRIDGE_PACKETS;
1120                else
1121                        sdata->flags &= ~IEEE80211_SDATA_DONT_BRIDGE_PACKETS;
1122        }
1123
1124        ieee80211_bss_info_change_notify(sdata, changed);
1125
1126        return 0;
1127}
1128
1129static int ieee80211_set_txq_params(struct wiphy *wiphy,
1130                                    struct ieee80211_txq_params *params)
1131{
1132        struct ieee80211_local *local = wiphy_priv(wiphy);
1133        struct ieee80211_tx_queue_params p;
1134
1135        if (!local->ops->conf_tx)
1136                return -EOPNOTSUPP;
1137
1138        memset(&p, 0, sizeof(p));
1139        p.aifs = params->aifs;
1140        p.cw_max = params->cwmax;
1141        p.cw_min = params->cwmin;
1142        p.txop = params->txop;
1143
1144        /*
1145         * Setting tx queue params disables u-apsd because it's only
1146         * called in master mode.
1147         */
1148        p.uapsd = false;
1149
1150        if (drv_conf_tx(local, params->queue, &p)) {
1151                printk(KERN_DEBUG "%s: failed to set TX queue "
1152                       "parameters for queue %d\n",
1153                       wiphy_name(local->hw.wiphy), params->queue);
1154                return -EINVAL;
1155        }
1156
1157        /* enable WMM or activate new settings */
1158        local->hw.conf.flags |= IEEE80211_CONF_QOS;
1159        drv_config(local, IEEE80211_CONF_CHANGE_QOS);
1160
1161        return 0;
1162}
1163
1164static int ieee80211_set_channel(struct wiphy *wiphy,
1165                                 struct net_device *netdev,
1166                                 struct ieee80211_channel *chan,
1167                                 enum nl80211_channel_type channel_type)
1168{
1169        struct ieee80211_local *local = wiphy_priv(wiphy);
1170        struct ieee80211_sub_if_data *sdata = NULL;
1171
1172        if (netdev)
1173                sdata = IEEE80211_DEV_TO_SUB_IF(netdev);
1174
1175        switch (ieee80211_get_channel_mode(local, NULL)) {
1176        case CHAN_MODE_HOPPING:
1177                return -EBUSY;
1178        case CHAN_MODE_FIXED:
1179                if (local->oper_channel != chan)
1180                        return -EBUSY;
1181                if (!sdata && local->_oper_channel_type == channel_type)
1182                        return 0;
1183                break;
1184        case CHAN_MODE_UNDEFINED:
1185                break;
1186        }
1187
1188        local->oper_channel = chan;
1189
1190        if (!ieee80211_set_channel_type(local, sdata, channel_type))
1191                return -EBUSY;
1192
1193        ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
1194        if (sdata && sdata->vif.type != NL80211_IFTYPE_MONITOR)
1195                ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_HT);
1196
1197        return 0;
1198}
1199
1200#ifdef CONFIG_PM
1201static int ieee80211_suspend(struct wiphy *wiphy)
1202{
1203        return __ieee80211_suspend(wiphy_priv(wiphy));
1204}
1205
1206static int ieee80211_resume(struct wiphy *wiphy)
1207{
1208        return __ieee80211_resume(wiphy_priv(wiphy));
1209}
1210#else
1211#define ieee80211_suspend NULL
1212#define ieee80211_resume NULL
1213#endif
1214
1215static int ieee80211_scan(struct wiphy *wiphy,
1216                          struct net_device *dev,
1217                          struct cfg80211_scan_request *req)
1218{
1219        struct ieee80211_sub_if_data *sdata;
1220
1221        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1222
1223        if (sdata->vif.type != NL80211_IFTYPE_STATION &&
1224            sdata->vif.type != NL80211_IFTYPE_ADHOC &&
1225            sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
1226            (sdata->vif.type != NL80211_IFTYPE_AP || sdata->u.ap.beacon))
1227                return -EOPNOTSUPP;
1228
1229        return ieee80211_request_scan(sdata, req);
1230}
1231
1232static int ieee80211_auth(struct wiphy *wiphy, struct net_device *dev,
1233                          struct cfg80211_auth_request *req)
1234{
1235        return ieee80211_mgd_auth(IEEE80211_DEV_TO_SUB_IF(dev), req);
1236}
1237
1238static int ieee80211_assoc(struct wiphy *wiphy, struct net_device *dev,
1239                           struct cfg80211_assoc_request *req)
1240{
1241        struct ieee80211_local *local = wiphy_priv(wiphy);
1242        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1243
1244        switch (ieee80211_get_channel_mode(local, sdata)) {
1245        case CHAN_MODE_HOPPING:
1246                return -EBUSY;
1247        case CHAN_MODE_FIXED:
1248                if (local->oper_channel == req->bss->channel)
1249                        break;
1250                return -EBUSY;
1251        case CHAN_MODE_UNDEFINED:
1252                break;
1253        }
1254
1255        return ieee80211_mgd_assoc(IEEE80211_DEV_TO_SUB_IF(dev), req);
1256}
1257
1258static int ieee80211_deauth(struct wiphy *wiphy, struct net_device *dev,
1259                            struct cfg80211_deauth_request *req,
1260                            void *cookie)
1261{
1262        return ieee80211_mgd_deauth(IEEE80211_DEV_TO_SUB_IF(dev),
1263                                    req, cookie);
1264}
1265
1266static int ieee80211_disassoc(struct wiphy *wiphy, struct net_device *dev,
1267                              struct cfg80211_disassoc_request *req,
1268                              void *cookie)
1269{
1270        return ieee80211_mgd_disassoc(IEEE80211_DEV_TO_SUB_IF(dev),
1271                                      req, cookie);
1272}
1273
1274static int ieee80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
1275                               struct cfg80211_ibss_params *params)
1276{
1277        struct ieee80211_local *local = wiphy_priv(wiphy);
1278        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1279
1280        switch (ieee80211_get_channel_mode(local, sdata)) {
1281        case CHAN_MODE_HOPPING:
1282                return -EBUSY;
1283        case CHAN_MODE_FIXED:
1284                if (!params->channel_fixed)
1285                        return -EBUSY;
1286                if (local->oper_channel == params->channel)
1287                        break;
1288                return -EBUSY;
1289        case CHAN_MODE_UNDEFINED:
1290                break;
1291        }
1292
1293        return ieee80211_ibss_join(sdata, params);
1294}
1295
1296static int ieee80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev)
1297{
1298        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1299
1300        return ieee80211_ibss_leave(sdata);
1301}
1302
1303static int ieee80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
1304{
1305        struct ieee80211_local *local = wiphy_priv(wiphy);
1306        int err;
1307
1308        if (changed & WIPHY_PARAM_COVERAGE_CLASS) {
1309                err = drv_set_coverage_class(local, wiphy->coverage_class);
1310
1311                if (err)
1312                        return err;
1313        }
1314
1315        if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
1316                err = drv_set_rts_threshold(local, wiphy->rts_threshold);
1317
1318                if (err)
1319                        return err;
1320        }
1321
1322        if (changed & WIPHY_PARAM_RETRY_SHORT)
1323                local->hw.conf.short_frame_max_tx_count = wiphy->retry_short;
1324        if (changed & WIPHY_PARAM_RETRY_LONG)
1325                local->hw.conf.long_frame_max_tx_count = wiphy->retry_long;
1326        if (changed &
1327            (WIPHY_PARAM_RETRY_SHORT | WIPHY_PARAM_RETRY_LONG))
1328                ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_RETRY_LIMITS);
1329
1330        return 0;
1331}
1332
1333static int ieee80211_set_tx_power(struct wiphy *wiphy,
1334                                  enum tx_power_setting type, int dbm)
1335{
1336        struct ieee80211_local *local = wiphy_priv(wiphy);
1337        struct ieee80211_channel *chan = local->hw.conf.channel;
1338        u32 changes = 0;
1339
1340        switch (type) {
1341        case TX_POWER_AUTOMATIC:
1342                local->user_power_level = -1;
1343                break;
1344        case TX_POWER_LIMITED:
1345                if (dbm < 0)
1346                        return -EINVAL;
1347                local->user_power_level = dbm;
1348                break;
1349        case TX_POWER_FIXED:
1350                if (dbm < 0)
1351                        return -EINVAL;
1352                /* TODO: move to cfg80211 when it knows the channel */
1353                if (dbm > chan->max_power)
1354                        return -EINVAL;
1355                local->user_power_level = dbm;
1356                break;
1357        }
1358
1359        ieee80211_hw_config(local, changes);
1360
1361        return 0;
1362}
1363
1364static int ieee80211_get_tx_power(struct wiphy *wiphy, int *dbm)
1365{
1366        struct ieee80211_local *local = wiphy_priv(wiphy);
1367
1368        *dbm = local->hw.conf.power_level;
1369
1370        return 0;
1371}
1372
1373static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
1374                                  u8 *addr)
1375{
1376        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1377
1378        memcpy(&sdata->u.wds.remote_addr, addr, ETH_ALEN);
1379
1380        return 0;
1381}
1382
1383static void ieee80211_rfkill_poll(struct wiphy *wiphy)
1384{
1385        struct ieee80211_local *local = wiphy_priv(wiphy);
1386
1387        drv_rfkill_poll(local);
1388}
1389
1390#ifdef CONFIG_NL80211_TESTMODE
1391static int ieee80211_testmode_cmd(struct wiphy *wiphy, void *data, int len)
1392{
1393        struct ieee80211_local *local = wiphy_priv(wiphy);
1394
1395        if (!local->ops->testmode_cmd)
1396                return -EOPNOTSUPP;
1397
1398        return local->ops->testmode_cmd(&local->hw, data, len);
1399}
1400#endif
1401
1402int __ieee80211_request_smps(struct ieee80211_sub_if_data *sdata,
1403                             enum ieee80211_smps_mode smps_mode)
1404{
1405        const u8 *ap;
1406        enum ieee80211_smps_mode old_req;
1407        int err;
1408
1409        old_req = sdata->u.mgd.req_smps;
1410        sdata->u.mgd.req_smps = smps_mode;
1411
1412        if (old_req == smps_mode &&
1413            smps_mode != IEEE80211_SMPS_AUTOMATIC)
1414                return 0;
1415
1416        /*
1417         * If not associated, or current association is not an HT
1418         * association, there's no need to send an action frame.
1419         */
1420        if (!sdata->u.mgd.associated ||
1421            sdata->vif.bss_conf.channel_type == NL80211_CHAN_NO_HT) {
1422                mutex_lock(&sdata->local->iflist_mtx);
1423                ieee80211_recalc_smps(sdata->local, sdata);
1424                mutex_unlock(&sdata->local->iflist_mtx);
1425                return 0;
1426        }
1427
1428        ap = sdata->u.mgd.associated->bssid;
1429
1430        if (smps_mode == IEEE80211_SMPS_AUTOMATIC) {
1431                if (sdata->u.mgd.powersave)
1432                        smps_mode = IEEE80211_SMPS_DYNAMIC;
1433                else
1434                        smps_mode = IEEE80211_SMPS_OFF;
1435        }
1436
1437        /* send SM PS frame to AP */
1438        err = ieee80211_send_smps_action(sdata, smps_mode,
1439                                         ap, ap);
1440        if (err)
1441                sdata->u.mgd.req_smps = old_req;
1442
1443        return err;
1444}
1445
1446static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
1447                                    bool enabled, int timeout)
1448{
1449        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1450        struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
1451        struct ieee80211_conf *conf = &local->hw.conf;
1452
1453        if (sdata->vif.type != NL80211_IFTYPE_STATION)
1454                return -EOPNOTSUPP;
1455
1456        if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS))
1457                return -EOPNOTSUPP;
1458
1459        if (enabled == sdata->u.mgd.powersave &&
1460            timeout == conf->dynamic_ps_forced_timeout)
1461                return 0;
1462
1463        sdata->u.mgd.powersave = enabled;
1464        conf->dynamic_ps_forced_timeout = timeout;
1465
1466        /* no change, but if automatic follow powersave */
1467        mutex_lock(&sdata->u.mgd.mtx);
1468        __ieee80211_request_smps(sdata, sdata->u.mgd.req_smps);
1469        mutex_unlock(&sdata->u.mgd.mtx);
1470
1471        if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS)
1472                ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
1473
1474        ieee80211_recalc_ps(local, -1);
1475
1476        return 0;
1477}
1478
1479static int ieee80211_set_cqm_rssi_config(struct wiphy *wiphy,
1480                                         struct net_device *dev,
1481                                         s32 rssi_thold, u32 rssi_hyst)
1482{
1483        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1484        struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
1485        struct ieee80211_vif *vif = &sdata->vif;
1486        struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
1487
1488        if (rssi_thold == bss_conf->cqm_rssi_thold &&
1489            rssi_hyst == bss_conf->cqm_rssi_hyst)
1490                return 0;
1491
1492        bss_conf->cqm_rssi_thold = rssi_thold;
1493        bss_conf->cqm_rssi_hyst = rssi_hyst;
1494
1495        if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_CQM_RSSI)) {
1496                if (sdata->vif.type != NL80211_IFTYPE_STATION)
1497                        return -EOPNOTSUPP;
1498                return 0;
1499        }
1500
1501        /* tell the driver upon association, unless already associated */
1502        if (sdata->u.mgd.associated)
1503                ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_CQM);
1504
1505        return 0;
1506}
1507
1508static int ieee80211_set_bitrate_mask(struct wiphy *wiphy,
1509                                      struct net_device *dev,
1510                                      const u8 *addr,
1511                                      const struct cfg80211_bitrate_mask *mask)
1512{
1513        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1514        struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
1515        int i;
1516
1517        /*
1518         * This _could_ be supported by providing a hook for
1519         * drivers for this function, but at this point it
1520         * doesn't seem worth bothering.
1521         */
1522        if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)
1523                return -EOPNOTSUPP;
1524
1525
1526        for (i = 0; i < IEEE80211_NUM_BANDS; i++)
1527                sdata->rc_rateidx_mask[i] = mask->control[i].legacy;
1528
1529        return 0;
1530}
1531
1532static int ieee80211_remain_on_channel(struct wiphy *wiphy,
1533                                       struct net_device *dev,
1534                                       struct ieee80211_channel *chan,
1535                                       enum nl80211_channel_type channel_type,
1536                                       unsigned int duration,
1537                                       u64 *cookie)
1538{
1539        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1540
1541        return ieee80211_wk_remain_on_channel(sdata, chan, channel_type,
1542                                              duration, cookie);
1543}
1544
1545static int ieee80211_cancel_remain_on_channel(struct wiphy *wiphy,
1546                                              struct net_device *dev,
1547                                              u64 cookie)
1548{
1549        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1550
1551        return ieee80211_wk_cancel_remain_on_channel(sdata, cookie);
1552}
1553
1554static int ieee80211_action(struct wiphy *wiphy, struct net_device *dev,
1555                            struct ieee80211_channel *chan,
1556                            enum nl80211_channel_type channel_type,
1557                            const u8 *buf, size_t len, u64 *cookie)
1558{
1559        return ieee80211_mgd_action(IEEE80211_DEV_TO_SUB_IF(dev), chan,
1560                                    channel_type, buf, len, cookie);
1561}
1562
1563struct cfg80211_ops mac80211_config_ops = {
1564        .add_virtual_intf = ieee80211_add_iface,
1565        .del_virtual_intf = ieee80211_del_iface,
1566        .change_virtual_intf = ieee80211_change_iface,
1567        .add_key = ieee80211_add_key,
1568        .del_key = ieee80211_del_key,
1569        .get_key = ieee80211_get_key,
1570        .set_default_key = ieee80211_config_default_key,
1571        .set_default_mgmt_key = ieee80211_config_default_mgmt_key,
1572        .add_beacon = ieee80211_add_beacon,
1573        .set_beacon = ieee80211_set_beacon,
1574        .del_beacon = ieee80211_del_beacon,
1575        .add_station = ieee80211_add_station,
1576        .del_station = ieee80211_del_station,
1577        .change_station = ieee80211_change_station,
1578        .get_station = ieee80211_get_station,
1579        .dump_station = ieee80211_dump_station,
1580        .dump_survey = ieee80211_dump_survey,
1581#ifdef CONFIG_MAC80211_MESH
1582        .add_mpath = ieee80211_add_mpath,
1583        .del_mpath = ieee80211_del_mpath,
1584        .change_mpath = ieee80211_change_mpath,
1585        .get_mpath = ieee80211_get_mpath,
1586        .dump_mpath = ieee80211_dump_mpath,
1587        .set_mesh_params = ieee80211_set_mesh_params,
1588        .get_mesh_params = ieee80211_get_mesh_params,
1589#endif
1590        .change_bss = ieee80211_change_bss,
1591        .set_txq_params = ieee80211_set_txq_params,
1592        .set_channel = ieee80211_set_channel,
1593        .suspend = ieee80211_suspend,
1594        .resume = ieee80211_resume,
1595        .scan = ieee80211_scan,
1596        .auth = ieee80211_auth,
1597        .assoc = ieee80211_assoc,
1598        .deauth = ieee80211_deauth,
1599        .disassoc = ieee80211_disassoc,
1600        .join_ibss = ieee80211_join_ibss,
1601        .leave_ibss = ieee80211_leave_ibss,
1602        .set_wiphy_params = ieee80211_set_wiphy_params,
1603        .set_tx_power = ieee80211_set_tx_power,
1604        .get_tx_power = ieee80211_get_tx_power,
1605        .set_wds_peer = ieee80211_set_wds_peer,
1606        .rfkill_poll = ieee80211_rfkill_poll,
1607        CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
1608        .set_power_mgmt = ieee80211_set_power_mgmt,
1609        .set_bitrate_mask = ieee80211_set_bitrate_mask,
1610        .remain_on_channel = ieee80211_remain_on_channel,
1611        .cancel_remain_on_channel = ieee80211_cancel_remain_on_channel,
1612        .action = ieee80211_action,
1613        .set_cqm_rssi_config = ieee80211_set_cqm_rssi_config,
1614};
1615
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.