diff options
7 files changed, 52 insertions, 30 deletions
diff --git a/common/moduleutils/src/android/net/shared/Layer2Information.java b/common/moduleutils/src/android/net/shared/Layer2Information.java index 77956a7..6825a93 100644 --- a/common/moduleutils/src/android/net/shared/Layer2Information.java +++ b/common/moduleutils/src/android/net/shared/Layer2Information.java @@ -23,9 +23,9 @@ import java.util.Objects; /** @hide */ public class Layer2Information { - private final String mL2Key; - private final String mGroupHint; - private final MacAddress mBssid; + public final String mL2Key; + public final String mGroupHint; + public final MacAddress mBssid; /** * Create a Layer2Information with the specified configuration. @@ -60,7 +60,7 @@ public class Layer2Information { * Create an instance of {@link Layer2Information} based on the contents of the specified * {@link Layer2InformationParcelable}. */ - public Layer2Information fromStableParcelable(Layer2InformationParcelable p) { + public static Layer2Information fromStableParcelable(Layer2InformationParcelable p) { if (p == null) return null; return new Layer2Information(p.l2Key, p.groupHint, p.bssid); } diff --git a/common/moduleutils/src/android/net/shared/ProvisioningConfiguration.java b/common/moduleutils/src/android/net/shared/ProvisioningConfiguration.java index c349fa7..9849eff 100644 --- a/common/moduleutils/src/android/net/shared/ProvisioningConfiguration.java +++ b/common/moduleutils/src/android/net/shared/ProvisioningConfiguration.java @@ -219,6 +219,14 @@ public class ProvisioningConfiguration { } /** + * Specify the L2 information(bssid, l2key and groupHint) that the IpClient should use. + */ + public Builder withLayer2Information(Layer2Information layer2Info) { + mConfig.mLayer2Info = layer2Info; + return this; + } + + /** * Build the configuration using previously specified parameters. */ public ProvisioningConfiguration build() { @@ -421,6 +429,7 @@ public class ProvisioningConfiguration { public Network mNetwork = null; public String mDisplayName = null; public ScanResultInfo mScanResultInfo; + public Layer2Information mLayer2Info; public ProvisioningConfiguration() {} // used by Builder @@ -441,6 +450,7 @@ public class ProvisioningConfiguration { mNetwork = other.mNetwork; mDisplayName = other.mDisplayName; mScanResultInfo = other.mScanResultInfo; + mLayer2Info = other.mLayer2Info; } /** @@ -464,6 +474,7 @@ public class ProvisioningConfiguration { p.network = mNetwork; p.displayName = mDisplayName; p.scanResultInfo = mScanResultInfo == null ? null : mScanResultInfo.toStableParcelable(); + p.layer2Info = mLayer2Info == null ? null : mLayer2Info.toStableParcelable(); return p; } @@ -490,6 +501,7 @@ public class ProvisioningConfiguration { config.mNetwork = p.network; config.mDisplayName = p.displayName; config.mScanResultInfo = ScanResultInfo.fromStableParcelable(p.scanResultInfo); + config.mLayer2Info = Layer2Information.fromStableParcelable(p.layer2Info); return config; } @@ -510,6 +522,7 @@ public class ProvisioningConfiguration { .add("mNetwork: " + mNetwork) .add("mDisplayName: " + mDisplayName) .add("mScanResultInfo: " + mScanResultInfo) + .add("mLayer2Info: " + mLayer2Info) .toString(); } @@ -530,7 +543,8 @@ public class ProvisioningConfiguration { && mIPv6AddrGenMode == other.mIPv6AddrGenMode && Objects.equals(mNetwork, other.mNetwork) && Objects.equals(mDisplayName, other.mDisplayName) - && Objects.equals(mScanResultInfo, other.mScanResultInfo); + && Objects.equals(mScanResultInfo, other.mScanResultInfo) + && Objects.equals(mLayer2Info, other.mLayer2Info); } public boolean isValid() { diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ProvisioningConfigurationParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ProvisioningConfigurationParcelable.aidl index ca8bf6e..b789e5f 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ProvisioningConfigurationParcelable.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ProvisioningConfigurationParcelable.aidl @@ -31,4 +31,5 @@ parcelable ProvisioningConfigurationParcelable { String displayName; boolean enablePreconnection; android.net.ScanResultInfoParcelable scanResultInfo; + android.net.Layer2InformationParcelable layer2Info; } diff --git a/common/networkstackclient/src/android/net/ProvisioningConfigurationParcelable.aidl b/common/networkstackclient/src/android/net/ProvisioningConfigurationParcelable.aidl index 9fcb036..9bf4197 100644 --- a/common/networkstackclient/src/android/net/ProvisioningConfigurationParcelable.aidl +++ b/common/networkstackclient/src/android/net/ProvisioningConfigurationParcelable.aidl @@ -18,6 +18,7 @@ package android.net; import android.net.InitialConfigurationParcelable; +import android.net.Layer2InformationParcelable; import android.net.Network; import android.net.ScanResultInfoParcelable; import android.net.StaticIpConfiguration; @@ -38,4 +39,5 @@ parcelable ProvisioningConfigurationParcelable { String displayName; boolean enablePreconnection; ScanResultInfoParcelable scanResultInfo; + Layer2InformationParcelable layer2Info; } diff --git a/src/android/net/ip/IpClient.java b/src/android/net/ip/IpClient.java index 3fb5001..79ceee7 100644 --- a/src/android/net/ip/IpClient.java +++ b/src/android/net/ip/IpClient.java @@ -794,6 +794,11 @@ public class IpClient extends StateMachine { + " in provisioning configuration", e); } } + + if (req.mLayer2Info != null) { + mL2Key = req.mLayer2Info.mL2Key; + mGroupHint = req.mLayer2Info.mGroupHint; + } sendMessage(CMD_START, new android.net.shared.ProvisioningConfiguration(req)); } @@ -904,7 +909,7 @@ public class IpClient extends StateMachine { } /** - * Update the network bssid, L2Key and GroupHint layer2 information. + * Update the network bssid, L2Key and GroupHint on L2 roaming happened. */ public void updateLayer2Information(@NonNull Layer2InformationParcelable info) { sendMessage(CMD_UPDATE_L2INFORMATION, info); @@ -1534,10 +1539,10 @@ public class IpClient extends StateMachine { mL2Key = info.l2Key; mGroupHint = info.groupHint; - // This means IpClient is still in the StoppedState, WiFi is trying to associate - // to the AP, just update L2Key and GroupHint at this stage, because these members - // will be used when starting DhcpClient. - if (info.bssid == null || mCurrentBssid == null) return; + if (info.bssid == null || mCurrentBssid == null) { + Log.wtf(mTag, "bssid in the parcelable or current tracked bssid should be non-null"); + return; + } // If the BSSID has not changed, there is nothing to do. if (info.bssid.equals(mCurrentBssid)) return; @@ -1613,10 +1618,6 @@ public class IpClient extends StateMachine { break; } - case CMD_UPDATE_L2INFORMATION: - handleUpdateL2Information((Layer2InformationParcelable) msg.obj); - break; - case CMD_SET_MULTICAST_FILTER: mMulticastFiltering = (boolean) msg.obj; break; diff --git a/tests/integration/src/android/net/ip/IpClientIntegrationTest.java b/tests/integration/src/android/net/ip/IpClientIntegrationTest.java index ac59000..334ac00 100644 --- a/tests/integration/src/android/net/ip/IpClientIntegrationTest.java +++ b/tests/integration/src/android/net/ip/IpClientIntegrationTest.java @@ -105,6 +105,7 @@ import android.net.ipmemorystore.NetworkAttributes; import android.net.ipmemorystore.OnNetworkAttributesRetrievedListener; import android.net.ipmemorystore.Status; import android.net.netlink.StructNdOptPref64; +import android.net.shared.Layer2Information; import android.net.shared.ProvisioningConfiguration; import android.net.shared.ProvisioningConfiguration.ScanResultInfo; import android.net.util.InterfaceParams; @@ -530,27 +531,20 @@ public class IpClientIntegrationTest { final boolean isHostnameConfigurationEnabled, final String hostname, final String displayName, final ScanResultInfo scanResultInfo) throws RemoteException { - ProvisioningConfiguration.Builder builder = new ProvisioningConfiguration.Builder() + ProvisioningConfiguration.Builder prov = new ProvisioningConfiguration.Builder() .withoutIpReachabilityMonitor() + .withLayer2Information(new Layer2Information(TEST_L2KEY, TEST_GROUPHINT, + MacAddress.fromString(TEST_DEFAULT_BSSID))) .withoutIPv6(); - if (isPreconnectionEnabled) builder.withPreconnection(); - if (displayName != null) builder.withDisplayName(displayName); - if (scanResultInfo != null) builder.withScanResultInfo(scanResultInfo); + if (isPreconnectionEnabled) prov.withPreconnection(); + if (displayName != null) prov.withDisplayName(displayName); + if (scanResultInfo != null) prov.withScanResultInfo(scanResultInfo); mDependencies.setDhcpLeaseCacheEnabled(isDhcpLeaseCacheEnabled); mDependencies.setDhcpRapidCommitEnabled(shouldReplyRapidCommitAck); mDependencies.setDhcpIpConflictDetectEnabled(isDhcpIpConflictDetectEnabled); mDependencies.setHostnameConfiguration(isHostnameConfigurationEnabled, hostname); - - if (ShimUtils.isReleaseOrDevelopmentApiAbove(Build.VERSION_CODES.Q)) { - final Layer2InformationParcelable info = new Layer2InformationParcelable(); - info.l2Key = TEST_L2KEY; - info.groupHint = TEST_GROUPHINT; - mIpc.updateLayer2Information(info); - } else { - mIpc.setL2KeyAndGroupHint(TEST_L2KEY, TEST_GROUPHINT); - } - mIpc.startProvisioning(builder.build()); + mIpc.startProvisioning(prov.build()); if (!isPreconnectionEnabled) { verify(mCb, timeout(TEST_TIMEOUT_MS)).setFallbackMulticastFilter(false); } diff --git a/tests/unit/src/android/net/shared/ProvisioningConfigurationTest.java b/tests/unit/src/android/net/shared/ProvisioningConfigurationTest.java index 8a8ff8f..8fc44a4 100644 --- a/tests/unit/src/android/net/shared/ProvisioningConfigurationTest.java +++ b/tests/unit/src/android/net/shared/ProvisioningConfigurationTest.java @@ -25,6 +25,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import android.net.LinkAddress; +import android.net.MacAddress; import android.net.Network; import android.net.StaticIpConfiguration; import android.net.apf.ApfCapabilities; @@ -83,8 +84,10 @@ public class ProvisioningConfigurationTest { mConfig.mDisplayName = "test_config"; mConfig.mEnablePreconnection = false; mConfig.mScanResultInfo = makeScanResultInfo("ssid"); + mConfig.mLayer2Info = new Layer2Information("some l2key", "some groupHint", + MacAddress.fromString("00:01:02:03:04:05")); // Any added field must be included in equals() to be tested properly - assertFieldCountEquals(14, ProvisioningConfiguration.class); + assertFieldCountEquals(15, ProvisioningConfiguration.class); } @Test @@ -160,7 +163,14 @@ public class ProvisioningConfigurationTest { assertNotEqualsAfterChange(c -> c.mEnablePreconnection = true); assertNotEqualsAfterChange(c -> c.mScanResultInfo = null); assertNotEqualsAfterChange(c -> c.mScanResultInfo = makeScanResultInfo("another ssid")); - assertFieldCountEquals(14, ProvisioningConfiguration.class); + assertNotEqualsAfterChange(c -> c.mLayer2Info = new Layer2Information("another l2key", + "some groupHint", MacAddress.fromString("00:01:02:03:04:05"))); + assertNotEqualsAfterChange(c -> c.mLayer2Info = new Layer2Information("some l2key", + "another groupHint", MacAddress.fromString("00:01:02:03:04:05"))); + assertNotEqualsAfterChange(c -> c.mLayer2Info = new Layer2Information("some l2key", + "some groupHint", MacAddress.fromString("01:02:03:04:05:06"))); + assertNotEqualsAfterChange(c -> c.mLayer2Info = null); + assertFieldCountEquals(15, ProvisioningConfiguration.class); } private void assertNotEqualsAfterChange(Consumer<ProvisioningConfiguration> mutator) { |