[WIFICOND][API] MacAddress + capability flags

Per API council feedback:
- Convert: byte[] -> MacAddress
- Formalize capability bit flags

Bug: 149105833
Test: atest android.net.wifi
Test: atest com.android.server.wifi
Change-Id: I3e65511eec9b8d5ebc829de34b386b600ed67e82
This commit is contained in:
Etan Cohen
2020-02-09 10:47:57 -08:00
parent 3d3138f063
commit 3df4c8942f
5 changed files with 153 additions and 42 deletions

View File

@@ -8242,8 +8242,8 @@ package android.net.wifi.wificond {
public final class NativeScanResult implements android.os.Parcelable {
ctor public NativeScanResult();
method public int describeContents();
method @NonNull public byte[] getBssid();
method @NonNull public int getCapabilities();
method @Nullable public android.net.MacAddress getBssid();
method public int getCapabilities();
method public int getFrequencyMhz();
method @NonNull public byte[] getInformationElements();
method @NonNull public java.util.List<android.net.wifi.wificond.RadioChainInfo> getRadioChainInfos();
@@ -8252,15 +8252,31 @@ package android.net.wifi.wificond {
method public long getTsf();
method public boolean isAssociated();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field public static final int BSS_CAPABILITY_APSD = 2048; // 0x800
field public static final int BSS_CAPABILITY_CF_POLLABLE = 4; // 0x4
field public static final int BSS_CAPABILITY_CF_POLL_REQUEST = 8; // 0x8
field public static final int BSS_CAPABILITY_CHANNEL_AGILITY = 128; // 0x80
field public static final int BSS_CAPABILITY_DELAYED_BLOCK_ACK = 16384; // 0x4000
field public static final int BSS_CAPABILITY_DSSS_OFDM = 8192; // 0x2000
field public static final int BSS_CAPABILITY_ESS = 1; // 0x1
field public static final int BSS_CAPABILITY_IBSS = 2; // 0x2
field public static final int BSS_CAPABILITY_IMMEDIATE_BLOCK_ACK = 32768; // 0x8000
field public static final int BSS_CAPABILITY_PBCC = 64; // 0x40
field public static final int BSS_CAPABILITY_PRIVACY = 16; // 0x10
field public static final int BSS_CAPABILITY_QOS = 512; // 0x200
field public static final int BSS_CAPABILITY_RADIO_MANAGEMENT = 4096; // 0x1000
field public static final int BSS_CAPABILITY_SHORT_PREAMBLE = 32; // 0x20
field public static final int BSS_CAPABILITY_SHORT_SLOT_TIME = 1024; // 0x400
field public static final int BSS_CAPABILITY_SPECTRUM_MANAGEMENT = 256; // 0x100
field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.wificond.NativeScanResult> CREATOR;
}
public final class NativeWifiClient implements android.os.Parcelable {
ctor public NativeWifiClient(@NonNull byte[]);
ctor public NativeWifiClient(@Nullable android.net.MacAddress);
method public int describeContents();
method @Nullable public android.net.MacAddress getMacAddress();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.wificond.NativeWifiClient> CREATOR;
field @NonNull public final byte[] macAddress;
}
public final class PnoNetwork implements android.os.Parcelable {

View File

@@ -16,14 +16,21 @@
package android.net.wifi.wificond;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.net.MacAddress;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
@@ -33,6 +40,8 @@ import java.util.List;
*/
@SystemApi
public final class NativeScanResult implements Parcelable {
private static final String TAG = "NativeScanResult";
/** @hide */
@VisibleForTesting
public byte[] ssid;
@@ -53,7 +62,7 @@ public final class NativeScanResult implements Parcelable {
public long tsf;
/** @hide */
@VisibleForTesting
public int capability;
@BssCapabilityBits public int capability;
/** @hide */
@VisibleForTesting
public boolean associated;
@@ -71,14 +80,17 @@ public final class NativeScanResult implements Parcelable {
}
/**
* Returns raw bytes representing the MAC address (BSSID) of the AP represented by this scan
* result.
* Returns the MAC address (BSSID) of the AP represented by this scan result.
*
* @return a byte array, possibly null or containing the incorrect number of bytes for a MAC
* address.
* @return a MacAddress or null on error.
*/
@NonNull public byte[] getBssid() {
return bssid;
@Nullable public MacAddress getBssid() {
try {
return MacAddress.fromBytes(bssid);
} catch (IllegalArgumentException e) {
Log.e(TAG, "Illegal argument " + Arrays.toString(bssid), e);
return null;
}
}
/**
@@ -127,31 +139,103 @@ public final class NativeScanResult implements Parcelable {
return associated;
}
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(flag = true, prefix = {"BSS_CAPABILITY_"},
value = {BSS_CAPABILITY_ESS,
BSS_CAPABILITY_IBSS,
BSS_CAPABILITY_CF_POLLABLE,
BSS_CAPABILITY_CF_POLL_REQUEST,
BSS_CAPABILITY_PRIVACY,
BSS_CAPABILITY_SHORT_PREAMBLE,
BSS_CAPABILITY_PBCC,
BSS_CAPABILITY_CHANNEL_AGILITY,
BSS_CAPABILITY_SPECTRUM_MANAGEMENT,
BSS_CAPABILITY_QOS,
BSS_CAPABILITY_SHORT_SLOT_TIME,
BSS_CAPABILITY_APSD,
BSS_CAPABILITY_RADIO_MANAGEMENT,
BSS_CAPABILITY_DSSS_OFDM,
BSS_CAPABILITY_DELAYED_BLOCK_ACK,
BSS_CAPABILITY_IMMEDIATE_BLOCK_ACK
})
public @interface BssCapabilityBits { }
/**
* BSS capability bit (see IEEE Std 802.11: 9.4.1.4): ESS.
*/
public static final int BSS_CAPABILITY_ESS = 0x1 << 0;
/**
* BSS capability bit (see IEEE Std 802.11: 9.4.1.4): IBSS.
*/
public static final int BSS_CAPABILITY_IBSS = 0x1 << 1;
/**
* BSS capability bit (see IEEE Std 802.11: 9.4.1.4): CF Pollable.
*/
public static final int BSS_CAPABILITY_CF_POLLABLE = 0x1 << 2;
/**
* BSS capability bit (see IEEE Std 802.11: 9.4.1.4): CF-Poll Request.
*/
public static final int BSS_CAPABILITY_CF_POLL_REQUEST = 0x1 << 3;
/**
* BSS capability bit (see IEEE Std 802.11: 9.4.1.4): Privacy.
*/
public static final int BSS_CAPABILITY_PRIVACY = 0x1 << 4;
/**
* BSS capability bit (see IEEE Std 802.11: 9.4.1.4): Short Preamble.
*/
public static final int BSS_CAPABILITY_SHORT_PREAMBLE = 0x1 << 5;
/**
* BSS capability bit (see IEEE Std 802.11: 9.4.1.4): PBCC.
*/
public static final int BSS_CAPABILITY_PBCC = 0x1 << 6;
/**
* BSS capability bit (see IEEE Std 802.11: 9.4.1.4): Channel Agility.
*/
public static final int BSS_CAPABILITY_CHANNEL_AGILITY = 0x1 << 7;
/**
* BSS capability bit (see IEEE Std 802.11: 9.4.1.4): Spectrum Management.
*/
public static final int BSS_CAPABILITY_SPECTRUM_MANAGEMENT = 0x1 << 8;
/**
* BSS capability bit (see IEEE Std 802.11: 9.4.1.4): QoS.
*/
public static final int BSS_CAPABILITY_QOS = 0x1 << 9;
/**
* BSS capability bit (see IEEE Std 802.11: 9.4.1.4): Short Slot Time.
*/
public static final int BSS_CAPABILITY_SHORT_SLOT_TIME = 0x1 << 10;
/**
* BSS capability bit (see IEEE Std 802.11: 9.4.1.4): APSD.
*/
public static final int BSS_CAPABILITY_APSD = 0x1 << 11;
/**
* BSS capability bit (see IEEE Std 802.11: 9.4.1.4): Radio Management.
*/
public static final int BSS_CAPABILITY_RADIO_MANAGEMENT = 0x1 << 12;
/**
* BSS capability bit (see IEEE Std 802.11: 9.4.1.4): DSSS-OFDM.
*/
public static final int BSS_CAPABILITY_DSSS_OFDM = 0x1 << 13;
/**
* BSS capability bit (see IEEE Std 802.11: 9.4.1.4): Delayed Block Ack.
*/
public static final int BSS_CAPABILITY_DELAYED_BLOCK_ACK = 0x1 << 14;
/**
* BSS capability bit (see IEEE Std 802.11: 9.4.1.4): Immediate Block Ack.
*/
public static final int BSS_CAPABILITY_IMMEDIATE_BLOCK_ACK = 0x1 << 15;
/**
* Returns the capabilities of the AP repseresented by this scan result as advertised in the
* received probe response or beacon.
*
* This is a bit mask describing the capabilities of a BSS. See IEEE Std 802.11: 9.4.1.4:
* Bit 0 - ESS
* Bit 1 - IBSS
* Bit 2 - CF Pollable
* Bit 3 - CF-Poll Request
* Bit 4 - Privacy
* Bit 5 - Short Preamble
* Bit 6 - PBCC
* Bit 7 - Channel Agility
* Bit 8 - Spectrum Management
* Bit 9 - QoS
* Bit 10 - Short Slot Time
* Bit 11 - APSD
* Bit 12 - Radio Measurement
* Bit 13 - DSSS-OFDM
* Bit 14 - Delayed Block Ack
* Bit 15 - Immediate Block Ack
* This is a bit mask describing the capabilities of a BSS. See IEEE Std 802.11: 9.4.1.4: one
* of the {@code BSS_CAPABILITY_*} flags.
*
* @return a bit mask of capabilities.
*/
@NonNull public int getCapabilities() {
@BssCapabilityBits public int getCapabilities() {
return capability;
}

View File

@@ -17,11 +17,13 @@
package android.net.wifi.wificond;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.net.MacAddress;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.Arrays;
import java.util.Objects;
/**
* Structure providing information about clients (STAs) associated with a SoftAp.
@@ -30,16 +32,21 @@ import java.util.Arrays;
*/
@SystemApi
public final class NativeWifiClient implements Parcelable {
private final MacAddress mMacAddress;
/**
* The raw bytes of the MAC address of the client (STA) represented by this object.
* The MAC address of the client (STA) represented by this object. The MAC address may be null
* in case of an error.
*/
@NonNull public final byte[] macAddress;
@Nullable public MacAddress getMacAddress() {
return mMacAddress;
}
/**
* Construct a native Wi-Fi client.
*/
public NativeWifiClient(@NonNull byte[] macAddress) {
this.macAddress = macAddress;
public NativeWifiClient(@Nullable MacAddress macAddress) {
this.mMacAddress = macAddress;
}
/** override comparator */
@@ -50,13 +57,13 @@ public final class NativeWifiClient implements Parcelable {
return false;
}
NativeWifiClient other = (NativeWifiClient) rhs;
return Arrays.equals(macAddress, other.macAddress);
return Objects.equals(mMacAddress, other.mMacAddress);
}
/** override hash code */
@Override
public int hashCode() {
return Arrays.hashCode(macAddress);
return mMacAddress.hashCode();
}
/** implement Parcelable interface */
@@ -71,7 +78,7 @@ public final class NativeWifiClient implements Parcelable {
*/
@Override
public void writeToParcel(@NonNull Parcel out, int flags) {
out.writeByteArray(macAddress);
out.writeByteArray(mMacAddress.toByteArray());
}
/** implement Parcelable interface */
@@ -79,9 +86,11 @@ public final class NativeWifiClient implements Parcelable {
new Parcelable.Creator<NativeWifiClient>() {
@Override
public NativeWifiClient createFromParcel(Parcel in) {
byte[] macAddress = in.createByteArray();
if (macAddress == null) {
macAddress = new byte[0];
MacAddress macAddress;
try {
macAddress = MacAddress.fromBytes(in.createByteArray());
} catch (IllegalArgumentException e) {
macAddress = null;
}
return new NativeWifiClient(macAddress);
}

View File

@@ -368,7 +368,7 @@ public class WifiCondManager {
public void onConnectedClientsChanged(NativeWifiClient client, boolean isConnected) {
if (mVerboseLoggingEnabled) {
Log.d(TAG, "onConnectedClientsChanged called with "
+ client.macAddress + " isConnected: " + isConnected);
+ client.getMacAddress() + " isConnected: " + isConnected);
}
Binder.clearCallingIdentity();

View File

@@ -38,6 +38,7 @@ import static org.mockito.Mockito.when;
import android.app.AlarmManager;
import android.app.test.TestAlarmManager;
import android.content.Context;
import android.net.MacAddress;
import android.net.wifi.ScanResult;
import android.net.wifi.SoftApInfo;
import android.net.wifi.WifiConfiguration;
@@ -119,7 +120,8 @@ public class WifiCondManagerTest {
private static final String TEST_QUOTED_SSID_2 = "\"testSsid2\"";
private static final int[] TEST_FREQUENCIES_1 = {};
private static final int[] TEST_FREQUENCIES_2 = {2500, 5124};
private static final byte[] TEST_RAW_MAC_BYTES = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05};
private static final MacAddress TEST_RAW_MAC_BYTES = MacAddress.fromBytes(
new byte[]{0x00, 0x01, 0x02, 0x03, 0x04, 0x05});
private static final List<byte[]> SCAN_HIDDEN_NETWORK_SSID_LIST =
new ArrayList<byte[]>() {{