天天看點

[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) {