Lines Matching refs:mpath

18 static void mesh_path_free_rcu(struct mesh_table *tbl, struct mesh_path *mpath);
35 static inline bool mpath_expired(struct mesh_path *mpath) in mpath_expired() argument
37 return (mpath->flags & MESH_PATH_ACTIVE) && in mpath_expired()
38 time_after(jiffies, mpath->exp_time) && in mpath_expired()
39 !(mpath->flags & MESH_PATH_FIXED); in mpath_expired()
44 struct mesh_path *mpath = ptr; in mesh_path_rht_free() local
47 mesh_path_free_rcu(tbl, mpath); in mesh_path_rht_free()
78 void mesh_path_assign_nexthop(struct mesh_path *mpath, struct sta_info *sta) in mesh_path_assign_nexthop() argument
84 rcu_assign_pointer(mpath->next_hop, sta); in mesh_path_assign_nexthop()
86 spin_lock_irqsave(&mpath->frame_queue.lock, flags); in mesh_path_assign_nexthop()
87 skb_queue_walk(&mpath->frame_queue, skb) { in mesh_path_assign_nexthop()
90 memcpy(hdr->addr2, mpath->sdata->vif.addr, ETH_ALEN); in mesh_path_assign_nexthop()
94 spin_unlock_irqrestore(&mpath->frame_queue.lock, flags); in mesh_path_assign_nexthop()
209 struct mesh_path *mpath; in mpath_lookup() local
211 mpath = rhashtable_lookup(&tbl->rhead, dst, mesh_rht_params); in mpath_lookup()
213 if (mpath && mpath_expired(mpath)) { in mpath_lookup()
214 spin_lock_bh(&mpath->state_lock); in mpath_lookup()
215 mpath->flags &= ~MESH_PATH_ACTIVE; in mpath_lookup()
216 spin_unlock_bh(&mpath->state_lock); in mpath_lookup()
218 return mpath; in mpath_lookup()
246 struct mesh_path *mpath; in __mesh_path_lookup_by_idx() local
248 hlist_for_each_entry_rcu(mpath, &tbl->walk_head, walk_list) { in __mesh_path_lookup_by_idx()
253 if (!mpath) in __mesh_path_lookup_by_idx()
256 if (mpath_expired(mpath)) { in __mesh_path_lookup_by_idx()
257 spin_lock_bh(&mpath->state_lock); in __mesh_path_lookup_by_idx()
258 mpath->flags &= ~MESH_PATH_ACTIVE; in __mesh_path_lookup_by_idx()
259 spin_unlock_bh(&mpath->state_lock); in __mesh_path_lookup_by_idx()
261 return mpath; in __mesh_path_lookup_by_idx()
298 int mesh_path_add_gate(struct mesh_path *mpath) in mesh_path_add_gate() argument
304 tbl = &mpath->sdata->u.mesh.mesh_paths; in mesh_path_add_gate()
306 spin_lock_bh(&mpath->state_lock); in mesh_path_add_gate()
307 if (mpath->is_gate) { in mesh_path_add_gate()
309 spin_unlock_bh(&mpath->state_lock); in mesh_path_add_gate()
312 mpath->is_gate = true; in mesh_path_add_gate()
313 mpath->sdata->u.mesh.num_gates++; in mesh_path_add_gate()
316 hlist_add_head_rcu(&mpath->gate_list, &tbl->known_gates); in mesh_path_add_gate()
319 spin_unlock_bh(&mpath->state_lock); in mesh_path_add_gate()
321 mpath_dbg(mpath->sdata, in mesh_path_add_gate()
323 mpath->dst, mpath->sdata->u.mesh.num_gates); in mesh_path_add_gate()
335 static void mesh_gate_del(struct mesh_table *tbl, struct mesh_path *mpath) in mesh_gate_del() argument
337 lockdep_assert_held(&mpath->state_lock); in mesh_gate_del()
338 if (!mpath->is_gate) in mesh_gate_del()
341 mpath->is_gate = false; in mesh_gate_del()
343 hlist_del_rcu(&mpath->gate_list); in mesh_gate_del()
344 mpath->sdata->u.mesh.num_gates--; in mesh_gate_del()
347 mpath_dbg(mpath->sdata, in mesh_gate_del()
349 mpath->dst, mpath->sdata->u.mesh.num_gates); in mesh_gate_del()
397 struct mesh_path *mpath, *new_mpath; in mesh_path_add() local
415 mpath = rhashtable_lookup_get_insert_fast(&tbl->rhead, in mesh_path_add()
418 if (!mpath) in mesh_path_add()
422 if (mpath) { in mesh_path_add()
425 if (IS_ERR(mpath)) in mesh_path_add()
426 return mpath; in mesh_path_add()
428 new_mpath = mpath; in mesh_path_add()
486 struct mesh_path *mpath; in mesh_plink_broken() local
489 hlist_for_each_entry_rcu(mpath, &tbl->walk_head, walk_list) { in mesh_plink_broken()
490 if (rcu_access_pointer(mpath->next_hop) == sta && in mesh_plink_broken()
491 mpath->flags & MESH_PATH_ACTIVE && in mesh_plink_broken()
492 !(mpath->flags & MESH_PATH_FIXED)) { in mesh_plink_broken()
493 spin_lock_bh(&mpath->state_lock); in mesh_plink_broken()
494 mpath->flags &= ~MESH_PATH_ACTIVE; in mesh_plink_broken()
495 ++mpath->sn; in mesh_plink_broken()
496 spin_unlock_bh(&mpath->state_lock); in mesh_plink_broken()
499 mpath->dst, mpath->sn, in mesh_plink_broken()
507 struct mesh_path *mpath) in mesh_path_free_rcu() argument
509 struct ieee80211_sub_if_data *sdata = mpath->sdata; in mesh_path_free_rcu()
511 spin_lock_bh(&mpath->state_lock); in mesh_path_free_rcu()
512 mpath->flags |= MESH_PATH_RESOLVING | MESH_PATH_DELETED; in mesh_path_free_rcu()
513 mesh_gate_del(tbl, mpath); in mesh_path_free_rcu()
514 spin_unlock_bh(&mpath->state_lock); in mesh_path_free_rcu()
515 del_timer_sync(&mpath->timer); in mesh_path_free_rcu()
518 mesh_path_flush_pending(mpath); in mesh_path_free_rcu()
519 kfree_rcu(mpath, rcu); in mesh_path_free_rcu()
522 static void __mesh_path_del(struct mesh_table *tbl, struct mesh_path *mpath) in __mesh_path_del() argument
524 hlist_del_rcu(&mpath->walk_list); in __mesh_path_del()
525 rhashtable_remove_fast(&tbl->rhead, &mpath->rhash, mesh_rht_params); in __mesh_path_del()
526 mesh_path_free_rcu(tbl, mpath); in __mesh_path_del()
544 struct mesh_path *mpath; in mesh_path_flush_by_nexthop() local
548 hlist_for_each_entry_safe(mpath, n, &tbl->walk_head, walk_list) { in mesh_path_flush_by_nexthop()
549 if (rcu_access_pointer(mpath->next_hop) == sta) in mesh_path_flush_by_nexthop()
550 __mesh_path_del(tbl, mpath); in mesh_path_flush_by_nexthop()
559 struct mesh_path *mpath; in mpp_flush_by_proxy() local
563 hlist_for_each_entry_safe(mpath, n, &tbl->walk_head, walk_list) { in mpp_flush_by_proxy()
564 if (ether_addr_equal(mpath->mpp, proxy)) in mpp_flush_by_proxy()
565 __mesh_path_del(tbl, mpath); in mpp_flush_by_proxy()
572 struct mesh_path *mpath; in table_flush_by_iface() local
576 hlist_for_each_entry_safe(mpath, n, &tbl->walk_head, walk_list) { in table_flush_by_iface()
577 __mesh_path_del(tbl, mpath); in table_flush_by_iface()
609 struct mesh_path *mpath; in table_path_del() local
612 mpath = rhashtable_lookup_fast(&tbl->rhead, addr, mesh_rht_params); in table_path_del()
613 if (!mpath) { in table_path_del()
618 __mesh_path_del(tbl, mpath); in table_path_del()
652 void mesh_path_tx_pending(struct mesh_path *mpath) in mesh_path_tx_pending() argument
654 if (mpath->flags & MESH_PATH_ACTIVE) in mesh_path_tx_pending()
655 ieee80211_add_pending_skbs(mpath->sdata->local, in mesh_path_tx_pending()
656 &mpath->frame_queue); in mesh_path_tx_pending()
669 int mesh_path_send_to_gates(struct mesh_path *mpath) in mesh_path_send_to_gates() argument
671 struct ieee80211_sub_if_data *sdata = mpath->sdata; in mesh_path_send_to_gates()
673 struct mesh_path *from_mpath = mpath; in mesh_path_send_to_gates()
699 return (from_mpath == mpath) ? -EHOSTUNREACH : 0; in mesh_path_send_to_gates()
724 void mesh_path_flush_pending(struct mesh_path *mpath) in mesh_path_flush_pending() argument
728 while ((skb = skb_dequeue(&mpath->frame_queue)) != NULL) in mesh_path_flush_pending()
729 mesh_path_discard_frame(mpath->sdata, skb); in mesh_path_flush_pending()
740 void mesh_path_fix_nexthop(struct mesh_path *mpath, struct sta_info *next_hop) in mesh_path_fix_nexthop() argument
742 spin_lock_bh(&mpath->state_lock); in mesh_path_fix_nexthop()
743 mesh_path_assign_nexthop(mpath, next_hop); in mesh_path_fix_nexthop()
744 mpath->sn = 0xffff; in mesh_path_fix_nexthop()
745 mpath->metric = 0; in mesh_path_fix_nexthop()
746 mpath->hop_count = 0; in mesh_path_fix_nexthop()
747 mpath->exp_time = 0; in mesh_path_fix_nexthop()
748 mpath->flags = MESH_PATH_FIXED | MESH_PATH_SN_VALID; in mesh_path_fix_nexthop()
749 mesh_path_activate(mpath); in mesh_path_fix_nexthop()
750 spin_unlock_bh(&mpath->state_lock); in mesh_path_fix_nexthop()
754 mesh_path_tx_pending(mpath); in mesh_path_fix_nexthop()
767 struct mesh_path *mpath; in mesh_path_tbl_expire() local
771 hlist_for_each_entry_safe(mpath, n, &tbl->walk_head, walk_list) { in mesh_path_tbl_expire()
772 if ((!(mpath->flags & MESH_PATH_RESOLVING)) && in mesh_path_tbl_expire()
773 (!(mpath->flags & MESH_PATH_FIXED)) && in mesh_path_tbl_expire()
774 time_after(jiffies, mpath->exp_time + MESH_PATH_EXPIRE)) in mesh_path_tbl_expire()
775 __mesh_path_del(tbl, mpath); in mesh_path_tbl_expire()