From 8bcf198c670593f132dc10c7f2e6a8aa1b2cea54 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Thu, 18 Jun 2020 16:36:32 +0000 Subject: [PATCH 1/2] Memory leak due to no stop for IpNeighborMonitor. 1. When Wi-Fi enabled, ap0 interface is added and IpNeighborMonitor's start() is invoked in IpServer's constructor. 2. There's no stop for IpNeighborMonitor when IpServer stop. 3. During overnight test for Wi-Fi, networkstack is too slow to process request due to memory leak in IpNeighborMonitor and binder buffer is blocked causing exception. Solution: Invoke IpNeighborMonitor.stop() in UnavailableState.enter(). Bug: 159097215 Test: automatic, turn on and off Wi-Fi every 6 seconds overnight Original-Change: https://android-review.googlesource.com/1343440 Merged-In: I8f60c13706f05306e8f25a15f7861d7ecabbc10e Change-Id: I8f60c13706f05306e8f25a15f7861d7ecabbc10e --- packages/Tethering/src/android/net/ip/IpServer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/Tethering/src/android/net/ip/IpServer.java b/packages/Tethering/src/android/net/ip/IpServer.java index 5239947403412..c436be2e9b988 100644 --- a/packages/Tethering/src/android/net/ip/IpServer.java +++ b/packages/Tethering/src/android/net/ip/IpServer.java @@ -1322,6 +1322,7 @@ public class IpServer extends StateMachine { class UnavailableState extends State { @Override public void enter() { + mIpNeighborMonitor.stop(); mLastError = TetheringManager.TETHER_ERROR_NO_ERROR; sendInterfaceState(STATE_UNAVAILABLE); } From 83f6a384cb775b94f87504da84a7c7d36cac5479 Mon Sep 17 00:00:00 2001 From: Treehugger Robot Date: Fri, 19 Jun 2020 03:04:46 +0000 Subject: [PATCH 2/2] Test that IpNeighborMonitor is stopped when IpServer stops. Bug: 159097215 Test: test-only change Original-Change: https://android-review.googlesource.com/1343441 Merged-In: I2292c1cbff06a304f70191b88d833b19af2b8b92 Change-Id: I2292c1cbff06a304f70191b88d833b19af2b8b92 --- .../Tethering/tests/unit/src/android/net/ip/IpServerTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/Tethering/tests/unit/src/android/net/ip/IpServerTest.java b/packages/Tethering/tests/unit/src/android/net/ip/IpServerTest.java index c65069c544903..30a9d2252ea65 100644 --- a/packages/Tethering/tests/unit/src/android/net/ip/IpServerTest.java +++ b/packages/Tethering/tests/unit/src/android/net/ip/IpServerTest.java @@ -860,6 +860,7 @@ public class IpServerTest { verify(mBpfCoordinator).tetherOffloadRuleClear(mIpServer); verify(mNetd).tetherOffloadRuleRemove(matches(UPSTREAM_IFINDEX, neighA, macA)); verify(mNetd).tetherOffloadRuleRemove(matches(UPSTREAM_IFINDEX, neighB, macB)); + verify(mIpNeighborMonitor).stop(); resetNetdAndBpfCoordinator(); }