diff --git a/os_if/linux/mlme/inc/wlan_cfg80211_cm_rsp.h b/os_if/linux/mlme/inc/wlan_cfg80211_cm_rsp.h index 3cc6c2f6c697..7ab90a3067ac 100644 --- a/os_if/linux/mlme/inc/wlan_cfg80211_cm_rsp.h +++ b/os_if/linux/mlme/inc/wlan_cfg80211_cm_rsp.h @@ -52,8 +52,23 @@ QDF_STATUS osif_disconnect_handler(struct wlan_objmgr_vdev *vdev, * Context: Any context. * Return: QDF_STATUS */ - QDF_STATUS osif_connect_handler(struct wlan_objmgr_vdev *vdev, struct wlan_cm_connect_rsp *rsp); +/** + * osif_failed_candidate_handler() - API to indicate individual candidate + * connect failure resp + * @vdev: vdev pointer + * @rsp: Connection manager connect response for the candidate + * + * The API is is used indicate individual candidate connect failure resp for + * for tried all but last tried candidate. The last candidate will be sent in + * osif_connect_handler. + * + * Context: Any context. + * Return: QDF_STATUS + */ +QDF_STATUS osif_failed_candidate_handler(struct wlan_objmgr_vdev *vdev, + struct wlan_cm_connect_rsp *rsp); + #endif /* __WLAN_CFG80211_CM_RSP_H */ diff --git a/os_if/linux/mlme/inc/wlan_cfg80211_cm_util.h b/os_if/linux/mlme/inc/wlan_cfg80211_cm_util.h index aaac93145429..401d2a90fd70 100644 --- a/os_if/linux/mlme/inc/wlan_cfg80211_cm_util.h +++ b/os_if/linux/mlme/inc/wlan_cfg80211_cm_util.h @@ -24,6 +24,33 @@ #ifndef __WLAN_CFG80211_CM_UTIL_H #define __WLAN_CFG80211_CM_UTIL_H +#include +#include "wlan_cm_ucfg_api.h" + +/** + * osif_cm_qca_reason_to_str() - return string conversion of qca reason code + * @reason: enum qca_disconnect_reason_codes + * + * This utility function helps log string conversion of qca reason code. + * + * Return: string conversion of reason code, if match found; + * "Unknown" otherwise. + */ +const char * +osif_cm_qca_reason_to_str(enum qca_disconnect_reason_codes reason); + +/** + * osif_cm_mac_to_qca_reason() - Convert to qca internal disconnect reason + * @internal_reason: Mac reason code of type @wlan_reason_code + * + * Check if it is internal reason code and convert it to the + * enum qca_disconnect_reason_codes. + * + * Return: Reason code of type enum qca_disconnect_reason_codes + */ +enum qca_disconnect_reason_codes +osif_cm_mac_to_qca_reason(enum wlan_reason_code internal_reason); + /** * osif_cm_register_cb() - API to register connection manager * callbacks. diff --git a/os_if/linux/mlme/src/wlan_cfg80211_cm_connect_rsp.c b/os_if/linux/mlme/src/wlan_cfg80211_cm_connect_rsp.c index 05f68028c804..a04dd35fb25c 100644 --- a/os_if/linux/mlme/src/wlan_cfg80211_cm_connect_rsp.c +++ b/os_if/linux/mlme/src/wlan_cfg80211_cm_connect_rsp.c @@ -434,13 +434,13 @@ QDF_STATUS osif_connect_handler(struct wlan_objmgr_vdev *vdev, struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev); QDF_STATUS status; - osif_info("%s(vdevid-%d): " QDF_MAC_ADDR_FMT " Connect with " QDF_MAC_ADDR_FMT " SSID \"%.*s\" is %s cm_id %d cm_reason %d reason_code %d", - osif_priv->wdev->netdev->name, rsp->vdev_id, - QDF_MAC_ADDR_REF(wlan_vdev_mlme_get_macaddr(vdev)), - QDF_MAC_ADDR_REF(rsp->bssid.bytes), - rsp->ssid.length, rsp->ssid.ssid, - rsp->connect_status ? "FAILURE" : "SUCCESS", rsp->cm_id, - rsp->reason, rsp->reason_code); + osif_nofl_info("%s(vdevid-%d): " QDF_MAC_ADDR_FMT " Connect with " QDF_MAC_ADDR_FMT " SSID \"%.*s\" is %s cm_id %d cm_reason %d reason_code %d", + osif_priv->wdev->netdev->name, rsp->vdev_id, + QDF_MAC_ADDR_REF(wlan_vdev_mlme_get_macaddr(vdev)), + QDF_MAC_ADDR_REF(rsp->bssid.bytes), + rsp->ssid.length, rsp->ssid.ssid, + rsp->connect_status ? "FAILURE" : "SUCCESS", rsp->cm_id, + rsp->reason, rsp->reason_code); status = osif_validate_connect_and_reset_src_id(osif_priv, rsp->cm_id); if (QDF_IS_STATUS_ERROR(status)) @@ -450,3 +450,18 @@ QDF_STATUS osif_connect_handler(struct wlan_objmgr_vdev *vdev, return QDF_STATUS_SUCCESS; } + +QDF_STATUS osif_failed_candidate_handler(struct wlan_objmgr_vdev *vdev, + struct wlan_cm_connect_rsp *rsp) +{ + struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev); + + osif_nofl_info("%s(vdevid-%d): " QDF_MAC_ADDR_FMT " Connect with " QDF_MAC_ADDR_FMT " SSID \"%.*s\" FAILED cm_id %d cm_reason %d reason_code %d", + osif_priv->wdev->netdev->name, rsp->vdev_id, + QDF_MAC_ADDR_REF(wlan_vdev_mlme_get_macaddr(vdev)), + QDF_MAC_ADDR_REF(rsp->bssid.bytes), + rsp->ssid.length, rsp->ssid.ssid, rsp->cm_id, + rsp->reason, rsp->reason_code); + + return QDF_STATUS_SUCCESS; +} diff --git a/os_if/linux/mlme/src/wlan_cfg80211_cm_disconnect_rsp.c b/os_if/linux/mlme/src/wlan_cfg80211_cm_disconnect_rsp.c index 39c9bddecb64..4007840b2d79 100644 --- a/os_if/linux/mlme/src/wlan_cfg80211_cm_disconnect_rsp.c +++ b/os_if/linux/mlme/src/wlan_cfg80211_cm_disconnect_rsp.c @@ -97,21 +97,47 @@ osif_cm_indicate_disconnect(struct net_device *dev, } #endif +static enum ieee80211_reasoncode +osif_cm_get_disconnect_reason(struct vdev_osif_priv *osif_priv, uint16_t reason) +{ + enum ieee80211_reasoncode ieee80211_reason = WLAN_REASON_UNSPECIFIED; + + osif_priv->cm_info.last_disconnect_reason = + osif_cm_mac_to_qca_reason(reason); + if (reason < REASON_PROP_START) + ieee80211_reason = reason; + /* + * Applications expect reason code as 0 for beacon miss failure + * due to backward compatibility. So send ieee80211_reason as 0. + */ + if (reason == REASON_BEACON_MISSED) + ieee80211_reason = 0; + + return ieee80211_reason; +} + QDF_STATUS osif_disconnect_handler(struct wlan_objmgr_vdev *vdev, struct wlan_cm_discon_rsp *rsp) { - enum ieee80211_reasoncode ieee80211_reason = rsp->req.req.reason_code; + enum ieee80211_reasoncode ieee80211_reason; struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev); bool locally_generated = true; QDF_STATUS status = QDF_STATUS_SUCCESS; - osif_info("%s(vdevid-%d): Disconnected, bssid: " QDF_MAC_ADDR_FMT " cm_id %d source %d reason_code %d locally_generated %d", - osif_priv->wdev->netdev->name, - rsp->req.req.vdev_id, - QDF_MAC_ADDR_REF(rsp->req.req.bssid.bytes), - rsp->req.cm_id, rsp->req.req.source, - rsp->req.req.reason_code, - locally_generated); + ieee80211_reason = + osif_cm_get_disconnect_reason(osif_priv, + rsp->req.req.reason_code); + + osif_nofl_info("%s(vdevid-%d): " QDF_MAC_ADDR_FMT " %sdisconnect " QDF_MAC_ADDR_FMT " cm_id %d source %d reason:%u %s vendor:%u %s", + osif_priv->wdev->netdev->name, + rsp->req.req.vdev_id, + QDF_MAC_ADDR_REF(wlan_vdev_mlme_get_macaddr(vdev)), + locally_generated ? "locally-generated " : "", + QDF_MAC_ADDR_REF(rsp->req.req.bssid.bytes), + rsp->req.cm_id, rsp->req.req.source, ieee80211_reason, + ucfg_cm_reason_code_to_str(rsp->req.req.reason_code), + osif_priv->cm_info.last_disconnect_reason, + osif_cm_qca_reason_to_str(osif_priv->cm_info.last_disconnect_reason)); status = osif_validate_disconnect_and_reset_src_id(osif_priv, rsp); if (QDF_IS_STATUS_ERROR(status)) diff --git a/os_if/linux/mlme/src/wlan_cfg80211_cm_req.c b/os_if/linux/mlme/src/wlan_cfg80211_cm_req.c index e51db6019493..f8706daceecb 100644 --- a/os_if/linux/mlme/src/wlan_cfg80211_cm_req.c +++ b/os_if/linux/mlme/src/wlan_cfg80211_cm_req.c @@ -403,9 +403,9 @@ int wlan_osif_cfg80211_disconnect(struct net_device *dev, uint8_t vdev_id = vdev->vdev_objmgr.vdev_id; QDF_STATUS status; - /* print reason in string */ - osif_info("%s(vdevid-%d): Received Disconnect reason:%d", - dev->name, vdev_id, reason); + osif_info("%s(vdevid-%d): Received Disconnect reason:%d %s", + dev->name, vdev_id, reason, + ucfg_cm_reason_code_to_str(reason)); status = osif_cm_reset_id_and_src(vdev); if (QDF_IS_STATUS_ERROR(status)) diff --git a/os_if/linux/mlme/src/wlan_cfg80211_cm_util.c b/os_if/linux/mlme/src/wlan_cfg80211_cm_util.c index 056303486a1c..b2e40ff5d755 100644 --- a/os_if/linux/mlme/src/wlan_cfg80211_cm_util.c +++ b/os_if/linux/mlme/src/wlan_cfg80211_cm_util.c @@ -26,6 +26,103 @@ #include "wlan_cfg80211.h" #include "wlan_cfg80211_cm_rsp.h" +const char * +osif_cm_qca_reason_to_str(enum qca_disconnect_reason_codes reason) +{ + switch (reason) { + CASE_RETURN_STRING(QCA_DISCONNECT_REASON_INTERNAL_ROAM_FAILURE); + CASE_RETURN_STRING(QCA_DISCONNECT_REASON_EXTERNAL_ROAM_FAILURE); + CASE_RETURN_STRING(QCA_DISCONNECT_REASON_GATEWAY_REACHABILITY_FAILURE); + CASE_RETURN_STRING(QCA_DISCONNECT_REASON_UNSUPPORTED_CHANNEL_CSA); + CASE_RETURN_STRING(QCA_DISCONNECT_REASON_OPER_CHANNEL_DISABLED_INDOOR); + CASE_RETURN_STRING(QCA_DISCONNECT_REASON_OPER_CHANNEL_USER_DISABLED); + CASE_RETURN_STRING(QCA_DISCONNECT_REASON_DEVICE_RECOVERY); + CASE_RETURN_STRING(QCA_DISCONNECT_REASON_KEY_TIMEOUT); + CASE_RETURN_STRING(QCA_DISCONNECT_REASON_OPER_CHANNEL_BAND_CHANGE); + CASE_RETURN_STRING(QCA_DISCONNECT_REASON_IFACE_DOWN); + CASE_RETURN_STRING(QCA_DISCONNECT_REASON_PEER_XRETRY_FAIL); + CASE_RETURN_STRING(QCA_DISCONNECT_REASON_PEER_INACTIVITY); + CASE_RETURN_STRING(QCA_DISCONNECT_REASON_SA_QUERY_TIMEOUT); + CASE_RETURN_STRING(QCA_DISCONNECT_REASON_BEACON_MISS_FAILURE); + CASE_RETURN_STRING(QCA_DISCONNECT_REASON_CHANNEL_SWITCH_FAILURE); + CASE_RETURN_STRING(QCA_DISCONNECT_REASON_USER_TRIGGERED); + case QCA_DISCONNECT_REASON_UNSPECIFIED: + return ""; + default: + return "Unknown"; + } +} + +enum qca_disconnect_reason_codes +osif_cm_mac_to_qca_reason(enum wlan_reason_code internal_reason) +{ + enum qca_disconnect_reason_codes reason = + QCA_DISCONNECT_REASON_UNSPECIFIED; + + if (internal_reason < REASON_PROP_START) + return reason; + + switch (internal_reason) { + case REASON_HOST_TRIGGERED_ROAM_FAILURE: + reason = QCA_DISCONNECT_REASON_INTERNAL_ROAM_FAILURE; + break; + case REASON_FW_TRIGGERED_ROAM_FAILURE: + reason = QCA_DISCONNECT_REASON_EXTERNAL_ROAM_FAILURE; + break; + case REASON_GATEWAY_REACHABILITY_FAILURE: + reason = + QCA_DISCONNECT_REASON_GATEWAY_REACHABILITY_FAILURE; + break; + case REASON_UNSUPPORTED_CHANNEL_CSA: + reason = QCA_DISCONNECT_REASON_UNSUPPORTED_CHANNEL_CSA; + break; + case REASON_OPER_CHANNEL_DISABLED_INDOOR: + reason = + QCA_DISCONNECT_REASON_OPER_CHANNEL_DISABLED_INDOOR; + break; + case REASON_OPER_CHANNEL_USER_DISABLED: + reason = + QCA_DISCONNECT_REASON_OPER_CHANNEL_USER_DISABLED; + break; + case REASON_DEVICE_RECOVERY: + reason = QCA_DISCONNECT_REASON_DEVICE_RECOVERY; + break; + case REASON_KEY_TIMEOUT: + reason = QCA_DISCONNECT_REASON_KEY_TIMEOUT; + break; + case REASON_OPER_CHANNEL_BAND_CHANGE: + reason = QCA_DISCONNECT_REASON_OPER_CHANNEL_BAND_CHANGE; + break; + case REASON_IFACE_DOWN: + reason = QCA_DISCONNECT_REASON_IFACE_DOWN; + break; + case REASON_PEER_XRETRY_FAIL: + reason = QCA_DISCONNECT_REASON_PEER_XRETRY_FAIL; + break; + case REASON_PEER_INACTIVITY: + reason = QCA_DISCONNECT_REASON_PEER_INACTIVITY; + break; + case REASON_SA_QUERY_TIMEOUT: + reason = QCA_DISCONNECT_REASON_SA_QUERY_TIMEOUT; + break; + case REASON_CHANNEL_SWITCH_FAILED: + reason = QCA_DISCONNECT_REASON_CHANNEL_SWITCH_FAILURE; + break; + case REASON_BEACON_MISSED: + reason = QCA_DISCONNECT_REASON_BEACON_MISS_FAILURE; + break; + case REASON_USER_TRIGGERED_ROAM_FAILURE: + reason = QCA_DISCONNECT_REASON_USER_TRIGGERED; + break; + default: + osif_debug("No QCA reason code for mac reason: %u", + internal_reason); + /* Unspecified reason by default */ + } + + return reason; +} + void osif_cm_reset_id_and_src_no_lock(struct vdev_osif_priv *osif_priv) { osif_priv->cm_info.last_id = CM_ID_INVALID; @@ -64,15 +161,15 @@ osif_cm_connect_complete_cb(struct wlan_objmgr_vdev *vdev, /** * osif_cm_failed_candidate_cb() - Callback to indicate failed candidate * @vdev: vdev pointer - * @cm_conn_rsp: connect response + * @rsp: connect response * * Return: QDF_STATUS */ static QDF_STATUS osif_cm_failed_candidate_cb(struct wlan_objmgr_vdev *vdev, - struct wlan_cm_connect_rsp *cm_conn_rsp) + struct wlan_cm_connect_rsp *rsp) { - return QDF_STATUS_SUCCESS; + return osif_failed_candidate_handler(vdev, rsp); } /** diff --git a/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h b/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h index ef0ef8bf2bd4..13691f518e3c 100644 --- a/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h +++ b/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h @@ -438,6 +438,229 @@ enum extn_element_ie { WLAN_EXTN_ELEMID_ESP = 11, }; +/** + * enum wlan_reason_code - wlan reason codes Reason codes + * (IEEE Std 802.11-2016, 9.4.1.7, Table 9-45) + * @REASON_UNSPEC_FAILURE: Unspecified reason + * @REASON_PREV_AUTH_NOT_VALID: Previous authentication no longer valid + * @REASON_DEAUTH_NETWORK_LEAVING: Deauthenticated because sending station + * is leaving (or has left) IBSS or ESS + * @REASON_DISASSOC_DUE_TO_INACTIVITY: Disassociated due to inactivity + * @REASON_DISASSOC_AP_BUSY: Disassociated because AP is unable + * to handle all currently associated STAs + * @REASON_CLASS2_FRAME_FROM_NON_AUTH_STA: Class 2 frame received from + * nonauthenticated station + * @REASON_CLASS3_FRAME_FROM_NON_ASSOC_STA: Class 3 frame received from + * nonassociated station + * @REASON_DISASSOC_NETWORK_LEAVING: Disassociated because sending station + * is leaving (or has left) BSS + * @REASON_STA_NOT_AUTHENTICATED: Station requesting (re)association + * is not authenticated with responding station + * @REASON_BAD_PWR_CAPABILITY: Disassociated because the + * information in the Power Capability element is unacceptable + * @REASON_BAD_SUPPORTED_CHANNELS: Disassociated because the + * information in the Supported Channels element is unacceptable + * @REASON_DISASSOC_BSS_TRANSITION: Disassociated due to BSS transition + * management + * @REASON_INVALID_IE: Invalid element, i.e., an element defined in this + * standard for which the content does not meet the specifications in Clause 9 + * @REASON_MIC_FAILURE: Message integrity code (MIC) failure + * @REASON_4WAY_HANDSHAKE_TIMEOUT: 4-Way Handshake timeout + * @REASON_GROUP_KEY_UPDATE_TIMEOUT: Group Key Handshake timeout + * @REASON_IN_4WAY_DIFFERS: Information element in 4-Way Handshake + * different from (Re)Association Request/Probe Response/Beacon frame + * @REASON_INVALID_GROUP_CIPHER: Invalid group cipher + * @REASON_INVALID_PAIRWISE_CIPHER: Invalid pairwise cipher + * @REASON_INVALID_AKMP: Invalid AKMP + * @REASON_UNSUPPORTED_RSNE_VER: Unsupported RSNE version + * @REASON_INVALID_RSNE_CAPABILITIES: Invalid RSNE capabilities + * @REASON_1X_AUTH_FAILURE: IEEE 802.1X authentication failed + * @REASON_CIPHER_SUITE_REJECTED: Cipher suite rejected because of the + * security policy + * @REASON_TDLS_PEER_UNREACHABLE: TDLS direct-link teardown due to TDLS + * peer STA unreachable via the TDLS direct link + * @REASON_TDLS_UNSPEC: TDLS direct-link teardown for unspecified + * reason + * @REASON_DISASSOC_SSP_REQUESTED: Disassociated because session terminated + * by SSP request + * @REASON_NO_SSP_ROAMING_AGREEMENT: Disassociated because of lack of SSP + * roaming agreement + * REASON_BAD_CIPHER_OR_AKM: Requested service rejected because of SSP + * cipher suite or AKM requirement + * @REASON_LOCATION_NOT_AUTHORIZED: Requested service not authorized in + * this location + * @REASON_SERVICE_CHANGE_PRECLUDES_TS: TS deleted because QoS AP + * lacks sufficient bandwidth for this QoS STA due to a change in BSS service + * characteristics or operational mode (e.g., an HT BSS change from 40 MHz + * channel to 20 MHz channel) + * @REASON_QOS_UNSPECIFIED: Disassociated for unspecified, QoS-related + * reason + * @REASON_NO_BANDWIDTH: Disassociated because QoS AP lacks sufficient + * bandwidth for this QoS STA + * @REASON_XS_UNACKED_FRAMES: Disassociated because excessive number of + * frames need to be acknowledged, but are not acknowledged due to AP + * transmissions and/or poor channel conditions + * @REASON_EXCEEDED_TXOP: Disassociated because STA is transmitting outside + * the limits of its TXOPs + * @REASON_STA_LEAVING: Requested from peer STA as the STA is leaving the + * BSS (or resetting) + * @REASON_END_TS_BA_DLS: Requesting STA is no longer using the stream + * or session + * @REASON_UNKNOWN_TS_BA: Requesting STA received frames using a + * mechanism for which setup has not been completed + * @REASON_TIMEDOUT: Requested from peer STA due to timeout + * @REASON_PEERKEY_MISMATCH: Peer STA does not support the requested + * cipher suite + * @REASON_AUTHORIZED_ACCESS_LIMIT_REACHED: Disassociated because + * authorized access limit reached + * @REASON_EXTERNAL_SERVICE_REQUIREMENTS: Disassociated due to external + * service requirements + * @REASON_INVALID_FT_ACTION_FRAME_COUNT: Invalid FT Action frame count + * @REASON_INVALID_PMKID: Invalid pairwise master key identifier (PMKID) + * @REASON_INVALID_MDE: Invalid MDE + * @REASON_INVALID_FTE: Invalid FTE + * @REASON_MESH_PEERING_CANCELLED: Mesh peering canceled for unknown + * reasons + * @REASON_MESH_MAX_PEERS: The mesh STA has reached the supported maximum + * number of peer mesh STAs + * @REASON_MESH_CONFIG_POLICY_VIOLATION: The received information violates + * the Mesh Configuration policy configured in the mesh STA profile + * @REASON_MESH_CLOSE_RCVD: The mesh STA has received a Mesh Peering Close + * frame requesting to close the mesh peering + * @REASON_MESH_MAX_RETRIES: The mesh STA has resent dot11MeshMaxRetries + * Mesh Peering Open frames, without receiving a Mesh Peering Confirm frame + * @REASON_MESH_CONFIRM_TIMEOUT: The confirmTimer for the mesh peering + * instance times out. + * @REASON_MESH_INVALID_GTK: The mesh STA fails to unwrap the GTK or + * the values in the wrapped contents do not match + * @REASON_MESH_INCONSISTENT_PARAMS: The mesh STA receives inconsistent + * information about the mesh parameters between mesh peering Management frames + * @REASON_MESH_INVALID_SECURITY_CAP: The mesh STA fails the authenticated + * mesh peering exchange because due to failure in selecting either the pairwise + * ciphersuite or group ciphersuite + * @REASON_MESH_PATH_ERROR_NO_PROXY_INFO: The mesh STA does not have proxy + * information for this external destination. + * @REASON_MESH_PATH_ERROR_NO_FORWARDING_INFO: The mesh STA does not have + * forwarding information for this destination. + * @REASON_MESH_PATH_ERROR_DEST_UNREACHABLE: The mesh STA determines that + * the link to the next hop of an active path in its forwarding information is + * no longer usable. + * @REASON_MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS: The Deauthentication frame + * was sent because the MAC address of the STA already exists in the mesh BSS + * @REASON_MESH_CHANNEL_SWITCH_REGULATORY_REQ: The mesh STA performs + * channel switch to meet regulatory requirements. + * @REASON_MESH_CHANNEL_SWITCH_UNSPECIFIED: The mesh STA performs channel + * switching with unspecified reason. + * @REASON_POOR_RSSI_CONDITIONS: Disassociated due to poor RSSI conditions + * + * + * Internal reason codes: Add any internal reason code just after + * REASON_PROP_START and decrease the value of REASON_PROP_START + * accordingly. + * + * @REASON_PROP_START: Start of prop reason code + * @REASON_HOST_TRIGGERED_ROAM_FAILURE: Reason host triggered roam failed + * @REASON_FW_TRIGGERED_ROAM_FAILURE: Firmware triggered roam failed + * @REASON_GATEWAY_REACHABILITY_FAILURE: Due to NUD failure + * @REASON_UNSUPPORTED_CHANNEL_CSA: due to unsuppoerted channel in CSA + * @REASON_OPER_CHANNEL_DISABLED_INDOOR: as channel is disabled in indoor + * @REASON_OPER_CHANNEL_USER_DISABLED: due to channel disabled by user + * @REASON_DEVICE_RECOVERY: due to SSR + * @REASON_KEY_TIMEOUT: due to key Timeout + * @REASON_OPER_CHANNEL_BAND_CHANGE: due to change in BAND + * @REASON_IFACE_DOWN: as interface is going down + * @REASON_PEER_XRETRY_FAIL: due to sta kickout with reason no ACK + * @REASON_PEER_INACTIVITY: due to sta kickout with reason inactivity + * @REASON_SA_QUERY_TIMEOUT: due to sta kickout due to SA query timeout + * @REASON_CHANNEL_SWITCH_FAILED: as channel switch failed + * @REASON_BEACON_MISSED: due to beacon miss + * @REASON_USER_TRIGGERED_ROAM_FAILURE: Reason user triggered roam failed + */ +enum wlan_reason_code { + REASON_UNSPEC_FAILURE = 1, + REASON_PREV_AUTH_NOT_VALID = 2, + REASON_DEAUTH_NETWORK_LEAVING = 3, + REASON_DISASSOC_DUE_TO_INACTIVITY = 4, + REASON_DISASSOC_AP_BUSY = 5, + REASON_CLASS2_FRAME_FROM_NON_AUTH_STA = 6, + REASON_CLASS3_FRAME_FROM_NON_ASSOC_STA = 7, + REASON_DISASSOC_NETWORK_LEAVING = 8, + REASON_STA_NOT_AUTHENTICATED = 9, + REASON_BAD_PWR_CAPABILITY = 10, + REASON_BAD_SUPPORTED_CHANNELS = 11, + REASON_DISASSOC_BSS_TRANSITION = 12, + REASON_INVALID_IE = 13, + REASON_MIC_FAILURE = 14, + REASON_4WAY_HANDSHAKE_TIMEOUT = 15, + REASON_GROUP_KEY_UPDATE_TIMEOUT = 16, + REASON_IN_4WAY_DIFFERS = 17, + REASON_INVALID_GROUP_CIPHER = 18, + REASON_INVALID_PAIRWISE_CIPHER = 19, + REASON_INVALID_AKMP = 20, + REASON_UNSUPPORTED_RSNE_VER = 21, + REASON_INVALID_RSNE_CAPABILITIES = 22, + REASON_1X_AUTH_FAILURE = 23, + REASON_CIPHER_SUITE_REJECTED = 24, + REASON_TDLS_PEER_UNREACHABLE = 25, + REASON_TDLS_UNSPEC = 26, + REASON_DISASSOC_SSP_REQUESTED = 27, + REASON_NO_SSP_ROAMING_AGREEMENT = 28, + REASON_BAD_CIPHER_OR_AKM = 29, + REASON_LOCATION_NOT_AUTHORIZED = 30, + REASON_SERVICE_CHANGE_PRECLUDES_TS = 31, + REASON_QOS_UNSPECIFIED = 32, + REASON_NO_BANDWIDTH = 33, + REASON_XS_UNACKED_FRAMES = 34, + REASON_EXCEEDED_TXOP = 35, + REASON_STA_LEAVING = 36, + REASON_END_TS_BA_DLS = 37, + REASON_UNKNOWN_TS_BA = 38, + REASON_TIMEDOUT = 39, + REASON_PEERKEY_MISMATCH = 45, + REASON_AUTHORIZED_ACCESS_LIMIT_REACHED = 46, + REASON_EXTERNAL_SERVICE_REQUIREMENTS = 47, + REASON_INVALID_FT_ACTION_FRAME_COUNT = 48, + REASON_INVALID_PMKID = 49, + REASON_INVALID_MDE = 50, + REASON_INVALID_FTE = 51, + REASON_MESH_PEERING_CANCELLED = 52, + REASON_MESH_MAX_PEERS = 53, + REASON_MESH_CONFIG_POLICY_VIOLATION = 54, + REASON_MESH_CLOSE_RCVD = 55, + REASON_MESH_MAX_RETRIES = 56, + REASON_MESH_CONFIRM_TIMEOUT = 57, + REASON_MESH_INVALID_GTK = 58, + REASON_MESH_INCONSISTENT_PARAMS = 59, + REASON_MESH_INVALID_SECURITY_CAP = 60, + REASON_MESH_PATH_ERROR_NO_PROXY_INFO = 61, + REASON_MESH_PATH_ERROR_NO_FORWARDING_INFO = 62, + REASON_MESH_PATH_ERROR_DEST_UNREACHABLE = 63, + REASON_MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS = 64, + REASON_MESH_CHANNEL_SWITCH_REGULATORY_REQ = 65, + REASON_MESH_CHANNEL_SWITCH_UNSPECIFIED = 66, + REASON_POOR_RSSI_CONDITIONS = 71, + /* 72–65535 reserved */ + + /* Internal reason codes */ + REASON_PROP_START = 65519, + REASON_HOST_TRIGGERED_ROAM_FAILURE = 65519, + REASON_FW_TRIGGERED_ROAM_FAILURE = 65520, + REASON_GATEWAY_REACHABILITY_FAILURE = 65521, + REASON_UNSUPPORTED_CHANNEL_CSA = 65522, + REASON_OPER_CHANNEL_DISABLED_INDOOR = 65523, + REASON_OPER_CHANNEL_USER_DISABLED = 65524, + REASON_DEVICE_RECOVERY = 65525, + REASON_KEY_TIMEOUT = 65526, + REASON_OPER_CHANNEL_BAND_CHANGE = 65527, + REASON_IFACE_DOWN = 65528, + REASON_PEER_XRETRY_FAIL = 65529, + REASON_PEER_INACTIVITY = 65530, + REASON_SA_QUERY_TIMEOUT = 65531, + REASON_CHANNEL_SWITCH_FAILED = 65532, + REASON_BEACON_MISSED = 65533, + REASON_USER_TRIGGERED_ROAM_FAILURE = 65534, +}; + #define WLAN_OUI_SIZE 4 #define WLAN_MAX_CIPHER 6 #define WLAN_RSN_SELECTOR_LEN 4 diff --git a/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_api.h b/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_api.h index 9c63d2e11257..bce5258c53eb 100644 --- a/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_api.h +++ b/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_api.h @@ -98,6 +98,17 @@ QDF_STATUS wlan_cm_bss_peer_delete_rsp(struct wlan_objmgr_vdev *vdev, QDF_STATUS wlan_cm_disconnect_rsp(struct wlan_objmgr_vdev *vdev, struct wlan_cm_discon_rsp cm_discon_rsp); +/** + * wlan_cm_reason_code_to_str() - return string conversion of reason code + * @reason: reason code. + * + * This utility function helps log string conversion of reason code. + * + * Return: string conversion of reason code, if match found; + * "Unknown" otherwise. + */ +const char *wlan_cm_reason_code_to_str(enum wlan_reason_code reason); + /** * wlan_cm_hw_mode_change_resp() - HW mode change response * @pdev: pdev pointer diff --git a/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_public_struct.h b/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_public_struct.h index 0205fb497a6f..f2bf46fe8b56 100644 --- a/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_public_struct.h +++ b/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_public_struct.h @@ -188,7 +188,7 @@ struct wlan_cm_vdev_connect_req { struct wlan_cm_disconnect_req { uint8_t vdev_id; enum wlan_cm_source source; - uint16_t reason_code; + enum wlan_reason_code reason_code; struct qdf_mac_addr bssid; }; diff --git a/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_ucfg_api.h b/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_ucfg_api.h index f8b78ccf360c..f118822368d7 100644 --- a/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_ucfg_api.h +++ b/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_ucfg_api.h @@ -56,6 +56,21 @@ QDF_STATUS ucfg_wlan_cm_start_disconnect(struct wlan_objmgr_vdev *vdev, return wlan_cm_start_disconnect(vdev, req); } +/** + * ucfg_cm_reason_code_to_str() - return string conversion of reason code + * @reason: reason code. + * + * This utility function helps log string conversion of reason code. + * + * Return: string conversion of reason code, if match found; + * "Unknown" otherwise. + */ +static inline +const char *ucfg_cm_reason_code_to_str(enum wlan_reason_code reason) +{ + return wlan_cm_reason_code_to_str(reason); +} + #endif #endif /* __WLAN_CM_UCFG_API_H */ diff --git a/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_api.c b/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_api.c index 2acecf04c7be..ddde298fa184 100644 --- a/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_api.c +++ b/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_api.c @@ -66,6 +66,79 @@ QDF_STATUS wlan_cm_disconnect_rsp(struct wlan_objmgr_vdev *vdev, return QDF_STATUS_SUCCESS; } +const char *wlan_cm_reason_code_to_str(enum wlan_reason_code reason) +{ + if (reason > REASON_PROP_START) + return ""; + + switch (reason) { + CASE_RETURN_STRING(REASON_UNSPEC_FAILURE); + CASE_RETURN_STRING(REASON_PREV_AUTH_NOT_VALID); + CASE_RETURN_STRING(REASON_DEAUTH_NETWORK_LEAVING); + CASE_RETURN_STRING(REASON_DISASSOC_DUE_TO_INACTIVITY); + CASE_RETURN_STRING(REASON_DISASSOC_AP_BUSY); + CASE_RETURN_STRING(REASON_CLASS2_FRAME_FROM_NON_AUTH_STA); + CASE_RETURN_STRING(REASON_CLASS3_FRAME_FROM_NON_ASSOC_STA); + CASE_RETURN_STRING(REASON_DISASSOC_NETWORK_LEAVING); + CASE_RETURN_STRING(REASON_STA_NOT_AUTHENTICATED); + CASE_RETURN_STRING(REASON_BAD_PWR_CAPABILITY); + CASE_RETURN_STRING(REASON_BAD_SUPPORTED_CHANNELS); + CASE_RETURN_STRING(REASON_DISASSOC_BSS_TRANSITION); + CASE_RETURN_STRING(REASON_INVALID_IE); + CASE_RETURN_STRING(REASON_MIC_FAILURE); + CASE_RETURN_STRING(REASON_4WAY_HANDSHAKE_TIMEOUT); + CASE_RETURN_STRING(REASON_GROUP_KEY_UPDATE_TIMEOUT); + CASE_RETURN_STRING(REASON_IN_4WAY_DIFFERS); + CASE_RETURN_STRING(REASON_INVALID_GROUP_CIPHER); + CASE_RETURN_STRING(REASON_INVALID_PAIRWISE_CIPHER); + CASE_RETURN_STRING(REASON_INVALID_AKMP); + CASE_RETURN_STRING(REASON_UNSUPPORTED_RSNE_VER); + CASE_RETURN_STRING(REASON_INVALID_RSNE_CAPABILITIES); + CASE_RETURN_STRING(REASON_1X_AUTH_FAILURE); + CASE_RETURN_STRING(REASON_CIPHER_SUITE_REJECTED); + CASE_RETURN_STRING(REASON_TDLS_PEER_UNREACHABLE); + CASE_RETURN_STRING(REASON_TDLS_UNSPEC); + CASE_RETURN_STRING(REASON_DISASSOC_SSP_REQUESTED); + CASE_RETURN_STRING(REASON_NO_SSP_ROAMING_AGREEMENT); + CASE_RETURN_STRING(REASON_BAD_CIPHER_OR_AKM); + CASE_RETURN_STRING(REASON_LOCATION_NOT_AUTHORIZED); + CASE_RETURN_STRING(REASON_SERVICE_CHANGE_PRECLUDES_TS); + CASE_RETURN_STRING(REASON_QOS_UNSPECIFIED); + CASE_RETURN_STRING(REASON_NO_BANDWIDTH); + CASE_RETURN_STRING(REASON_XS_UNACKED_FRAMES); + CASE_RETURN_STRING(REASON_EXCEEDED_TXOP); + CASE_RETURN_STRING(REASON_STA_LEAVING); + CASE_RETURN_STRING(REASON_END_TS_BA_DLS); + CASE_RETURN_STRING(REASON_UNKNOWN_TS_BA); + CASE_RETURN_STRING(REASON_TIMEDOUT); + CASE_RETURN_STRING(REASON_PEERKEY_MISMATCH); + CASE_RETURN_STRING(REASON_AUTHORIZED_ACCESS_LIMIT_REACHED); + CASE_RETURN_STRING(REASON_EXTERNAL_SERVICE_REQUIREMENTS); + CASE_RETURN_STRING(REASON_INVALID_FT_ACTION_FRAME_COUNT); + CASE_RETURN_STRING(REASON_INVALID_PMKID); + CASE_RETURN_STRING(REASON_INVALID_MDE); + CASE_RETURN_STRING(REASON_INVALID_FTE); + CASE_RETURN_STRING(REASON_MESH_PEERING_CANCELLED); + CASE_RETURN_STRING(REASON_MESH_MAX_PEERS); + CASE_RETURN_STRING(REASON_MESH_CONFIG_POLICY_VIOLATION); + CASE_RETURN_STRING(REASON_MESH_CLOSE_RCVD); + CASE_RETURN_STRING(REASON_MESH_MAX_RETRIES); + CASE_RETURN_STRING(REASON_MESH_CONFIRM_TIMEOUT); + CASE_RETURN_STRING(REASON_MESH_INVALID_GTK); + CASE_RETURN_STRING(REASON_MESH_INCONSISTENT_PARAMS); + CASE_RETURN_STRING(REASON_MESH_INVALID_SECURITY_CAP); + CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_NO_PROXY_INFO); + CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_NO_FORWARDING_INFO); + CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_DEST_UNREACHABLE); + CASE_RETURN_STRING(REASON_MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS); + CASE_RETURN_STRING(REASON_MESH_CHANNEL_SWITCH_REGULATORY_REQ); + CASE_RETURN_STRING(REASON_MESH_CHANNEL_SWITCH_UNSPECIFIED); + CASE_RETURN_STRING(REASON_POOR_RSSI_CONDITIONS); + default: + return "Unknown"; + } +} + #ifdef WLAN_POLICY_MGR_ENABLE void wlan_cm_hw_mode_change_resp(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, wlan_cm_id cm_id, QDF_STATUS status)