Add MatchNonThreadLocalNetworks flag in NetworkCapabilities

This is for backwards compatibility. Apps targeting V or lower
SDK should not see Tethering network agent.

This restriction is still disabled to maintain no-op in this
change. Will be enabled when introducing ConnectivityService
part in the subsequent change.

Test: atest CtsNetTestCases:android.net.NetworkCapabilitiesTest \
      ConnectivityCoverageTests:android.net.connectivity.com.android.server \
      --update-device
Bug: 349487600
Change-Id: I99405ab62e82ff4b7fcebffd3a1a31ec6d8962a9
This commit is contained in:
Junyu Lai 2025-03-18 19:59:26 +08:00
commit f3ae766e8e

View file

@ -56,6 +56,7 @@ import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET;
import static android.net.NetworkCapabilities.TRANSPORT_SATELLITE;
import static android.net.NetworkCapabilities.TRANSPORT_TEST;
import static android.net.NetworkCapabilities.TRANSPORT_THREAD;
import static android.net.NetworkCapabilities.TRANSPORT_USB;
import static android.net.NetworkCapabilities.TRANSPORT_VPN;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
@ -1532,4 +1533,93 @@ public class NetworkCapabilitiesTest {
nc.setReservationId(43);
assertNotEquals(nc, other);
}
@Test
public void testMatchNonThreadLocalNetworks_equals() {
final NetworkCapabilities nc = new NetworkCapabilities();
nc.setMatchNonThreadLocalNetworks(true);
final NetworkCapabilities other = new NetworkCapabilities(nc);
assertEquals(nc, other);
nc.setMatchNonThreadLocalNetworks(false);
assertNotEquals(nc, other);
}
@Test
public void testMatchNonThreadLocalNetworks_enabled() {
doTestMatchNonThreadLocalNetworks(true);
}
@Test
public void testMatchNonThreadLocalNetworks_disabled() {
doTestMatchNonThreadLocalNetworks(false);
}
private void doTestMatchNonThreadLocalNetworks(boolean enabled) {
// Setup request NCs.
final NetworkCapabilities noTransportRequestNc = new NetworkCapabilities();
final NetworkCapabilities threadRequestNc =
new NetworkCapabilities.Builder().addTransportType(TRANSPORT_THREAD).build();
final NetworkCapabilities wifiRequestNc =
new NetworkCapabilities.Builder().addTransportType(TRANSPORT_WIFI).build();
final NetworkCapabilities multiTransportRequestNc =
new NetworkCapabilities.Builder().addTransportType(
TRANSPORT_THREAD).addTransportType(TRANSPORT_WIFI).build();
// Setup network NCs.
final NetworkCapabilities localNoTransportNc = new NetworkCapabilities.Builder()
.addCapability(NET_CAPABILITY_LOCAL_NETWORK).build();
final NetworkCapabilities localThreadsNc = new NetworkCapabilities.Builder()
.addCapability(NET_CAPABILITY_LOCAL_NETWORK)
.addTransportType(TRANSPORT_THREAD).build();
final NetworkCapabilities localWifiNc = new NetworkCapabilities.Builder()
.addCapability(NET_CAPABILITY_LOCAL_NETWORK)
.addTransportType(TRANSPORT_WIFI).build();
final NetworkCapabilities wanWifiNc = new NetworkCapabilities.Builder()
.addTransportType(TRANSPORT_WIFI).build();
// Mark flags accordingly.
noTransportRequestNc.setMatchNonThreadLocalNetworks(enabled);
threadRequestNc.setMatchNonThreadLocalNetworks(enabled);
wifiRequestNc.setMatchNonThreadLocalNetworks(enabled);
multiTransportRequestNc.setMatchNonThreadLocalNetworks(enabled);
if (enabled) {
// A request with no specific transport matches all networks.
assertTrue(noTransportRequestNc.satisfiedByNetworkCapabilities(localNoTransportNc));
assertTrue(noTransportRequestNc.satisfiedByNetworkCapabilities(localWifiNc));
} else {
// A request with no specific transport only matches thread networks.
assertFalse(noTransportRequestNc.satisfiedByNetworkCapabilities(localNoTransportNc));
assertFalse(noTransportRequestNc.satisfiedByNetworkCapabilities(localWifiNc));
}
assertTrue(noTransportRequestNc.satisfiedByNetworkCapabilities(localThreadsNc));
assertTrue(noTransportRequestNc.satisfiedByNetworkCapabilities(wanWifiNc));
// A request with TRANSPORT_THREAD only matches thread networks.
assertFalse(threadRequestNc.satisfiedByNetworkCapabilities(localNoTransportNc));
assertTrue(threadRequestNc.satisfiedByNetworkCapabilities(localThreadsNc));
assertFalse(threadRequestNc.satisfiedByNetworkCapabilities(localWifiNc));
assertFalse(threadRequestNc.satisfiedByNetworkCapabilities(wanWifiNc));
assertFalse(multiTransportRequestNc.satisfiedByNetworkCapabilities(localNoTransportNc));
assertTrue(multiTransportRequestNc.satisfiedByNetworkCapabilities(localThreadsNc));
assertTrue(multiTransportRequestNc.satisfiedByNetworkCapabilities(wanWifiNc));
if (enabled) {
assertTrue(multiTransportRequestNc.satisfiedByNetworkCapabilities(localWifiNc));
} else {
// A request with multiple transports only matches thread networks.
assertFalse(multiTransportRequestNc.satisfiedByNetworkCapabilities(localWifiNc));
}
assertFalse(wifiRequestNc.satisfiedByNetworkCapabilities(localNoTransportNc));
assertFalse(wifiRequestNc.satisfiedByNetworkCapabilities(localThreadsNc));
assertTrue(wifiRequestNc.satisfiedByNetworkCapabilities(wanWifiNc));
if (enabled) {
assertTrue(wifiRequestNc.satisfiedByNetworkCapabilities(localWifiNc));
} else {
// A request without TRANSPORT_THREAD matches nothing.
assertFalse(wifiRequestNc.satisfiedByNetworkCapabilities(localWifiNc));
}
}
}