Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mesh_hwmp.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2008, 2009 open80211s Ltd.
3  * Author: Luis Carlos Cobo <[email protected]>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  */
9 
10 #include <linux/slab.h>
11 #include <linux/etherdevice.h>
12 #include <asm/unaligned.h>
13 #include "wme.h"
14 #include "mesh.h"
15 
16 #define TEST_FRAME_LEN 8192
17 #define MAX_METRIC 0xffffffff
18 #define ARITH_SHIFT 8
19 
20 #define MAX_PREQ_QUEUE_LEN 64
21 
22 /* Destination only */
23 #define MP_F_DO 0x1
24 /* Reply and forward */
25 #define MP_F_RF 0x2
26 /* Unknown Sequence Number */
27 #define MP_F_USN 0x01
28 /* Reason code Present */
29 #define MP_F_RCODE 0x02
30 
31 static void mesh_queue_preq(struct mesh_path *, u8);
32 
33 static inline u32 u32_field_get(u8 *preq_elem, int offset, bool ae)
34 {
35  if (ae)
36  offset += 6;
37  return get_unaligned_le32(preq_elem + offset);
38 }
39 
40 static inline u32 u16_field_get(u8 *preq_elem, int offset, bool ae)
41 {
42  if (ae)
43  offset += 6;
44  return get_unaligned_le16(preq_elem + offset);
45 }
46 
47 /* HWMP IE processing macros */
48 #define AE_F (1<<6)
49 #define AE_F_SET(x) (*x & AE_F)
50 #define PREQ_IE_FLAGS(x) (*(x))
51 #define PREQ_IE_HOPCOUNT(x) (*(x + 1))
52 #define PREQ_IE_TTL(x) (*(x + 2))
53 #define PREQ_IE_PREQ_ID(x) u32_field_get(x, 3, 0)
54 #define PREQ_IE_ORIG_ADDR(x) (x + 7)
55 #define PREQ_IE_ORIG_SN(x) u32_field_get(x, 13, 0)
56 #define PREQ_IE_LIFETIME(x) u32_field_get(x, 17, AE_F_SET(x))
57 #define PREQ_IE_METRIC(x) u32_field_get(x, 21, AE_F_SET(x))
58 #define PREQ_IE_TARGET_F(x) (*(AE_F_SET(x) ? x + 32 : x + 26))
59 #define PREQ_IE_TARGET_ADDR(x) (AE_F_SET(x) ? x + 33 : x + 27)
60 #define PREQ_IE_TARGET_SN(x) u32_field_get(x, 33, AE_F_SET(x))
61 
62 
63 #define PREP_IE_FLAGS(x) PREQ_IE_FLAGS(x)
64 #define PREP_IE_HOPCOUNT(x) PREQ_IE_HOPCOUNT(x)
65 #define PREP_IE_TTL(x) PREQ_IE_TTL(x)
66 #define PREP_IE_ORIG_ADDR(x) (AE_F_SET(x) ? x + 27 : x + 21)
67 #define PREP_IE_ORIG_SN(x) u32_field_get(x, 27, AE_F_SET(x))
68 #define PREP_IE_LIFETIME(x) u32_field_get(x, 13, AE_F_SET(x))
69 #define PREP_IE_METRIC(x) u32_field_get(x, 17, AE_F_SET(x))
70 #define PREP_IE_TARGET_ADDR(x) (x + 3)
71 #define PREP_IE_TARGET_SN(x) u32_field_get(x, 9, 0)
72 
73 #define PERR_IE_TTL(x) (*(x))
74 #define PERR_IE_TARGET_FLAGS(x) (*(x + 2))
75 #define PERR_IE_TARGET_ADDR(x) (x + 3)
76 #define PERR_IE_TARGET_SN(x) u32_field_get(x, 9, 0)
77 #define PERR_IE_TARGET_RCODE(x) u16_field_get(x, 13, 0)
78 
79 #define MSEC_TO_TU(x) (x*1000/1024)
80 #define SN_GT(x, y) ((s32)(y - x) < 0)
81 #define SN_LT(x, y) ((s32)(x - y) < 0)
82 
83 #define net_traversal_jiffies(s) \
84  msecs_to_jiffies(s->u.mesh.mshcfg.dot11MeshHWMPnetDiameterTraversalTime)
85 #define default_lifetime(s) \
86  MSEC_TO_TU(s->u.mesh.mshcfg.dot11MeshHWMPactivePathTimeout)
87 #define min_preq_int_jiff(s) \
88  (msecs_to_jiffies(s->u.mesh.mshcfg.dot11MeshHWMPpreqMinInterval))
89 #define max_preq_retries(s) (s->u.mesh.mshcfg.dot11MeshHWMPmaxPREQretries)
90 #define disc_timeout_jiff(s) \
91  msecs_to_jiffies(sdata->u.mesh.mshcfg.min_discovery_timeout)
92 #define root_path_confirmation_jiffies(s) \
93  msecs_to_jiffies(sdata->u.mesh.mshcfg.dot11MeshHWMPconfirmationInterval)
94 
100 };
101 
102 static const u8 broadcast_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
103 
104 static int mesh_path_sel_frame_tx(enum mpath_frame_type action, u8 flags,
105  u8 *orig_addr, __le32 orig_sn, u8 target_flags, u8 *target,
106  __le32 target_sn, const u8 *da, u8 hop_count, u8 ttl,
107  __le32 lifetime, __le32 metric, __le32 preq_id,
109 {
110  struct ieee80211_local *local = sdata->local;
111  struct sk_buff *skb;
112  struct ieee80211_mgmt *mgmt;
113  u8 *pos, ie_len;
114  int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.mesh_action) +
115  sizeof(mgmt->u.action.u.mesh_action);
116 
117  skb = dev_alloc_skb(local->tx_headroom +
118  hdr_len +
119  2 + 37); /* max HWMP IE */
120  if (!skb)
121  return -1;
122  skb_reserve(skb, local->tx_headroom);
123  mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len);
124  memset(mgmt, 0, hdr_len);
127 
128  memcpy(mgmt->da, da, ETH_ALEN);
129  memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
130  /* BSSID == SA */
131  memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
132  mgmt->u.action.category = WLAN_CATEGORY_MESH_ACTION;
133  mgmt->u.action.u.mesh_action.action_code =
135 
136  switch (action) {
137  case MPATH_PREQ:
138  mhwmp_dbg(sdata, "sending PREQ to %pM\n", target);
139  ie_len = 37;
140  pos = skb_put(skb, 2 + ie_len);
141  *pos++ = WLAN_EID_PREQ;
142  break;
143  case MPATH_PREP:
144  mhwmp_dbg(sdata, "sending PREP to %pM\n", target);
145  ie_len = 31;
146  pos = skb_put(skb, 2 + ie_len);
147  *pos++ = WLAN_EID_PREP;
148  break;
149  case MPATH_RANN:
150  mhwmp_dbg(sdata, "sending RANN from %pM\n", orig_addr);
151  ie_len = sizeof(struct ieee80211_rann_ie);
152  pos = skb_put(skb, 2 + ie_len);
153  *pos++ = WLAN_EID_RANN;
154  break;
155  default:
156  kfree_skb(skb);
157  return -ENOTSUPP;
158  break;
159  }
160  *pos++ = ie_len;
161  *pos++ = flags;
162  *pos++ = hop_count;
163  *pos++ = ttl;
164  if (action == MPATH_PREP) {
165  memcpy(pos, target, ETH_ALEN);
166  pos += ETH_ALEN;
167  memcpy(pos, &target_sn, 4);
168  pos += 4;
169  } else {
170  if (action == MPATH_PREQ) {
171  memcpy(pos, &preq_id, 4);
172  pos += 4;
173  }
174  memcpy(pos, orig_addr, ETH_ALEN);
175  pos += ETH_ALEN;
176  memcpy(pos, &orig_sn, 4);
177  pos += 4;
178  }
179  memcpy(pos, &lifetime, 4); /* interval for RANN */
180  pos += 4;
181  memcpy(pos, &metric, 4);
182  pos += 4;
183  if (action == MPATH_PREQ) {
184  *pos++ = 1; /* destination count */
185  *pos++ = target_flags;
186  memcpy(pos, target, ETH_ALEN);
187  pos += ETH_ALEN;
188  memcpy(pos, &target_sn, 4);
189  pos += 4;
190  } else if (action == MPATH_PREP) {
191  memcpy(pos, orig_addr, ETH_ALEN);
192  pos += ETH_ALEN;
193  memcpy(pos, &orig_sn, 4);
194  pos += 4;
195  }
196 
197  ieee80211_tx_skb(sdata, skb);
198  return 0;
199 }
200 
201 
202 /* Headroom is not adjusted. Caller should ensure that skb has sufficient
203  * headroom in case the frame is encrypted. */
204 static void prepare_frame_for_deferred_tx(struct ieee80211_sub_if_data *sdata,
205  struct sk_buff *skb)
206 {
207  struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
208 
209  skb_set_mac_header(skb, 0);
210  skb_set_network_header(skb, 0);
211  skb_set_transport_header(skb, 0);
212 
213  /* Send all internal mgmt frames on VO. Accordingly set TID to 7. */
214  skb_set_queue_mapping(skb, IEEE80211_AC_VO);
215  skb->priority = 7;
216 
217  info->control.vif = &sdata->vif;
218  ieee80211_set_qos_hdr(sdata, skb);
219 }
220 
233 int mesh_path_error_tx(u8 ttl, u8 *target, __le32 target_sn,
234  __le16 target_rcode, const u8 *ra,
235  struct ieee80211_sub_if_data *sdata)
236 {
237  struct ieee80211_local *local = sdata->local;
238  struct sk_buff *skb;
239  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
240  struct ieee80211_mgmt *mgmt;
241  u8 *pos, ie_len;
242  int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.mesh_action) +
243  sizeof(mgmt->u.action.u.mesh_action);
244 
245  if (time_before(jiffies, ifmsh->next_perr))
246  return -EAGAIN;
247 
248  skb = dev_alloc_skb(local->tx_headroom +
249  hdr_len +
250  2 + 15 /* PERR IE */);
251  if (!skb)
252  return -1;
253  skb_reserve(skb, local->tx_headroom);
254  mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len);
255  memset(mgmt, 0, hdr_len);
258 
259  memcpy(mgmt->da, ra, ETH_ALEN);
260  memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
261  /* BSSID == SA */
262  memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
263  mgmt->u.action.category = WLAN_CATEGORY_MESH_ACTION;
264  mgmt->u.action.u.mesh_action.action_code =
266  ie_len = 15;
267  pos = skb_put(skb, 2 + ie_len);
268  *pos++ = WLAN_EID_PERR;
269  *pos++ = ie_len;
270  /* ttl */
271  *pos++ = ttl;
272  /* number of destinations */
273  *pos++ = 1;
274  /*
275  * flags bit, bit 1 is unset if we know the sequence number and
276  * bit 2 is set if we have a reason code
277  */
278  *pos = 0;
279  if (!target_sn)
280  *pos |= MP_F_USN;
281  if (target_rcode)
282  *pos |= MP_F_RCODE;
283  pos++;
284  memcpy(pos, target, ETH_ALEN);
285  pos += ETH_ALEN;
286  memcpy(pos, &target_sn, 4);
287  pos += 4;
288  memcpy(pos, &target_rcode, 2);
289 
290  /* see note in function header */
291  prepare_frame_for_deferred_tx(sdata, skb);
292  ifmsh->next_perr = TU_TO_EXP_TIME(
293  ifmsh->mshcfg.dot11MeshHWMPperrMinInterval);
294  ieee80211_add_pending_skb(local, skb);
295  return 0;
296 }
297 
299  struct sta_info *sta, struct sk_buff *skb)
300 {
301  struct ieee80211_tx_info *txinfo = IEEE80211_SKB_CB(skb);
302  struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
303  int failed;
304 
305  if (!ieee80211_is_data(hdr->frame_control))
306  return;
307 
308  failed = !(txinfo->flags & IEEE80211_TX_STAT_ACK);
309 
310  /* moving average, scaled to 100 */
311  sta->fail_avg = ((80 * sta->fail_avg + 5) / 100 + 20 * failed);
312  if (sta->fail_avg > 95)
313  mesh_plink_broken(sta);
314 }
315 
316 static u32 airtime_link_metric_get(struct ieee80211_local *local,
317  struct sta_info *sta)
318 {
319  struct rate_info rinfo;
320  /* This should be adjusted for each device */
321  int device_constant = 1 << ARITH_SHIFT;
322  int test_frame_len = TEST_FRAME_LEN << ARITH_SHIFT;
323  int s_unit = 1 << ARITH_SHIFT;
324  int rate, err;
325  u32 tx_time, estimated_retx;
326  u64 result;
327 
328  if (sta->fail_avg >= 100)
329  return MAX_METRIC;
330 
331  sta_set_rate_info_tx(sta, &sta->last_tx_rate, &rinfo);
332  rate = cfg80211_calculate_bitrate(&rinfo);
333  if (WARN_ON(!rate))
334  return MAX_METRIC;
335 
336  err = (sta->fail_avg << ARITH_SHIFT) / 100;
337 
338  /* bitrate is in units of 100 Kbps, while we need rate in units of
339  * 1Mbps. This will be corrected on tx_time computation.
340  */
341  tx_time = (device_constant + 10 * test_frame_len / rate);
342  estimated_retx = ((1 << (2 * ARITH_SHIFT)) / (s_unit - err));
343  result = (tx_time * estimated_retx) >> (2 * ARITH_SHIFT) ;
344  return (u32)result;
345 }
346 
363 static u32 hwmp_route_info_get(struct ieee80211_sub_if_data *sdata,
364  struct ieee80211_mgmt *mgmt,
365  u8 *hwmp_ie, enum mpath_frame_type action)
366 {
367  struct ieee80211_local *local = sdata->local;
368  struct mesh_path *mpath;
369  struct sta_info *sta;
370  bool fresh_info;
371  u8 *orig_addr, *ta;
372  u32 orig_sn, orig_metric;
373  unsigned long orig_lifetime, exp_time;
374  u32 last_hop_metric, new_metric;
375  bool process = true;
376 
377  rcu_read_lock();
378  sta = sta_info_get(sdata, mgmt->sa);
379  if (!sta) {
380  rcu_read_unlock();
381  return 0;
382  }
383 
384  last_hop_metric = airtime_link_metric_get(local, sta);
385  /* Update and check originator routing info */
386  fresh_info = true;
387 
388  switch (action) {
389  case MPATH_PREQ:
390  orig_addr = PREQ_IE_ORIG_ADDR(hwmp_ie);
391  orig_sn = PREQ_IE_ORIG_SN(hwmp_ie);
392  orig_lifetime = PREQ_IE_LIFETIME(hwmp_ie);
393  orig_metric = PREQ_IE_METRIC(hwmp_ie);
394  break;
395  case MPATH_PREP:
396  /* Originator here refers to the MP that was the target in the
397  * Path Request. We divert from the nomenclature in the draft
398  * so that we can easily use a single function to gather path
399  * information from both PREQ and PREP frames.
400  */
401  orig_addr = PREP_IE_TARGET_ADDR(hwmp_ie);
402  orig_sn = PREP_IE_TARGET_SN(hwmp_ie);
403  orig_lifetime = PREP_IE_LIFETIME(hwmp_ie);
404  orig_metric = PREP_IE_METRIC(hwmp_ie);
405  break;
406  default:
407  rcu_read_unlock();
408  return 0;
409  }
410  new_metric = orig_metric + last_hop_metric;
411  if (new_metric < orig_metric)
412  new_metric = MAX_METRIC;
413  exp_time = TU_TO_EXP_TIME(orig_lifetime);
414 
415  if (ether_addr_equal(orig_addr, sdata->vif.addr)) {
416  /* This MP is the originator, we are not interested in this
417  * frame, except for updating transmitter's path info.
418  */
419  process = false;
420  fresh_info = false;
421  } else {
422  mpath = mesh_path_lookup(orig_addr, sdata);
423  if (mpath) {
424  spin_lock_bh(&mpath->state_lock);
425  if (mpath->flags & MESH_PATH_FIXED)
426  fresh_info = false;
427  else if ((mpath->flags & MESH_PATH_ACTIVE) &&
428  (mpath->flags & MESH_PATH_SN_VALID)) {
429  if (SN_GT(mpath->sn, orig_sn) ||
430  (mpath->sn == orig_sn &&
431  new_metric >= mpath->metric)) {
432  process = false;
433  fresh_info = false;
434  }
435  }
436  } else {
437  mesh_path_add(orig_addr, sdata);
438  mpath = mesh_path_lookup(orig_addr, sdata);
439  if (!mpath) {
440  rcu_read_unlock();
441  return 0;
442  }
443  spin_lock_bh(&mpath->state_lock);
444  }
445 
446  if (fresh_info) {
447  mesh_path_assign_nexthop(mpath, sta);
448  mpath->flags |= MESH_PATH_SN_VALID;
449  mpath->metric = new_metric;
450  mpath->sn = orig_sn;
451  mpath->exp_time = time_after(mpath->exp_time, exp_time)
452  ? mpath->exp_time : exp_time;
453  mesh_path_activate(mpath);
454  spin_unlock_bh(&mpath->state_lock);
455  mesh_path_tx_pending(mpath);
456  /* draft says preq_id should be saved to, but there does
457  * not seem to be any use for it, skipping by now
458  */
459  } else
460  spin_unlock_bh(&mpath->state_lock);
461  }
462 
463  /* Update and check transmitter routing info */
464  ta = mgmt->sa;
465  if (ether_addr_equal(orig_addr, ta))
466  fresh_info = false;
467  else {
468  fresh_info = true;
469 
470  mpath = mesh_path_lookup(ta, sdata);
471  if (mpath) {
472  spin_lock_bh(&mpath->state_lock);
473  if ((mpath->flags & MESH_PATH_FIXED) ||
474  ((mpath->flags & MESH_PATH_ACTIVE) &&
475  (last_hop_metric > mpath->metric)))
476  fresh_info = false;
477  } else {
478  mesh_path_add(ta, sdata);
479  mpath = mesh_path_lookup(ta, sdata);
480  if (!mpath) {
481  rcu_read_unlock();
482  return 0;
483  }
484  spin_lock_bh(&mpath->state_lock);
485  }
486 
487  if (fresh_info) {
488  mesh_path_assign_nexthop(mpath, sta);
489  mpath->metric = last_hop_metric;
490  mpath->exp_time = time_after(mpath->exp_time, exp_time)
491  ? mpath->exp_time : exp_time;
492  mesh_path_activate(mpath);
493  spin_unlock_bh(&mpath->state_lock);
494  mesh_path_tx_pending(mpath);
495  } else
496  spin_unlock_bh(&mpath->state_lock);
497  }
498 
499  rcu_read_unlock();
500 
501  return process ? new_metric : 0;
502 }
503 
504 static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata,
505  struct ieee80211_mgmt *mgmt,
506  u8 *preq_elem, u32 metric)
507 {
508  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
509  struct mesh_path *mpath = NULL;
510  u8 *target_addr, *orig_addr;
511  const u8 *da;
512  u8 target_flags, ttl, flags;
513  u32 orig_sn, target_sn, lifetime, orig_metric;
514  bool reply = false;
515  bool forward = true;
516  bool root_is_gate;
517 
518  /* Update target SN, if present */
519  target_addr = PREQ_IE_TARGET_ADDR(preq_elem);
520  orig_addr = PREQ_IE_ORIG_ADDR(preq_elem);
521  target_sn = PREQ_IE_TARGET_SN(preq_elem);
522  orig_sn = PREQ_IE_ORIG_SN(preq_elem);
523  target_flags = PREQ_IE_TARGET_F(preq_elem);
524  orig_metric = metric;
525  /* Proactive PREQ gate announcements */
526  flags = PREQ_IE_FLAGS(preq_elem);
527  root_is_gate = !!(flags & RANN_FLAG_IS_GATE);
528 
529  mhwmp_dbg(sdata, "received PREQ from %pM\n", orig_addr);
530 
531  if (ether_addr_equal(target_addr, sdata->vif.addr)) {
532  mhwmp_dbg(sdata, "PREQ is for us\n");
533  forward = false;
534  reply = true;
535  metric = 0;
536  if (time_after(jiffies, ifmsh->last_sn_update +
537  net_traversal_jiffies(sdata)) ||
538  time_before(jiffies, ifmsh->last_sn_update)) {
539  target_sn = ++ifmsh->sn;
540  ifmsh->last_sn_update = jiffies;
541  }
542  } else if (is_broadcast_ether_addr(target_addr) &&
543  (target_flags & IEEE80211_PREQ_TO_FLAG)) {
544  rcu_read_lock();
545  mpath = mesh_path_lookup(orig_addr, sdata);
546  if (mpath) {
548  reply = true;
549  target_addr = sdata->vif.addr;
550  target_sn = ++ifmsh->sn;
551  metric = 0;
552  ifmsh->last_sn_update = jiffies;
553  }
554  if (root_is_gate)
555  mesh_path_add_gate(mpath);
556  }
557  rcu_read_unlock();
558  } else {
559  rcu_read_lock();
560  mpath = mesh_path_lookup(target_addr, sdata);
561  if (mpath) {
562  if ((!(mpath->flags & MESH_PATH_SN_VALID)) ||
563  SN_LT(mpath->sn, target_sn)) {
564  mpath->sn = target_sn;
565  mpath->flags |= MESH_PATH_SN_VALID;
566  } else if ((!(target_flags & MP_F_DO)) &&
567  (mpath->flags & MESH_PATH_ACTIVE)) {
568  reply = true;
569  metric = mpath->metric;
570  target_sn = mpath->sn;
571  if (target_flags & MP_F_RF)
572  target_flags |= MP_F_DO;
573  else
574  forward = false;
575  }
576  }
577  rcu_read_unlock();
578  }
579 
580  if (reply) {
581  lifetime = PREQ_IE_LIFETIME(preq_elem);
582  ttl = ifmsh->mshcfg.element_ttl;
583  if (ttl != 0) {
584  mhwmp_dbg(sdata, "replying to the PREQ\n");
585  mesh_path_sel_frame_tx(MPATH_PREP, 0, orig_addr,
586  cpu_to_le32(orig_sn), 0, target_addr,
587  cpu_to_le32(target_sn), mgmt->sa, 0, ttl,
588  cpu_to_le32(lifetime), cpu_to_le32(metric),
589  0, sdata);
590  } else {
591  ifmsh->mshstats.dropped_frames_ttl++;
592  }
593  }
594 
595  if (forward && ifmsh->mshcfg.dot11MeshForwarding) {
596  u32 preq_id;
597  u8 hopcount;
598 
599  ttl = PREQ_IE_TTL(preq_elem);
600  lifetime = PREQ_IE_LIFETIME(preq_elem);
601  if (ttl <= 1) {
602  ifmsh->mshstats.dropped_frames_ttl++;
603  return;
604  }
605  mhwmp_dbg(sdata, "forwarding the PREQ from %pM\n", orig_addr);
606  --ttl;
607  preq_id = PREQ_IE_PREQ_ID(preq_elem);
608  hopcount = PREQ_IE_HOPCOUNT(preq_elem) + 1;
609  da = (mpath && mpath->is_root) ?
610  mpath->rann_snd_addr : broadcast_addr;
611 
613  target_addr = PREQ_IE_TARGET_ADDR(preq_elem);
614  target_sn = PREQ_IE_TARGET_SN(preq_elem);
615  metric = orig_metric;
616  }
617 
618  mesh_path_sel_frame_tx(MPATH_PREQ, flags, orig_addr,
619  cpu_to_le32(orig_sn), target_flags, target_addr,
620  cpu_to_le32(target_sn), da,
621  hopcount, ttl, cpu_to_le32(lifetime),
622  cpu_to_le32(metric), cpu_to_le32(preq_id),
623  sdata);
624  if (!is_multicast_ether_addr(da))
625  ifmsh->mshstats.fwded_unicast++;
626  else
627  ifmsh->mshstats.fwded_mcast++;
628  ifmsh->mshstats.fwded_frames++;
629  }
630 }
631 
632 
633 static inline struct sta_info *
634 next_hop_deref_protected(struct mesh_path *mpath)
635 {
636  return rcu_dereference_protected(mpath->next_hop,
637  lockdep_is_held(&mpath->state_lock));
638 }
639 
640 
641 static void hwmp_prep_frame_process(struct ieee80211_sub_if_data *sdata,
642  struct ieee80211_mgmt *mgmt,
643  u8 *prep_elem, u32 metric)
644 {
645  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
646  struct mesh_path *mpath;
647  u8 *target_addr, *orig_addr;
648  u8 ttl, hopcount, flags;
650  u32 target_sn, orig_sn, lifetime;
651 
652  mhwmp_dbg(sdata, "received PREP from %pM\n",
653  PREP_IE_ORIG_ADDR(prep_elem));
654 
655  orig_addr = PREP_IE_ORIG_ADDR(prep_elem);
656  if (ether_addr_equal(orig_addr, sdata->vif.addr))
657  /* destination, no forwarding required */
658  return;
659 
660  if (!ifmsh->mshcfg.dot11MeshForwarding)
661  return;
662 
663  ttl = PREP_IE_TTL(prep_elem);
664  if (ttl <= 1) {
665  sdata->u.mesh.mshstats.dropped_frames_ttl++;
666  return;
667  }
668 
669  rcu_read_lock();
670  mpath = mesh_path_lookup(orig_addr, sdata);
671  if (mpath)
672  spin_lock_bh(&mpath->state_lock);
673  else
674  goto fail;
675  if (!(mpath->flags & MESH_PATH_ACTIVE)) {
676  spin_unlock_bh(&mpath->state_lock);
677  goto fail;
678  }
679  memcpy(next_hop, next_hop_deref_protected(mpath)->sta.addr, ETH_ALEN);
680  spin_unlock_bh(&mpath->state_lock);
681  --ttl;
682  flags = PREP_IE_FLAGS(prep_elem);
683  lifetime = PREP_IE_LIFETIME(prep_elem);
684  hopcount = PREP_IE_HOPCOUNT(prep_elem) + 1;
685  target_addr = PREP_IE_TARGET_ADDR(prep_elem);
686  target_sn = PREP_IE_TARGET_SN(prep_elem);
687  orig_sn = PREP_IE_ORIG_SN(prep_elem);
688 
689  mesh_path_sel_frame_tx(MPATH_PREP, flags, orig_addr,
690  cpu_to_le32(orig_sn), 0, target_addr,
691  cpu_to_le32(target_sn), next_hop, hopcount,
692  ttl, cpu_to_le32(lifetime), cpu_to_le32(metric),
693  0, sdata);
694  rcu_read_unlock();
695 
696  sdata->u.mesh.mshstats.fwded_unicast++;
697  sdata->u.mesh.mshstats.fwded_frames++;
698  return;
699 
700 fail:
701  rcu_read_unlock();
702  sdata->u.mesh.mshstats.dropped_frames_no_route++;
703 }
704 
705 static void hwmp_perr_frame_process(struct ieee80211_sub_if_data *sdata,
706  struct ieee80211_mgmt *mgmt, u8 *perr_elem)
707 {
708  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
709  struct mesh_path *mpath;
710  u8 ttl;
711  u8 *ta, *target_addr;
712  u32 target_sn;
713  u16 target_rcode;
714 
715  ta = mgmt->sa;
716  ttl = PERR_IE_TTL(perr_elem);
717  if (ttl <= 1) {
718  ifmsh->mshstats.dropped_frames_ttl++;
719  return;
720  }
721  ttl--;
722  target_addr = PERR_IE_TARGET_ADDR(perr_elem);
723  target_sn = PERR_IE_TARGET_SN(perr_elem);
724  target_rcode = PERR_IE_TARGET_RCODE(perr_elem);
725 
726  rcu_read_lock();
727  mpath = mesh_path_lookup(target_addr, sdata);
728  if (mpath) {
729  struct sta_info *sta;
730 
731  spin_lock_bh(&mpath->state_lock);
732  sta = next_hop_deref_protected(mpath);
733  if (mpath->flags & MESH_PATH_ACTIVE &&
734  ether_addr_equal(ta, sta->sta.addr) &&
735  (!(mpath->flags & MESH_PATH_SN_VALID) ||
736  SN_GT(target_sn, mpath->sn))) {
737  mpath->flags &= ~MESH_PATH_ACTIVE;
738  mpath->sn = target_sn;
739  spin_unlock_bh(&mpath->state_lock);
740  if (!ifmsh->mshcfg.dot11MeshForwarding)
741  goto endperr;
742  mesh_path_error_tx(ttl, target_addr, cpu_to_le32(target_sn),
743  cpu_to_le16(target_rcode),
744  broadcast_addr, sdata);
745  } else
746  spin_unlock_bh(&mpath->state_lock);
747  }
748 endperr:
749  rcu_read_unlock();
750 }
751 
752 static void hwmp_rann_frame_process(struct ieee80211_sub_if_data *sdata,
753  struct ieee80211_mgmt *mgmt,
754  struct ieee80211_rann_ie *rann)
755 {
756  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
757  struct ieee80211_local *local = sdata->local;
758  struct sta_info *sta;
759  struct mesh_path *mpath;
760  u8 ttl, flags, hopcount;
761  u8 *orig_addr;
762  u32 orig_sn, metric, metric_txsta, interval;
763  bool root_is_gate;
764 
765  ttl = rann->rann_ttl;
766  flags = rann->rann_flags;
767  root_is_gate = !!(flags & RANN_FLAG_IS_GATE);
768  orig_addr = rann->rann_addr;
769  orig_sn = le32_to_cpu(rann->rann_seq);
770  interval = le32_to_cpu(rann->rann_interval);
771  hopcount = rann->rann_hopcount;
772  hopcount++;
773  metric = le32_to_cpu(rann->rann_metric);
774 
775  /* Ignore our own RANNs */
776  if (ether_addr_equal(orig_addr, sdata->vif.addr))
777  return;
778 
779  mhwmp_dbg(sdata,
780  "received RANN from %pM via neighbour %pM (is_gate=%d)\n",
781  orig_addr, mgmt->sa, root_is_gate);
782 
783  rcu_read_lock();
784  sta = sta_info_get(sdata, mgmt->sa);
785  if (!sta) {
786  rcu_read_unlock();
787  return;
788  }
789 
790  metric_txsta = airtime_link_metric_get(local, sta);
791 
792  mpath = mesh_path_lookup(orig_addr, sdata);
793  if (!mpath) {
794  mesh_path_add(orig_addr, sdata);
795  mpath = mesh_path_lookup(orig_addr, sdata);
796  if (!mpath) {
797  rcu_read_unlock();
798  sdata->u.mesh.mshstats.dropped_frames_no_route++;
799  return;
800  }
801  }
802 
803  if (!(SN_LT(mpath->sn, orig_sn)) &&
804  !(mpath->sn == orig_sn && metric < mpath->rann_metric)) {
805  rcu_read_unlock();
806  return;
807  }
808 
809  if ((!(mpath->flags & (MESH_PATH_ACTIVE | MESH_PATH_RESOLVING)) ||
810  (time_after(jiffies, mpath->last_preq_to_root +
812  time_before(jiffies, mpath->last_preq_to_root))) &&
813  !(mpath->flags & MESH_PATH_FIXED) && (ttl != 0)) {
814  mhwmp_dbg(sdata,
815  "time to refresh root mpath %pM\n",
816  orig_addr);
817  mesh_queue_preq(mpath, PREQ_Q_F_START | PREQ_Q_F_REFRESH);
818  mpath->last_preq_to_root = jiffies;
819  }
820 
821  mpath->sn = orig_sn;
822  mpath->rann_metric = metric + metric_txsta;
823  mpath->is_root = true;
824  /* Recording RANNs sender address to send individually
825  * addressed PREQs destined for root mesh STA */
826  memcpy(mpath->rann_snd_addr, mgmt->sa, ETH_ALEN);
827 
828  if (root_is_gate)
829  mesh_path_add_gate(mpath);
830 
831  if (ttl <= 1) {
832  ifmsh->mshstats.dropped_frames_ttl++;
833  rcu_read_unlock();
834  return;
835  }
836  ttl--;
837 
838  if (ifmsh->mshcfg.dot11MeshForwarding) {
839  mesh_path_sel_frame_tx(MPATH_RANN, flags, orig_addr,
840  cpu_to_le32(orig_sn),
841  0, NULL, 0, broadcast_addr,
842  hopcount, ttl, cpu_to_le32(interval),
843  cpu_to_le32(metric + metric_txsta),
844  0, sdata);
845  }
846 
847  rcu_read_unlock();
848 }
849 
850 
852  struct ieee80211_mgmt *mgmt,
853  size_t len)
854 {
855  struct ieee802_11_elems elems;
856  size_t baselen;
857  u32 last_hop_metric;
858  struct sta_info *sta;
859 
860  /* need action_code */
861  if (len < IEEE80211_MIN_ACTION_SIZE + 1)
862  return;
863 
864  rcu_read_lock();
865  sta = sta_info_get(sdata, mgmt->sa);
866  if (!sta || sta->plink_state != NL80211_PLINK_ESTAB) {
867  rcu_read_unlock();
868  return;
869  }
870  rcu_read_unlock();
871 
872  baselen = (u8 *) mgmt->u.action.u.mesh_action.variable - (u8 *) mgmt;
873  ieee802_11_parse_elems(mgmt->u.action.u.mesh_action.variable,
874  len - baselen, &elems);
875 
876  if (elems.preq) {
877  if (elems.preq_len != 37)
878  /* Right now we support just 1 destination and no AE */
879  return;
880  last_hop_metric = hwmp_route_info_get(sdata, mgmt, elems.preq,
881  MPATH_PREQ);
882  if (last_hop_metric)
883  hwmp_preq_frame_process(sdata, mgmt, elems.preq,
884  last_hop_metric);
885  }
886  if (elems.prep) {
887  if (elems.prep_len != 31)
888  /* Right now we support no AE */
889  return;
890  last_hop_metric = hwmp_route_info_get(sdata, mgmt, elems.prep,
891  MPATH_PREP);
892  if (last_hop_metric)
893  hwmp_prep_frame_process(sdata, mgmt, elems.prep,
894  last_hop_metric);
895  }
896  if (elems.perr) {
897  if (elems.perr_len != 15)
898  /* Right now we support only one destination per PERR */
899  return;
900  hwmp_perr_frame_process(sdata, mgmt, elems.perr);
901  }
902  if (elems.rann)
903  hwmp_rann_frame_process(sdata, mgmt, elems.rann);
904 }
905 
915 static void mesh_queue_preq(struct mesh_path *mpath, u8 flags)
916 {
917  struct ieee80211_sub_if_data *sdata = mpath->sdata;
918  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
919  struct mesh_preq_queue *preq_node;
920 
921  preq_node = kmalloc(sizeof(struct mesh_preq_queue), GFP_ATOMIC);
922  if (!preq_node) {
923  mhwmp_dbg(sdata, "could not allocate PREQ node\n");
924  return;
925  }
926 
927  spin_lock_bh(&ifmsh->mesh_preq_queue_lock);
928  if (ifmsh->preq_queue_len == MAX_PREQ_QUEUE_LEN) {
929  spin_unlock_bh(&ifmsh->mesh_preq_queue_lock);
930  kfree(preq_node);
931  if (printk_ratelimit())
932  mhwmp_dbg(sdata, "PREQ node queue full\n");
933  return;
934  }
935 
936  spin_lock(&mpath->state_lock);
937  if (mpath->flags & MESH_PATH_REQ_QUEUED) {
938  spin_unlock(&mpath->state_lock);
939  spin_unlock_bh(&ifmsh->mesh_preq_queue_lock);
940  kfree(preq_node);
941  return;
942  }
943 
944  memcpy(preq_node->dst, mpath->dst, ETH_ALEN);
945  preq_node->flags = flags;
946 
947  mpath->flags |= MESH_PATH_REQ_QUEUED;
948  spin_unlock(&mpath->state_lock);
949 
950  list_add_tail(&preq_node->list, &ifmsh->preq_queue.list);
951  ++ifmsh->preq_queue_len;
952  spin_unlock_bh(&ifmsh->mesh_preq_queue_lock);
953 
954  if (time_after(jiffies, ifmsh->last_preq + min_preq_int_jiff(sdata)))
955  ieee80211_queue_work(&sdata->local->hw, &sdata->work);
956 
957  else if (time_before(jiffies, ifmsh->last_preq)) {
958  /* avoid long wait if did not send preqs for a long time
959  * and jiffies wrapped around
960  */
961  ifmsh->last_preq = jiffies - min_preq_int_jiff(sdata) - 1;
962  ieee80211_queue_work(&sdata->local->hw, &sdata->work);
963  } else
964  mod_timer(&ifmsh->mesh_path_timer, ifmsh->last_preq +
965  min_preq_int_jiff(sdata));
966 }
967 
974 {
975  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
976  struct mesh_preq_queue *preq_node;
977  struct mesh_path *mpath;
978  u8 ttl, target_flags;
979  const u8 *da;
980  u32 lifetime;
981 
982  spin_lock_bh(&ifmsh->mesh_preq_queue_lock);
983  if (!ifmsh->preq_queue_len ||
984  time_before(jiffies, ifmsh->last_preq +
985  min_preq_int_jiff(sdata))) {
986  spin_unlock_bh(&ifmsh->mesh_preq_queue_lock);
987  return;
988  }
989 
990  preq_node = list_first_entry(&ifmsh->preq_queue.list,
991  struct mesh_preq_queue, list);
992  list_del(&preq_node->list);
993  --ifmsh->preq_queue_len;
994  spin_unlock_bh(&ifmsh->mesh_preq_queue_lock);
995 
996  rcu_read_lock();
997  mpath = mesh_path_lookup(preq_node->dst, sdata);
998  if (!mpath)
999  goto enddiscovery;
1000 
1001  spin_lock_bh(&mpath->state_lock);
1002  mpath->flags &= ~MESH_PATH_REQ_QUEUED;
1003  if (preq_node->flags & PREQ_Q_F_START) {
1004  if (mpath->flags & MESH_PATH_RESOLVING) {
1005  spin_unlock_bh(&mpath->state_lock);
1006  goto enddiscovery;
1007  } else {
1008  mpath->flags &= ~MESH_PATH_RESOLVED;
1009  mpath->flags |= MESH_PATH_RESOLVING;
1010  mpath->discovery_retries = 0;
1011  mpath->discovery_timeout = disc_timeout_jiff(sdata);
1012  }
1013  } else if (!(mpath->flags & MESH_PATH_RESOLVING) ||
1014  mpath->flags & MESH_PATH_RESOLVED) {
1015  mpath->flags &= ~MESH_PATH_RESOLVING;
1016  spin_unlock_bh(&mpath->state_lock);
1017  goto enddiscovery;
1018  }
1019 
1020  ifmsh->last_preq = jiffies;
1021 
1022  if (time_after(jiffies, ifmsh->last_sn_update +
1023  net_traversal_jiffies(sdata)) ||
1024  time_before(jiffies, ifmsh->last_sn_update)) {
1025  ++ifmsh->sn;
1026  sdata->u.mesh.last_sn_update = jiffies;
1027  }
1028  lifetime = default_lifetime(sdata);
1029  ttl = sdata->u.mesh.mshcfg.element_ttl;
1030  if (ttl == 0) {
1031  sdata->u.mesh.mshstats.dropped_frames_ttl++;
1032  spin_unlock_bh(&mpath->state_lock);
1033  goto enddiscovery;
1034  }
1035 
1036  if (preq_node->flags & PREQ_Q_F_REFRESH)
1037  target_flags = MP_F_DO;
1038  else
1039  target_flags = MP_F_RF;
1040 
1041  spin_unlock_bh(&mpath->state_lock);
1042  da = (mpath->is_root) ? mpath->rann_snd_addr : broadcast_addr;
1043  mesh_path_sel_frame_tx(MPATH_PREQ, 0, sdata->vif.addr,
1044  cpu_to_le32(ifmsh->sn), target_flags, mpath->dst,
1045  cpu_to_le32(mpath->sn), da, 0,
1046  ttl, cpu_to_le32(lifetime), 0,
1047  cpu_to_le32(ifmsh->preq_id++), sdata);
1048  mod_timer(&mpath->timer, jiffies + mpath->discovery_timeout);
1049 
1050 enddiscovery:
1051  rcu_read_unlock();
1052  kfree(preq_node);
1053 }
1054 
1068  struct ieee80211_sub_if_data *sdata)
1069 {
1070  struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
1071  struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1072  struct mesh_path *mpath;
1073  struct sk_buff *skb_to_free = NULL;
1074  u8 *target_addr = hdr->addr3;
1075  int err = 0;
1076 
1077  rcu_read_lock();
1078  err = mesh_nexthop_lookup(skb, sdata);
1079  if (!err)
1080  goto endlookup;
1081 
1082  /* no nexthop found, start resolving */
1083  mpath = mesh_path_lookup(target_addr, sdata);
1084  if (!mpath) {
1085  mesh_path_add(target_addr, sdata);
1086  mpath = mesh_path_lookup(target_addr, sdata);
1087  if (!mpath) {
1088  mesh_path_discard_frame(skb, sdata);
1089  err = -ENOSPC;
1090  goto endlookup;
1091  }
1092  }
1093 
1094  if (!(mpath->flags & MESH_PATH_RESOLVING))
1095  mesh_queue_preq(mpath, PREQ_Q_F_START);
1096 
1097  if (skb_queue_len(&mpath->frame_queue) >= MESH_FRAME_QUEUE_LEN)
1098  skb_to_free = skb_dequeue(&mpath->frame_queue);
1099 
1101  ieee80211_set_qos_hdr(sdata, skb);
1102  skb_queue_tail(&mpath->frame_queue, skb);
1103  err = -ENOENT;
1104  if (skb_to_free)
1105  mesh_path_discard_frame(skb_to_free, sdata);
1106 
1107 endlookup:
1108  rcu_read_unlock();
1109  return err;
1110 }
1122  struct ieee80211_sub_if_data *sdata)
1123 {
1124  struct mesh_path *mpath;
1125  struct sta_info *next_hop;
1126  struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
1127  u8 *target_addr = hdr->addr3;
1128  int err = -ENOENT;
1129 
1130  rcu_read_lock();
1131  mpath = mesh_path_lookup(target_addr, sdata);
1132 
1133  if (!mpath || !(mpath->flags & MESH_PATH_ACTIVE))
1134  goto endlookup;
1135 
1136  if (time_after(jiffies,
1137  mpath->exp_time -
1138  msecs_to_jiffies(sdata->u.mesh.mshcfg.path_refresh_time)) &&
1139  ether_addr_equal(sdata->vif.addr, hdr->addr4) &&
1140  !(mpath->flags & MESH_PATH_RESOLVING) &&
1141  !(mpath->flags & MESH_PATH_FIXED))
1142  mesh_queue_preq(mpath, PREQ_Q_F_START | PREQ_Q_F_REFRESH);
1143 
1144  next_hop = rcu_dereference(mpath->next_hop);
1145  if (next_hop) {
1146  memcpy(hdr->addr1, next_hop->sta.addr, ETH_ALEN);
1147  memcpy(hdr->addr2, sdata->vif.addr, ETH_ALEN);
1148  err = 0;
1149  }
1150 
1151 endlookup:
1152  rcu_read_unlock();
1153  return err;
1154 }
1155 
1156 void mesh_path_timer(unsigned long data)
1157 {
1158  struct mesh_path *mpath = (void *) data;
1159  struct ieee80211_sub_if_data *sdata = mpath->sdata;
1160  int ret;
1161 
1162  if (sdata->local->quiescing)
1163  return;
1164 
1165  spin_lock_bh(&mpath->state_lock);
1166  if (mpath->flags & MESH_PATH_RESOLVED ||
1167  (!(mpath->flags & MESH_PATH_RESOLVING))) {
1169  spin_unlock_bh(&mpath->state_lock);
1170  } else if (mpath->discovery_retries < max_preq_retries(sdata)) {
1171  ++mpath->discovery_retries;
1172  mpath->discovery_timeout *= 2;
1173  mpath->flags &= ~MESH_PATH_REQ_QUEUED;
1174  spin_unlock_bh(&mpath->state_lock);
1175  mesh_queue_preq(mpath, 0);
1176  } else {
1177  mpath->flags = 0;
1178  mpath->exp_time = jiffies;
1179  spin_unlock_bh(&mpath->state_lock);
1180  if (!mpath->is_gate && mesh_gate_num(sdata) > 0) {
1181  ret = mesh_path_send_to_gates(mpath);
1182  if (ret)
1183  mhwmp_dbg(sdata, "no gate was reachable\n");
1184  } else
1185  mesh_path_flush_pending(mpath);
1186  }
1187 }
1188 
1189 void
1191 {
1192  struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
1193  u32 interval = ifmsh->mshcfg.dot11MeshHWMPRannInterval;
1194  u8 flags, target_flags = 0;
1195 
1196  flags = (ifmsh->mshcfg.dot11MeshGateAnnouncementProtocol)
1197  ? RANN_FLAG_IS_GATE : 0;
1198 
1199  switch (ifmsh->mshcfg.dot11MeshHWMPRootMode) {
1201  mesh_path_sel_frame_tx(MPATH_RANN, flags, sdata->vif.addr,
1202  cpu_to_le32(++ifmsh->sn),
1203  0, NULL, 0, broadcast_addr,
1204  0, ifmsh->mshcfg.element_ttl,
1205  cpu_to_le32(interval), 0, 0, sdata);
1206  break;
1210  interval = ifmsh->mshcfg.dot11MeshHWMPactivePathToRootTimeout;
1211  target_flags |= IEEE80211_PREQ_TO_FLAG |
1213  mesh_path_sel_frame_tx(MPATH_PREQ, flags, sdata->vif.addr,
1214  cpu_to_le32(++ifmsh->sn), target_flags,
1215  (u8 *) broadcast_addr, 0, broadcast_addr,
1216  0, ifmsh->mshcfg.element_ttl,
1217  cpu_to_le32(interval),
1218  0, cpu_to_le32(ifmsh->preq_id++), sdata);
1219  break;
1220  default:
1221  mhwmp_dbg(sdata, "Proactive mechanism not supported\n");
1222  return;
1223  }
1224 }