Skip to content

Commit edcc4c3

Browse files
committed
[gen4] wifi: parse/log disconnect reason
1 parent ce64c47 commit edcc4c3

File tree

2 files changed

+83
-2
lines changed

2 files changed

+83
-2
lines changed

hal/network/ncp_client/realtek/rtl_ncp_client.cpp

+82-2
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ extern "C" {
5656
#include "bt_intf.h"
5757

5858
extern "C" void rtw_efuse_boot_write(void);
59+
extern "C" uint32_t rltk_wlan_get_link_err(void);
5960

6061
void wifi_set_country_code(void) {
6162
uint8_t channel_plan;
@@ -300,6 +301,84 @@ NcpConnectionState RealtekNcpClient::connectionState() {
300301
return connState_;
301302
}
302303

304+
void RealtekNcpClient::parseDisconnectReason(char* buf, size_t bufLen) {
305+
uint16_t reason = 0;
306+
if (buf) {
307+
reason = *(uint16_t*)(buf + 6 /* skip MAC */);
308+
}
309+
uint32_t linkErr = rltk_wlan_get_link_err();
310+
311+
const char* msg = "";
312+
const char* extraMsg = "";
313+
const char* reasonMsg = "";
314+
315+
// From wifi_link_err_parse()
316+
if(linkErr & BIT(0)) {
317+
msg = "received deauth";
318+
} else if(linkErr & BIT(1)) {
319+
msg = "received deassoc";
320+
} else if (linkErr & BIT(2)) {
321+
msg = "scan stage, no beacon while connecting";
322+
} else if(linkErr & BIT(3)) {
323+
msg = "auth stage, auth timeout";
324+
if (reason == 65531) {
325+
extraMsg = "request has been declined";
326+
}
327+
} else if(linkErr & BIT(4)) {
328+
msg = "assoc stage, assoc timeout";
329+
} else if(linkErr & (BIT(5) | BIT(6) | BIT(7))) {
330+
msg = "4handshake stage, 4-way waiting timeout";
331+
} else if(linkErr & BIT(8)) {
332+
msg = "assoc stage, assoc reject (assoc rsp status > 0)";
333+
} else if(linkErr & BIT(9)) {
334+
msg = "auth stage, auth fail (auth rsp status > 0)";
335+
} else if(linkErr & BIT(10)){
336+
msg = "scan stage, scan timeout";
337+
} else if(linkErr & BIT(11)) {
338+
msg = "auth stage, WPA3 auth fail";
339+
if (reason == 65531) {
340+
extraMsg = "request has been declined";
341+
} else {
342+
extraMsg = "password error";
343+
}
344+
}
345+
346+
if(linkErr & (BIT(0) | BIT(1))) {
347+
if(linkErr & BIT(20)) {
348+
msg = "handshake done, connected stage, recv deauth/deassoc";
349+
} else if(linkErr & BIT(19)) {
350+
msg = "handshake processing, 4handshake stage, recv deauth/deassoc";
351+
} else if(linkErr & BIT(18)) {
352+
msg = "assoc successed, 4handshake stage, recv deauth/deassoc";
353+
} else if(linkErr & BIT(17)) {
354+
msg = "auth successed, assoc stage, recv deauth/deassoc";
355+
} else if(linkErr & BIT(16)) {
356+
msg = "scan done, found ssid, auth stage, recv deauth/deassoc";
357+
} else {
358+
msg = "connected stage, recv deauth/deassoc";
359+
}
360+
}
361+
362+
switch(reason) {
363+
case 17:
364+
reasonMsg = "auth stage, ap auth full";
365+
break;
366+
case 65530:
367+
reasonMsg = "SA query timeout";
368+
break;
369+
case 65534:
370+
reasonMsg = "connected stage, ap changed";
371+
break;
372+
case 65535:
373+
reasonMsg = "connected stage, loss beacon";
374+
break;
375+
default:
376+
break;
377+
}
378+
379+
LOG(WARN, "Disconnect linkError=%08x reason=%04x: %s %s %s", linkErr, reason, msg, extraMsg, reasonMsg);
380+
}
381+
303382
int RealtekNcpClient::connect(const char* ssid, const MacAddress& bssid, WifiSecurity sec, const WifiCredentials& cred) {
304383
CHECK_FALSE(needsReset_, SYSTEM_ERROR_BUSY);
305384
int rtlError = RTW_ERROR;
@@ -310,12 +389,13 @@ int RealtekNcpClient::connect(const char* ssid, const MacAddress& bssid, WifiSec
310389

311390
connectionState(NcpConnectionState::CONNECTING);
312391

313-
wifi_reg_event_handler(WIFI_EVENT_DISCONNECT, [](char* buf, int buf_len, int flags, void* userdata) -> void {
392+
wifi_reg_event_handler(WIFI_EVENT_DISCONNECT, [](char* buf, int bufLen, int flags, void* userdata) -> void {
314393
RealtekNcpClient* client = (RealtekNcpClient*)userdata;
315394
if (client->connectionState() == NcpConnectionState::CONNECTED) {
316395
LOG(TRACE, "Disconnected");
317396
client->connectionState(NcpConnectionState::DISCONNECTED);
318397
}
398+
client->parseDisconnectReason(buf, (size_t)bufLen);
319399
}, (void*)this);
320400

321401
LOG(INFO, "Try to connect to ssid: %s", ssid);
@@ -357,7 +437,7 @@ int RealtekNcpClient::getNetworkInfo(WifiNetworkInfo* info) {
357437
info->channel(channel_num);
358438
}
359439

360-
char ssid_buf[33] = {};//32 octets for SSID, plus null terminator
440+
char ssid_buf[33] = {};//32 octets for SSID, plus null terminator
361441
rtlError = wext_get_ssid(WLAN0_NAME, (unsigned char *) ssid_buf);
362442
if (rtlError < 0) {
363443
LOG(WARN, "wext_get_ssid err: %d", rtlError);

hal/network/ncp_client/realtek/rtl_ncp_client.h

+1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ class RealtekNcpClient: public WifiNcpClient {
8181

8282
int rltkOn();
8383
int rltkOff();
84+
void parseDisconnectReason(char* buf, size_t bufLen);
8485
};
8586

8687
inline void RealtekNcpClient::lock() {

0 commit comments

Comments
 (0)