From: Marco Porsch <marco@cozybit.com>
To: Johannes Berg <johannes@sipsolutions.net>
Cc: linux-wireless@vger.kernel.org, devel@lists.open80211s.org,
Ivan Bezyazychnyy <ivan.bezyazychnyy@gmail.com>,
Mike Krinkin <krinkin.m.u@gmail.com>,
Max Filippov <jcmvbkbc@gmail.com>
Subject: Re: [PATCHv3] mac80211: mesh power save basics
Date: Mon, 21 Jan 2013 11:08:21 +0100 [thread overview]
Message-ID: <50FD1395.1020106@cozybit.com> (raw)
In-Reply-To: <1358543924.7922.22.camel@jlt4.sipsolutions.net>
Hi,
On 01/18/2013 10:18 PM, Johannes Berg wrote:
> I was going to apply this, but then I still had a few questions.
>
>> +++ b/net/mac80211/mesh_ps.c
>> @@ -0,0 +1,605 @@
>> +/*
>> + * Copyright 2012, Marco Porsch <marco.porsch@s2005.tu-chemnitz.de>
>> + * Copyright 2012, cozybit Inc.
>
> First of all, do you want 2013 now maybe? Or 2012-2013 or something?
Yeah, right. Happy new years! ;)
I'll make it 2012-2013.
>> +static void mpsp_qos_null_append(struct sta_info *sta,
>> + struct sk_buff_head *frames)
>> +{
>> + struct ieee80211_sub_if_data *sdata = sta->sdata;
>> + struct sk_buff *new_skb, *skb = skb_peek_tail(frames);
>> + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
>> + struct ieee80211_tx_info *info;
>> +
>> + if (ieee80211_is_data_qos(hdr->frame_control))
>> + return;
>> +
>> + new_skb = mps_qos_null_get(sta);
>> + if (!new_skb)
>> + return;
>> +
>> + mps_dbg(sdata, "appending QoS Null in MPSP towards %pM\n",
>> + sta->sta.addr);
>> +
>> + /* should be transmitted last -> lowest priority */
>> + new_skb->priority = 1;
>> + skb_set_queue_mapping(new_skb, IEEE80211_AC_BK);
>
> That comment might do with exanding a bit? Without more explanation,
> transmission order doesn't really require BK -- except that this is done
> after potentially releasing multiple frames on different ACs, so it has
> to be BK to not pass any released BK frames. It's reasonable if you look
> at the (only) caller though, so I'm not worried about it.
/*
* This frame has to be transmitted last. Assign lowest priority to
* make sure it cannot pass other frames when releasing multiple ACs.
*/
I am not sure if this really correct. Isn't it that all ACs are served
in parallel and thus, a BK frame could be transmitted earlier than the
last of multiple BE/VI/VO frames? On the other hand, this code has
worked pretty reliably so far...
>> + /* prepare collected frames for transmission */
>> + skb_queue_walk(&frames, skb) {
>> + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
>> + struct ieee80211_hdr *hdr = (void *) skb->data;
>> +
>> + /*
>> + * Tell TX path to send this frame even though the
>> + * STA may still remain is PS mode after this frame
>> + * exchange.
>> + */
>> + info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER;
>> +
>> + if (more_data || !skb_queue_is_last(&frames, skb))
>> + hdr->frame_control |=
>> + cpu_to_le16(IEEE80211_FCTL_MOREDATA);
>> + else
>> + hdr->frame_control &=
>> + cpu_to_le16(~IEEE80211_FCTL_MOREDATA);
>> +
>> + if (skb_queue_is_last(&frames, skb) &&
>> + ieee80211_is_data_qos(hdr->frame_control)) {
>> + u8 *qoshdr = ieee80211_get_qos_ctl(hdr);
>> +
>> + /* MPSP trigger frame ends service period */
>> + *qoshdr |= IEEE80211_QOS_CTL_EOSP;
>> + info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS;
>> + }
>> + }
>
> Ultimately, this is where you should also call
> drv_allow_buffered_frames() and/or driver_release_buffered_frames(). In
> fact, the *driver* might be buffering frames, so that would be necessary
> for proper A-MPDU operation etc. I can merge it anyway, but be aware
> that it is not implementing the full API correctly, so once more drivers
> get fixed to rely on that API (really is a fix, especially with A-MPDU)
> you won't have much fun. But you said it doesn't really work with 11n
> anyway, so ... :)
Adding driver_allow_buffered_frames and a frame release reason for MPSPs
may be pretty straightforward. But I cannot foresee how it is going to
work for driver_release_buffered_frames on the driver side.
I guess eventually this whole MPSP frame release should be merged into
(and bloat) ieee80211_sta_ps_deliver_response. I would really like to
postpone that hoping that others may pick it up once mesh PS is upstream
in a proof of concept fashion.
>> @@ -997,6 +1006,8 @@ static void clear_sta_ps_flags(void *_sta)
>> if (sdata->vif.type == NL80211_IFTYPE_AP ||
>> sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
>> ps = &sdata->bss->ps;
>> + else if (ieee80211_vif_is_mesh(&sdata->vif))
>> + ps = &sdata->u.mesh.ps;
>
> Will this even compile with mesh turned off? It seems you should have a
> helper for "&sdata->u.mesh.ps" or something, so you can have just a
> single ifdef (you have a few places like this), maybe something like
> this:
>
>
> void *__force_mesh_link_error(void);
>
> static inline struct ... ieee80211_get_mesh_ps(sdata)
> {
> #ifdef MESH
> return ...;
> #else
> return __force_mesh_link_error();
> #endif
> }
>
>
>> @@ -329,6 +329,8 @@ static void purge_old_ps_buffers(struct ieee80211_local *local)
>>
>> if (sdata->vif.type == NL80211_IFTYPE_AP)
>> ps = &sdata->u.ap.ps;
>> + else if (ieee80211_vif_is_mesh(&sdata->vif))
>> + ps = &sdata->u.mesh.ps;
>
> For example here. I'd hate to see ifdefs in all those places.
Isn't that what ieee80211_vif_is_mesh is for? Everything compiled fine
with CONFIG_MAC80211_MESH turned off.
static inline bool ieee80211_vif_is_mesh(struct ieee80211_vif *vif)
{
#ifdef CONFIG_MAC80211_MESH
return vif->type == NL80211_IFTYPE_MESH_POINT;
#endif
return false;
}
>> 2 + 3 + /* DS params */
>> + 256 + /* TIM IE */
>
> If wonder if that should be 2 + 255? But I haven't looked up the TIM IE
> format again now ...
I did:
IEEE802.11-2012 8.4.2.7 says the size is 5 + [1...251].
ieee80211_beacon_get_tim also uses 256 for AP mode correctly.
Regards,
--Marco
next prev parent reply other threads:[~2013-01-21 10:08 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-18 11:46 [PATCHv3] mac80211: mesh power save basics Marco Porsch
2013-01-18 21:18 ` Johannes Berg
2013-01-21 10:08 ` Marco Porsch [this message]
2013-01-21 10:21 ` 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=50FD1395.1020106@cozybit.com \
--to=marco@cozybit.com \
--cc=devel@lists.open80211s.org \
--cc=ivan.bezyazychnyy@gmail.com \
--cc=jcmvbkbc@gmail.com \
--cc=johannes@sipsolutions.net \
--cc=krinkin.m.u@gmail.com \
--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.