From de93b3eb05dcb58d5a7bec6d5385e353d66f2fa9 Mon Sep 17 00:00:00 2001 From: Luis Hector Chavez Date: Fri, 16 Feb 2018 14:59:53 -0800 Subject: [PATCH] Avoid re-creating an IpClient if the network has already started This change avoids calling start() on needNetworkFor() if an IpClient object has already been created. This is the case when the interface is connected from boot, as is the case in Chrome OS. Bug: 73396557 Test: Networking is 100% stable in Chrome OS Change-Id: Iaa073d6477aadca2e4e5233b333d717ad82c1f3d --- .../server/ethernet/EthernetNetworkFactory.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java b/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java index 29464b78ce..d4648795c6 100644 --- a/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java +++ b/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java @@ -280,11 +280,14 @@ public class EthernetNetworkFactory extends NetworkFactory { } private void start() { + if (mIpClient != null) { + if (DBG) Log.d(TAG, "IpClient already started"); + return; + } if (DBG) { Log.d(TAG, String.format("starting IpClient(%s): mNetworkInfo=%s", name, mNetworkInfo)); } - if (mIpClient != null) stop(); mNetworkInfo.setDetailedState(DetailedState.OBTAINING_IPADDR, null, mHwAddress); @@ -325,6 +328,7 @@ public class EthernetNetworkFactory extends NetworkFactory { void onIpLayerStopped(LinkProperties linkProperties) { // This cannot happen due to provisioning timeout, because our timeout is 0. It can only // happen if we're provisioned and we lose provisioning. + stop(); start(); } @@ -338,12 +342,11 @@ public class EthernetNetworkFactory extends NetworkFactory { /** Returns true if state has been modified */ boolean updateLinkState(boolean up) { if (mLinkUp == up) return false; - mLinkUp = up; + + stop(); if (up) { start(); - } else { - stop(); } return true;