P2P: proactive extension logic for RoC
Driver will request for extended RoC and cancel
it if no action packet is received and use
extended RoC if negotiation is in progress.
Change-Id: I71c523c7cd49b241e681b35a1b2cfc1c4099637a
CRs-Fixed: 638055
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 68958b0..aa3fd22 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -140,7 +140,7 @@
#else
#define MEMORY_DEBUG_STR ""
#endif
-
+#define MAX_WAIT_FOR_ROC_COMPLETION 3
/* the Android framework expects this param even though we don't use it */
#define BUF_LEN 20
static char fwpath_buffer[BUF_LEN];
@@ -6363,6 +6363,7 @@
eHalStatus halStatus = eHAL_STATUS_SUCCESS;
hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
union iwreq_data wrqu;
+ v_U8_t retry = 0;
long ret;
ENTER();
@@ -6425,6 +6426,30 @@
hdd_abort_mac_scan(pHddCtx, pAdapter->sessionId,
eCSR_SCAN_ABORT_DEFAULT);
}
+ if (pAdapter->device_mode != WLAN_HDD_INFRA_STATION)
+ {
+ while (pAdapter->is_roc_inprogress)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: ROC in progress for session %d!!!",
+ __func__, pAdapter->sessionId);
+ // waiting for ROC to expire
+ msleep(500);
+ /* In GO present case , if retry exceeds 3,
+ it means something went wrong. */
+ if ( retry++ > MAX_WAIT_FOR_ROC_COMPLETION )
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: ROC completion is not received.!!!", __func__);
+ sme_CancelRemainOnChannel(WLAN_HDD_GET_HAL_CTX(pAdapter),
+ pAdapter->sessionId);
+ wait_for_completion_interruptible_timeout(
+ &pAdapter->cancel_rem_on_chan_var,
+ msecs_to_jiffies(WAIT_CANCEL_REM_CHAN));
+ break;
+ }
+ }
+ }
#ifdef WLAN_NS_OFFLOAD
#ifdef WLAN_OPEN_SOURCE
cancel_work_sync(&pAdapter->ipv6NotifierWorkQueue);
@@ -6471,6 +6496,24 @@
case WLAN_HDD_SOFTAP:
case WLAN_HDD_P2P_GO:
//Any softap specific cleanup here...
+ if (pAdapter->device_mode == WLAN_HDD_P2P_GO) {
+ while (pAdapter->is_roc_inprogress) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: ROC in progress for session %d!!!",
+ __func__, pAdapter->sessionId);
+ msleep(500);
+ if ( retry++ > MAX_WAIT_FOR_ROC_COMPLETION ) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: ROC completion is not received.!!!", __func__);
+ WLANSAP_CancelRemainOnChannel(
+ (WLAN_HDD_GET_CTX(pAdapter))->pvosContext);
+ wait_for_completion_interruptible_timeout(
+ &pAdapter->cancel_rem_on_chan_var,
+ msecs_to_jiffies(WAIT_CANCEL_REM_CHAN));
+ break;
+ }
+ }
+ }
mutex_lock(&pHddCtx->sap_lock);
if (test_bit(SOFTAP_BSS_STARTED, &pAdapter->event_flags))
{