diff options
| -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); } } |
