qcacld-3.0: Send proper reason code for STA kickout disconnections

Currently, driver send a generic reason code
eSIR_MAC_DISASSOC_DUE_TO_INACTIVITY_REASON to userspace when a
STA kickout happens. Send eSIR_MAC_SA_QUERY_TIMEOUT when STA
kickout happens due to SA query timeout.
Send eSIR_MAC_PEER_XRETRY_FAIL when STA kickout happens due to
XRETRY failure.
Still host sends deauth frame with reason code
eSIR_MAC_DISASSOC_DUE_TO_INACTIVITY_REASON.

Change-Id: I72fa7406ef1b131ef3519bb6bef21cc52bc548cb
CRs-Fixed: 2624948
This commit is contained in:
Srinivas Dasari 2020-02-18 15:43:34 +05:30 • committed by nshrivas
commit a3516d65a3
3 changed files with 29 additions and 33 deletions

View file

@ -186,6 +186,7 @@ void lim_delete_sta_context(struct mac_context *mac_ctx,
tpDeleteStaContext msg = (tpDeleteStaContext) lim_msg->bodyptr;
struct pe_session *session_entry;
tpDphHashNode sta_ds;
enum eSirMacReasonCodes reason_code;
if (!msg) {
pe_err("Invalid body pointer in message");
@ -200,6 +201,8 @@ void lim_delete_sta_context(struct mac_context *mac_ctx,
switch (msg->reasonCode) {
case HAL_DEL_STA_REASON_CODE_KEEP_ALIVE:
case HAL_DEL_STA_REASON_CODE_SA_QUERY_TIMEOUT:
case HAL_DEL_STA_REASON_CODE_XRETRY:
if (LIM_IS_STA_ROLE(session_entry) && !msg->is_tdls) {
if (!((session_entry->limMlmState ==
eLIM_MLM_LINK_ESTABLISHED_STATE) &&
@ -226,10 +229,18 @@ void lim_delete_sta_context(struct mac_context *mac_ctx,
lim_send_deauth_mgmt_frame(mac_ctx,
eSIR_MAC_DISASSOC_DUE_TO_INACTIVITY_REASON,
msg->addr2, session_entry, false);
if (msg->reasonCode ==
HAL_DEL_STA_REASON_CODE_SA_QUERY_TIMEOUT)
reason_code = eSIR_MAC_SA_QUERY_TIMEOUT;
else if (msg->reasonCode ==
HAL_DEL_STA_REASON_CODE_XRETRY)
reason_code = eSIR_MAC_PEER_XRETRY_FAIL;
else
reason_code = eSIR_MAC_PEER_INACTIVITY;
lim_tear_down_link_with_ap(mac_ctx,
session_entry->peSessionId,
eSIR_MAC_DISASSOC_DUE_TO_INACTIVITY_REASON,
eLIM_LINK_MONITORING_DEAUTH);
session_entry->peSessionId,
reason_code,
eLIM_LINK_MONITORING_DEAUTH);
/* only break for STA role (non TDLS) */
break;
}
@ -254,7 +265,7 @@ void lim_delete_sta_context(struct mac_context *mac_ctx,
return;
}
lim_send_deauth_mgmt_frame(mac_ctx,
eSIR_MAC_DISASSOC_DUE_TO_INACTIVITY_REASON,
eSIR_MAC_BSS_TRANSITION_DISASSOC,
session_entry->bssId, session_entry, false);
lim_tear_down_link_with_ap(mac_ctx, session_entry->peSessionId,
eSIR_MAC_BSS_TRANSITION_DISASSOC,

View file

@ -402,7 +402,9 @@ typedef enum eDelStaReasonCode {
HAL_DEL_STA_REASON_CODE_TIM_BASED = 0x2,
HAL_DEL_STA_REASON_CODE_RA_BASED = 0x3,
HAL_DEL_STA_REASON_CODE_UNKNOWN_A2 = 0x4,
HAL_DEL_STA_REASON_CODE_BTM_DISASSOC_IMMINENT = 0x5
HAL_DEL_STA_REASON_CODE_BTM_DISASSOC_IMMINENT = 0x5,
HAL_DEL_STA_REASON_CODE_SA_QUERY_TIMEOUT = 0x6,
HAL_DEL_STA_REASON_CODE_XRETRY = 0x7,
} tDelStaReasonCode;
typedef enum eSmpsModeValue {

View file

@ -394,31 +394,6 @@ int wma_peer_sta_kickout_event_handler(void *handle, uint8_t *event,
(void *)del_sta_ctx, 0);
goto exit_handler;
#endif /* FEATURE_WLAN_TDLS */
case WMI_PEER_STA_KICKOUT_REASON_XRETRY:
if (wma->interfaces[vdev_id].type == WMI_VDEV_TYPE_STA &&
(wma->interfaces[vdev_id].sub_type == 0 ||
wma->interfaces[vdev_id].sub_type ==
WMI_UNIFIED_VDEV_SUBTYPE_P2P_CLIENT) &&
!qdf_mem_cmp(bssid,
macaddr, QDF_MAC_ADDR_SIZE)) {
wma_sta_kickout_event(HOST_STA_KICKOUT_REASON_XRETRY,
vdev_id, macaddr);
/*
* KICKOUT event is for current station-AP connection.
* Treat it like final beacon miss. Station may not have
* missed beacons but not able to transmit frames to AP
* for a long time. Must disconnect to get out of
* this sticky situation.
* In future implementation, roaming module will also
* handle this event and perform a scan.
*/
WMA_LOGW("%s: WMI_PEER_STA_KICKOUT_REASON_XRETRY event for STA",
__func__);
wma_beacon_miss_handler(wma, vdev_id,
kickout_event->rssi);
goto exit_handler;
}
break;
case WMI_PEER_STA_KICKOUT_REASON_UNSPECIFIED:
/*
@ -449,6 +424,7 @@ int wma_peer_sta_kickout_event_handler(void *handle, uint8_t *event,
}
break;
case WMI_PEER_STA_KICKOUT_REASON_XRETRY:
case WMI_PEER_STA_KICKOUT_REASON_INACTIVITY:
/*
* Handle SA query kickout is same as inactivity kickout.
@ -473,15 +449,22 @@ int wma_peer_sta_kickout_event_handler(void *handle, uint8_t *event,
del_sta_ctx->vdev_id = vdev_id;
qdf_mem_copy(del_sta_ctx->addr2, macaddr, QDF_MAC_ADDR_SIZE);
qdf_mem_copy(del_sta_ctx->bssId, addr, QDF_MAC_ADDR_SIZE);
del_sta_ctx->reasonCode = HAL_DEL_STA_REASON_CODE_KEEP_ALIVE;
if (kickout_event->reason ==
WMI_PEER_STA_KICKOUT_REASON_SA_QUERY_TIMEOUT)
del_sta_ctx->reasonCode =
HAL_DEL_STA_REASON_CODE_SA_QUERY_TIMEOUT;
else if (kickout_event->reason == WMI_PEER_STA_KICKOUT_REASON_XRETRY)
del_sta_ctx->reasonCode = HAL_DEL_STA_REASON_CODE_XRETRY;
else
del_sta_ctx->reasonCode = HAL_DEL_STA_REASON_CODE_KEEP_ALIVE;
if (wmi_service_enabled(wma->wmi_handle,
wmi_service_hw_db2dbm_support))
del_sta_ctx->rssi = kickout_event->rssi;
else
del_sta_ctx->rssi = kickout_event->rssi +
WMA_TGT_NOISE_FLOOR_DBM;
wma_sta_kickout_event(HOST_STA_KICKOUT_REASON_KEEP_ALIVE,
vdev_id, macaddr);
wma_sta_kickout_event(del_sta_ctx->reasonCode, vdev_id, macaddr);
wma_send_msg(wma, SIR_LIM_DELETE_STA_CONTEXT_IND, (void *)del_sta_ctx,
0);
wma_lost_link_info_handler(wma, vdev_id, del_sta_ctx->rssi);