Merge "Do not detect portals when DNS returns private IPs"
diff --git a/Android.bp b/Android.bp
index 38ed917..6dd4ca2 100644
--- a/Android.bp
+++ b/Android.bp
@@ -85,7 +85,7 @@
libs: ["unsupportedappusage"],
static_libs: [
"androidx.annotation_annotation",
- "netd_aidl_interface-unstable-java",
+ "netd_aidl_interface-V3-java",
"netlink-client",
"networkstack-client",
"datastallprotosnano",
diff --git a/common/moduleutils/src/android/net/shared/ProvisioningConfiguration.java b/common/moduleutils/src/android/net/shared/ProvisioningConfiguration.java
index 17b3ded..c349fa7 100644
--- a/common/moduleutils/src/android/net/shared/ProvisioningConfiguration.java
+++ b/common/moduleutils/src/android/net/shared/ProvisioningConfiguration.java
@@ -231,7 +231,11 @@
* InformationElements fields of ScanResult.
*/
public static class ScanResultInfo {
+ @NonNull
private final String mSsid;
+ @NonNull
+ private final String mBssid;
+ @NonNull
private final List<InformationElement> mInformationElements;
/**
@@ -240,6 +244,7 @@
*/
public static class InformationElement {
private final int mId;
+ @NonNull
private final byte[] mPayload;
public InformationElement(int id, @NonNull ByteBuffer payload) {
@@ -257,6 +262,7 @@
/**
* Get the specific content of the information element.
*/
+ @NonNull
public ByteBuffer getPayload() {
return ByteBuffer.wrap(mPayload).asReadOnlyBuffer();
}
@@ -293,6 +299,7 @@
* Create an instance of {@link InformationElement} based on the contents of the
* specified {@link InformationElementParcelable}.
*/
+ @Nullable
public static InformationElement fromStableParcelable(InformationElementParcelable p) {
if (p == null) return null;
return new InformationElement(p.id,
@@ -300,8 +307,12 @@
}
}
- public ScanResultInfo(String ssid, @NonNull List<InformationElement> informationElements) {
+ public ScanResultInfo(@NonNull String ssid, @NonNull String bssid,
+ @NonNull List<InformationElement> informationElements) {
+ Objects.requireNonNull(ssid, "ssid must not be null.");
+ Objects.requireNonNull(bssid, "bssid must not be null.");
mSsid = ssid;
+ mBssid = bssid;
mInformationElements =
Collections.unmodifiableList(new ArrayList<>(informationElements));
}
@@ -309,13 +320,23 @@
/**
* Get the scanned network name.
*/
+ @NonNull
public String getSsid() {
return mSsid;
}
/**
+ * Get the address of the access point.
+ */
+ @NonNull
+ public String getBssid() {
+ return mBssid;
+ }
+
+ /**
* Get all information elements found in the beacon.
*/
+ @NonNull
public List<InformationElement> getInformationElements() {
return mInformationElements;
}
@@ -324,6 +345,7 @@
public String toString() {
StringBuffer str = new StringBuffer();
str.append("SSID: ").append(mSsid);
+ str.append(", BSSID: ").append(mBssid);
str.append(", Information Elements: {");
for (InformationElement ie : mInformationElements) {
str.append("[").append(ie.toString()).append("]");
@@ -338,12 +360,13 @@
if (!(o instanceof ScanResultInfo)) return false;
ScanResultInfo other = (ScanResultInfo) o;
return Objects.equals(mSsid, other.mSsid)
+ && Objects.equals(mBssid, other.mBssid)
&& mInformationElements.equals(other.mInformationElements);
}
@Override
public int hashCode() {
- return Objects.hash(mSsid, mInformationElements);
+ return Objects.hash(mSsid, mBssid, mInformationElements);
}
/**
@@ -352,6 +375,7 @@
public ScanResultInfoParcelable toStableParcelable() {
final ScanResultInfoParcelable p = new ScanResultInfoParcelable();
p.ssid = mSsid;
+ p.bssid = mBssid;
p.informationElements = toParcelableArray(mInformationElements,
InformationElement::toStableParcelable, InformationElementParcelable.class);
return p;
@@ -366,11 +390,10 @@
final List<InformationElement> ies = new ArrayList<InformationElement>();
ies.addAll(fromParcelableArray(p.informationElements,
InformationElement::fromStableParcelable));
- return new ScanResultInfo(p.ssid, ies);
+ return new ScanResultInfo(p.ssid, p.bssid, ies);
}
- private static byte[] convertToByteArray(final ByteBuffer buffer) {
- if (buffer == null) return null;
+ private static byte[] convertToByteArray(@NonNull final ByteBuffer buffer) {
final byte[] bytes = new byte[buffer.limit()];
final ByteBuffer copy = buffer.asReadOnlyBuffer();
try {
diff --git a/common/networkstackclient/Android.bp b/common/networkstackclient/Android.bp
index 7b72e72..d8bd406 100644
--- a/common/networkstackclient/Android.bp
+++ b/common/networkstackclient/Android.bp
@@ -48,7 +48,7 @@
local_include_dir: "src",
include_dirs: [
"frameworks/base/core/java", // For framework parcelables.
- "frameworks/native/aidl/binder/android/os", // For PersistableBundle.aidl
+ "frameworks/native/aidl/binder", // For PersistableBundle.aidl
"frameworks/base/wifi/aidl-export", // For wifi parcelables.
],
srcs: [
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ScanResultInfoParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ScanResultInfoParcelable.aidl
index 24a0ca2..f7ac167 100644
--- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ScanResultInfoParcelable.aidl
+++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ScanResultInfoParcelable.aidl
@@ -18,5 +18,6 @@
package android.net;
parcelable ScanResultInfoParcelable {
String ssid;
+ String bssid;
android.net.InformationElementParcelable[] informationElements;
}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/DhcpServingParamsParcel.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/DhcpServingParamsParcel.aidl
index eb780a2..657b83c 100644
--- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/DhcpServingParamsParcel.aidl
+++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/DhcpServingParamsParcel.aidl
@@ -26,4 +26,5 @@
int linkMtu;
boolean metered;
int clientAddr;
+ boolean changePrefixOnDecline;
}
diff --git a/common/networkstackclient/src/android/net/INetworkMonitorCallbacks.aidl b/common/networkstackclient/src/android/net/INetworkMonitorCallbacks.aidl
index f57a8f7..8009a43 100644
--- a/common/networkstackclient/src/android/net/INetworkMonitorCallbacks.aidl
+++ b/common/networkstackclient/src/android/net/INetworkMonitorCallbacks.aidl
@@ -19,6 +19,7 @@
import android.net.CaptivePortalData;
import android.net.INetworkMonitor;
import android.net.PrivateDnsConfigParcel;
+import android.os.PersistableBundle;
/** @hide */
oneway interface INetworkMonitorCallbacks {
diff --git a/common/networkstackclient/src/android/net/ScanResultInfoParcelable.aidl b/common/networkstackclient/src/android/net/ScanResultInfoParcelable.aidl
index f5f101d..a19729b 100644
--- a/common/networkstackclient/src/android/net/ScanResultInfoParcelable.aidl
+++ b/common/networkstackclient/src/android/net/ScanResultInfoParcelable.aidl
@@ -20,5 +20,6 @@
parcelable ScanResultInfoParcelable {
String ssid;
+ String bssid;
InformationElementParcelable[] informationElements;
}
diff --git a/common/networkstackclient/src/android/net/dhcp/DhcpServingParamsParcel.aidl b/common/networkstackclient/src/android/net/dhcp/DhcpServingParamsParcel.aidl
index 5e19374..1ba0195 100644
--- a/common/networkstackclient/src/android/net/dhcp/DhcpServingParamsParcel.aidl
+++ b/common/networkstackclient/src/android/net/dhcp/DhcpServingParamsParcel.aidl
@@ -27,5 +27,5 @@
int linkMtu;
boolean metered;
int clientAddr;
+ boolean changePrefixOnDecline;
}
-
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7b5b7e4..8f6652c 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -42,5 +42,5 @@
<string name="tap_for_info">Connected / Tap to view website</string>
<!-- The label of application. It's also a sender name of notification. [CHAR LIMIT=50]-->
- <string name="application_label">Connectivity Manager</string>
+ <string name="application_label">Network manager</string>
</resources>
diff --git a/src/android/net/dhcp/DhcpServingParams.java b/src/android/net/dhcp/DhcpServingParams.java
index 63f847d..c52cae9 100644
--- a/src/android/net/dhcp/DhcpServingParams.java
+++ b/src/android/net/dhcp/DhcpServingParams.java
@@ -91,6 +91,13 @@
public final Inet4Address clientAddr;
/**
+ * Indicates whether the DHCP server should request a new prefix from IpServer when receiving
+ * DHCPDECLINE message in certain particular link (e.g. there is only one downstream USB
+ * tethering client). If it's false, process DHCPDECLINE message as RFC2131#4.3.3 suggests.
+ */
+ public final boolean changePrefixOnDecline;
+
+ /**
* Checked exception thrown when some parameters used to build {@link DhcpServingParams} are
* missing or invalid.
*/
@@ -103,7 +110,8 @@
private DhcpServingParams(@NonNull LinkAddress serverAddr,
@NonNull Set<Inet4Address> defaultRouters,
@NonNull Set<Inet4Address> dnsServers, @NonNull Set<Inet4Address> excludedAddrs,
- long dhcpLeaseTimeSecs, int linkMtu, boolean metered, Inet4Address clientAddr) {
+ long dhcpLeaseTimeSecs, int linkMtu, boolean metered, Inet4Address clientAddr,
+ boolean changePrefixOnDecline) {
this.serverAddr = serverAddr;
this.defaultRouters = defaultRouters;
this.dnsServers = dnsServers;
@@ -112,6 +120,7 @@
this.linkMtu = linkMtu;
this.metered = metered;
this.clientAddr = clientAddr;
+ this.changePrefixOnDecline = changePrefixOnDecline;
}
/**
@@ -140,6 +149,7 @@
.setLinkMtu(parcel.linkMtu)
.setMetered(parcel.metered)
.setClientAddr(clientAddr)
+ .setChangePrefixOnDecline(parcel.changePrefixOnDecline)
.build();
}
@@ -195,6 +205,7 @@
private int mLinkMtu = MTU_UNSET;
private boolean mMetered;
private Inet4Address mClientAddr;
+ private boolean mChangePrefixOnDecline;
/**
* Set the server address and served prefix for the DHCP server.
@@ -329,6 +340,17 @@
}
/**
+ * Set whether the DHCP server should request a new prefix from IpServer when receiving
+ * DHCPDECLINE message in certain particular link.
+ *
+ * <p>If not set, the default value is false.
+ */
+ public Builder setChangePrefixOnDecline(boolean changePrefixOnDecline) {
+ this.mChangePrefixOnDecline = changePrefixOnDecline;
+ return this;
+ }
+
+ /**
* Create a new {@link DhcpServingParams} instance based on parameters set in the builder.
*
* <p>This method has no side-effects. If it does not throw, a valid
@@ -382,7 +404,7 @@
Collections.unmodifiableSet(new HashSet<>(mDefaultRouters)),
Collections.unmodifiableSet(new HashSet<>(mDnsServers)),
Collections.unmodifiableSet(excl),
- mDhcpLeaseTimeSecs, mLinkMtu, mMetered, mClientAddr);
+ mDhcpLeaseTimeSecs, mLinkMtu, mMetered, mClientAddr, mChangePrefixOnDecline);
}
}
diff --git a/tests/integration/src/android/net/ip/IpClientIntegrationTest.java b/tests/integration/src/android/net/ip/IpClientIntegrationTest.java
index 9f0ef99..ce2efbb 100644
--- a/tests/integration/src/android/net/ip/IpClientIntegrationTest.java
+++ b/tests/integration/src/android/net/ip/IpClientIntegrationTest.java
@@ -234,6 +234,7 @@
(byte) 0x00, (byte) 0x17, (byte) 0xF2
};
private static final byte TEST_VENDOR_SPECIFIC_TYPE = 0x06;
+ private static final String TEST_DEFAULT_BSSID = "00:11:22:33:44:55";
private class Dependencies extends IpClient.Dependencies {
private boolean mIsDhcpLeaseCacheEnabled;
@@ -1578,7 +1579,7 @@
}
private ScanResultInfo makeScanResultInfo(final int id, final String ssid,
- final byte[] oui, final byte type, final byte[] data) {
+ final String bssid, final byte[] oui, final byte type, final byte[] data) {
final ByteBuffer payload = ByteBuffer.allocate(4 + data.length);
payload.put(oui);
payload.put(type);
@@ -1586,13 +1587,14 @@
payload.flip();
final ScanResultInfo.InformationElement ie =
new ScanResultInfo.InformationElement(id /* IE id */, payload);
- return new ScanResultInfo(ssid, Collections.singletonList(ie));
+ return new ScanResultInfo(ssid, bssid, Collections.singletonList(ie));
}
private void doUpstreamHotspotDetectionTest(final int id, final String displayName,
final String ssid, final byte[] oui, final byte type, final byte[] data)
throws Exception {
- final ScanResultInfo info = makeScanResultInfo(id, ssid, oui, type, data);
+ final ScanResultInfo info = makeScanResultInfo(id, ssid, TEST_DEFAULT_BSSID, oui, type,
+ data);
final long currentTime = System.currentTimeMillis();
final List<DhcpPacket> sentPackets = performDhcpHandshake(true /* isSuccessLease */,
TEST_LEASE_DURATION_S, true /* isDhcpLeaseCacheEnabled */,
diff --git a/tests/unit/src/android/net/dhcp/DhcpServingParamsTest.java b/tests/unit/src/android/net/dhcp/DhcpServingParamsTest.java
index 9948fe3..5962696 100644
--- a/tests/unit/src/android/net/dhcp/DhcpServingParamsTest.java
+++ b/tests/unit/src/android/net/dhcp/DhcpServingParamsTest.java
@@ -63,6 +63,7 @@
private static final Set<Inet4Address> TEST_EXCLUDED_ADDRS = new HashSet<>(
Arrays.asList(parseAddr("192.168.0.200"), parseAddr("192.168.0.201")));
private static final boolean TEST_METERED = true;
+ private static final boolean TEST_CHANGE_PREFIX_ON_DECLINE = true;
@Before
public void setUp() {
@@ -74,7 +75,8 @@
.setLinkMtu(TEST_MTU)
.setExcludedAddrs(TEST_EXCLUDED_ADDRS)
.setMetered(TEST_METERED)
- .setClientAddr(TEST_CLIENT_ADDR);
+ .setClientAddr(TEST_CLIENT_ADDR)
+ .setChangePrefixOnDecline(TEST_CHANGE_PREFIX_ON_DECLINE);
}
@Test
@@ -101,6 +103,7 @@
assertEquals(TEST_LINKADDR, params.serverAddr);
assertEquals(TEST_MTU, params.linkMtu);
assertEquals(TEST_METERED, params.metered);
+ assertEquals(TEST_CHANGE_PREFIX_ON_DECLINE, params.changePrefixOnDecline);
assertContains(params.excludedAddrs, TEST_EXCLUDED_ADDRS);
assertContains(params.excludedAddrs, TEST_DEFAULT_ROUTERS);
@@ -182,6 +185,7 @@
parcel.excludedAddrs = toIntArray(TEST_EXCLUDED_ADDRS);
parcel.metered = TEST_METERED;
parcel.clientAddr = inet4AddressToIntHTH(TEST_CLIENT_ADDR);
+ parcel.changePrefixOnDecline = TEST_CHANGE_PREFIX_ON_DECLINE;
final DhcpServingParams parceled = DhcpServingParams.fromParcelableObject(parcel);
assertEquals(params.defaultRouters, parceled.defaultRouters);
@@ -192,8 +196,9 @@
assertEquals(params.excludedAddrs, parceled.excludedAddrs);
assertEquals(params.metered, parceled.metered);
assertEquals(params.clientAddr, parceled.clientAddr);
+ assertEquals(params.changePrefixOnDecline, parceled.changePrefixOnDecline);
- MiscAssertsKt.assertFieldCountEquals(9, DhcpServingParamsParcel.class);
+ MiscAssertsKt.assertFieldCountEquals(10, DhcpServingParamsParcel.class);
}
@Test(expected = InvalidParameterException.class)
diff --git a/tests/unit/src/android/net/shared/ProvisioningConfigurationTest.java b/tests/unit/src/android/net/shared/ProvisioningConfigurationTest.java
index e9384c8..8a8ff8f 100644
--- a/tests/unit/src/android/net/shared/ProvisioningConfigurationTest.java
+++ b/tests/unit/src/android/net/shared/ProvisioningConfigurationTest.java
@@ -57,7 +57,8 @@
final ScanResultInfo.InformationElement ie =
new ScanResultInfo.InformationElement(0xdd /* vendor specific IE id */,
ByteBuffer.wrap(payload));
- return new ScanResultInfo(ssid, Collections.singletonList(ie));
+ return new ScanResultInfo(ssid, "01:02:03:04:05:06" /* bssid string */,
+ Collections.singletonList(ie));
}
@Before