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

Commit dcd8a101 authored by Shuibing Dai's avatar Shuibing Dai
Browse files

Add codes for scan vendor ies support

Bug: 258285219
Test: atest android.net.wifi
Change-Id: Ie8e7b18de0dc8ce9ce2263e5cc62168e241a0fc9
parent 539486f7
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -9605,6 +9605,7 @@ package android.net.wifi.nl80211 {
    method public boolean tearDownInterfaces();
    method public boolean tearDownInterfaces();
    method public boolean tearDownSoftApInterface(@NonNull String);
    method public boolean tearDownSoftApInterface(@NonNull String);
    method public void unregisterCountryCodeChangedListener(@NonNull android.net.wifi.nl80211.WifiNl80211Manager.CountryCodeChangedListener);
    method public void unregisterCountryCodeChangedListener(@NonNull android.net.wifi.nl80211.WifiNl80211Manager.CountryCodeChangedListener);
    field public static final String EXTRA_SCANNING_PARAM_VENDOR_IES = "android.net.wifi.nl80211.extra.SCANNING_PARAM_VENDOR_IES";
    field public static final String SCANNING_PARAM_ENABLE_6GHZ_RNR = "android.net.wifi.nl80211.SCANNING_PARAM_ENABLE_6GHZ_RNR";
    field public static final String SCANNING_PARAM_ENABLE_6GHZ_RNR = "android.net.wifi.nl80211.SCANNING_PARAM_ENABLE_6GHZ_RNR";
    field public static final int SCAN_TYPE_PNO_SCAN = 1; // 0x1
    field public static final int SCAN_TYPE_PNO_SCAN = 1; // 0x1
    field public static final int SCAN_TYPE_SINGLE_SCAN = 0; // 0x0
    field public static final int SCAN_TYPE_SINGLE_SCAN = 0; // 0x0
+15 −2
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@ import android.os.Parcelable;
import android.util.Log;
import android.util.Log;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Objects;
import java.util.Objects;


/**
/**
@@ -35,6 +36,7 @@ public class SingleScanSettings implements Parcelable {
    public boolean enable6GhzRnr;
    public boolean enable6GhzRnr;
    public ArrayList<ChannelSettings> channelSettings;
    public ArrayList<ChannelSettings> channelSettings;
    public ArrayList<HiddenNetwork> hiddenNetworks;
    public ArrayList<HiddenNetwork> hiddenNetworks;
    public byte[] vendorIes;


    /** public constructor */
    /** public constructor */
    public SingleScanSettings() { }
    public SingleScanSettings() { }
@@ -53,13 +55,15 @@ public class SingleScanSettings implements Parcelable {
        return scanType == settings.scanType
        return scanType == settings.scanType
                && enable6GhzRnr == settings.enable6GhzRnr
                && enable6GhzRnr == settings.enable6GhzRnr
                && channelSettings.equals(settings.channelSettings)
                && channelSettings.equals(settings.channelSettings)
                && hiddenNetworks.equals(settings.hiddenNetworks);
                && hiddenNetworks.equals(settings.hiddenNetworks)
                && Arrays.equals(vendorIes, settings.vendorIes);
    }
    }


    /** override hash code */
    /** override hash code */
    @Override
    @Override
    public int hashCode() {
    public int hashCode() {
        return Objects.hash(scanType, channelSettings, hiddenNetworks, enable6GhzRnr);
        return Objects.hash(scanType, channelSettings, hiddenNetworks, enable6GhzRnr,
                Arrays.hashCode(vendorIes));
    }
    }




@@ -88,6 +92,11 @@ public class SingleScanSettings implements Parcelable {
        out.writeBoolean(enable6GhzRnr);
        out.writeBoolean(enable6GhzRnr);
        out.writeTypedList(channelSettings);
        out.writeTypedList(channelSettings);
        out.writeTypedList(hiddenNetworks);
        out.writeTypedList(hiddenNetworks);
        if (vendorIes == null) {
            out.writeByteArray(new byte[0]);
        } else {
            out.writeByteArray(vendorIes);
        }
    }
    }


    /** implement Parcelable interface */
    /** implement Parcelable interface */
@@ -108,6 +117,10 @@ public class SingleScanSettings implements Parcelable {
            in.readTypedList(result.channelSettings, ChannelSettings.CREATOR);
            in.readTypedList(result.channelSettings, ChannelSettings.CREATOR);
            result.hiddenNetworks = new ArrayList<HiddenNetwork>();
            result.hiddenNetworks = new ArrayList<HiddenNetwork>();
            in.readTypedList(result.hiddenNetworks, HiddenNetwork.CREATOR);
            in.readTypedList(result.hiddenNetworks, HiddenNetwork.CREATOR);
            result.vendorIes = in.createByteArray();
            if (result.vendorIes == null) {
                result.vendorIes = new byte[0];
            }
            if (in.dataAvail() != 0) {
            if (in.dataAvail() != 0) {
                Log.e(TAG, "Found trailing data after parcel parsing.");
                Log.e(TAG, "Found trailing data after parcel parsing.");
            }
            }
+5 −0
Original line number Original line Diff line number Diff line
@@ -96,6 +96,10 @@ public class WifiNl80211Manager {
    public static final String SCANNING_PARAM_ENABLE_6GHZ_RNR =
    public static final String SCANNING_PARAM_ENABLE_6GHZ_RNR =
            "android.net.wifi.nl80211.SCANNING_PARAM_ENABLE_6GHZ_RNR";
            "android.net.wifi.nl80211.SCANNING_PARAM_ENABLE_6GHZ_RNR";


    // Extra scanning parameter used to add vendor IEs (byte[]).
    public static final String EXTRA_SCANNING_PARAM_VENDOR_IES =
            "android.net.wifi.nl80211.extra.SCANNING_PARAM_VENDOR_IES";

    private AlarmManager mAlarmManager;
    private AlarmManager mAlarmManager;
    private Handler mEventHandler;
    private Handler mEventHandler;


@@ -1135,6 +1139,7 @@ public class WifiNl80211Manager {
        settings.hiddenNetworks  = new ArrayList<>();
        settings.hiddenNetworks  = new ArrayList<>();
        if (extraScanningParams != null) {
        if (extraScanningParams != null) {
            settings.enable6GhzRnr = extraScanningParams.getBoolean(SCANNING_PARAM_ENABLE_6GHZ_RNR);
            settings.enable6GhzRnr = extraScanningParams.getBoolean(SCANNING_PARAM_ENABLE_6GHZ_RNR);
            settings.vendorIes = extraScanningParams.getByteArray(EXTRA_SCANNING_PARAM_VENDOR_IES);
        }
        }


        if (freqs != null) {
        if (freqs != null) {
+7 −1
Original line number Original line Diff line number Diff line
@@ -47,6 +47,7 @@ public class SingleScanSettingsTest {
    private ChannelSettings mChannelSettings2;
    private ChannelSettings mChannelSettings2;
    private HiddenNetwork mHiddenNetwork1;
    private HiddenNetwork mHiddenNetwork1;
    private HiddenNetwork mHiddenNetwork2;
    private HiddenNetwork mHiddenNetwork2;
    private byte[] mVendorIes;


    @Before
    @Before
    public void setUp() {
    public void setUp() {
@@ -59,6 +60,9 @@ public class SingleScanSettingsTest {
        mHiddenNetwork1.ssid = TEST_SSID_1;
        mHiddenNetwork1.ssid = TEST_SSID_1;
        mHiddenNetwork2 = new HiddenNetwork();
        mHiddenNetwork2 = new HiddenNetwork();
        mHiddenNetwork2.ssid = TEST_SSID_2;
        mHiddenNetwork2.ssid = TEST_SSID_2;

        mVendorIes = new byte[]{(byte) 0xdd, 0x7, 0x00, 0x50, (byte) 0xf2, 0x08, 0x11, 0x22, 0x33,
                (byte) 0xdd, 0x7, 0x00, 0x50, (byte) 0xf2, 0x08, 0x44, 0x55, 0x66};
    }
    }


    /**
    /**
@@ -69,12 +73,12 @@ public class SingleScanSettingsTest {
    public void canSerializeAndDeserialize() {
    public void canSerializeAndDeserialize() {
        SingleScanSettings scanSettings = new SingleScanSettings();
        SingleScanSettings scanSettings = new SingleScanSettings();
        scanSettings.scanType = IWifiScannerImpl.SCAN_TYPE_HIGH_ACCURACY;
        scanSettings.scanType = IWifiScannerImpl.SCAN_TYPE_HIGH_ACCURACY;

        scanSettings.channelSettings =
        scanSettings.channelSettings =
                new ArrayList<>(Arrays.asList(mChannelSettings1, mChannelSettings2));
                new ArrayList<>(Arrays.asList(mChannelSettings1, mChannelSettings2));
        scanSettings.hiddenNetworks =
        scanSettings.hiddenNetworks =
                new ArrayList<>(Arrays.asList(mHiddenNetwork1, mHiddenNetwork2));
                new ArrayList<>(Arrays.asList(mHiddenNetwork1, mHiddenNetwork2));
        scanSettings.enable6GhzRnr = true;
        scanSettings.enable6GhzRnr = true;
        scanSettings.vendorIes = mVendorIes;


        Parcel parcel = Parcel.obtain();
        Parcel parcel = Parcel.obtain();
        scanSettings.writeToParcel(parcel, 0);
        scanSettings.writeToParcel(parcel, 0);
@@ -98,6 +102,7 @@ public class SingleScanSettingsTest {
                new ArrayList<>(Arrays.asList(mChannelSettings1, mChannelSettings2));
                new ArrayList<>(Arrays.asList(mChannelSettings1, mChannelSettings2));
        scanSettings1.hiddenNetworks =
        scanSettings1.hiddenNetworks =
                new ArrayList<>(Arrays.asList(mHiddenNetwork1, mHiddenNetwork2));
                new ArrayList<>(Arrays.asList(mHiddenNetwork1, mHiddenNetwork2));
        scanSettings1.vendorIes = mVendorIes;


        SingleScanSettings scanSettings2 = new SingleScanSettings();
        SingleScanSettings scanSettings2 = new SingleScanSettings();
        scanSettings2.scanType = IWifiScannerImpl.SCAN_TYPE_HIGH_ACCURACY;
        scanSettings2.scanType = IWifiScannerImpl.SCAN_TYPE_HIGH_ACCURACY;
@@ -105,6 +110,7 @@ public class SingleScanSettingsTest {
                new ArrayList<>(Arrays.asList(mChannelSettings1, mChannelSettings2));
                new ArrayList<>(Arrays.asList(mChannelSettings1, mChannelSettings2));
        scanSettings2.hiddenNetworks =
        scanSettings2.hiddenNetworks =
                new ArrayList<>(Arrays.asList(mHiddenNetwork1, mHiddenNetwork2));
                new ArrayList<>(Arrays.asList(mHiddenNetwork1, mHiddenNetwork2));
        scanSettings2.vendorIes = mVendorIes;


        assertEquals(scanSettings1, scanSettings2);
        assertEquals(scanSettings1, scanSettings2);
        assertEquals(scanSettings1.hashCode(), scanSettings2.hashCode());
        assertEquals(scanSettings1.hashCode(), scanSettings2.hashCode());
+18 −8
Original line number Original line Diff line number Diff line
@@ -68,6 +68,7 @@ import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.HashSet;
import java.util.List;
import java.util.List;
import java.util.Set;
import java.util.Set;
@@ -127,6 +128,9 @@ public class WifiNl80211ManagerTest {
    private static final String TEST_QUOTED_SSID_2 = "\"testSsid2\"";
    private static final String TEST_QUOTED_SSID_2 = "\"testSsid2\"";
    private static final int[] TEST_FREQUENCIES_1 = {};
    private static final int[] TEST_FREQUENCIES_1 = {};
    private static final int[] TEST_FREQUENCIES_2 = {2500, 5124};
    private static final int[] TEST_FREQUENCIES_2 = {2500, 5124};
    private static final byte[] TEST_VENDOR_IES =
            new byte[]{(byte) 0xdd, 0x7, 0x00, 0x50, (byte) 0xf2, 0x08, 0x11, 0x22, 0x33,
                    (byte) 0xdd, 0x7, 0x00, 0x50, (byte) 0xf2, 0x08, 0x44, 0x55, 0x66};
    private static final MacAddress TEST_RAW_MAC_BYTES = MacAddress.fromBytes(
    private static final MacAddress TEST_RAW_MAC_BYTES = MacAddress.fromBytes(
            new byte[]{0x00, 0x01, 0x02, 0x03, 0x04, 0x05});
            new byte[]{0x00, 0x01, 0x02, 0x03, 0x04, 0x05});


@@ -512,7 +516,7 @@ public class WifiNl80211ManagerTest {
                SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_LIST));
                SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_LIST));
        verify(mWifiScannerImpl).scan(argThat(new ScanMatcher(
        verify(mWifiScannerImpl).scan(argThat(new ScanMatcher(
                IWifiScannerImpl.SCAN_TYPE_LOW_POWER,
                IWifiScannerImpl.SCAN_TYPE_LOW_POWER,
                SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_LIST, false)));
                SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_LIST, false, null)));
    }
    }


    /**
    /**
@@ -523,12 +527,13 @@ public class WifiNl80211ManagerTest {
        when(mWifiScannerImpl.scan(any(SingleScanSettings.class))).thenReturn(true);
        when(mWifiScannerImpl.scan(any(SingleScanSettings.class))).thenReturn(true);
        Bundle bundle = new Bundle();
        Bundle bundle = new Bundle();
        bundle.putBoolean(WifiNl80211Manager.SCANNING_PARAM_ENABLE_6GHZ_RNR, true);
        bundle.putBoolean(WifiNl80211Manager.SCANNING_PARAM_ENABLE_6GHZ_RNR, true);
        bundle.putByteArray(WifiNl80211Manager.EXTRA_SCANNING_PARAM_VENDOR_IES, TEST_VENDOR_IES);
        assertTrue(mWificondControl.startScan(
        assertTrue(mWificondControl.startScan(
                TEST_INTERFACE_NAME, WifiScanner.SCAN_TYPE_LOW_POWER,
                TEST_INTERFACE_NAME, WifiScanner.SCAN_TYPE_LOW_POWER,
                SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_LIST, bundle));
                SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_LIST, bundle));
        verify(mWifiScannerImpl).scan(argThat(new ScanMatcher(
        verify(mWifiScannerImpl).scan(argThat(new ScanMatcher(
                IWifiScannerImpl.SCAN_TYPE_LOW_POWER,
                IWifiScannerImpl.SCAN_TYPE_LOW_POWER,
                SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_LIST, true)));
                SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_LIST, true, TEST_VENDOR_IES)));
    }
    }


    /**
    /**
@@ -542,7 +547,7 @@ public class WifiNl80211ManagerTest {
                SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_LIST, null));
                SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_LIST, null));
        verify(mWifiScannerImpl).scan(argThat(new ScanMatcher(
        verify(mWifiScannerImpl).scan(argThat(new ScanMatcher(
                IWifiScannerImpl.SCAN_TYPE_LOW_POWER,
                IWifiScannerImpl.SCAN_TYPE_LOW_POWER,
                SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_LIST, false)));
                SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_LIST, false, null)));
    }
    }


    /**
    /**
@@ -556,7 +561,7 @@ public class WifiNl80211ManagerTest {
                SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_LIST, new Bundle()));
                SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_LIST, new Bundle()));
        verify(mWifiScannerImpl).scan(argThat(new ScanMatcher(
        verify(mWifiScannerImpl).scan(argThat(new ScanMatcher(
                IWifiScannerImpl.SCAN_TYPE_LOW_POWER,
                IWifiScannerImpl.SCAN_TYPE_LOW_POWER,
                SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_LIST, false)));
                SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_LIST, false, null)));
    }
    }


    /**
    /**
@@ -577,7 +582,7 @@ public class WifiNl80211ManagerTest {
        // But the argument passed down should have the duplicate removed.
        // But the argument passed down should have the duplicate removed.
        verify(mWifiScannerImpl).scan(argThat(new ScanMatcher(
        verify(mWifiScannerImpl).scan(argThat(new ScanMatcher(
                IWifiScannerImpl.SCAN_TYPE_LOW_POWER,
                IWifiScannerImpl.SCAN_TYPE_LOW_POWER,
                SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_LIST, false)));
                SCAN_FREQ_SET, SCAN_HIDDEN_NETWORK_SSID_LIST, false, null)));
    }
    }


    /**
    /**
@@ -589,7 +594,7 @@ public class WifiNl80211ManagerTest {
        assertTrue(mWificondControl.startScan(
        assertTrue(mWificondControl.startScan(
                TEST_INTERFACE_NAME, WifiScanner.SCAN_TYPE_HIGH_ACCURACY, null, null));
                TEST_INTERFACE_NAME, WifiScanner.SCAN_TYPE_HIGH_ACCURACY, null, null));
        verify(mWifiScannerImpl).scan(argThat(new ScanMatcher(
        verify(mWifiScannerImpl).scan(argThat(new ScanMatcher(
                IWifiScannerImpl.SCAN_TYPE_HIGH_ACCURACY, null, null, false)));
                IWifiScannerImpl.SCAN_TYPE_HIGH_ACCURACY, null, null, false, null)));
    }
    }


    /**
    /**
@@ -1161,13 +1166,15 @@ public class WifiNl80211ManagerTest {
        private final Set<Integer> mExpectedFreqs;
        private final Set<Integer> mExpectedFreqs;
        private final List<byte[]> mExpectedSsids;
        private final List<byte[]> mExpectedSsids;
        private final boolean mExpectedEnable6GhzRnr;
        private final boolean mExpectedEnable6GhzRnr;
        private final byte[] mExpectedVendorIes;


        ScanMatcher(int expectedScanType, Set<Integer> expectedFreqs, List<byte[]> expectedSsids,
        ScanMatcher(int expectedScanType, Set<Integer> expectedFreqs, List<byte[]> expectedSsids,
                boolean expectedEnable6GhzRnr) {
                boolean expectedEnable6GhzRnr, byte[] expectedVendorIes) {
            this.mExpectedScanType = expectedScanType;
            this.mExpectedScanType = expectedScanType;
            this.mExpectedFreqs = expectedFreqs;
            this.mExpectedFreqs = expectedFreqs;
            this.mExpectedSsids = expectedSsids;
            this.mExpectedSsids = expectedSsids;
            this.mExpectedEnable6GhzRnr = expectedEnable6GhzRnr;
            this.mExpectedEnable6GhzRnr = expectedEnable6GhzRnr;
            this.mExpectedVendorIes = expectedVendorIes;
        }
        }


        @Override
        @Override
@@ -1202,12 +1209,15 @@ public class WifiNl80211ManagerTest {
                if (!mExpectedSsids.equals(ssidSet)) {
                if (!mExpectedSsids.equals(ssidSet)) {
                    return false;
                    return false;
                }
                }

            } else {
            } else {
                if (hiddenNetworks != null && hiddenNetworks.size() > 0) {
                if (hiddenNetworks != null && hiddenNetworks.size() > 0) {
                    return false;
                    return false;
                }
                }
            }
            }

            if (!Arrays.equals(mExpectedVendorIes, settings.vendorIes)) {
                return false;
            }
            return true;
            return true;
        }
        }