cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mesh_ps.c (16783B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright 2012-2013, Marco Porsch <marco.porsch@s2005.tu-chemnitz.de>
      4 * Copyright 2012-2013, cozybit Inc.
      5 * Copyright (C) 2021 Intel Corporation
      6 */
      7
      8#include "mesh.h"
      9#include "wme.h"
     10
     11
     12/* mesh PS management */
     13
     14/**
     15 * mps_qos_null_get - create pre-addressed QoS Null frame for mesh powersave
     16 * @sta: the station to get the frame for
     17 */
     18static struct sk_buff *mps_qos_null_get(struct sta_info *sta)
     19{
     20	struct ieee80211_sub_if_data *sdata = sta->sdata;
     21	struct ieee80211_local *local = sdata->local;
     22	struct ieee80211_hdr *nullfunc; /* use 4addr header */
     23	struct sk_buff *skb;
     24	int size = sizeof(*nullfunc);
     25	__le16 fc;
     26
     27	skb = dev_alloc_skb(local->hw.extra_tx_headroom + size + 2);
     28	if (!skb)
     29		return NULL;
     30	skb_reserve(skb, local->hw.extra_tx_headroom);
     31
     32	nullfunc = skb_put(skb, size);
     33	fc = cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_NULLFUNC);
     34	ieee80211_fill_mesh_addresses(nullfunc, &fc, sta->sta.addr,
     35				      sdata->vif.addr);
     36	nullfunc->frame_control = fc;
     37	nullfunc->duration_id = 0;
     38	nullfunc->seq_ctrl = 0;
     39	/* no address resolution for this frame -> set addr 1 immediately */
     40	memcpy(nullfunc->addr1, sta->sta.addr, ETH_ALEN);
     41	skb_put_zero(skb, 2); /* append QoS control field */
     42	ieee80211_mps_set_frame_flags(sdata, sta, nullfunc);
     43
     44	return skb;
     45}
     46
     47/**
     48 * mps_qos_null_tx - send a QoS Null to indicate link-specific power mode
     49 * @sta: the station to send to
     50 */
     51static void mps_qos_null_tx(struct sta_info *sta)
     52{
     53	struct sk_buff *skb;
     54
     55	skb = mps_qos_null_get(sta);
     56	if (!skb)
     57		return;
     58
     59	mps_dbg(sta->sdata, "announcing peer-specific power mode to %pM\n",
     60		sta->sta.addr);
     61
     62	/* don't unintentionally start a MPSP */
     63	if (!test_sta_flag(sta, WLAN_STA_PS_STA)) {
     64		u8 *qc = ieee80211_get_qos_ctl((void *) skb->data);
     65
     66		qc[0] |= IEEE80211_QOS_CTL_EOSP;
     67	}
     68
     69	ieee80211_tx_skb(sta->sdata, skb);
     70}
     71
     72/**
     73 * ieee80211_mps_local_status_update - track status of local link-specific PMs
     74 *
     75 * @sdata: local mesh subif
     76 *
     77 * sets the non-peer power mode and triggers the driver PS (re-)configuration
     78 * Return BSS_CHANGED_BEACON if a beacon update is necessary.
     79 */
     80u32 ieee80211_mps_local_status_update(struct ieee80211_sub_if_data *sdata)
     81{
     82	struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
     83	struct sta_info *sta;
     84	bool peering = false;
     85	int light_sleep_cnt = 0;
     86	int deep_sleep_cnt = 0;
     87	u32 changed = 0;
     88	enum nl80211_mesh_power_mode nonpeer_pm;
     89
     90	rcu_read_lock();
     91	list_for_each_entry_rcu(sta, &sdata->local->sta_list, list) {
     92		if (sdata != sta->sdata)
     93			continue;
     94
     95		switch (sta->mesh->plink_state) {
     96		case NL80211_PLINK_OPN_SNT:
     97		case NL80211_PLINK_OPN_RCVD:
     98		case NL80211_PLINK_CNF_RCVD:
     99			peering = true;
    100			break;
    101		case NL80211_PLINK_ESTAB:
    102			if (sta->mesh->local_pm == NL80211_MESH_POWER_LIGHT_SLEEP)
    103				light_sleep_cnt++;
    104			else if (sta->mesh->local_pm == NL80211_MESH_POWER_DEEP_SLEEP)
    105				deep_sleep_cnt++;
    106			break;
    107		default:
    108			break;
    109		}
    110	}
    111	rcu_read_unlock();
    112
    113	/*
    114	 * Set non-peer mode to active during peering/scanning/authentication
    115	 * (see IEEE802.11-2012 13.14.8.3). The non-peer mesh power mode is
    116	 * deep sleep if the local STA is in light or deep sleep towards at
    117	 * least one mesh peer (see 13.14.3.1). Otherwise, set it to the
    118	 * user-configured default value.
    119	 */
    120	if (peering) {
    121		mps_dbg(sdata, "setting non-peer PM to active for peering\n");
    122		nonpeer_pm = NL80211_MESH_POWER_ACTIVE;
    123	} else if (light_sleep_cnt || deep_sleep_cnt) {
    124		mps_dbg(sdata, "setting non-peer PM to deep sleep\n");
    125		nonpeer_pm = NL80211_MESH_POWER_DEEP_SLEEP;
    126	} else {
    127		mps_dbg(sdata, "setting non-peer PM to user value\n");
    128		nonpeer_pm = ifmsh->mshcfg.power_mode;
    129	}
    130
    131	/* need update if sleep counts move between 0 and non-zero */
    132	if (ifmsh->nonpeer_pm != nonpeer_pm ||
    133	    !ifmsh->ps_peers_light_sleep != !light_sleep_cnt ||
    134	    !ifmsh->ps_peers_deep_sleep != !deep_sleep_cnt)
    135		changed = BSS_CHANGED_BEACON;
    136
    137	ifmsh->nonpeer_pm = nonpeer_pm;
    138	ifmsh->ps_peers_light_sleep = light_sleep_cnt;
    139	ifmsh->ps_peers_deep_sleep = deep_sleep_cnt;
    140
    141	return changed;
    142}
    143
    144/**
    145 * ieee80211_mps_set_sta_local_pm - set local PM towards a mesh STA
    146 *
    147 * @sta: mesh STA
    148 * @pm: the power mode to set
    149 * Return BSS_CHANGED_BEACON if a beacon update is in order.
    150 */
    151u32 ieee80211_mps_set_sta_local_pm(struct sta_info *sta,
    152				   enum nl80211_mesh_power_mode pm)
    153{
    154	struct ieee80211_sub_if_data *sdata = sta->sdata;
    155
    156	if (sta->mesh->local_pm == pm)
    157		return 0;
    158
    159	mps_dbg(sdata, "local STA operates in mode %d with %pM\n",
    160		pm, sta->sta.addr);
    161
    162	sta->mesh->local_pm = pm;
    163
    164	/*
    165	 * announce peer-specific power mode transition
    166	 * (see IEEE802.11-2012 13.14.3.2 and 13.14.3.3)
    167	 */
    168	if (sta->mesh->plink_state == NL80211_PLINK_ESTAB)
    169		mps_qos_null_tx(sta);
    170
    171	return ieee80211_mps_local_status_update(sdata);
    172}
    173
    174/**
    175 * ieee80211_mps_set_frame_flags - set mesh PS flags in FC (and QoS Control)
    176 *
    177 * @sdata: local mesh subif
    178 * @sta: mesh STA
    179 * @hdr: 802.11 frame header
    180 *
    181 * see IEEE802.11-2012 8.2.4.1.7 and 8.2.4.5.11
    182 *
    183 * NOTE: sta must be given when an individually-addressed QoS frame header
    184 * is handled, for group-addressed and management frames it is not used
    185 */
    186void ieee80211_mps_set_frame_flags(struct ieee80211_sub_if_data *sdata,
    187				   struct sta_info *sta,
    188				   struct ieee80211_hdr *hdr)
    189{
    190	enum nl80211_mesh_power_mode pm;
    191	u8 *qc;
    192
    193	if (WARN_ON(is_unicast_ether_addr(hdr->addr1) &&
    194		    ieee80211_is_data_qos(hdr->frame_control) &&
    195		    !sta))
    196		return;
    197
    198	if (is_unicast_ether_addr(hdr->addr1) &&
    199	    ieee80211_is_data_qos(hdr->frame_control) &&
    200	    sta->mesh->plink_state == NL80211_PLINK_ESTAB)
    201		pm = sta->mesh->local_pm;
    202	else
    203		pm = sdata->u.mesh.nonpeer_pm;
    204
    205	if (pm == NL80211_MESH_POWER_ACTIVE)
    206		hdr->frame_control &= cpu_to_le16(~IEEE80211_FCTL_PM);
    207	else
    208		hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
    209
    210	if (!ieee80211_is_data_qos(hdr->frame_control))
    211		return;
    212
    213	qc = ieee80211_get_qos_ctl(hdr);
    214
    215	if ((is_unicast_ether_addr(hdr->addr1) &&
    216	     pm == NL80211_MESH_POWER_DEEP_SLEEP) ||
    217	    (is_multicast_ether_addr(hdr->addr1) &&
    218	     sdata->u.mesh.ps_peers_deep_sleep > 0))
    219		qc[1] |= (IEEE80211_QOS_CTL_MESH_PS_LEVEL >> 8);
    220	else
    221		qc[1] &= ~(IEEE80211_QOS_CTL_MESH_PS_LEVEL >> 8);
    222}
    223
    224/**
    225 * ieee80211_mps_sta_status_update - update buffering status of neighbor STA
    226 *
    227 * @sta: mesh STA
    228 *
    229 * called after change of peering status or non-peer/peer-specific power mode
    230 */
    231void ieee80211_mps_sta_status_update(struct sta_info *sta)
    232{
    233	enum nl80211_mesh_power_mode pm;
    234	bool do_buffer;
    235
    236	/* For non-assoc STA, prevent buffering or frame transmission */
    237	if (sta->sta_state < IEEE80211_STA_ASSOC)
    238		return;
    239
    240	/*
    241	 * use peer-specific power mode if peering is established and the
    242	 * peer's power mode is known
    243	 */
    244	if (sta->mesh->plink_state == NL80211_PLINK_ESTAB &&
    245	    sta->mesh->peer_pm != NL80211_MESH_POWER_UNKNOWN)
    246		pm = sta->mesh->peer_pm;
    247	else
    248		pm = sta->mesh->nonpeer_pm;
    249
    250	do_buffer = (pm != NL80211_MESH_POWER_ACTIVE);
    251
    252	/* clear the MPSP flags for non-peers or active STA */
    253	if (sta->mesh->plink_state != NL80211_PLINK_ESTAB) {
    254		clear_sta_flag(sta, WLAN_STA_MPSP_OWNER);
    255		clear_sta_flag(sta, WLAN_STA_MPSP_RECIPIENT);
    256	} else if (!do_buffer) {
    257		clear_sta_flag(sta, WLAN_STA_MPSP_OWNER);
    258	}
    259
    260	/* Don't let the same PS state be set twice */
    261	if (test_sta_flag(sta, WLAN_STA_PS_STA) == do_buffer)
    262		return;
    263
    264	if (do_buffer) {
    265		set_sta_flag(sta, WLAN_STA_PS_STA);
    266		atomic_inc(&sta->sdata->u.mesh.ps.num_sta_ps);
    267		mps_dbg(sta->sdata, "start PS buffering frames towards %pM\n",
    268			sta->sta.addr);
    269	} else {
    270		ieee80211_sta_ps_deliver_wakeup(sta);
    271	}
    272}
    273
    274static void mps_set_sta_peer_pm(struct sta_info *sta,
    275				struct ieee80211_hdr *hdr)
    276{
    277	enum nl80211_mesh_power_mode pm;
    278	u8 *qc = ieee80211_get_qos_ctl(hdr);
    279
    280	/*
    281	 * Test Power Management field of frame control (PW) and
    282	 * mesh power save level subfield of QoS control field (PSL)
    283	 *
    284	 * | PM | PSL| Mesh PM |
    285	 * +----+----+---------+
    286	 * | 0  |Rsrv|  Active |
    287	 * | 1  | 0  |  Light  |
    288	 * | 1  | 1  |  Deep   |
    289	 */
    290	if (ieee80211_has_pm(hdr->frame_control)) {
    291		if (qc[1] & (IEEE80211_QOS_CTL_MESH_PS_LEVEL >> 8))
    292			pm = NL80211_MESH_POWER_DEEP_SLEEP;
    293		else
    294			pm = NL80211_MESH_POWER_LIGHT_SLEEP;
    295	} else {
    296		pm = NL80211_MESH_POWER_ACTIVE;
    297	}
    298
    299	if (sta->mesh->peer_pm == pm)
    300		return;
    301
    302	mps_dbg(sta->sdata, "STA %pM enters mode %d\n",
    303		sta->sta.addr, pm);
    304
    305	sta->mesh->peer_pm = pm;
    306
    307	ieee80211_mps_sta_status_update(sta);
    308}
    309
    310static void mps_set_sta_nonpeer_pm(struct sta_info *sta,
    311				   struct ieee80211_hdr *hdr)
    312{
    313	enum nl80211_mesh_power_mode pm;
    314
    315	if (ieee80211_has_pm(hdr->frame_control))
    316		pm = NL80211_MESH_POWER_DEEP_SLEEP;
    317	else
    318		pm = NL80211_MESH_POWER_ACTIVE;
    319
    320	if (sta->mesh->nonpeer_pm == pm)
    321		return;
    322
    323	mps_dbg(sta->sdata, "STA %pM sets non-peer mode to %d\n",
    324		sta->sta.addr, pm);
    325
    326	sta->mesh->nonpeer_pm = pm;
    327
    328	ieee80211_mps_sta_status_update(sta);
    329}
    330
    331/**
    332 * ieee80211_mps_rx_h_sta_process - frame receive handler for mesh powersave
    333 *
    334 * @sta: STA info that transmitted the frame
    335 * @hdr: IEEE 802.11 (QoS) Header
    336 */
    337void ieee80211_mps_rx_h_sta_process(struct sta_info *sta,
    338				    struct ieee80211_hdr *hdr)
    339{
    340	if (is_unicast_ether_addr(hdr->addr1) &&
    341	    ieee80211_is_data_qos(hdr->frame_control)) {
    342		/*
    343		 * individually addressed QoS Data/Null frames contain
    344		 * peer link-specific PS mode towards the local STA
    345		 */
    346		mps_set_sta_peer_pm(sta, hdr);
    347
    348		/* check for mesh Peer Service Period trigger frames */
    349		ieee80211_mpsp_trigger_process(ieee80211_get_qos_ctl(hdr),
    350					       sta, false, false);
    351	} else {
    352		/*
    353		 * can only determine non-peer PS mode
    354		 * (see IEEE802.11-2012 8.2.4.1.7)
    355		 */
    356		mps_set_sta_nonpeer_pm(sta, hdr);
    357	}
    358}
    359
    360
    361/* mesh PS frame release */
    362
    363static void mpsp_trigger_send(struct sta_info *sta, bool rspi, bool eosp)
    364{
    365	struct ieee80211_sub_if_data *sdata = sta->sdata;
    366	struct sk_buff *skb;
    367	struct ieee80211_hdr *nullfunc;
    368	struct ieee80211_tx_info *info;
    369	u8 *qc;
    370
    371	skb = mps_qos_null_get(sta);
    372	if (!skb)
    373		return;
    374
    375	nullfunc = (struct ieee80211_hdr *) skb->data;
    376	if (!eosp)
    377		nullfunc->frame_control |=
    378				cpu_to_le16(IEEE80211_FCTL_MOREDATA);
    379	/*
    380	 * | RSPI | EOSP |  MPSP triggering   |
    381	 * +------+------+--------------------+
    382	 * |  0   |  0   | local STA is owner |
    383	 * |  0   |  1   | no MPSP (MPSP end) |
    384	 * |  1   |  0   | both STA are owner |
    385	 * |  1   |  1   | peer STA is owner  | see IEEE802.11-2012 13.14.9.2
    386	 */
    387	qc = ieee80211_get_qos_ctl(nullfunc);
    388	if (rspi)
    389		qc[1] |= (IEEE80211_QOS_CTL_RSPI >> 8);
    390	if (eosp)
    391		qc[0] |= IEEE80211_QOS_CTL_EOSP;
    392
    393	info = IEEE80211_SKB_CB(skb);
    394
    395	info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER |
    396		       IEEE80211_TX_CTL_REQ_TX_STATUS;
    397
    398	mps_dbg(sdata, "sending MPSP trigger%s%s to %pM\n",
    399		rspi ? " RSPI" : "", eosp ? " EOSP" : "", sta->sta.addr);
    400
    401	ieee80211_tx_skb(sdata, skb);
    402}
    403
    404/**
    405 * mpsp_qos_null_append - append QoS Null frame to MPSP skb queue if needed
    406 * @sta: the station to handle
    407 * @frames: the frame list to append to
    408 *
    409 * To properly end a mesh MPSP the last transmitted frame has to set the EOSP
    410 * flag in the QoS Control field. In case the current tailing frame is not a
    411 * QoS Data frame, append a QoS Null to carry the flag.
    412 */
    413static void mpsp_qos_null_append(struct sta_info *sta,
    414				 struct sk_buff_head *frames)
    415{
    416	struct ieee80211_sub_if_data *sdata = sta->sdata;
    417	struct sk_buff *new_skb, *skb = skb_peek_tail(frames);
    418	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
    419	struct ieee80211_tx_info *info;
    420
    421	if (ieee80211_is_data_qos(hdr->frame_control))
    422		return;
    423
    424	new_skb = mps_qos_null_get(sta);
    425	if (!new_skb)
    426		return;
    427
    428	mps_dbg(sdata, "appending QoS Null in MPSP towards %pM\n",
    429		sta->sta.addr);
    430	/*
    431	 * This frame has to be transmitted last. Assign lowest priority to
    432	 * make sure it cannot pass other frames when releasing multiple ACs.
    433	 */
    434	new_skb->priority = 1;
    435	skb_set_queue_mapping(new_skb, IEEE80211_AC_BK);
    436	ieee80211_set_qos_hdr(sdata, new_skb);
    437
    438	info = IEEE80211_SKB_CB(new_skb);
    439	info->control.vif = &sdata->vif;
    440	info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
    441
    442	__skb_queue_tail(frames, new_skb);
    443}
    444
    445/**
    446 * mps_frame_deliver - transmit frames during mesh powersave
    447 *
    448 * @sta: STA info to transmit to
    449 * @n_frames: number of frames to transmit. -1 for all
    450 */
    451static void mps_frame_deliver(struct sta_info *sta, int n_frames)
    452{
    453	struct ieee80211_local *local = sta->sdata->local;
    454	int ac;
    455	struct sk_buff_head frames;
    456	struct sk_buff *skb;
    457	bool more_data = false;
    458
    459	skb_queue_head_init(&frames);
    460
    461	/* collect frame(s) from buffers */
    462	for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
    463		while (n_frames != 0) {
    464			skb = skb_dequeue(&sta->tx_filtered[ac]);
    465			if (!skb) {
    466				skb = skb_dequeue(
    467					&sta->ps_tx_buf[ac]);
    468				if (skb)
    469					local->total_ps_buffered--;
    470			}
    471			if (!skb)
    472				break;
    473			n_frames--;
    474			__skb_queue_tail(&frames, skb);
    475		}
    476
    477		if (!skb_queue_empty(&sta->tx_filtered[ac]) ||
    478		    !skb_queue_empty(&sta->ps_tx_buf[ac]))
    479			more_data = true;
    480	}
    481
    482	/* nothing to send? -> EOSP */
    483	if (skb_queue_empty(&frames)) {
    484		mpsp_trigger_send(sta, false, true);
    485		return;
    486	}
    487
    488	/* in a MPSP make sure the last skb is a QoS Data frame */
    489	if (test_sta_flag(sta, WLAN_STA_MPSP_OWNER))
    490		mpsp_qos_null_append(sta, &frames);
    491
    492	mps_dbg(sta->sdata, "sending %d frames to PS STA %pM\n",
    493		skb_queue_len(&frames), sta->sta.addr);
    494
    495	/* prepare collected frames for transmission */
    496	skb_queue_walk(&frames, skb) {
    497		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
    498		struct ieee80211_hdr *hdr = (void *) skb->data;
    499
    500		/*
    501		 * Tell TX path to send this frame even though the
    502		 * STA may still remain is PS mode after this frame
    503		 * exchange.
    504		 */
    505		info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER;
    506
    507		if (more_data || !skb_queue_is_last(&frames, skb))
    508			hdr->frame_control |=
    509				cpu_to_le16(IEEE80211_FCTL_MOREDATA);
    510		else
    511			hdr->frame_control &=
    512				cpu_to_le16(~IEEE80211_FCTL_MOREDATA);
    513
    514		if (skb_queue_is_last(&frames, skb) &&
    515		    ieee80211_is_data_qos(hdr->frame_control)) {
    516			u8 *qoshdr = ieee80211_get_qos_ctl(hdr);
    517
    518			/* MPSP trigger frame ends service period */
    519			*qoshdr |= IEEE80211_QOS_CTL_EOSP;
    520			info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS;
    521		}
    522	}
    523
    524	ieee80211_add_pending_skbs(local, &frames);
    525	sta_info_recalc_tim(sta);
    526}
    527
    528/**
    529 * ieee80211_mpsp_trigger_process - track status of mesh Peer Service Periods
    530 *
    531 * @qc: QoS Control field
    532 * @sta: peer to start a MPSP with
    533 * @tx: frame was transmitted by the local STA
    534 * @acked: frame has been transmitted successfully
    535 *
    536 * NOTE: active mode STA may only serve as MPSP owner
    537 */
    538void ieee80211_mpsp_trigger_process(u8 *qc, struct sta_info *sta,
    539				    bool tx, bool acked)
    540{
    541	u8 rspi = qc[1] & (IEEE80211_QOS_CTL_RSPI >> 8);
    542	u8 eosp = qc[0] & IEEE80211_QOS_CTL_EOSP;
    543
    544	if (tx) {
    545		if (rspi && acked)
    546			set_sta_flag(sta, WLAN_STA_MPSP_RECIPIENT);
    547
    548		if (eosp)
    549			clear_sta_flag(sta, WLAN_STA_MPSP_OWNER);
    550		else if (acked &&
    551			 test_sta_flag(sta, WLAN_STA_PS_STA) &&
    552			 !test_and_set_sta_flag(sta, WLAN_STA_MPSP_OWNER))
    553			mps_frame_deliver(sta, -1);
    554	} else {
    555		if (eosp)
    556			clear_sta_flag(sta, WLAN_STA_MPSP_RECIPIENT);
    557		else if (sta->mesh->local_pm != NL80211_MESH_POWER_ACTIVE)
    558			set_sta_flag(sta, WLAN_STA_MPSP_RECIPIENT);
    559
    560		if (rspi && !test_and_set_sta_flag(sta, WLAN_STA_MPSP_OWNER))
    561			mps_frame_deliver(sta, -1);
    562	}
    563}
    564
    565/**
    566 * ieee80211_mps_frame_release - release frames buffered due to mesh power save
    567 *
    568 * @sta: mesh STA
    569 * @elems: IEs of beacon or probe response
    570 *
    571 * For peers if we have individually-addressed frames buffered or the peer
    572 * indicates buffered frames, send a corresponding MPSP trigger frame. Since
    573 * we do not evaluate the awake window duration, QoS Nulls are used as MPSP
    574 * trigger frames. If the neighbour STA is not a peer, only send single frames.
    575 */
    576void ieee80211_mps_frame_release(struct sta_info *sta,
    577				 struct ieee802_11_elems *elems)
    578{
    579	int ac, buffer_local = 0;
    580	bool has_buffered = false;
    581
    582	if (sta->mesh->plink_state == NL80211_PLINK_ESTAB)
    583		has_buffered = ieee80211_check_tim(elems->tim, elems->tim_len,
    584						   sta->mesh->aid);
    585
    586	if (has_buffered)
    587		mps_dbg(sta->sdata, "%pM indicates buffered frames\n",
    588			sta->sta.addr);
    589
    590	/* only transmit to PS STA with announced, non-zero awake window */
    591	if (test_sta_flag(sta, WLAN_STA_PS_STA) &&
    592	    (!elems->awake_window || !get_unaligned_le16(elems->awake_window)))
    593		return;
    594
    595	if (!test_sta_flag(sta, WLAN_STA_MPSP_OWNER))
    596		for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
    597			buffer_local += skb_queue_len(&sta->ps_tx_buf[ac]) +
    598					skb_queue_len(&sta->tx_filtered[ac]);
    599
    600	if (!has_buffered && !buffer_local)
    601		return;
    602
    603	if (sta->mesh->plink_state == NL80211_PLINK_ESTAB)
    604		mpsp_trigger_send(sta, has_buffered, !buffer_local);
    605	else
    606		mps_frame_deliver(sta, 1);
    607}