[PATCH 1/1] P2P: Prevent pending_action_tx from truncating extended listen

Jithu Jance jithujance at gmail.com
Wed Aug 13 10:51:05 EDT 2014


Hi Jouni,

Thanks for your review comments.

>
>>       if (wpa_s->p2p_long_listen > 0)
>>               wpa_s->p2p_long_listen -= wpa_s->max_remain_on_chan;
>> -     if (wpa_s->p2p_long_listen > 0) {
>> -             wpa_printf(MSG_DEBUG, "P2P: Continuing long Listen state");
>> -             wpas_p2p_listen_start(wpa_s, wpa_s->p2p_long_listen);
>> -     } else {
>> +     else {
>
> This looks incorrect.. The previous version decremented
> wpa_s->p2p_long_listen first and only after that compared it to >0 (and
> well, <=0 in case of the else clause).
>
>>               /*
>>                * When listen duration is over, stop listen & update p2p_state
>>                * to IDLE.
>>                */
>>               p2p_stop_listen(wpa_s->global->p2p);
>>       }
>
> So this could potentially not happen for the first time p2p_long_listen
> drops to zero (or below).

Got it. Thanks! I moved this piece of code above
offchannel_pending_listen is to make sure that p2p_long_listen is
updated in
the remain_on_channel_cb context itself and to avoid moving the code
to wpas_p2p_continue_listen_context. So that in case,
p2p_long_listen is accessed in between, it has an updated value
(though it is not done currently).


>
> Unless I'm missing something here, more appropriate way of addressing
> this would be to have the completion of the pending Action frame TX
> schedule a new P2P Listen if wpa_s->p2p_long_listen > 0.
Sounds good!. You mean offchannel_send_action_tx_status function?
Let me know whether below patch is fine. I have moved the p2p_long_listen
above to make sure that it remains updated even if we return from offchannel_tx
or listen_end. Hope it is fine.
---
 wpa_supplicant/offchannel.c     |    6 ++++++
 wpa_supplicant/p2p_supplicant.c |    4 ++--
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/wpa_supplicant/offchannel.c b/wpa_supplicant/offchannel.c
index 77683b6..891f641 100644
--- a/wpa_supplicant/offchannel.c
+++ b/wpa_supplicant/offchannel.c
@@ -188,6 +188,12 @@ void offchannel_send_action_tx_status(
            wpa_s->pending_action_bssid,
            data, data_len, result);
    }
+
+   if (wpa_s->p2p_long_listen > 0) {
+       /* Continue the listen */
+       wpa_printf(MSG_DEBUG, "P2P: Continuing long Listen state");
+       wpas_p2p_listen_start(wpa_s, wpa_s->p2p_long_listen);
+   }
 }


diff --git a/wpa_supplicant/p2p_supplicant.c
b/wpa_supplicant/p2p_supplicant.c
index d91877c..a1b08f7 100644
--- a/wpa_supplicant/p2p_supplicant.c
+++ b/wpa_supplicant/p2p_supplicant.c
@@ -4954,12 +4954,12 @@ void
wpas_p2p_cancel_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
    wpas_p2p_listen_work_done(wpa_s);
    if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
        return;
+   if (wpa_s->p2p_long_listen > 0)
+       wpa_s->p2p_long_listen -= wpa_s->max_remain_on_chan;
    if (p2p_listen_end(wpa_s->global->p2p, freq) > 0)
        return; /* P2P module started a new operation */
    if (offchannel_pending_action_tx(wpa_s))
        return;
-   if (wpa_s->p2p_long_listen > 0)
-       wpa_s->p2p_long_listen -= wpa_s->max_remain_on_chan;
    if (wpa_s->p2p_long_listen > 0) {
        wpa_printf(MSG_DEBUG, "P2P: Continuing long Listen state");
        wpas_p2p_listen_start(wpa_s, wpa_s->p2p_long_listen);
--
1.7.9.5


More information about the HostAP mailing list