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  ---有些厂商没有这个开关
    <!-- 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”,


 补充:

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

 

 
posted @ 2022-03-09 19:17  petercao  阅读(927)  评论(0编辑  收藏  举报