wlan: Cache last connection info
Currently last connection info is not getting cached, so when
GETBSSINFO command comes information is extracted from current
conn_info which does not contain all the information required
as this information is cleared after disconnection.
To address this issue cache the connection info before
clearing it.
Change-Id: I3ec13264f97e7a4d0dc4699b463074062d087e82
CRs-Fixed: 2188187
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 15327de..fdb877f 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -828,6 +828,8 @@
/**Connection information*/
connection_info_t conn_info;
+ connection_info_t cache_conn_info;
+
roaming_info_t roam_info;
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index 94e773d..4e1b943 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -795,6 +795,9 @@
} else {
hdd_sta_ctx->conn_info.conn_flag.vht_op_present = false;
}
+ /* Cache last connection info */
+ vos_mem_copy(&hdd_sta_ctx->cache_conn_info, &hdd_sta_ctx->conn_info,
+ sizeof(connection_info_t));
}
void hdd_connSaveConnectInfo( hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo, eCsrRoamBssType eBssType )
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 05a6b09..c955cae 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -984,7 +984,8 @@
if (!nla_attr)
goto fail;
/* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */
- bitrate = cfg80211_calculate_bitrate(&hdd_sta_ctx->conn_info.txrate);
+ bitrate = cfg80211_calculate_bitrate(
+ &hdd_sta_ctx->cache_conn_info.txrate);
/* report 16-bit bitrate only if we can */
bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0;
@@ -999,7 +1000,7 @@
goto fail;
}
if (nla_put_u8(skb, NL80211_RATE_INFO_VHT_NSS,
- hdd_sta_ctx->conn_info.txrate.nss)) {
+ hdd_sta_ctx->cache_conn_info.txrate.nss)) {
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"put fail");
goto fail;
}
@@ -1026,7 +1027,7 @@
if (!nla_attr)
goto fail;
if (nla_put_u8(skb, NL80211_STA_INFO_SIGNAL,
- (hdd_sta_ctx->conn_info.signal + 100))) {
+ (hdd_sta_ctx->cache_conn_info.signal + 100))) {
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"put fail");
goto fail;
}
@@ -1056,9 +1057,9 @@
if (!nla_attr)
goto fail;
if (nla_put_u32(skb, NL80211_SURVEY_INFO_FREQUENCY,
- hdd_sta_ctx->conn_info.freq) ||
+ hdd_sta_ctx->cache_conn_info.freq) ||
nla_put_u8(skb, NL80211_SURVEY_INFO_NOISE,
- (hdd_sta_ctx->conn_info.noise + 100))) {
+ (hdd_sta_ctx->cache_conn_info.noise + 100))) {
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"put fail");
goto fail;
}
@@ -1087,11 +1088,14 @@
goto fail;
if (nla_put(skb,
NL80211_ATTR_SSID,
- hdd_sta_ctx->conn_info.SSID.SSID.length,
- hdd_sta_ctx->conn_info.SSID.SSID.ssId)) {
+ hdd_sta_ctx->cache_conn_info.SSID.SSID.length,
+ hdd_sta_ctx->cache_conn_info.SSID.SSID.ssId)) {
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"put fail");
goto fail;
}
+ if (nla_put(skb, NL80211_ATTR_MAC, VOS_MAC_ADDR_SIZE,
+ hdd_sta_ctx->cache_conn_info.bssId))
+ goto fail;
if (hdd_add_survey_info(skb, hdd_sta_ctx, NL80211_ATTR_SURVEY_INFO))
goto fail;
if (hdd_add_sta_info(skb, hdd_sta_ctx, NL80211_ATTR_STA_INFO))
@@ -1119,17 +1123,17 @@
nla_attr = nla_nest_start(skb, idx);
if (!nla_attr)
goto fail;
- if (hdd_sta_ctx->conn_info.conn_flag.vht_present)
+ if (hdd_sta_ctx->cache_conn_info.conn_flag.vht_present)
if (nla_put(skb, NL80211_ATTR_VHT_CAPABILITY,
- sizeof(hdd_sta_ctx->conn_info.vht_caps),
- &hdd_sta_ctx->conn_info.vht_caps)) {
+ sizeof(hdd_sta_ctx->cache_conn_info.vht_caps),
+ &hdd_sta_ctx->cache_conn_info.vht_caps)) {
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"put fail");
goto fail;
}
- if (hdd_sta_ctx->conn_info.conn_flag.ht_present)
+ if (hdd_sta_ctx->cache_conn_info.conn_flag.ht_present)
if (nla_put(skb, NL80211_ATTR_HT_CAPABILITY,
- sizeof(hdd_sta_ctx->conn_info.ht_caps),
- &hdd_sta_ctx->conn_info.ht_caps)) {
+ sizeof(hdd_sta_ctx->cache_conn_info.ht_caps),
+ &hdd_sta_ctx->cache_conn_info.ht_caps)) {
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"put fail");
goto fail;
}
@@ -1157,28 +1161,33 @@
hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
nl_buf_len = NLMSG_HDRLEN;
- nl_buf_len += sizeof(hdd_sta_ctx->conn_info.SSID.SSID.length) +
- sizeof(hdd_sta_ctx->conn_info.freq) +
- sizeof(hdd_sta_ctx->conn_info.noise) +
- sizeof(hdd_sta_ctx->conn_info.signal) +
+
+ nl_buf_len += sizeof(hdd_sta_ctx->cache_conn_info.SSID.SSID.length) +
+ VOS_MAC_ADDR_SIZE +
+ sizeof(hdd_sta_ctx->cache_conn_info.freq) +
+ sizeof(hdd_sta_ctx->cache_conn_info.noise) +
+ sizeof(hdd_sta_ctx->cache_conn_info.signal) +
(sizeof(uint32_t) * 2) +
- sizeof(hdd_sta_ctx->conn_info.txrate.nss) +
- sizeof(hdd_sta_ctx->conn_info.roam_count) +
- sizeof(hdd_sta_ctx->conn_info.authType) +
- sizeof(hdd_sta_ctx->conn_info.dot11Mode);
- if (hdd_sta_ctx->conn_info.conn_flag.vht_present)
- nl_buf_len += sizeof(hdd_sta_ctx->conn_info.vht_caps);
- if (hdd_sta_ctx->conn_info.conn_flag.ht_present)
- nl_buf_len += sizeof(hdd_sta_ctx->conn_info.ht_caps);
- if (hdd_sta_ctx->conn_info.conn_flag.hs20_present) {
- tmp_hs20 = (uint8_t *)&(hdd_sta_ctx->conn_info.hs20vendor_ie);
- nl_buf_len += (sizeof(hdd_sta_ctx->conn_info.hs20vendor_ie) -
+ sizeof(hdd_sta_ctx->cache_conn_info.txrate.nss) +
+ sizeof(hdd_sta_ctx->cache_conn_info.roam_count) +
+ sizeof(hdd_sta_ctx->cache_conn_info.authType) +
+ sizeof(hdd_sta_ctx->cache_conn_info.dot11Mode);
+ if (hdd_sta_ctx->cache_conn_info.conn_flag.vht_present)
+ nl_buf_len += sizeof(hdd_sta_ctx->cache_conn_info.vht_caps);
+ if (hdd_sta_ctx->cache_conn_info.conn_flag.ht_present)
+ nl_buf_len += sizeof(hdd_sta_ctx->cache_conn_info.ht_caps);
+ if (hdd_sta_ctx->cache_conn_info.conn_flag.hs20_present) {
+ tmp_hs20 = (uint8_t *)&(hdd_sta_ctx->
+ cache_conn_info.hs20vendor_ie);
+ nl_buf_len +=
+ (sizeof(hdd_sta_ctx->cache_conn_info.hs20vendor_ie) -
1);
}
- if (hdd_sta_ctx->conn_info.conn_flag.ht_op_present)
- nl_buf_len += sizeof(hdd_sta_ctx->conn_info.ht_operation);
- if (hdd_sta_ctx->conn_info.conn_flag.vht_op_present)
- nl_buf_len += sizeof(hdd_sta_ctx->conn_info.vht_operation);
+ if (hdd_sta_ctx->cache_conn_info.conn_flag.ht_op_present)
+ nl_buf_len += sizeof(hdd_sta_ctx->cache_conn_info.ht_operation);
+ if (hdd_sta_ctx->cache_conn_info.conn_flag.vht_op_present)
+ nl_buf_len +=
+ sizeof(hdd_sta_ctx->cache_conn_info.vht_operation);
skb = cfg80211_vendor_cmd_alloc_reply_skb(hdd_ctx->wiphy, nl_buf_len);
@@ -1199,34 +1208,35 @@
goto fail;
}
if (nla_put_u32(skb, INFO_ROAM_COUNT,
- hdd_sta_ctx->conn_info.roam_count) ||
+ hdd_sta_ctx->cache_conn_info.roam_count) ||
nla_put_u32(skb, INFO_AKM,
hdd_convert_auth_type(
- hdd_sta_ctx->conn_info.authType)) ||
+ hdd_sta_ctx->cache_conn_info.authType)) ||
nla_put_u32(skb, WLAN802_11_MODE,
hdd_convert_dot11mode(
- hdd_sta_ctx->conn_info.dot11Mode))) {
+ hdd_sta_ctx->cache_conn_info.dot11Mode))) {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"put fail");
goto fail;
}
- if (hdd_sta_ctx->conn_info.conn_flag.ht_op_present)
+ if (hdd_sta_ctx->cache_conn_info.conn_flag.ht_op_present)
if (nla_put(skb, HT_OPERATION,
- (sizeof(hdd_sta_ctx->conn_info.ht_operation)),
- &hdd_sta_ctx->conn_info.ht_operation)) {
+ (sizeof(hdd_sta_ctx->cache_conn_info.ht_operation)),
+ &hdd_sta_ctx->cache_conn_info.ht_operation)) {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"put fail");
goto fail;
}
- if (hdd_sta_ctx->conn_info.conn_flag.vht_op_present)
+ if (hdd_sta_ctx->cache_conn_info.conn_flag.vht_op_present)
if (nla_put(skb, VHT_OPERATION,
- (sizeof(hdd_sta_ctx->conn_info.vht_operation)),
- &hdd_sta_ctx->conn_info.vht_operation)) {
+ (sizeof(hdd_sta_ctx->
+ cache_conn_info.vht_operation)),
+ &hdd_sta_ctx->cache_conn_info.vht_operation)) {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"put fail");
goto fail;
}
- if (hdd_sta_ctx->conn_info.conn_flag.hs20_present)
+ if (hdd_sta_ctx->cache_conn_info.conn_flag.hs20_present)
if (nla_put(skb, AP_INFO_HS20_INDICATION,
- (sizeof(hdd_sta_ctx->conn_info.hs20vendor_ie) - 1),
- tmp_hs20 + 1)) {
+ (sizeof(hdd_sta_ctx->cache_conn_info.hs20vendor_ie)
+ - 1), tmp_hs20 + 1)) {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"put fail");
goto fail;
}
@@ -16821,7 +16831,6 @@
pWextState->roamProfile.AuthType.authType[0] =
pHddStaCtx->conn_info.authType =
eCSR_AUTH_TYPE_OPEN_SYSTEM;
-
if (params->privacy)
{
/* Security enabled IBSS, At this time there is no information available
@@ -17632,7 +17641,9 @@
wlan_hdd_get_rssi(pAdapter, &sinfo->signal);
wlan_hdd_get_snr(pAdapter, &snr);
pHddStaCtx->conn_info.signal = sinfo->signal;
+ pHddStaCtx->cache_conn_info.signal = sinfo->signal;
pHddStaCtx->conn_info.noise = pHddStaCtx->conn_info.signal - snr;
+ pHddStaCtx->cache_conn_info.noise = pHddStaCtx->conn_info.noise;
wlan_hdd_fill_station_info_signal(sinfo);
/*overwrite rate_flags if MAX link-speed need to be reported*/
@@ -18062,6 +18073,9 @@
vos_mem_copy(&pHddStaCtx->conn_info.txrate,
&sinfo->txrate, sizeof(sinfo->txrate));
+ vos_mem_copy(&pHddStaCtx->cache_conn_info.txrate,
+ &sinfo->txrate, sizeof(sinfo->txrate));
+
if (rate_flags & eHAL_TX_RATE_LEGACY)
hddLog(LOG1, FL("Reporting RSSI:%d legacy rate %d pkt cnt tx %d rx %d"),
sinfo->signal, sinfo->txrate.legacy, sinfo->tx_packets,