mac80211: move mesh related station fields to own struct
There are now a fairly large number of mesh fields that really aren't needed in any other modes; move those into their own structure and allocate them separately. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
@@ -249,6 +249,9 @@ void sta_info_free(struct ieee80211_local *local, struct sta_info *sta)
|
||||
if (sta->sta.txq[0])
|
||||
kfree(to_txq_info(sta->sta.txq[0]));
|
||||
kfree(rcu_dereference_raw(sta->sta.rates));
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
kfree(sta->mesh);
|
||||
#endif
|
||||
kfree(sta);
|
||||
}
|
||||
|
||||
@@ -313,11 +316,16 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
|
||||
INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work);
|
||||
mutex_init(&sta->ampdu_mlme.mtx);
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
spin_lock_init(&sta->plink_lock);
|
||||
if (ieee80211_vif_is_mesh(&sdata->vif) &&
|
||||
!sdata->u.mesh.user_mpm)
|
||||
init_timer(&sta->plink_timer);
|
||||
sta->nonpeer_pm = NL80211_MESH_POWER_ACTIVE;
|
||||
if (ieee80211_vif_is_mesh(&sdata->vif)) {
|
||||
sta->mesh = kzalloc(sizeof(*sta->mesh), gfp);
|
||||
if (!sta->mesh)
|
||||
goto free;
|
||||
spin_lock_init(&sta->mesh->plink_lock);
|
||||
if (ieee80211_vif_is_mesh(&sdata->vif) &&
|
||||
!sdata->u.mesh.user_mpm)
|
||||
init_timer(&sta->mesh->plink_timer);
|
||||
sta->mesh->nonpeer_pm = NL80211_MESH_POWER_ACTIVE;
|
||||
}
|
||||
#endif
|
||||
|
||||
memcpy(sta->addr, addr, ETH_ALEN);
|
||||
@@ -406,6 +414,9 @@ free_txq:
|
||||
if (sta->sta.txq[0])
|
||||
kfree(to_txq_info(sta->sta.txq[0]));
|
||||
free:
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
kfree(sta->mesh);
|
||||
#endif
|
||||
kfree(sta);
|
||||
return NULL;
|
||||
}
|
||||
@@ -637,7 +648,7 @@ static void __sta_info_recalc_tim(struct sta_info *sta, bool ignore_pending)
|
||||
} else if (ieee80211_vif_is_mesh(&sta->sdata->vif)) {
|
||||
ps = &sta->sdata->u.mesh.ps;
|
||||
/* TIM map only for 1 <= PLID <= IEEE80211_MAX_AID */
|
||||
id = sta->plid % (IEEE80211_MAX_AID + 1);
|
||||
id = sta->mesh->plid % (IEEE80211_MAX_AID + 1);
|
||||
#endif
|
||||
} else {
|
||||
return;
|
||||
@@ -1957,16 +1968,16 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
|
||||
BIT(NL80211_STA_INFO_PEER_PM) |
|
||||
BIT(NL80211_STA_INFO_NONPEER_PM);
|
||||
|
||||
sinfo->llid = sta->llid;
|
||||
sinfo->plid = sta->plid;
|
||||
sinfo->plink_state = sta->plink_state;
|
||||
sinfo->llid = sta->mesh->llid;
|
||||
sinfo->plid = sta->mesh->plid;
|
||||
sinfo->plink_state = sta->mesh->plink_state;
|
||||
if (test_sta_flag(sta, WLAN_STA_TOFFSET_KNOWN)) {
|
||||
sinfo->filled |= BIT(NL80211_STA_INFO_T_OFFSET);
|
||||
sinfo->t_offset = sta->t_offset;
|
||||
sinfo->t_offset = sta->mesh->t_offset;
|
||||
}
|
||||
sinfo->local_pm = sta->local_pm;
|
||||
sinfo->peer_pm = sta->peer_pm;
|
||||
sinfo->nonpeer_pm = sta->nonpeer_pm;
|
||||
sinfo->local_pm = sta->mesh->local_pm;
|
||||
sinfo->peer_pm = sta->mesh->peer_pm;
|
||||
sinfo->nonpeer_pm = sta->mesh->nonpeer_pm;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
Verwijs in nieuw issue
Block a user