問題描述:
客戶回報正常機器放置一天時間,第二天來發現以太網無法上網,以太網燈還是正常閃爍的。
問題分析:
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) {