|
@@ -4164,6 +4164,26 @@ csr_is_deauth_disassoc_already_active(struct mac_context *mac_ctx,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static void csr_roam_issue_disconnect_stats(struct mac_context *mac,
|
|
|
+ uint32_t session_id,
|
|
|
+ struct qdf_mac_addr peer_mac)
|
|
|
+{
|
|
|
+ tSmeCmd *cmd;
|
|
|
+
|
|
|
+ cmd = csr_get_command_buffer(mac);
|
|
|
+ if (!cmd) {
|
|
|
+ sme_err(" fail to get command buffer");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ cmd->command = eSmeCommandGetdisconnectStats;
|
|
|
+ cmd->vdev_id = session_id;
|
|
|
+ qdf_mem_copy(&cmd->u.disconnect_stats_cmd.peer_mac_addr, &peer_mac,
|
|
|
+ QDF_MAC_ADDR_SIZE);
|
|
|
+ if (QDF_IS_STATUS_ERROR(csr_queue_sme_command(mac, cmd, true)))
|
|
|
+ sme_err("fail to queue get disconnect stats");
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
* csr_roam_issue_disassociate_sta_cmd() - disassociate a associated station
|
|
|
* @sessionId: Session Id for Soft AP
|
|
@@ -4200,6 +4220,11 @@ QDF_STATUS csr_roam_issue_disassociate_sta_cmd(struct mac_context *mac,
|
|
|
sizeof(pCommand->u.roamCmd.peerMac));
|
|
|
pCommand->u.roamCmd.reason =
|
|
|
(tSirMacReasonCodes)p_del_sta_params->reason_code;
|
|
|
+
|
|
|
+ csr_roam_issue_disconnect_stats(
|
|
|
+ mac, sessionId,
|
|
|
+ p_del_sta_params->peerMacAddr);
|
|
|
+
|
|
|
status = csr_queue_sme_command(mac, pCommand, true);
|
|
|
if (!QDF_IS_STATUS_SUCCESS(status))
|
|
|
sme_err("fail to send message status: %d", status);
|
|
@@ -4242,6 +4267,10 @@ QDF_STATUS csr_roam_issue_deauth_sta_cmd(struct mac_context *mac,
|
|
|
sizeof(tSirMacAddr));
|
|
|
pCommand->u.roamCmd.reason =
|
|
|
(tSirMacReasonCodes)pDelStaParams->reason_code;
|
|
|
+
|
|
|
+ csr_roam_issue_disconnect_stats(mac, sessionId,
|
|
|
+ pDelStaParams->peerMacAddr);
|
|
|
+
|
|
|
status = csr_queue_sme_command(mac, pCommand, true);
|
|
|
if (!QDF_IS_STATUS_SUCCESS(status))
|
|
|
sme_err("fail to send message status: %d", status);
|
|
@@ -6318,19 +6347,22 @@ static void csr_get_peer_rssi_cb(struct stats_event *ev, void *cookie)
|
|
|
struct mac_context *mac = (struct mac_context *)cookie;
|
|
|
|
|
|
if (!mac)
|
|
|
- return;
|
|
|
+ goto disconnect_stats_complete;
|
|
|
if (!ev->peer_stats) {
|
|
|
sme_debug("%s no peer stats\n", __func__);
|
|
|
- return;
|
|
|
+ goto disconnect_stats_complete;
|
|
|
}
|
|
|
mac->peer_rssi = ev->peer_stats->peer_rssi;
|
|
|
mac->peer_txrate = ev->peer_stats->tx_rate;
|
|
|
mac->peer_rxrate = ev->peer_stats->rx_rate;
|
|
|
if (!ev->peer_extended_stats) {
|
|
|
sme_debug("%s no peer extended stats\n", __func__);
|
|
|
- return;
|
|
|
+ goto disconnect_stats_complete;
|
|
|
}
|
|
|
mac->rx_mc_bc_cnt = ev->peer_extended_stats->rx_mc_bc_cnt;
|
|
|
+
|
|
|
+disconnect_stats_complete:
|
|
|
+ csr_roam_get_disconnect_stats_complete(mac);
|
|
|
}
|
|
|
|
|
|
static void csr_get_peer_rssi(struct mac_context *mac, uint32_t session_id,
|
|
@@ -6368,7 +6400,6 @@ QDF_STATUS csr_roam_process_command(struct mac_context *mac, tSmeCmd *pCommand)
|
|
|
QDF_STATUS lock_status, status = QDF_STATUS_SUCCESS;
|
|
|
uint32_t sessionId = pCommand->vdev_id;
|
|
|
struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId);
|
|
|
- struct qdf_mac_addr peer_mac;
|
|
|
|
|
|
if (!pSession) {
|
|
|
sme_err("session %d not found", sessionId);
|
|
@@ -6457,10 +6488,6 @@ QDF_STATUS csr_roam_process_command(struct mac_context *mac, tSmeCmd *pCommand)
|
|
|
sme_debug("Disassociate issued with reason: %d",
|
|
|
pCommand->u.roamCmd.reason);
|
|
|
|
|
|
- qdf_mem_copy(&peer_mac, &pCommand->u.roamCmd.peerMac,
|
|
|
- QDF_MAC_ADDR_SIZE);
|
|
|
- csr_get_peer_rssi(mac, sessionId, peer_mac);
|
|
|
-
|
|
|
status = csr_send_mb_disassoc_req_msg(mac, sessionId,
|
|
|
pCommand->u.roamCmd.peerMac,
|
|
|
pCommand->u.roamCmd.reason);
|
|
@@ -6474,10 +6501,6 @@ QDF_STATUS csr_roam_process_command(struct mac_context *mac, tSmeCmd *pCommand)
|
|
|
sme_debug("Deauth issued with reason: %d",
|
|
|
pCommand->u.roamCmd.reason);
|
|
|
|
|
|
- qdf_mem_copy(&peer_mac, &pCommand->u.roamCmd.peerMac,
|
|
|
- QDF_MAC_ADDR_SIZE);
|
|
|
- csr_get_peer_rssi(mac, sessionId, peer_mac);
|
|
|
-
|
|
|
status = csr_send_mb_deauth_req_msg(mac, sessionId,
|
|
|
pCommand->u.roamCmd.peerMac,
|
|
|
pCommand->u.roamCmd.reason);
|
|
@@ -11408,6 +11431,12 @@ bool csr_roam_issue_wm_status_change(struct mac_context *mac, uint32_t sessionId
|
|
|
{
|
|
|
bool fCommandQueued = false;
|
|
|
tSmeCmd *pCommand;
|
|
|
+ struct qdf_mac_addr peer_mac;
|
|
|
+ struct csr_roam_session *session;
|
|
|
+
|
|
|
+ session = CSR_GET_SESSION(mac, sessionId);
|
|
|
+ if (!session)
|
|
|
+ return false;
|
|
|
|
|
|
do {
|
|
|
|
|
@@ -11433,12 +11462,24 @@ bool csr_roam_issue_wm_status_change(struct mac_context *mac, uint32_t sessionId
|
|
|
DisassocIndMsg, pSmeRsp,
|
|
|
sizeof(pCommand->u.wmStatusChangeCmd.u.
|
|
|
DisassocIndMsg));
|
|
|
+ qdf_mem_copy(&peer_mac, &pCommand->u.wmStatusChangeCmd.
|
|
|
+ u.DisassocIndMsg.peer_macaddr,
|
|
|
+ QDF_MAC_ADDR_SIZE);
|
|
|
+
|
|
|
} else {
|
|
|
qdf_mem_copy(&pCommand->u.wmStatusChangeCmd.u.
|
|
|
DeauthIndMsg, pSmeRsp,
|
|
|
sizeof(pCommand->u.wmStatusChangeCmd.u.
|
|
|
DeauthIndMsg));
|
|
|
+ qdf_mem_copy(&peer_mac, &pCommand->u.wmStatusChangeCmd.
|
|
|
+ u.DeauthIndMsg.peer_macaddr,
|
|
|
+ QDF_MAC_ADDR_SIZE);
|
|
|
}
|
|
|
+
|
|
|
+ if (CSR_IS_INFRA_AP(&session->connectedProfile))
|
|
|
+ csr_roam_issue_disconnect_stats(mac, sessionId,
|
|
|
+ peer_mac);
|
|
|
+
|
|
|
if (QDF_IS_STATUS_SUCCESS
|
|
|
(csr_queue_sme_command(mac, pCommand, false)))
|
|
|
fCommandQueued = true;
|
|
@@ -13345,8 +13386,6 @@ QDF_STATUS csr_roam_lost_link(struct mac_context *mac, uint32_t sessionId,
|
|
|
mlme_set_discon_reason_n_from_ap(mac->psoc, sessionId, from_ap,
|
|
|
pSession->joinFailStatusCode.reasonCode);
|
|
|
|
|
|
- if (type == eWNI_SME_DISASSOC_IND || type == eWNI_SME_DEAUTH_IND)
|
|
|
- csr_get_peer_rssi(mac, sessionId, roam_info->peerMac);
|
|
|
|
|
|
csr_roam_call_callback(mac, sessionId, NULL, 0,
|
|
|
eCSR_ROAM_LOSTLINK_DETECTED, result);
|
|
@@ -13380,6 +13419,28 @@ QDF_STATUS csr_roam_lost_link(struct mac_context *mac, uint32_t sessionId,
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
+void csr_roam_get_disconnect_stats_complete(struct mac_context *mac)
|
|
|
+{
|
|
|
+ tListElem *entry;
|
|
|
+ tSmeCmd *cmd;
|
|
|
+
|
|
|
+ entry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
|
|
|
+ if (!entry) {
|
|
|
+ sme_err("NO commands are ACTIVE ...");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ cmd = GET_BASE_ADDR(entry, tSmeCmd, Link);
|
|
|
+ if (cmd->command != eSmeCommandGetdisconnectStats) {
|
|
|
+ sme_err("Get disconn stats cmd is not ACTIVE ...");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (csr_nonscan_active_ll_remove_entry(mac, entry, LL_ACCESS_LOCK))
|
|
|
+ csr_release_command(mac, cmd);
|
|
|
+ else
|
|
|
+ sme_err("Failed to release command");
|
|
|
+}
|
|
|
|
|
|
void csr_roam_wm_status_change_complete(struct mac_context *mac,
|
|
|
uint8_t session_id)
|
|
@@ -13407,6 +13468,13 @@ void csr_roam_wm_status_change_complete(struct mac_context *mac,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void csr_roam_process_get_disconnect_stats_command(struct mac_context *mac,
|
|
|
+ tSmeCmd *cmd)
|
|
|
+{
|
|
|
+ csr_get_peer_rssi(mac, cmd->vdev_id,
|
|
|
+ cmd->u.disconnect_stats_cmd.peer_mac_addr);
|
|
|
+}
|
|
|
+
|
|
|
void csr_roam_process_wm_status_change_command(
|
|
|
struct mac_context *mac, tSmeCmd *pCommand)
|
|
|
{
|
|
@@ -19783,6 +19851,9 @@ enum wlan_serialization_cmd_type csr_get_cmd_type(tSmeCmd *sme_cmd)
|
|
|
case eSmeCommandWmStatusChange:
|
|
|
cmd_type = WLAN_SER_CMD_WM_STATUS_CHANGE;
|
|
|
break;
|
|
|
+ case eSmeCommandGetdisconnectStats:
|
|
|
+ cmd_type = WLAN_SER_CMD_GET_DISCONNECT_STATS;
|
|
|
+ break;
|
|
|
case eSmeCommandAddTs:
|
|
|
cmd_type = WLAN_SER_CMD_ADDTS;
|
|
|
break;
|
|
@@ -19838,6 +19909,10 @@ static void csr_fill_cmd_timeout(struct wlan_serialization_command *cmd)
|
|
|
case WLAN_SER_CMD_FORCE_DEAUTH_STA:
|
|
|
cmd->cmd_timeout_duration = SME_CMD_PEER_DISCONNECT_TIMEOUT;
|
|
|
break;
|
|
|
+ case WLAN_SER_CMD_GET_DISCONNECT_STATS:
|
|
|
+ cmd->cmd_timeout_duration =
|
|
|
+ SME_CMD_GET_DISCONNECT_STATS_TIMEOUT;
|
|
|
+ break;
|
|
|
case WLAN_SER_CMD_HDD_ISSUE_REASSOC_SAME_AP:
|
|
|
case WLAN_SER_CMD_SME_ISSUE_REASSOC_SAME_AP:
|
|
|
case WLAN_SER_CMD_SME_ISSUE_DISASSOC_FOR_HANDOFF:
|