Commit c6133661 authored by Thomas Pedersen's avatar Thomas Pedersen Committed by John W. Linville

mac80211: mesh gate fixes

Since a v1 of the mesh gate series was accidentally applied, this patch
contains the changes in v2.

These are:
	- automatically make mesh gate a root node.
	- use TU_TO_EXP_TIME macro.
	- initialize timer instead of checking for NULL timer function.
	- cleanups.
Signed-off-by: default avatarThomas Pedersen <thomas@cozybit.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 25232490
...@@ -1138,6 +1138,14 @@ static int ieee80211_update_mesh_config(struct wiphy *wiphy, ...@@ -1138,6 +1138,14 @@ static int ieee80211_update_mesh_config(struct wiphy *wiphy,
ieee80211_mesh_root_setup(ifmsh); ieee80211_mesh_root_setup(ifmsh);
} }
if (_chg_mesh_attr(NL80211_MESHCONF_GATE_ANNOUNCEMENTS, mask)) { if (_chg_mesh_attr(NL80211_MESHCONF_GATE_ANNOUNCEMENTS, mask)) {
/* our current gate announcement implementation rides on root
* announcements, so require this ifmsh to also be a root node
* */
if (nconf->dot11MeshGateAnnouncementProtocol &&
!conf->dot11MeshHWMPRootMode) {
conf->dot11MeshHWMPRootMode = 1;
ieee80211_mesh_root_setup(ifmsh);
}
conf->dot11MeshGateAnnouncementProtocol = conf->dot11MeshGateAnnouncementProtocol =
nconf->dot11MeshGateAnnouncementProtocol; nconf->dot11MeshGateAnnouncementProtocol;
} }
......
...@@ -537,8 +537,8 @@ static void ieee80211_mesh_rootpath(struct ieee80211_sub_if_data *sdata) ...@@ -537,8 +537,8 @@ static void ieee80211_mesh_rootpath(struct ieee80211_sub_if_data *sdata)
mesh_path_tx_root_frame(sdata); mesh_path_tx_root_frame(sdata);
mod_timer(&ifmsh->mesh_path_root_timer, mod_timer(&ifmsh->mesh_path_root_timer,
round_jiffies(jiffies + round_jiffies(TU_TO_EXP_TIME(
usecs_to_jiffies(ifmsh->mshcfg.dot11MeshHWMPRannInterval * 1024))); ifmsh->mshcfg.dot11MeshHWMPRannInterval)));
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM
......
...@@ -288,7 +288,7 @@ static void mesh_path_move_to_queue(struct mesh_path *gate_mpath, ...@@ -288,7 +288,7 @@ static void mesh_path_move_to_queue(struct mesh_path *gate_mpath,
struct mesh_path *from_mpath, struct mesh_path *from_mpath,
bool copy) bool copy)
{ {
struct sk_buff *skb, *cp_skb; struct sk_buff *skb, *cp_skb = NULL;
struct sk_buff_head gateq, failq; struct sk_buff_head gateq, failq;
unsigned long flags; unsigned long flags;
int num_skbs; int num_skbs;
...@@ -711,6 +711,7 @@ int mpp_path_add(u8 *dst, u8 *mpp, struct ieee80211_sub_if_data *sdata) ...@@ -711,6 +711,7 @@ int mpp_path_add(u8 *dst, u8 *mpp, struct ieee80211_sub_if_data *sdata)
new_mpath->flags = 0; new_mpath->flags = 0;
skb_queue_head_init(&new_mpath->frame_queue); skb_queue_head_init(&new_mpath->frame_queue);
new_node->mpath = new_mpath; new_node->mpath = new_mpath;
init_timer(&new_mpath->timer);
new_mpath->exp_time = jiffies; new_mpath->exp_time = jiffies;
spin_lock_init(&new_mpath->state_lock); spin_lock_init(&new_mpath->state_lock);
...@@ -843,7 +844,6 @@ static void mesh_path_node_reclaim(struct rcu_head *rp) ...@@ -843,7 +844,6 @@ static void mesh_path_node_reclaim(struct rcu_head *rp)
struct mpath_node *node = container_of(rp, struct mpath_node, rcu); struct mpath_node *node = container_of(rp, struct mpath_node, rcu);
struct ieee80211_sub_if_data *sdata = node->mpath->sdata; struct ieee80211_sub_if_data *sdata = node->mpath->sdata;
if (node->mpath->timer.function)
del_timer_sync(&node->mpath->timer); del_timer_sync(&node->mpath->timer);
atomic_dec(&sdata->u.mesh.mpaths); atomic_dec(&sdata->u.mesh.mpaths);
kfree(node->mpath); kfree(node->mpath);
...@@ -1046,7 +1046,6 @@ static void mesh_path_node_free(struct hlist_node *p, bool free_leafs) ...@@ -1046,7 +1046,6 @@ static void mesh_path_node_free(struct hlist_node *p, bool free_leafs)
mpath = node->mpath; mpath = node->mpath;
hlist_del_rcu(p); hlist_del_rcu(p);
if (free_leafs) { if (free_leafs) {
if (mpath->timer.function)
del_timer_sync(&mpath->timer); del_timer_sync(&mpath->timer);
kfree(mpath); kfree(mpath);
} }
...@@ -1094,7 +1093,6 @@ int mesh_pathtbl_init(void) ...@@ -1094,7 +1093,6 @@ int mesh_pathtbl_init(void)
tbl_mpp->free_node = &mesh_path_node_free; tbl_mpp->free_node = &mesh_path_node_free;
tbl_mpp->copy_node = &mesh_path_node_copy; tbl_mpp->copy_node = &mesh_path_node_copy;
tbl_mpp->mean_chain_len = MEAN_CHAIN_LEN; tbl_mpp->mean_chain_len = MEAN_CHAIN_LEN;
/* XXX: not needed */
tbl_mpp->known_gates = kzalloc(sizeof(struct hlist_head), GFP_ATOMIC); tbl_mpp->known_gates = kzalloc(sizeof(struct hlist_head), GFP_ATOMIC);
INIT_HLIST_HEAD(tbl_mpp->known_gates); INIT_HLIST_HEAD(tbl_mpp->known_gates);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment