linux/net/mac80211/mesh.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2008, 2009 open80211s Ltd.
   3 * Authors:    Luis Carlos Cobo <luisca@cozybit.com>
   4 *             Javier Cardona <javier@cozybit.com>
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 */
  10
  11#include <linux/slab.h>
  12#include <asm/unaligned.h>
  13#include "ieee80211_i.h"
  14#include "mesh.h"
  15#include "driver-ops.h"
  16
  17static int mesh_allocated;
  18static struct kmem_cache *rm_cache;
  19
  20bool mesh_action_is_path_sel(struct ieee80211_mgmt *mgmt)
  21{
  22        return (mgmt->u.action.u.mesh_action.action_code ==
  23                        WLAN_MESH_ACTION_HWMP_PATH_SELECTION);
  24}
  25
  26void ieee80211s_init(void)
  27{
  28        mesh_pathtbl_init();
  29        mesh_allocated = 1;
  30        rm_cache = kmem_cache_create("mesh_rmc", sizeof(struct rmc_entry),
  31                                     0, 0, NULL);
  32}
  33
  34void ieee80211s_stop(void)
  35{
  36        if (!mesh_allocated)
  37                return;
  38        mesh_pathtbl_unregister();
  39        kmem_cache_destroy(rm_cache);
  40}
  41
  42static void ieee80211_mesh_housekeeping_timer(unsigned long data)
  43{
  44        struct ieee80211_sub_if_data *sdata = (void *) data;
  45        struct ieee80211_local *local = sdata->local;
  46        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
  47
  48        set_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags);
  49
  50        ieee80211_queue_work(&local->hw, &sdata->work);
  51}
  52
  53/**
  54 * mesh_matches_local - check if the config of a mesh point matches ours
  55 *
  56 * @sdata: local mesh subif
  57 * @ie: information elements of a management frame from the mesh peer
  58 *
  59 * This function checks if the mesh configuration of a mesh point matches the
  60 * local mesh configuration, i.e. if both nodes belong to the same mesh network.
  61 */
  62bool mesh_matches_local(struct ieee80211_sub_if_data *sdata,
  63                        struct ieee802_11_elems *ie)
  64{
  65        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
  66        u32 basic_rates = 0;
  67        struct cfg80211_chan_def sta_chan_def;
  68
  69        /*
  70         * As support for each feature is added, check for matching
  71         * - On mesh config capabilities
  72         *   - Power Save Support En
  73         *   - Sync support enabled
  74         *   - Sync support active
  75         *   - Sync support required from peer
  76         *   - MDA enabled
  77         * - Power management control on fc
  78         */
  79        if (!(ifmsh->mesh_id_len == ie->mesh_id_len &&
  80             memcmp(ifmsh->mesh_id, ie->mesh_id, ie->mesh_id_len) == 0 &&
  81             (ifmsh->mesh_pp_id == ie->mesh_config->meshconf_psel) &&
  82             (ifmsh->mesh_pm_id == ie->mesh_config->meshconf_pmetric) &&
  83             (ifmsh->mesh_cc_id == ie->mesh_config->meshconf_congest) &&
  84             (ifmsh->mesh_sp_id == ie->mesh_config->meshconf_synch) &&
  85             (ifmsh->mesh_auth_id == ie->mesh_config->meshconf_auth)))
  86                return false;
  87
  88        ieee80211_sta_get_rates(sdata, ie, ieee80211_get_sdata_band(sdata),
  89                                &basic_rates);
  90
  91        if (sdata->vif.bss_conf.basic_rates != basic_rates)
  92                return false;
  93
  94        ieee80211_ht_oper_to_chandef(sdata->vif.bss_conf.chandef.chan,
  95                                     ie->ht_operation, &sta_chan_def);
  96
  97        ieee80211_vht_oper_to_chandef(sdata->vif.bss_conf.chandef.chan,
  98                                      ie->vht_operation, &sta_chan_def);
  99
 100        if (!cfg80211_chandef_compatible(&sdata->vif.bss_conf.chandef,
 101                                         &sta_chan_def))
 102                return false;
 103
 104        return true;
 105}
 106
 107/**
 108 * mesh_peer_accepts_plinks - check if an mp is willing to establish peer links
 109 *
 110 * @ie: information elements of a management frame from the mesh peer
 111 */
 112bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie)
 113{
 114        return (ie->mesh_config->meshconf_cap &
 115                        IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS) != 0;
 116}
 117
 118/**
 119 * mesh_accept_plinks_update - update accepting_plink in local mesh beacons
 120 *
 121 * @sdata: mesh interface in which mesh beacons are going to be updated
 122 *
 123 * Returns: beacon changed flag if the beacon content changed.
 124 */
 125u32 mesh_accept_plinks_update(struct ieee80211_sub_if_data *sdata)
 126{
 127        bool free_plinks;
 128        u32 changed = 0;
 129
 130        /* In case mesh_plink_free_count > 0 and mesh_plinktbl_capacity == 0,
 131         * the mesh interface might be able to establish plinks with peers that
 132         * are already on the table but are not on PLINK_ESTAB state. However,
 133         * in general the mesh interface is not accepting peer link requests
 134         * from new peers, and that must be reflected in the beacon
 135         */
 136        free_plinks = mesh_plink_availables(sdata);
 137
 138        if (free_plinks != sdata->u.mesh.accepting_plinks) {
 139                sdata->u.mesh.accepting_plinks = free_plinks;
 140                changed = BSS_CHANGED_BEACON;
 141        }
 142
 143        return changed;
 144}
 145
 146/*
 147 * mesh_sta_cleanup - clean up any mesh sta state
 148 *
 149 * @sta: mesh sta to clean up.
 150 */
 151void mesh_sta_cleanup(struct sta_info *sta)
 152{
 153        struct ieee80211_sub_if_data *sdata = sta->sdata;
 154        u32 changed;
 155
 156        /*
 157         * maybe userspace handles peer allocation and peering, but in either
 158         * case the beacon is still generated by the kernel and we might need
 159         * an update.
 160         */
 161        changed = mesh_accept_plinks_update(sdata);
 162        if (!sdata->u.mesh.user_mpm) {
 163                changed |= mesh_plink_deactivate(sta);
 164                del_timer_sync(&sta->mesh->plink_timer);
 165        }
 166
 167        if (changed)
 168                ieee80211_mbss_info_change_notify(sdata, changed);
 169}
 170
 171int mesh_rmc_init(struct ieee80211_sub_if_data *sdata)
 172{
 173        int i;
 174
 175        sdata->u.mesh.rmc = kmalloc(sizeof(struct mesh_rmc), GFP_KERNEL);
 176        if (!sdata->u.mesh.rmc)
 177                return -ENOMEM;
 178        sdata->u.mesh.rmc->idx_mask = RMC_BUCKETS - 1;
 179        for (i = 0; i < RMC_BUCKETS; i++)
 180                INIT_LIST_HEAD(&sdata->u.mesh.rmc->bucket[i]);
 181        return 0;
 182}
 183
 184void mesh_rmc_free(struct ieee80211_sub_if_data *sdata)
 185{
 186        struct mesh_rmc *rmc = sdata->u.mesh.rmc;
 187        struct rmc_entry *p, *n;
 188        int i;
 189
 190        if (!sdata->u.mesh.rmc)
 191                return;
 192
 193        for (i = 0; i < RMC_BUCKETS; i++) {
 194                list_for_each_entry_safe(p, n, &rmc->bucket[i], list) {
 195                        list_del(&p->list);
 196                        kmem_cache_free(rm_cache, p);
 197                }
 198        }
 199
 200        kfree(rmc);
 201        sdata->u.mesh.rmc = NULL;
 202}
 203
 204/**
 205 * mesh_rmc_check - Check frame in recent multicast cache and add if absent.
 206 *
 207 * @sdata:      interface
 208 * @sa:         source address
 209 * @mesh_hdr:   mesh_header
 210 *
 211 * Returns: 0 if the frame is not in the cache, nonzero otherwise.
 212 *
 213 * Checks using the source address and the mesh sequence number if we have
 214 * received this frame lately. If the frame is not in the cache, it is added to
 215 * it.
 216 */
 217int mesh_rmc_check(struct ieee80211_sub_if_data *sdata,
 218                   const u8 *sa, struct ieee80211s_hdr *mesh_hdr)
 219{
 220        struct mesh_rmc *rmc = sdata->u.mesh.rmc;
 221        u32 seqnum = 0;
 222        int entries = 0;
 223        u8 idx;
 224        struct rmc_entry *p, *n;
 225
 226        /* Don't care about endianness since only match matters */
 227        memcpy(&seqnum, &mesh_hdr->seqnum, sizeof(mesh_hdr->seqnum));
 228        idx = le32_to_cpu(mesh_hdr->seqnum) & rmc->idx_mask;
 229        list_for_each_entry_safe(p, n, &rmc->bucket[idx], list) {
 230                ++entries;
 231                if (time_after(jiffies, p->exp_time) ||
 232                    entries == RMC_QUEUE_MAX_LEN) {
 233                        list_del(&p->list);
 234                        kmem_cache_free(rm_cache, p);
 235                        --entries;
 236                } else if ((seqnum == p->seqnum) && ether_addr_equal(sa, p->sa))
 237                        return -1;
 238        }
 239
 240        p = kmem_cache_alloc(rm_cache, GFP_ATOMIC);
 241        if (!p)
 242                return 0;
 243
 244        p->seqnum = seqnum;
 245        p->exp_time = jiffies + RMC_TIMEOUT;
 246        memcpy(p->sa, sa, ETH_ALEN);
 247        list_add(&p->list, &rmc->bucket[idx]);
 248        return 0;
 249}
 250
 251int mesh_add_meshconf_ie(struct ieee80211_sub_if_data *sdata,
 252                         struct sk_buff *skb)
 253{
 254        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
 255        u8 *pos, neighbors;
 256        u8 meshconf_len = sizeof(struct ieee80211_meshconf_ie);
 257
 258        if (skb_tailroom(skb) < 2 + meshconf_len)
 259                return -ENOMEM;
 260
 261        pos = skb_put(skb, 2 + meshconf_len);
 262        *pos++ = WLAN_EID_MESH_CONFIG;
 263        *pos++ = meshconf_len;
 264
 265        /* save a pointer for quick updates in pre-tbtt */
 266        ifmsh->meshconf_offset = pos - skb->data;
 267
 268        /* Active path selection protocol ID */
 269        *pos++ = ifmsh->mesh_pp_id;
 270        /* Active path selection metric ID   */
 271        *pos++ = ifmsh->mesh_pm_id;
 272        /* Congestion control mode identifier */
 273        *pos++ = ifmsh->mesh_cc_id;
 274        /* Synchronization protocol identifier */
 275        *pos++ = ifmsh->mesh_sp_id;
 276        /* Authentication Protocol identifier */
 277        *pos++ = ifmsh->mesh_auth_id;
 278        /* Mesh Formation Info - number of neighbors */
 279        neighbors = atomic_read(&ifmsh->estab_plinks);
 280        neighbors = min_t(int, neighbors, IEEE80211_MAX_MESH_PEERINGS);
 281        *pos++ = neighbors << 1;
 282        /* Mesh capability */
 283        *pos = 0x00;
 284        *pos |= ifmsh->mshcfg.dot11MeshForwarding ?
 285                        IEEE80211_MESHCONF_CAPAB_FORWARDING : 0x00;
 286        *pos |= ifmsh->accepting_plinks ?
 287                        IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS : 0x00;
 288        /* Mesh PS mode. See IEEE802.11-2012 8.4.2.100.8 */
 289        *pos |= ifmsh->ps_peers_deep_sleep ?
 290                        IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL : 0x00;
 291        *pos++ |= ifmsh->adjusting_tbtt ?
 292                        IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING : 0x00;
 293        *pos++ = 0x00;
 294
 295        return 0;
 296}
 297
 298int mesh_add_meshid_ie(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb)
 299{
 300        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
 301        u8 *pos;
 302
 303        if (skb_tailroom(skb) < 2 + ifmsh->mesh_id_len)
 304                return -ENOMEM;
 305
 306        pos = skb_put(skb, 2 + ifmsh->mesh_id_len);
 307        *pos++ = WLAN_EID_MESH_ID;
 308        *pos++ = ifmsh->mesh_id_len;
 309        if (ifmsh->mesh_id_len)
 310                memcpy(pos, ifmsh->mesh_id, ifmsh->mesh_id_len);
 311
 312        return 0;
 313}
 314
 315static int mesh_add_awake_window_ie(struct ieee80211_sub_if_data *sdata,
 316                                    struct sk_buff *skb)
 317{
 318        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
 319        u8 *pos;
 320
 321        /* see IEEE802.11-2012 13.14.6 */
 322        if (ifmsh->ps_peers_light_sleep == 0 &&
 323            ifmsh->ps_peers_deep_sleep == 0 &&
 324            ifmsh->nonpeer_pm == NL80211_MESH_POWER_ACTIVE)
 325                return 0;
 326
 327        if (skb_tailroom(skb) < 4)
 328                return -ENOMEM;
 329
 330        pos = skb_put(skb, 2 + 2);
 331        *pos++ = WLAN_EID_MESH_AWAKE_WINDOW;
 332        *pos++ = 2;
 333        put_unaligned_le16(ifmsh->mshcfg.dot11MeshAwakeWindowDuration, pos);
 334
 335        return 0;
 336}
 337
 338int mesh_add_vendor_ies(struct ieee80211_sub_if_data *sdata,
 339                        struct sk_buff *skb)
 340{
 341        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
 342        u8 offset, len;
 343        const u8 *data;
 344
 345        if (!ifmsh->ie || !ifmsh->ie_len)
 346                return 0;
 347
 348        /* fast-forward to vendor IEs */
 349        offset = ieee80211_ie_split_vendor(ifmsh->ie, ifmsh->ie_len, 0);
 350
 351        if (offset) {
 352                len = ifmsh->ie_len - offset;
 353                data = ifmsh->ie + offset;
 354                if (skb_tailroom(skb) < len)
 355                        return -ENOMEM;
 356                memcpy(skb_put(skb, len), data, len);
 357        }
 358
 359        return 0;
 360}
 361
 362int mesh_add_rsn_ie(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb)
 363{
 364        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
 365        u8 len = 0;
 366        const u8 *data;
 367
 368        if (!ifmsh->ie || !ifmsh->ie_len)
 369                return 0;
 370
 371        /* find RSN IE */
 372        data = cfg80211_find_ie(WLAN_EID_RSN, ifmsh->ie, ifmsh->ie_len);
 373        if (!data)
 374                return 0;
 375
 376        len = data[1] + 2;
 377
 378        if (skb_tailroom(skb) < len)
 379                return -ENOMEM;
 380        memcpy(skb_put(skb, len), data, len);
 381
 382        return 0;
 383}
 384
 385static int mesh_add_ds_params_ie(struct ieee80211_sub_if_data *sdata,
 386                                 struct sk_buff *skb)
 387{
 388        struct ieee80211_chanctx_conf *chanctx_conf;
 389        struct ieee80211_channel *chan;
 390        u8 *pos;
 391
 392        if (skb_tailroom(skb) < 3)
 393                return -ENOMEM;
 394
 395        rcu_read_lock();
 396        chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
 397        if (WARN_ON(!chanctx_conf)) {
 398                rcu_read_unlock();
 399                return -EINVAL;
 400        }
 401        chan = chanctx_conf->def.chan;
 402        rcu_read_unlock();
 403
 404        pos = skb_put(skb, 2 + 1);
 405        *pos++ = WLAN_EID_DS_PARAMS;
 406        *pos++ = 1;
 407        *pos++ = ieee80211_frequency_to_channel(chan->center_freq);
 408
 409        return 0;
 410}
 411
 412int mesh_add_ht_cap_ie(struct ieee80211_sub_if_data *sdata,
 413                       struct sk_buff *skb)
 414{
 415        struct ieee80211_local *local = sdata->local;
 416        enum ieee80211_band band = ieee80211_get_sdata_band(sdata);
 417        struct ieee80211_supported_band *sband;
 418        u8 *pos;
 419
 420        sband = local->hw.wiphy->bands[band];
 421        if (!sband->ht_cap.ht_supported ||
 422            sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT ||
 423            sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_5 ||
 424            sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_10)
 425                return 0;
 426
 427        if (skb_tailroom(skb) < 2 + sizeof(struct ieee80211_ht_cap))
 428                return -ENOMEM;
 429
 430        pos = skb_put(skb, 2 + sizeof(struct ieee80211_ht_cap));
 431        ieee80211_ie_build_ht_cap(pos, &sband->ht_cap, sband->ht_cap.cap);
 432
 433        return 0;
 434}
 435
 436int mesh_add_ht_oper_ie(struct ieee80211_sub_if_data *sdata,
 437                        struct sk_buff *skb)
 438{
 439        struct ieee80211_local *local = sdata->local;
 440        struct ieee80211_chanctx_conf *chanctx_conf;
 441        struct ieee80211_channel *channel;
 442        struct ieee80211_supported_band *sband;
 443        struct ieee80211_sta_ht_cap *ht_cap;
 444        u8 *pos;
 445
 446        rcu_read_lock();
 447        chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
 448        if (WARN_ON(!chanctx_conf)) {
 449                rcu_read_unlock();
 450                return -EINVAL;
 451        }
 452        channel = chanctx_conf->def.chan;
 453        rcu_read_unlock();
 454
 455        sband = local->hw.wiphy->bands[channel->band];
 456        ht_cap = &sband->ht_cap;
 457
 458        if (!ht_cap->ht_supported ||
 459            sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT ||
 460            sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_5 ||
 461            sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_10)
 462                return 0;
 463
 464        if (skb_tailroom(skb) < 2 + sizeof(struct ieee80211_ht_operation))
 465                return -ENOMEM;
 466
 467        pos = skb_put(skb, 2 + sizeof(struct ieee80211_ht_operation));
 468        ieee80211_ie_build_ht_oper(pos, ht_cap, &sdata->vif.bss_conf.chandef,
 469                                   sdata->vif.bss_conf.ht_operation_mode,
 470                                   false);
 471
 472        return 0;
 473}
 474
 475int mesh_add_vht_cap_ie(struct ieee80211_sub_if_data *sdata,
 476                        struct sk_buff *skb)
 477{
 478        struct ieee80211_local *local = sdata->local;
 479        enum ieee80211_band band = ieee80211_get_sdata_band(sdata);
 480        struct ieee80211_supported_band *sband;
 481        u8 *pos;
 482
 483        sband = local->hw.wiphy->bands[band];
 484        if (!sband->vht_cap.vht_supported ||
 485            sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT ||
 486            sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_5 ||
 487            sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_10)
 488                return 0;
 489
 490        if (skb_tailroom(skb) < 2 + sizeof(struct ieee80211_vht_cap))
 491                return -ENOMEM;
 492
 493        pos = skb_put(skb, 2 + sizeof(struct ieee80211_vht_cap));
 494        ieee80211_ie_build_vht_cap(pos, &sband->vht_cap, sband->vht_cap.cap);
 495
 496        return 0;
 497}
 498
 499int mesh_add_vht_oper_ie(struct ieee80211_sub_if_data *sdata,
 500                         struct sk_buff *skb)
 501{
 502        struct ieee80211_local *local = sdata->local;
 503        struct ieee80211_chanctx_conf *chanctx_conf;
 504        struct ieee80211_channel *channel;
 505        struct ieee80211_supported_band *sband;
 506        struct ieee80211_sta_vht_cap *vht_cap;
 507        u8 *pos;
 508
 509        rcu_read_lock();
 510        chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
 511        if (WARN_ON(!chanctx_conf)) {
 512                rcu_read_unlock();
 513                return -EINVAL;
 514        }
 515        channel = chanctx_conf->def.chan;
 516        rcu_read_unlock();
 517
 518        sband = local->hw.wiphy->bands[channel->band];
 519        vht_cap = &sband->vht_cap;
 520
 521        if (!vht_cap->vht_supported ||
 522            sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT ||
 523            sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_5 ||
 524            sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_10)
 525                return 0;
 526
 527        if (skb_tailroom(skb) < 2 + sizeof(struct ieee80211_vht_operation))
 528                return -ENOMEM;
 529
 530        pos = skb_put(skb, 2 + sizeof(struct ieee80211_vht_operation));
 531        ieee80211_ie_build_vht_oper(pos, vht_cap,
 532                                    &sdata->vif.bss_conf.chandef);
 533
 534        return 0;
 535}
 536
 537static void ieee80211_mesh_path_timer(unsigned long data)
 538{
 539        struct ieee80211_sub_if_data *sdata =
 540                (struct ieee80211_sub_if_data *) data;
 541
 542        ieee80211_queue_work(&sdata->local->hw, &sdata->work);
 543}
 544
 545static void ieee80211_mesh_path_root_timer(unsigned long data)
 546{
 547        struct ieee80211_sub_if_data *sdata =
 548                (struct ieee80211_sub_if_data *) data;
 549        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
 550
 551        set_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags);
 552
 553        ieee80211_queue_work(&sdata->local->hw, &sdata->work);
 554}
 555
 556void ieee80211_mesh_root_setup(struct ieee80211_if_mesh *ifmsh)
 557{
 558        if (ifmsh->mshcfg.dot11MeshHWMPRootMode > IEEE80211_ROOTMODE_ROOT)
 559                set_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags);
 560        else {
 561                clear_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags);
 562                /* stop running timer */
 563                del_timer_sync(&ifmsh->mesh_path_root_timer);
 564        }
 565}
 566
 567/**
 568 * ieee80211_fill_mesh_addresses - fill addresses of a locally originated mesh frame
 569 * @hdr:        802.11 frame header
 570 * @fc:         frame control field
 571 * @meshda:     destination address in the mesh
 572 * @meshsa:     source address address in the mesh.  Same as TA, as frame is
 573 *              locally originated.
 574 *
 575 * Return the length of the 802.11 (does not include a mesh control header)
 576 */
 577int ieee80211_fill_mesh_addresses(struct ieee80211_hdr *hdr, __le16 *fc,
 578                                  const u8 *meshda, const u8 *meshsa)
 579{
 580        if (is_multicast_ether_addr(meshda)) {
 581                *fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS);
 582                /* DA TA SA */
 583                memcpy(hdr->addr1, meshda, ETH_ALEN);
 584                memcpy(hdr->addr2, meshsa, ETH_ALEN);
 585                memcpy(hdr->addr3, meshsa, ETH_ALEN);
 586                return 24;
 587        } else {
 588                *fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS);
 589                /* RA TA DA SA */
 590                eth_zero_addr(hdr->addr1);   /* RA is resolved later */
 591                memcpy(hdr->addr2, meshsa, ETH_ALEN);
 592                memcpy(hdr->addr3, meshda, ETH_ALEN);
 593                memcpy(hdr->addr4, meshsa, ETH_ALEN);
 594                return 30;
 595        }
 596}
 597
 598/**
 599 * ieee80211_new_mesh_header - create a new mesh header
 600 * @sdata:      mesh interface to be used
 601 * @meshhdr:    uninitialized mesh header
 602 * @addr4or5:   1st address in the ae header, which may correspond to address 4
 603 *              (if addr6 is NULL) or address 5 (if addr6 is present). It may
 604 *              be NULL.
 605 * @addr6:      2nd address in the ae header, which corresponds to addr6 of the
 606 *              mesh frame
 607 *
 608 * Return the header length.
 609 */
 610unsigned int ieee80211_new_mesh_header(struct ieee80211_sub_if_data *sdata,
 611                                       struct ieee80211s_hdr *meshhdr,
 612                                       const char *addr4or5, const char *addr6)
 613{
 614        if (WARN_ON(!addr4or5 && addr6))
 615                return 0;
 616
 617        memset(meshhdr, 0, sizeof(*meshhdr));
 618
 619        meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL;
 620
 621        /* FIXME: racy -- TX on multiple queues can be concurrent */
 622        put_unaligned(cpu_to_le32(sdata->u.mesh.mesh_seqnum), &meshhdr->seqnum);
 623        sdata->u.mesh.mesh_seqnum++;
 624
 625        if (addr4or5 && !addr6) {
 626                meshhdr->flags |= MESH_FLAGS_AE_A4;
 627                memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN);
 628                return 2 * ETH_ALEN;
 629        } else if (addr4or5 && addr6) {
 630                meshhdr->flags |= MESH_FLAGS_AE_A5_A6;
 631                memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN);
 632                memcpy(meshhdr->eaddr2, addr6, ETH_ALEN);
 633                return 3 * ETH_ALEN;
 634        }
 635
 636        return ETH_ALEN;
 637}
 638
 639static void ieee80211_mesh_housekeeping(struct ieee80211_sub_if_data *sdata)
 640{
 641        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
 642        u32 changed;
 643
 644        if (ifmsh->mshcfg.plink_timeout > 0)
 645                ieee80211_sta_expire(sdata, ifmsh->mshcfg.plink_timeout * HZ);
 646        mesh_path_expire(sdata);
 647
 648        changed = mesh_accept_plinks_update(sdata);
 649        ieee80211_mbss_info_change_notify(sdata, changed);
 650
 651        mod_timer(&ifmsh->housekeeping_timer,
 652                  round_jiffies(jiffies +
 653                                IEEE80211_MESH_HOUSEKEEPING_INTERVAL));
 654}
 655
 656static void ieee80211_mesh_rootpath(struct ieee80211_sub_if_data *sdata)
 657{
 658        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
 659        u32 interval;
 660
 661        mesh_path_tx_root_frame(sdata);
 662
 663        if (ifmsh->mshcfg.dot11MeshHWMPRootMode == IEEE80211_PROACTIVE_RANN)
 664                interval = ifmsh->mshcfg.dot11MeshHWMPRannInterval;
 665        else
 666                interval = ifmsh->mshcfg.dot11MeshHWMProotInterval;
 667
 668        mod_timer(&ifmsh->mesh_path_root_timer,
 669                  round_jiffies(TU_TO_EXP_TIME(interval)));
 670}
 671
 672static int
 673ieee80211_mesh_build_beacon(struct ieee80211_if_mesh *ifmsh)
 674{
 675        struct beacon_data *bcn;
 676        int head_len, tail_len;
 677        struct sk_buff *skb;
 678        struct ieee80211_mgmt *mgmt;
 679        struct ieee80211_chanctx_conf *chanctx_conf;
 680        struct mesh_csa_settings *csa;
 681        enum ieee80211_band band;
 682        u8 *pos;
 683        struct ieee80211_sub_if_data *sdata;
 684        int hdr_len = offsetof(struct ieee80211_mgmt, u.beacon) +
 685                      sizeof(mgmt->u.beacon);
 686
 687        sdata = container_of(ifmsh, struct ieee80211_sub_if_data, u.mesh);
 688        rcu_read_lock();
 689        chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
 690        band = chanctx_conf->def.chan->band;
 691        rcu_read_unlock();
 692
 693        head_len = hdr_len +
 694                   2 + /* NULL SSID */
 695                   /* Channel Switch Announcement */
 696                   2 + sizeof(struct ieee80211_channel_sw_ie) +
 697                   /* Mesh Channel Swith Parameters */
 698                   2 + sizeof(struct ieee80211_mesh_chansw_params_ie) +
 699                   2 + 8 + /* supported rates */
 700                   2 + 3; /* DS params */
 701        tail_len = 2 + (IEEE80211_MAX_SUPP_RATES - 8) +
 702                   2 + sizeof(struct ieee80211_ht_cap) +
 703                   2 + sizeof(struct ieee80211_ht_operation) +
 704                   2 + ifmsh->mesh_id_len +
 705                   2 + sizeof(struct ieee80211_meshconf_ie) +
 706                   2 + sizeof(__le16) + /* awake window */
 707                   2 + sizeof(struct ieee80211_vht_cap) +
 708                   2 + sizeof(struct ieee80211_vht_operation) +
 709                   ifmsh->ie_len;
 710
 711        bcn = kzalloc(sizeof(*bcn) + head_len + tail_len, GFP_KERNEL);
 712        /* need an skb for IE builders to operate on */
 713        skb = dev_alloc_skb(max(head_len, tail_len));
 714
 715        if (!bcn || !skb)
 716                goto out_free;
 717
 718        /*
 719         * pointers go into the block we allocated,
 720         * memory is | beacon_data | head | tail |
 721         */
 722        bcn->head = ((u8 *) bcn) + sizeof(*bcn);
 723
 724        /* fill in the head */
 725        mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len);
 726        memset(mgmt, 0, hdr_len);
 727        mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
 728                                          IEEE80211_STYPE_BEACON);
 729        eth_broadcast_addr(mgmt->da);
 730        memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
 731        memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
 732        ieee80211_mps_set_frame_flags(sdata, NULL, (void *) mgmt);
 733        mgmt->u.beacon.beacon_int =
 734                cpu_to_le16(sdata->vif.bss_conf.beacon_int);
 735        mgmt->u.beacon.capab_info |= cpu_to_le16(
 736                sdata->u.mesh.security ? WLAN_CAPABILITY_PRIVACY : 0);
 737
 738        pos = skb_put(skb, 2);
 739        *pos++ = WLAN_EID_SSID;
 740        *pos++ = 0x0;
 741
 742        rcu_read_lock();
 743        csa = rcu_dereference(ifmsh->csa);
 744        if (csa) {
 745                pos = skb_put(skb, 13);
 746                memset(pos, 0, 13);
 747                *pos++ = WLAN_EID_CHANNEL_SWITCH;
 748                *pos++ = 3;
 749                *pos++ = 0x0;
 750                *pos++ = ieee80211_frequency_to_channel(
 751                                csa->settings.chandef.chan->center_freq);
 752                bcn->csa_current_counter = csa->settings.count;
 753                bcn->csa_counter_offsets[0] = hdr_len + 6;
 754                *pos++ = csa->settings.count;
 755                *pos++ = WLAN_EID_CHAN_SWITCH_PARAM;
 756                *pos++ = 6;
 757                if (ifmsh->csa_role == IEEE80211_MESH_CSA_ROLE_INIT) {
 758                        *pos++ = ifmsh->mshcfg.dot11MeshTTL;
 759                        *pos |= WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR;
 760                } else {
 761                        *pos++ = ifmsh->chsw_ttl;
 762                }
 763                *pos++ |= csa->settings.block_tx ?
 764                          WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT : 0x00;
 765                put_unaligned_le16(WLAN_REASON_MESH_CHAN, pos);
 766                pos += 2;
 767                put_unaligned_le16(ifmsh->pre_value, pos);
 768                pos += 2;
 769        }
 770        rcu_read_unlock();
 771
 772        if (ieee80211_add_srates_ie(sdata, skb, true, band) ||
 773            mesh_add_ds_params_ie(sdata, skb))
 774                goto out_free;
 775
 776        bcn->head_len = skb->len;
 777        memcpy(bcn->head, skb->data, bcn->head_len);
 778
 779        /* now the tail */
 780        skb_trim(skb, 0);
 781        bcn->tail = bcn->head + bcn->head_len;
 782
 783        if (ieee80211_add_ext_srates_ie(sdata, skb, true, band) ||
 784            mesh_add_rsn_ie(sdata, skb) ||
 785            mesh_add_ht_cap_ie(sdata, skb) ||
 786            mesh_add_ht_oper_ie(sdata, skb) ||
 787            mesh_add_meshid_ie(sdata, skb) ||
 788            mesh_add_meshconf_ie(sdata, skb) ||
 789            mesh_add_awake_window_ie(sdata, skb) ||
 790            mesh_add_vht_cap_ie(sdata, skb) ||
 791            mesh_add_vht_oper_ie(sdata, skb) ||
 792            mesh_add_vendor_ies(sdata, skb))
 793                goto out_free;
 794
 795        bcn->tail_len = skb->len;
 796        memcpy(bcn->tail, skb->data, bcn->tail_len);
 797        bcn->meshconf = (struct ieee80211_meshconf_ie *)
 798                                        (bcn->tail + ifmsh->meshconf_offset);
 799
 800        dev_kfree_skb(skb);
 801        rcu_assign_pointer(ifmsh->beacon, bcn);
 802        return 0;
 803out_free:
 804        kfree(bcn);
 805        dev_kfree_skb(skb);
 806        return -ENOMEM;
 807}
 808
 809static int
 810ieee80211_mesh_rebuild_beacon(struct ieee80211_sub_if_data *sdata)
 811{
 812        struct beacon_data *old_bcn;
 813        int ret;
 814
 815        old_bcn = rcu_dereference_protected(sdata->u.mesh.beacon,
 816                                            lockdep_is_held(&sdata->wdev.mtx));
 817        ret = ieee80211_mesh_build_beacon(&sdata->u.mesh);
 818        if (ret)
 819                /* just reuse old beacon */
 820                return ret;
 821
 822        if (old_bcn)
 823                kfree_rcu(old_bcn, rcu_head);
 824        return 0;
 825}
 826
 827void ieee80211_mbss_info_change_notify(struct ieee80211_sub_if_data *sdata,
 828                                       u32 changed)
 829{
 830        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
 831        unsigned long bits = changed;
 832        u32 bit;
 833
 834        if (!bits)
 835                return;
 836
 837        /* if we race with running work, worst case this work becomes a noop */
 838        for_each_set_bit(bit, &bits, sizeof(changed) * BITS_PER_BYTE)
 839                set_bit(bit, &ifmsh->mbss_changed);
 840        set_bit(MESH_WORK_MBSS_CHANGED, &ifmsh->wrkq_flags);
 841        ieee80211_queue_work(&sdata->local->hw, &sdata->work);
 842}
 843
 844int ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata)
 845{
 846        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
 847        struct ieee80211_local *local = sdata->local;
 848        u32 changed = BSS_CHANGED_BEACON |
 849                      BSS_CHANGED_BEACON_ENABLED |
 850                      BSS_CHANGED_HT |
 851                      BSS_CHANGED_BASIC_RATES |
 852                      BSS_CHANGED_BEACON_INT;
 853
 854        local->fif_other_bss++;
 855        /* mesh ifaces must set allmulti to forward mcast traffic */
 856        atomic_inc(&local->iff_allmultis);
 857        ieee80211_configure_filter(local);
 858
 859        ifmsh->mesh_cc_id = 0;  /* Disabled */
 860        /* register sync ops from extensible synchronization framework */
 861        ifmsh->sync_ops = ieee80211_mesh_sync_ops_get(ifmsh->mesh_sp_id);
 862        ifmsh->adjusting_tbtt = false;
 863        ifmsh->sync_offset_clockdrift_max = 0;
 864        set_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags);
 865        ieee80211_mesh_root_setup(ifmsh);
 866        ieee80211_queue_work(&local->hw, &sdata->work);
 867        sdata->vif.bss_conf.ht_operation_mode =
 868                                ifmsh->mshcfg.ht_opmode;
 869        sdata->vif.bss_conf.enable_beacon = true;
 870
 871        changed |= ieee80211_mps_local_status_update(sdata);
 872
 873        if (ieee80211_mesh_build_beacon(ifmsh)) {
 874                ieee80211_stop_mesh(sdata);
 875                return -ENOMEM;
 876        }
 877
 878        ieee80211_recalc_dtim(local, sdata);
 879        ieee80211_bss_info_change_notify(sdata, changed);
 880
 881        netif_carrier_on(sdata->dev);
 882        return 0;
 883}
 884
 885void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata)
 886{
 887        struct ieee80211_local *local = sdata->local;
 888        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
 889        struct beacon_data *bcn;
 890
 891        netif_carrier_off(sdata->dev);
 892
 893        /* stop the beacon */
 894        ifmsh->mesh_id_len = 0;
 895        sdata->vif.bss_conf.enable_beacon = false;
 896        clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state);
 897        ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
 898        bcn = rcu_dereference_protected(ifmsh->beacon,
 899                                        lockdep_is_held(&sdata->wdev.mtx));
 900        RCU_INIT_POINTER(ifmsh->beacon, NULL);
 901        kfree_rcu(bcn, rcu_head);
 902
 903        /* flush STAs and mpaths on this iface */
 904        sta_info_flush(sdata);
 905        mesh_path_flush_by_iface(sdata);
 906
 907        /* free all potentially still buffered group-addressed frames */
 908        local->total_ps_buffered -= skb_queue_len(&ifmsh->ps.bc_buf);
 909        skb_queue_purge(&ifmsh->ps.bc_buf);
 910
 911        del_timer_sync(&sdata->u.mesh.housekeeping_timer);
 912        del_timer_sync(&sdata->u.mesh.mesh_path_root_timer);
 913        del_timer_sync(&sdata->u.mesh.mesh_path_timer);
 914
 915        /* clear any mesh work (for next join) we may have accrued */
 916        ifmsh->wrkq_flags = 0;
 917        ifmsh->mbss_changed = 0;
 918
 919        local->fif_other_bss--;
 920        atomic_dec(&local->iff_allmultis);
 921        ieee80211_configure_filter(local);
 922}
 923
 924static bool
 925ieee80211_mesh_process_chnswitch(struct ieee80211_sub_if_data *sdata,
 926                                 struct ieee802_11_elems *elems, bool beacon)
 927{
 928        struct cfg80211_csa_settings params;
 929        struct ieee80211_csa_ie csa_ie;
 930        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
 931        enum ieee80211_band band = ieee80211_get_sdata_band(sdata);
 932        int err;
 933        u32 sta_flags;
 934
 935        sdata_assert_lock(sdata);
 936
 937        sta_flags = IEEE80211_STA_DISABLE_VHT;
 938        switch (sdata->vif.bss_conf.chandef.width) {
 939        case NL80211_CHAN_WIDTH_20_NOHT:
 940                sta_flags |= IEEE80211_STA_DISABLE_HT;
 941        case NL80211_CHAN_WIDTH_20:
 942                sta_flags |= IEEE80211_STA_DISABLE_40MHZ;
 943                break;
 944        default:
 945                break;
 946        }
 947
 948        memset(&params, 0, sizeof(params));
 949        memset(&csa_ie, 0, sizeof(csa_ie));
 950        err = ieee80211_parse_ch_switch_ie(sdata, elems, band,
 951                                           sta_flags, sdata->vif.addr,
 952                                           &csa_ie);
 953        if (err < 0)
 954                return false;
 955        if (err)
 956                return false;
 957
 958        params.chandef = csa_ie.chandef;
 959        params.count = csa_ie.count;
 960
 961        if (!cfg80211_chandef_usable(sdata->local->hw.wiphy, &params.chandef,
 962                                     IEEE80211_CHAN_DISABLED)) {
 963                sdata_info(sdata,
 964                           "mesh STA %pM switches to unsupported channel (%d MHz, width:%d, CF1/2: %d/%d MHz), aborting\n",
 965                           sdata->vif.addr,
 966                           params.chandef.chan->center_freq,
 967                           params.chandef.width,
 968                           params.chandef.center_freq1,
 969                           params.chandef.center_freq2);
 970                return false;
 971        }
 972
 973        err = cfg80211_chandef_dfs_required(sdata->local->hw.wiphy,
 974                                            &params.chandef,
 975                                            NL80211_IFTYPE_MESH_POINT);
 976        if (err < 0)
 977                return false;
 978        if (err > 0)
 979                /* TODO: DFS not (yet) supported */
 980                return false;
 981
 982        params.radar_required = err;
 983
 984        if (cfg80211_chandef_identical(&params.chandef,
 985                                       &sdata->vif.bss_conf.chandef)) {
 986                mcsa_dbg(sdata,
 987                         "received csa with an identical chandef, ignoring\n");
 988                return true;
 989        }
 990
 991        mcsa_dbg(sdata,
 992                 "received channel switch announcement to go to channel %d MHz\n",
 993                 params.chandef.chan->center_freq);
 994
 995        params.block_tx = csa_ie.mode & WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT;
 996        if (beacon) {
 997                ifmsh->chsw_ttl = csa_ie.ttl - 1;
 998                if (ifmsh->pre_value >= csa_ie.pre_value)
 999                        return false;
1000                ifmsh->pre_value = csa_ie.pre_value;
1001        }
1002
1003        if (ifmsh->chsw_ttl >= ifmsh->mshcfg.dot11MeshTTL)
1004                return false;
1005
1006        ifmsh->csa_role = IEEE80211_MESH_CSA_ROLE_REPEATER;
1007
1008        if (ieee80211_channel_switch(sdata->local->hw.wiphy, sdata->dev,
1009                                     &params) < 0)
1010                return false;
1011
1012        return true;
1013}
1014
1015static void
1016ieee80211_mesh_rx_probe_req(struct ieee80211_sub_if_data *sdata,
1017                            struct ieee80211_mgmt *mgmt, size_t len)
1018{
1019        struct ieee80211_local *local = sdata->local;
1020        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
1021        struct sk_buff *presp;
1022        struct beacon_data *bcn;
1023        struct ieee80211_mgmt *hdr;
1024        struct ieee802_11_elems elems;
1025        size_t baselen;
1026        u8 *pos;
1027
1028        pos = mgmt->u.probe_req.variable;
1029        baselen = (u8 *) pos - (u8 *) mgmt;
1030        if (baselen > len)
1031                return;
1032
1033        ieee802_11_parse_elems(pos, len - baselen, false, &elems);
1034
1035        if (!elems.mesh_id)
1036                return;
1037
1038        /* 802.11-2012 10.1.4.3.2 */
1039        if ((!ether_addr_equal(mgmt->da, sdata->vif.addr) &&
1040             !is_broadcast_ether_addr(mgmt->da)) ||
1041            elems.ssid_len != 0)
1042                return;
1043
1044        if (elems.mesh_id_len != 0 &&
1045            (elems.mesh_id_len != ifmsh->mesh_id_len ||
1046             memcmp(elems.mesh_id, ifmsh->mesh_id, ifmsh->mesh_id_len)))
1047                return;
1048
1049        rcu_read_lock();
1050        bcn = rcu_dereference(ifmsh->beacon);
1051
1052        if (!bcn)
1053                goto out;
1054
1055        presp = dev_alloc_skb(local->tx_headroom +
1056                              bcn->head_len + bcn->tail_len);
1057        if (!presp)
1058                goto out;
1059
1060        skb_reserve(presp, local->tx_headroom);
1061        memcpy(skb_put(presp, bcn->head_len), bcn->head, bcn->head_len);
1062        memcpy(skb_put(presp, bcn->tail_len), bcn->tail, bcn->tail_len);
1063        hdr = (struct ieee80211_mgmt *) presp->data;
1064        hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
1065                                         IEEE80211_STYPE_PROBE_RESP);
1066        memcpy(hdr->da, mgmt->sa, ETH_ALEN);
1067        IEEE80211_SKB_CB(presp)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
1068        ieee80211_tx_skb(sdata, presp);
1069out:
1070        rcu_read_unlock();
1071}
1072
1073static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata,
1074                                        u16 stype,
1075                                        struct ieee80211_mgmt *mgmt,
1076                                        size_t len,
1077                                        struct ieee80211_rx_status *rx_status)
1078{
1079        struct ieee80211_local *local = sdata->local;
1080        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
1081        struct ieee802_11_elems elems;
1082        struct ieee80211_channel *channel;
1083        size_t baselen;
1084        int freq;
1085        enum ieee80211_band band = rx_status->band;
1086
1087        /* ignore ProbeResp to foreign address */
1088        if (stype == IEEE80211_STYPE_PROBE_RESP &&
1089            !ether_addr_equal(mgmt->da, sdata->vif.addr))
1090                return;
1091
1092        baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt;
1093        if (baselen > len)
1094                return;
1095
1096        ieee802_11_parse_elems(mgmt->u.probe_resp.variable, len - baselen,
1097                               false, &elems);
1098
1099        /* ignore non-mesh or secure / unsecure mismatch */
1100        if ((!elems.mesh_id || !elems.mesh_config) ||
1101            (elems.rsn && sdata->u.mesh.security == IEEE80211_MESH_SEC_NONE) ||
1102            (!elems.rsn && sdata->u.mesh.security != IEEE80211_MESH_SEC_NONE))
1103                return;
1104
1105        if (elems.ds_params)
1106                freq = ieee80211_channel_to_frequency(elems.ds_params[0], band);
1107        else
1108                freq = rx_status->freq;
1109
1110        channel = ieee80211_get_channel(local->hw.wiphy, freq);
1111
1112        if (!channel || channel->flags & IEEE80211_CHAN_DISABLED)
1113                return;
1114
1115        if (mesh_matches_local(sdata, &elems))
1116                mesh_neighbour_update(sdata, mgmt->sa, &elems);
1117
1118        if (ifmsh->sync_ops)
1119                ifmsh->sync_ops->rx_bcn_presp(sdata,
1120                        stype, mgmt, &elems, rx_status);
1121
1122        if (ifmsh->csa_role != IEEE80211_MESH_CSA_ROLE_INIT &&
1123            !sdata->vif.csa_active)
1124                ieee80211_mesh_process_chnswitch(sdata, &elems, true);
1125}
1126
1127int ieee80211_mesh_finish_csa(struct ieee80211_sub_if_data *sdata)
1128{
1129        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
1130        struct mesh_csa_settings *tmp_csa_settings;
1131        int ret = 0;
1132        int changed = 0;
1133
1134        /* Reset the TTL value and Initiator flag */
1135        ifmsh->csa_role = IEEE80211_MESH_CSA_ROLE_NONE;
1136        ifmsh->chsw_ttl = 0;
1137
1138        /* Remove the CSA and MCSP elements from the beacon */
1139        tmp_csa_settings = rcu_dereference(ifmsh->csa);
1140        RCU_INIT_POINTER(ifmsh->csa, NULL);
1141        if (tmp_csa_settings)
1142                kfree_rcu(tmp_csa_settings, rcu_head);
1143        ret = ieee80211_mesh_rebuild_beacon(sdata);
1144        if (ret)
1145                return -EINVAL;
1146
1147        changed |= BSS_CHANGED_BEACON;
1148
1149        mcsa_dbg(sdata, "complete switching to center freq %d MHz",
1150                 sdata->vif.bss_conf.chandef.chan->center_freq);
1151        return changed;
1152}
1153
1154int ieee80211_mesh_csa_beacon(struct ieee80211_sub_if_data *sdata,
1155                              struct cfg80211_csa_settings *csa_settings)
1156{
1157        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
1158        struct mesh_csa_settings *tmp_csa_settings;
1159        int ret = 0;
1160
1161        tmp_csa_settings = kmalloc(sizeof(*tmp_csa_settings),
1162                                   GFP_ATOMIC);
1163        if (!tmp_csa_settings)
1164                return -ENOMEM;
1165
1166        memcpy(&tmp_csa_settings->settings, csa_settings,
1167               sizeof(struct cfg80211_csa_settings));
1168
1169        rcu_assign_pointer(ifmsh->csa, tmp_csa_settings);
1170
1171        ret = ieee80211_mesh_rebuild_beacon(sdata);
1172        if (ret) {
1173                tmp_csa_settings = rcu_dereference(ifmsh->csa);
1174                RCU_INIT_POINTER(ifmsh->csa, NULL);
1175                kfree_rcu(tmp_csa_settings, rcu_head);
1176                return ret;
1177        }
1178
1179        return BSS_CHANGED_BEACON;
1180}
1181
1182static int mesh_fwd_csa_frame(struct ieee80211_sub_if_data *sdata,
1183                               struct ieee80211_mgmt *mgmt, size_t len)
1184{
1185        struct ieee80211_mgmt *mgmt_fwd;
1186        struct sk_buff *skb;
1187        struct ieee80211_local *local = sdata->local;
1188        u8 *pos = mgmt->u.action.u.chan_switch.variable;
1189        size_t offset_ttl;
1190
1191        skb = dev_alloc_skb(local->tx_headroom + len);
1192        if (!skb)
1193                return -ENOMEM;
1194        skb_reserve(skb, local->tx_headroom);
1195        mgmt_fwd = (struct ieee80211_mgmt *) skb_put(skb, len);
1196
1197        /* offset_ttl is based on whether the secondary channel
1198         * offset is available or not. Subtract 1 from the mesh TTL
1199         * and disable the initiator flag before forwarding.
1200         */
1201        offset_ttl = (len < 42) ? 7 : 10;
1202        *(pos + offset_ttl) -= 1;
1203        *(pos + offset_ttl + 1) &= ~WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR;
1204
1205        memcpy(mgmt_fwd, mgmt, len);
1206        eth_broadcast_addr(mgmt_fwd->da);
1207        memcpy(mgmt_fwd->sa, sdata->vif.addr, ETH_ALEN);
1208        memcpy(mgmt_fwd->bssid, sdata->vif.addr, ETH_ALEN);
1209
1210        ieee80211_tx_skb(sdata, skb);
1211        return 0;
1212}
1213
1214static void mesh_rx_csa_frame(struct ieee80211_sub_if_data *sdata,
1215                              struct ieee80211_mgmt *mgmt, size_t len)
1216{
1217        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
1218        struct ieee802_11_elems elems;
1219        u16 pre_value;
1220        bool fwd_csa = true;
1221        size_t baselen;
1222        u8 *pos;
1223
1224        if (mgmt->u.action.u.measurement.action_code !=
1225            WLAN_ACTION_SPCT_CHL_SWITCH)
1226                return;
1227
1228        pos = mgmt->u.action.u.chan_switch.variable;
1229        baselen = offsetof(struct ieee80211_mgmt,
1230                           u.action.u.chan_switch.variable);
1231        ieee802_11_parse_elems(pos, len - baselen, false, &elems);
1232
1233        ifmsh->chsw_ttl = elems.mesh_chansw_params_ie->mesh_ttl;
1234        if (!--ifmsh->chsw_ttl)
1235                fwd_csa = false;
1236
1237        pre_value = le16_to_cpu(elems.mesh_chansw_params_ie->mesh_pre_value);
1238        if (ifmsh->pre_value >= pre_value)
1239                return;
1240
1241        ifmsh->pre_value = pre_value;
1242
1243        if (!sdata->vif.csa_active &&
1244            !ieee80211_mesh_process_chnswitch(sdata, &elems, false)) {
1245                mcsa_dbg(sdata, "Failed to process CSA action frame");
1246                return;
1247        }
1248
1249        /* forward or re-broadcast the CSA frame */
1250        if (fwd_csa) {
1251                if (mesh_fwd_csa_frame(sdata, mgmt, len) < 0)
1252                        mcsa_dbg(sdata, "Failed to forward the CSA frame");
1253        }
1254}
1255
1256static void ieee80211_mesh_rx_mgmt_action(struct ieee80211_sub_if_data *sdata,
1257                                          struct ieee80211_mgmt *mgmt,
1258                                          size_t len,
1259                                          struct ieee80211_rx_status *rx_status)
1260{
1261        switch (mgmt->u.action.category) {
1262        case WLAN_CATEGORY_SELF_PROTECTED:
1263                switch (mgmt->u.action.u.self_prot.action_code) {
1264                case WLAN_SP_MESH_PEERING_OPEN:
1265                case WLAN_SP_MESH_PEERING_CLOSE:
1266                case WLAN_SP_MESH_PEERING_CONFIRM:
1267                        mesh_rx_plink_frame(sdata, mgmt, len, rx_status);
1268                        break;
1269                }
1270                break;
1271        case WLAN_CATEGORY_MESH_ACTION:
1272                if (mesh_action_is_path_sel(mgmt))
1273                        mesh_rx_path_sel_frame(sdata, mgmt, len);
1274                break;
1275        case WLAN_CATEGORY_SPECTRUM_MGMT:
1276                mesh_rx_csa_frame(sdata, mgmt, len);
1277                break;
1278        }
1279}
1280
1281void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
1282                                   struct sk_buff *skb)
1283{
1284        struct ieee80211_rx_status *rx_status;
1285        struct ieee80211_mgmt *mgmt;
1286        u16 stype;
1287
1288        sdata_lock(sdata);
1289
1290        /* mesh already went down */
1291        if (!sdata->u.mesh.mesh_id_len)
1292                goto out;
1293
1294        rx_status = IEEE80211_SKB_RXCB(skb);
1295        mgmt = (struct ieee80211_mgmt *) skb->data;
1296        stype = le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE;
1297
1298        switch (stype) {
1299        case IEEE80211_STYPE_PROBE_RESP:
1300        case IEEE80211_STYPE_BEACON:
1301                ieee80211_mesh_rx_bcn_presp(sdata, stype, mgmt, skb->len,
1302                                            rx_status);
1303                break;
1304        case IEEE80211_STYPE_PROBE_REQ:
1305                ieee80211_mesh_rx_probe_req(sdata, mgmt, skb->len);
1306                break;
1307        case IEEE80211_STYPE_ACTION:
1308                ieee80211_mesh_rx_mgmt_action(sdata, mgmt, skb->len, rx_status);
1309                break;
1310        }
1311out:
1312        sdata_unlock(sdata);
1313}
1314
1315static void mesh_bss_info_changed(struct ieee80211_sub_if_data *sdata)
1316{
1317        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
1318        u32 bit, changed = 0;
1319
1320        for_each_set_bit(bit, &ifmsh->mbss_changed,
1321                         sizeof(changed) * BITS_PER_BYTE) {
1322                clear_bit(bit, &ifmsh->mbss_changed);
1323                changed |= BIT(bit);
1324        }
1325
1326        if (sdata->vif.bss_conf.enable_beacon &&
1327            (changed & (BSS_CHANGED_BEACON |
1328                        BSS_CHANGED_HT |
1329                        BSS_CHANGED_BASIC_RATES |
1330                        BSS_CHANGED_BEACON_INT)))
1331                if (ieee80211_mesh_rebuild_beacon(sdata))
1332                        return;
1333
1334        ieee80211_bss_info_change_notify(sdata, changed);
1335}
1336
1337void ieee80211_mesh_work(struct ieee80211_sub_if_data *sdata)
1338{
1339        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
1340
1341        sdata_lock(sdata);
1342
1343        /* mesh already went down */
1344        if (!sdata->u.mesh.mesh_id_len)
1345                goto out;
1346
1347        if (ifmsh->preq_queue_len &&
1348            time_after(jiffies,
1349                       ifmsh->last_preq + msecs_to_jiffies(ifmsh->mshcfg.dot11MeshHWMPpreqMinInterval)))
1350                mesh_path_start_discovery(sdata);
1351
1352        if (test_and_clear_bit(MESH_WORK_GROW_MPATH_TABLE, &ifmsh->wrkq_flags))
1353                mesh_mpath_table_grow();
1354
1355        if (test_and_clear_bit(MESH_WORK_GROW_MPP_TABLE, &ifmsh->wrkq_flags))
1356                mesh_mpp_table_grow();
1357
1358        if (test_and_clear_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags))
1359                ieee80211_mesh_housekeeping(sdata);
1360
1361        if (test_and_clear_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags))
1362                ieee80211_mesh_rootpath(sdata);
1363
1364        if (test_and_clear_bit(MESH_WORK_DRIFT_ADJUST, &ifmsh->wrkq_flags))
1365                mesh_sync_adjust_tbtt(sdata);
1366
1367        if (test_and_clear_bit(MESH_WORK_MBSS_CHANGED, &ifmsh->wrkq_flags))
1368                mesh_bss_info_changed(sdata);
1369out:
1370        sdata_unlock(sdata);
1371}
1372
1373
1374void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata)
1375{
1376        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
1377        static u8 zero_addr[ETH_ALEN] = {};
1378
1379        setup_timer(&ifmsh->housekeeping_timer,
1380                    ieee80211_mesh_housekeeping_timer,
1381                    (unsigned long) sdata);
1382
1383        ifmsh->accepting_plinks = true;
1384        atomic_set(&ifmsh->mpaths, 0);
1385        mesh_rmc_init(sdata);
1386        ifmsh->last_preq = jiffies;
1387        ifmsh->next_perr = jiffies;
1388        ifmsh->csa_role = IEEE80211_MESH_CSA_ROLE_NONE;
1389        /* Allocate all mesh structures when creating the first mesh interface. */
1390        if (!mesh_allocated)
1391                ieee80211s_init();
1392        setup_timer(&ifmsh->mesh_path_timer,
1393                    ieee80211_mesh_path_timer,
1394                    (unsigned long) sdata);
1395        setup_timer(&ifmsh->mesh_path_root_timer,
1396                    ieee80211_mesh_path_root_timer,
1397                    (unsigned long) sdata);
1398        INIT_LIST_HEAD(&ifmsh->preq_queue.list);
1399        skb_queue_head_init(&ifmsh->ps.bc_buf);
1400        spin_lock_init(&ifmsh->mesh_preq_queue_lock);
1401        spin_lock_init(&ifmsh->sync_offset_lock);
1402        RCU_INIT_POINTER(ifmsh->beacon, NULL);
1403
1404        sdata->vif.bss_conf.bssid = zero_addr;
1405}
1406