[NS10] Fix a bug where registerIgnoringScore is broken

Fixes: 184028345
Test: ConnectivityServiceTest
Merged-In: I3c2563d4ae4e3715d0c6270344ba8f7ef067872f
Merged-In: Ib5cd2c27a2bd0f53b500e8edbe48126fbf58f34d
Change-Id: Ib5cd2c27a2bd0f53b500e8edbe48126fbf58f34d
  (cherry-picked from ag/14034625)
This commit is contained in:
Chalard Jean
2021-03-30 21:42:10 +09:00
committed by Junyu Lai
parent e4aeac6d75
commit 94ca04b255
3 changed files with 31 additions and 8 deletions

View File

@@ -86,9 +86,14 @@ public class FullScore {
/** @hide */ /** @hide */
public static final int POLICY_IS_UNMETERED = 59; public static final int POLICY_IS_UNMETERED = 59;
// This network is invincible. This is useful for offers until there is an API to listen
// to requests.
/** @hide */
public static final int POLICY_IS_INVINCIBLE = 58;
// To help iterate when printing // To help iterate when printing
@VisibleForTesting @VisibleForTesting
static final int MIN_CS_MANAGED_POLICY = POLICY_IS_UNMETERED; static final int MIN_CS_MANAGED_POLICY = POLICY_IS_INVINCIBLE;
@VisibleForTesting @VisibleForTesting
static final int MAX_CS_MANAGED_POLICY = POLICY_IS_VALIDATED; static final int MAX_CS_MANAGED_POLICY = POLICY_IS_VALIDATED;
@@ -109,6 +114,7 @@ public class FullScore {
case POLICY_YIELD_TO_BAD_WIFI: return "YIELD_TO_BAD_WIFI"; case POLICY_YIELD_TO_BAD_WIFI: return "YIELD_TO_BAD_WIFI";
case POLICY_TRANSPORT_PRIMARY: return "TRANSPORT_PRIMARY"; case POLICY_TRANSPORT_PRIMARY: return "TRANSPORT_PRIMARY";
case POLICY_EXITING: return "EXITING"; case POLICY_EXITING: return "EXITING";
case POLICY_IS_INVINCIBLE: return "INVINCIBLE";
} }
throw new IllegalArgumentException("Unknown policy : " + policy); throw new IllegalArgumentException("Unknown policy : " + policy);
} }
@@ -147,7 +153,8 @@ public class FullScore {
caps.hasCapability(NET_CAPABILITY_NOT_METERED), caps.hasCapability(NET_CAPABILITY_NOT_METERED),
config.explicitlySelected, config.explicitlySelected,
config.acceptUnvalidated, config.acceptUnvalidated,
yieldToBadWiFi); yieldToBadWiFi,
false /* invincible */); // only prospective scores can be invincible
} }
/** /**
@@ -178,8 +185,12 @@ public class FullScore {
final boolean acceptUnvalidated = false; final boolean acceptUnvalidated = false;
// Don't assume clinging to bad wifi // Don't assume clinging to bad wifi
final boolean yieldToBadWiFi = false; final boolean yieldToBadWiFi = false;
// A prospective score is invincible if the legacy int in the filter is over the maximum
// score.
final boolean invincible = score.getLegacyInt() > NetworkRanker.LEGACY_INT_MAX;
return withPolicies(score.getLegacyInt(), score.getPolicies(), KEEP_CONNECTED_NONE, return withPolicies(score.getLegacyInt(), score.getPolicies(), KEEP_CONNECTED_NONE,
mayValidate, vpn, unmetered, everUserSelected, acceptUnvalidated, yieldToBadWiFi); mayValidate, vpn, unmetered, everUserSelected, acceptUnvalidated, yieldToBadWiFi,
invincible);
} }
/** /**
@@ -200,7 +211,8 @@ public class FullScore {
caps.hasCapability(NET_CAPABILITY_NOT_METERED), caps.hasCapability(NET_CAPABILITY_NOT_METERED),
config.explicitlySelected, config.explicitlySelected,
config.acceptUnvalidated, config.acceptUnvalidated,
yieldToBadWifi); yieldToBadWifi,
false /* invincible */); // only prospective scores can be invincible
} }
// TODO : this shouldn't manage bad wifi avoidance instead this should be done by the // TODO : this shouldn't manage bad wifi avoidance instead this should be done by the
@@ -214,14 +226,16 @@ public class FullScore {
final boolean isUnmetered, final boolean isUnmetered,
final boolean everUserSelected, final boolean everUserSelected,
final boolean acceptUnvalidated, final boolean acceptUnvalidated,
final boolean yieldToBadWiFi) { final boolean yieldToBadWiFi,
final boolean invincible) {
return new FullScore(legacyInt, (externalPolicies & EXTERNAL_POLICIES_MASK) return new FullScore(legacyInt, (externalPolicies & EXTERNAL_POLICIES_MASK)
| (isValidated ? 1L << POLICY_IS_VALIDATED : 0) | (isValidated ? 1L << POLICY_IS_VALIDATED : 0)
| (isVpn ? 1L << POLICY_IS_VPN : 0) | (isVpn ? 1L << POLICY_IS_VPN : 0)
| (isUnmetered ? 1L << POLICY_IS_UNMETERED : 0) | (isUnmetered ? 1L << POLICY_IS_UNMETERED : 0)
| (everUserSelected ? 1L << POLICY_EVER_USER_SELECTED : 0) | (everUserSelected ? 1L << POLICY_EVER_USER_SELECTED : 0)
| (acceptUnvalidated ? 1L << POLICY_ACCEPT_UNVALIDATED : 0) | (acceptUnvalidated ? 1L << POLICY_ACCEPT_UNVALIDATED : 0)
| (yieldToBadWiFi ? 1L << POLICY_YIELD_TO_BAD_WIFI : 0), | (yieldToBadWiFi ? 1L << POLICY_YIELD_TO_BAD_WIFI : 0)
| (invincible ? 1L << POLICY_IS_INVINCIBLE : 0),
keepConnectedReason); keepConnectedReason);
} }

View File

@@ -26,6 +26,7 @@ import static android.net.NetworkScore.POLICY_YIELD_TO_BAD_WIFI;
import static com.android.server.connectivity.FullScore.POLICY_ACCEPT_UNVALIDATED; import static com.android.server.connectivity.FullScore.POLICY_ACCEPT_UNVALIDATED;
import static com.android.server.connectivity.FullScore.POLICY_EVER_USER_SELECTED; import static com.android.server.connectivity.FullScore.POLICY_EVER_USER_SELECTED;
import static com.android.server.connectivity.FullScore.POLICY_IS_INVINCIBLE;
import static com.android.server.connectivity.FullScore.POLICY_IS_VALIDATED; import static com.android.server.connectivity.FullScore.POLICY_IS_VALIDATED;
import static com.android.server.connectivity.FullScore.POLICY_IS_VPN; import static com.android.server.connectivity.FullScore.POLICY_IS_VPN;
@@ -46,6 +47,10 @@ import java.util.function.Predicate;
* A class that knows how to find the best network matching a request out of a list of networks. * A class that knows how to find the best network matching a request out of a list of networks.
*/ */
public class NetworkRanker { public class NetworkRanker {
// Historically the legacy ints have been 0~100 in principle (though the highest score in
// AOSP has always been 90). This is relied on by VPNs that send a legacy score of 101.
public static final int LEGACY_INT_MAX = 100;
/** /**
* A class that can be scored against other scoreables. * A class that can be scored against other scoreables.
*/ */
@@ -72,7 +77,6 @@ public class NetworkRanker {
return matches; return matches;
} }
/** /**
* Find the best network satisfying this request among the list of passed networks. * Find the best network satisfying this request among the list of passed networks.
*/ */
@@ -134,6 +138,12 @@ public class NetworkRanker {
// 4. if none remain, the criterion did not help discriminate so keep them all. As an // 4. if none remain, the criterion did not help discriminate so keep them all. As an
// optimization, skip creating a new array and go on to the next criterion. // optimization, skip creating a new array and go on to the next criterion.
// If a network is invincible, use it.
partitionInto(candidates, nai -> nai.getScore().hasPolicy(POLICY_IS_INVINCIBLE),
accepted, rejected);
if (accepted.size() == 1) return accepted.get(0);
if (accepted.size() > 0 && rejected.size() > 0) candidates = new ArrayList<>(accepted);
// If there is a connected VPN, use it. // If there is a connected VPN, use it.
partitionInto(candidates, nai -> nai.getScore().hasPolicy(POLICY_IS_VPN), partitionInto(candidates, nai -> nai.getScore().hasPolicy(POLICY_IS_VPN),
accepted, rejected); accepted, rejected);

View File

@@ -3205,7 +3205,6 @@ public class ConnectivityServiceTest {
// Skipping VALIDATED and CAPTIVE_PORTAL as they're disallowed. // Skipping VALIDATED and CAPTIVE_PORTAL as they're disallowed.
} }
@Ignore("Refactoring in progress b/184028345")
@Test @Test
public void testRegisterIgnoringScore() throws Exception { public void testRegisterIgnoringScore() throws Exception {
mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);