From: Johannes Berg <johannes@sipsolutions.net>
To: linux-wireless@vger.kernel.org
Subject: [RFC 5/5] mac80211: allow out-of-band EOSP notification
Date: Tue, 06 Sep 2011 22:27:08 +0200 [thread overview]
Message-ID: <20110906202725.888244880@sipsolutions.net> (raw)
In-Reply-To: 20110906201703.703254041@sipsolutions.net
From: Johannes Berg <johannes.berg@intel.com>
iwlwifi has a separate EOSP notification from
the device, and to make use of that properly
it needs to be passed to mac80211. To be able
to mix with tx_status_irqsafe and rx_irqsafe
it also needs to be an "_irqsafe" version in
the sense that it goes through the tasklet,
the actual flag clearing would be IRQ-safe
but doing it directly would cause reordering
issues.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
include/net/mac80211.h | 19 ++++++++++++++++++-
net/mac80211/ieee80211_i.h | 5 +++++
net/mac80211/main.c | 13 +++++++++++++
net/mac80211/sta_info.c | 23 +++++++++++++++++++++++
4 files changed, 59 insertions(+), 1 deletion(-)
--- a/net/mac80211/sta_info.c 2011-09-06 22:25:59.000000000 +0200
+++ b/net/mac80211/sta_info.c 2011-09-06 22:26:00.000000000 +0200
@@ -1356,6 +1356,29 @@ void ieee80211_sta_block_awake(struct ie
}
EXPORT_SYMBOL(ieee80211_sta_block_awake);
+void ieee80211_sta_eosp_irqsafe(struct ieee80211_sta *pubsta)
+{
+ struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
+ struct ieee80211_local *local = sta->local;
+ struct sk_buff *skb;
+ struct skb_eosp_msg_data *data;
+
+ skb = alloc_skb(0, GFP_ATOMIC);
+ if (!skb) {
+ /* too bad ... but race is better than loss */
+ clear_sta_flags(sta, WLAN_STA_SP);
+ return;
+ }
+
+ data = (void *)skb->cb;
+ memcpy(data->sta, pubsta->addr, ETH_ALEN);
+ memcpy(data->iface, sta->sdata->vif.addr, ETH_ALEN);
+ skb->pkt_type = IEEE80211_EOSP_MSG;
+ skb_queue_tail(&local->skb_queue, skb);
+ tasklet_schedule(&local->tasklet);
+}
+EXPORT_SYMBOL(ieee80211_sta_eosp_irqsafe);
+
void ieee80211_sta_set_buffered(struct ieee80211_sta *pubsta,
u8 tid, bool buffered)
{
--- a/include/net/mac80211.h 2011-09-06 22:25:59.000000000 +0200
+++ b/include/net/mac80211.h 2011-09-06 22:26:00.000000000 +0200
@@ -1948,7 +1948,8 @@ enum ieee80211_frame_release_type {
* at least one, however). In this case it is also responsible for
* setting the EOSP flag in the QoS header of the frames. Also, when the
* service period ends, the driver must set %IEEE80211_TX_STATUS_EOSP
- * on the last frame in the SP.
+ * on the last frame in the SP. Alternatively, it may call the function
+ * ieee80211_sta_eosp_irqsafe() to inform mac80211 of the end of the SP.
* This callback must be atomic.
*/
struct ieee80211_ops {
@@ -3072,6 +3073,22 @@ void ieee80211_sta_block_awake(struct ie
struct ieee80211_sta *pubsta, bool block);
/**
+ * ieee80211_sta_eosp - notify mac80211 about end of SP
+ * @pubsta: the station
+ *
+ * When a device transmits frames in a way that it can't
+ * tell us in the TX status about the EOSP, it must call
+ * this function instead.
+ *
+ * Note that there is no non-_irqsafe version right now as
+ * it wasn't needed, but just like _tx_status() and _rx()
+ * must not be mixed in irqsafe/non-irqsafe versions, this
+ * function must not be mixed with those either. Use the
+ * all irqsafe, or all non-irqsafe, don't mix!
+ */
+void ieee80211_sta_eosp_irqsafe(struct ieee80211_sta *pubsta);
+
+/**
* ieee80211_iter_keys - iterate keys programmed into the device
* @hw: pointer obtained from ieee80211_alloc_hw()
* @vif: virtual interface to iterate, may be %NULL for all
--- a/net/mac80211/main.c 2011-09-06 22:25:32.000000000 +0200
+++ b/net/mac80211/main.c 2011-09-06 22:26:00.000000000 +0200
@@ -325,6 +325,8 @@ u32 ieee80211_reset_erp_info(struct ieee
static void ieee80211_tasklet_handler(unsigned long data)
{
struct ieee80211_local *local = (struct ieee80211_local *) data;
+ struct sta_info *sta, *tmp;
+ struct skb_eosp_msg_data *eosp_data;
struct sk_buff *skb;
while ((skb = skb_dequeue(&local->skb_queue)) ||
@@ -340,6 +342,17 @@ static void ieee80211_tasklet_handler(un
skb->pkt_type = 0;
ieee80211_tx_status(local_to_hw(local), skb);
break;
+ case IEEE80211_EOSP_MSG:
+ eosp_data = (void *)skb->cb;
+ for_each_sta_info(local, eosp_data->sta, sta, tmp) {
+ /* skip wrong virtual interface */
+ if (memcmp(eosp_data->iface,
+ sta->sdata->vif.addr, ETH_ALEN))
+ continue;
+ clear_sta_flags(sta, WLAN_STA_SP);
+ break;
+ }
+ break;
default:
WARN(1, "mac80211: Packet is of unknown type %d\n",
skb->pkt_type);
--- a/net/mac80211/ieee80211_i.h 2011-09-06 22:25:32.000000000 +0200
+++ b/net/mac80211/ieee80211_i.h 2011-09-06 22:26:00.000000000 +0200
@@ -661,6 +661,11 @@ enum sdata_queue_type {
enum {
IEEE80211_RX_MSG = 1,
IEEE80211_TX_STATUS_MSG = 2,
+ IEEE80211_EOSP_MSG = 3,
+};
+
+struct skb_eosp_msg_data {
+ u8 sta[ETH_ALEN], iface[ETH_ALEN];
};
enum queue_stop_reason {
prev parent reply other threads:[~2011-09-06 20:28 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-06 20:27 [RFC 0/5] mac80211 AP-side uAPSD support Johannes Berg
2011-09-06 20:27 ` [RFC 1/5] mac80211: split PS buffers into ACs Johannes Berg
2011-09-06 20:27 ` [RFC 2/5] mac80211: allow releasing driver-buffered frames Johannes Berg
2011-09-06 20:27 ` [RFC 3/5] mac80211: implement uAPSD Johannes Berg
2011-09-07 11:41 ` Johannes Berg
2011-09-06 20:27 ` [RFC 4/5] mac80211: reply only once to each PS-poll Johannes Berg
2011-09-07 11:42 ` Johannes Berg
2011-09-06 20:27 ` Johannes Berg [this message]
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=20110906202725.888244880@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.