frameworks\opt\net\wifi\service\java\com\android\server\wifi\ClientModeImpl.java
private void handleBssTransitionRequest(BtmFrameData frameData) {
if (frameData == null) {
return;
}
String bssid = mWifiInfo.getBSSID();
String ssid = mWifiInfo.getSSID();
if ((bssid == null) || (ssid == null) || WifiManager.UNKNOWN_SSID.equals(ssid)) {
Log.e(TAG, "Failed to handle BSS transition: bssid: " + bssid + " ssid: " + ssid);
return;
}
if ((frameData.mBssTmDataFlagsMask
& MboOceConstants.BTM_DATA_FLAG_MBO_CELL_DATA_CONNECTION_PREFERENCE_INCLUDED)
!= 0) {
mWifiMetrics.incrementMboCellularSwitchRequestCount();
}
if ((frameData.mBssTmDataFlagsMask
& MboOceConstants.BTM_DATA_FLAG_DISASSOCIATION_IMMINENT) != 0) {
long duration = 0;
if ((frameData.mBssTmDataFlagsMask
& MboOceConstants.BTM_DATA_FLAG_MBO_ASSOC_RETRY_DELAY_INCLUDED) != 0) {
mWifiMetrics.incrementSteeringRequestCountIncludingMboAssocRetryDelay();
duration = frameData.mBlockListDurationMs;
}
if (duration == 0) {
/*
* When disassoc imminent bit alone is set or MBO assoc retry delay is
* set to zero(reserved as per spec), blocklist the BSS for sometime to
* avoid AP rejecting the re-connect request.
*/
duration = MboOceConstants.DEFAULT_BLOCKLIST_DURATION_MS;
}
// Blocklist the current BSS
//加黑bssid
// DEFAULT_BLOCKLIST_DURATION_MS = 300_000; // 5 minutes
mBssidBlocklistMonitor.blockBssidForDurationMs(bssid, ssid, duration,
BssidBlocklistMonitor.REASON_FRAMEWORK_DISCONNECT_MBO_OCE, 0);
}
if (frameData.mStatus != MboOceConstants.BTM_RESPONSE_STATUS_ACCEPT) {
// Trigger the network selection and re-connect to new network if available.
mWifiMetrics.incrementForceScanCountDueToSteeringRequest();
mWifiConnectivityManager.forceConnectivityScan(ClientModeImpl.WIFI_WORK_SOURCE);
}
}
frameworks\opt\net\wifi\service\java\com\android\server\wifi\BssidBlocklistMonitor.java
public void blockBssidForDurationMs(@NonNull String bssid, @NonNull String ssid,
long durationMs, @FailureReason int blockReason, int rssi) {
if (durationMs <= 0 || !isValidNetworkAndFailureReason(bssid, ssid, blockReason)) {
Log.e(TAG, "Invalid input: BSSID=" + bssid + ", SSID=" + ssid
+ ", durationMs=" + durationMs + ", blockReason=" + blockReason
+ ", rssi=" + rssi);
return;
}
BssidStatus status = getOrCreateBssidStatus(bssid, ssid);
if (status.isInBlocklist
&& status.blocklistEndTimeMs - mClock.getWallClockMillis() > durationMs) {
// Return because this BSSID is already being blocked for a longer time.
return;
}
//可指定bssid避免加黑
addToBlocklist(status, durationMs, blockReason, rssi);
}