// SPDX-License-Identifier: GPL-2.0-only /* * Copyright 2012-2013, Marco Porsch <[email protected]> * Copyright 2012-2013, cozybit Inc. * Copyright (C) 2021 Intel Corporation * Copyright (C) 2023 Intel Corporation */ #include "mesh.h" #include "wme.h" /* mesh PS management */ /** * mps_qos_null_get - create pre-addressed QoS Null frame for mesh powersave * @sta: the station to get the frame for * * Returns: A newly allocated SKB */ static struct sk_buff *mps_qos_null_get(struct sta_info *sta) { … } /** * mps_qos_null_tx - send a QoS Null to indicate link-specific power mode * @sta: the station to send to */ static void mps_qos_null_tx(struct sta_info *sta) { … } /** * ieee80211_mps_local_status_update - track status of local link-specific PMs * * @sdata: local mesh subif * * sets the non-peer power mode and triggers the driver PS (re-)configuration * Return BSS_CHANGED_BEACON if a beacon update is necessary. * * Returns: BSS_CHANGED_BEACON if a beacon update is in order. */ u64 ieee80211_mps_local_status_update(struct ieee80211_sub_if_data *sdata) { … } /** * ieee80211_mps_set_sta_local_pm - set local PM towards a mesh STA * * @sta: mesh STA * @pm: the power mode to set * Returns: BSS_CHANGED_BEACON if a beacon update is in order. */ u64 ieee80211_mps_set_sta_local_pm(struct sta_info *sta, enum nl80211_mesh_power_mode pm) { … } /** * ieee80211_mps_set_frame_flags - set mesh PS flags in FC (and QoS Control) * * @sdata: local mesh subif * @sta: mesh STA * @hdr: 802.11 frame header * * see IEEE802.11-2012 8.2.4.1.7 and 8.2.4.5.11 * * NOTE: sta must be given when an individually-addressed QoS frame header * is handled, for group-addressed and management frames it is not used */ void ieee80211_mps_set_frame_flags(struct ieee80211_sub_if_data *sdata, struct sta_info *sta, struct ieee80211_hdr *hdr) { … } /** * ieee80211_mps_sta_status_update - update buffering status of neighbor STA * * @sta: mesh STA * * called after change of peering status or non-peer/peer-specific power mode */ void ieee80211_mps_sta_status_update(struct sta_info *sta) { … } static void mps_set_sta_peer_pm(struct sta_info *sta, struct ieee80211_hdr *hdr) { … } static void mps_set_sta_nonpeer_pm(struct sta_info *sta, struct ieee80211_hdr *hdr) { … } /** * ieee80211_mps_rx_h_sta_process - frame receive handler for mesh powersave * * @sta: STA info that transmitted the frame * @hdr: IEEE 802.11 (QoS) Header */ void ieee80211_mps_rx_h_sta_process(struct sta_info *sta, struct ieee80211_hdr *hdr) { … } /* mesh PS frame release */ static void mpsp_trigger_send(struct sta_info *sta, bool rspi, bool eosp) { … } /** * mpsp_qos_null_append - append QoS Null frame to MPSP skb queue if needed * @sta: the station to handle * @frames: the frame list to append to * * To properly end a mesh MPSP the last transmitted frame has to set the EOSP * flag in the QoS Control field. In case the current tailing frame is not a * QoS Data frame, append a QoS Null to carry the flag. */ static void mpsp_qos_null_append(struct sta_info *sta, struct sk_buff_head *frames) { … } /** * mps_frame_deliver - transmit frames during mesh powersave * * @sta: STA info to transmit to * @n_frames: number of frames to transmit. -1 for all */ static void mps_frame_deliver(struct sta_info *sta, int n_frames) { … } /** * ieee80211_mpsp_trigger_process - track status of mesh Peer Service Periods * * @qc: QoS Control field * @sta: peer to start a MPSP with * @tx: frame was transmitted by the local STA * @acked: frame has been transmitted successfully * * NOTE: active mode STA may only serve as MPSP owner */ void ieee80211_mpsp_trigger_process(u8 *qc, struct sta_info *sta, bool tx, bool acked) { … } /** * ieee80211_mps_frame_release - release frames buffered due to mesh power save * * @sta: mesh STA * @elems: IEs of beacon or probe response * * For peers if we have individually-addressed frames buffered or the peer * indicates buffered frames, send a corresponding MPSP trigger frame. Since * we do not evaluate the awake window duration, QoS Nulls are used as MPSP * trigger frames. If the neighbour STA is not a peer, only send single frames. */ void ieee80211_mps_frame_release(struct sta_info *sta, struct ieee802_11_elems *elems) { … }