Lines Matching refs:mpath
21 static void mesh_path_free_rcu(struct mesh_table *tbl, struct mesh_path *mpath);
38 static inline bool mpath_expired(struct mesh_path *mpath) in mpath_expired() argument
40 return (mpath->flags & MESH_PATH_ACTIVE) && in mpath_expired()
41 time_after(jiffies, mpath->exp_time) && in mpath_expired()
42 !(mpath->flags & MESH_PATH_FIXED); in mpath_expired()
47 struct mesh_path *mpath = ptr; in mesh_path_rht_free() local
50 mesh_path_free_rcu(tbl, mpath); in mesh_path_rht_free()
84 void mesh_path_assign_nexthop(struct mesh_path *mpath, struct sta_info *sta) in mesh_path_assign_nexthop() argument
90 rcu_assign_pointer(mpath->next_hop, sta); in mesh_path_assign_nexthop()
92 spin_lock_irqsave(&mpath->frame_queue.lock, flags); in mesh_path_assign_nexthop()
93 skb_queue_walk(&mpath->frame_queue, skb) { in mesh_path_assign_nexthop()
96 memcpy(hdr->addr2, mpath->sdata->vif.addr, ETH_ALEN); in mesh_path_assign_nexthop()
100 spin_unlock_irqrestore(&mpath->frame_queue.lock, flags); in mesh_path_assign_nexthop()
216 struct mesh_path *mpath; in mpath_lookup() local
218 mpath = rhashtable_lookup_fast(&tbl->rhead, dst, mesh_rht_params); in mpath_lookup()
220 if (mpath && mpath_expired(mpath)) { in mpath_lookup()
221 spin_lock_bh(&mpath->state_lock); in mpath_lookup()
222 mpath->flags &= ~MESH_PATH_ACTIVE; in mpath_lookup()
223 spin_unlock_bh(&mpath->state_lock); in mpath_lookup()
225 return mpath; in mpath_lookup()
253 struct mesh_path *mpath = NULL; in __mesh_path_lookup_by_idx() local
262 while ((mpath = rhashtable_walk_next(&iter))) { in __mesh_path_lookup_by_idx()
263 if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN) in __mesh_path_lookup_by_idx()
265 if (IS_ERR(mpath)) in __mesh_path_lookup_by_idx()
273 if (IS_ERR(mpath) || !mpath) in __mesh_path_lookup_by_idx()
276 if (mpath_expired(mpath)) { in __mesh_path_lookup_by_idx()
277 spin_lock_bh(&mpath->state_lock); in __mesh_path_lookup_by_idx()
278 mpath->flags &= ~MESH_PATH_ACTIVE; in __mesh_path_lookup_by_idx()
279 spin_unlock_bh(&mpath->state_lock); in __mesh_path_lookup_by_idx()
281 return mpath; in __mesh_path_lookup_by_idx()
318 int mesh_path_add_gate(struct mesh_path *mpath) in mesh_path_add_gate() argument
324 tbl = mpath->sdata->u.mesh.mesh_paths; in mesh_path_add_gate()
326 spin_lock_bh(&mpath->state_lock); in mesh_path_add_gate()
327 if (mpath->is_gate) { in mesh_path_add_gate()
329 spin_unlock_bh(&mpath->state_lock); in mesh_path_add_gate()
332 mpath->is_gate = true; in mesh_path_add_gate()
333 mpath->sdata->u.mesh.num_gates++; in mesh_path_add_gate()
336 hlist_add_head_rcu(&mpath->gate_list, &tbl->known_gates); in mesh_path_add_gate()
339 spin_unlock_bh(&mpath->state_lock); in mesh_path_add_gate()
341 mpath_dbg(mpath->sdata, in mesh_path_add_gate()
343 mpath->dst, mpath->sdata->u.mesh.num_gates); in mesh_path_add_gate()
355 static void mesh_gate_del(struct mesh_table *tbl, struct mesh_path *mpath) in mesh_gate_del() argument
357 lockdep_assert_held(&mpath->state_lock); in mesh_gate_del()
358 if (!mpath->is_gate) in mesh_gate_del()
361 mpath->is_gate = false; in mesh_gate_del()
363 hlist_del_rcu(&mpath->gate_list); in mesh_gate_del()
364 mpath->sdata->u.mesh.num_gates--; in mesh_gate_del()
367 mpath_dbg(mpath->sdata, in mesh_gate_del()
369 mpath->dst, mpath->sdata->u.mesh.num_gates); in mesh_gate_del()
417 struct mesh_path *mpath, *new_mpath; in mesh_path_add() local
441 mpath = rhashtable_lookup_fast(&tbl->rhead, in mesh_path_add()
445 } while (unlikely(ret == -EEXIST && !mpath)); in mesh_path_add()
456 new_mpath = mpath; in mesh_path_add()
505 struct mesh_path *mpath; in mesh_plink_broken() local
515 while ((mpath = rhashtable_walk_next(&iter))) { in mesh_plink_broken()
516 if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN) in mesh_plink_broken()
518 if (IS_ERR(mpath)) in mesh_plink_broken()
520 if (rcu_access_pointer(mpath->next_hop) == sta && in mesh_plink_broken()
521 mpath->flags & MESH_PATH_ACTIVE && in mesh_plink_broken()
522 !(mpath->flags & MESH_PATH_FIXED)) { in mesh_plink_broken()
523 spin_lock_bh(&mpath->state_lock); in mesh_plink_broken()
524 mpath->flags &= ~MESH_PATH_ACTIVE; in mesh_plink_broken()
525 ++mpath->sn; in mesh_plink_broken()
526 spin_unlock_bh(&mpath->state_lock); in mesh_plink_broken()
529 mpath->dst, mpath->sn, in mesh_plink_broken()
538 struct mesh_path *mpath) in mesh_path_free_rcu() argument
540 struct ieee80211_sub_if_data *sdata = mpath->sdata; in mesh_path_free_rcu()
542 spin_lock_bh(&mpath->state_lock); in mesh_path_free_rcu()
543 mpath->flags |= MESH_PATH_RESOLVING | MESH_PATH_DELETED; in mesh_path_free_rcu()
544 mesh_gate_del(tbl, mpath); in mesh_path_free_rcu()
545 spin_unlock_bh(&mpath->state_lock); in mesh_path_free_rcu()
546 del_timer_sync(&mpath->timer); in mesh_path_free_rcu()
549 kfree_rcu(mpath, rcu); in mesh_path_free_rcu()
552 static void __mesh_path_del(struct mesh_table *tbl, struct mesh_path *mpath) in __mesh_path_del() argument
554 rhashtable_remove_fast(&tbl->rhead, &mpath->rhash, mesh_rht_params); in __mesh_path_del()
555 mesh_path_free_rcu(tbl, mpath); in __mesh_path_del()
573 struct mesh_path *mpath; in mesh_path_flush_by_nexthop() local
583 while ((mpath = rhashtable_walk_next(&iter))) { in mesh_path_flush_by_nexthop()
584 if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN) in mesh_path_flush_by_nexthop()
586 if (IS_ERR(mpath)) in mesh_path_flush_by_nexthop()
589 if (rcu_access_pointer(mpath->next_hop) == sta) in mesh_path_flush_by_nexthop()
590 __mesh_path_del(tbl, mpath); in mesh_path_flush_by_nexthop()
601 struct mesh_path *mpath; in mpp_flush_by_proxy() local
611 while ((mpath = rhashtable_walk_next(&iter))) { in mpp_flush_by_proxy()
612 if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN) in mpp_flush_by_proxy()
614 if (IS_ERR(mpath)) in mpp_flush_by_proxy()
617 if (ether_addr_equal(mpath->mpp, proxy)) in mpp_flush_by_proxy()
618 __mesh_path_del(tbl, mpath); in mpp_flush_by_proxy()
627 struct mesh_path *mpath; in table_flush_by_iface() local
637 while ((mpath = rhashtable_walk_next(&iter))) { in table_flush_by_iface()
638 if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN) in table_flush_by_iface()
640 if (IS_ERR(mpath)) in table_flush_by_iface()
642 __mesh_path_del(tbl, mpath); in table_flush_by_iface()
676 struct mesh_path *mpath; in table_path_del() local
679 mpath = rhashtable_lookup_fast(&tbl->rhead, addr, mesh_rht_params); in table_path_del()
680 if (!mpath) { in table_path_del()
685 __mesh_path_del(tbl, mpath); in table_path_del()
719 void mesh_path_tx_pending(struct mesh_path *mpath) in mesh_path_tx_pending() argument
721 if (mpath->flags & MESH_PATH_ACTIVE) in mesh_path_tx_pending()
722 ieee80211_add_pending_skbs(mpath->sdata->local, in mesh_path_tx_pending()
723 &mpath->frame_queue); in mesh_path_tx_pending()
736 int mesh_path_send_to_gates(struct mesh_path *mpath) in mesh_path_send_to_gates() argument
738 struct ieee80211_sub_if_data *sdata = mpath->sdata; in mesh_path_send_to_gates()
740 struct mesh_path *from_mpath = mpath; in mesh_path_send_to_gates()
766 return (from_mpath == mpath) ? -EHOSTUNREACH : 0; in mesh_path_send_to_gates()
791 void mesh_path_flush_pending(struct mesh_path *mpath) in mesh_path_flush_pending() argument
795 while ((skb = skb_dequeue(&mpath->frame_queue)) != NULL) in mesh_path_flush_pending()
796 mesh_path_discard_frame(mpath->sdata, skb); in mesh_path_flush_pending()
807 void mesh_path_fix_nexthop(struct mesh_path *mpath, struct sta_info *next_hop) in mesh_path_fix_nexthop() argument
809 spin_lock_bh(&mpath->state_lock); in mesh_path_fix_nexthop()
810 mesh_path_assign_nexthop(mpath, next_hop); in mesh_path_fix_nexthop()
811 mpath->sn = 0xffff; in mesh_path_fix_nexthop()
812 mpath->metric = 0; in mesh_path_fix_nexthop()
813 mpath->hop_count = 0; in mesh_path_fix_nexthop()
814 mpath->exp_time = 0; in mesh_path_fix_nexthop()
815 mpath->flags = MESH_PATH_FIXED | MESH_PATH_SN_VALID; in mesh_path_fix_nexthop()
816 mesh_path_activate(mpath); in mesh_path_fix_nexthop()
817 spin_unlock_bh(&mpath->state_lock); in mesh_path_fix_nexthop()
821 mesh_path_tx_pending(mpath); in mesh_path_fix_nexthop()
856 struct mesh_path *mpath; in mesh_path_tbl_expire() local
866 while ((mpath = rhashtable_walk_next(&iter))) { in mesh_path_tbl_expire()
867 if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN) in mesh_path_tbl_expire()
869 if (IS_ERR(mpath)) in mesh_path_tbl_expire()
871 if ((!(mpath->flags & MESH_PATH_RESOLVING)) && in mesh_path_tbl_expire()
872 (!(mpath->flags & MESH_PATH_FIXED)) && in mesh_path_tbl_expire()
873 time_after(jiffies, mpath->exp_time + MESH_PATH_EXPIRE)) in mesh_path_tbl_expire()
874 __mesh_path_del(tbl, mpath); in mesh_path_tbl_expire()