diff options
11 files changed, 88 insertions, 16 deletions
diff --git a/apishim/29/com/android/networkstack/apishim/api29/NetworkInformationShimImpl.java b/apishim/29/com/android/networkstack/apishim/api29/NetworkInformationShimImpl.java index ca96eeb..b24b473 100644 --- a/apishim/29/com/android/networkstack/apishim/api29/NetworkInformationShimImpl.java +++ b/apishim/29/com/android/networkstack/apishim/api29/NetworkInformationShimImpl.java @@ -78,4 +78,10 @@ public class NetworkInformationShimImpl implements NetworkInformationShim { // Not supported on this API level return null; } + + @NonNull + @Override + public LinkProperties makeSensitiveFieldsParcelingCopy(@NonNull final LinkProperties lp) { + return new LinkProperties(lp); + } } diff --git a/apishim/30/com/android/networkstack/apishim/NetworkInformationShimImpl.java b/apishim/30/com/android/networkstack/apishim/NetworkInformationShimImpl.java index 496a5fd..6466662 100644 --- a/apishim/30/com/android/networkstack/apishim/NetworkInformationShimImpl.java +++ b/apishim/30/com/android/networkstack/apishim/NetworkInformationShimImpl.java @@ -75,4 +75,10 @@ public class NetworkInformationShimImpl extends if (nc == null) return null; return nc.getSSID(); } + + @NonNull + @Override + public LinkProperties makeSensitiveFieldsParcelingCopy(@NonNull final LinkProperties lp) { + return lp.makeSensitiveFieldsParcelingCopy(); + } } diff --git a/apishim/common/com/android/networkstack/apishim/NetworkInformationShim.java b/apishim/common/com/android/networkstack/apishim/NetworkInformationShim.java index 9170785..c266043 100644 --- a/apishim/common/com/android/networkstack/apishim/NetworkInformationShim.java +++ b/apishim/common/com/android/networkstack/apishim/NetworkInformationShim.java @@ -50,4 +50,10 @@ public interface NetworkInformationShim { */ @Nullable String getSSID(@Nullable NetworkCapabilities nc); + + /** + * @see LinkProperties#makeSensitiveFieldsParcelingCopy() + */ + @NonNull + LinkProperties makeSensitiveFieldsParcelingCopy(@NonNull LinkProperties lp); } diff --git a/common/moduleutils/src/android/net/util/InterfaceParams.java b/common/moduleutils/src/android/net/util/InterfaceParams.java index 3ba02b5..7e05a8d 100644 --- a/common/moduleutils/src/android/net/util/InterfaceParams.java +++ b/common/moduleutils/src/android/net/util/InterfaceParams.java @@ -38,6 +38,7 @@ import java.net.SocketException; public class InterfaceParams { public final String name; public final int index; + public final boolean hasMacAddress; public final MacAddress macAddr; public final int defaultMtu; @@ -69,7 +70,8 @@ public class InterfaceParams { checkArgument((index > 0), "invalid interface index"); this.name = name; this.index = index; - this.macAddr = (macAddr != null) ? macAddr : MacAddress.fromBytes(new byte[] { + this.hasMacAddress = (macAddr != null); + this.macAddr = hasMacAddress ? macAddr : MacAddress.fromBytes(new byte[] { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 }); this.defaultMtu = (defaultMtu > IPV6_MIN_MTU) ? defaultMtu : IPV6_MIN_MTU; } diff --git a/src/android/net/ip/IpClient.java b/src/android/net/ip/IpClient.java index dcd1827..47f955a 100644 --- a/src/android/net/ip/IpClient.java +++ b/src/android/net/ip/IpClient.java @@ -69,6 +69,8 @@ import com.android.internal.util.Preconditions; import com.android.internal.util.State; import com.android.internal.util.StateMachine; import com.android.internal.util.WakeupMessage; +import com.android.networkstack.apishim.NetworkInformationShim; +import com.android.networkstack.apishim.NetworkInformationShimImpl; import com.android.networkstack.apishim.ShimUtils; import com.android.server.NetworkObserverRegistry; import com.android.server.NetworkStackService.NetworkStackServiceManager; @@ -112,6 +114,7 @@ public class IpClient extends StateMachine { private static final ConcurrentHashMap<String, SharedLog> sSmLogs = new ConcurrentHashMap<>(); private static final ConcurrentHashMap<String, LocalLog> sPktLogs = new ConcurrentHashMap<>(); private final NetworkStackIpMemoryStore mIpMemoryStore; + private final NetworkInformationShim mShim = NetworkInformationShimImpl.newInstance(); /** * Dump all state machine and connectivity packet logs to the specified writer. @@ -165,11 +168,15 @@ public class IpClient extends StateMachine { private static final String PREFIX = "INVOKE "; private final IIpClientCallbacks mCallback; private final SharedLog mLog; + @NonNull + private final NetworkInformationShim mShim; @VisibleForTesting - protected IpClientCallbacksWrapper(IIpClientCallbacks callback, SharedLog log) { + protected IpClientCallbacksWrapper(IIpClientCallbacks callback, SharedLog log, + @NonNull NetworkInformationShim shim) { mCallback = callback; mLog = log; + mShim = shim; } private void log(String msg) { @@ -224,7 +231,7 @@ public class IpClient extends StateMachine { public void onProvisioningSuccess(LinkProperties newLp) { log("onProvisioningSuccess({" + newLp + "})"); try { - mCallback.onProvisioningSuccess(newLp); + mCallback.onProvisioningSuccess(mShim.makeSensitiveFieldsParcelingCopy(newLp)); } catch (RemoteException e) { log("Failed to call onProvisioningSuccess", e); } @@ -236,7 +243,7 @@ public class IpClient extends StateMachine { public void onProvisioningFailure(LinkProperties newLp) { log("onProvisioningFailure({" + newLp + "})"); try { - mCallback.onProvisioningFailure(newLp); + mCallback.onProvisioningFailure(mShim.makeSensitiveFieldsParcelingCopy(newLp)); } catch (RemoteException e) { log("Failed to call onProvisioningFailure", e); } @@ -248,7 +255,7 @@ public class IpClient extends StateMachine { public void onLinkPropertiesChange(LinkProperties newLp) { log("onLinkPropertiesChange({" + newLp + "})"); try { - mCallback.onLinkPropertiesChange(newLp); + mCallback.onLinkPropertiesChange(mShim.makeSensitiveFieldsParcelingCopy(newLp)); } catch (RemoteException e) { log("Failed to call onLinkPropertiesChange", e); } @@ -530,7 +537,7 @@ public class IpClient extends StateMachine { sPktLogs.putIfAbsent(mInterfaceName, new LocalLog(MAX_PACKET_RECORDS)); mConnectivityPacketLog = sPktLogs.get(mInterfaceName); mMsgStateLogger = new MessageHandlingLogger(); - mCallback = new IpClientCallbacksWrapper(callback, mLog); + mCallback = new IpClientCallbacksWrapper(callback, mLog, mShim); // TODO: Consider creating, constructing, and passing in some kind of // InterfaceController.Dependencies class. @@ -1302,7 +1309,7 @@ public class IpClient extends StateMachine { private void doImmediateProvisioningFailure(int failureType) { logError("onProvisioningFailure(): %s", failureType); recordMetric(failureType); - mCallback.onProvisioningFailure(new LinkProperties(mLinkProperties)); + mCallback.onProvisioningFailure(mLinkProperties); } private boolean startIPv4() { @@ -1423,7 +1430,7 @@ public class IpClient extends StateMachine { if (mStartTimeMillis > 0) { // Completed a life-cycle; send a final empty LinkProperties // (cleared in resetLinkProperties() above) and record an event. - mCallback.onLinkPropertiesChange(new LinkProperties(mLinkProperties)); + mCallback.onLinkPropertiesChange(mLinkProperties); recordMetric(IpManagerEvent.COMPLETE_LIFECYCLE); mStartTimeMillis = 0; } @@ -1898,8 +1905,7 @@ public class IpClient extends StateMachine { mDhcpClient.sendMessage(DhcpClient.EVENT_LINKADDRESS_CONFIGURED); } else { logError("Failed to set IPv4 address."); - dispatchCallback(PROV_CHANGE_LOST_PROVISIONING, - new LinkProperties(mLinkProperties)); + dispatchCallback(PROV_CHANGE_LOST_PROVISIONING, mLinkProperties); transitionTo(mStoppingState); } break; diff --git a/src/com/android/server/connectivity/NetworkMonitor.java b/src/com/android/server/connectivity/NetworkMonitor.java index 484f67e..e914a55 100644 --- a/src/com/android/server/connectivity/NetworkMonitor.java +++ b/src/com/android/server/connectivity/NetworkMonitor.java @@ -617,7 +617,7 @@ public class NetworkMonitor extends StateMachine { private void notifyNetworkTested( int result, @Nullable String redirectUrl, PersistableBundle extras) { try { - if (mCallbackVersion <= 5) { + if (mCallbackVersion <= 4) { mCallback.notifyNetworkTested(result, redirectUrl); } else { mCallback.notifyNetworkTestedWithExtras( diff --git a/tests/integration/src/android/net/ip/IpClientIntegrationTest.java b/tests/integration/src/android/net/ip/IpClientIntegrationTest.java index 4bbee9a..a6543bc 100644 --- a/tests/integration/src/android/net/ip/IpClientIntegrationTest.java +++ b/tests/integration/src/android/net/ip/IpClientIntegrationTest.java @@ -52,6 +52,7 @@ import static junit.framework.Assert.fail; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -920,6 +921,24 @@ public class IpClientIntegrationTest { } @Test + public void testInterfaceParams() throws Exception { + InterfaceParams params = InterfaceParams.getByName(mIfaceName); + assertNotNull(params); + assertEquals(mIfaceName, params.name); + assertTrue(params.index > 0); + assertNotNull(params.macAddr); + assertTrue(params.hasMacAddress); + + // Sanity check. + params = InterfaceParams.getByName("lo"); + assertNotNull(params); + assertEquals("lo", params.name); + assertTrue(params.index > 0); + assertNotNull(params.macAddr); + assertFalse(params.hasMacAddress); + } + + @Test public void testDhcpInit() throws Exception { startIpClientProvisioning(false /* isDhcpLeaseCacheEnabled */, false /* shouldReplyRapidCommitAck */, false /* isPreconnectionEnabled */, diff --git a/tests/lib/src/com/android/testutils/NetworkStatsUtils.kt b/tests/lib/src/com/android/testutils/NetworkStatsUtils.kt index c82011c..51e9e4d 100644 --- a/tests/lib/src/com/android/testutils/NetworkStatsUtils.kt +++ b/tests/lib/src/com/android/testutils/NetworkStatsUtils.kt @@ -17,14 +17,19 @@ package com.android.testutils import android.net.NetworkStats +import kotlin.test.assertTrue +@JvmOverloads fun orderInsensitiveEquals( leftStats: NetworkStats, - rightStats: NetworkStats + rightStats: NetworkStats, + compareTime: Boolean = false ): Boolean { if (leftStats == rightStats) return true - if (leftStats.getElapsedRealtime() != rightStats.getElapsedRealtime() || - leftStats.size() != rightStats.size()) return false + if (compareTime && leftStats.getElapsedRealtime() != rightStats.getElapsedRealtime()) { + return false + } + if (leftStats.size() != rightStats.size()) return false val left = NetworkStats.Entry() val right = NetworkStats.Entry() // Order insensitive compare. @@ -32,8 +37,26 @@ fun orderInsensitiveEquals( leftStats.getValues(i, left) val j: Int = rightStats.findIndexHinted(left.iface, left.uid, left.set, left.tag, left.metered, left.roaming, left.defaultNetwork, i) + if (j == -1) return false rightStats.getValues(j, right) if (left != right) return false } return true } + +/** + * Assert that two {@link NetworkStats} are equals, assuming the order of the records are not + * necessarily the same. + * + * @note {@code elapsedRealtime} is not compared by default, given that in test cases that is not + * usually used. + */ +@JvmOverloads +fun assertNetworkStatsEquals( + expected: NetworkStats, + actual: NetworkStats, + compareTime: Boolean = false +) { + assertTrue(orderInsensitiveEquals(expected, actual, compareTime), + "expected: " + expected + "but was: " + actual) +} diff --git a/tests/unit/src/android/net/apf/ApfTest.java b/tests/unit/src/android/net/apf/ApfTest.java index f018fde..d85d059 100644 --- a/tests/unit/src/android/net/apf/ApfTest.java +++ b/tests/unit/src/android/net/apf/ApfTest.java @@ -67,6 +67,7 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.internal.util.HexDump; +import com.android.networkstack.apishim.NetworkInformationShimImpl; import com.android.server.networkstack.tests.R; import com.android.server.util.NetworkStackConstants; @@ -936,7 +937,8 @@ public class ApfTest { private byte[] mLastApfProgram; MockIpClientCallback() { - super(mock(IIpClientCallbacks.class), mock(SharedLog.class)); + super(mock(IIpClientCallbacks.class), mock(SharedLog.class), + NetworkInformationShimImpl.newInstance()); } @Override diff --git a/tests/unit/src/android/net/util/InterfaceParamsTest.java b/tests/unit/src/android/net/util/InterfaceParamsTest.java index 5a2b9c6..1be4368 100644 --- a/tests/unit/src/android/net/util/InterfaceParamsTest.java +++ b/tests/unit/src/android/net/util/InterfaceParamsTest.java @@ -17,6 +17,7 @@ package android.net.util; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -49,6 +50,7 @@ public class InterfaceParamsTest { assertEquals("lo", ifParams.name); assertTrue(ifParams.index > 0); assertNotNull(ifParams.macAddr); + assertFalse(ifParams.hasMacAddress); assertTrue(ifParams.defaultMtu >= NetworkStackConstants.ETHER_MTU); } } diff --git a/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java b/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java index 89c4218..f61bb7e 100644 --- a/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java +++ b/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java @@ -1432,7 +1432,7 @@ public class NetworkMonitorTest { public void testNotifyNetwork_NotifyNetworkTestedOldInterfaceVersion() throws Exception { // Use old interface version so notifyNetworkTested is used over // notifyNetworkTestedWithExtras - resetCallbacks(5); + resetCallbacks(4); // Trigger Network validation setStatus(mHttpsConnection, 204); |