关闭上层的nud 检测机制后,发现driver并没有检查到nud fail并断线,导致无法达到预期
原理
driver检测nud的原理就是检测这个mac的TX RX数据来判断nud是否成功。
1. cnss_daemon更新网关
上层必须要更新网关,底层才能知道mac地址,否则不会进去判断,只会不断enter和exit
hdd_nud_filter_netevent,这里面如果没有更新网关就会return
正常的logcat(需要提高cnss_daemon的log等级,
09-22 16:57:50.000 20797 20797 I wpa_supplicant: wlan0: Trying to associate with SSID ‘AX6000_5G\xe5\xb7\xa5\xe7\xa8\x8b\xe6\x9c\xba’
09-22 16:58:00.495 1688 1688 I cnss-daemon: Ready to update GW parameters
09-22 16:58:00.496 1688 1688 D cnss-daemon: gateway ipv4 address: 192.168.31.1
09-22 16:58:00.496 1688 1688 D cnss-daemon: gateway mac address: 8c🇩🇪f9:20:02:b4
异常的logcat:
09-22 15:42:42.019 23329 23329 I wpa_supplicant: wlan0: Trying to associate with SSID ‘AX6000_5G\xe5\xb7\xa5\xe7\xa8\x8b\xe6\x9c\xba’
09-22 15:42:43.777 1654 1654 D cnss-daemon: gateway ipv4 address: 192.168.31.1
09-22 15:42:43.777 1654 1654 D cnss-daemon: gateway mac address: 00:00:00:00:00:00
09-22 15:42:43.813 1654 1654 E cnss-daemon: failed to update gateway
异常的driver log(自己debug):
11:20:52.200048 [soft_i][0x5bfd41add][11:20:52.189408]wlan: [0:D:HDD] hdd_nud_filter_netevent: 442: enter
11:20:52.200049 [soft_i][0x5bfd41af2][11:20:52.189410]wlan: [0:D:HDD] hdd_nud_filter_netevent: 470: hdd_nud_filter_netevent fail: is_gw_updated
11:20:52.200051 [soft_i][0x5bfd41b04][11:20:52.189411]wlan: [0:D:HDD] __hdd_nud_netevent_cb: 529: exit
根据log看,之所以没有进行判断,是因为网关没有更新,根据这个指令,找到更新网关的代码。
14984 .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_GW_PARAM_CONFIG,
14988 .doit = wlan_hdd_cfg80211_set_gateway_params
cnss_update_wlan_drv ← cnss_gw_update_loop
2. TXRX检测
检测到NUD TX RX异常后会进行处理和状态改变,需要满足两个条件才会去处理NUD FAIL事件,第一个条件只会在第一次触发NUD FAIL的时候才满足,第二个条件也不好达成,说不定还会收到其它RX包。
16:59:18.095671 [soft_i][0x6ce8348320][16:59:18.094244]wlan: [0:D:HDD] hdd_nud_filter_netevent: 508: NUD_FAILED [0x20]
16:59:18.096439 [soft_i][0x6ce8348466][16:59:18.094261]wlan: [0:D:HDD] hdd_nud_honour_failure: 203: NUD_FAILURE_HONORED [mac:8c:de:f9:20:02:b4]
16:59:18.096456 [soft_i][0x6ce834876d][16:59:18.094301]wlan: [0:D:HDD] hdd_nud_stats_info: 121: **** NUD STATS: ****
16:59:18.096466 [soft_i][0x6ce83487fa][16:59:18.094308]wlan: [0:D:HDD] hdd_nud_stats_info: 123: NUD Probe Tx : 4946
16:59:18.096476 [soft_i][0x6ce8348883][16:59:18.094315]wlan: [0:D:HDD] hdd_nud_stats_info: 125: NUD Probe Ack : 4903
16:59:18.096485 [soft_i][0x6ce834890f][16:59:18.094323]wlan: [0:D:HDD] hdd_nud_stats_info: 127: NUD Probe Rx : 2225
16:59:18.096494 [soft_i][0x6ce83489a3][16:59:18.094330]wlan: [0:D:HDD] hdd_nud_stats_info: 129: NUD Failure Tx : 5011
16:59:18.096503 [soft_i][0x6ce8348a2a][16:59:18.094337]wlan: [0:D:HDD] hdd_nud_stats_info: 131: NUD Failure Ack : 4969
16:59:18.096513 [soft_i][0x6ce8348aaa][16:59:18.094344]wlan: [0:D:HDD] hdd_nud_stats_info: 133: NUD Failure Rx : 2227
16:59:18.096522 [soft_i][0x6ce8348b2f][16:59:18.094351]wlan: [0:D:HDD] hdd_nud_stats_info: 136: NUD Gateway Rx : 0
16:59:18.096531 [soft_i][0x6ce8348bb0][16:59:18.094358]wlan: [0:D:HDD] hdd_nud_stats_info: 138: carrier state: 1
16:59:18.096540 [soft_i][0x6ce8348c62][16:59:18.094367]wlan: [0:D:HDD] hdd_nud_stats_info: 143: Queue: 0 status: 0 txq->trans_start: 4295259528
16:59:18.096549 [soft_i][0x6ce8348cf7][16:59:18.094375]wlan: [0:D:HDD] hdd_nud_stats_info: 143: Queue: 1 status: 0 txq->trans_start: 0
16:59:18.096564 [soft_i][0x6ce8348d90][16:59:18.094383]wlan: [0:D:HDD] hdd_nud_stats_info: 143: Queue: 2 status: 0 txq->trans_start: 4295259528
16:59:18.096574 [soft_i][0x6ce8348e3a][16:59:18.094392]wlan: [0:D:HDD] hdd_nud_stats_info: 143: Queue: 3 status: 0 txq->trans_start: 0
16:59:18.096583 [soft_i][0x6ce8348ed8][16:59:18.094400]wlan: [0:D:HDD] hdd_nud_stats_info: 143: Queue: 4 status: 0 txq->trans_start: 0
16:59:18.096593 [soft_i][0x6ce8348f60][16:59:18.094407]wlan: [0:D:HDD] hdd_nud_stats_info: 146: Current pause_map value 0
16:59:18.101585 [kworke][0x6ce834b906][16:59:18.094963]wlan: [14754:D:HDD] hdd_handle_nud_fail_sta: 251: nud fail detected, try roaming to better BSSID, vdev id: 0
16:59:18.101683 [kworke][0x6ce834c2e9][16:59:18.095094]wlan: [14754:D:SME] sme_roam_invoke_nud_fail: 14114: FW does not support data stall recovery, aborting roam invoke
16:59:22.906481 [soft_i][0x6cedb2e0d1][16:59:22.894639]wlan: [0:D:HDD] hdd_nud_filter_netevent: 508: NUD_FAILED [0x20]
16:59:22.906500 [soft_i][0x6cedb2e160][16:59:22.894647]wlan: [0:D:HDD] hdd_nud_process_failure_event: 424: NUD FAILED -> Current State [0x20]
16:59:27.950072 [soft_i][0x6cf3779ac3][16:59:27.935199]wlan: [0:D:HDD] hdd_nud_filter_netevent: 508: NUD_FAILED [0x20]
16:59:27.950089 [soft_i][0x6cf3779bd3][16:59:27.935213]wlan: [0:D:HDD] hdd_nud_process_failure_event: 424: NUD FAILED -> Current State [0x20]
16:59:32.916705 [soft_i][0x6cf927a363][16:59:32.905127]wlan: [0:D:HDD] hdd_nud_filter_netevent: 508: NUD_FAILED [0x20]
16:59:32.916721 [soft_i][0x6cf927a46c][16:59:32.905141]wlan: [0:D:HDD] hdd_nud_process_failure_event: 424: NUD FAILED -> Current State [0x20]
首先,RX为0,并且是第一次,所以在接收到NUD_FAIL后触发了处理函数,并且把状态更改为NUD_FAILED(0X20)
然后,底层处理时发现FW不支持,就不了了之。
最后,虽然一直触发NUD_FAIL, 但是当前状态是0x20,所以没有进if,每次都打个log跳出判断
hdd_nud_process_failure_event: 424: NUD FAILED -> Current State [0x20]
总结:NUD触发–>处理–>底层不支持–>状态为0x20–>频繁触发NUD→由于状态为0x20,直接return
策略
上层:
底层:
WCNSS_qcom_cfg.ini文件中修改gEnableNUDTracking=3,
3表示底层在连接后,如果检测到NUD fail,会先去漫游,漫游失败触发断线