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:
@@ -92,16 +92,16 @@ u32 ieee80211_mps_local_status_update(struct ieee80211_sub_if_data *sdata)
|
||||
if (sdata != sta->sdata)
|
||||
continue;
|
||||
|
||||
switch (sta->plink_state) {
|
||||
switch (sta->mesh->plink_state) {
|
||||
case NL80211_PLINK_OPN_SNT:
|
||||
case NL80211_PLINK_OPN_RCVD:
|
||||
case NL80211_PLINK_CNF_RCVD:
|
||||
peering = true;
|
||||
break;
|
||||
case NL80211_PLINK_ESTAB:
|
||||
if (sta->local_pm == NL80211_MESH_POWER_LIGHT_SLEEP)
|
||||
if (sta->mesh->local_pm == NL80211_MESH_POWER_LIGHT_SLEEP)
|
||||
light_sleep_cnt++;
|
||||
else if (sta->local_pm == NL80211_MESH_POWER_DEEP_SLEEP)
|
||||
else if (sta->mesh->local_pm == NL80211_MESH_POWER_DEEP_SLEEP)
|
||||
deep_sleep_cnt++;
|
||||
break;
|
||||
default:
|
||||
@@ -153,19 +153,19 @@ u32 ieee80211_mps_set_sta_local_pm(struct sta_info *sta,
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = sta->sdata;
|
||||
|
||||
if (sta->local_pm == pm)
|
||||
if (sta->mesh->local_pm == pm)
|
||||
return 0;
|
||||
|
||||
mps_dbg(sdata, "local STA operates in mode %d with %pM\n",
|
||||
pm, sta->sta.addr);
|
||||
|
||||
sta->local_pm = pm;
|
||||
sta->mesh->local_pm = pm;
|
||||
|
||||
/*
|
||||
* announce peer-specific power mode transition
|
||||
* (see IEEE802.11-2012 13.14.3.2 and 13.14.3.3)
|
||||
*/
|
||||
if (sta->plink_state == NL80211_PLINK_ESTAB)
|
||||
if (sta->mesh->plink_state == NL80211_PLINK_ESTAB)
|
||||
mps_qos_null_tx(sta);
|
||||
|
||||
return ieee80211_mps_local_status_update(sdata);
|
||||
@@ -197,8 +197,8 @@ void ieee80211_mps_set_frame_flags(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
if (is_unicast_ether_addr(hdr->addr1) &&
|
||||
ieee80211_is_data_qos(hdr->frame_control) &&
|
||||
sta->plink_state == NL80211_PLINK_ESTAB)
|
||||
pm = sta->local_pm;
|
||||
sta->mesh->plink_state == NL80211_PLINK_ESTAB)
|
||||
pm = sta->mesh->local_pm;
|
||||
else
|
||||
pm = sdata->u.mesh.nonpeer_pm;
|
||||
|
||||
@@ -241,16 +241,16 @@ void ieee80211_mps_sta_status_update(struct sta_info *sta)
|
||||
* use peer-specific power mode if peering is established and the
|
||||
* peer's power mode is known
|
||||
*/
|
||||
if (sta->plink_state == NL80211_PLINK_ESTAB &&
|
||||
sta->peer_pm != NL80211_MESH_POWER_UNKNOWN)
|
||||
pm = sta->peer_pm;
|
||||
if (sta->mesh->plink_state == NL80211_PLINK_ESTAB &&
|
||||
sta->mesh->peer_pm != NL80211_MESH_POWER_UNKNOWN)
|
||||
pm = sta->mesh->peer_pm;
|
||||
else
|
||||
pm = sta->nonpeer_pm;
|
||||
pm = sta->mesh->nonpeer_pm;
|
||||
|
||||
do_buffer = (pm != NL80211_MESH_POWER_ACTIVE);
|
||||
|
||||
/* clear the MPSP flags for non-peers or active STA */
|
||||
if (sta->plink_state != NL80211_PLINK_ESTAB) {
|
||||
if (sta->mesh->plink_state != NL80211_PLINK_ESTAB) {
|
||||
clear_sta_flag(sta, WLAN_STA_MPSP_OWNER);
|
||||
clear_sta_flag(sta, WLAN_STA_MPSP_RECIPIENT);
|
||||
} else if (!do_buffer) {
|
||||
@@ -296,13 +296,13 @@ static void mps_set_sta_peer_pm(struct sta_info *sta,
|
||||
pm = NL80211_MESH_POWER_ACTIVE;
|
||||
}
|
||||
|
||||
if (sta->peer_pm == pm)
|
||||
if (sta->mesh->peer_pm == pm)
|
||||
return;
|
||||
|
||||
mps_dbg(sta->sdata, "STA %pM enters mode %d\n",
|
||||
sta->sta.addr, pm);
|
||||
|
||||
sta->peer_pm = pm;
|
||||
sta->mesh->peer_pm = pm;
|
||||
|
||||
ieee80211_mps_sta_status_update(sta);
|
||||
}
|
||||
@@ -317,13 +317,13 @@ static void mps_set_sta_nonpeer_pm(struct sta_info *sta,
|
||||
else
|
||||
pm = NL80211_MESH_POWER_ACTIVE;
|
||||
|
||||
if (sta->nonpeer_pm == pm)
|
||||
if (sta->mesh->nonpeer_pm == pm)
|
||||
return;
|
||||
|
||||
mps_dbg(sta->sdata, "STA %pM sets non-peer mode to %d\n",
|
||||
sta->sta.addr, pm);
|
||||
|
||||
sta->nonpeer_pm = pm;
|
||||
sta->mesh->nonpeer_pm = pm;
|
||||
|
||||
ieee80211_mps_sta_status_update(sta);
|
||||
}
|
||||
@@ -552,7 +552,7 @@ void ieee80211_mpsp_trigger_process(u8 *qc, struct sta_info *sta,
|
||||
} else {
|
||||
if (eosp)
|
||||
clear_sta_flag(sta, WLAN_STA_MPSP_RECIPIENT);
|
||||
else if (sta->local_pm != NL80211_MESH_POWER_ACTIVE)
|
||||
else if (sta->mesh->local_pm != NL80211_MESH_POWER_ACTIVE)
|
||||
set_sta_flag(sta, WLAN_STA_MPSP_RECIPIENT);
|
||||
|
||||
if (rspi && !test_and_set_sta_flag(sta, WLAN_STA_MPSP_OWNER))
|
||||
@@ -577,9 +577,9 @@ void ieee80211_mps_frame_release(struct sta_info *sta,
|
||||
int ac, buffer_local = 0;
|
||||
bool has_buffered = false;
|
||||
|
||||
if (sta->plink_state == NL80211_PLINK_ESTAB)
|
||||
if (sta->mesh->plink_state == NL80211_PLINK_ESTAB)
|
||||
has_buffered = ieee80211_check_tim(elems->tim, elems->tim_len,
|
||||
sta->llid);
|
||||
sta->mesh->llid);
|
||||
|
||||
if (has_buffered)
|
||||
mps_dbg(sta->sdata, "%pM indicates buffered frames\n",
|
||||
@@ -598,7 +598,7 @@ void ieee80211_mps_frame_release(struct sta_info *sta,
|
||||
if (!has_buffered && !buffer_local)
|
||||
return;
|
||||
|
||||
if (sta->plink_state == NL80211_PLINK_ESTAB)
|
||||
if (sta->mesh->plink_state == NL80211_PLINK_ESTAB)
|
||||
mpsp_trigger_send(sta, has_buffered, !buffer_local);
|
||||
else
|
||||
mps_frame_deliver(sta, 1);
|
||||
|
Reference in New Issue
Block a user