ieee80211: Print human-readable disassoc/deauth reason codes
[platform/kernel/linux-starfive.git] / net / mac80211 / mlme.c
index b9432b5..46b62bb 100644 (file)
@@ -2249,6 +2249,62 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,
        /* ignore frame -- wait for timeout */
 }
 
+#define case_WLAN(type) \
+       case WLAN_REASON_##type: return #type
+
+static const char *ieee80211_get_reason_code_string(u16 reason_code)
+{
+       switch (reason_code) {
+       case_WLAN(UNSPECIFIED);
+       case_WLAN(PREV_AUTH_NOT_VALID);
+       case_WLAN(DEAUTH_LEAVING);
+       case_WLAN(DISASSOC_DUE_TO_INACTIVITY);
+       case_WLAN(DISASSOC_AP_BUSY);
+       case_WLAN(CLASS2_FRAME_FROM_NONAUTH_STA);
+       case_WLAN(CLASS3_FRAME_FROM_NONASSOC_STA);
+       case_WLAN(DISASSOC_STA_HAS_LEFT);
+       case_WLAN(STA_REQ_ASSOC_WITHOUT_AUTH);
+       case_WLAN(DISASSOC_BAD_POWER);
+       case_WLAN(DISASSOC_BAD_SUPP_CHAN);
+       case_WLAN(INVALID_IE);
+       case_WLAN(MIC_FAILURE);
+       case_WLAN(4WAY_HANDSHAKE_TIMEOUT);
+       case_WLAN(GROUP_KEY_HANDSHAKE_TIMEOUT);
+       case_WLAN(IE_DIFFERENT);
+       case_WLAN(INVALID_GROUP_CIPHER);
+       case_WLAN(INVALID_PAIRWISE_CIPHER);
+       case_WLAN(INVALID_AKMP);
+       case_WLAN(UNSUPP_RSN_VERSION);
+       case_WLAN(INVALID_RSN_IE_CAP);
+       case_WLAN(IEEE8021X_FAILED);
+       case_WLAN(CIPHER_SUITE_REJECTED);
+       case_WLAN(DISASSOC_UNSPECIFIED_QOS);
+       case_WLAN(DISASSOC_QAP_NO_BANDWIDTH);
+       case_WLAN(DISASSOC_LOW_ACK);
+       case_WLAN(DISASSOC_QAP_EXCEED_TXOP);
+       case_WLAN(QSTA_LEAVE_QBSS);
+       case_WLAN(QSTA_NOT_USE);
+       case_WLAN(QSTA_REQUIRE_SETUP);
+       case_WLAN(QSTA_TIMEOUT);
+       case_WLAN(QSTA_CIPHER_NOT_SUPP);
+       case_WLAN(MESH_PEER_CANCELED);
+       case_WLAN(MESH_MAX_PEERS);
+       case_WLAN(MESH_CONFIG);
+       case_WLAN(MESH_CLOSE);
+       case_WLAN(MESH_MAX_RETRIES);
+       case_WLAN(MESH_CONFIRM_TIMEOUT);
+       case_WLAN(MESH_INVALID_GTK);
+       case_WLAN(MESH_INCONSISTENT_PARAM);
+       case_WLAN(MESH_INVALID_SECURITY);
+       case_WLAN(MESH_PATH_ERROR);
+       case_WLAN(MESH_PATH_NOFORWARD);
+       case_WLAN(MESH_PATH_DEST_UNREACHABLE);
+       case_WLAN(MAC_EXISTS_IN_MBSS);
+       case_WLAN(MESH_CHAN_REGULATORY);
+       case_WLAN(MESH_CHAN);
+       default: return "<unknown>";
+       }
+}
 
 static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata,
                                     struct ieee80211_mgmt *mgmt, size_t len)
@@ -2270,8 +2326,8 @@ static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata,
 
        reason_code = le16_to_cpu(mgmt->u.deauth.reason_code);
 
-       sdata_info(sdata, "deauthenticated from %pM (Reason: %u)\n",
-                  bssid, reason_code);
+       sdata_info(sdata, "deauthenticated from %pM (Reason: %u=%s)\n",
+                  bssid, reason_code, ieee80211_get_reason_code_string(reason_code));
 
        ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
 
@@ -4340,8 +4396,8 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
        bool report_frame = false;
 
        sdata_info(sdata,
-                  "deauthenticating from %pM by local choice (reason=%d)\n",
-                  req->bssid, req->reason_code);
+                  "deauthenticating from %pM by local choice (Reason: %u=%s)\n",
+                  req->bssid, req->reason_code, ieee80211_get_reason_code_string(req->reason_code));
 
        if (ifmgd->auth_data) {
                drv_mgd_prepare_tx(sdata->local, sdata);
@@ -4387,8 +4443,8 @@ int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
                return -ENOLINK;
 
        sdata_info(sdata,
-                  "disassociating from %pM by local choice (reason=%d)\n",
-                  req->bss->bssid, req->reason_code);
+                  "disassociating from %pM by local choice (Reason: %u=%s)\n",
+                  req->bss->bssid, req->reason_code, ieee80211_get_reason_code_string(req->reason_code));
 
        memcpy(bssid, req->bss->bssid, ETH_ALEN);
        ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DISASSOC,