From d16138eeea4a517167f460750ac036401828bfdf Mon Sep 17 00:00:00 2001 From: Patrick Rohr Date: Wed, 29 Jan 2025 07:34:27 -0800 Subject: [PATCH] Stop tracking left-over test interfaces When setIncludeTestInterfaces(false) is called, any RTM_DELLINK callback for a testtap interface is ignored, since the interface is no longer considered to be a valid ethernet interface. Change setIncludeTestInterfaces to go through all interfaces, and stop tracking the ones which are no longer valid. Otherwise, they will stick around forever (and break subsequent tests). Bug: 390722214 Test: TH Change-Id: Ied73e86c0452831f4d6b00f67908c51201af8bbd --- .../server/ethernet/EthernetTracker.java | 32 +++++++++++-------- .../server/ethernet/EthernetTrackerTest.java | 1 + 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/service-t/src/com/android/server/ethernet/EthernetTracker.java b/service-t/src/com/android/server/ethernet/EthernetTracker.java index bb7963e215..9b3c7ba26d 100644 --- a/service-t/src/com/android/server/ethernet/EthernetTracker.java +++ b/service-t/src/com/android/server/ethernet/EthernetTracker.java @@ -397,6 +397,16 @@ public class EthernetTracker { return mFactory.hasInterface(iface); } + private List getAllInterfaces() { + final ArrayList interfaces = new ArrayList<>( + List.of(mFactory.getAvailableInterfaces(/* includeRestricted */ true))); + + if (mTetheringInterfaceMode == INTERFACE_MODE_SERVER && mTetheringInterface != null) { + interfaces.add(mTetheringInterface); + } + return interfaces; + } + String[] getClientModeInterfaces(boolean includeRestricted) { return mFactory.getAvailableInterfaces(includeRestricted); } @@ -459,10 +469,16 @@ public class EthernetTracker { public void setIncludeTestInterfaces(boolean include) { mHandler.post(() -> { mIncludeTestInterfaces = include; - if (!include) { + if (include) { + trackAvailableInterfaces(); + } else { removeTestData(); + // remove all test interfaces + for (String iface : getAllInterfaces()) { + if (isValidEthernetInterface(iface)) continue; + stopTrackingInterface(iface); + } } - trackAvailableInterfaces(); }); } @@ -952,17 +968,7 @@ public class EthernetTracker { if (mIsEthernetEnabled == enabled) return; mIsEthernetEnabled = enabled; - - // Interface in server mode should also be included. - ArrayList interfaces = - new ArrayList<>( - List.of(mFactory.getAvailableInterfaces(/* includeRestricted */ true))); - - if (mTetheringInterfaceMode == INTERFACE_MODE_SERVER && mTetheringInterface != null) { - interfaces.add(mTetheringInterface); - } - - for (String iface : interfaces) { + for (String iface : getAllInterfaces()) { setInterfaceUpState(iface, enabled); } broadcastEthernetStateChange(mIsEthernetEnabled); diff --git a/tests/unit/java/com/android/server/ethernet/EthernetTrackerTest.java b/tests/unit/java/com/android/server/ethernet/EthernetTrackerTest.java index b7cfaf9b52..533bbf8776 100644 --- a/tests/unit/java/com/android/server/ethernet/EthernetTrackerTest.java +++ b/tests/unit/java/com/android/server/ethernet/EthernetTrackerTest.java @@ -79,6 +79,7 @@ public class EthernetTrackerTest { initMockResources(); doReturn(false).when(mFactory).updateInterfaceLinkState(anyString(), anyBoolean()); doReturn(new String[0]).when(mNetd).interfaceGetList(); + doReturn(new String[0]).when(mFactory).getAvailableInterfaces(anyBoolean()); mHandlerThread = new HandlerThread(THREAD_NAME); mHandlerThread.start(); tracker = new EthernetTracker(mContext, mHandlerThread.getThreadHandler(), mFactory, mNetd,