wlan: Change conn_state to connecting before sme_RoamConnect
sme_RoamConnect() has a direct path to call hdd_smeRoamCallback(),
which will change the conn_state.
If direct path, conn_state will be accordingly changed to
NotConnected or Associated.
Driver is not changing connection state to eConnectionState_Connecting
when connecting with iwconfig.
If connection state is not changed, connection state will remain
in eConnectionState_NotConnected state.
In hdd_AssociationCompletionHandler, "hddDisconInProgress" is set
to true if conn state is eConnectionState_NotConnected.
If "hddDisconInProgress" is set to true then cfg80211 layer is not
informed of connect result indication which is an issue.
Change-Id: Ieeaef582a04aa90ddcdcc373b00b68442c795337
CRs-Fixed: 900008
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index 8d42891..a52d667 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -4193,8 +4193,46 @@
hdd_select_cbmode(pAdapter,
(WLAN_HDD_GET_CTX(pAdapter))->cfg_ini->AdHocChannel5G);
}
+ /*
+ * Change conn_state to connecting before sme_RoamConnect(),
+ * because sme_RoamConnect() has a direct path to call
+ * hdd_smeRoamCallback(), which will change the conn_state
+ * If direct path, conn_state will be accordingly changed
+ * to NotConnected or Associated by either
+ * hdd_AssociationCompletionHandler() or hdd_DisConnectHandler()
+ * in sme_RoamCallback()
+ * if sme_RomConnect is to be queued,
+ * Connecting state will remain until it is completed.
+ *
+ * If connection state is not changed,
+ * connection state will remain in eConnectionState_NotConnected state.
+ * In hdd_AssociationCompletionHandler, "hddDisconInProgress" is set to true
+ * if conn state is eConnectionState_NotConnected.
+ * If "hddDisconInProgress" is set to true then cfg80211 layer is not
+ * informed of connect result indication which is an issue.
+ */
+ if (WLAN_HDD_INFRA_STATION == pAdapter->device_mode ||
+ WLAN_HDD_P2P_CLIENT == pAdapter->device_mode)
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ FL("Set HDD connState to eConnectionState_Connecting"));
+ hdd_connSetConnectionState(WLAN_HDD_GET_STATION_CTX_PTR(pAdapter),
+ eConnectionState_Connecting);
+ }
status = sme_RoamConnect( hHal,pAdapter->sessionId,
&(pWextState->roamProfile), &roamId);
+
+ if ((eHAL_STATUS_SUCCESS != status) &&
+ (WLAN_HDD_INFRA_STATION == pAdapter->device_mode ||
+ WLAN_HDD_P2P_CLIENT == pAdapter->device_mode))
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("sme_RoamConnect (session %d) failed with status %d. -> NotConnected"),
+ pAdapter->sessionId, status);
+ /* change back to NotAssociated */
+ hdd_connSetConnectionState(WLAN_HDD_GET_STATION_CTX_PTR(pAdapter),
+ eConnectionState_NotConnected);
+ }
pRoamProfile->ChannelInfo.ChannelList = NULL;
pRoamProfile->ChannelInfo.numOfChannels = 0;
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 41c3865..d51e7e0 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -11466,18 +11466,29 @@
hdd_select_cbmode(pAdapter,operatingChannel);
}
- /* change conn_state to connecting before sme_RoamConnect(), because sme_RoamConnect()
- * has a direct path to call hdd_smeRoamCallback(), which will change the conn_state
- * If direct path, conn_state will be accordingly changed to NotConnected or Associated
- * by either hdd_AssociationCompletionHandler() or hdd_DisConnectHandler() in sme_RoamCallback()
- * if sme_RomConnect is to be queued, Connecting state will remain until it is completed.
- */
+ /*
+ * Change conn_state to connecting before sme_RoamConnect(),
+ * because sme_RoamConnect() has a direct path to call
+ * hdd_smeRoamCallback(), which will change the conn_state
+ * If direct path, conn_state will be accordingly changed
+ * to NotConnected or Associated by either
+ * hdd_AssociationCompletionHandler() or hdd_DisConnectHandler()
+ * in sme_RoamCallback()
+ * if sme_RomConnect is to be queued,
+ * Connecting state will remain until it is completed.
+ * If connection state is not changed,
+ * connection state will remain in eConnectionState_NotConnected state.
+ * In hdd_AssociationCompletionHandler, "hddDisconInProgress" is set to true
+ * if conn state is eConnectionState_NotConnected.
+ * If "hddDisconInProgress" is set to true then cfg80211 layer is not
+ * informed of connect result indication which is an issue.
+ */
+
if (WLAN_HDD_INFRA_STATION == pAdapter->device_mode ||
WLAN_HDD_P2P_CLIENT == pAdapter->device_mode)
{
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
- "%s: Set HDD connState to eConnectionState_Connecting",
- __func__);
+ FL("Set HDD connState to eConnectionState_Connecting"));
hdd_connSetConnectionState(WLAN_HDD_GET_STATION_CTX_PTR(pAdapter),
eConnectionState_Connecting);
}
@@ -11489,8 +11500,9 @@
WLAN_HDD_P2P_CLIENT == pAdapter->device_mode))
{
- hddLog(VOS_TRACE_LEVEL_ERROR, "%s: sme_RoamConnect (session %d) failed with "
- "status %d. -> NotConnected", __func__, pAdapter->sessionId, status);
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("sme_RoamConnect (session %d) failed with status %d. -> NotConnected"),
+ pAdapter->sessionId, status);
/* change back to NotAssociated */
hdd_connSetConnectionState(WLAN_HDD_GET_STATION_CTX_PTR(pAdapter),
eConnectionState_NotConnected);