问题描述:
客户反馈正常机器放置一天时间,第二天来发现以太网无法上网,以太网灯还是正常闪烁的。
问题分析:
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) {