Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3df4c894 authored by Etan Cohen's avatar Etan Cohen
Browse files

[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
parent 3d3138f0
Loading
Loading
Loading
Loading
+20 −4
Original line number Diff line number Diff line
@@ -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 {
+109 −25
Original line number Diff line number Diff line
@@ -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;
    }

+20 −11
Original line number Diff line number Diff line
@@ -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);
                }
+1 −1
Original line number Diff line number Diff line
@@ -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();
+3 −1
Original line number Diff line number Diff line
@@ -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[]>() {{