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
  16#define TMR_RUNNING_HK  0
  17#define TMR_RUNNING_MP  1
  18#define TMR_RUNNING_MPR 2
  19
  20int mesh_allocated;
  21static struct kmem_cache *rm_cache;
  22
  23#ifdef CONFIG_MAC80211_MESH
  24bool mesh_action_is_path_sel(struct ieee80211_mgmt *mgmt)
  25{
  26        return (mgmt->u.action.u.mesh_action.action_code ==
  27                        WLAN_MESH_ACTION_HWMP_PATH_SELECTION);
  28}
  29#else
  30bool mesh_action_is_path_sel(struct ieee80211_mgmt *mgmt)
  31{ return false; }
  32#endif
  33
  34void ieee80211s_init(void)
  35{
  36        mesh_pathtbl_init();
  37        mesh_allocated = 1;
  38        rm_cache = kmem_cache_create("mesh_rmc", sizeof(struct rmc_entry),
  39                                     0, 0, NULL);
  40}
  41
  42void ieee80211s_stop(void)
  43{
  44        mesh_pathtbl_unregister();
  45        kmem_cache_destroy(rm_cache);
  46}
  47
  48static void ieee80211_mesh_housekeeping_timer(unsigned long data)
  49{
  50        struct ieee80211_sub_if_data *sdata = (void *) data;
  51        struct ieee80211_local *local = sdata->local;
  52        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
  53
  54        set_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags);
  55
  56        if (local->quiescing) {
  57                set_bit(TMR_RUNNING_HK, &ifmsh->timers_running);
  58                return;
  59        }
  60
  61        ieee80211_queue_work(&local->hw, &sdata->work);
  62}
  63
  64/**
  65 * mesh_matches_local - check if the config of a mesh point matches ours
  66 *
  67 * @sdata: local mesh subif
  68 * @ie: information elements of a management frame from the mesh peer
  69 *
  70 * This function checks if the mesh configuration of a mesh point matches the
  71 * local mesh configuration, i.e. if both nodes belong to the same mesh network.
  72 */
  73bool mesh_matches_local(struct ieee80211_sub_if_data *sdata,
  74                        struct ieee802_11_elems *ie)
  75{
  76        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
  77        struct ieee80211_local *local = sdata->local;
  78        u32 basic_rates = 0;
  79        enum nl80211_channel_type sta_channel_type = NL80211_CHAN_NO_HT;
  80
  81        /*
  82         * As support for each feature is added, check for matching
  83         * - On mesh config capabilities
  84         *   - Power Save Support En
  85         *   - Sync support enabled
  86         *   - Sync support active
  87         *   - Sync support required from peer
  88         *   - MDA enabled
  89         * - Power management control on fc
  90         */
  91        if (!(ifmsh->mesh_id_len == ie->mesh_id_len &&
  92             memcmp(ifmsh->mesh_id, ie->mesh_id, ie->mesh_id_len) == 0 &&
  93             (ifmsh->mesh_pp_id == ie->mesh_config->meshconf_psel) &&
  94             (ifmsh->mesh_pm_id == ie->mesh_config->meshconf_pmetric) &&
  95             (ifmsh->mesh_cc_id == ie->mesh_config->meshconf_congest) &&
  96             (ifmsh->mesh_sp_id == ie->mesh_config->meshconf_synch) &&
  97             (ifmsh->mesh_auth_id == ie->mesh_config->meshconf_auth)))
  98                goto mismatch;
  99
 100        ieee80211_sta_get_rates(local, ie, local->oper_channel->band,
 101                                &basic_rates);
 102
 103        if (sdata->vif.bss_conf.basic_rates != basic_rates)
 104                goto mismatch;
 105
 106        if (ie->ht_operation)
 107                sta_channel_type =
 108                        ieee80211_ht_oper_to_channel_type(ie->ht_operation);
 109
 110        /* Disallow HT40+/- mismatch */
 111        if (ie->ht_operation &&
 112            (local->_oper_channel_type == NL80211_CHAN_HT40MINUS ||
 113            local->_oper_channel_type == NL80211_CHAN_HT40PLUS) &&
 114            (sta_channel_type == NL80211_CHAN_HT40MINUS ||
 115             sta_channel_type == NL80211_CHAN_HT40PLUS) &&
 116            local->_oper_channel_type != sta_channel_type)
 117                goto mismatch;
 118
 119        return true;
 120mismatch:
 121        return false;
 122}
 123
 124/**
 125 * mesh_peer_accepts_plinks - check if an mp is willing to establish peer links
 126 *
 127 * @ie: information elements of a management frame from the mesh peer
 128 */
 129bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie)
 130{
 131        return (ie->mesh_config->meshconf_cap &
 132            MESHCONF_CAPAB_ACCEPT_PLINKS) != 0;
 133}
 134
 135/**
 136 * mesh_accept_plinks_update - update accepting_plink in local mesh beacons
 137 *
 138 * @sdata: mesh interface in which mesh beacons are going to be updated
 139 */
 140void mesh_accept_plinks_update(struct ieee80211_sub_if_data *sdata)
 141{
 142        bool free_plinks;
 143
 144        /* In case mesh_plink_free_count > 0 and mesh_plinktbl_capacity == 0,
 145         * the mesh interface might be able to establish plinks with peers that
 146         * are already on the table but are not on PLINK_ESTAB state. However,
 147         * in general the mesh interface is not accepting peer link requests
 148         * from new peers, and that must be reflected in the beacon
 149         */
 150        free_plinks = mesh_plink_availables(sdata);
 151
 152        if (free_plinks != sdata->u.mesh.accepting_plinks)
 153                ieee80211_mesh_housekeeping_timer((unsigned long) sdata);
 154}
 155
 156int mesh_rmc_init(struct ieee80211_sub_if_data *sdata)
 157{
 158        int i;
 159
 160        sdata->u.mesh.rmc = kmalloc(sizeof(struct mesh_rmc), GFP_KERNEL);
 161        if (!sdata->u.mesh.rmc)
 162                return -ENOMEM;
 163        sdata->u.mesh.rmc->idx_mask = RMC_BUCKETS - 1;
 164        for (i = 0; i < RMC_BUCKETS; i++)
 165                INIT_LIST_HEAD(&sdata->u.mesh.rmc->bucket[i].list);
 166        return 0;
 167}
 168
 169void mesh_rmc_free(struct ieee80211_sub_if_data *sdata)
 170{
 171        struct mesh_rmc *rmc = sdata->u.mesh.rmc;
 172        struct rmc_entry *p, *n;
 173        int i;
 174
 175        if (!sdata->u.mesh.rmc)
 176                return;
 177
 178        for (i = 0; i < RMC_BUCKETS; i++)
 179                list_for_each_entry_safe(p, n, &rmc->bucket[i].list, list) {
 180                        list_del(&p->list);
 181                        kmem_cache_free(rm_cache, p);
 182                }
 183
 184        kfree(rmc);
 185        sdata->u.mesh.rmc = NULL;
 186}
 187
 188/**
 189 * mesh_rmc_check - Check frame in recent multicast cache and add if absent.
 190 *
 191 * @sa:         source address
 192 * @mesh_hdr:   mesh_header
 193 *
 194 * Returns: 0 if the frame is not in the cache, nonzero otherwise.
 195 *
 196 * Checks using the source address and the mesh sequence number if we have
 197 * received this frame lately. If the frame is not in the cache, it is added to
 198 * it.
 199 */
 200int mesh_rmc_check(u8 *sa, struct ieee80211s_hdr *mesh_hdr,
 201                   struct ieee80211_sub_if_data *sdata)
 202{
 203        struct mesh_rmc *rmc = sdata->u.mesh.rmc;
 204        u32 seqnum = 0;
 205        int entries = 0;
 206        u8 idx;
 207        struct rmc_entry *p, *n;
 208
 209        /* Don't care about endianness since only match matters */
 210        memcpy(&seqnum, &mesh_hdr->seqnum, sizeof(mesh_hdr->seqnum));
 211        idx = le32_to_cpu(mesh_hdr->seqnum) & rmc->idx_mask;
 212        list_for_each_entry_safe(p, n, &rmc->bucket[idx].list, list) {
 213                ++entries;
 214                if (time_after(jiffies, p->exp_time) ||
 215                                (entries == RMC_QUEUE_MAX_LEN)) {
 216                        list_del(&p->list);
 217                        kmem_cache_free(rm_cache, p);
 218                        --entries;
 219                } else if ((seqnum == p->seqnum) &&
 220                           (ether_addr_equal(sa, p->sa)))
 221                        return -1;
 222        }
 223
 224        p = kmem_cache_alloc(rm_cache, GFP_ATOMIC);
 225        if (!p)
 226                return 0;
 227
 228        p->seqnum = seqnum;
 229        p->exp_time = jiffies + RMC_TIMEOUT;
 230        memcpy(p->sa, sa, ETH_ALEN);
 231        list_add(&p->list, &rmc->bucket[idx].list);
 232        return 0;
 233}
 234
 235int
 236mesh_add_meshconf_ie(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata)
 237{
 238        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
 239        u8 *pos, neighbors;
 240        u8 meshconf_len = sizeof(struct ieee80211_meshconf_ie);
 241
 242        if (skb_tailroom(skb) < 2 + meshconf_len)
 243                return -ENOMEM;
 244
 245        pos = skb_put(skb, 2 + meshconf_len);
 246        *pos++ = WLAN_EID_MESH_CONFIG;
 247        *pos++ = meshconf_len;
 248
 249        /* Active path selection protocol ID */
 250        *pos++ = ifmsh->mesh_pp_id;
 251        /* Active path selection metric ID   */
 252        *pos++ = ifmsh->mesh_pm_id;
 253        /* Congestion control mode identifier */
 254        *pos++ = ifmsh->mesh_cc_id;
 255        /* Synchronization protocol identifier */
 256        *pos++ = ifmsh->mesh_sp_id;
 257        /* Authentication Protocol identifier */
 258        *pos++ = ifmsh->mesh_auth_id;
 259        /* Mesh Formation Info - number of neighbors */
 260        neighbors = atomic_read(&ifmsh->mshstats.estab_plinks);
 261        /* Number of neighbor mesh STAs or 15 whichever is smaller */
 262        neighbors = (neighbors > 15) ? 15 : neighbors;
 263        *pos++ = neighbors << 1;
 264        /* Mesh capability */
 265        ifmsh->accepting_plinks = mesh_plink_availables(sdata);
 266        *pos = MESHCONF_CAPAB_FORWARDING;
 267        *pos |= ifmsh->accepting_plinks ?
 268            MESHCONF_CAPAB_ACCEPT_PLINKS : 0x00;
 269        *pos++ |= ifmsh->adjusting_tbtt ?
 270            MESHCONF_CAPAB_TBTT_ADJUSTING : 0x00;
 271        *pos++ = 0x00;
 272
 273        return 0;
 274}
 275
 276int
 277mesh_add_meshid_ie(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata)
 278{
 279        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
 280        u8 *pos;
 281
 282        if (skb_tailroom(skb) < 2 + ifmsh->mesh_id_len)
 283                return -ENOMEM;
 284
 285        pos = skb_put(skb, 2 + ifmsh->mesh_id_len);
 286        *pos++ = WLAN_EID_MESH_ID;
 287        *pos++ = ifmsh->mesh_id_len;
 288        if (ifmsh->mesh_id_len)
 289                memcpy(pos, ifmsh->mesh_id, ifmsh->mesh_id_len);
 290
 291        return 0;
 292}
 293
 294int
 295mesh_add_vendor_ies(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata)
 296{
 297        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
 298        u8 offset, len;
 299        const u8 *data;
 300
 301        if (!ifmsh->ie || !ifmsh->ie_len)
 302                return 0;
 303
 304        /* fast-forward to vendor IEs */
 305        offset = ieee80211_ie_split_vendor(ifmsh->ie, ifmsh->ie_len, 0);
 306
 307        if (offset) {
 308                len = ifmsh->ie_len - offset;
 309                data = ifmsh->ie + offset;
 310                if (skb_tailroom(skb) < len)
 311                        return -ENOMEM;
 312                memcpy(skb_put(skb, len), data, len);
 313        }
 314
 315        return 0;
 316}
 317
 318int
 319mesh_add_rsn_ie(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata)
 320{
 321        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
 322        u8 len = 0;
 323        const u8 *data;
 324
 325        if (!ifmsh->ie || !ifmsh->ie_len)
 326                return 0;
 327
 328        /* find RSN IE */
 329        data = ifmsh->ie;
 330        while (data < ifmsh->ie + ifmsh->ie_len) {
 331                if (*data == WLAN_EID_RSN) {
 332                        len = data[1] + 2;
 333                        break;
 334                }
data++;
 336        }
 337
 338        if (len) {
 339                if (skb_tailroom(skb) < len)
 340                        return -ENOMEM;
 341                memcpy(skb_put(skb, len), data, len);
 342        }
 343
 344        return 0;
 345}
 346
 347int mesh_add_ds_params_ie(struct sk_buff *skb,
 348                          struct ieee80211_sub_if_data *sdata)
 349{
 350        struct ieee80211_local *local = sdata->local;
 351        struct ieee80211_supported_band *sband;
 352        u8 *pos;
 353
 354        if (skb_tailroom(skb) < 3)
 355                return -ENOMEM;
 356
 357        sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
 358        if (sband->band == IEEE80211_BAND_2GHZ) {
 359                pos = skb_put(skb, 2 + 1);
 360                *pos++ = WLAN_EID_DS_PARAMS;
 361                *pos++ = 1;
 362                *pos++ = ieee80211_frequency_to_channel(local->hw.conf.channel->center_freq);
 363        }
 364
 365        return 0;
 366}
 367
 368int mesh_add_ht_cap_ie(struct sk_buff *skb,
 369                       struct ieee80211_sub_if_data *sdata)
 370{
 371        struct ieee80211_local *local = sdata->local;
 372        struct ieee80211_supported_band *sband;
 373        u8 *pos;
 374
 375        sband = local->hw.wiphy->bands[local->oper_channel->band];
 376        if (!sband->ht_cap.ht_supported ||
 377            local->_oper_channel_type == NL80211_CHAN_NO_HT)
 378                return 0;
 379
 380        if (skb_tailroom(skb) < 2 + sizeof(struct ieee80211_ht_cap))
 381                return -ENOMEM;
 382
 383        pos = skb_put(skb, 2 + sizeof(struct ieee80211_ht_cap));
 384        ieee80211_ie_build_ht_cap(pos, &sband->ht_cap, sband->ht_cap.cap);
 385
 386        return 0;
 387}
 388
 389int mesh_add_ht_oper_ie(struct sk_buff *skb,
 390                        struct ieee80211_sub_if_data *sdata)
 391{
 392        struct ieee80211_local *local = sdata->local;
 s<2        struct  390"L384"> 3ESH_Ie80211_iep" class="sref">cap);
iee id="L296" classmum0211/mesh.c#L263"l393" id="L393ine" name="L377"> 37"l393" id="L393ine" ="L29s="line" name="L393"> ine" name="L377"> 37           ht_supported ||
 377            local;
 372        struct  375        sband = local->hwf">local->hw.conf. 296{
 372t;sband->conf.u3/a>.<3 href="+code=mesh" class="sref">mesh;
 373       ="+code=o3fset" class="sref">offse3,39"L378"> 378                retur4a href="+4ode=u8" class="sref">u8<4a> *<40"L379" class="linclass="sref">bant;sband-><sband ine" name="L377"> 37           local->_oper_channel_4a>;
ieee80211_name="L385"> 385
ifmsh->4ENOMEM<4/mesh.c#L402" id="L302" class="lin4" nam403L379" class="line" name="L379"> 379
 380        if (skb_put(f="nee=skb" class="sref">skb) < 2 +4 0;
 333           e80211_ht_cap))
 3044/a>        capifmsh-> 382
 383        pos = f="neass="sref">skb_put(f="nee=skb" id="L381" class="line" name="L3437" class4""net/mac80211/mesh.c#L2406" i40"L356" class="line" name="L3c#L384" id="L384" clas/mac80211/mesh.c#L384" id="L384" clasline" name="L384"> 384        pos, &amf">local->pos, &amf">locaine" name="L377"> 37           (struct  307        if (<4 href4"+code=offset" class="assssssssssssssssss11/mesh.c#L375"=ieee80211_local" class="sref">ieee80211_local 389int band" class="sref">sbss_hannel( 376        if (!f="ne_8021href="+code=pos" cf="ne_8021nd" class="sref">sband->ie_len -4 378                retur4f="+code=4e" class="sref">ie +4 385
skb4 <4 386        return4/a>      4                 return 4aic void="line" name="L3c#L384" id0211/ref=_tima>/mac80211/mesh.c#L384" id0211/ref=_tima>line"unsigned longput" class="sref">skb_put(skb) < 2 +4ref="+cod4=data" class="sref">data4/a>, 4a hrefcode=sdata" class="sref">sdata 333   f">skb,
 390                        struct pos =  39)put" class="sref">skb_put( 385
skb,
 321        struct ieee80211_if_mesh *ifmsh = &sdata-&40;
 296{
 392        struct ieee80211_local *local =  387<4
 id="L375" class="line" name="L375"> 375     quiescingL375" class="liquiescing380sdata 3TMR_RUNNING_MP="L383" class="TMR_RUNNING_MP="+code=ieee80211_ie_build/a> < ifmshtima>s_runningL375" class="litima>s_runningnd" class="sref">sband->)
ieee80211lass="sref">sband->a>      4"+code=u" class="sref">u4/a>.<42 href="+code=len" class="sref">len);
u8 pos<4a href="+4ode=u8" class="sref">u8<4a> *<42ap" class="sref">ieee80211_ht_cap)queue_worknet/mac80211/mesh.c#L392"queue_workline"e=ieee80211_ie_build id="L375" class="line" name="L375"> 375        ieee80211_localsband-> }
 344        return4=ifmsh" c4ass="sref">ifmsh->4ENOMEM<4/mesh.c#L426" id="L326" class="lin4" nam4="L326f">aic void="line" name="L3c#L384" id0211/ref=_root_tima>/mac80211/mesh.c#L384" id0211/ref=_root_tima>line"unsigned longput" class="sref">skb_put(skb) < 2 +4 0;
sdata 328      4  278{
 390                        struct ifmsh4/a>-&43a href="+code=skb" clf">pos =  39)put" class="sref">skb_put( 385
ifmsh-><4 href43L370" class="line" name="L370"> 370{
 321        struct ieee80211_if_mesh *ifmsh = &sdata-&4s="sref">4ata ==  391{
 392        struct ieee80211_local *local = len = pos<4.c#L333" 4d="L333" class="line" na4e="L343ap" class="sref">ieee80211_h=et_bid="L383" class="let_bidline" name="L384"> 36WORK_ROO/a>->WORK_ROO/="+code=ieee80211_ie_build/a> < ifmshwrkq_flag        sband->cap             4   id="L375" class="line" name="L375"> 375     quiescingL375" class="liquiescing380sdata 3TMR_RUNNING_MPR="L383" class="TMR_RUNNING_MPR="+code=ieee80211_ie_build/a> < ifmshtima>s_runningL375" class="litima>s_runningnd" class="sref">sband->NL80211_CHlass="sref">sband-> 338       4if (<4 href="+code=lme="L344"> 344        return4f="+code=4kb" class="sref">skb4 <44href="+code=data" class="sref">data<4/a>      4                 return 4ieee80211_ht_cap)queue_worknet/mac80211/mesh.c#L392"queue_workline"e=ieee80211_ie_build id="L375" class="line" name="L375"> 375        ieee80211_localsband->data4/a>, 44e" name="L291"> 291        return4ef="net/m4c80211/mesh.c#L342" id="4342" 4lass="line" name="L342"> 342     4  }
 370{
 321        struct " class="sref">skb) < 2 +4mac80211/4esh.c#L344" id="L344" cl4ss="l4ne" nacode=sdata" class="sref">sdataifmsh->ifmsdot11MsdaHWMPRootM021href="+code=posdot11MsdaHWMPRootM021ef="+ref" 358        if (->skb) < 2 +4mf="net/m4f="net/mac80211/mesh.c#L446" i44ported" class="sr" cl  36WORK_ROO/a>->WORK_ROO/="+code=ieee80211_ie_build/a> < ifmshwrkq_flag        sband->sk_buf4 4sdataIEEE80211_BAND_2GHZ 36WORK_ROO/a>->WORK_ROO/="+code=ieee80211_ie_build/a> < ifmshwrkq_flag        sband->)
 327"net/mac80211/mesh.c#L328" id="L328" clas4de=sdata"4class="sref">sdata-&4t;ieeass="sref">ifmsd    ima>_synchref="+code=posd    ima>_syncline"e=ieee80211_ie_buildifmsh->/mac80211/mesh.0211/ref=_root_tima>lineclass="sref">sband->ef="+cod4e80211_supported_bandlen);
u4 4len);
pos<4m" class=4sref">skb_tailroom(<4 href4"+code line" name="L327"> 327<*t/mac80211/mesh.c#L328" id="L328" clas4d;
                return 4 32 *         * 32 * @hdr:="+code=id=.11 fretu heada>limac80211/mesh.c#L328" id="L328" clas4dcode=sk_4lass="sref">channel-4gt; 32 * @fc:="+code= fretu control aieldlimac80211/mesh.c#L328" id="L328" clas4ds="sref"4href="+code=IEEE80211_BA4D_2GH4" clas line" name="L327"> 32 * @28" da:="+codestination mesress in the L321" mac80211/mesh.c#L328" id="L328" clas4kb_put" c4ass="sref">skb_put(<4 href4"+code line" name="L327"> 32 * @28" sa:="+cosource mesress mesress in the L321.  Setu as TA, as fretu is" mac80211/mesh.c#L328" id="L328" clas4ke=sdata"4  32 *              ne" nly originated." mac80211/mesh.c#L328" id="L328" clas4kef="+cod4 361                4 32 *" mac80211/mesh.c#L328" id="L328" clas4k-> 32 * R80211_the length of the id=.11 (does not includu a 0211 control heada>)" mac80211/mesh.c#L328" id="L328" clas4k }
 32 *et/mac80211/mesh.c#L328" id="L328" clas4  }
 370{
pos, &am__leesh.c#L315"7"> 377_lees" class="line" name="fchref="+code=posfclined_ht_oper_ie(struct len = 0;
len = 0;
skb) < 2 +40;
sdata}
bais_multicast_ether/mesrt/mac80211/mesh.s_multicast_ether/mesrline" name="L384"> 328" da/mac80211/mesh.0211d"+cod)/acode=sdata" class="sref">sdatask_buf4 4 37cpucodeleesline" name="L384"> 3if ( 360if (sband-> 327)
ieeass="sref">ifms/a>;
ifmsh->mesr1t/mac80211/meshmesr1" clref">pos, &am28" da/mac80211/mesh.0211d"+code=f">pos, &amETH_ALE name="L331"> 33ETH_ALE lineclass="sref">sband->sdata-&4t;ifms/a>;
ifmsh->mesr2t/mac80211/meshmesr2" clref">pos, &am28" sa/mac80211/mesh.0211s"+code=f">pos, &amETH_ALE name="L331"> 33ETH_ALE lineclass="sref">sband->ifms/a>;
ifmsh->mesr3t/mac80211/meshmesr3" clref">pos, &am28" sa/mac80211/mesh.0211s"+code=f">pos, &amETH_ALE name="L331"> 33ETH_ALE lineclass="sref">sband->u4 47"> 333           e80211_24lass="sref">sband->sdataoper_channel-4gt; 37cpucodeleesline" name="L384"> 3if ( 360if ( 360if (sband->. 327>}
NL80ass="sref">ifms/a>/a> = ifmsh->mesr1t/mac80211/meshmesr1" clre0e=f">pos, &amETH_ALE name="L331"> 33ETH_ALE linecl cl line" name="L327"> 327"net/mac80211/mesh.c#L328" id="L328" clas4/mesh.c#L478" id="L378" class="lin4" nam47 class="sref">IEEE80211_BAND_2GHZ;
ifmsh->mesr2t/mac80211/meshmesr2" clref">pos, &am28" sa/mac80211/mesh.0211s"+code=f">pos, &amETH_ALE name="L331"> 33ETH_ALE lineclass="sref">sband->ifmsh->mesr3t/mac80211/meshmesr3" clref">pos, &am28" da/mac80211/mesh.0211d"+code=f">pos, &amETH_ALE name="L331"> 33ETH_ALE lineclass="sref">sband->iee ifmsh->mesr4t/mac80211/meshmesr4" clref">pos, &am28" sa/mac80211/mesh.0211s"+code=f">pos, &amETH_ALE name="L331"> 33ETH_ALE lineclass="sref">sband-> 385
len);
len);
ht_ca4.4a href="+code=cap" class="sref">cap);
 327<*t/mac80211/mesh.c#L328" id="L328" clas4mac80211/4esh.c#L386" id="L386" cl4ss="l48"L356 line" name="L327"> 32 * .c#L321" inew_0211/heada> - create a new 0211 heada>limac80211/mesh.c#L328" id="L328" clas40;
 32 * @28" hdr:="+cuninitialized 0211 heada>limac80211/mesh.c#L328" id="L328" clas40mesh.c#L4f="net/mac80211/mesh.c#L488" i48 clas line" name="L327"> 32 * @ass=":="+cod0211 is="sface to be usedlimac80211/mesh.c#L328" id="L328" clas4+code=sk_4uff" class="sref">sk_buf4 49+code line" name="L327"> 32 * @mesr4or5:="+1st mesress in the au heada>,ode=ch may correspond to mesress 4limac80211/mesh.c#L328" id="L328" clas4+izeof(st4ieee80211_sub_if_data 32 *              (if mesr6 is NULL) or mesress 5 (if mesr6 is pres"> ). It maylimac80211/mesh.c#L328" id="L328" clas4+ef="+cod4="net/mac80211/mesh.c#L341" id49="+co line" name="L327"> 32 *              be NULL." mac80211/mesh.c#L328" id="L328" clas4de=sdata"4class="sref">sdata-&4t; 32 * @mesr6:="+cod2nd mesress in the au heada>,ode=ch corresponds to mesr6 of the" mac80211/mesh.c#L328" id="L328" clas4dzeof(str4oom" c_local" class="sre4">iee49ass=" line" name="L327"> 32 *              0211 fretut/mac80211/mesh.c#L328" id="L328" clas4e"+code=h4net/mac80211/mesh.c#L2944 id="49+code line" name="L327"> 32 *" mac80211/mesh.c#L328" id="L328" clas4e);
 32 * R80211_the heada> length." mac80211/mesh.c#L328" id="L328" clas4dac80211/4="net/mac80211/mesh.c#L246" id49"L356 line" name="L327"> 32 *et/mac80211/mesh.c#L328" id="L328" clas4>;
u4/a>.<49"L367" class="line" name.c#L321" inew_0211/heada>t/mac80211/mesh.c#L321" inew_0211/heada>line"line" name="L370"> 370{
mesh.c#L4fset" class="sref">offse4,49 class="sref">IEEE802line" name="L278"> 278{
 390                        struct           mesr4or5t/mac80211/meshmesr4or5" clr211/mesh.c#L328" id="L328" clas5a href="+5ode=u8" class="sref">u8<5a> *<50a href="+code=skb" clchar390          mesrsh.c#L315"7"> 37mesrs+cod" class="sref">skb) < 2 +5a>;
sdataifmsh->5skb, "+cod=_name="L385"> 385
 33BUG_O line"class="sref">banmesr4or5t/mac80211/meshmesr4or5" clde=ieee=ieelass="line" nameaesrsh.c#L315"7"> 37mesrs+cod"ame="L385"> 385
ieee80211_h/a>/a> =  3045/a>        ifmshtt"L375" class="litt""+cod=_0                        struct  *ifmsh = &ifmshshcfgL375" class="liifmsdot11MsdaTTLL375" class="lidot11MsdaTTLh" c id="L381" class="line" name="L35364"> 3045/eee80211_sub_if_dataifmsh = &ifmsh211/seqnu href="net/mac80h211/seqnu " clbode=ieee80211_ie_build28" hdr/mac80211/mesh.0211hdr" cl" class="sref">ifmshseqnu href="net/mac80seqnu " clb id="L381" class="line" name="L35374"> 3045/"net/mac80211/mesh.c#L2506" i50"L356" class="line" name="L3              struct  *ifmsh = &ifmsh211/seqnu href="net/mac80h211/seqnu " cl++ id="L381" class="line" name="L35384"> 3045/+code=u" class="sref">u5 href50ref="+code=band" class="sref">bamesr4or5t/mac80211/meshmesr4or5" clde=ieee=ieelclass="sref">banmesrsh.c#L315"7"> 37mesrs+cod"acode=sdata" class="sref">sdataie_len -5IEEE80211_BAND_2GHZifmshflag        ie +5skb, "+cod+ct  33ETH_ALE line id="L381" class="line" name="L35f>;
skb5 <51cap" class="sref">iee ifmshemesr1t/mac80211/meshemesr1" clref">pos, &ammesr4or5t/mac80211/meshmesr4or5" clr=f">pos, &amETH_ALE name="L331"> 33ETH_ALE lineclass="sref">sband->      5                 return 5bamesr4or5t/mac80211/meshmesr4or5" clde=ieee=ieellass="sref">banmesrsh.c#L315"7"> 37mesrs+cod"acode=sdata" class="sref">sdatadata5/a>, 51ef="+code=sbaclass="sass="sref">ifms/a" hdr/mac80211/mesh.0211hdr" cl" class="sref">ifmshflag         376FLAGS_AE_A5_Asline id="L381" class="line" name="L35f4esh.c#L5c80211/mesh.c#L313" id="5313" 51"> 333            skb, "+cod+ct2 *t  33ETH_ALE line id="L381" class="line" name="L35f04"> 3045f="net/mac80211/mesh.c#L514" i51+code=skb" class="sre ifmshemesr1t/mac80211/meshemesr1" clref">pos, &ammesr4or5t/mac80211/meshmesr4or5" clr=f">pos, &amETH_ALE name="L331"> 33ETH_ALE lineclass="s81" class="line" name="L35f64"> 3045esh.c#L315" id="L315" cl5ss="l51="+code=ie_len" class ifmshemesr2t/mac80211/meshemesr2" clref">pos, &ammesrsh.c#L315"7"> 37mesrs+codr=f">pos, &amETH_ALE name="L331"> 33ETH_ALE lineclass="s81" class="line" name="L35f74"> 3045="net/mac80211/mesh.c#L356" id51L296" class="len" class="sref">len);
}
skb, "+colass="s81" class="line" name="L35fie_len" 5net/mac80211/mesh.c#L3185 id="51a hrelen" class="sref">len);
data<5>)
aic void="line" name="L3c#L384" id0211/housekeepingL375" class="lic#L384" id0211/housekeepingline"line" name="L370"> 370{
 390                        struct data<5>a>      5"+code=u" class="sref">u5/a>.<52="+code=pos" class="ssssssssssssline" name="L370"> 370{
 321        struct " class="sref">skb) < 2 +5 href="+c5de=u8" class="sref">u8 sdatau8<5a> *<52ap" class="sref">ieee80211_hboo"L375" class="liboo"p" clss="sref">ifmshfree_pss=k        capifmsh->5pos, &amif (PEER_INACTIVITY_LIMI/a>->PEER_INACTIVITY_LIMI/lineclass="s81" class="line" name="L35/mesh.c#L526" id="L326" class="lin5" nam52"L356" class="line" name="L30211/ref=_expir1href="+code=pos0211/ref=_expir1mesh.c#L341" id="L34              struct  387<5="line" n5me="L328"> 328      5 ifmshfree_pss=k                  0211/rss=k_availablest/mac80211/mesh0211/rss=k_availablesmesh.c#L341" id="L34              struct ifmsh5/a>-&53"L379" class="line" name="L379">free_pss=k                                struct  *ifmsh = &ifmsaccepting_pss=k        skb) < 2 +5fmsh" cla5s="sref">ifmsh-><5 href53cap" class="sref">iee pos, &amBSS_operGED_BEACO name="L331"> 33BSS_operGED_BEACO ref=class="s81" class="line" name="L35fa>      5ata == ENOMEM<5ode=len" 5lass="sref">len = ifmsh->housekeeping_tima>/mac80211/mesh.housekeeping_tima>ref=,"+code=data" class="sref">data<5.c#L333" 5d="L333" class="line" na5e="L353"> 333           s="line" name="L3round_jiffiest/mac80211/meshround_jiffiesmesh.c#L341" id="L34jiffiest/mac80211/meshjiffiesmesh +   344        return5 name="L35ass=435             5  ENOMEM<5ef="net/m5c80211/mesh.c#L336" id="5336" 53"L326f">aic void="line" name="L3c#L384" id0211/rootref=L375" class="lic#L384" id0211/rootref=line"line" name="L370"> 370{
 390                        struct skb) < 2 +5f>}
sdata 338       5if (<53L278" class="line" name="L278"> 278{
 321        struct ieee80211_if_mesh *ifmsh = &sdata-&5f="+code=5kb" class="sref">skb5 <540L382" class="line" name="L3u32t/mac80211/meshu3L391" s="line" name="Ls="sv="net/mac80211/mess="sv="code=sdata" class="sref">sdata-&5fmsh" cla5                 return 5sdata-&5fa>      5=data" class="sref">data5/a>, 542L382" class="line" name="L3m211/ref=_tx_root_fretuhref="+code=pos0211/ref=_tx_root_fretumesh.c#L341" id="L34              struct  342     5  }
 333   nd" e" name="L337">ifmsh->ifmsdot11MsdaHWMPRootM021href="+code=posdot11MsdaHWMPRootM021ef="+f="+code=local" clif ( 33if (skb) < 2 +5mac80211/5esh.c#L344" id="L344" cl5ss="l54+code=skb" class="sre ifmsh->ifmsdot11MsdaHWMPRannIs="sv="net/mac80211/medot11MsdaHWMPRannIs="sv="code=sdata" class="sref">sdata-&5fname="L35="net/mac80211/mesh.c#L355" id54ref="+code=baelsesdata" class="sref">sdata-&5ff="net/m5f="net/mac80211/mesh.c#L546" i54ported" class="sr" cl ifmsh->ifmsdot11MsdaHWMProotIs="sv="net/mac80211/medot11MsdaHWMProotIs="sv="code=sdata" class="sref">sdata-&5f>}
sk_buf5 54L387" class="line" name="L387"> 387<5ss="sref"5ieee80211_sub_if_dataifmshmod_tima>/mac80211/mesh.0od_tima>mesh.e=ieee80211_ie_buildifmsh->0211/ref=_root_tima>/mac80211/mesh.0211/ref=_root_tima>line,"+code=data" class="sref">data<5>)
sdata-&5t; 386        return5>ef="+cod5e80211_supported_bandENOMEM<5 u5 5ENOMEM<5  }
 370{
 390                        struct skb) < 2 +5m" class=5sref">skb_tailroom(<5 href55e" nacode=sdata" class="sref">sdata                return 5 333   f">skb,
 321        struct ieee80211_if_mesh *ifmsh = &sdata-&5df="net/m5f="net/mac80211/mesh.c#L556" i5="L356sdata" class="sref">sdata-&5d>}
channel-5gt; 327s fire at_the setu tima *et/mac80211/mesh.c#L328" id="L328" clas5ds="sref"5href="+code=IEEE80211_BA5D_2GH55"L378"> 378                retur5kb_put" c5ass="sref">skb_put(<5 href56"L379" class="line" name="L379">d    ima>_synchref="+code=posd    ima>_syncline"e=ieee80211_ie_buildifmsh->housekeeping_tima>/mac80211/mesh.housekeeping_tima>ref=b" class="sref">skb) < 2 +5ke=sdata"5 iee  3TMR_RUNNING_HKt/mac80211/meshTMR_RUNNING_HKref=r=e=ieee80211_ie_build/a> < ifmshtima>s_runningL375" class="litima>s_runningnd" class="sref">sband->d    ima>_synchref="+code=posd    ima>_syncline"e=ieee80211_ie_buildifmsh->0211/ref=_tima>/mac80211/mesh.0211/ref=_tima>ref=b" class="sref">skb) < 2 +5k->ifms=et_bid="L383" class="let_bidline" name="L384"> 3TMR_RUNNING_MP="L383" class="TMR_RUNNING_MP="+code=ieee80211_ie_build/a> < ifmshtima>s_runningL375" class="litima>s_runningnd" class="sref">sband-> 333   nd" e" name="L337">d    ima>_synchref="+code=posd    ima>_syncline"e=ieee80211_ie_buildifmsh->/mac80211/mesh.0211/ref=_root_tima>linec" class="sref">skb) < 2 +5k" class=5f="net/mac80211/mesh.c#L564" i56+code=skb" class="sre  3TMR_RUNNING_MPR="L383" class="TMR_RUNNING_MPR="+code=ieee80211_ie_build/a> < ifmshtima>s_runningL375" class="litima>s_runningnd" class="sref">sband-> 386        return50;
sdata-&5a>}
 370{
 390                        struct skb) < 2 +5+code=sk_5uff" class="sref">sk_buf5 5sdataskb,
 321        struct ieee80211_if_mesh *ifmsh = &sdatasdata-&5sef="+cod5class="sref">sdata-&5t;test_and_clear_bid="L383" class="test_and_clear_bidline" name="L384"> 3TMR_RUNNING_HKt/mac80211/meshTMR_RUNNING_HKref=r=e=ieee80211_ie_build/a> < ifmshtima>s_runningL375" class="litima>s_runningnd" c" class="sref">skb) < 2 +5sifmsadd_tima>/mac80211/mesh.add_tima>line"e=ieee80211_ie_buildifmsh->housekeeping_tima>/mac80211/mesh.housekeeping_tima>ref=b=ode=sdata" class="sref">sdatau5 57"> 333   nd" e" name="L337">test_and_clear_bid="L383" class="test_and_clear_bidline" name="L384"> 3TMR_RUNNING_MP="L383" class="TMR_RUNNING_MP="+code=ieee80211_ie_build/a> < ifmshtima>s_runningL375" class="litima>s_runningnd" c" class="sref">skb) < 2 +5s" class=5f="net/mac80211/mesh.c#L574" i57+code=skb" class="sre ifmsh->0211/ref=_tima>/mac80211/mesh.0211/ref=_tima>ref=b=ode=sdata" class="sref">sdataoper_channel-5gt;test_and_clear_bid="L383" class="test_and_clear_bidline" name="L384"> 3TMR_RUNNING_MPR="L383" class="TMR_RUNNING_MPR="+code=ieee80211_ie_build/a> < ifmshtima>s_runningL375" class="litima>s_runningnd" c" class="sref">skb) < 2 +5s;
.ifmsh->0211/ref=_root_tima>/mac80211/mesh.0211/ref=_root_tima>lineclass="sref">sband->>}
sband->code=sk_578" id="L378" class="lin5" nam57a hrelen" class="sref">len);
len);
sdata-&5 ef="+cod5>                return 5 370{
 390                        struct skb) < 2 +5a>;
sdata 333   f">skb,
 321        struct ieee80211_if_mesh *ifmsh = &sdataht_ca5.585> 333   f">skb,
 392        struct ieee80211_local *local = ENOMEM<5mac80211/5esh.c#L386" id="L386" cl5ss="l58"L356" class="line" name="L3 id="L375" class="line" name="L375"> 375     fd="other/bs         327ifmshatomic_inchref="+code=posatomic_incline"e=ieee80211_ie_build id="L375" class="line" name="L375"> 375     iff_allmultist/mac80211/mesh.ff_allmultisss="class="sref">sband->sk_buf5 590L382" class="line" name="L3sh.c#L392"configureiailta>t/mac80211/mesh.c#L321" iconfigureiailta>line"e80211_ie_build id="L375" class="line" name=class="sref">sband->sdata-&5+ef="+cod5="net/mac80211/mesh.c#L351" id592L382" class="line" name="L3ifmsh->0211/cc_idL375" class="li0211/cc_id struct0;cl line" name="L327"> 327sdata-&5t;ifmsh->0211/auf=_idL375" class="li0211/auf=_id struct0;clcode=meline" name="L327"> 327iee594ref="+code=meline" name="L327"> 327"sync ops from extensible"synchronization fretuwork *et/mac80211/mesh.c#L328" id="L328" clas5d" class=5net/mac80211/mesh.c#L2945 id="59"L374" class="line" name="L3ifmsh->sync_ops80211_local" claync_ops struct  = line"e80211_ie_buildifmsh->0211/sp_idL375" class="li0211/sp_idame=class="sref">sband->ifmsh->adjusting_tbt> = local = ifmsh->sync_offlet_cne"kdrifdf=ax80211_local" claync_offlet_cne"kdrifdf=ax struct0;="sref">local = u5/a>.<59HT" class="sr"line" name="L3=et_bid="L383" class="let_bidline" name="L384"> 36WORK_HOUSEKEEPING="L383" class="6WORK_HOUSEKEEPING="+code=ieee80211_ie_build/a> < ifmshwrkq_flag        sband->mesh.c#L5fset" class="sref">offse5,59L278" class="ss="sref">ifmshc#L384" id0211/root_letut/mac80211/mesh.c#L384" id0211/root_letutline"e80211_ie_buildsband->u8<6a> *<600L382" class="line" name="L3sh.c#L392"queue_work/mac80211/mesh.c#L384" idqueue_workline"e=ieee80211_ie_build id="L375" class="line" name="L375"> 375     hw/mac80211/mesh.hw="+code=ieee80211_ie_build=ieee80211_local" class="sref">ieee80211_localsband->ieee80211_localifmsbss_conf80211_local" clbss_confh" class="sref">ifmsht_operation_m021href="+code=posht_operation_m021 strucass="sref">sband->ifmsh->0shcfgL375" class="liifmsht_opm021href="+code=posht_opm021 strlass="sref">sband->sdata-&6" nam60"L382" class="line" name="L3=ieee80211_local" class="sref">ieee80211_localifmsbss_conf80211_local" clbss_confh" class="sref">ifmsbeacon_ind="L383" class="beacon_ind struct sband->ieee80211_h=ieee80211_local" class="sref">ieee80211_localifmsbss_conf80211_local" clbss_confh" class="sref">ifmsbasic_ratest/mac80211/meshbasic_rates strucass="sref">sband->ieee80211_local *data<6364"> 3046/eee80211_sub_if_dataieee80211_h=ieee80211_local" class="sref">ieee80211_local 375     hw/mac80211/mesh.hw="+class="sref">ifmsconf80211_local" clconfh" class="sref">ifms    ne"L375" class="li    ne"ame="L375"> 375     banst/mac80211/meshbandame=class="sref">sband-> 3046/"net/mac80211/mesh.c#L2606" i60"L356" class="line" name="L3c#L384" idbss_info     ge_notifpos, &amBSS_operGED_BEACO name="L331"> 33BSS_operGED_BEACO ref= |ass="sref">sband-> 3046/+code=u" class="sref">u6 href60ref="+code=ba=ie_len" classssssssssssssssssenlass="sref">ieee80211_hBSS_operGED_BEACO _ENABLEDname="L331"> 33BSS_operGED_BEACO _ENABLEDref= |ass="sref">sband-> 3046/set" class="sref">offse6IEEE802 classssssssssssssssssenlass="sref">ieee80211_hBSS_operGED_H/a>->sband->ie +6ieee80211_hBSS_operGED_BASIC_RATEname="L360"> 360BSS_operGED_BASIC_RATEnref= |ass="sref">sband->skb6 <61cap" class="sref">iee classssssssssssssssssenlass="sref">ieee80211_hBSS_operGED_BEACO _INTname="L331"> 33BSS_operGED_BEACO _INTame=class="sref">sband->      6                 return 6len);
data6/a>, 61ass="line" name="L342"> 342     6f4esh.c#L6c80211/mesh.c#L313" id="6313" 61"L343void="line" name="L3c#L384" idstopf="net/mac80211/mesh.c#L321" istopf="neline"line" name="L370"> 370{
 390                        struct skb) < 2 +6f04"> 3046f="net/mac80211/mesh.c#L614" i61e" nacode=sdata" class="sref">sdata 3046esh.c#L315" id="L315" cl6ss="l616> 333   f">skb,
 392        struct ieee80211_local *local =  3046="net/mac80211/mesh.c#L366" id61L296" class="f">skb,
 321        struct ieee80211_if_mesh *ifmsh = &local =  3046f="net/mac80211/mesh.c#L617" i61L387" class="line" name="L387"> 387<6fie_len" 6net/mac80211/mesh.c#L3186 id="61L278" class="ss="sref">ifmshca href="+code=ifmsh" class="sref">ifmsh->0211/id_f">skb,  struct0;="sref">local = pos, &amBSS_operGED_BEACO _ENABLEDname="L331"> 33BSS_operGED_BEACO _ENABLEDref=class="sref">sband->)
pos, &amNULLL375" class="liNULLref=class="sref">sband->a>      6"+code=u" class="sref">u6/a>.<62="+code=ENOMEM" class="sref">ENOMEM<6 href="+c6de=u8" class="sref">u8 _syncline"e=ieee80211_ie_build              struct  *ifmsh = &ifmshousekeeping_tima>/mac80211/mesh.housekeeping_tima>ref=b=ode=sdata" class="sref">sdatau8<6a> *<62ap" class="sref">ieee80211_hd    ima>_synchref="+code=posd    ima>_syncline"e=ieee80211_ie_build              struct  *ifmsh = &ifms0211/ref=_root_tima>/mac80211/mesh.0211/ref=_root_tima>lineclass="sref">sband-> }
_syncline"e=ieee80211_ie_build              struct  *ifmsh = &ifms0211/ref=_tima>/mac80211/mesh.0211/ref=_tima>ref=b=ode=sdata" class="sref">sdataifmsh->6 327 32         * If the tima> firedode=le we waitedofor it, it will havut/mac80211/mesh.c#L328" id="L328" clas6/>}
 32         * requeued the work. Now the work will be running againt/mac80211/mesh.c#L328" id="L328" clas6/ie_len" 6me="L328"> 328      6  32         * but will not rearm the tima> again because it checkifmsh6/a>-&63+code line" name="L327"> 32         * whether the is="sface is running,ode=ch, at_this pois=,ucmac80211/mesh.c#L328" id="L328" clas6f)
ifmsh-><6 href63MS" c line" name="L327"> 32         * it no lo ger is." mac80211/mesh.c#L328" id="L328" clas6fa>      6ata ==  32         *et/mac80211/mesh.c#L328" id="L328" clas6ode=len" 6lass="sref">len =  *sband-> 33ass="sref">sband-> 375     fd="other/bs        sband->             6   375     iff_allmultist/mac80211/mesh.ff_allmultisss="class="sref">sband->t/mac80211/mesh.c#L321" iconfigureiailta>line"e80211_ie_build id="L375" class="line" name=class="sref">sband->}
 387<6 "line" n6e="L338"> 338       6if (<63L278" class="ss="sref">ifmsh              struct  *ifmsh = &ifmstima>s_runningL375" class="litima>s_runningnd" uct0;="sref">local = skb6 <640L382len" class="sref">len);
sdata-&6fa>      6=data" class="sref">data6/a>, 642L382f">aic void="line" name="L3c#L384" id0211/rx_bcn_prest/mac80211/mesh.c#L384" id0211/rx_bcn_prestline"line" name="L370"> 370{
 390                        struct data<6ef="net/m6c80211/mesh.c#L342" id="6342" 64ef="+code=sbaclass="sssssssssssssssssssssssssif_mesh * 37u16> 333"line" name="L3=typ1href="+code=pos=typ1ref=,"+code=data" class="sref">data<6ec#L333" 6f="net/mac80211/mesh.c#L643" i64"> 333           s=======================line" name="L370"> 370{
 = 0"> 390          mgm> =  ,"+code=data" class="sref">data<6e }
 333"line" name="L3f">skb,  str,"+code=data" class="sref">data<6eifmsh" c6="net/mac80211/mesh.c#L365" id64="+code=ie_len" classssssssssssssssssenlass="line" name="L370"> 370{
aust/mac80211/meshL#L384" idrx_f">aus0"> 390          rx_f">aust/mac80211/meshrx_f">aus0"> " class="sref">skb) < 2 +6ff="net/m6f="net/mac80211/mesh.c#L646" i64portecode=sdata" class="sref">sdata}
sk_buf6 64ref="+code=baf">skb,
 392        struct ieee80211_local *local =  278{
 321        struct ieee80211_if_mesh *ifmsh = &local = skb,
 333"line" name="L3elemst/mac80211/meshelems> 33=="sref">local = sdata-&6t; 278{
local =  333"line" name="L3basef">skb, ame==="sref">local = u6 65ef="+code=sbain name="L278"> 278freq/a>        local =  333   enum="line" name="L3sh.c#L392"banst/mac80211/meshsh.c#L392"bans> 333"line" name="L3banst/mac80211/meshbandame=uct aust/mac80211/meshrx_f">aus0"> "L375"> 375     banst/mac80211/meshbandame==="sref">local = skb_tailroom(<6 href65 href="+code=cap" class="sref">cap                return 6 327< ignore ProbeRest to foreign mesress *et/mac80211/mesh.c#L328" id="L328" clas6df="net/m6f="net/mac80211/mesh.c#L656" i65"L356" class=nd" e" name="L337">=typ1href="+code=pos=typ1ref=+f="+code=local" clif (}
channel-6gt;banether_mesr_equ =  "L375"> 375     d_mesh" class="srdhref=r=f">pos, &am=ieee80211_local" class="sref">ieee80211_localifmsmesrhref="+code=posadd>linec" class="sref">skb) < 2 +6ds="sref"6href="+code=IEEE80211_BA6D_2GH65 class="sref">IEEE802e80211e211/mesh.c#L328" id="L328" clas6kb_put" c6ass="sref">skb_put(<6 href66href="+code=data" class="sref">data<6ke=sdata"6 skb, ame=uct"e80211_ie_buildu8skb, ifmshmgm> =  "L375"> 375      href="+code=ifmsh" class="sref">ifmsprobe_rest/mac80211/mesh.probe_resth" class="sref">ifmsvariable80211_local" clvariableef="+-t"e80211_ie_buildu8skb, ifmshmgm> =  e211/mesh.c#L328" id="L328" clas6ka>      6 361                6basef">skb, ame=uL3753"line" name="L3f">skb,  str" class="sref">skb) < 2 +6k-> 33ass="sref">sband-> =  "L375"> 375      href="+code=ifmsh" class="sref">ifmsprobe_rest/mac80211/mesh.probe_resth" class="sref">ifmsvariable80211_local" clvariableef="r=f">pos, &amf">skb,  str+-te" name="L379">basef">skb, ame=,"+code=data" class="sref">data<6mac80211/6esh.c#L365" id="L365" cl6ss="l66="+code=ie_len" classssssssssssssssshref="+code=ieee8021elemst/mac80211/meshelems> 33class="sref">sband->sdata-&6a>}
 327s "liour security is off *et/mac80211/mesh.c#L328" id="L328" clas6+code=sk_6uff" class="sref">sk_buf6 669L379" class="line" name="L379">elemst/mac80211/meshelems> 33lass="sref">ifmsrsn_f">skb, ref=+e=ieee=iee"ss="sref">ifmsh              struct  *ifmsh = &ifmssecurity         struct ecurityref=+f="+code=local" clif (SEC_NONE="L383" class="if (SEC_NONE str" class="sref">skb) < 2 +6ss="sref"6ieee80211_sub_if_datasdata-&6sef="+cod6class="sref">sdata-&6t;elemst/mac80211/meshelems> 33lass="sref">ifmsdsiparamst/mac80211/meshdsiparamsref=+e=ieee=iee"ss="sref">ifmshelemst/mac80211/meshelems> 33lass="sref">ifmsdsiparams_f">skb, ref=+f="1" class="sref">skb) < 2 +6sifmsfreq/a>         33lass="sref">ifmsdsiparamst/mac80211/meshdsiparamsref=[0]r=f">pos, &ambanst/mac80211/meshbandame=class="sref">sband->u6 67"> 333   elsesdata" class="sref">sdata-&6s" class=6f="net/mac80211/mesh.c#L674" i67+code=skb" class="sre aust/mac80211/meshrx_f">aus0"> "L375"> 375     freq/a>        local = oper_channel-6gt;ENOMEM<6s;
. 375     hw/mac80211/mesh.hw="+class="sref">ifmswiphpos, &amfreq/a>        sband->}
 387<6>code=sk_678" id="L378" class="lin6" nam679L379" class="linclass="sref">ban    ne"L375" class="li    ne"ame=u||="line" name="L3    ne"L375" class="li    ne"ame="L375"> 375     flag        ifmshif ( 33if (skb) < 2 +6 0;
sdata-&6 ef="+cod6>                return 6elemst/mac80211/meshelems> 33lass="sref">ifms0211/id> = &ifmshelemst/mac80211/meshelems> 33lass="sref">ifmsf="+_config> = &;
ifmsf="+_matches1ref="net/mac80211/mef="+_matches1ref="line"e80211_ie_build              struct  33c" class="sref">skb) < 2 +6  }
 333           ass="sref">ifmsf="+_neighbour_up =  "L375"> 375     s          struct href=r=href="+code=ieee8021elemst/mac80211/meshelems> 33ce211/mesh.c#L328" id="L328" clas6a" class=6_cap" class="sref">ht_ca6.68 href="+code=cap" class="sref">cap);
ifmsh->sync_ops80211_local" claync_ops str" class="sref">skb) < 2 +6 ;
ifmsh->sync_ops80211_local" claync_ops strsref">ifmsh->rx_bcn_prest/mac80211/mesh.rx_bcn_prestline"e80211_ie_build              struct skb) < 2 +6 >}
=typ1href="+code=pos=typ1ref=r=e80211_ie_buildmgm> =  r=href="+code=ieee8021elemst/mac80211/meshelems> 33r=e80211_ie_buildrx_f">aust/mac80211/meshrx_f">aus0"> "e211/mesh.c#L328" id="L328" clas6acode=sk_6f="net/mac80211/mesh.c#L688" i68a hrelen" class="sref">len);
sk_buf6 69href="+code=data" class="sref">data<6+e=sdata"6ieee80211_sub_if_dataaic void="line" name="L3c#L384" id0211/rx_0gm>_actionL375" class="li{
_actionline"line" name="L370"> 370{
 390                        struct data<6+ef="+cod6="net/mac80211/mesh.c#L361" id69="+code=pos" class="sssssssssssslass===========line" name="L370"> 370{
 = 0"> 390          mgm> =  ,"+code=data" class="sref">data<6de=sdata"6class="sref">sdata-&6t; * 333"line" name="L3f">skb,  str,"+code=data" class="sref">data<6dzeof(str6oom" c_local" class="sre6">iee69"> 333           s========================"line" name="L370"> 370{
aust/mac80211/meshL#L384" idrx_f">aus0"> 390          rx_f">aust/mac80211/meshrx_f">aus0"> " class="sref">skb) < 2 +6d" class=6net/mac80211/mesh.c#L2946 id="69e" nacode=sdata" class="sref">sdatamgm> =  "L375"> 375      href="+code=ifmsh" class="sref">ifmsactionL375" class="liactionlinelass="sref">ifms a egor " code=sdata" class="sref">sdataifmsWLer_CATEGORY_SELFePROTECTEDname="L331"> 33WLer_CATEGORY_SELFePROTECTEDL356:ode=sdata" class="sref">sdata}
u6/a>.<69ref="+code=ba=ie_len"switch" e" name="L337">mgm> =  "L375"> 375      href="+code=ifmsh" class="sref">ifmsactionL375" class="liactionlinelass="sref">ifms href="+code=ifmsh" class="sref">ifmsself_prod="L383" class="lelf_prodh" class="sref">ifmsaction_>ifmL375" class="liaction_>ifm0"> " code=sdata" class="sref">sdataoffse6,69 class="sref">IEEE802case ass="sref">ifmsWLer_SPe6PEERING_OPE name="L331"> 33WLer_SPe6PEERING_OPE L356:ode=sdata" class="sref">sdatau8<7a> *<70a href="+code=skb" clcase ass="sref">ifmsWLer_SPe6PEERING_CLOSE="L383" class="WLer_SPe6PEERING_CLOSEL356:ode=sdata" class="sref">sdataifmsWLer_SPe6PEERING_CO FIR"net/mac80211/meWLer_SPe6PEERING_CO FIR"L356:ode=sdata" class="sref">sdataifmsf="+_rx_p211k_fretu80211_local" clf="+_rx_p211k_fretuline"e80211_ie_build              struct  =  r=f">pos, &amf">skb,  strr=e80211_ie_buildrx_f">aust/mac80211/meshrx_f">aus0"> "e211/mesh.c#L328" id="L328" clas7a3href="+7olass="sref">sdata-&7" nam70ef="+code=sbaclass="sssssssssbreake211/mesh.c#L328" id="L328" clas7a4href="+7oom" c_local" class="sre703" i70"> 333           len" class="sref">len);
ifmsWLer_CATEGORY_6ACTIO name="L331"> 33WLer_CATEGORY_6ACTIO L356:ode=sdata" class="sref">sdataf="+_action_is/ref=_se"L375" class="lif="+_action_is/ref=_se"line"e80211_ie_buildmgm> =  c" class="sref">skb) < 2 +7384"> 3047/+code=u" class="sref">u7 href70ref="+code=ba=ie_len" classssass="sref">ifmsf="+_rx_pef=_se"_fretu80211_local" clf="+_rx_pef=_se"_fretuline"e80211_ie_build              struct  =  r=f">pos, &amf">skb,  str"e211/mesh.c#L328" id="L328" clas7a94"> 3047/set" class="sref">offse7IEEE802breake211/mesh.c#L328" id="L328" clas7f="+code=7e" class="sref">ie +7len);
skb7 <71cap" len" class="sref">len);
ENOMEM<7ref="+cod7=data" class="sref">data7/a>, 71ass="void="line" name="L3c#L384" id0211/rx_queuedhmgm> = line"line" name="L370"> 370{
 390                        struct data<7f4esh.c#L7c80211/mesh.c#L313" id="7313" 71"> 333           s==================line" name="L370"> 370sk_buff80211_local" clsk_buff0"> 390           kb80211_local" clskb0"> " class="sref">skb) < 2 +7f04"> 3047f="net/mac80211/mesh.c#L714" i71e" nacode=sdata" class="sref">sdata 3047esh.c#L315" id="L315" cl7ss="l716> 333   f">skb,
aust/mac80211/meshL#L384" idrx_f">aus0"> 390          rx_f">aust/mac80211/meshrx_f">aus0"> e211/mesh.c#L328" id="L328" clas7f7href="+7="net/mac80211/mesh.c#L376" id71L296" class="f">skb,
0"> 390          mgm> =  e211/mesh.c#L328" id="L328" clas7f84"> 3047f="net/mac80211/mesh.c#L717" i71HT" class="sr"line" name="L3 1sh.c#L315"7"> 37u16> 333"line" name="L3=typ1href="+code=pos=typ1ref=e211/mesh.c#L328" id="L328" clas7f94"> 3047net/mac80211/mesh.c#L3187 id="71L278"211/mesh.c#L328" id="L328" clas7ss="sref"7ieee80211_sub_if_dataaust/mac80211/meshrx_f">aus0"> uct  33if ( "e211/mesh.c#L328" id="L328" clas7>)
0"> uct"f">skb,
0"> 39)"ss="sref">ifmsh kb80211_local" clskb0"> "L375"> 375     d_           struct2href="+7"+code=u" class="sref">u7/a>.<722L382" class="line" name="L3styp1href="+code=pos=typ1ref=+f=f">pos, &amf"16_to_cp href="+code=ifmf"16_to_cp line"e80211_ie_buildmgm> =  "L375"> 375     frref_contro"L375" class="lifrref_contro"0"> " e=iee"ss="sref">ifmshif ( 33if (ef="+cod7de=u8" class="sref">u8  342     7a href="+7ode=u8" class="sref">u8<7a> *<72ap" class="srswitch" e" name="L337">styp1href="+code=pos=typ1ref=" code=sdata" class="sref">sdata }
ifmsif (sdataifmsh->7ifmsif ( 33if (sdata =  r=ss="sref">ifmsh kb80211_local" clskb0"> "L375"> 375     f">skb,  str,"+code=data" class="sref">data<7/>}
aust/mac80211/meshrx_f">aus0"> "e211/mesh.c#L328" id="L328" clas7/ie_len" 7me="L328"> 328      7 IEEE802breake211/mesh.c#L328" id="L328" clas7f="+code=7fmsh" class="sref">ifmsh7/a>-&730"+code=ie_lecase ass="sref">ifmsif ( 33if (sdataifmsh-><7 href731T" class="sr=skb" cl"line" name="L3c#L384" id0211/rx_0gm>_actionL375" class="li{
_actionline"e80211_ie_build              struct  =  r=f">pos, &am kb80211_local" clskb0"> "L375"> 375     f">skb,  str,se80211_ie_buildrx_f">aust/mac80211/meshrx_f">aus0"> "e211/mesh.c#L328" id="L328" clas7fa>      7ata == len = len);
 33len" class="sref">len);
cap             7   370{
 390                        struct skb) < 2 +7ef="net/m7c80211/mesh.c#L336" id="7336" 73portecode=sdata" class="sref">sdata}
skb,
 321        struct ieee80211_if_mesh *ifmsh = &local =  338       7if (<73L278"211/mesh.c#L328" id="L328" clas7f="+code=7kb" class="sref">skb7 <740"+code=ie_lend" e" name="L337">ifmsh->preqdqueue_f">skb, "+code=ieee=iee211/mesh.c#L328" id="L328" clas7fmsh" cla7                 return 7data<7fa>      7=data" class="sref">data7/a>, 74="+code=pos" class="sssssssse" name="L337">ifmsh->"+ct_preq/a>        ifmsh->0shcfgL375" class="liifmsdot11M">dHWMPpreqMinIs="sv="net/mac80211/medot11M">dHWMPpreqMinIs="sv="0"> c"" class="sref">skb) < 2 +7ef="net/m7c80211/mesh.c#L342" id="7342" 74ef="+code=sbaclass="sass="sref">ifmsf="+_pef=_start_discover 33ass="sref">sband->tect_and_clear_bid="L383" class="tect_and_clear_bidline"e80211_ie_build6WORK_GROW_MPATH_TABLE="L383" class="6WORK_GROW_MPATH_TABLE str,se=ieee80211_ie_build/a> < ifmshwrkq_flag        skb) < 2 +7eifmsh" c7="net/mac80211/mesh.c#L375" id74="+code=ie_len" classass="sref">ifmsf="+_mref=_table_grow/mac80211/mesh.f="+_mref=_table_growline""e211/mesh.c#L328" id="L328" clas7ef="net/m7f="net/mac80211/mesh.c#L746" i74"L356sdata" class="sref">sdata-&7f>}
sk_buf7 74ref="+code=band" e" name="L337">tect_and_clear_bid="L383" class="tect_and_clear_bidline"e80211_ie_build6WORK_GROW_MPP_TABLE="L383" class="6WORK_GROW_MPP_TABLE str,se=ieee80211_ie_build/a> < ifmshwrkq_flag        skb) < 2 +7e"line" n7ieee80211_sub_if_dataIEEE802ass="sref">ifmsf="+_mrp_table_grow/mac80211/mesh.f="+_mrp_table_growline""e211/mesh.c#L328" id="L328" clas7>)
data<7>msh" cla7class="sref">sdata-&7t;tect_and_clear_bid="L383" class="tect_and_clear_bidline"e80211_ie_build6WORK_HOUSEKEEPING="L383" class="6WORK_HOUSEKEEPING="+code=ieee80211_ie_build/a> < ifmshwrkq_flag        skb) < 2 +7>a>      7e80211_supported_bandsband->f="net/m7+code=u8" class="sref">u7 75ass="line" name="L342"> 342     7>c#L333" 7f="net/mac80211/mesh.c#L753" i75"> 333   nd" e" name="L337">tect_and_clear_bid="L383" class="tect_and_clear_bidline"e80211_ie_build6WORK_ROOTname="L331"> 336WORK_ROOT="+code=ieee80211_ie_build/a> < ifmshwrkq_flag        skb) < 2 +7> }
skb_tailroom(<7 href75+code=skb" class="sre                 return 7ENOMEM<7df="net/m7f="net/mac80211/mesh.c#L756" i75"L356" class=nd" e" name="L337">tect_and_clear_bid="L383" class="tect_and_clear_bidline"e80211_ie_build6WORK_DRIFT_ADJUSTname="L331"> 336WORK_DRIFT_ADJUST="+code=ieee80211_ie_build/a> < ifmshwrkq_flag        skb) < 2 +7>>}
channel-7gt;ifmsf="+_aync_adjuct_tbt> = line"e80211_ie_build              struct len);
skb_put(<7 href76href="+code=data" class="sref">data<7ke=sdata"7 impletest/mac80211/meshsh.c#L392"0211/notif<_scan_>impletesline"line" name="L370"> 370{
 392        str" class="sref">skb) < 2 +7ka>      7 361                7sdata-> 370{
 390                        struct  33ass="sref">sband-> 392   ict_for_each_entry_rculine"e80211_ie_build              struct  375     is="sfacest/mac80211/meshLs="sfacesref=r=e80211_ie_build ict392"> 392   ict str" class="sref">skb) < 2 +7kf="net/m7="net/mac80211/mesh.c#L376" id76ported" class="sr" clnd" e" name="L337">lass="linevme=isf="net/mac80211/mesh.c#L321" ivme=isf="neline"href="+code=ieee80211_if_mesh" class="sref">ieee80211_if_mesh *skb) < 2 +7a>}
ifms.c#L321" iqueue_work/mac80211/mesh.c#L384" idqueue_workline"href="+code=ieee8021 id="L375" class="line" name="L375"> 375     hw/mac80211/mesh.hw="+cr=e=ieee80211_ie_build              struct  *sband->sk_buf7 76L278" class="ss="sref">ifmshrcu_read"un idk/mac80211/mesh.rcu_read"un idkline""e211/mesh.c#L328" id="L328" clas7ss="sref"7ieee80211_sub_if_datalen);
sdata-&7sef="+cod7class="sref">sdata-&7t; 370{
 390                        struct skb) < 2 +7ssdatau7 77"> 333   f">skb,
 321        struct ieee80211_if_mesh *ifmsh = &sdatacapoper_channel-7gt;ifmshhousekeeping_tima>/mac80211/mesh.housekeeping_tima>ref=,"+code=data" class="sref">data<7s;
./mac80211/mesh.L#L384" id0211/housekeeping_tima>ref=,"+code=data" class="sref">data<7s>}
ifmsh              struct code=sk_778" id="L378" class="lin7" nam77L278"211/mesh.c#L328" id="L328" clas7 0;
ifmshaccepting_p211kst/mac80211/meshaccepting_p211ksuct tru1href="+code=postru1code=ode=sdata" class="sref">sdataifmsh->preqdid> = &local =                 return 7ifmsh->s>skb, local = ifmsh->num_gatest/mac80211/meshnum_gatesuct local =  333   ss="sref">ifmshatomic_sett/mac80211/meshatomic_setline"href="+code=ieee8021/a> < ifmshmref=st/mac80211/meshmref=s="+cr=0"e211/mesh.c#L328" id="L328" clas7a" class=7_cap" class="sref">ht_ca7.78"L374" class="line" name="L30211/rmc/init = );
ifmsh->"+ct_preq/a>        jiffiest/mac80211/meshjiffies stre211/mesh.c#L328" id="L328" clas7>;
ifmsh->next_per>/mac80211/mesh.next_per>"+coda e" name="L337">jiffiest/mac80211/meshjiffies stre211/mesh.c#L328" id="L328" clas7>>}
 327skbures whee" reating the first nameaLs="sface. *et/mac80211/mesh.c#L328" id="L328" clas7acode=sk_7f="net/mac80211/mesh.c#L788" i789L379" class="linclass="sref">banf="+_alne" ted> = &skb) < 2 +7+code=sk_7uff" class="sref">sk_buf7 79a href="+code=skb" cl ifmshf="+_pef=_tima>/mac80211/mesh.f="+_pef=_tima>ref=,"+code=data" class="sref">data<7+ef="+cod7="net/mac80211/mesh.c#L371" id79="+code=pos" class="sssss /mac80211/mesh.L#L384" id0211/pef=_tima>ref=,"+code=data" class="sref">data<7+sdata-&7t;ifmsh              struct iee79"> 333   ss="sref">ifmshsetup_tima>/mac80211/mesh.setup_tima>line"href="+code=ieee8021/a> < ifmshf="+_pef=_root_tima>/mac80211/mesh.f="+_pef=_root_tima>ref=,"+code=data" class="sref">data<7+" class=7net/mac80211/mesh.c#L2947 id="79+code=skb" class="sressss /mac80211/mesh.L#L384" id0211/pef=_root_tima>ref=,"+code=data" class="sref">data<7+);
ifmsh              struct  33iNIT_LIST_HEADline"href="+code=ieee8021/a> < ifmshpreqdqueue> = &ifms ict392"> 392   ict str"e211/mesh.c#L328" id="L328" clas7d>}
u7/a>.<79ref="+code=bass="sref">ifmsh pin" idk/init = ifmshf="+_preqdqueue_fidk/mac80211/mesh.f="+_preqdqueue_fidk str"e211/mesh.c#L328" id="L328" clas7dcode=sk_7fset" class="sref">offse7,79L278" class="ss="sref">ifmsh pin" idk/init = ifmshaync_offset_fidk/mac80211/mesh.aync_offset_fidk str"e211/mesh.c#L328" id="L328" clas8a href="+8ode=u8" class="sref">u8<8a> *<800L382len" class="sref">len);



/> The original LXR software by the n" class=http://sourceforge."sreprojects/lx>/>LXR L327unityref=, this experi7"> al version by n" class=mailto:lx>@ub_ux.no x>@ub_ux.noh" cl
/> x>.ub_ux.no kindly hosted by n" class=http://www.redpill-ub_pro.no Redpill Lb_pro ASref=, provider of Lb_ux consulting and operations services since 1995.