Merge branch 'for-arm' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal...
[cascardo/linux.git] / net / mac80211 / mesh.c
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
20 int mesh_allocated;
21 static struct kmem_cache *rm_cache;
22
23 #ifdef CONFIG_MAC80211_MESH
24 bool 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
30 bool mesh_action_is_path_sel(struct ieee80211_mgmt *mgmt)
31 { return false; }
32 #endif
33
34 void 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
42 void ieee80211s_stop(void)
43 {
44         mesh_pathtbl_unregister();
45         kmem_cache_destroy(rm_cache);
46 }
47
48 static 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  */
73 bool 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_HT20 &&
113             sta_channel_type > NL80211_CHAN_HT20 &&
114             local->_oper_channel_type != sta_channel_type)
115                 goto mismatch;
116
117         return true;
118 mismatch:
119         return false;
120 }
121
122 /**
123  * mesh_peer_accepts_plinks - check if an mp is willing to establish peer links
124  *
125  * @ie: information elements of a management frame from the mesh peer
126  */
127 bool mesh_peer_accepts_plinks(struct ieee802_11_elems *ie)
128 {
129         return (ie->mesh_config->meshconf_cap &
130             MESHCONF_CAPAB_ACCEPT_PLINKS) != 0;
131 }
132
133 /**
134  * mesh_accept_plinks_update: update accepting_plink in local mesh beacons
135  *
136  * @sdata: mesh interface in which mesh beacons are going to be updated
137  */
138 void mesh_accept_plinks_update(struct ieee80211_sub_if_data *sdata)
139 {
140         bool free_plinks;
141
142         /* In case mesh_plink_free_count > 0 and mesh_plinktbl_capacity == 0,
143          * the mesh interface might be able to establish plinks with peers that
144          * are already on the table but are not on PLINK_ESTAB state. However,
145          * in general the mesh interface is not accepting peer link requests
146          * from new peers, and that must be reflected in the beacon
147          */
148         free_plinks = mesh_plink_availables(sdata);
149
150         if (free_plinks != sdata->u.mesh.accepting_plinks)
151                 ieee80211_mesh_housekeeping_timer((unsigned long) sdata);
152 }
153
154 int mesh_rmc_init(struct ieee80211_sub_if_data *sdata)
155 {
156         int i;
157
158         sdata->u.mesh.rmc = kmalloc(sizeof(struct mesh_rmc), GFP_KERNEL);
159         if (!sdata->u.mesh.rmc)
160                 return -ENOMEM;
161         sdata->u.mesh.rmc->idx_mask = RMC_BUCKETS - 1;
162         for (i = 0; i < RMC_BUCKETS; i++)
163                 INIT_LIST_HEAD(&sdata->u.mesh.rmc->bucket[i].list);
164         return 0;
165 }
166
167 void mesh_rmc_free(struct ieee80211_sub_if_data *sdata)
168 {
169         struct mesh_rmc *rmc = sdata->u.mesh.rmc;
170         struct rmc_entry *p, *n;
171         int i;
172
173         if (!sdata->u.mesh.rmc)
174                 return;
175
176         for (i = 0; i < RMC_BUCKETS; i++)
177                 list_for_each_entry_safe(p, n, &rmc->bucket[i].list, list) {
178                         list_del(&p->list);
179                         kmem_cache_free(rm_cache, p);
180                 }
181
182         kfree(rmc);
183         sdata->u.mesh.rmc = NULL;
184 }
185
186 /**
187  * mesh_rmc_check - Check frame in recent multicast cache and add if absent.
188  *
189  * @sa:         source address
190  * @mesh_hdr:   mesh_header
191  *
192  * Returns: 0 if the frame is not in the cache, nonzero otherwise.
193  *
194  * Checks using the source address and the mesh sequence number if we have
195  * received this frame lately. If the frame is not in the cache, it is added to
196  * it.
197  */
198 int mesh_rmc_check(u8 *sa, struct ieee80211s_hdr *mesh_hdr,
199                    struct ieee80211_sub_if_data *sdata)
200 {
201         struct mesh_rmc *rmc = sdata->u.mesh.rmc;
202         u32 seqnum = 0;
203         int entries = 0;
204         u8 idx;
205         struct rmc_entry *p, *n;
206
207         /* Don't care about endianness since only match matters */
208         memcpy(&seqnum, &mesh_hdr->seqnum, sizeof(mesh_hdr->seqnum));
209         idx = le32_to_cpu(mesh_hdr->seqnum) & rmc->idx_mask;
210         list_for_each_entry_safe(p, n, &rmc->bucket[idx].list, list) {
211                 ++entries;
212                 if (time_after(jiffies, p->exp_time) ||
213                                 (entries == RMC_QUEUE_MAX_LEN)) {
214                         list_del(&p->list);
215                         kmem_cache_free(rm_cache, p);
216                         --entries;
217                 } else if ((seqnum == p->seqnum) &&
218                            (ether_addr_equal(sa, p->sa)))
219                         return -1;
220         }
221
222         p = kmem_cache_alloc(rm_cache, GFP_ATOMIC);
223         if (!p)
224                 return 0;
225
226         p->seqnum = seqnum;
227         p->exp_time = jiffies + RMC_TIMEOUT;
228         memcpy(p->sa, sa, ETH_ALEN);
229         list_add(&p->list, &rmc->bucket[idx].list);
230         return 0;
231 }
232
233 int
234 mesh_add_meshconf_ie(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata)
235 {
236         struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
237         u8 *pos, neighbors;
238         u8 meshconf_len = sizeof(struct ieee80211_meshconf_ie);
239
240         if (skb_tailroom(skb) < 2 + meshconf_len)
241                 return -ENOMEM;
242
243         pos = skb_put(skb, 2 + meshconf_len);
244         *pos++ = WLAN_EID_MESH_CONFIG;
245         *pos++ = meshconf_len;
246
247         /* Active path selection protocol ID */
248         *pos++ = ifmsh->mesh_pp_id;
249         /* Active path selection metric ID   */
250         *pos++ = ifmsh->mesh_pm_id;
251         /* Congestion control mode identifier */
252         *pos++ = ifmsh->mesh_cc_id;
253         /* Synchronization protocol identifier */
254         *pos++ = ifmsh->mesh_sp_id;
255         /* Authentication Protocol identifier */
256         *pos++ = ifmsh->mesh_auth_id;
257         /* Mesh Formation Info - number of neighbors */
258         neighbors = atomic_read(&ifmsh->mshstats.estab_plinks);
259         /* Number of neighbor mesh STAs or 15 whichever is smaller */
260         neighbors = (neighbors > 15) ? 15 : neighbors;
261         *pos++ = neighbors << 1;
262         /* Mesh capability */
263         ifmsh->accepting_plinks = mesh_plink_availables(sdata);
264         *pos = MESHCONF_CAPAB_FORWARDING;
265         *pos |= ifmsh->accepting_plinks ?
266             MESHCONF_CAPAB_ACCEPT_PLINKS : 0x00;
267         *pos++ |= ifmsh->adjusting_tbtt ?
268             MESHCONF_CAPAB_TBTT_ADJUSTING : 0x00;
269         *pos++ = 0x00;
270
271         return 0;
272 }
273
274 int
275 mesh_add_meshid_ie(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata)
276 {
277         struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
278         u8 *pos;
279
280         if (skb_tailroom(skb) < 2 + ifmsh->mesh_id_len)
281                 return -ENOMEM;
282
283         pos = skb_put(skb, 2 + ifmsh->mesh_id_len);
284         *pos++ = WLAN_EID_MESH_ID;
285         *pos++ = ifmsh->mesh_id_len;
286         if (ifmsh->mesh_id_len)
287                 memcpy(pos, ifmsh->mesh_id, ifmsh->mesh_id_len);
288
289         return 0;
290 }
291
292 int
293 mesh_add_vendor_ies(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata)
294 {
295         struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
296         u8 offset, len;
297         const u8 *data;
298
299         if (!ifmsh->ie || !ifmsh->ie_len)
300                 return 0;
301
302         /* fast-forward to vendor IEs */
303         offset = ieee80211_ie_split_vendor(ifmsh->ie, ifmsh->ie_len, 0);
304
305         if (offset) {
306                 len = ifmsh->ie_len - offset;
307                 data = ifmsh->ie + offset;
308                 if (skb_tailroom(skb) < len)
309                         return -ENOMEM;
310                 memcpy(skb_put(skb, len), data, len);
311         }
312
313         return 0;
314 }
315
316 int
317 mesh_add_rsn_ie(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata)
318 {
319         struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
320         u8 len = 0;
321         const u8 *data;
322
323         if (!ifmsh->ie || !ifmsh->ie_len)
324                 return 0;
325
326         /* find RSN IE */
327         data = ifmsh->ie;
328         while (data < ifmsh->ie + ifmsh->ie_len) {
329                 if (*data == WLAN_EID_RSN) {
330                         len = data[1] + 2;
331                         break;
332                 }
333                 data++;
334         }
335
336         if (len) {
337                 if (skb_tailroom(skb) < len)
338                         return -ENOMEM;
339                 memcpy(skb_put(skb, len), data, len);
340         }
341
342         return 0;
343 }
344
345 int mesh_add_ds_params_ie(struct sk_buff *skb,
346                           struct ieee80211_sub_if_data *sdata)
347 {
348         struct ieee80211_local *local = sdata->local;
349         struct ieee80211_supported_band *sband;
350         u8 *pos;
351
352         if (skb_tailroom(skb) < 3)
353                 return -ENOMEM;
354
355         sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
356         if (sband->band == IEEE80211_BAND_2GHZ) {
357                 pos = skb_put(skb, 2 + 1);
358                 *pos++ = WLAN_EID_DS_PARAMS;
359                 *pos++ = 1;
360                 *pos++ = ieee80211_frequency_to_channel(local->hw.conf.channel->center_freq);
361         }
362
363         return 0;
364 }
365
366 int mesh_add_ht_cap_ie(struct sk_buff *skb,
367                        struct ieee80211_sub_if_data *sdata)
368 {
369         struct ieee80211_local *local = sdata->local;
370         struct ieee80211_supported_band *sband;
371         u8 *pos;
372
373         sband = local->hw.wiphy->bands[local->oper_channel->band];
374         if (!sband->ht_cap.ht_supported ||
375             local->_oper_channel_type == NL80211_CHAN_NO_HT)
376                 return 0;
377
378         if (skb_tailroom(skb) < 2 + sizeof(struct ieee80211_ht_cap))
379                 return -ENOMEM;
380
381         pos = skb_put(skb, 2 + sizeof(struct ieee80211_ht_cap));
382         ieee80211_ie_build_ht_cap(pos, &sband->ht_cap, sband->ht_cap.cap);
383
384         return 0;
385 }
386
387 int mesh_add_ht_oper_ie(struct sk_buff *skb,
388                         struct ieee80211_sub_if_data *sdata)
389 {
390         struct ieee80211_local *local = sdata->local;
391         struct ieee80211_channel *channel = local->oper_channel;
392         enum nl80211_channel_type channel_type = local->_oper_channel_type;
393         struct ieee80211_supported_band *sband =
394                                 local->hw.wiphy->bands[channel->band];
395         struct ieee80211_sta_ht_cap *ht_cap = &sband->ht_cap;
396         u8 *pos;
397
398         if (!ht_cap->ht_supported || channel_type == NL80211_CHAN_NO_HT)
399                 return 0;
400
401         if (skb_tailroom(skb) < 2 + sizeof(struct ieee80211_ht_operation))
402                 return -ENOMEM;
403
404         pos = skb_put(skb, 2 + sizeof(struct ieee80211_ht_operation));
405         ieee80211_ie_build_ht_oper(pos, ht_cap, channel, channel_type,
406                                    sdata->vif.bss_conf.ht_operation_mode);
407
408         return 0;
409 }
410 static void ieee80211_mesh_path_timer(unsigned long data)
411 {
412         struct ieee80211_sub_if_data *sdata =
413                 (struct ieee80211_sub_if_data *) data;
414         struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
415         struct ieee80211_local *local = sdata->local;
416
417         if (local->quiescing) {
418                 set_bit(TMR_RUNNING_MP, &ifmsh->timers_running);
419                 return;
420         }
421
422         ieee80211_queue_work(&local->hw, &sdata->work);
423 }
424
425 static void ieee80211_mesh_path_root_timer(unsigned long data)
426 {
427         struct ieee80211_sub_if_data *sdata =
428                 (struct ieee80211_sub_if_data *) data;
429         struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
430         struct ieee80211_local *local = sdata->local;
431
432         set_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags);
433
434         if (local->quiescing) {
435                 set_bit(TMR_RUNNING_MPR, &ifmsh->timers_running);
436                 return;
437         }
438
439         ieee80211_queue_work(&local->hw, &sdata->work);
440 }
441
442 void ieee80211_mesh_root_setup(struct ieee80211_if_mesh *ifmsh)
443 {
444         if (ifmsh->mshcfg.dot11MeshHWMPRootMode)
445                 set_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags);
446         else {
447                 clear_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags);
448                 /* stop running timer */
449                 del_timer_sync(&ifmsh->mesh_path_root_timer);
450         }
451 }
452
453 /**
454  * ieee80211_fill_mesh_addresses - fill addresses of a locally originated mesh frame
455  * @hdr:        802.11 frame header
456  * @fc:         frame control field
457  * @meshda:     destination address in the mesh
458  * @meshsa:     source address address in the mesh.  Same as TA, as frame is
459  *              locally originated.
460  *
461  * Return the length of the 802.11 (does not include a mesh control header)
462  */
463 int ieee80211_fill_mesh_addresses(struct ieee80211_hdr *hdr, __le16 *fc,
464                                   const u8 *meshda, const u8 *meshsa)
465 {
466         if (is_multicast_ether_addr(meshda)) {
467                 *fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS);
468                 /* DA TA SA */
469                 memcpy(hdr->addr1, meshda, ETH_ALEN);
470                 memcpy(hdr->addr2, meshsa, ETH_ALEN);
471                 memcpy(hdr->addr3, meshsa, ETH_ALEN);
472                 return 24;
473         } else {
474                 *fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS);
475                 /* RA TA DA SA */
476                 memset(hdr->addr1, 0, ETH_ALEN);   /* RA is resolved later */
477                 memcpy(hdr->addr2, meshsa, ETH_ALEN);
478                 memcpy(hdr->addr3, meshda, ETH_ALEN);
479                 memcpy(hdr->addr4, meshsa, ETH_ALEN);
480                 return 30;
481         }
482 }
483
484 /**
485  * ieee80211_new_mesh_header - create a new mesh header
486  * @meshhdr:    uninitialized mesh header
487  * @sdata:      mesh interface to be used
488  * @addr4or5:   1st address in the ae header, which may correspond to address 4
489  *              (if addr6 is NULL) or address 5 (if addr6 is present). It may
490  *              be NULL.
491  * @addr6:      2nd address in the ae header, which corresponds to addr6 of the
492  *              mesh frame
493  *
494  * Return the header length.
495  */
496 int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr,
497                 struct ieee80211_sub_if_data *sdata, char *addr4or5,
498                 char *addr6)
499 {
500         int aelen = 0;
501         BUG_ON(!addr4or5 && addr6);
502         memset(meshhdr, 0, sizeof(*meshhdr));
503         meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL;
504         put_unaligned(cpu_to_le32(sdata->u.mesh.mesh_seqnum), &meshhdr->seqnum);
505         sdata->u.mesh.mesh_seqnum++;
506         if (addr4or5 && !addr6) {
507                 meshhdr->flags |= MESH_FLAGS_AE_A4;
508                 aelen += ETH_ALEN;
509                 memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN);
510         } else if (addr4or5 && addr6) {
511                 meshhdr->flags |= MESH_FLAGS_AE_A5_A6;
512                 aelen += 2 * ETH_ALEN;
513                 memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN);
514                 memcpy(meshhdr->eaddr2, addr6, ETH_ALEN);
515         }
516         return 6 + aelen;
517 }
518
519 static void ieee80211_mesh_housekeeping(struct ieee80211_sub_if_data *sdata,
520                            struct ieee80211_if_mesh *ifmsh)
521 {
522         bool free_plinks;
523
524 #ifdef CONFIG_MAC80211_VERBOSE_DEBUG
525         printk(KERN_DEBUG "%s: running mesh housekeeping\n",
526                sdata->name);
527 #endif
528
529         ieee80211_sta_expire(sdata, IEEE80211_MESH_PEER_INACTIVITY_LIMIT);
530         mesh_path_expire(sdata);
531
532         free_plinks = mesh_plink_availables(sdata);
533         if (free_plinks != sdata->u.mesh.accepting_plinks)
534                 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON);
535
536         mod_timer(&ifmsh->housekeeping_timer,
537                   round_jiffies(jiffies + IEEE80211_MESH_HOUSEKEEPING_INTERVAL));
538 }
539
540 static void ieee80211_mesh_rootpath(struct ieee80211_sub_if_data *sdata)
541 {
542         struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
543
544         mesh_path_tx_root_frame(sdata);
545         mod_timer(&ifmsh->mesh_path_root_timer,
546                   round_jiffies(TU_TO_EXP_TIME(
547                                   ifmsh->mshcfg.dot11MeshHWMPRannInterval)));
548 }
549
550 #ifdef CONFIG_PM
551 void ieee80211_mesh_quiesce(struct ieee80211_sub_if_data *sdata)
552 {
553         struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
554
555         /* use atomic bitops in case all timers fire at the same time */
556
557         if (del_timer_sync(&ifmsh->housekeeping_timer))
558                 set_bit(TMR_RUNNING_HK, &ifmsh->timers_running);
559         if (del_timer_sync(&ifmsh->mesh_path_timer))
560                 set_bit(TMR_RUNNING_MP, &ifmsh->timers_running);
561         if (del_timer_sync(&ifmsh->mesh_path_root_timer))
562                 set_bit(TMR_RUNNING_MPR, &ifmsh->timers_running);
563 }
564
565 void ieee80211_mesh_restart(struct ieee80211_sub_if_data *sdata)
566 {
567         struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
568
569         if (test_and_clear_bit(TMR_RUNNING_HK, &ifmsh->timers_running))
570                 add_timer(&ifmsh->housekeeping_timer);
571         if (test_and_clear_bit(TMR_RUNNING_MP, &ifmsh->timers_running))
572                 add_timer(&ifmsh->mesh_path_timer);
573         if (test_and_clear_bit(TMR_RUNNING_MPR, &ifmsh->timers_running))
574                 add_timer(&ifmsh->mesh_path_root_timer);
575         ieee80211_mesh_root_setup(ifmsh);
576 }
577 #endif
578
579 void ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata)
580 {
581         struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
582         struct ieee80211_local *local = sdata->local;
583
584         local->fif_other_bss++;
585         /* mesh ifaces must set allmulti to forward mcast traffic */
586         atomic_inc(&local->iff_allmultis);
587         ieee80211_configure_filter(local);
588
589         ifmsh->mesh_cc_id = 0;  /* Disabled */
590         ifmsh->mesh_auth_id = 0;        /* Disabled */
591         /* register sync ops from extensible synchronization framework */
592         ifmsh->sync_ops = ieee80211_mesh_sync_ops_get(ifmsh->mesh_sp_id);
593         ifmsh->adjusting_tbtt = false;
594         ifmsh->sync_offset_clockdrift_max = 0;
595         set_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags);
596         ieee80211_mesh_root_setup(ifmsh);
597         ieee80211_queue_work(&local->hw, &sdata->work);
598         sdata->vif.bss_conf.ht_operation_mode =
599                                 ifmsh->mshcfg.ht_opmode;
600         sdata->vif.bss_conf.beacon_int = MESH_DEFAULT_BEACON_INTERVAL;
601         sdata->vif.bss_conf.basic_rates =
602                 ieee80211_mandatory_rates(sdata->local,
603                                           sdata->local->hw.conf.channel->band);
604         ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON |
605                                                 BSS_CHANGED_BEACON_ENABLED |
606                                                 BSS_CHANGED_HT |
607                                                 BSS_CHANGED_BASIC_RATES |
608                                                 BSS_CHANGED_BEACON_INT);
609 }
610
611 void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata)
612 {
613         struct ieee80211_local *local = sdata->local;
614         struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
615
616         ifmsh->mesh_id_len = 0;
617         ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
618         sta_info_flush(local, NULL);
619
620         del_timer_sync(&sdata->u.mesh.housekeeping_timer);
621         del_timer_sync(&sdata->u.mesh.mesh_path_root_timer);
622         /*
623          * If the timer fired while we waited for it, it will have
624          * requeued the work. Now the work will be running again
625          * but will not rearm the timer again because it checks
626          * whether the interface is running, which, at this point,
627          * it no longer is.
628          */
629         cancel_work_sync(&sdata->work);
630
631         local->fif_other_bss--;
632         atomic_dec(&local->iff_allmultis);
633         ieee80211_configure_filter(local);
634 }
635
636 static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata,
637                                         u16 stype,
638                                         struct ieee80211_mgmt *mgmt,
639                                         size_t len,
640                                         struct ieee80211_rx_status *rx_status)
641 {
642         struct ieee80211_local *local = sdata->local;
643         struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
644         struct ieee802_11_elems elems;
645         struct ieee80211_channel *channel;
646         size_t baselen;
647         int freq;
648         enum ieee80211_band band = rx_status->band;
649
650         /* ignore ProbeResp to foreign address */
651         if (stype == IEEE80211_STYPE_PROBE_RESP &&
652             !ether_addr_equal(mgmt->da, sdata->vif.addr))
653                 return;
654
655         baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt;
656         if (baselen > len)
657                 return;
658
659         ieee802_11_parse_elems(mgmt->u.probe_resp.variable, len - baselen,
660                                &elems);
661
662         /* ignore beacons from secure mesh peers if our security is off */
663         if (elems.rsn_len && sdata->u.mesh.security == IEEE80211_MESH_SEC_NONE)
664                 return;
665
666         if (elems.ds_params && elems.ds_params_len == 1)
667                 freq = ieee80211_channel_to_frequency(elems.ds_params[0], band);
668         else
669                 freq = rx_status->freq;
670
671         channel = ieee80211_get_channel(local->hw.wiphy, freq);
672
673         if (!channel || channel->flags & IEEE80211_CHAN_DISABLED)
674                 return;
675
676         if (elems.mesh_id && elems.mesh_config &&
677             mesh_matches_local(sdata, &elems))
678                 mesh_neighbour_update(sdata, mgmt->sa, &elems);
679
680         if (ifmsh->sync_ops)
681                 ifmsh->sync_ops->rx_bcn_presp(sdata,
682                         stype, mgmt, &elems, rx_status);
683 }
684
685 static void ieee80211_mesh_rx_mgmt_action(struct ieee80211_sub_if_data *sdata,
686                                           struct ieee80211_mgmt *mgmt,
687                                           size_t len,
688                                           struct ieee80211_rx_status *rx_status)
689 {
690         switch (mgmt->u.action.category) {
691         case WLAN_CATEGORY_SELF_PROTECTED:
692                 switch (mgmt->u.action.u.self_prot.action_code) {
693                 case WLAN_SP_MESH_PEERING_OPEN:
694                 case WLAN_SP_MESH_PEERING_CLOSE:
695                 case WLAN_SP_MESH_PEERING_CONFIRM:
696                         mesh_rx_plink_frame(sdata, mgmt, len, rx_status);
697                         break;
698                 }
699                 break;
700         case WLAN_CATEGORY_MESH_ACTION:
701                 if (mesh_action_is_path_sel(mgmt))
702                         mesh_rx_path_sel_frame(sdata, mgmt, len);
703                 break;
704         }
705 }
706
707 void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
708                                    struct sk_buff *skb)
709 {
710         struct ieee80211_rx_status *rx_status;
711         struct ieee80211_mgmt *mgmt;
712         u16 stype;
713
714         rx_status = IEEE80211_SKB_RXCB(skb);
715         mgmt = (struct ieee80211_mgmt *) skb->data;
716         stype = le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE;
717
718         switch (stype) {
719         case IEEE80211_STYPE_PROBE_RESP:
720         case IEEE80211_STYPE_BEACON:
721                 ieee80211_mesh_rx_bcn_presp(sdata, stype, mgmt, skb->len,
722                                             rx_status);
723                 break;
724         case IEEE80211_STYPE_ACTION:
725                 ieee80211_mesh_rx_mgmt_action(sdata, mgmt, skb->len, rx_status);
726                 break;
727         }
728 }
729
730 void ieee80211_mesh_work(struct ieee80211_sub_if_data *sdata)
731 {
732         struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
733
734         if (ifmsh->preq_queue_len &&
735             time_after(jiffies,
736                        ifmsh->last_preq + msecs_to_jiffies(ifmsh->mshcfg.dot11MeshHWMPpreqMinInterval)))
737                 mesh_path_start_discovery(sdata);
738
739         if (test_and_clear_bit(MESH_WORK_GROW_MPATH_TABLE, &ifmsh->wrkq_flags))
740                 mesh_mpath_table_grow();
741
742         if (test_and_clear_bit(MESH_WORK_GROW_MPP_TABLE, &ifmsh->wrkq_flags))
743                 mesh_mpp_table_grow();
744
745         if (test_and_clear_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags))
746                 ieee80211_mesh_housekeeping(sdata, ifmsh);
747
748         if (test_and_clear_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags))
749                 ieee80211_mesh_rootpath(sdata);
750
751         if (test_and_clear_bit(MESH_WORK_DRIFT_ADJUST, &ifmsh->wrkq_flags))
752                 mesh_sync_adjust_tbtt(sdata);
753 }
754
755 void ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local)
756 {
757         struct ieee80211_sub_if_data *sdata;
758
759         rcu_read_lock();
760         list_for_each_entry_rcu(sdata, &local->interfaces, list)
761                 if (ieee80211_vif_is_mesh(&sdata->vif))
762                         ieee80211_queue_work(&local->hw, &sdata->work);
763         rcu_read_unlock();
764 }
765
766 void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata)
767 {
768         struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
769
770         setup_timer(&ifmsh->housekeeping_timer,
771                     ieee80211_mesh_housekeeping_timer,
772                     (unsigned long) sdata);
773
774         ifmsh->accepting_plinks = true;
775         ifmsh->preq_id = 0;
776         ifmsh->sn = 0;
777         ifmsh->num_gates = 0;
778         atomic_set(&ifmsh->mpaths, 0);
779         mesh_rmc_init(sdata);
780         ifmsh->last_preq = jiffies;
781         ifmsh->next_perr = jiffies;
782         /* Allocate all mesh structures when creating the first mesh interface. */
783         if (!mesh_allocated)
784                 ieee80211s_init();
785         setup_timer(&ifmsh->mesh_path_timer,
786                     ieee80211_mesh_path_timer,
787                     (unsigned long) sdata);
788         setup_timer(&ifmsh->mesh_path_root_timer,
789                     ieee80211_mesh_path_root_timer,
790                     (unsigned long) sdata);
791         INIT_LIST_HEAD(&ifmsh->preq_queue.list);
792         spin_lock_init(&ifmsh->mesh_preq_queue_lock);
793         spin_lock_init(&ifmsh->sync_offset_lock);
794 }