[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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user