diff options
author | Valentin Iftime <valiiftime@google.com> | 2019-09-24 13:32:13 +0200 |
---|---|---|
committer | Valentin Iftime <valiiftime@google.com> | 2019-10-08 13:03:30 +0200 |
commit | c86ebbaebcee107370c3b1e269862a52357af287 (patch) | |
tree | a0f7670c2146e4bd4af83b05c3ccb9a3c37ce16c | |
parent | 36ad0924b97ffd771bb81fc859ec268819055d23 (diff) | |
download | base-c86ebbaebcee107370c3b1e269862a52357af287.tar.gz |
API to detect which network interfaces support wake-on-lan
Add a new method in LinkProperties, isWakeOnLanEnabled() which returns
true if network interface is defined in config_wakeonlan_enabled_interfaces
string-array (config.xml)
Bug: 132705025
Test: atest LinkPropertiesTest & atest ConnectivityServiceTest
Change-Id: I3f7803aafd2f8eaf8aa18419b21339e15d4b7a0b
-rw-r--r-- | api/current.txt | 2 | ||||
-rw-r--r-- | core/java/android/net/LinkProperties.java | 47 | ||||
-rw-r--r-- | core/java/android/util/ArraySet.java | 13 | ||||
-rw-r--r-- | core/res/res/values/config.xml | 8 | ||||
-rw-r--r-- | core/res/res/values/symbols.xml | 1 | ||||
-rw-r--r-- | services/core/java/com/android/server/ConnectivityService.java | 13 | ||||
-rw-r--r-- | tests/net/common/java/android/net/LinkPropertiesTest.java | 14 | ||||
-rw-r--r-- | tests/net/java/com/android/server/ConnectivityServiceTest.java | 25 |
8 files changed, 121 insertions, 2 deletions
diff --git a/api/current.txt b/api/current.txt index 436ebdc35b6c..35e2acaf278b 100644 --- a/api/current.txt +++ b/api/current.txt @@ -28695,6 +28695,7 @@ package android.net { method @Nullable public String getPrivateDnsServerName(); method @NonNull public java.util.List<android.net.RouteInfo> getRoutes(); method public boolean isPrivateDnsActive(); + method public boolean isWakeOnLanSupported(); method public void setDnsServers(@NonNull java.util.Collection<java.net.InetAddress>); method public void setDomains(@Nullable String); method public void setHttpProxy(@Nullable android.net.ProxyInfo); @@ -47777,6 +47778,7 @@ package android.util { ctor public ArraySet(int); ctor public ArraySet(android.util.ArraySet<E>); ctor public ArraySet(java.util.Collection<? extends E>); + ctor public ArraySet(@Nullable E[]); method public boolean add(E); method public void addAll(android.util.ArraySet<? extends E>); method public boolean addAll(java.util.Collection<? extends E>); diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java index d3f48acdd40e..3ec0aeac472b 100644 --- a/core/java/android/net/LinkProperties.java +++ b/core/java/android/net/LinkProperties.java @@ -68,6 +68,7 @@ public final class LinkProperties implements Parcelable { // in the format "rmem_min,rmem_def,rmem_max,wmem_min,wmem_def,wmem_max" private String mTcpBufferSizes; private IpPrefix mNat64Prefix; + private boolean mWakeOnLanSupported; private static final int MIN_MTU = 68; private static final int MIN_MTU_V6 = 1280; @@ -193,6 +194,7 @@ public final class LinkProperties implements Parcelable { setMtu(source.mMtu); mTcpBufferSizes = source.mTcpBufferSizes; mNat64Prefix = source.mNat64Prefix; + mWakeOnLanSupported = source.mWakeOnLanSupported; } } @@ -852,6 +854,7 @@ public final class LinkProperties implements Parcelable { mMtu = 0; mTcpBufferSizes = null; mNat64Prefix = null; + mWakeOnLanSupported = false; } /** @@ -913,6 +916,10 @@ public final class LinkProperties implements Parcelable { resultJoiner.add("MTU:"); resultJoiner.add(Integer.toString(mMtu)); + if (mWakeOnLanSupported) { + resultJoiner.add("WakeOnLanSupported: true"); + } + if (mTcpBufferSizes != null) { resultJoiner.add("TcpBufferSizes:"); resultJoiner.add(mTcpBufferSizes); @@ -1425,6 +1432,37 @@ public final class LinkProperties implements Parcelable { } /** + * Compares this {@code LinkProperties} WakeOnLan supported against the target. + * + * @param target LinkProperties to compare. + * @return {@code true} if both are identical, {@code false} otherwise. + * @hide + */ + public boolean isIdenticalWakeOnLan(LinkProperties target) { + return isWakeOnLanSupported() == target.isWakeOnLanSupported(); + } + + /** + * Set whether the network interface supports WakeOnLAN + * + * @param supported WakeOnLAN supported value + * + * @hide + */ + public void setWakeOnLanSupported(boolean supported) { + mWakeOnLanSupported = supported; + } + + /** + * Returns whether the network interface supports WakeOnLAN + * + * @return {@code true} if interface supports WakeOnLAN, {@code false} otherwise. + */ + public boolean isWakeOnLanSupported() { + return mWakeOnLanSupported; + } + + /** * Compares this {@code LinkProperties} instance against the target * LinkProperties in {@code obj}. Two LinkPropertieses are equal if * all their fields are equal in values. @@ -1461,7 +1499,8 @@ public final class LinkProperties implements Parcelable { && isIdenticalStackedLinks(target) && isIdenticalMtu(target) && isIdenticalTcpBufferSizes(target) - && isIdenticalNat64Prefix(target); + && isIdenticalNat64Prefix(target) + && isIdenticalWakeOnLan(target); } /** @@ -1577,7 +1616,8 @@ public final class LinkProperties implements Parcelable { + (mUsePrivateDns ? 57 : 0) + mPcscfs.size() * 67 + ((null == mPrivateDnsServerName) ? 0 : mPrivateDnsServerName.hashCode()) - + Objects.hash(mNat64Prefix); + + Objects.hash(mNat64Prefix) + + (mWakeOnLanSupported ? 71 : 0); } /** @@ -1622,6 +1662,8 @@ public final class LinkProperties implements Parcelable { ArrayList<LinkProperties> stackedLinks = new ArrayList<>(mStackedLinks.values()); dest.writeList(stackedLinks); + + dest.writeBoolean(mWakeOnLanSupported); } /** @@ -1677,6 +1719,7 @@ public final class LinkProperties implements Parcelable { for (LinkProperties stackedLink: stackedLinks) { netProp.addStackedLink(stackedLink); } + netProp.setWakeOnLanSupported(in.readBoolean()); return netProp; } diff --git a/core/java/android/util/ArraySet.java b/core/java/android/util/ArraySet.java index 3fa914f9ad02..d6a35e1b96fc 100644 --- a/core/java/android/util/ArraySet.java +++ b/core/java/android/util/ArraySet.java @@ -16,6 +16,7 @@ package android.util; +import android.annotation.Nullable; import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; @@ -303,6 +304,18 @@ public final class ArraySet<E> implements Collection<E>, Set<E> { } /** + * Create a new ArraySet with items from the given array + */ + public ArraySet(@Nullable E[] array) { + this(); + if (array != null) { + for (E value : array) { + add(value); + } + } + } + + /** * Make the array map empty. All storage is released. */ @Override diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 06503bd31ac8..8336f54dbad4 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -433,6 +433,14 @@ --> </string-array> + <!-- Configuration of network interfaces that support WakeOnLAN --> + <string-array translatable="false" name="config_wakeonlan_supported_interfaces"> + <!-- + <item>wlan0</item> + <item>eth0</item> + --> + </string-array> + <!-- If the mobile hotspot feature requires provisioning, a package name and class name can be provided to launch a supported application that provisions the devices. diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 61077afc121c..0bd5e4377c05 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -743,6 +743,7 @@ <java-symbol type="string" name="config_default_dns_server" /> <java-symbol type="string" name="config_ethernet_iface_regex" /> <java-symbol type="array" name="config_ethernet_interfaces" /> + <java-symbol type="array" name="config_wakeonlan_supported_interfaces" /> <java-symbol type="string" name="config_forceVoiceInteractionServicePackage" /> <java-symbol type="string" name="config_mms_user_agent" /> <java-symbol type="string" name="config_mms_user_agent_profile_url" /> diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 9acafaec185e..b13df58650a6 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -579,6 +579,8 @@ public class ConnectivityService extends IConnectivityManager.Stub // the set of network types that can only be enabled by system/sig apps private List mProtectedNetworks; + private Set<String> mWolSupportedInterfaces; + private TelephonyManager mTelephonyManager; private KeepaliveTracker mKeepaliveTracker; @@ -1055,6 +1057,10 @@ public class ConnectivityService extends IConnectivityManager.Stub } } + mWolSupportedInterfaces = new ArraySet( + mContext.getResources().getStringArray( + com.android.internal.R.array.config_wakeonlan_supported_interfaces)); + mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); mTethering = deps.makeTethering(mContext, mNMS, mStatsService, mPolicyManager, @@ -5599,6 +5605,9 @@ public class ConnectivityService extends IConnectivityManager.Stub } else { updateProxy(newLp, oldLp); } + + updateWakeOnLan(newLp); + // TODO - move this check to cover the whole function if (!Objects.equals(newLp, oldLp)) { synchronized (networkAgent) { @@ -5769,6 +5778,10 @@ public class ConnectivityService extends IConnectivityManager.Stub } } + private void updateWakeOnLan(@NonNull LinkProperties lp) { + lp.setWakeOnLanSupported(mWolSupportedInterfaces.contains(lp.getInterfaceName())); + } + private int getNetworkPermission(NetworkCapabilities nc) { if (!nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)) { return INetd.PERMISSION_SYSTEM; diff --git a/tests/net/common/java/android/net/LinkPropertiesTest.java b/tests/net/common/java/android/net/LinkPropertiesTest.java index b0464d9e656f..ae8285b8a908 100644 --- a/tests/net/common/java/android/net/LinkPropertiesTest.java +++ b/tests/net/common/java/android/net/LinkPropertiesTest.java @@ -99,6 +99,7 @@ public class LinkPropertiesTest { assertFalse(lp.isIpv4Provisioned()); assertFalse(lp.isIpv6Provisioned()); assertFalse(lp.isPrivateDnsActive()); + assertFalse(lp.isWakeOnLanSupported()); } private LinkProperties makeTestObject() { @@ -120,6 +121,7 @@ public class LinkPropertiesTest { lp.setMtu(MTU); lp.setTcpBufferSizes(TCP_BUFFER_SIZES); lp.setNat64Prefix(new IpPrefix("2001:db8:0:64::/96")); + lp.setWakeOnLanSupported(true); return lp; } @@ -158,6 +160,9 @@ public class LinkPropertiesTest { assertTrue(source.isIdenticalTcpBufferSizes(target)); assertTrue(target.isIdenticalTcpBufferSizes(source)); + assertTrue(source.isIdenticalWakeOnLan(target)); + assertTrue(target.isIdenticalWakeOnLan(source)); + // Check result of equals(). assertTrue(source.equals(target)); assertTrue(target.equals(source)); @@ -1057,4 +1062,13 @@ public class LinkPropertiesTest { lp.clear(); assertFalse(lp.isPrivateDnsActive()); } + + @Test + public void testWakeOnLanSupported() { + final LinkProperties lp = makeTestObject(); + assertTrue(lp.isWakeOnLanSupported()); + + lp.clear(); + assertFalse(lp.isWakeOnLanSupported()); + } } diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 41440abadcd0..bffbbfda08ee 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -274,6 +274,7 @@ public class ConnectivityServiceTest { private static final String CLAT_PREFIX = "v4-"; private static final String MOBILE_IFNAME = "test_rmnet_data0"; private static final String WIFI_IFNAME = "test_wlan0"; + private static final String WIFI_WOL_IFNAME = "test_wlan_wol"; private static final String[] EMPTY_STRING_ARRAY = new String[0]; private MockContext mServiceContext; @@ -343,6 +344,12 @@ public class ConnectivityServiceTest { "mobile_mms,2,0,2,60000,true", }); + when(mResources.getStringArray( + com.android.internal.R.array.config_wakeonlan_supported_interfaces)) + .thenReturn(new String[]{ + WIFI_WOL_IFNAME, + }); + mContentResolver = new MockContentResolver(); mContentResolver.addProvider(Settings.AUTHORITY, settingsProvider); } @@ -5947,6 +5954,24 @@ public class ConnectivityServiceTest { assertContainsExactly(uidCaptor.getValue(), APP2_UID); } + @Test + public void testLinkPropertiesWithWakeOnLanForActiveNetwork() throws Exception { + mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); + + LinkProperties wifiLp = new LinkProperties(); + wifiLp.setInterfaceName(WIFI_WOL_IFNAME); + wifiLp.setWakeOnLanSupported(false); + + // Default network switch should update ifaces. + mWiFiNetworkAgent.connect(false); + mWiFiNetworkAgent.sendLinkProperties(wifiLp); + waitForIdle(); + + // ConnectivityService should have changed the WakeOnLanSupported to true + wifiLp.setWakeOnLanSupported(true); + assertEquals(wifiLp, mService.getActiveLinkProperties()); + } + private TestNetworkAgentWrapper establishVpn(LinkProperties lp, int establishingUid, Set<UidRange> vpnRange) throws Exception { |