Loading services/core/java/com/android/server/connectivity/KeepaliveTracker.java +43 −16 Original line number Diff line number Diff line Loading @@ -191,6 +191,7 @@ public class KeepaliveTracker { case NOT_STARTED : return "NOT_STARTED"; case STARTING : return "STARTING"; case STARTED : return "STARTED"; case STOPPING : return "STOPPING"; } throw new IllegalArgumentException("Unknown state"); } Loading Loading @@ -314,9 +315,18 @@ public class KeepaliveTracker { Log.e(TAG, "Cannot stop unowned keepalive " + mSlot + " on " + mNai.network); } } if (NOT_STARTED != mStartedState) { Log.d(TAG, "Stopping keepalive " + mSlot + " on " + mNai.name() + ": " + reason); switch (mStartedState) { case NOT_STARTED: // Remove the reference of the keepalive that meet error before starting, // e.g. invalid parameter. cleanupStoppedKeepalive(mNai, mSlot); break; case STOPPING: // Keepalive is already in stopping state, ignore. return; default: mStartedState = STOPPING; Log.d(TAG, "Stopping keepalive " + mSlot + " on " + mNai.name()); if (mType == TYPE_NATT) { mNai.asyncChannel.sendMessage(CMD_STOP_SOCKET_KEEPALIVE, mSlot); } else if (mType == TYPE_TCP) { Loading Loading @@ -405,9 +415,9 @@ public class KeepaliveTracker { for (KeepaliveInfo ki : networkKeepalives.values()) { ki.stop(reason); } networkKeepalives.clear(); mKeepalives.remove(nai); } // Clean up keepalives will be done as a result of calling ki.stop() after the slots are // freed. } public void handleStopKeepalive(NetworkAgentInfo nai, int slot, int reason) { Loading @@ -423,8 +433,24 @@ public class KeepaliveTracker { return; } ki.stop(reason); // Clean up keepalives will be done as a result of calling ki.stop() after the slots are // freed. } private void cleanupStoppedKeepalive(NetworkAgentInfo nai, int slot) { String networkName = (nai == null) ? "(null)" : nai.name(); HashMap<Integer, KeepaliveInfo> networkKeepalives = mKeepalives.get(nai); if (networkKeepalives == null) { Log.e(TAG, "Attempt to remove keepalive on nonexistent network " + networkName); return; } KeepaliveInfo ki = networkKeepalives.get(slot); if (ki == null) { Log.e(TAG, "Attempt to remove nonexistent keepalive " + slot + " on " + networkName); return; } networkKeepalives.remove(slot); Log.d(TAG, "Stopped keepalive " + slot + " on " + networkName + ", " Log.d(TAG, "Remove keepalive " + slot + " on " + networkName + ", " + networkKeepalives.size() + " remains."); if (networkKeepalives.isEmpty()) { mKeepalives.remove(nai); Loading Loading @@ -495,10 +521,11 @@ public class KeepaliveTracker { handleStopKeepalive(nai, slot, reason); } } else if (KeepaliveInfo.STOPPING == ki.mStartedState) { // The message indicated result of stopping : don't call handleStopKeepalive. // The message indicated result of stopping : clean up keepalive slots. Log.d(TAG, "Stopped keepalive " + slot + " on " + nai.name() + " stopped: " + reason); ki.mStartedState = KeepaliveInfo.NOT_STARTED; cleanupStoppedKeepalive(nai, slot); } else { Log.wtf(TAG, "Event " + message.what + "," + slot + "," + reason + " for keepalive in wrong state: " + ki.toString()); Loading tests/net/java/com/android/server/ConnectivityServiceTest.java +5 −3 Original line number Diff line number Diff line Loading @@ -4292,8 +4292,9 @@ public class ConnectivityServiceTest { } // Check that there is no port leaked after all keepalives and sockets are closed. assertFalse(isUdpPortInUse(srcPort)); assertFalse(isUdpPortInUse(srcPort2)); // TODO: enable this check after ensuring a valid free port. See b/129512753#comment7. // assertFalse(isUdpPortInUse(srcPort)); // assertFalse(isUdpPortInUse(srcPort2)); mWiFiNetworkAgent.disconnect(); waitFor(mWiFiNetworkAgent.getDisconnectedCV()); Loading Loading @@ -4421,7 +4422,8 @@ public class ConnectivityServiceTest { assertEquals(anyIPv4, sa.getAddress()); testPfd.close(); assertFalse(isUdpPortInUse(srcPort)); // TODO: enable this check after ensuring a valid free port. See b/129512753#comment7. // assertFalse(isUdpPortInUse(srcPort)); mWiFiNetworkAgent.disconnect(); waitFor(mWiFiNetworkAgent.getDisconnectedCV()); Loading Loading
services/core/java/com/android/server/connectivity/KeepaliveTracker.java +43 −16 Original line number Diff line number Diff line Loading @@ -191,6 +191,7 @@ public class KeepaliveTracker { case NOT_STARTED : return "NOT_STARTED"; case STARTING : return "STARTING"; case STARTED : return "STARTED"; case STOPPING : return "STOPPING"; } throw new IllegalArgumentException("Unknown state"); } Loading Loading @@ -314,9 +315,18 @@ public class KeepaliveTracker { Log.e(TAG, "Cannot stop unowned keepalive " + mSlot + " on " + mNai.network); } } if (NOT_STARTED != mStartedState) { Log.d(TAG, "Stopping keepalive " + mSlot + " on " + mNai.name() + ": " + reason); switch (mStartedState) { case NOT_STARTED: // Remove the reference of the keepalive that meet error before starting, // e.g. invalid parameter. cleanupStoppedKeepalive(mNai, mSlot); break; case STOPPING: // Keepalive is already in stopping state, ignore. return; default: mStartedState = STOPPING; Log.d(TAG, "Stopping keepalive " + mSlot + " on " + mNai.name()); if (mType == TYPE_NATT) { mNai.asyncChannel.sendMessage(CMD_STOP_SOCKET_KEEPALIVE, mSlot); } else if (mType == TYPE_TCP) { Loading Loading @@ -405,9 +415,9 @@ public class KeepaliveTracker { for (KeepaliveInfo ki : networkKeepalives.values()) { ki.stop(reason); } networkKeepalives.clear(); mKeepalives.remove(nai); } // Clean up keepalives will be done as a result of calling ki.stop() after the slots are // freed. } public void handleStopKeepalive(NetworkAgentInfo nai, int slot, int reason) { Loading @@ -423,8 +433,24 @@ public class KeepaliveTracker { return; } ki.stop(reason); // Clean up keepalives will be done as a result of calling ki.stop() after the slots are // freed. } private void cleanupStoppedKeepalive(NetworkAgentInfo nai, int slot) { String networkName = (nai == null) ? "(null)" : nai.name(); HashMap<Integer, KeepaliveInfo> networkKeepalives = mKeepalives.get(nai); if (networkKeepalives == null) { Log.e(TAG, "Attempt to remove keepalive on nonexistent network " + networkName); return; } KeepaliveInfo ki = networkKeepalives.get(slot); if (ki == null) { Log.e(TAG, "Attempt to remove nonexistent keepalive " + slot + " on " + networkName); return; } networkKeepalives.remove(slot); Log.d(TAG, "Stopped keepalive " + slot + " on " + networkName + ", " Log.d(TAG, "Remove keepalive " + slot + " on " + networkName + ", " + networkKeepalives.size() + " remains."); if (networkKeepalives.isEmpty()) { mKeepalives.remove(nai); Loading Loading @@ -495,10 +521,11 @@ public class KeepaliveTracker { handleStopKeepalive(nai, slot, reason); } } else if (KeepaliveInfo.STOPPING == ki.mStartedState) { // The message indicated result of stopping : don't call handleStopKeepalive. // The message indicated result of stopping : clean up keepalive slots. Log.d(TAG, "Stopped keepalive " + slot + " on " + nai.name() + " stopped: " + reason); ki.mStartedState = KeepaliveInfo.NOT_STARTED; cleanupStoppedKeepalive(nai, slot); } else { Log.wtf(TAG, "Event " + message.what + "," + slot + "," + reason + " for keepalive in wrong state: " + ki.toString()); Loading
tests/net/java/com/android/server/ConnectivityServiceTest.java +5 −3 Original line number Diff line number Diff line Loading @@ -4292,8 +4292,9 @@ public class ConnectivityServiceTest { } // Check that there is no port leaked after all keepalives and sockets are closed. assertFalse(isUdpPortInUse(srcPort)); assertFalse(isUdpPortInUse(srcPort2)); // TODO: enable this check after ensuring a valid free port. See b/129512753#comment7. // assertFalse(isUdpPortInUse(srcPort)); // assertFalse(isUdpPortInUse(srcPort2)); mWiFiNetworkAgent.disconnect(); waitFor(mWiFiNetworkAgent.getDisconnectedCV()); Loading Loading @@ -4421,7 +4422,8 @@ public class ConnectivityServiceTest { assertEquals(anyIPv4, sa.getAddress()); testPfd.close(); assertFalse(isUdpPortInUse(srcPort)); // TODO: enable this check after ensuring a valid free port. See b/129512753#comment7. // assertFalse(isUdpPortInUse(srcPort)); mWiFiNetworkAgent.disconnect(); waitFor(mWiFiNetworkAgent.getDisconnectedCV()); Loading