summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorxshu <xshu@google.com>2020-06-19 18:21:52 -0700
committerxshu <xshu@google.com>2020-08-04 21:49:18 -0700
commitcc1e31863b17b6a02e3efb88a6493c475a60568a (patch)
tree55b345d3416eec7ce0e0d8e9334e9f7d0f767bdc /service
parentc83a6ec1e99253a78d843237c0757df16f9b4f7d (diff)
Separate framework initiated blocklists by reason
(cherry picked from 7930f4755e90ef2b150696a50bf644fae0978922) Multiple wifi features are now blocking BSSIDs. Separate the block reason for easier debugging. Bug: 159499995 Test: atest com.android.server.wifi Change-Id: I4c8a1d716bf373322b38285997443664ed27b51c Merged-In: I4c8a1d716bf373322b38285997443664ed27b51c
Diffstat (limited to 'service')
-rw-r--r--service/java/com/android/server/wifi/BssidBlocklistMonitor.java59
-rw-r--r--service/java/com/android/server/wifi/ClientModeImpl.java3
-rw-r--r--service/java/com/android/server/wifi/WifiConnectivityManager.java3
-rw-r--r--service/java/com/android/server/wifi/WifiScoreReport.java3
4 files changed, 46 insertions, 22 deletions
diff --git a/service/java/com/android/server/wifi/BssidBlocklistMonitor.java b/service/java/com/android/server/wifi/BssidBlocklistMonitor.java
index 5b151d55f..96b70c39e 100644
--- a/service/java/com/android/server/wifi/BssidBlocklistMonitor.java
+++ b/service/java/com/android/server/wifi/BssidBlocklistMonitor.java
@@ -64,8 +64,15 @@ public class BssidBlocklistMonitor {
public static final int REASON_DHCP_FAILURE = 7;
// Abnormal disconnect error
public static final int REASON_ABNORMAL_DISCONNECT = 8;
+ // AP initiated disconnect for a given duration.
+ public static final int REASON_FRAMEWORK_DISCONNECT_MBO_OCE = 9;
+ // Avoid connecting to the failed AP when trying to reconnect on other available candidates.
+ public static final int REASON_FRAMEWORK_DISCONNECT_FAST_RECONNECT = 10;
+ // The connected scorer has disconnected this network.
+ public static final int REASON_FRAMEWORK_DISCONNECT_CONNECTED_SCORE = 11;
// Constant being used to keep track of how many failure reasons there are.
- public static final int NUMBER_REASON_CODES = 9;
+ public static final int NUMBER_REASON_CODES = 12;
+ public static final int INVALID_REASON = -1;
@IntDef(prefix = { "REASON_" }, value = {
REASON_AP_UNABLE_TO_HANDLE_NEW_STA,
@@ -75,7 +82,11 @@ public class BssidBlocklistMonitor {
REASON_ASSOCIATION_REJECTION,
REASON_ASSOCIATION_TIMEOUT,
REASON_AUTHENTICATION_FAILURE,
- REASON_DHCP_FAILURE
+ REASON_DHCP_FAILURE,
+ REASON_ABNORMAL_DISCONNECT,
+ REASON_FRAMEWORK_DISCONNECT_MBO_OCE,
+ REASON_FRAMEWORK_DISCONNECT_FAST_RECONNECT,
+ REASON_FRAMEWORK_DISCONNECT_CONNECTED_SCORE
})
@Retention(RetentionPolicy.SOURCE)
public @interface FailureReason {}
@@ -92,10 +103,11 @@ public class BssidBlocklistMonitor {
"REASON_ASSOCIATION_TIMEOUT",
"REASON_AUTHENTICATION_FAILURE",
"REASON_DHCP_FAILURE",
- "REASON_ABNORMAL_DISCONNECT"
+ "REASON_ABNORMAL_DISCONNECT",
+ "REASON_FRAMEWORK_DISCONNECT_MBO_OCE",
+ "REASON_FRAMEWORK_DISCONNECT_FAST_RECONNECT",
+ "REASON_FRAMEWORK_DISCONNECT_CONNECTED_SCORE"
};
- private static final String FAILURE_BSSID_BLOCKED_BY_FRAMEWORK_REASON_STRING =
- "BlockedByFramework";
private static final long ABNORMAL_DISCONNECT_RESET_TIME_MS = TimeUnit.HOURS.toMillis(3);
private static final String TAG = "BssidBlocklistMonitor";
@@ -161,10 +173,11 @@ public class BssidBlocklistMonitor {
mBssidStatusHistoryLogger.dump(pw);
}
- private void addToBlocklist(@NonNull BssidStatus entry, long durationMs, String reasonString) {
- entry.addToBlocklist(durationMs, reasonString);
+ private void addToBlocklist(@NonNull BssidStatus entry, long durationMs,
+ @FailureReason int reason) {
+ entry.addToBlocklist(durationMs, reason);
localLog(TAG + " addToBlocklist: bssid=" + entry.bssid + ", ssid=" + entry.ssid
- + ", durationMs=" + durationMs + ", reason=" + reasonString);
+ + ", durationMs=" + durationMs + ", reason=" + getFailureReasonString(reason));
}
/**
@@ -218,13 +231,18 @@ public class BssidBlocklistMonitor {
/**
* Block any attempts to auto-connect to the BSSID for the specified duration.
+ * This is meant to be used by features that need wifi to avoid a BSSID for a certain duration,
+ * and thus will not increase the failure streak counters.
+ * @param bssid identifies the AP to block.
+ * @param ssid identifies the SSID the AP belongs to.
+ * @param durationMs duration in millis to block.
+ * @param blockReason reason for blocking the BSSID.
*/
public void blockBssidForDurationMs(@NonNull String bssid, @NonNull String ssid,
- long durationMs) {
- if (bssid == null || ssid == null || WifiManager.UNKNOWN_SSID.equals(ssid)
- || bssid.equals(ClientModeImpl.SUPPLICANT_BSSID_ANY) || durationMs <= 0) {
+ long durationMs, @FailureReason int blockReason) {
+ if (durationMs <= 0 || !isValidNetworkAndFailureReason(bssid, ssid, blockReason)) {
Log.e(TAG, "Invalid input: BSSID=" + bssid + ", SSID=" + ssid
- + ", durationMs=" + durationMs);
+ + ", durationMs=" + durationMs + ", blockReason=" + blockReason);
return;
}
BssidStatus status = getOrCreateBssidStatus(bssid, ssid);
@@ -233,11 +251,13 @@ public class BssidBlocklistMonitor {
// Return because this BSSID is already being blocked for a longer time.
return;
}
- addToBlocklist(status, durationMs, FAILURE_BSSID_BLOCKED_BY_FRAMEWORK_REASON_STRING);
+ addToBlocklist(status, durationMs, blockReason);
}
private String getFailureReasonString(@FailureReason int reasonCode) {
- if (reasonCode >= FAILURE_REASON_STRINGS.length) {
+ if (reasonCode == INVALID_REASON) {
+ return "INVALID_REASON";
+ } else if (reasonCode < 0 || reasonCode >= FAILURE_REASON_STRINGS.length) {
return "REASON_UNKNOWN";
}
return FAILURE_REASON_STRINGS[reasonCode];
@@ -298,7 +318,7 @@ public class BssidBlocklistMonitor {
}
addToBlocklist(entry,
getBlocklistDurationWithExponentialBackoff(currentStreak, baseBlockDurationMs),
- getFailureReasonString(reasonCode));
+ reasonCode);
mWifiScoreCard.incrementBssidBlocklistStreak(ssid, bssid, reasonCode);
return true;
}
@@ -593,7 +613,7 @@ public class BssidBlocklistMonitor {
public final String bssid;
public final String ssid;
public final int[] failureCount = new int[NUMBER_REASON_CODES];
- private String mBlockReason = ""; // reason of blocking for logging only
+ private int mBlockReason = INVALID_REASON; // reason of blocking this BSSID
// The following are used to flag how long this BSSID stays in the blocklist.
public boolean isInBlocklist;
@@ -616,8 +636,9 @@ public class BssidBlocklistMonitor {
/**
* Add this BSSID to blocklist for the specified duration.
* @param durationMs
+ * @param blockReason
*/
- public void addToBlocklist(long durationMs, String blockReason) {
+ public void addToBlocklist(long durationMs, @FailureReason int blockReason) {
isInBlocklist = true;
blocklistStartTimeMs = mClock.getWallClockMillis();
blocklistEndTimeMs = blocklistStartTimeMs + durationMs;
@@ -632,7 +653,7 @@ public class BssidBlocklistMonitor {
isInBlocklist = false;
blocklistStartTimeMs = 0;
blocklistEndTimeMs = 0;
- mBlockReason = "";
+ mBlockReason = INVALID_REASON;
localLog(TAG + " removeFromBlocklist BSSID=" + bssid);
}
@@ -643,7 +664,7 @@ public class BssidBlocklistMonitor {
sb.append(", SSID=" + ssid);
sb.append(", isInBlocklist=" + isInBlocklist);
if (isInBlocklist) {
- sb.append(", blockReason=" + mBlockReason);
+ sb.append(", blockReason=" + getFailureReasonString(mBlockReason));
mCalendar.setTimeInMillis(blocklistStartTimeMs);
sb.append(", blocklistStartTimeMs="
+ String.format("%tm-%td %tH:%tM:%tS.%tL", mCalendar, mCalendar,
diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java
index fd79d8258..c73fe4bae 100644
--- a/service/java/com/android/server/wifi/ClientModeImpl.java
+++ b/service/java/com/android/server/wifi/ClientModeImpl.java
@@ -6295,7 +6295,8 @@ public class ClientModeImpl extends StateMachine {
duration = MboOceConstants.DEFAULT_BLACKLIST_DURATION_MS;
}
// Blacklist the current BSS
- mBssidBlocklistMonitor.blockBssidForDurationMs(bssid, ssid, duration);
+ mBssidBlocklistMonitor.blockBssidForDurationMs(bssid, ssid, duration,
+ BssidBlocklistMonitor.REASON_FRAMEWORK_DISCONNECT_MBO_OCE);
}
if (frameData.mStatus != MboOceConstants.BTM_RESPONSE_STATUS_ACCEPT) {
diff --git a/service/java/com/android/server/wifi/WifiConnectivityManager.java b/service/java/com/android/server/wifi/WifiConnectivityManager.java
index 131f4d1c1..a6f58fbe6 100644
--- a/service/java/com/android/server/wifi/WifiConnectivityManager.java
+++ b/service/java/com/android/server/wifi/WifiConnectivityManager.java
@@ -1759,7 +1759,8 @@ public class WifiConnectivityManager {
// Make sure that the failed BSSID is blocked for at least TEMP_BSSID_BLOCK_DURATION
// to prevent the supplicant from trying it again.
mBssidBlocklistMonitor.blockBssidForDurationMs(bssid, ssid,
- TEMP_BSSID_BLOCK_DURATION);
+ TEMP_BSSID_BLOCK_DURATION,
+ BssidBlocklistMonitor.REASON_FRAMEWORK_DISCONNECT_FAST_RECONNECT);
connectToNetwork(candidate);
}
} catch (IllegalArgumentException e) {
diff --git a/service/java/com/android/server/wifi/WifiScoreReport.java b/service/java/com/android/server/wifi/WifiScoreReport.java
index 7819bba15..61809113c 100644
--- a/service/java/com/android/server/wifi/WifiScoreReport.java
+++ b/service/java/com/android/server/wifi/WifiScoreReport.java
@@ -631,7 +631,8 @@ public class WifiScoreReport {
>= MIN_TIME_TO_WAIT_BEFORE_BLOCKLIST_BSSID_MILLIS)) {
mBssidBlocklistMonitor.blockBssidForDurationMs(mWifiInfo.getBSSID(),
mWifiInfo.getSSID(),
- DURATION_TO_BLOCKLIST_BSSID_AFTER_FIRST_EXITING_MILLIS);
+ DURATION_TO_BLOCKLIST_BSSID_AFTER_FIRST_EXITING_MILLIS,
+ BssidBlocklistMonitor.REASON_FRAMEWORK_DISCONNECT_CONNECTED_SCORE);
mLastScoreBreachLowTimeMillis = INVALID_WALL_CLOCK_MILLIS;
}
}