天天看点

[RK3399][Android7.1]机器长时间放置后概率出现以太网不能上网问题描述:问题分析:解决方案:

问题描述:

客户反馈正常机器放置一天时间,第二天来发现以太网无法上网,以太网灯还是正常闪烁的。

问题分析:

1.尝试插拔网线,网络可以恢复正常

2.从抓取到的kernel log看,以太网无异常

3.ifconfig查看以太网ip信息,发现以太网无ip地址了

4.只有客户网络环境才能发现复现问题,我司测试未复现此问题

5.logcat查看log信息,ipv6地址配制失败了,DhcpClient 退出了

07-21 04:05:46.416 549 1232 D IpManager.eth0: newLp{{InterfaceName: eth0 LinkAddresses: [fe80::60fd:62ff:fec7:100a/64,192.168.1.73/24,240e:3b3:30b3:2390:60fd:62ff:fec7:100a/64,240e:3b3:30b3:2390:5f1:4223:5bdc:7b01/64,] Routes: [fe80::/64 -> :: eth0,240e:3b3:30b3:2390::/64 -> :: eth0,192.168.1.0/24 -> 0.0.0.0 eth0,0.0.0.0/0 -> 192.168.1.1 eth0,] DnsAddresses: [192.168.1.1,] Domains: null MTU: 0 TcpBufferSizes: 524288,1048576,3145728,524288,1048576,2097152}}
07-21 04:05:46.416 549 1232 D IpManager.eth0: onProvisioningFailure()
07-21 04:05:46.423 549 1232 D DhcpClient: doQuit
07-21 04:05:46.425 549 1247 D DhcpClient: Receive thread stopped
07-21 04:05:46.434 549 1235 D DhcpClient: onQuitting
07-21 04:05:46.440 247 545 D CommandListener: Setting iface cfg
07-21 04:05:46.448 549 1232 D IpManager.eth0: CMD_CLEAR_LINKADDRESS eth0/2 0 0 null [rcvd_in=StoppingState, proc_in=StoppingState]
07-21 04:05:46.449 549 1232 D IpManager.eth0: CMD_ON_QUIT eth0/2 0 0 null [rcvd_in=StoppingState, proc_in=StoppingState]
07-21 04:05:46.466 247 545 D CommandListener: Clearing all IP addresses on eth0
07-21 04:05:46.468 549 1232 D IpManager.eth0: newLp{{InterfaceName: eth0 LinkAddresses: [] Routes: [] DnsAddresses: [] Domains: null MTU: 0}}
           

解决方案:

这个应该是客户路由器网络不稳定造成的;从上述问题分析中我们可以在ip地址配置失败时重连网络来解决这个问题。

patch如下:

diff --git a/java/com/android/server/ethernet/EthernetNetworkFactory.java b/java/com/android/server/ethernet/EthernetNetworkFactory.java
index 4acf1d1..9b76b2f 100755
--- a/java/com/android/server/ethernet/EthernetNetworkFactory.java
+++ b/java/com/android/server/ethernet/EthernetNetworkFactory.java
@@ -98,7 +98,7 @@ class EthernetNetworkFactory {
     private static final boolean DBG = true;
     private static final String ETHMODE_MULTI = "multi";
     private static final String ETHMODE_BRIDGE = "bridge";
-
+    private boolean isAddressRemove = true;
     /** Tracks interface changes. Called from NetworkManagementService. */
     private InterfaceObserver mInterfaceObserver;
 
@@ -131,7 +131,7 @@ class EthernetNetworkFactory {
     private LinkProperties mLinkProperties;
     private IpManager mIpManager;
     private Thread mIpProvisioningThread;
-
+   
     public int mEthernetCurrentState = EthernetManager.ETHER_STATE_DISCONNECTED;
     private boolean mReconnecting;
     private IpAssignment mConnectMode;
@@ -247,9 +247,11 @@ class EthernetNetworkFactory {
 
         synchronized(this) {
             mLinkUp = up;
+        //tryCount = 3;
             mNetworkInfo.setIsAvailable(up);
             if (!up) {
                 sendEthernetStateChangedBroadcast(EthernetManager.ETHER_STATE_DISCONNECTING);
+        isAddressRemove = true;
                 // Tell the agent we're disconnected. It will call disconnect().
                 mNetworkInfo.setDetailedState(DetailedState.DISCONNECTED, null, mHwAddr);
                 if (mConnectMode == IpAssignment.PPPOE) {
@@ -337,6 +339,44 @@ class EthernetNetworkFactory {
                 }
             }
         }
+
+    @Override
+    public void addressUpdated(String iface, LinkAddress address) {
+        if (!mIface.equals(iface)) {
+            return;
+        }
+        Log.e(TAG, "addressUpdated: " + iface + ":" + address);
+        if (mConnectMode == IpAssignment.DHCP) {
+            if (address.getAddress().getHostAddress().contains(".") && isAddressRemove) {
+                 isAddressRemove = false;
+            }
+          
+        }
+        
+    }
+
+    @Override
+    public void addressRemoved(String iface, LinkAddress address) {
+        if (!mIface.equals(iface)) {
+            return;
+        }
+        Log.e(TAG, "addressRemoved: " + iface + ":" + address);
+        if (mConnectMode == IpAssignment.DHCP) {
+            if (address.getAddress().getHostAddress().contains(".")  && !isAddressRemove) {
+                Log.e(TAG, "chunqiao disconnect: " + iface + ":" + address);
+                //disconnect(iface);
+            try {
+                    Thread.sleep(1000);    
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                } 
+                Log.e(TAG, "chunqiao reconnect: " + iface + ":" + address);
+                reconnect(iface);
+                
+            }
+       }
+   } 
+
     }
 
     private void setInterfaceUp(String iface) {