Wifi 概率性自动断线(IpReachabilityMonitor)
关闭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