浏览代码

qcacmn: Add reason code enum and prints in connect and disconnect

Add reason code enum and prints in connect and disconnect handlers,
also take care of the vendor reason code during disconnect resp.

Change-Id: I1298e0739bd08d7d43fcb3839a07459819207196
CRs-Fixed: 2778233
Abhishek Singh 4 年之前
父节点
当前提交
e1fb6b17d4

+ 16 - 1
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 */

+ 27 - 0
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 <qca_vendor.h>
+#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.

+ 22 - 7
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;
+}

+ 34 - 8
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))

+ 3 - 3
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))

+ 100 - 3
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);
 }
 
 /**

+ 223 - 0
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

+ 11 - 0
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

+ 1 - 1
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;
 };
 

+ 15 - 0
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 */
 

+ 73 - 0
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)