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
diff --git a/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java b/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java
index 29464b7..d464879 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 @@
         }
 
         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 @@
         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 @@
         /** 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;