wlan: Use cfg80211_roamed_bss API to indicate the roaming
After disconnect request, the driver sends disconnect
indication to the kernel and it schedules a workqueue to
process this disconnect event. Now if this workqueue is
delayed and connect request is received before its
scheduled, the disconnect event workqueue reset the
ssid_len of the wdev.
Now as the ssid_len does not match with bss ssid length the
get bss returns NULL and thus roam indication is not sent
to supplicant.
To fix this use cfg80211_roamed_bss to indicate the roaming
and use the ssid and ssid len from driver to get the bss.
Change-Id: I5b88ce41951cb61582ee801be124ca0b5b6b825b
CRs-Fixed: 1098150
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index ff47f50..da10694 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -1741,6 +1741,10 @@
VOS_STATUS hdd_reset_all_adapters( hdd_context_t *pHddCtx );
VOS_STATUS hdd_start_all_adapters( hdd_context_t *pHddCtx );
VOS_STATUS hdd_reconnect_all_adapters( hdd_context_t *pHddCtx );
+struct cfg80211_bss* hdd_get_bss_entry(struct wiphy *wiphy,
+ struct ieee80211_channel *channel,
+ const u8 *bssid,
+ const u8 *ssid, size_t ssid_len);
void hdd_connect_result(struct net_device *dev, const u8 *bssid,
tCsrRoamInfo *roam_info, const u8 *req_ie,
size_t req_ie_len, const u8 * resp_ie,
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index 58d682d..4fc44c2 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -1500,7 +1500,10 @@
u8 *pFTAssocRsp = NULL;
v_U8_t *rspRsnIe = kmalloc(IW_GENERIC_IE_MAX, GFP_KERNEL);
tANI_U32 rspRsnLength = 0;
+ struct cfg80211_bss* bss;
+ tCsrRoamConnectedProfile roam_profile;
struct ieee80211_channel *chan;
+ tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
if (!rspRsnIe) {
hddLog(LOGE, "%s: Unable to allocate RSN IE", __func__);
@@ -1534,8 +1537,15 @@
memcpy(rspRsnIe, pFTAssocRsp, len);
memset(rspRsnIe + len, 0, IW_GENERIC_IE_MAX - len);
- chan = ieee80211_get_channel(pAdapter->wdev.wiphy, (int) pCsrRoamInfo->pBssDesc->channelId);
- cfg80211_roamed(dev,chan,pCsrRoamInfo->bssid,
+ chan = ieee80211_get_channel(pAdapter->wdev.wiphy,
+ (int) pCsrRoamInfo->pBssDesc->channelId);
+ vos_mem_zero(&roam_profile, sizeof(tCsrRoamConnectedProfile));
+ sme_RoamGetConnectProfile(hHal, pAdapter->sessionId, &roam_profile);
+ bss = hdd_get_bss_entry(pAdapter->wdev.wiphy,
+ chan, pCsrRoamInfo->bssid,
+ &roam_profile.SSID.ssId[0],
+ roam_profile.SSID.length);
+ cfg80211_roamed_bss(dev, bss,
reqRsnIe, reqRsnLength,
rspRsnIe, rspRsnLength,GFP_KERNEL);
@@ -1780,6 +1790,8 @@
{
if ( !hddDisconInProgress )
{
+ struct cfg80211_bss *roam_bss;
+
hddLog(LOG1, "%s ft_carrier_on is %d, sending roamed "
"indication", __FUNCTION__, ft_carrier_on);
chan = ieee80211_get_channel(pAdapter->wdev.wiphy,
@@ -1791,9 +1803,14 @@
{
vos_record_roam_event(e_HDD_SEND_REASSOC_RSP, NULL, 0);
}
- cfg80211_roamed(dev,chan, pRoamInfo->bssid,
- pFTAssocReq, assocReqlen, pFTAssocRsp, assocRsplen,
- GFP_KERNEL);
+ roam_bss = hdd_get_bss_entry(pAdapter->wdev.wiphy,
+ chan, pRoamInfo->bssid,
+ pRoamInfo->u.pConnectedProfile->SSID.ssId,
+ pRoamInfo->u.pConnectedProfile->SSID.length);
+ cfg80211_roamed_bss(dev, roam_bss,
+ pFTAssocReq, assocReqlen,
+ pFTAssocRsp, assocRsplen,
+ GFP_KERNEL);
}
if (sme_GetFTPTKState(WLAN_HDD_GET_HAL_CTX(pAdapter)))
{
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 3834989..fdbbae1 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -12267,15 +12267,9 @@
struct wiphy *wiphy = wdev->wiphy;
struct cfg80211_bss *bss = NULL;
- bss = cfg80211_get_bss(wiphy, NULL, bssid,
- NULL,
- 0,
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)) && !defined(WITH_BACKPORTS) \
- && !defined(IEEE80211_PRIVACY)
- WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS);
-#else
- IEEE80211_BSS_TYPE_ESS, IEEE80211_PRIVACY_ANY);
-#endif
+ bss = hdd_get_bss_entry(wiphy,
+ NULL, bssid,
+ NULL, 0);
if (bss == NULL) {
hddLog(LOGE, FL("BSS not present"));
} else {
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 88bab0b..f3c6f66 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -9364,6 +9364,45 @@
}
/**
+ * hdd_get_bss_entry() - Get the bss entry matching the chan, bssid and ssid
+ * @wiphy: wiphy
+ * @channel: channel of the BSS to find
+ * @bssid: bssid of the BSS to find
+ * @ssid: ssid of the BSS to find
+ * @ssid_len: ssid len of of the BSS to find
+ *
+ * The API is a wrapper to get bss from kernel matching the chan,
+ * bssid and ssid
+ *
+ * Return: Void
+ */
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)) \
+ && !defined(WITH_BACKPORTS) && !defined(IEEE80211_PRIVACY)
+
+struct cfg80211_bss* hdd_get_bss_entry(struct wiphy *wiphy,
+ struct ieee80211_channel *channel,
+ const u8 *bssid,
+ const u8 *ssid, size_t ssid_len)
+{
+ return cfg80211_get_bss(wiphy, channel, bssid,
+ ssid, ssid_len,
+ WLAN_CAPABILITY_ESS,
+ WLAN_CAPABILITY_ESS);
+}
+#else
+struct cfg80211_bss* hdd_get_bss_entry(struct wiphy *wiphy,
+ struct ieee80211_channel *channel,
+ const u8 *bssid,
+ const u8 *ssid, size_t ssid_len)
+{
+ return cfg80211_get_bss(wiphy, channel, bssid,
+ ssid, ssid_len,
+ IEEE80211_BSS_TYPE_ESS,
+ IEEE80211_PRIVACY_ANY);
+}
+#endif
+
+/**
* hdd_connect_result() - API to send connection status to supplicant
* @dev: network device
* @bssid: bssid to which we want to associate
@@ -9406,18 +9445,10 @@
IEEE80211_BAND_5GHZ);
chan = ieee80211_get_channel(padapter->wdev.wiphy, freq);
-
- bss = cfg80211_get_bss(padapter->wdev.wiphy, chan, bssid,
- roam_info->u.pConnectedProfile->SSID.ssId,
- roam_info->u.pConnectedProfile->SSID.length,
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)) \
- && !defined(WITH_BACKPORTS) && !defined(IEEE80211_PRIVACY)
- WLAN_CAPABILITY_ESS
- WLAN_CAPABILITY_ESS);
-#else
- IEEE80211_BSS_TYPE_ESS,
- IEEE80211_PRIVACY_ANY);
-#endif
+ bss = hdd_get_bss_entry(padapter->wdev.wiphy,
+ chan, bssid,
+ roam_info->u.pConnectedProfile->SSID.ssId,
+ roam_info->u.pConnectedProfile->SSID.length);
}
cfg80211_connect_bss(dev, bssid, bss, req_ie, req_ie_len,