123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- From: Henning Rogge <hrogge@gmail.com>
- Date: Wed, 3 Feb 2016 13:58:38 +0100
- Subject: [PATCH] mac80211: Unify mesh and mpp path removal function
- mpp_path_del() and mesh_path_del() are mostly the same function.
- Move common code into a new static function.
- Acked-by: Bob Copeland <me@bobcopeland.com>
- Signed-off-by: Henning Rogge <henning.rogge@fkie.fraunhofer.de>
- Signed-off-by: Johannes Berg <johannes.berg@intel.com>
- ---
- --- a/net/mac80211/mesh_pathtbl.c
- +++ b/net/mac80211/mesh_pathtbl.c
- @@ -55,16 +55,21 @@ int mpp_paths_generation;
- static DEFINE_RWLOCK(pathtbl_resize_lock);
-
-
- +static inline struct mesh_table *resize_dereference_paths(
- + struct mesh_table __rcu *table)
- +{
- + return rcu_dereference_protected(table,
- + lockdep_is_held(&pathtbl_resize_lock));
- +}
- +
- static inline struct mesh_table *resize_dereference_mesh_paths(void)
- {
- - return rcu_dereference_protected(mesh_paths,
- - lockdep_is_held(&pathtbl_resize_lock));
- + return resize_dereference_paths(mesh_paths);
- }
-
- static inline struct mesh_table *resize_dereference_mpp_paths(void)
- {
- - return rcu_dereference_protected(mpp_paths,
- - lockdep_is_held(&pathtbl_resize_lock));
- + return resize_dereference_paths(mpp_paths);
- }
-
- /*
- @@ -899,14 +904,17 @@ void mesh_path_flush_by_iface(struct iee
- }
-
- /**
- - * mesh_path_del - delete a mesh path from the table
- + * table_path_del - delete a path from the mesh or mpp table
- *
- - * @addr: dst address (ETH_ALEN length)
- + * @tbl: mesh or mpp path table
- * @sdata: local subif
- + * @addr: dst address (ETH_ALEN length)
- *
- * Returns: 0 if successful
- */
- -int mesh_path_del(struct ieee80211_sub_if_data *sdata, const u8 *addr)
- +static int table_path_del(struct mesh_table __rcu *rcu_tbl,
- + struct ieee80211_sub_if_data *sdata,
- + const u8 *addr)
- {
- struct mesh_table *tbl;
- struct mesh_path *mpath;
- @@ -915,11 +923,7 @@ int mesh_path_del(struct ieee80211_sub_i
- int hash_idx;
- int err = 0;
-
- - /* flush relevant mpp entries first */
- - mpp_flush_by_proxy(sdata, addr);
- -
- - read_lock_bh(&pathtbl_resize_lock);
- - tbl = resize_dereference_mesh_paths();
- + tbl = resize_dereference_paths(rcu_tbl);
- hash_idx = mesh_table_hash(addr, sdata, tbl);
- bucket = &tbl->hash_buckets[hash_idx];
-
- @@ -935,9 +939,30 @@ int mesh_path_del(struct ieee80211_sub_i
-
- err = -ENXIO;
- enddel:
- - mesh_paths_generation++;
- spin_unlock(&tbl->hashwlock[hash_idx]);
- + return err;
- +}
- +
- +/**
- + * mesh_path_del - delete a mesh path from the table
- + *
- + * @addr: dst address (ETH_ALEN length)
- + * @sdata: local subif
- + *
- + * Returns: 0 if successful
- + */
- +int mesh_path_del(struct ieee80211_sub_if_data *sdata, const u8 *addr)
- +{
- + int err = 0;
- +
- + /* flush relevant mpp entries first */
- + mpp_flush_by_proxy(sdata, addr);
- +
- + read_lock_bh(&pathtbl_resize_lock);
- + err = table_path_del(mesh_paths, sdata, addr);
- + mesh_paths_generation++;
- read_unlock_bh(&pathtbl_resize_lock);
- +
- return err;
- }
-
- @@ -951,33 +976,13 @@ enddel:
- */
- static int mpp_path_del(struct ieee80211_sub_if_data *sdata, const u8 *addr)
- {
- - struct mesh_table *tbl;
- - struct mesh_path *mpath;
- - struct mpath_node *node;
- - struct hlist_head *bucket;
- - int hash_idx;
- int err = 0;
-
- read_lock_bh(&pathtbl_resize_lock);
- - tbl = resize_dereference_mpp_paths();
- - hash_idx = mesh_table_hash(addr, sdata, tbl);
- - bucket = &tbl->hash_buckets[hash_idx];
- -
- - spin_lock(&tbl->hashwlock[hash_idx]);
- - hlist_for_each_entry(node, bucket, list) {
- - mpath = node->mpath;
- - if (mpath->sdata == sdata &&
- - ether_addr_equal(addr, mpath->dst)) {
- - __mesh_path_del(tbl, node);
- - goto enddel;
- - }
- - }
- -
- - err = -ENXIO;
- -enddel:
- - mesh_paths_generation++;
- - spin_unlock(&tbl->hashwlock[hash_idx]);
- + err = table_path_del(mpp_paths, sdata, addr);
- + mpp_paths_generation++;
- read_unlock_bh(&pathtbl_resize_lock);
- +
- return err;
- }
-
|