summaryrefslogtreecommitdiff
path: root/package/kernel/mac80211/patches/329-mac80211-Unify-mesh-and-mpp-path-removal-function.patch
diff options
context:
space:
mode:
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.patch143
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 0000000..0c36b1d
--- /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;
+ }
+