diff options
| author | Deepthi Gowri <c_gowri@qti.qualcomm.com> | 2016-06-21 17:59:33 +0530 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2016-06-23 16:31:54 +0530 |
| commit | 485c35a72f5267d63a055a58aff8afd52fd0f65d (patch) | |
| tree | 22bc85336e2cf4497ac1d0ea1e2363167f4c28ba | |
| parent | ff4a88e33cfe36fac6458b075a188665615a9a48 (diff) | |
qcacld-2.0: Fix P2P GO Negotiation failure issue
Sometimes it is possible for the host to receive the ack for
go negotiation request after the go negotiation confirmation
is sent. So supplicant assumes go negotiation confirmation is
success though it is not and results in connection failure.
To address this, drop the pending ack for the go negotiation
request. so that the supplicant will wait for the ack of the
negotiation confirmation.
CRs-Fixed: 1032185
Change-Id: I54f305319e23b1ffcbd54cc6e7dcc74d39a2e511
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_main.h | 5 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_p2p.c | 17 |
2 files changed, 21 insertions, 1 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h index 7e3a85a3b86c..e5cdec427b15 100644 --- a/CORE/HDD/inc/wlan_hdd_main.h +++ b/CORE/HDD/inc/wlan_hdd_main.h @@ -683,6 +683,11 @@ typedef struct hdd_cfg80211_state_s hdd_remain_on_chan_ctx_t* remain_on_chan_ctx; struct mutex remain_on_chan_ctx_lock; eP2PActionFrameState actionFrmState; + /* is_go_neg_ack_received flag is set to 1 when + * the pending ack for GO negotiation req is + * received. + */ + v_BOOL_t is_go_neg_ack_received; }hdd_cfg80211_state_t; diff --git a/CORE/HDD/src/wlan_hdd_p2p.c b/CORE/HDD/src/wlan_hdd_p2p.c index e51d57f302d2..1e81402e67bd 100644 --- a/CORE/HDD/src/wlan_hdd_p2p.c +++ b/CORE/HDD/src/wlan_hdd_p2p.c @@ -1865,11 +1865,25 @@ void hdd_sendActionCnf( hdd_adapter_t *pAdapter, tANI_BOOLEAN actionSendSuccess cfgState->actionFrmState = HDD_IDLE; - hddLog( LOG1, "Send Action cnf, actionSendSuccess %d", actionSendSuccess); if( NULL == cfgState->buf ) { return; } + if (cfgState->is_go_neg_ack_received) { + + cfgState->is_go_neg_ack_received = 0 ; + /* Sometimes its possible that host may receive the ack for GO + * negotiation req after sending go negotaition confirmation, + * in such case drop the ack received for the go negotiation + * request, so that supplicant waits for the confirmation ack + * from firmware. + */ + hddLog( LOG1, FL("Drop the pending ack received in cfgState->actionFrmState %d"), + cfgState->actionFrmState); + return; + } + + hddLog( LOG1, "Send Action cnf, actionSendSuccess %d", actionSendSuccess); /* * buf is the same pointer it passed us to send. Since we are sending @@ -2635,6 +2649,7 @@ void __hdd_indicate_mgmt_frame(hdd_adapter_t *pAdapter, { hddLog(LOG1, "%s: ACK_PENDING and But received RESP for Action frame ", __func__); + cfgState->is_go_neg_ack_received = 1; hdd_sendActionCnf(pAdapter, TRUE); } } |
