From: Johannes Berg <johannes@sipsolutions.net>
To: linux-wireless@vger.kernel.org
Subject: [RFC 15/15] mac80211: document client powersave
Date: Thu, 22 Sep 2011 17:47:41 +0200 [thread overview]
Message-ID: <20110922154852.660073880@sipsolutions.net> (raw)
In-Reply-To: 20110922154726.521122680@sipsolutions.net
From: Johannes Berg <johannes.berg@intel.com>
With the addition of uAPSD and driver buffering
the powersave handling has gotten quite complex.
Add a section to the documentation to explain it
for anyone wanting to implement it.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
Documentation/DocBook/80211.tmpl | 11 ++++
include/net/mac80211.h | 89 +++++++++++++++++++++++++++++++++++++++
2 files changed, 99 insertions(+), 1 deletion(-)
--- a/Documentation/DocBook/80211.tmpl 2011-09-22 17:12:52.000000000 +0200
+++ b/Documentation/DocBook/80211.tmpl 2011-09-22 17:21:38.000000000 +0200
@@ -450,8 +450,18 @@ MISSING
Insert notes about VLAN interfaces with hw crypto here or
in the hw crypto chapter.
</para>
+ <section id="ps-client">
+ <title>support for powersaving clients</title>
+!Pinclude/net/mac80211.h AP support for powersaving clients
+ </section>
!Finclude/net/mac80211.h ieee80211_get_buffered_bc
!Finclude/net/mac80211.h ieee80211_beacon_get
+!Finclude/net/mac80211.h ieee80211_sta_eosp_irqsafe
+!Finclude/net/mac80211.h ieee80211_frame_release_type
+!Finclude/net/mac80211.h ieee80211_sta_ps_transition
+!Finclude/net/mac80211.h ieee80211_sta_ps_transition_ni
+!Finclude/net/mac80211.h ieee80211_sta_set_buffered
+!Finclude/net/mac80211.h ieee80211_sta_block_awake
</chapter>
<chapter id="multi-iface">
@@ -477,7 +487,6 @@ MISSING
!Finclude/net/mac80211.h sta_notify_cmd
!Finclude/net/mac80211.h ieee80211_find_sta
!Finclude/net/mac80211.h ieee80211_find_sta_by_ifaddr
-!Finclude/net/mac80211.h ieee80211_sta_block_awake
</chapter>
<chapter id="hardware-scan-offload">
--- a/include/net/mac80211.h 2011-09-22 17:21:33.000000000 +0200
+++ b/include/net/mac80211.h 2011-09-22 17:39:46.000000000 +0200
@@ -1535,6 +1535,95 @@ ieee80211_get_alt_retry_rate(const struc
*/
/**
+ * DOC: AP support for powersaving clients
+ *
+ * In order to implement AP and P2P GO modes, mac80211 has support for
+ * client powersaving, both "legacy" PS (PS-Poll/null data) and uAPSD.
+ * There currently is no support for sAPSD.
+ *
+ * There is one assumption that mac80211 makes, namely that a client
+ * will not poll with PS-Poll and trigger with uAPSD at the same time.
+ * Both are supported, and both can be used by the same client, but
+ * they can't be used concurrently by the same client. This simplifies
+ * the driver code.
+ *
+ * The first thing to keep in mind is that there is a flag for complete
+ * driver implementation: %IEEE80211_HW_AP_LINK_PS. If this flag is set,
+ * mac80211 expects the driver to handle most of the state machine for
+ * powersaving clients and will ignore the PM bit in incoming frames.
+ * Drivers then use ieee80211_sta_ps_transition() to inform mac80211 of
+ * stations' powersave transitions. In this mode, mac80211 also doesn't
+ * handle PS-Poll/uAPSD.
+ *
+ * In the mode without %IEEE80211_HW_AP_LINK_PS, mac80211 will check the
+ * PM bit in incoming frames for client powersave transitions. When a
+ * station goes to sleep, we will stop transmitting to it. There is,
+ * however, a race condition: a station might go to sleep while there is
+ * data buffered on hardware queues. If the device has support for this
+ * it will reject frames, and the driver should give the frames back to
+ * mac80211 with the %IEEE80211_TX_STAT_TX_FILTERED flag set which will
+ * cause mac80211 to retry the frame when the station wakes up. The
+ * driver is also notified of powersave transitions by calling its
+ * @sta_notify callback.
+ *
+ * When the station is asleep, it has three choices: it can wake up,
+ * it can PS-Poll, or it can possibly start a uAPSD service period.
+ * Waking up is implemented by simply transmitting all buffered (and
+ * filtered) frames to the station. This is the easiest case. When
+ * the station sends a PS-Poll or a uAPSD trigger frame, mac80211
+ * will inform the driver of this with the @allow_buffered_frames
+ * callback; this callback is optional. mac80211 will then transmit
+ * the frames as usual and set the %IEEE80211_TX_CTL_POLL_RESPONSE
+ * on each frame. The last frame in the service period (or the only
+ * response to a PS-Poll) also has %IEEE80211_TX_STATUS_EOSP set to
+ * indicate that it ends the service period; as this frame must have
+ * TX status report it also sets %IEEE80211_TX_CTL_REQ_TX_STATUS.
+ * When TX status is reported for this frame, the service period is
+ * marked has having ended and a new one can be started by the peer.
+ *
+ * Another race condition can happen on some devices like iwlwifi
+ * when there are frames queued for the station and it wakes up
+ * or polls; the frames that are already queued could end up being
+ * transmitted first instead, causing reordering and/or wrong
+ * processing of the EOSP. The cause is that allowing frames to be
+ * transmitted to a certain station is out-of-band communication to
+ * the device. To allow this problem to be solved, the driver can
+ * call ieee80211_sta_block_awake() if frames are buffered when it
+ * is notified that the station went to sleep. When all these frames
+ * have been filtered (see above), it must call the function again
+ * to indicate that the station is no longer blocked.
+ *
+ * If the driver buffers frames in the driver for aggregation in any
+ * way, it must use the ieee80211_sta_set_buffered() call when it is
+ * notified of the station going to sleep to inform mac80211 of any
+ * TIDs that have frames buffered. Note that when a station wakes up
+ * this information is reset (hence the requirement to call it when
+ * informed of the station going to sleep). Then, when a service
+ * period starts for any reason, @release_buffered_frames is called
+ * with the number of frames to be released and which TIDs they are
+ * to come from. In this case, the driver is responsible for setting
+ * the EOSP (for uAPSD) and MORE_DATA bits in the released frames,
+ * to help the @more_data paramter is passed to tell the driver if
+ * there is more data on other TIDs -- the TIDs to release frames
+ * from are ignored since mac80211 doesn't know how many frames the
+ * buffers for those TIDs contain.
+ *
+ * If the driver also implement GO mode, where absence periods may
+ * shorten service periods (or abort PS-Poll responses), it must
+ * filter those response frames except in the case of frames that
+ * are buffered in the driver -- those must remain buffered to avoid
+ * reordering. Because it is possible that no frames are released
+ * in this case, the driver must call ieee80211_sta_eosp_irqsafe()
+ * to indicate to mac80211 that the service period ended anyway.
+ *
+ * Finally, if frames from multiple TIDs are released from mac80211
+ * but the driver might reorder them, it must clear & set the flags
+ * appropriately (only the last frame may have %IEEE80211_TX_STATUS_EOSP)
+ * and also take care of the EOSP and MORE_DATA bits in the frame.
+ * The driver may also use ieee80211_sta_eosp_irqsafe() in this case.
+ */
+
+/**
* enum ieee80211_filter_flags - hardware filter flags
*
* These flags determine what the filter in hardware should be
next prev parent reply other threads:[~2011-09-22 15:50 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-22 15:47 [RFC 00/15] mac80211 uAPSD support Johannes Berg
2011-09-22 15:47 ` [RFC 01/15] mac80211: let drivers inform it about per TID buffered frames Johannes Berg
2011-09-22 15:47 ` [RFC 02/15] mac80211: unify TIM bit handling Johannes Berg
2011-09-22 15:47 ` [RFC 03/15] mac80211: also expire filtered frames Johannes Berg
2011-09-26 22:30 ` Luis R. Rodriguez
2011-09-27 2:26 ` Adrian Chadd
2011-09-27 7:50 ` Johannes Berg
2011-09-27 12:24 ` Adrian Chadd
2011-09-27 12:25 ` Adrian Chadd
2011-09-27 7:47 ` Johannes Berg
2011-09-22 15:47 ` [RFC 04/15] mac80211: split PS buffers into ACs Johannes Berg
2011-09-27 20:51 ` Luis R. Rodriguez
2011-09-28 7:10 ` Johannes Berg
2011-09-22 15:47 ` [RFC 05/15] mac80211: remove return value from add_pending_skbs Johannes Berg
2011-09-22 15:47 ` [RFC 06/15] mac80211: clear more-data bit on filtered frames Johannes Berg
2011-09-22 15:47 ` [RFC 07/15] mac80211: allow releasing driver-buffered frames Johannes Berg
2011-09-22 15:47 ` [RFC 08/15] mac80211: implement uAPSD Johannes Berg
2011-09-22 15:47 ` [RFC 09/15] mac80211: send (QoS) Null if no buffered frames Johannes Berg
2011-09-22 15:47 ` [RFC 10/15] mac80211: reply only once to each PS-poll Johannes Berg
2011-09-22 15:47 ` [RFC 11/15] mac80211: optimise station flags Johannes Berg
2011-09-22 15:47 ` [RFC 12/15] mac80211: add missing station flags to debugfs Johannes Berg
2011-09-22 15:47 ` [RFC 13/15] mac80211: explicitly notify drivers of frame release Johannes Berg
2011-09-22 15:47 ` [RFC 14/15] mac80211: allow out-of-band EOSP notification Johannes Berg
2011-09-22 15:47 ` Johannes Berg [this message]
2011-09-22 15:52 ` [RFC 00/15] mac80211 uAPSD support Johannes Berg
2011-09-22 23:25 ` Luis R. Rodriguez
2011-09-23 8:59 ` Johannes Berg
2011-09-23 18:06 ` Dmitry Tarnyagin
2011-09-23 18:14 ` Johannes Berg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110922154852.660073880@sipsolutions.net \
--to=johannes@sipsolutions.net \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.