@@ -56,6 +56,7 @@ extern "C" {
56
56
#include " bt_intf.h"
57
57
58
58
extern " C" void rtw_efuse_boot_write (void );
59
+ extern " C" uint32_t rltk_wlan_get_link_err (void );
59
60
60
61
void wifi_set_country_code (void ) {
61
62
uint8_t channel_plan;
@@ -300,6 +301,84 @@ NcpConnectionState RealtekNcpClient::connectionState() {
300
301
return connState_;
301
302
}
302
303
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
+
303
382
int RealtekNcpClient::connect (const char * ssid, const MacAddress& bssid, WifiSecurity sec, const WifiCredentials& cred) {
304
383
CHECK_FALSE (needsReset_, SYSTEM_ERROR_BUSY);
305
384
int rtlError = RTW_ERROR;
@@ -310,12 +389,13 @@ int RealtekNcpClient::connect(const char* ssid, const MacAddress& bssid, WifiSec
310
389
311
390
connectionState (NcpConnectionState::CONNECTING);
312
391
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 {
314
393
RealtekNcpClient* client = (RealtekNcpClient*)userdata;
315
394
if (client->connectionState () == NcpConnectionState::CONNECTED) {
316
395
LOG (TRACE, " Disconnected" );
317
396
client->connectionState (NcpConnectionState::DISCONNECTED);
318
397
}
398
+ client->parseDisconnectReason (buf, (size_t )bufLen);
319
399
}, (void *)this );
320
400
321
401
LOG (INFO, " Try to connect to ssid: %s" , ssid);
@@ -357,7 +437,7 @@ int RealtekNcpClient::getNetworkInfo(WifiNetworkInfo* info) {
357
437
info->channel (channel_num);
358
438
}
359
439
360
- char ssid_buf[33 ] = {};// 32 octets for SSID, plus null terminator
440
+ char ssid_buf[33 ] = {};// 32 octets for SSID, plus null terminator
361
441
rtlError = wext_get_ssid (WLAN0_NAME, (unsigned char *) ssid_buf);
362
442
if (rtlError < 0 ) {
363
443
LOG (WARN, " wext_get_ssid err: %d" , rtlError);
0 commit comments