1. 程式人生 > 其它 >Wifi 概率性自動斷線(IpReachabilityMonitor)

Wifi 概率性自動斷線(IpReachabilityMonitor)

關閉IpReachabilityMonitor功能的辦法:

1)使用cmd (需要root許可權) adb root adb shell cmd wifi set-ipreach-disconnect disabled   2)改程式碼 frameworks/opt/net/wifi/service/java/com/android/server/wifi/ClientModeImpl.java 將 mIpReachabilityDisconnectEnabled 設定成false   3)修改config檔案,開關置為false  ---有些廠商沒有這個開關 overlay/frameworks/base/core/res/res/values/config.xml
    <!-- IpReachability monitor enable/Disable -->
    <bool translatable="false" name="config_wifi_ipreachability_monitor">false</bool>
https://github.com/ngoquang2708/android_device_samsung_vivalto3gvn/commit/773986dabc49a8cb550be657f9f78f61994109f8

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”,

參考如下:

也可參考連結: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