關閉IpReachabilityMonitor功能的辦法:
<!-- IpReachability monitor enable/Disable --> <bool translatable="false" name="config_wifi_ipreachability_monitor">false</bool>
https://blog.csdn.net/peter_520_gh/article/details/103244034
描述:該文主要介紹基於Android 7.0 的IpReachabilityMonitor機制,有時候會遇到用戶反饋wifi 會概率性自動斷線,最后發現是系統有開啟IpReachabilityMonitor 機制,可能是在干擾嚴重環境下或相對弱信號下讓系統誤判導致下斷線。
如下只要針對IpReachabilityMonitor機制描述說明
IpReachabilityMonitor功能描述及作用
a. IpReachabilityMonitor的代碼實現邏輯不關心為什么一個neighbour網絡變為不可達。相反,他主要反映在內核層面中每一個neighbour網絡的IP可達性概念或狀態。我們知道這個IP可達性狀態對於正常網絡連接來說是關鍵重要的。因此IpReachabilityMonitor通常僅是“信使”:它警告neighbours網絡已經被內核kernel視為不可達。
b.IpReachabilityMonitor 機制是在Android 7.0中新增,主要是要確認gateway or DNS server是否可以為unreachable,此機制會 定期(大約18s~22s timer到就會做一次)trigger 上層發送arp req,若發送三筆arp req未收到對應arp rsp IpReachabilityMonitor 會fail,trigger上層下斷線
c. 下斷線條件:arp req三筆都發出去后,第三筆隔一秒后還是沒有收到arp rsp就trigger斷線, driver log可以看到明確的1s發送 一個arp req, 但送到air時間未必會是一秒就tx 1筆(可以看sniffer log)
d.Android是透過 Linux netlink socket機制去獲得 kernel neighbor 信息,(NETLINK_ROUTE 的 neighbor , 利用 kernel ARP cache) :https://blog.csdn.net/qy532846454/article/details/6806197, 所以當ARP table 沒有該信息時, 應該會用 broadcast 方式.在干擾較大的環境下, 可以調整參數來增加發 ARP 的次數:http://man7.org/linux/man-pages/man7/arp.7.html
如何規避因IpReachabilityMonitor導致系統下斷線
1.在系統frameworks\base\core\res\res\values\config.xml中關閉“IpReachabilityMonitor”,
補充:
NUD (Neighbour Unreachability Detection) state ---鄰居不可達檢測狀態:
網關/DNS服務器 ARP/RARP
NUD 主要有以下幾種狀態:
NUD_INCOMPLETE、
NUD_REACHABLE、
NUD_DELAY、
NUD_PROBE、
NUD_STALE、
NUD_NOARP、
NUD_PERMANENT、
NUD_PROBE、
NUD_FAILED
NUD機制說明:
https://blog.csdn.net/lickylin/article/details/22228047
https://chromium.googlesource.com/chromiumos/platform2/+/master/patchpanel/network_monitor_service.h
http://www.embeddedlinux.org.cn/linux_net/0596002556/understandlni-CHP-27-SECT-6.html
參考如下:
也可參考鏈接:https://github.com/ngoquang2708/android_device_samsung_vivalto3gvn/commit/773986dabc49a8cb550be657f9f78f61994109f8
2. 可以通過下指令調整參數來增加 ARP req發送次數, cmd如下(關於mcast_solicit和ucast_solicit)
#echo 10 > /proc/sys/net/ipv4/neigh/wlan0/mcast_solicit
#echo 10 > /proc/sys/net/ipv4/neigh/wlan0/ucast_solicit
可參考:http://man7.org/linux/man-pages/man7/arp.7.html