• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2008, 2009 open80211s Ltd.
4  * Author:     Luis Carlos Cobo <luisca@cozybit.com>
5  */
6 
7 #include <linux/etherdevice.h>
8 #include <linux/list.h>
9 #include <linux/random.h>
10 #include <linux/slab.h>
11 #include <linux/spinlock.h>
12 #include <linux/string.h>
13 #include <net/mac80211.h>
14 #include "wme.h"
15 #include "ieee80211_i.h"
16 #include "mesh.h"
17 
18 static void mesh_path_free_rcu(struct mesh_table *tbl, struct mesh_path *mpath);
19 
mesh_table_hash(const void * addr,u32 len,u32 seed)20 static u32 mesh_table_hash(const void *addr, u32 len, u32 seed)
21 {
22 	/* Use last four bytes of hw addr as hash index */
23 	return jhash_1word(__get_unaligned_cpu32((u8 *)addr + 2), seed);
24 }
25 
26 static const struct rhashtable_params mesh_rht_params = {
27 	.nelem_hint = 2,
28 	.automatic_shrinking = true,
29 	.key_len = ETH_ALEN,
30 	.key_offset = offsetof(struct mesh_path, dst),
31 	.head_offset = offsetof(struct mesh_path, rhash),
32 	.hashfn = mesh_table_hash,
33 };
34 
mpath_expired(struct mesh_path * mpath)35 static inline bool mpath_expired(struct mesh_path *mpath)
36 {
37 	return (mpath->flags & MESH_PATH_ACTIVE) &&
38 	       time_after(jiffies, mpath->exp_time) &&
39 	       !(mpath->flags & MESH_PATH_FIXED);
40 }
41 
mesh_path_rht_free(void * ptr,void * tblptr)42 static void mesh_path_rht_free(void *ptr, void *tblptr)
43 {
44 	struct mesh_path *mpath = ptr;
45 	struct mesh_table *tbl = tblptr;
46 
47 	mesh_path_free_rcu(tbl, mpath);
48 }
49 
mesh_table_init(struct mesh_table * tbl)50 static void mesh_table_init(struct mesh_table *tbl)
51 {
52 	INIT_HLIST_HEAD(&tbl->known_gates);
53 	INIT_HLIST_HEAD(&tbl->walk_head);
54 	atomic_set(&tbl->entries,  0);
55 	spin_lock_init(&tbl->gates_lock);
56 	spin_lock_init(&tbl->walk_lock);
57 
58 	/* rhashtable_init() may fail only in case of wrong
59 	 * mesh_rht_params
60 	 */
61 	WARN_ON(rhashtable_init(&tbl->rhead, &mesh_rht_params));
62 }
63 
mesh_table_free(struct mesh_table * tbl)64 static void mesh_table_free(struct mesh_table *tbl)
65 {
66 	rhashtable_free_and_destroy(&tbl->rhead,
67 				    mesh_path_rht_free, tbl);
68 }
69 
70 /**
71  *
72  * mesh_path_assign_nexthop - update mesh path next hop
73  *
74  * @mpath: mesh path to update
75  * @sta: next hop to assign
76  *
77  * Locking: mpath->state_lock must be held when calling this function
78  */
mesh_path_assign_nexthop(struct mesh_path * mpath,struct sta_info * sta)79 void mesh_path_assign_nexthop(struct mesh_path *mpath, struct sta_info *sta)
80 {
81 	struct sk_buff *skb;
82 	struct ieee80211_hdr *hdr;
83 	unsigned long flags;
84 
85 	rcu_assign_pointer(mpath->next_hop, sta);
86 
87 	spin_lock_irqsave(&mpath->frame_queue.lock, flags);
88 	skb_queue_walk(&mpath->frame_queue, skb) {
89 		hdr = (struct ieee80211_hdr *) skb->data;
90 		memcpy(hdr->addr1, sta->sta.addr, ETH_ALEN);
91 		memcpy(hdr->addr2, mpath->sdata->vif.addr, ETH_ALEN);
92 		ieee80211_mps_set_frame_flags(sta->sdata, sta, hdr);
93 	}
94 
95 	spin_unlock_irqrestore(&mpath->frame_queue.lock, flags);
96 }
97 
prepare_for_gate(struct sk_buff * skb,char * dst_addr,struct mesh_path * gate_mpath)98 static void prepare_for_gate(struct sk_buff *skb, char *dst_addr,
99 			     struct mesh_path *gate_mpath)
100 {
101 	struct ieee80211_hdr *hdr;
102 	struct ieee80211s_hdr *mshdr;
103 	int mesh_hdrlen, hdrlen;
104 	char *next_hop;
105 
106 	hdr = (struct ieee80211_hdr *) skb->data;
107 	hdrlen = ieee80211_hdrlen(hdr->frame_control);
108 	mshdr = (struct ieee80211s_hdr *) (skb->data + hdrlen);
109 
110 	if (!(mshdr->flags & MESH_FLAGS_AE)) {
111 		/* size of the fixed part of the mesh header */
112 		mesh_hdrlen = 6;
113 
114 		/* make room for the two extended addresses */
115 		skb_push(skb, 2 * ETH_ALEN);
116 		memmove(skb->data, hdr, hdrlen + mesh_hdrlen);
117 
118 		hdr = (struct ieee80211_hdr *) skb->data;
119 
120 		/* we preserve the previous mesh header and only add
121 		 * the new addreses */
122 		mshdr = (struct ieee80211s_hdr *) (skb->data + hdrlen);
123 		mshdr->flags = MESH_FLAGS_AE_A5_A6;
124 		memcpy(mshdr->eaddr1, hdr->addr3, ETH_ALEN);
125 		memcpy(mshdr->eaddr2, hdr->addr4, ETH_ALEN);
126 	}
127 
128 	/* update next hop */
129 	hdr = (struct ieee80211_hdr *) skb->data;
130 	rcu_read_lock();
131 	next_hop = rcu_dereference(gate_mpath->next_hop)->sta.addr;
132 	memcpy(hdr->addr1, next_hop, ETH_ALEN);
133 	rcu_read_unlock();
134 	memcpy(hdr->addr2, gate_mpath->sdata->vif.addr, ETH_ALEN);
135 	memcpy(hdr->addr3, dst_addr, ETH_ALEN);
136 }
137 
138 /**
139  *
140  * mesh_path_move_to_queue - Move or copy frames from one mpath queue to another
141  *
142  * This function is used to transfer or copy frames from an unresolved mpath to
143  * a gate mpath.  The function also adds the Address Extension field and
144  * updates the next hop.
145  *
146  * If a frame already has an Address Extension field, only the next hop and
147  * destination addresses are updated.
148  *
149  * The gate mpath must be an active mpath with a valid mpath->next_hop.
150  *
151  * @mpath: An active mpath the frames will be sent to (i.e. the gate)
152  * @from_mpath: The failed mpath
153  * @copy: When true, copy all the frames to the new mpath queue.  When false,
154  * move them.
155  */
mesh_path_move_to_queue(struct mesh_path * gate_mpath,struct mesh_path * from_mpath,bool copy)156 static void mesh_path_move_to_queue(struct mesh_path *gate_mpath,
157 				    struct mesh_path *from_mpath,
158 				    bool copy)
159 {
160 	struct sk_buff *skb, *fskb, *tmp;
161 	struct sk_buff_head failq;
162 	unsigned long flags;
163 
164 	if (WARN_ON(gate_mpath == from_mpath))
165 		return;
166 	if (WARN_ON(!gate_mpath->next_hop))
167 		return;
168 
169 	__skb_queue_head_init(&failq);
170 
171 	spin_lock_irqsave(&from_mpath->frame_queue.lock, flags);
172 	skb_queue_splice_init(&from_mpath->frame_queue, &failq);
173 	spin_unlock_irqrestore(&from_mpath->frame_queue.lock, flags);
174 
175 	skb_queue_walk_safe(&failq, fskb, tmp) {
176 		if (skb_queue_len(&gate_mpath->frame_queue) >=
177 				  MESH_FRAME_QUEUE_LEN) {
178 			mpath_dbg(gate_mpath->sdata, "mpath queue full!\n");
179 			break;
180 		}
181 
182 		skb = skb_copy(fskb, GFP_ATOMIC);
183 		if (WARN_ON(!skb))
184 			break;
185 
186 		prepare_for_gate(skb, gate_mpath->dst, gate_mpath);
187 		skb_queue_tail(&gate_mpath->frame_queue, skb);
188 
189 		if (copy)
190 			continue;
191 
192 		__skb_unlink(fskb, &failq);
193 		kfree_skb(fskb);
194 	}
195 
196 	mpath_dbg(gate_mpath->sdata, "Mpath queue for gate %pM has %d frames\n",
197 		  gate_mpath->dst, skb_queue_len(&gate_mpath->frame_queue));
198 
199 	if (!copy)
200 		return;
201 
202 	spin_lock_irqsave(&from_mpath->frame_queue.lock, flags);
203 	skb_queue_splice(&failq, &from_mpath->frame_queue);
204 	spin_unlock_irqrestore(&from_mpath->frame_queue.lock, flags);
205 }
206 
207 
mpath_lookup(struct mesh_table * tbl,const u8 * dst,struct ieee80211_sub_if_data * sdata)208 static struct mesh_path *mpath_lookup(struct mesh_table *tbl, const u8 *dst,
209 				      struct ieee80211_sub_if_data *sdata)
210 {
211 	struct mesh_path *mpath;
212 
213 	mpath = rhashtable_lookup(&tbl->rhead, dst, mesh_rht_params);
214 
215 	if (mpath && mpath_expired(mpath)) {
216 		spin_lock_bh(&mpath->state_lock);
217 		mpath->flags &= ~MESH_PATH_ACTIVE;
218 		spin_unlock_bh(&mpath->state_lock);
219 	}
220 	return mpath;
221 }
222 
223 /**
224  * mesh_path_lookup - look up a path in the mesh path table
225  * @sdata: local subif
226  * @dst: hardware address (ETH_ALEN length) of destination
227  *
228  * Returns: pointer to the mesh path structure, or NULL if not found
229  *
230  * Locking: must be called within a read rcu section.
231  */
232 struct mesh_path *
mesh_path_lookup(struct ieee80211_sub_if_data * sdata,const u8 * dst)233 mesh_path_lookup(struct ieee80211_sub_if_data *sdata, const u8 *dst)
234 {
235 	return mpath_lookup(&sdata->u.mesh.mesh_paths, dst, sdata);
236 }
237 
238 struct mesh_path *
mpp_path_lookup(struct ieee80211_sub_if_data * sdata,const u8 * dst)239 mpp_path_lookup(struct ieee80211_sub_if_data *sdata, const u8 *dst)
240 {
241 	return mpath_lookup(&sdata->u.mesh.mpp_paths, dst, sdata);
242 }
243 
244 static struct mesh_path *
__mesh_path_lookup_by_idx(struct mesh_table * tbl,int idx)245 __mesh_path_lookup_by_idx(struct mesh_table *tbl, int idx)
246 {
247 	int i = 0;
248 	struct mesh_path *mpath;
249 
250 	hlist_for_each_entry_rcu(mpath, &tbl->walk_head, walk_list) {
251 		if (i++ == idx)
252 			break;
253 	}
254 
255 	if (!mpath)
256 		return NULL;
257 
258 	if (mpath_expired(mpath)) {
259 		spin_lock_bh(&mpath->state_lock);
260 		mpath->flags &= ~MESH_PATH_ACTIVE;
261 		spin_unlock_bh(&mpath->state_lock);
262 	}
263 	return mpath;
264 }
265 
266 /**
267  * mesh_path_lookup_by_idx - look up a path in the mesh path table by its index
268  * @idx: index
269  * @sdata: local subif, or NULL for all entries
270  *
271  * Returns: pointer to the mesh path structure, or NULL if not found.
272  *
273  * Locking: must be called within a read rcu section.
274  */
275 struct mesh_path *
mesh_path_lookup_by_idx(struct ieee80211_sub_if_data * sdata,int idx)276 mesh_path_lookup_by_idx(struct ieee80211_sub_if_data *sdata, int idx)
277 {
278 	return __mesh_path_lookup_by_idx(&sdata->u.mesh.mesh_paths, idx);
279 }
280 
281 /**
282  * mpp_path_lookup_by_idx - look up a path in the proxy path table by its index
283  * @idx: index
284  * @sdata: local subif, or NULL for all entries
285  *
286  * Returns: pointer to the proxy path structure, or NULL if not found.
287  *
288  * Locking: must be called within a read rcu section.
289  */
290 struct mesh_path *
mpp_path_lookup_by_idx(struct ieee80211_sub_if_data * sdata,int idx)291 mpp_path_lookup_by_idx(struct ieee80211_sub_if_data *sdata, int idx)
292 {
293 	return __mesh_path_lookup_by_idx(&sdata->u.mesh.mpp_paths, idx);
294 }
295 
296 /**
297  * mesh_path_add_gate - add the given mpath to a mesh gate to our path table
298  * @mpath: gate path to add to table
299  */
mesh_path_add_gate(struct mesh_path * mpath)300 int mesh_path_add_gate(struct mesh_path *mpath)
301 {
302 	struct mesh_table *tbl;
303 	int err;
304 
305 	rcu_read_lock();
306 	tbl = &mpath->sdata->u.mesh.mesh_paths;
307 
308 	spin_lock_bh(&mpath->state_lock);
309 	if (mpath->is_gate) {
310 		err = -EEXIST;
311 		spin_unlock_bh(&mpath->state_lock);
312 		goto err_rcu;
313 	}
314 	mpath->is_gate = true;
315 	mpath->sdata->u.mesh.num_gates++;
316 
317 	spin_lock(&tbl->gates_lock);
318 	hlist_add_head_rcu(&mpath->gate_list, &tbl->known_gates);
319 	spin_unlock(&tbl->gates_lock);
320 
321 	spin_unlock_bh(&mpath->state_lock);
322 
323 	mpath_dbg(mpath->sdata,
324 		  "Mesh path: Recorded new gate: %pM. %d known gates\n",
325 		  mpath->dst, mpath->sdata->u.mesh.num_gates);
326 	err = 0;
327 err_rcu:
328 	rcu_read_unlock();
329 	return err;
330 }
331 
332 /**
333  * mesh_gate_del - remove a mesh gate from the list of known gates
334  * @tbl: table which holds our list of known gates
335  * @mpath: gate mpath
336  */
mesh_gate_del(struct mesh_table * tbl,struct mesh_path * mpath)337 static void mesh_gate_del(struct mesh_table *tbl, struct mesh_path *mpath)
338 {
339 	lockdep_assert_held(&mpath->state_lock);
340 	if (!mpath->is_gate)
341 		return;
342 
343 	mpath->is_gate = false;
344 	spin_lock_bh(&tbl->gates_lock);
345 	hlist_del_rcu(&mpath->gate_list);
346 	mpath->sdata->u.mesh.num_gates--;
347 	spin_unlock_bh(&tbl->gates_lock);
348 
349 	mpath_dbg(mpath->sdata,
350 		  "Mesh path: Deleted gate: %pM. %d known gates\n",
351 		  mpath->dst, mpath->sdata->u.mesh.num_gates);
352 }
353 
354 /**
355  * mesh_gate_num - number of gates known to this interface
356  * @sdata: subif data
357  */
mesh_gate_num(struct ieee80211_sub_if_data * sdata)358 int mesh_gate_num(struct ieee80211_sub_if_data *sdata)
359 {
360 	return sdata->u.mesh.num_gates;
361 }
362 
363 static
mesh_path_new(struct ieee80211_sub_if_data * sdata,const u8 * dst,gfp_t gfp_flags)364 struct mesh_path *mesh_path_new(struct ieee80211_sub_if_data *sdata,
365 				const u8 *dst, gfp_t gfp_flags)
366 {
367 	struct mesh_path *new_mpath;
368 
369 	new_mpath = kzalloc(sizeof(struct mesh_path), gfp_flags);
370 	if (!new_mpath)
371 		return NULL;
372 
373 	memcpy(new_mpath->dst, dst, ETH_ALEN);
374 	eth_broadcast_addr(new_mpath->rann_snd_addr);
375 	new_mpath->is_root = false;
376 	new_mpath->sdata = sdata;
377 	new_mpath->flags = 0;
378 	skb_queue_head_init(&new_mpath->frame_queue);
379 	new_mpath->exp_time = jiffies;
380 	spin_lock_init(&new_mpath->state_lock);
381 	timer_setup(&new_mpath->timer, mesh_path_timer, 0);
382 
383 	return new_mpath;
384 }
385 
386 /**
387  * mesh_path_add - allocate and add a new path to the mesh path table
388  * @dst: destination address of the path (ETH_ALEN length)
389  * @sdata: local subif
390  *
391  * Returns: 0 on success
392  *
393  * State: the initial state of the new path is set to 0
394  */
mesh_path_add(struct ieee80211_sub_if_data * sdata,const u8 * dst)395 struct mesh_path *mesh_path_add(struct ieee80211_sub_if_data *sdata,
396 				const u8 *dst)
397 {
398 	struct mesh_table *tbl;
399 	struct mesh_path *mpath, *new_mpath;
400 
401 	if (ether_addr_equal(dst, sdata->vif.addr))
402 		/* never add ourselves as neighbours */
403 		return ERR_PTR(-ENOTSUPP);
404 
405 	if (is_multicast_ether_addr(dst))
406 		return ERR_PTR(-ENOTSUPP);
407 
408 	if (atomic_add_unless(&sdata->u.mesh.mpaths, 1, MESH_MAX_MPATHS) == 0)
409 		return ERR_PTR(-ENOSPC);
410 
411 	new_mpath = mesh_path_new(sdata, dst, GFP_ATOMIC);
412 	if (!new_mpath)
413 		return ERR_PTR(-ENOMEM);
414 
415 	tbl = &sdata->u.mesh.mesh_paths;
416 	spin_lock_bh(&tbl->walk_lock);
417 	mpath = rhashtable_lookup_get_insert_fast(&tbl->rhead,
418 						  &new_mpath->rhash,
419 						  mesh_rht_params);
420 	if (!mpath)
421 		hlist_add_head(&new_mpath->walk_list, &tbl->walk_head);
422 	spin_unlock_bh(&tbl->walk_lock);
423 
424 	if (mpath) {
425 		kfree(new_mpath);
426 
427 		if (IS_ERR(mpath))
428 			return mpath;
429 
430 		new_mpath = mpath;
431 	}
432 
433 	sdata->u.mesh.mesh_paths_generation++;
434 	return new_mpath;
435 }
436 
mpp_path_add(struct ieee80211_sub_if_data * sdata,const u8 * dst,const u8 * mpp)437 int mpp_path_add(struct ieee80211_sub_if_data *sdata,
438 		 const u8 *dst, const u8 *mpp)
439 {
440 	struct mesh_table *tbl;
441 	struct mesh_path *new_mpath;
442 	int ret;
443 
444 	if (ether_addr_equal(dst, sdata->vif.addr))
445 		/* never add ourselves as neighbours */
446 		return -ENOTSUPP;
447 
448 	if (is_multicast_ether_addr(dst))
449 		return -ENOTSUPP;
450 
451 	new_mpath = mesh_path_new(sdata, dst, GFP_ATOMIC);
452 
453 	if (!new_mpath)
454 		return -ENOMEM;
455 
456 	memcpy(new_mpath->mpp, mpp, ETH_ALEN);
457 	tbl = &sdata->u.mesh.mpp_paths;
458 
459 	spin_lock_bh(&tbl->walk_lock);
460 	ret = rhashtable_lookup_insert_fast(&tbl->rhead,
461 					    &new_mpath->rhash,
462 					    mesh_rht_params);
463 	if (!ret)
464 		hlist_add_head_rcu(&new_mpath->walk_list, &tbl->walk_head);
465 	spin_unlock_bh(&tbl->walk_lock);
466 
467 	if (ret)
468 		kfree(new_mpath);
469 
470 	sdata->u.mesh.mpp_paths_generation++;
471 	return ret;
472 }
473 
474 
475 /**
476  * mesh_plink_broken - deactivates paths and sends perr when a link breaks
477  *
478  * @sta: broken peer link
479  *
480  * This function must be called from the rate control algorithm if enough
481  * delivery errors suggest that a peer link is no longer usable.
482  */
mesh_plink_broken(struct sta_info * sta)483 void mesh_plink_broken(struct sta_info *sta)
484 {
485 	struct ieee80211_sub_if_data *sdata = sta->sdata;
486 	struct mesh_table *tbl = &sdata->u.mesh.mesh_paths;
487 	static const u8 bcast[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
488 	struct mesh_path *mpath;
489 
490 	rcu_read_lock();
491 	hlist_for_each_entry_rcu(mpath, &tbl->walk_head, walk_list) {
492 		if (rcu_access_pointer(mpath->next_hop) == sta &&
493 		    mpath->flags & MESH_PATH_ACTIVE &&
494 		    !(mpath->flags & MESH_PATH_FIXED)) {
495 			spin_lock_bh(&mpath->state_lock);
496 			mpath->flags &= ~MESH_PATH_ACTIVE;
497 			++mpath->sn;
498 			spin_unlock_bh(&mpath->state_lock);
499 			mesh_path_error_tx(sdata,
500 				sdata->u.mesh.mshcfg.element_ttl,
501 				mpath->dst, mpath->sn,
502 				WLAN_REASON_MESH_PATH_DEST_UNREACHABLE, bcast);
503 		}
504 	}
505 	rcu_read_unlock();
506 }
507 
mesh_path_free_rcu(struct mesh_table * tbl,struct mesh_path * mpath)508 static void mesh_path_free_rcu(struct mesh_table *tbl,
509 			       struct mesh_path *mpath)
510 {
511 	struct ieee80211_sub_if_data *sdata = mpath->sdata;
512 
513 	spin_lock_bh(&mpath->state_lock);
514 	mpath->flags |= MESH_PATH_RESOLVING | MESH_PATH_DELETED;
515 	mesh_gate_del(tbl, mpath);
516 	spin_unlock_bh(&mpath->state_lock);
517 	del_timer_sync(&mpath->timer);
518 	atomic_dec(&sdata->u.mesh.mpaths);
519 	atomic_dec(&tbl->entries);
520 	mesh_path_flush_pending(mpath);
521 	kfree_rcu(mpath, rcu);
522 }
523 
__mesh_path_del(struct mesh_table * tbl,struct mesh_path * mpath)524 static void __mesh_path_del(struct mesh_table *tbl, struct mesh_path *mpath)
525 {
526 	hlist_del_rcu(&mpath->walk_list);
527 	rhashtable_remove_fast(&tbl->rhead, &mpath->rhash, mesh_rht_params);
528 	mesh_path_free_rcu(tbl, mpath);
529 }
530 
531 /**
532  * mesh_path_flush_by_nexthop - Deletes mesh paths if their next hop matches
533  *
534  * @sta: mesh peer to match
535  *
536  * RCU notes: this function is called when a mesh plink transitions from
537  * PLINK_ESTAB to any other state, since PLINK_ESTAB state is the only one that
538  * allows path creation. This will happen before the sta can be freed (because
539  * sta_info_destroy() calls this) so any reader in a rcu read block will be
540  * protected against the plink disappearing.
541  */
mesh_path_flush_by_nexthop(struct sta_info * sta)542 void mesh_path_flush_by_nexthop(struct sta_info *sta)
543 {
544 	struct ieee80211_sub_if_data *sdata = sta->sdata;
545 	struct mesh_table *tbl = &sdata->u.mesh.mesh_paths;
546 	struct mesh_path *mpath;
547 	struct hlist_node *n;
548 
549 	spin_lock_bh(&tbl->walk_lock);
550 	hlist_for_each_entry_safe(mpath, n, &tbl->walk_head, walk_list) {
551 		if (rcu_access_pointer(mpath->next_hop) == sta)
552 			__mesh_path_del(tbl, mpath);
553 	}
554 	spin_unlock_bh(&tbl->walk_lock);
555 }
556 
mpp_flush_by_proxy(struct ieee80211_sub_if_data * sdata,const u8 * proxy)557 static void mpp_flush_by_proxy(struct ieee80211_sub_if_data *sdata,
558 			       const u8 *proxy)
559 {
560 	struct mesh_table *tbl = &sdata->u.mesh.mpp_paths;
561 	struct mesh_path *mpath;
562 	struct hlist_node *n;
563 
564 	spin_lock_bh(&tbl->walk_lock);
565 	hlist_for_each_entry_safe(mpath, n, &tbl->walk_head, walk_list) {
566 		if (ether_addr_equal(mpath->mpp, proxy))
567 			__mesh_path_del(tbl, mpath);
568 	}
569 	spin_unlock_bh(&tbl->walk_lock);
570 }
571 
table_flush_by_iface(struct mesh_table * tbl)572 static void table_flush_by_iface(struct mesh_table *tbl)
573 {
574 	struct mesh_path *mpath;
575 	struct hlist_node *n;
576 
577 	spin_lock_bh(&tbl->walk_lock);
578 	hlist_for_each_entry_safe(mpath, n, &tbl->walk_head, walk_list) {
579 		__mesh_path_del(tbl, mpath);
580 	}
581 	spin_unlock_bh(&tbl->walk_lock);
582 }
583 
584 /**
585  * mesh_path_flush_by_iface - Deletes all mesh paths associated with a given iface
586  *
587  * This function deletes both mesh paths as well as mesh portal paths.
588  *
589  * @sdata: interface data to match
590  *
591  */
mesh_path_flush_by_iface(struct ieee80211_sub_if_data * sdata)592 void mesh_path_flush_by_iface(struct ieee80211_sub_if_data *sdata)
593 {
594 	table_flush_by_iface(&sdata->u.mesh.mesh_paths);
595 	table_flush_by_iface(&sdata->u.mesh.mpp_paths);
596 }
597 
598 /**
599  * table_path_del - delete a path from the mesh or mpp table
600  *
601  * @tbl: mesh or mpp path table
602  * @sdata: local subif
603  * @addr: dst address (ETH_ALEN length)
604  *
605  * Returns: 0 if successful
606  */
table_path_del(struct mesh_table * tbl,struct ieee80211_sub_if_data * sdata,const u8 * addr)607 static int table_path_del(struct mesh_table *tbl,
608 			  struct ieee80211_sub_if_data *sdata,
609 			  const u8 *addr)
610 {
611 	struct mesh_path *mpath;
612 
613 	spin_lock_bh(&tbl->walk_lock);
614 	mpath = rhashtable_lookup_fast(&tbl->rhead, addr, mesh_rht_params);
615 	if (!mpath) {
616 		spin_unlock_bh(&tbl->walk_lock);
617 		return -ENXIO;
618 	}
619 
620 	__mesh_path_del(tbl, mpath);
621 	spin_unlock_bh(&tbl->walk_lock);
622 	return 0;
623 }
624 
625 
626 /**
627  * mesh_path_del - delete a mesh path from the table
628  *
629  * @addr: dst address (ETH_ALEN length)
630  * @sdata: local subif
631  *
632  * Returns: 0 if successful
633  */
mesh_path_del(struct ieee80211_sub_if_data * sdata,const u8 * addr)634 int mesh_path_del(struct ieee80211_sub_if_data *sdata, const u8 *addr)
635 {
636 	int err;
637 
638 	/* flush relevant mpp entries first */
639 	mpp_flush_by_proxy(sdata, addr);
640 
641 	err = table_path_del(&sdata->u.mesh.mesh_paths, sdata, addr);
642 	sdata->u.mesh.mesh_paths_generation++;
643 	return err;
644 }
645 
646 /**
647  * mesh_path_tx_pending - sends pending frames in a mesh path queue
648  *
649  * @mpath: mesh path to activate
650  *
651  * Locking: the state_lock of the mpath structure must NOT be held when calling
652  * this function.
653  */
mesh_path_tx_pending(struct mesh_path * mpath)654 void mesh_path_tx_pending(struct mesh_path *mpath)
655 {
656 	if (mpath->flags & MESH_PATH_ACTIVE)
657 		ieee80211_add_pending_skbs(mpath->sdata->local,
658 				&mpath->frame_queue);
659 }
660 
661 /**
662  * mesh_path_send_to_gates - sends pending frames to all known mesh gates
663  *
664  * @mpath: mesh path whose queue will be emptied
665  *
666  * If there is only one gate, the frames are transferred from the failed mpath
667  * queue to that gate's queue.  If there are more than one gates, the frames
668  * are copied from each gate to the next.  After frames are copied, the
669  * mpath queues are emptied onto the transmission queue.
670  */
mesh_path_send_to_gates(struct mesh_path * mpath)671 int mesh_path_send_to_gates(struct mesh_path *mpath)
672 {
673 	struct ieee80211_sub_if_data *sdata = mpath->sdata;
674 	struct mesh_table *tbl;
675 	struct mesh_path *from_mpath = mpath;
676 	struct mesh_path *gate;
677 	bool copy = false;
678 
679 	tbl = &sdata->u.mesh.mesh_paths;
680 
681 	rcu_read_lock();
682 	hlist_for_each_entry_rcu(gate, &tbl->known_gates, gate_list) {
683 		if (gate->flags & MESH_PATH_ACTIVE) {
684 			mpath_dbg(sdata, "Forwarding to %pM\n", gate->dst);
685 			mesh_path_move_to_queue(gate, from_mpath, copy);
686 			from_mpath = gate;
687 			copy = true;
688 		} else {
689 			mpath_dbg(sdata,
690 				  "Not forwarding to %pM (flags %#x)\n",
691 				  gate->dst, gate->flags);
692 		}
693 	}
694 
695 	hlist_for_each_entry_rcu(gate, &tbl->known_gates, gate_list) {
696 		mpath_dbg(sdata, "Sending to %pM\n", gate->dst);
697 		mesh_path_tx_pending(gate);
698 	}
699 	rcu_read_unlock();
700 
701 	return (from_mpath == mpath) ? -EHOSTUNREACH : 0;
702 }
703 
704 /**
705  * mesh_path_discard_frame - discard a frame whose path could not be resolved
706  *
707  * @skb: frame to discard
708  * @sdata: network subif the frame was to be sent through
709  *
710  * Locking: the function must me called within a rcu_read_lock region
711  */
mesh_path_discard_frame(struct ieee80211_sub_if_data * sdata,struct sk_buff * skb)712 void mesh_path_discard_frame(struct ieee80211_sub_if_data *sdata,
713 			     struct sk_buff *skb)
714 {
715 	ieee80211_free_txskb(&sdata->local->hw, skb);
716 	sdata->u.mesh.mshstats.dropped_frames_no_route++;
717 }
718 
719 /**
720  * mesh_path_flush_pending - free the pending queue of a mesh path
721  *
722  * @mpath: mesh path whose queue has to be freed
723  *
724  * Locking: the function must me called within a rcu_read_lock region
725  */
mesh_path_flush_pending(struct mesh_path * mpath)726 void mesh_path_flush_pending(struct mesh_path *mpath)
727 {
728 	struct sk_buff *skb;
729 
730 	while ((skb = skb_dequeue(&mpath->frame_queue)) != NULL)
731 		mesh_path_discard_frame(mpath->sdata, skb);
732 }
733 
734 /**
735  * mesh_path_fix_nexthop - force a specific next hop for a mesh path
736  *
737  * @mpath: the mesh path to modify
738  * @next_hop: the next hop to force
739  *
740  * Locking: this function must be called holding mpath->state_lock
741  */
mesh_path_fix_nexthop(struct mesh_path * mpath,struct sta_info * next_hop)742 void mesh_path_fix_nexthop(struct mesh_path *mpath, struct sta_info *next_hop)
743 {
744 	spin_lock_bh(&mpath->state_lock);
745 	mesh_path_assign_nexthop(mpath, next_hop);
746 	mpath->sn = 0xffff;
747 	mpath->metric = 0;
748 	mpath->hop_count = 0;
749 	mpath->exp_time = 0;
750 	mpath->flags = MESH_PATH_FIXED | MESH_PATH_SN_VALID;
751 	mesh_path_activate(mpath);
752 	spin_unlock_bh(&mpath->state_lock);
753 	ewma_mesh_fail_avg_init(&next_hop->mesh->fail_avg);
754 	/* init it at a low value - 0 start is tricky */
755 	ewma_mesh_fail_avg_add(&next_hop->mesh->fail_avg, 1);
756 	mesh_path_tx_pending(mpath);
757 }
758 
mesh_pathtbl_init(struct ieee80211_sub_if_data * sdata)759 void mesh_pathtbl_init(struct ieee80211_sub_if_data *sdata)
760 {
761 	mesh_table_init(&sdata->u.mesh.mesh_paths);
762 	mesh_table_init(&sdata->u.mesh.mpp_paths);
763 }
764 
765 static
mesh_path_tbl_expire(struct ieee80211_sub_if_data * sdata,struct mesh_table * tbl)766 void mesh_path_tbl_expire(struct ieee80211_sub_if_data *sdata,
767 			  struct mesh_table *tbl)
768 {
769 	struct mesh_path *mpath;
770 	struct hlist_node *n;
771 
772 	spin_lock_bh(&tbl->walk_lock);
773 	hlist_for_each_entry_safe(mpath, n, &tbl->walk_head, walk_list) {
774 		if ((!(mpath->flags & MESH_PATH_RESOLVING)) &&
775 		    (!(mpath->flags & MESH_PATH_FIXED)) &&
776 		     time_after(jiffies, mpath->exp_time + MESH_PATH_EXPIRE))
777 			__mesh_path_del(tbl, mpath);
778 	}
779 	spin_unlock_bh(&tbl->walk_lock);
780 }
781 
mesh_path_expire(struct ieee80211_sub_if_data * sdata)782 void mesh_path_expire(struct ieee80211_sub_if_data *sdata)
783 {
784 	mesh_path_tbl_expire(sdata, &sdata->u.mesh.mesh_paths);
785 	mesh_path_tbl_expire(sdata, &sdata->u.mesh.mpp_paths);
786 }
787 
mesh_pathtbl_unregister(struct ieee80211_sub_if_data * sdata)788 void mesh_pathtbl_unregister(struct ieee80211_sub_if_data *sdata)
789 {
790 	mesh_table_free(&sdata->u.mesh.mesh_paths);
791 	mesh_table_free(&sdata->u.mesh.mpp_paths);
792 }
793