Loading packages/NetworkStack/src/com/android/server/connectivity/ipmemorystore/IpMemoryStoreDatabase.java +43 −12 Original line number Diff line number Diff line Loading @@ -72,6 +72,10 @@ public class IpMemoryStoreDatabase { public static final String COLNAME_ASSIGNEDV4ADDRESS = "assignedV4Address"; public static final String COLTYPE_ASSIGNEDV4ADDRESS = "INTEGER"; public static final String COLNAME_ASSIGNEDV4ADDRESSEXPIRY = "assignedV4AddressExpiry"; // The lease expiry timestamp in uint of milliseconds public static final String COLTYPE_ASSIGNEDV4ADDRESSEXPIRY = "BIGINT"; // Please note that the group hint is only a *hint*, hence its name. The client can offer // this information to nudge the grouping in the decision it thinks is right, but it can't // decide for the memory store what is the same L3 network. Loading @@ -90,6 +94,7 @@ public class IpMemoryStoreDatabase { + COLNAME_L2KEY + " " + COLTYPE_L2KEY + " PRIMARY KEY NOT NULL, " + COLNAME_EXPIRYDATE + " " + COLTYPE_EXPIRYDATE + ", " + COLNAME_ASSIGNEDV4ADDRESS + " " + COLTYPE_ASSIGNEDV4ADDRESS + ", " + COLNAME_ASSIGNEDV4ADDRESSEXPIRY + " " + COLTYPE_ASSIGNEDV4ADDRESSEXPIRY + ", " + COLNAME_GROUPHINT + " " + COLTYPE_GROUPHINT + ", " + COLNAME_DNSADDRESSES + " " + COLTYPE_DNSADDRESSES + ", " + COLNAME_MTU + " " + COLTYPE_MTU + ")"; Loading Loading @@ -134,7 +139,7 @@ public class IpMemoryStoreDatabase { /** The SQLite DB helper */ public static class DbHelper extends SQLiteOpenHelper { // Update this whenever changing the schema. private static final int SCHEMA_VERSION = 2; private static final int SCHEMA_VERSION = 3; private static final String DATABASE_FILENAME = "IpMemoryStore.db"; public DbHelper(@NonNull final Context context) { Loading @@ -153,11 +158,28 @@ public class IpMemoryStoreDatabase { @Override public void onUpgrade(@NonNull final SQLiteDatabase db, final int oldVersion, final int newVersion) { // No upgrade supported yet. try { if (oldVersion < 2) { // upgrade from version 1 to version 2 // since we starts from version 2, do nothing here } if (oldVersion < 3) { // upgrade from version 2 to version 3 final String sqlUpgradeAddressExpiry = "alter table" + " " + NetworkAttributesContract.TABLENAME + " ADD" + " " + NetworkAttributesContract.COLNAME_ASSIGNEDV4ADDRESSEXPIRY + " " + NetworkAttributesContract.COLTYPE_ASSIGNEDV4ADDRESSEXPIRY; db.execSQL(sqlUpgradeAddressExpiry); } } catch (SQLiteException e) { Log.e(TAG, "Could not upgrade to the new version", e); // create database with new version db.execSQL(NetworkAttributesContract.DROP_TABLE); db.execSQL(PrivateDataContract.DROP_TABLE); onCreate(db); } } /** Called when the database is downgraded */ @Override Loading Loading @@ -204,6 +226,10 @@ public class IpMemoryStoreDatabase { values.put(NetworkAttributesContract.COLNAME_ASSIGNEDV4ADDRESS, inet4AddressToIntHTH(attributes.assignedV4Address)); } if (null != attributes.assignedV4AddressExpiry) { values.put(NetworkAttributesContract.COLNAME_ASSIGNEDV4ADDRESSEXPIRY, attributes.assignedV4AddressExpiry); } if (null != attributes.groupHint) { values.put(NetworkAttributesContract.COLNAME_GROUPHINT, attributes.groupHint); } Loading Loading @@ -251,6 +277,8 @@ public class IpMemoryStoreDatabase { final NetworkAttributes.Builder builder = new NetworkAttributes.Builder(); final int assignedV4AddressInt = getInt(cursor, NetworkAttributesContract.COLNAME_ASSIGNEDV4ADDRESS, 0); final long assignedV4AddressExpiry = getLong(cursor, NetworkAttributesContract.COLNAME_ASSIGNEDV4ADDRESSEXPIRY, 0); final String groupHint = getString(cursor, NetworkAttributesContract.COLNAME_GROUPHINT); final byte[] dnsAddressesBlob = getBlob(cursor, NetworkAttributesContract.COLNAME_DNSADDRESSES); Loading @@ -258,6 +286,9 @@ public class IpMemoryStoreDatabase { if (0 != assignedV4AddressInt) { builder.setAssignedV4Address(intToInet4AddressHTH(assignedV4AddressInt)); } if (0 != assignedV4AddressExpiry) { builder.setAssignedV4AddressExpiry(assignedV4AddressExpiry); } builder.setGroupHint(groupHint); if (null != dnsAddressesBlob) { builder.setDnsAddresses(decodeAddressList(dnsAddressesBlob)); Loading packages/NetworkStack/tests/src/com/android/server/connectivity/ipmemorystore/IpMemoryStoreServiceTest.java +4 −1 Original line number Diff line number Diff line Loading @@ -228,6 +228,7 @@ public class IpMemoryStoreServiceTest { public void testNetworkAttributes() throws UnknownHostException { final NetworkAttributes.Builder na = new NetworkAttributes.Builder(); na.setAssignedV4Address((Inet4Address) Inet4Address.getByName("1.2.3.4")); na.setAssignedV4AddressExpiry(System.currentTimeMillis() + 7_200_000); na.setGroupHint("hint1"); na.setMtu(219); final String l2Key = FAKE_KEYS[0]; Loading Loading @@ -257,6 +258,8 @@ public class IpMemoryStoreServiceTest { + status.resultCode, status.isSuccess()); assertEquals(l2Key, key); assertEquals(attributes.assignedV4Address, attr.assignedV4Address); assertEquals(attributes.assignedV4AddressExpiry, attr.assignedV4AddressExpiry); assertEquals(attributes.groupHint, attr.groupHint); assertEquals(attributes.mtu, attr.mtu); assertEquals(attributes2.dnsAddresses, attr.dnsAddresses); Loading @@ -278,7 +281,7 @@ public class IpMemoryStoreServiceTest { // Verify that this test does not miss any new field added later. // If any field is added to NetworkAttributes it must be tested here for storing // and retrieving. assertEquals(4, Arrays.stream(NetworkAttributes.class.getDeclaredFields()) assertEquals(5, Arrays.stream(NetworkAttributes.class.getDeclaredFields()) .filter(f -> !Modifier.isStatic(f.getModifiers())).count()); } Loading services/net/java/android/net/ipmemorystore/NetworkAttributes.java +49 −4 Original line number Diff line number Diff line Loading @@ -60,6 +60,13 @@ public class NetworkAttributes { public final Inet4Address assignedV4Address; private static final float WEIGHT_ASSIGNEDV4ADDR = 300.0f; // The lease expiry timestamp of v4 address allocated from DHCP server, in milliseconds. @Nullable public final Long assignedV4AddressExpiry; // lease expiry doesn't imply any correlation between "the same lease expiry value" and "the // same L3 network". private static final float WEIGHT_ASSIGNEDV4ADDREXPIRY = 0.0f; // Optionally supplied by the client if it has an opinion on L3 network. For example, this // could be a hash of the SSID + security type on WiFi. @Nullable Loading @@ -81,6 +88,7 @@ public class NetworkAttributes { /** @hide */ @VisibleForTesting public static final float TOTAL_WEIGHT = WEIGHT_ASSIGNEDV4ADDR + WEIGHT_ASSIGNEDV4ADDREXPIRY + WEIGHT_GROUPHINT + WEIGHT_DNSADDRESSES + WEIGHT_MTU; Loading @@ -89,11 +97,16 @@ public class NetworkAttributes { @VisibleForTesting public NetworkAttributes( @Nullable final Inet4Address assignedV4Address, @Nullable final Long assignedV4AddressExpiry, @Nullable final String groupHint, @Nullable final List<InetAddress> dnsAddresses, @Nullable final Integer mtu) { if (mtu != null && mtu < 0) throw new IllegalArgumentException("MTU can't be negative"); if (assignedV4AddressExpiry != null && assignedV4AddressExpiry <= 0) { throw new IllegalArgumentException("lease expiry can't be negative or zero"); } this.assignedV4Address = assignedV4Address; this.assignedV4AddressExpiry = assignedV4AddressExpiry; this.groupHint = groupHint; this.dnsAddresses = null == dnsAddresses ? null : Collections.unmodifiableList(new ArrayList<>(dnsAddresses)); Loading @@ -105,6 +118,8 @@ public class NetworkAttributes { // The call to the other constructor must be the first statement of this constructor, // so everything has to be inline this((Inet4Address) getByAddressOrNull(parcelable.assignedV4Address), parcelable.assignedV4AddressExpiry > 0 ? parcelable.assignedV4AddressExpiry : null, parcelable.groupHint, blobArrayToInetAddressList(parcelable.dnsAddresses), parcelable.mtu >= 0 ? parcelable.mtu : null); Loading Loading @@ -150,6 +165,8 @@ public class NetworkAttributes { final NetworkAttributesParcelable parcelable = new NetworkAttributesParcelable(); parcelable.assignedV4Address = (null == assignedV4Address) ? null : assignedV4Address.getAddress(); parcelable.assignedV4AddressExpiry = (null == assignedV4AddressExpiry) ? 0 : assignedV4AddressExpiry; parcelable.groupHint = groupHint; parcelable.dnsAddresses = inetAddressListToBlobArray(dnsAddresses); parcelable.mtu = (null == mtu) ? -1 : mtu; Loading @@ -168,6 +185,8 @@ public class NetworkAttributes { public float getNetworkGroupSamenessConfidence(@NonNull final NetworkAttributes o) { final float samenessScore = samenessContribution(WEIGHT_ASSIGNEDV4ADDR, assignedV4Address, o.assignedV4Address) + samenessContribution(WEIGHT_ASSIGNEDV4ADDREXPIRY, assignedV4AddressExpiry, o.assignedV4AddressExpiry) + samenessContribution(WEIGHT_GROUPHINT, groupHint, o.groupHint) + samenessContribution(WEIGHT_DNSADDRESSES, dnsAddresses, o.dnsAddresses) + samenessContribution(WEIGHT_MTU, mtu, o.mtu); Loading @@ -189,6 +208,8 @@ public class NetworkAttributes { @Nullable private Inet4Address mAssignedAddress; @Nullable private Long mAssignedAddressExpiry; @Nullable private String mGroupHint; @Nullable private List<InetAddress> mDnsAddresses; Loading @@ -205,6 +226,20 @@ public class NetworkAttributes { return this; } /** * Set the lease expiry timestamp of assigned v4 address. * @param assignedV4AddressExpiry The lease expiry timestamp of assigned v4 address. * @return This builder. */ public Builder setAssignedV4AddressExpiry( @Nullable final Long assignedV4AddressExpiry) { if (null != assignedV4AddressExpiry && assignedV4AddressExpiry <= 0) { throw new IllegalArgumentException("lease expiry can't be negative or zero"); } mAssignedAddressExpiry = assignedV4AddressExpiry; return this; } /** * Set the group hint. * @param groupHint The group hint. Loading Loading @@ -248,14 +283,15 @@ public class NetworkAttributes { * @return The built NetworkAttributes object. */ public NetworkAttributes build() { return new NetworkAttributes(mAssignedAddress, mGroupHint, mDnsAddresses, mMtu); return new NetworkAttributes(mAssignedAddress, mAssignedAddressExpiry, mGroupHint, mDnsAddresses, mMtu); } } /** @hide */ public boolean isEmpty() { return (null == assignedV4Address) && (null == groupHint) && (null == dnsAddresses) && (null == mtu); return (null == assignedV4Address) && (null == assignedV4AddressExpiry) && (null == groupHint) && (null == dnsAddresses) && (null == mtu); } @Override Loading @@ -263,6 +299,7 @@ public class NetworkAttributes { if (!(o instanceof NetworkAttributes)) return false; final NetworkAttributes other = (NetworkAttributes) o; return Objects.equals(assignedV4Address, other.assignedV4Address) && Objects.equals(assignedV4AddressExpiry, other.assignedV4AddressExpiry) && Objects.equals(groupHint, other.groupHint) && Objects.equals(dnsAddresses, other.dnsAddresses) && Objects.equals(mtu, other.mtu); Loading @@ -270,7 +307,8 @@ public class NetworkAttributes { @Override public int hashCode() { return Objects.hash(assignedV4Address, groupHint, dnsAddresses, mtu); return Objects.hash(assignedV4Address, assignedV4AddressExpiry, groupHint, dnsAddresses, mtu); } /** Pretty print */ Loading @@ -286,6 +324,13 @@ public class NetworkAttributes { nullFields.add("assignedV4Addr"); } if (null != assignedV4AddressExpiry) { resultJoiner.add("assignedV4AddressExpiry :"); resultJoiner.add(assignedV4AddressExpiry.toString()); } else { nullFields.add("assignedV4AddressExpiry"); } if (null != groupHint) { resultJoiner.add("groupHint :"); resultJoiner.add(groupHint); Loading services/net/java/android/net/ipmemorystore/NetworkAttributesParcelable.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.net.ipmemorystore.Blob; */ parcelable NetworkAttributesParcelable { byte[] assignedV4Address; long assignedV4AddressExpiry; String groupHint; Blob[] dnsAddresses; int mtu; Loading tests/net/java/android/net/ipmemorystore/ParcelableTests.java +4 −1 Original line number Diff line number Diff line Loading @@ -44,6 +44,8 @@ public class ParcelableTests { assertEquals(in, new NetworkAttributes(parcelingRoundTrip(in.toParcelable()))); builder.setAssignedV4Address((Inet4Address) Inet4Address.getByName("1.2.3.4")); // lease will expire in two hours builder.setAssignedV4AddressExpiry(System.currentTimeMillis() + 7_200_000); // groupHint stays null this time around builder.setDnsAddresses(Collections.emptyList()); builder.setMtu(18); Loading @@ -51,6 +53,7 @@ public class ParcelableTests { assertEquals(in, new NetworkAttributes(parcelingRoundTrip(in.toParcelable()))); builder.setAssignedV4Address((Inet4Address) Inet4Address.getByName("6.7.8.9")); builder.setAssignedV4AddressExpiry(System.currentTimeMillis() + 3_600_000); builder.setGroupHint("groupHint"); builder.setDnsAddresses(Arrays.asList( InetAddress.getByName("ACA1:652B:0911:DE8F:1200:115E:913B:AA2A"), Loading @@ -66,7 +69,7 @@ public class ParcelableTests { // Verify that this test does not miss any new field added later. // If any field is added to NetworkAttributes it must be tested here for parceling // roundtrip. assertEquals(4, Arrays.stream(NetworkAttributes.class.getDeclaredFields()) assertEquals(5, Arrays.stream(NetworkAttributes.class.getDeclaredFields()) .filter(f -> !Modifier.isStatic(f.getModifiers())).count()); } Loading Loading
packages/NetworkStack/src/com/android/server/connectivity/ipmemorystore/IpMemoryStoreDatabase.java +43 −12 Original line number Diff line number Diff line Loading @@ -72,6 +72,10 @@ public class IpMemoryStoreDatabase { public static final String COLNAME_ASSIGNEDV4ADDRESS = "assignedV4Address"; public static final String COLTYPE_ASSIGNEDV4ADDRESS = "INTEGER"; public static final String COLNAME_ASSIGNEDV4ADDRESSEXPIRY = "assignedV4AddressExpiry"; // The lease expiry timestamp in uint of milliseconds public static final String COLTYPE_ASSIGNEDV4ADDRESSEXPIRY = "BIGINT"; // Please note that the group hint is only a *hint*, hence its name. The client can offer // this information to nudge the grouping in the decision it thinks is right, but it can't // decide for the memory store what is the same L3 network. Loading @@ -90,6 +94,7 @@ public class IpMemoryStoreDatabase { + COLNAME_L2KEY + " " + COLTYPE_L2KEY + " PRIMARY KEY NOT NULL, " + COLNAME_EXPIRYDATE + " " + COLTYPE_EXPIRYDATE + ", " + COLNAME_ASSIGNEDV4ADDRESS + " " + COLTYPE_ASSIGNEDV4ADDRESS + ", " + COLNAME_ASSIGNEDV4ADDRESSEXPIRY + " " + COLTYPE_ASSIGNEDV4ADDRESSEXPIRY + ", " + COLNAME_GROUPHINT + " " + COLTYPE_GROUPHINT + ", " + COLNAME_DNSADDRESSES + " " + COLTYPE_DNSADDRESSES + ", " + COLNAME_MTU + " " + COLTYPE_MTU + ")"; Loading Loading @@ -134,7 +139,7 @@ public class IpMemoryStoreDatabase { /** The SQLite DB helper */ public static class DbHelper extends SQLiteOpenHelper { // Update this whenever changing the schema. private static final int SCHEMA_VERSION = 2; private static final int SCHEMA_VERSION = 3; private static final String DATABASE_FILENAME = "IpMemoryStore.db"; public DbHelper(@NonNull final Context context) { Loading @@ -153,11 +158,28 @@ public class IpMemoryStoreDatabase { @Override public void onUpgrade(@NonNull final SQLiteDatabase db, final int oldVersion, final int newVersion) { // No upgrade supported yet. try { if (oldVersion < 2) { // upgrade from version 1 to version 2 // since we starts from version 2, do nothing here } if (oldVersion < 3) { // upgrade from version 2 to version 3 final String sqlUpgradeAddressExpiry = "alter table" + " " + NetworkAttributesContract.TABLENAME + " ADD" + " " + NetworkAttributesContract.COLNAME_ASSIGNEDV4ADDRESSEXPIRY + " " + NetworkAttributesContract.COLTYPE_ASSIGNEDV4ADDRESSEXPIRY; db.execSQL(sqlUpgradeAddressExpiry); } } catch (SQLiteException e) { Log.e(TAG, "Could not upgrade to the new version", e); // create database with new version db.execSQL(NetworkAttributesContract.DROP_TABLE); db.execSQL(PrivateDataContract.DROP_TABLE); onCreate(db); } } /** Called when the database is downgraded */ @Override Loading Loading @@ -204,6 +226,10 @@ public class IpMemoryStoreDatabase { values.put(NetworkAttributesContract.COLNAME_ASSIGNEDV4ADDRESS, inet4AddressToIntHTH(attributes.assignedV4Address)); } if (null != attributes.assignedV4AddressExpiry) { values.put(NetworkAttributesContract.COLNAME_ASSIGNEDV4ADDRESSEXPIRY, attributes.assignedV4AddressExpiry); } if (null != attributes.groupHint) { values.put(NetworkAttributesContract.COLNAME_GROUPHINT, attributes.groupHint); } Loading Loading @@ -251,6 +277,8 @@ public class IpMemoryStoreDatabase { final NetworkAttributes.Builder builder = new NetworkAttributes.Builder(); final int assignedV4AddressInt = getInt(cursor, NetworkAttributesContract.COLNAME_ASSIGNEDV4ADDRESS, 0); final long assignedV4AddressExpiry = getLong(cursor, NetworkAttributesContract.COLNAME_ASSIGNEDV4ADDRESSEXPIRY, 0); final String groupHint = getString(cursor, NetworkAttributesContract.COLNAME_GROUPHINT); final byte[] dnsAddressesBlob = getBlob(cursor, NetworkAttributesContract.COLNAME_DNSADDRESSES); Loading @@ -258,6 +286,9 @@ public class IpMemoryStoreDatabase { if (0 != assignedV4AddressInt) { builder.setAssignedV4Address(intToInet4AddressHTH(assignedV4AddressInt)); } if (0 != assignedV4AddressExpiry) { builder.setAssignedV4AddressExpiry(assignedV4AddressExpiry); } builder.setGroupHint(groupHint); if (null != dnsAddressesBlob) { builder.setDnsAddresses(decodeAddressList(dnsAddressesBlob)); Loading
packages/NetworkStack/tests/src/com/android/server/connectivity/ipmemorystore/IpMemoryStoreServiceTest.java +4 −1 Original line number Diff line number Diff line Loading @@ -228,6 +228,7 @@ public class IpMemoryStoreServiceTest { public void testNetworkAttributes() throws UnknownHostException { final NetworkAttributes.Builder na = new NetworkAttributes.Builder(); na.setAssignedV4Address((Inet4Address) Inet4Address.getByName("1.2.3.4")); na.setAssignedV4AddressExpiry(System.currentTimeMillis() + 7_200_000); na.setGroupHint("hint1"); na.setMtu(219); final String l2Key = FAKE_KEYS[0]; Loading Loading @@ -257,6 +258,8 @@ public class IpMemoryStoreServiceTest { + status.resultCode, status.isSuccess()); assertEquals(l2Key, key); assertEquals(attributes.assignedV4Address, attr.assignedV4Address); assertEquals(attributes.assignedV4AddressExpiry, attr.assignedV4AddressExpiry); assertEquals(attributes.groupHint, attr.groupHint); assertEquals(attributes.mtu, attr.mtu); assertEquals(attributes2.dnsAddresses, attr.dnsAddresses); Loading @@ -278,7 +281,7 @@ public class IpMemoryStoreServiceTest { // Verify that this test does not miss any new field added later. // If any field is added to NetworkAttributes it must be tested here for storing // and retrieving. assertEquals(4, Arrays.stream(NetworkAttributes.class.getDeclaredFields()) assertEquals(5, Arrays.stream(NetworkAttributes.class.getDeclaredFields()) .filter(f -> !Modifier.isStatic(f.getModifiers())).count()); } Loading
services/net/java/android/net/ipmemorystore/NetworkAttributes.java +49 −4 Original line number Diff line number Diff line Loading @@ -60,6 +60,13 @@ public class NetworkAttributes { public final Inet4Address assignedV4Address; private static final float WEIGHT_ASSIGNEDV4ADDR = 300.0f; // The lease expiry timestamp of v4 address allocated from DHCP server, in milliseconds. @Nullable public final Long assignedV4AddressExpiry; // lease expiry doesn't imply any correlation between "the same lease expiry value" and "the // same L3 network". private static final float WEIGHT_ASSIGNEDV4ADDREXPIRY = 0.0f; // Optionally supplied by the client if it has an opinion on L3 network. For example, this // could be a hash of the SSID + security type on WiFi. @Nullable Loading @@ -81,6 +88,7 @@ public class NetworkAttributes { /** @hide */ @VisibleForTesting public static final float TOTAL_WEIGHT = WEIGHT_ASSIGNEDV4ADDR + WEIGHT_ASSIGNEDV4ADDREXPIRY + WEIGHT_GROUPHINT + WEIGHT_DNSADDRESSES + WEIGHT_MTU; Loading @@ -89,11 +97,16 @@ public class NetworkAttributes { @VisibleForTesting public NetworkAttributes( @Nullable final Inet4Address assignedV4Address, @Nullable final Long assignedV4AddressExpiry, @Nullable final String groupHint, @Nullable final List<InetAddress> dnsAddresses, @Nullable final Integer mtu) { if (mtu != null && mtu < 0) throw new IllegalArgumentException("MTU can't be negative"); if (assignedV4AddressExpiry != null && assignedV4AddressExpiry <= 0) { throw new IllegalArgumentException("lease expiry can't be negative or zero"); } this.assignedV4Address = assignedV4Address; this.assignedV4AddressExpiry = assignedV4AddressExpiry; this.groupHint = groupHint; this.dnsAddresses = null == dnsAddresses ? null : Collections.unmodifiableList(new ArrayList<>(dnsAddresses)); Loading @@ -105,6 +118,8 @@ public class NetworkAttributes { // The call to the other constructor must be the first statement of this constructor, // so everything has to be inline this((Inet4Address) getByAddressOrNull(parcelable.assignedV4Address), parcelable.assignedV4AddressExpiry > 0 ? parcelable.assignedV4AddressExpiry : null, parcelable.groupHint, blobArrayToInetAddressList(parcelable.dnsAddresses), parcelable.mtu >= 0 ? parcelable.mtu : null); Loading Loading @@ -150,6 +165,8 @@ public class NetworkAttributes { final NetworkAttributesParcelable parcelable = new NetworkAttributesParcelable(); parcelable.assignedV4Address = (null == assignedV4Address) ? null : assignedV4Address.getAddress(); parcelable.assignedV4AddressExpiry = (null == assignedV4AddressExpiry) ? 0 : assignedV4AddressExpiry; parcelable.groupHint = groupHint; parcelable.dnsAddresses = inetAddressListToBlobArray(dnsAddresses); parcelable.mtu = (null == mtu) ? -1 : mtu; Loading @@ -168,6 +185,8 @@ public class NetworkAttributes { public float getNetworkGroupSamenessConfidence(@NonNull final NetworkAttributes o) { final float samenessScore = samenessContribution(WEIGHT_ASSIGNEDV4ADDR, assignedV4Address, o.assignedV4Address) + samenessContribution(WEIGHT_ASSIGNEDV4ADDREXPIRY, assignedV4AddressExpiry, o.assignedV4AddressExpiry) + samenessContribution(WEIGHT_GROUPHINT, groupHint, o.groupHint) + samenessContribution(WEIGHT_DNSADDRESSES, dnsAddresses, o.dnsAddresses) + samenessContribution(WEIGHT_MTU, mtu, o.mtu); Loading @@ -189,6 +208,8 @@ public class NetworkAttributes { @Nullable private Inet4Address mAssignedAddress; @Nullable private Long mAssignedAddressExpiry; @Nullable private String mGroupHint; @Nullable private List<InetAddress> mDnsAddresses; Loading @@ -205,6 +226,20 @@ public class NetworkAttributes { return this; } /** * Set the lease expiry timestamp of assigned v4 address. * @param assignedV4AddressExpiry The lease expiry timestamp of assigned v4 address. * @return This builder. */ public Builder setAssignedV4AddressExpiry( @Nullable final Long assignedV4AddressExpiry) { if (null != assignedV4AddressExpiry && assignedV4AddressExpiry <= 0) { throw new IllegalArgumentException("lease expiry can't be negative or zero"); } mAssignedAddressExpiry = assignedV4AddressExpiry; return this; } /** * Set the group hint. * @param groupHint The group hint. Loading Loading @@ -248,14 +283,15 @@ public class NetworkAttributes { * @return The built NetworkAttributes object. */ public NetworkAttributes build() { return new NetworkAttributes(mAssignedAddress, mGroupHint, mDnsAddresses, mMtu); return new NetworkAttributes(mAssignedAddress, mAssignedAddressExpiry, mGroupHint, mDnsAddresses, mMtu); } } /** @hide */ public boolean isEmpty() { return (null == assignedV4Address) && (null == groupHint) && (null == dnsAddresses) && (null == mtu); return (null == assignedV4Address) && (null == assignedV4AddressExpiry) && (null == groupHint) && (null == dnsAddresses) && (null == mtu); } @Override Loading @@ -263,6 +299,7 @@ public class NetworkAttributes { if (!(o instanceof NetworkAttributes)) return false; final NetworkAttributes other = (NetworkAttributes) o; return Objects.equals(assignedV4Address, other.assignedV4Address) && Objects.equals(assignedV4AddressExpiry, other.assignedV4AddressExpiry) && Objects.equals(groupHint, other.groupHint) && Objects.equals(dnsAddresses, other.dnsAddresses) && Objects.equals(mtu, other.mtu); Loading @@ -270,7 +307,8 @@ public class NetworkAttributes { @Override public int hashCode() { return Objects.hash(assignedV4Address, groupHint, dnsAddresses, mtu); return Objects.hash(assignedV4Address, assignedV4AddressExpiry, groupHint, dnsAddresses, mtu); } /** Pretty print */ Loading @@ -286,6 +324,13 @@ public class NetworkAttributes { nullFields.add("assignedV4Addr"); } if (null != assignedV4AddressExpiry) { resultJoiner.add("assignedV4AddressExpiry :"); resultJoiner.add(assignedV4AddressExpiry.toString()); } else { nullFields.add("assignedV4AddressExpiry"); } if (null != groupHint) { resultJoiner.add("groupHint :"); resultJoiner.add(groupHint); Loading
services/net/java/android/net/ipmemorystore/NetworkAttributesParcelable.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.net.ipmemorystore.Blob; */ parcelable NetworkAttributesParcelable { byte[] assignedV4Address; long assignedV4AddressExpiry; String groupHint; Blob[] dnsAddresses; int mtu; Loading
tests/net/java/android/net/ipmemorystore/ParcelableTests.java +4 −1 Original line number Diff line number Diff line Loading @@ -44,6 +44,8 @@ public class ParcelableTests { assertEquals(in, new NetworkAttributes(parcelingRoundTrip(in.toParcelable()))); builder.setAssignedV4Address((Inet4Address) Inet4Address.getByName("1.2.3.4")); // lease will expire in two hours builder.setAssignedV4AddressExpiry(System.currentTimeMillis() + 7_200_000); // groupHint stays null this time around builder.setDnsAddresses(Collections.emptyList()); builder.setMtu(18); Loading @@ -51,6 +53,7 @@ public class ParcelableTests { assertEquals(in, new NetworkAttributes(parcelingRoundTrip(in.toParcelable()))); builder.setAssignedV4Address((Inet4Address) Inet4Address.getByName("6.7.8.9")); builder.setAssignedV4AddressExpiry(System.currentTimeMillis() + 3_600_000); builder.setGroupHint("groupHint"); builder.setDnsAddresses(Arrays.asList( InetAddress.getByName("ACA1:652B:0911:DE8F:1200:115E:913B:AA2A"), Loading @@ -66,7 +69,7 @@ public class ParcelableTests { // Verify that this test does not miss any new field added later. // If any field is added to NetworkAttributes it must be tested here for parceling // roundtrip. assertEquals(4, Arrays.stream(NetworkAttributes.class.getDeclaredFields()) assertEquals(5, Arrays.stream(NetworkAttributes.class.getDeclaredFields()) .filter(f -> !Modifier.isStatic(f.getModifiers())).count()); } Loading