mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 14:42:24 +00:00
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: Thomas Pedersen <thomas@cozybit.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
25232490af
commit
c613366113
@ -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)
|
|||||||
|
|
||||||
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,
|
|||||||
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)
|
|||||||
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,8 +844,7 @@ 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);
|
||||||
kfree(node);
|
kfree(node);
|
||||||
@ -1046,8 +1046,7 @@ 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);
|
||||||
}
|
}
|
||||||
kfree(node);
|
kfree(node);
|
||||||
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user