diff options
Diffstat (limited to 'package/kernel/mac80211/patches/329-mac80211-Unify-mesh-and-mpp-path-removal-function.patch')
-rw-r--r-- | package/kernel/mac80211/patches/329-mac80211-Unify-mesh-and-mpp-path-removal-function.patch | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/329-mac80211-Unify-mesh-and-mpp-path-removal-function.patch b/package/kernel/mac80211/patches/329-mac80211-Unify-mesh-and-mpp-path-removal-function.patch new file mode 100644 index 0000000000..0c36b1d568 --- /dev/null +++ b/package/kernel/mac80211/patches/329-mac80211-Unify-mesh-and-mpp-path-removal-function.patch @@ -0,0 +1,143 @@ +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; + } + |