Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mesh.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2008, 2009 open80211s Ltd.
3  * Authors: Luis Carlos Cobo <[email protected]>
4  * Javier Cardona <[email protected]>
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 
21 static struct kmem_cache *rm_cache;
22 
23 #ifdef CONFIG_MAC80211_MESH
25 {
26  return (mgmt->u.action.u.mesh_action.action_code ==
28 }
29 #else
31 { return false; }
32 #endif
33 
34 void ieee80211s_init(void)
35 {
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 {
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 
55 
56  if (local->quiescing) {
58  return;
59  }
60 
61  ieee80211_queue_work(&local->hw, &sdata->work);
62 }
63 
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 =
109 
110  /* Disallow HT40+/- mismatch */
111  if (ie->ht_operation &&
112  (sdata->vif.bss_conf.channel_type == NL80211_CHAN_HT40MINUS ||
113  sdata->vif.bss_conf.channel_type == NL80211_CHAN_HT40PLUS) &&
114  (sta_channel_type == NL80211_CHAN_HT40MINUS ||
115  sta_channel_type == NL80211_CHAN_HT40PLUS) &&
116  sdata->vif.bss_conf.channel_type != sta_channel_type)
117  goto mismatch;
118 
119  return true;
120 mismatch:
121  return false;
122 }
123 
130 {
131  return (ie->mesh_config->meshconf_cap &
133 }
134 
143 {
144  bool free_plinks;
145  u32 changed = 0;
146 
147  /* In case mesh_plink_free_count > 0 and mesh_plinktbl_capacity == 0,
148  * the mesh interface might be able to establish plinks with peers that
149  * are already on the table but are not on PLINK_ESTAB state. However,
150  * in general the mesh interface is not accepting peer link requests
151  * from new peers, and that must be reflected in the beacon
152  */
153  free_plinks = mesh_plink_availables(sdata);
154 
155  if (free_plinks != sdata->u.mesh.accepting_plinks) {
156  sdata->u.mesh.accepting_plinks = free_plinks;
157  changed = BSS_CHANGED_BEACON;
158  }
159 
160  return changed;
161 }
162 
164 {
165  int i;
166 
167  sdata->u.mesh.rmc = kmalloc(sizeof(struct mesh_rmc), GFP_KERNEL);
168  if (!sdata->u.mesh.rmc)
169  return -ENOMEM;
170  sdata->u.mesh.rmc->idx_mask = RMC_BUCKETS - 1;
171  for (i = 0; i < RMC_BUCKETS; i++)
172  INIT_LIST_HEAD(&sdata->u.mesh.rmc->bucket[i].list);
173  return 0;
174 }
175 
177 {
178  struct mesh_rmc *rmc = sdata->u.mesh.rmc;
179  struct rmc_entry *p, *n;
180  int i;
181 
182  if (!sdata->u.mesh.rmc)
183  return;
184 
185  for (i = 0; i < RMC_BUCKETS; i++)
186  list_for_each_entry_safe(p, n, &rmc->bucket[i].list, list) {
187  list_del(&p->list);
188  kmem_cache_free(rm_cache, p);
189  }
190 
191  kfree(rmc);
192  sdata->u.mesh.rmc = NULL;
193 }
194 
207 int mesh_rmc_check(u8 *sa, struct ieee80211s_hdr *mesh_hdr,
208  struct ieee80211_sub_if_data *sdata)
209 {
210  struct mesh_rmc *rmc = sdata->u.mesh.rmc;
211  u32 seqnum = 0;
212  int entries = 0;
213  u8 idx;
214  struct rmc_entry *p, *n;
215 
216  /* Don't care about endianness since only match matters */
217  memcpy(&seqnum, &mesh_hdr->seqnum, sizeof(mesh_hdr->seqnum));
218  idx = le32_to_cpu(mesh_hdr->seqnum) & rmc->idx_mask;
219  list_for_each_entry_safe(p, n, &rmc->bucket[idx].list, list) {
220  ++entries;
221  if (time_after(jiffies, p->exp_time) ||
222  (entries == RMC_QUEUE_MAX_LEN)) {
223  list_del(&p->list);
224  kmem_cache_free(rm_cache, p);
225  --entries;
226  } else if ((seqnum == p->seqnum) &&
227  (ether_addr_equal(sa, p->sa)))
228  return -1;
229  }
230 
231  p = kmem_cache_alloc(rm_cache, GFP_ATOMIC);
232  if (!p)
233  return 0;
234 
235  p->seqnum = seqnum;
237  memcpy(p->sa, sa, ETH_ALEN);
238  list_add(&p->list, &rmc->bucket[idx].list);
239  return 0;
240 }
241 
242 int
244 {
245  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
246  u8 *pos, neighbors;
247  u8 meshconf_len = sizeof(struct ieee80211_meshconf_ie);
248 
249  if (skb_tailroom(skb) < 2 + meshconf_len)
250  return -ENOMEM;
251 
252  pos = skb_put(skb, 2 + meshconf_len);
253  *pos++ = WLAN_EID_MESH_CONFIG;
254  *pos++ = meshconf_len;
255 
256  /* Active path selection protocol ID */
257  *pos++ = ifmsh->mesh_pp_id;
258  /* Active path selection metric ID */
259  *pos++ = ifmsh->mesh_pm_id;
260  /* Congestion control mode identifier */
261  *pos++ = ifmsh->mesh_cc_id;
262  /* Synchronization protocol identifier */
263  *pos++ = ifmsh->mesh_sp_id;
264  /* Authentication Protocol identifier */
265  *pos++ = ifmsh->mesh_auth_id;
266  /* Mesh Formation Info - number of neighbors */
267  neighbors = atomic_read(&ifmsh->mshstats.estab_plinks);
268  /* Number of neighbor mesh STAs or 15 whichever is smaller */
269  neighbors = (neighbors > 15) ? 15 : neighbors;
270  *pos++ = neighbors << 1;
271  /* Mesh capability */
273  *pos |= ifmsh->accepting_plinks ?
275  *pos++ |= ifmsh->adjusting_tbtt ?
277  *pos++ = 0x00;
278 
279  return 0;
280 }
281 
282 int
284 {
285  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
286  u8 *pos;
287 
288  if (skb_tailroom(skb) < 2 + ifmsh->mesh_id_len)
289  return -ENOMEM;
290 
291  pos = skb_put(skb, 2 + ifmsh->mesh_id_len);
292  *pos++ = WLAN_EID_MESH_ID;
293  *pos++ = ifmsh->mesh_id_len;
294  if (ifmsh->mesh_id_len)
295  memcpy(pos, ifmsh->mesh_id, ifmsh->mesh_id_len);
296 
297  return 0;
298 }
299 
300 int
302 {
303  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
304  u8 offset, len;
305  const u8 *data;
306 
307  if (!ifmsh->ie || !ifmsh->ie_len)
308  return 0;
309 
310  /* fast-forward to vendor IEs */
311  offset = ieee80211_ie_split_vendor(ifmsh->ie, ifmsh->ie_len, 0);
312 
313  if (offset) {
314  len = ifmsh->ie_len - offset;
315  data = ifmsh->ie + offset;
316  if (skb_tailroom(skb) < len)
317  return -ENOMEM;
318  memcpy(skb_put(skb, len), data, len);
319  }
320 
321  return 0;
322 }
323 
324 int
326 {
327  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
328  u8 len = 0;
329  const u8 *data;
330 
331  if (!ifmsh->ie || !ifmsh->ie_len)
332  return 0;
333 
334  /* find RSN IE */
335  data = ifmsh->ie;
336  while (data < ifmsh->ie + ifmsh->ie_len) {
337  if (*data == WLAN_EID_RSN) {
338  len = data[1] + 2;
339  break;
340  }
341  data++;
342  }
343 
344  if (len) {
345  if (skb_tailroom(skb) < len)
346  return -ENOMEM;
347  memcpy(skb_put(skb, len), data, len);
348  }
349 
350  return 0;
351 }
352 
354  struct ieee80211_sub_if_data *sdata)
355 {
356  struct ieee80211_local *local = sdata->local;
357  struct ieee80211_supported_band *sband;
358  struct ieee80211_channel *chan = local->oper_channel;
359  u8 *pos;
360 
361  if (skb_tailroom(skb) < 3)
362  return -ENOMEM;
363 
364  sband = local->hw.wiphy->bands[chan->band];
365  if (sband->band == IEEE80211_BAND_2GHZ) {
366  pos = skb_put(skb, 2 + 1);
367  *pos++ = WLAN_EID_DS_PARAMS;
368  *pos++ = 1;
370  }
371 
372  return 0;
373 }
374 
376  struct ieee80211_sub_if_data *sdata)
377 {
378  struct ieee80211_local *local = sdata->local;
379  struct ieee80211_supported_band *sband;
380  u8 *pos;
381 
382  sband = local->hw.wiphy->bands[local->oper_channel->band];
383  if (!sband->ht_cap.ht_supported ||
384  sdata->vif.bss_conf.channel_type == NL80211_CHAN_NO_HT)
385  return 0;
386 
387  if (skb_tailroom(skb) < 2 + sizeof(struct ieee80211_ht_cap))
388  return -ENOMEM;
389 
390  pos = skb_put(skb, 2 + sizeof(struct ieee80211_ht_cap));
391  ieee80211_ie_build_ht_cap(pos, &sband->ht_cap, sband->ht_cap.cap);
392 
393  return 0;
394 }
395 
397  struct ieee80211_sub_if_data *sdata)
398 {
399  struct ieee80211_local *local = sdata->local;
400  struct ieee80211_channel *channel = local->oper_channel;
402  sdata->vif.bss_conf.channel_type;
403  struct ieee80211_supported_band *sband =
404  local->hw.wiphy->bands[channel->band];
405  struct ieee80211_sta_ht_cap *ht_cap = &sband->ht_cap;
406  u8 *pos;
407 
408  if (!ht_cap->ht_supported || channel_type == NL80211_CHAN_NO_HT)
409  return 0;
410 
411  if (skb_tailroom(skb) < 2 + sizeof(struct ieee80211_ht_operation))
412  return -ENOMEM;
413 
414  pos = skb_put(skb, 2 + sizeof(struct ieee80211_ht_operation));
415  ieee80211_ie_build_ht_oper(pos, ht_cap, channel, channel_type,
416  sdata->vif.bss_conf.ht_operation_mode);
417 
418  return 0;
419 }
420 static void ieee80211_mesh_path_timer(unsigned long data)
421 {
422  struct ieee80211_sub_if_data *sdata =
423  (struct ieee80211_sub_if_data *) data;
424  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
425  struct ieee80211_local *local = sdata->local;
426 
427  if (local->quiescing) {
429  return;
430  }
431 
432  ieee80211_queue_work(&local->hw, &sdata->work);
433 }
434 
435 static void ieee80211_mesh_path_root_timer(unsigned long data)
436 {
437  struct ieee80211_sub_if_data *sdata =
438  (struct ieee80211_sub_if_data *) data;
439  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
440  struct ieee80211_local *local = sdata->local;
441 
443 
444  if (local->quiescing) {
446  return;
447  }
448 
449  ieee80211_queue_work(&local->hw, &sdata->work);
450 }
451 
453 {
454  if (ifmsh->mshcfg.dot11MeshHWMPRootMode > IEEE80211_ROOTMODE_ROOT)
456  else {
458  /* stop running timer */
460  }
461 }
462 
474  const u8 *meshda, const u8 *meshsa)
475 {
476  if (is_multicast_ether_addr(meshda)) {
478  /* DA TA SA */
479  memcpy(hdr->addr1, meshda, ETH_ALEN);
480  memcpy(hdr->addr2, meshsa, ETH_ALEN);
481  memcpy(hdr->addr3, meshsa, ETH_ALEN);
482  return 24;
483  } else {
485  /* RA TA DA SA */
486  memset(hdr->addr1, 0, ETH_ALEN); /* RA is resolved later */
487  memcpy(hdr->addr2, meshsa, ETH_ALEN);
488  memcpy(hdr->addr3, meshda, ETH_ALEN);
489  memcpy(hdr->addr4, meshsa, ETH_ALEN);
490  return 30;
491  }
492 }
493 
507  struct ieee80211_sub_if_data *sdata, char *addr4or5,
508  char *addr6)
509 {
510  int aelen = 0;
511  BUG_ON(!addr4or5 && addr6);
512  memset(meshhdr, 0, sizeof(*meshhdr));
513  meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL;
514  put_unaligned(cpu_to_le32(sdata->u.mesh.mesh_seqnum), &meshhdr->seqnum);
515  sdata->u.mesh.mesh_seqnum++;
516  if (addr4or5 && !addr6) {
517  meshhdr->flags |= MESH_FLAGS_AE_A4;
518  aelen += ETH_ALEN;
519  memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN);
520  } else if (addr4or5 && addr6) {
521  meshhdr->flags |= MESH_FLAGS_AE_A5_A6;
522  aelen += 2 * ETH_ALEN;
523  memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN);
524  memcpy(meshhdr->eaddr2, addr6, ETH_ALEN);
525  }
526  return 6 + aelen;
527 }
528 
529 static void ieee80211_mesh_housekeeping(struct ieee80211_sub_if_data *sdata,
530  struct ieee80211_if_mesh *ifmsh)
531 {
532  u32 changed;
533 
535  mesh_path_expire(sdata);
536 
537  changed = mesh_accept_plinks_update(sdata);
538  ieee80211_bss_info_change_notify(sdata, changed);
539 
542 }
543 
544 static void ieee80211_mesh_rootpath(struct ieee80211_sub_if_data *sdata)
545 {
546  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
547  u32 interval;
548 
550 
551  if (ifmsh->mshcfg.dot11MeshHWMPRootMode == IEEE80211_PROACTIVE_RANN)
552  interval = ifmsh->mshcfg.dot11MeshHWMPRannInterval;
553  else
554  interval = ifmsh->mshcfg.dot11MeshHWMProotInterval;
555 
557  round_jiffies(TU_TO_EXP_TIME(interval)));
558 }
559 
560 #ifdef CONFIG_PM
561 void ieee80211_mesh_quiesce(struct ieee80211_sub_if_data *sdata)
562 {
563  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
564 
565  /* use atomic bitops in case all timers fire at the same time */
566 
567  if (del_timer_sync(&ifmsh->housekeeping_timer))
569  if (del_timer_sync(&ifmsh->mesh_path_timer))
573 }
574 
575 void ieee80211_mesh_restart(struct ieee80211_sub_if_data *sdata)
576 {
577  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
578 
580  add_timer(&ifmsh->housekeeping_timer);
582  add_timer(&ifmsh->mesh_path_timer);
586 }
587 #endif
588 
590 {
591  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
592  struct ieee80211_local *local = sdata->local;
593 
594  local->fif_other_bss++;
595  /* mesh ifaces must set allmulti to forward mcast traffic */
596  atomic_inc(&local->iff_allmultis);
598 
599  ifmsh->mesh_cc_id = 0; /* Disabled */
600  ifmsh->mesh_auth_id = 0; /* Disabled */
601  /* register sync ops from extensible synchronization framework */
603  ifmsh->adjusting_tbtt = false;
604  ifmsh->sync_offset_clockdrift_max = 0;
607  ieee80211_queue_work(&local->hw, &sdata->work);
608  sdata->vif.bss_conf.ht_operation_mode =
609  ifmsh->mshcfg.ht_opmode;
610  sdata->vif.bss_conf.beacon_int = MESH_DEFAULT_BEACON_INTERVAL;
611  sdata->vif.bss_conf.basic_rates =
613  sdata->local->oper_channel->band);
619 
620  netif_carrier_on(sdata->dev);
621 }
622 
624 {
625  struct ieee80211_local *local = sdata->local;
626  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
627 
628  netif_carrier_off(sdata->dev);
629 
630  /* stop the beacon */
631  ifmsh->mesh_id_len = 0;
633 
634  /* flush STAs and mpaths on this iface */
635  sta_info_flush(sdata->local, sdata);
637 
638  del_timer_sync(&sdata->u.mesh.housekeeping_timer);
639  del_timer_sync(&sdata->u.mesh.mesh_path_root_timer);
640  del_timer_sync(&sdata->u.mesh.mesh_path_timer);
641  /*
642  * If the timer fired while we waited for it, it will have
643  * requeued the work. Now the work will be running again
644  * but will not rearm the timer again because it checks
645  * whether the interface is running, which, at this point,
646  * it no longer is.
647  */
648  cancel_work_sync(&sdata->work);
649 
650  local->fif_other_bss--;
651  atomic_dec(&local->iff_allmultis);
653 
654  sdata->u.mesh.timers_running = 0;
655 }
656 
657 static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata,
658  u16 stype,
659  struct ieee80211_mgmt *mgmt,
660  size_t len,
662 {
663  struct ieee80211_local *local = sdata->local;
664  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
665  struct ieee802_11_elems elems;
666  struct ieee80211_channel *channel;
667  size_t baselen;
668  int freq;
669  enum ieee80211_band band = rx_status->band;
670 
671  /* ignore ProbeResp to foreign address */
672  if (stype == IEEE80211_STYPE_PROBE_RESP &&
673  !ether_addr_equal(mgmt->da, sdata->vif.addr))
674  return;
675 
676  baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt;
677  if (baselen > len)
678  return;
679 
680  ieee802_11_parse_elems(mgmt->u.probe_resp.variable, len - baselen,
681  &elems);
682 
683  /* ignore beacons from secure mesh peers if our security is off */
684  if (elems.rsn_len && sdata->u.mesh.security == IEEE80211_MESH_SEC_NONE)
685  return;
686 
687  if (elems.ds_params && elems.ds_params_len == 1)
688  freq = ieee80211_channel_to_frequency(elems.ds_params[0], band);
689  else
690  freq = rx_status->freq;
691 
692  channel = ieee80211_get_channel(local->hw.wiphy, freq);
693 
694  if (!channel || channel->flags & IEEE80211_CHAN_DISABLED)
695  return;
696 
697  if (elems.mesh_id && elems.mesh_config &&
698  mesh_matches_local(sdata, &elems))
699  mesh_neighbour_update(sdata, mgmt->sa, &elems);
700 
701  if (ifmsh->sync_ops)
702  ifmsh->sync_ops->rx_bcn_presp(sdata,
703  stype, mgmt, &elems, rx_status);
704 }
705 
706 static void ieee80211_mesh_rx_mgmt_action(struct ieee80211_sub_if_data *sdata,
707  struct ieee80211_mgmt *mgmt,
708  size_t len,
709  struct ieee80211_rx_status *rx_status)
710 {
711  switch (mgmt->u.action.category) {
713  switch (mgmt->u.action.u.self_prot.action_code) {
717  mesh_rx_plink_frame(sdata, mgmt, len, rx_status);
718  break;
719  }
720  break;
722  if (mesh_action_is_path_sel(mgmt))
723  mesh_rx_path_sel_frame(sdata, mgmt, len);
724  break;
725  }
726 }
727 
729  struct sk_buff *skb)
730 {
731  struct ieee80211_rx_status *rx_status;
732  struct ieee80211_mgmt *mgmt;
733  u16 stype;
734 
735  rx_status = IEEE80211_SKB_RXCB(skb);
736  mgmt = (struct ieee80211_mgmt *) skb->data;
738 
739  switch (stype) {
742  ieee80211_mesh_rx_bcn_presp(sdata, stype, mgmt, skb->len,
743  rx_status);
744  break;
746  ieee80211_mesh_rx_mgmt_action(sdata, mgmt, skb->len, rx_status);
747  break;
748  }
749 }
750 
752 {
753  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
754 
755  if (ifmsh->preq_queue_len &&
757  ifmsh->last_preq + msecs_to_jiffies(ifmsh->mshcfg.dot11MeshHWMPpreqMinInterval)))
759 
762 
765 
767  ieee80211_mesh_housekeeping(sdata, ifmsh);
768 
770  ieee80211_mesh_rootpath(sdata);
771 
773  mesh_sync_adjust_tbtt(sdata);
774 }
775 
777 {
779 
780  rcu_read_lock();
781  list_for_each_entry_rcu(sdata, &local->interfaces, list)
782  if (ieee80211_vif_is_mesh(&sdata->vif))
783  ieee80211_queue_work(&local->hw, &sdata->work);
784  rcu_read_unlock();
785 }
786 
788 {
789  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
790 
792  ieee80211_mesh_housekeeping_timer,
793  (unsigned long) sdata);
794 
795  ifmsh->accepting_plinks = true;
796  ifmsh->preq_id = 0;
797  ifmsh->sn = 0;
798  ifmsh->num_gates = 0;
799  atomic_set(&ifmsh->mpaths, 0);
800  mesh_rmc_init(sdata);
801  ifmsh->last_preq = jiffies;
802  ifmsh->next_perr = jiffies;
803  /* Allocate all mesh structures when creating the first mesh interface. */
804  if (!mesh_allocated)
805  ieee80211s_init();
807  ieee80211_mesh_path_timer,
808  (unsigned long) sdata);
810  ieee80211_mesh_path_root_timer,
811  (unsigned long) sdata);
812  INIT_LIST_HEAD(&ifmsh->preq_queue.list);
815 }