diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2019-05-25 00:25:31 +0000 |
---|---|---|
committer | Android Partner Code Review <android-gerrit-partner@google.com> | 2019-05-25 00:25:31 +0000 |
commit | 151b99a8686d039be7c9ccb420d19184532b6963 (patch) | |
tree | 0748aa528004b09668aab74d9f646af78bc79e18 | |
parent | 8d9a2ed6865f651e002c1b85be636508c13febbd (diff) | |
parent | 568347358ef99e8b8946d9e184a4e80774e07212 (diff) | |
download | qcacld-151b99a8686d039be7c9ccb420d19184532b6963.tar.gz |
Merge "qcacld-3.0: Clear oldest cached sta information" into android-msm-pixel-4.9-qtandroid-q-preview-5_r0.6android-q-preview-5_r0.4android-msm-crosshatch-4.9-q-preview-5android-msm-bonito-4.9-q-preview-5
-rw-r--r-- | core/hdd/inc/wlan_hdd_main.h | 1 | ||||
-rw-r--r-- | core/hdd/src/wlan_hdd_hostapd.c | 73 |
2 files changed, 49 insertions, 25 deletions
diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index 8882266650..2c5e22d90f 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -1046,6 +1046,7 @@ typedef struct { uint64_t rx_bytes; qdf_time_t last_tx_rx_ts; qdf_time_t assoc_ts; + qdf_time_t disassoc_ts; uint32_t tx_rate; uint32_t rx_rate; bool ampdu; diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index 5730572166..9018e2323b 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -1431,7 +1431,9 @@ static void hdd_fill_station_info(hdd_adapter_t *pHostapdAdapter, tSap_StationAssocReassocCompleteEvent *event) { hdd_station_info_t *stainfo; - uint8_t i = 0; + uint8_t i = 0, oldest_disassoc_sta_idx = WLAN_MAX_STA_COUNT + 1; + qdf_time_t oldest_disassoc_sta_ts = 0; + if (event->staId >= WLAN_MAX_STA_COUNT) { hdd_err("invalid sta id"); @@ -1491,8 +1493,6 @@ static void hdd_fill_station_info(hdd_adapter_t *pHostapdAdapter, cache_sta_info[i].macAddrSTA.bytes, event->staMac.bytes, QDF_MAC_ADDR_SIZE)) { - qdf_mem_zero(&pHostapdAdapter->cache_sta_info[i], - sizeof(*stainfo)); break; } i++; @@ -1503,14 +1503,36 @@ static void hdd_fill_station_info(hdd_adapter_t *pHostapdAdapter, while (i < WLAN_MAX_STA_COUNT) { if (pHostapdAdapter->cache_sta_info[i].isUsed != TRUE) break; + + if (pHostapdAdapter-> + cache_sta_info[i].disassoc_ts && + (!oldest_disassoc_sta_ts || + (qdf_system_time_after( + oldest_disassoc_sta_ts, + pHostapdAdapter-> + cache_sta_info[i].disassoc_ts)))) { + oldest_disassoc_sta_ts = + pHostapdAdapter-> + cache_sta_info[i].disassoc_ts; + oldest_disassoc_sta_idx = i; + } i++; } } - if (i < WLAN_MAX_STA_COUNT) + + if ((i == WLAN_MAX_STA_COUNT) && oldest_disassoc_sta_ts) { + hdd_debug("reached max cached staid, removing oldest stainfo"); + i = oldest_disassoc_sta_idx; + } + if (i < WLAN_MAX_STA_COUNT) { + qdf_mem_zero(&pHostapdAdapter->cache_sta_info[i], + sizeof(*stainfo)); qdf_mem_copy(&pHostapdAdapter->cache_sta_info[i], - stainfo, sizeof(hdd_station_info_t)); - else + stainfo, sizeof(hdd_station_info_t)); + + } else { hdd_debug("reached max staid, stainfo can't be cached"); + } hdd_debug("cap %d %d %d %d %d %d %d %d %d %x %d", stainfo->ampdu, @@ -1642,7 +1664,7 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent, eCsrPhyMode phy_mode; bool legacy_phymode; tSap_StationDisassocCompleteEvent *disassoc_comp; - hdd_station_info_t *stainfo; + hdd_station_info_t *stainfo, *cache_stainfo; cds_context_type *cds_ctx; hdd_adapter_t *sta_adapter; @@ -2255,21 +2277,19 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent, memcpy(wrqu.addr.sa_data, &disassoc_comp->staMac, QDF_MAC_ADDR_SIZE); - stainfo = hdd_get_stainfo(pHostapdAdapter->cache_sta_info, + cache_stainfo = hdd_get_stainfo(pHostapdAdapter->cache_sta_info, disassoc_comp->staMac); - if (!stainfo) { - hdd_err("peer " MAC_ADDRESS_STR " not found", - MAC_ADDR_ARRAY(wrqu.addr.sa_data)); - return -EINVAL; + if (cache_stainfo) { + /* Cache the disassoc info */ + cache_stainfo->rssi = disassoc_comp->rssi; + cache_stainfo->tx_rate = disassoc_comp->tx_rate; + cache_stainfo->rx_rate = disassoc_comp->rx_rate; + cache_stainfo->reason_code = disassoc_comp->reason_code; + cache_stainfo->disassoc_ts = qdf_system_ticks(); } hdd_notice(" disassociated " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(wrqu.addr.sa_data)); - stainfo->rssi = disassoc_comp->rssi; - stainfo->tx_rate = disassoc_comp->tx_rate; - stainfo->rx_rate = disassoc_comp->rx_rate; - stainfo->reason_code = disassoc_comp->reason_code; - qdf_status = qdf_event_set(&pHostapdState->qdf_sta_disassoc_event); if (!QDF_IS_STATUS_SUCCESS(qdf_status)) hdd_err("Station Deauth event Set failed"); @@ -2294,14 +2314,17 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent, pHostapdAdapter->sessionId, QDF_PROTO_TYPE_MGMT, QDF_PROTO_MGMT_DISASSOC)); - /* Send DHCP STOP indication to FW */ - stainfo->dhcp_phase = DHCP_PHASE_ACK; - if (stainfo->dhcp_nego_status == - DHCP_NEGO_IN_PROGRESS) - hdd_post_dhcp_ind(pHostapdAdapter, staId, - WMA_DHCP_STOP_IND); - stainfo->dhcp_nego_status = DHCP_NEGO_STOP; - + stainfo = hdd_get_stainfo(pHostapdAdapter->aStaInfo, + disassoc_comp->staMac); + if (stainfo) { + /* Send DHCP STOP indication to FW */ + stainfo->dhcp_phase = DHCP_PHASE_ACK; + if (stainfo->dhcp_nego_status == + DHCP_NEGO_IN_PROGRESS) + hdd_post_dhcp_ind(pHostapdAdapter, staId, + WMA_DHCP_STOP_IND); + stainfo->dhcp_nego_status = DHCP_NEGO_STOP; + } hdd_softap_deregister_sta(pHostapdAdapter, staId); pHddApCtx->bApActive = false; |