1712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills/* 2712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * Copyright (C) 2016 The Android Open Source Project 3712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * 4712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * Licensed under the Apache License, Version 2.0 (the "License"); 5712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * you may not use this file except in compliance with the License. 6712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * You may obtain a copy of the License at 7712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * 8712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * http://www.apache.org/licenses/LICENSE-2.0 9712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * 10712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * Unless required by applicable law or agreed to in writing, software 11712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * distributed under the License is distributed on an "AS IS" BASIS, 12712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * See the License for the specific language governing permissions and 14712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * limitations under the License. 15712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills */ 16712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 17712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Willspackage com.android.server.wifi.scanner; 18712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 19712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Willsimport android.net.wifi.WifiScanner; 20216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Piusimport android.util.ArraySet; 21712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 22712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Willsimport com.android.server.wifi.WifiNative; 23712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 2439175cc807488dd849e2c530f8be30dd674fbd9fMitchell Willsimport java.util.Set; 2539175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills 26712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills/** 27712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * ChannelHelper offers an abstraction for channel manipulation utilities allowing operation to be 28712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * adjusted based on the amount of information known about the available channels. 29712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills */ 30712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Willspublic abstract class ChannelHelper { 31712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 32798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills // TODO: Currently this is simply an estimate and is used for both active and passive channels 33798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills // scans. Eventually it should be split between passive and active and perhaps retrieved 34798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills // from the driver. 35798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills /** 36798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills * The estimated period spent scanning each channel. This is used for estimating scan duration. 37798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills */ 38798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills public static final int SCAN_PERIOD_PER_CHANNEL_MS = 200; 39798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills 40e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills protected static final WifiScanner.ChannelSpec[] NO_CHANNELS = new WifiScanner.ChannelSpec[0]; 41e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills 42712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills /** 43712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * Create a new collection that can be used to store channels 44712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills */ 45712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public abstract ChannelCollection createChannelCollection(); 46712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 47712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills /** 4839175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills * Return true if the specified channel is expected for a scan with the given settings 4939175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills */ 5039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills public abstract boolean settingsContainChannel(WifiScanner.ScanSettings settings, int channel); 5139175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills 5239175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills /** 53798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills * Get the channels that are available for scanning on the supplied band. 54798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills * This method may return empty if the information is not available. 55798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills */ 56798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills public abstract WifiScanner.ChannelSpec[] getAvailableScanChannels(int band); 57798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills 58798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills /** 59798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills * Estimates the duration that the chip will spend scanning with the given settings 60798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills */ 61798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills public abstract int estimateScanDuration(WifiScanner.ScanSettings settings); 62798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills 63798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills /** 64e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills * Update the channel information that this object has. The source of the update is 65e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills * implementation dependent and may result in no change. Warning the behavior of a 66e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills * ChannelCollection created using {@link #createChannelCollection createChannelCollection} is 67e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills * undefined after calling this method until the {@link ChannelColleciton#clear() clear} method 68e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills * is called on it. 69e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills */ 70e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills public void updateChannels() { 71e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills // default implementation does nothing 72e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills } 73e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills 74e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Wills /** 75712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * Object that supports accumulation of channels and bands 76712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills */ 77712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public abstract class ChannelCollection { 78712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills /** 79712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * Add a channel to the collection 80712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills */ 81712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public abstract void addChannel(int channel); 82712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills /** 83712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * Add all channels in the band to the collection 84712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills */ 85712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public abstract void addBand(int band); 86712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills /** 8739175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills * @return true if the collection contains the supplied channel 8839175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills */ 8939175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills public abstract boolean containsChannel(int channel); 9039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills /** 91216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius * @return true if the collection contains all the channels of the supplied band 92216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius */ 93216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius public abstract boolean containsBand(int band); 94216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius /** 95216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius * @return true if the collection contains some of the channels of the supplied band 96216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius */ 97216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius public abstract boolean partiallyContainsBand(int band); 98216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius /** 9939175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills * @return true if the collection contains no channels 10039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills */ 10139175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills public abstract boolean isEmpty(); 10239175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills /** 1033219e97566a093ed10b2a9d6fe77ed9089084d63Mitchell Wills * @return true if the collection contains all available channels 1043219e97566a093ed10b2a9d6fe77ed9089084d63Mitchell Wills */ 1053219e97566a093ed10b2a9d6fe77ed9089084d63Mitchell Wills public abstract boolean isAllChannels(); 1063219e97566a093ed10b2a9d6fe77ed9089084d63Mitchell Wills /** 107712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * Remove all channels from the collection 108712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills */ 109712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public abstract void clear(); 110216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius /** 111216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius * Retrieves a list of channels from the band which are missing in the channel collection. 112216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius */ 113216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius public abstract Set<Integer> getMissingChannelsFromBand(int band); 114216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius /** 115216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius * Retrieves a list of channels from the band which are contained in the channel collection. 116216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius */ 117216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius public abstract Set<Integer> getContainingChannelsFromBand(int band); 118216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius /** 119216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius * Gets a list of channels specified in the current channel collection. This will return 120216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius * an empty set if an entire Band if specified or if the list is empty. 121216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius */ 122216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius public abstract Set<Integer> getChannelSet(); 123712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 124712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills /** 125712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * Add all channels in the ScanSetting to the collection 126712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills */ 12739175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills public void addChannels(WifiScanner.ScanSettings scanSettings) { 12839175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills if (scanSettings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) { 12939175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills for (int j = 0; j < scanSettings.channels.length; ++j) { 13039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills addChannel(scanSettings.channels[j].frequency); 13139175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } 13239175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } else { 13339175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills addBand(scanSettings.band); 13439175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } 13539175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } 13639175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills 13739175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills /** 13839175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills * Add all channels in the BucketSettings to the collection 13939175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills */ 14039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills public void addChannels(WifiNative.BucketSettings bucketSettings) { 14139175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills if (bucketSettings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) { 14239175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills for (int j = 0; j < bucketSettings.channels.length; ++j) { 14339175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills addChannel(bucketSettings.channels[j].frequency); 144712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 145712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } else { 14639175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills addBand(bucketSettings.band); 147712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 148712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 149712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 150712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills /** 151216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius * Checks if all channels in ScanSetting is in the collection 152216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius */ 153216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius public boolean containsSettings(WifiScanner.ScanSettings scanSettings) { 154216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius if (scanSettings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) { 155216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius for (int j = 0; j < scanSettings.channels.length; ++j) { 156216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius if (!containsChannel(scanSettings.channels[j].frequency)) { 157216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius return false; 158216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 159216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 160216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius return true; 161216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } else { 162216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius return containsBand(scanSettings.band); 163216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 164216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 165216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius 166216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius /** 167216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius * Checks if at least some of the channels in ScanSetting is in the collection 168216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius */ 169216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius public boolean partiallyContainsSettings(WifiScanner.ScanSettings scanSettings) { 170216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius if (scanSettings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) { 171216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius for (int j = 0; j < scanSettings.channels.length; ++j) { 172216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius if (containsChannel(scanSettings.channels[j].frequency)) { 173216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius return true; 174216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 175216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 176216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius return false; 177216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } else { 178216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius return partiallyContainsBand(scanSettings.band); 179216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 180216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 181216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius 182216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius /** 183216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius * Retrieves a list of missing channels in the collection from the provided settings. 184216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius */ 185216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius public Set<Integer> getMissingChannelsFromSettings(WifiScanner.ScanSettings scanSettings) { 186216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius if (scanSettings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) { 187216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius ArraySet<Integer> missingChannels = new ArraySet<>(); 188216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius for (int j = 0; j < scanSettings.channels.length; ++j) { 189216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius if (!containsChannel(scanSettings.channels[j].frequency)) { 190216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius missingChannels.add(scanSettings.channels[j].frequency); 191216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 192216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 193216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius return missingChannels; 194216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } else { 195216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius return getMissingChannelsFromBand(scanSettings.band); 196216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 197216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 198216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius 199216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius /** 200216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius * Retrieves a list of containing channels in the collection from the provided settings. 201216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius */ 202216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius public Set<Integer> getContainingChannelsFromSettings( 203216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius WifiScanner.ScanSettings scanSettings) { 204216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius if (scanSettings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) { 205216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius ArraySet<Integer> containingChannels = new ArraySet<>(); 206216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius for (int j = 0; j < scanSettings.channels.length; ++j) { 207216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius if (containsChannel(scanSettings.channels[j].frequency)) { 208216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius containingChannels.add(scanSettings.channels[j].frequency); 209216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 210216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 211216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius return containingChannels; 212216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } else { 213216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius return getContainingChannelsFromBand(scanSettings.band); 214216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 215216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 216216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius 217216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius /** 218712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * Store the channels in this collection in the supplied BucketSettings. If maxChannels is 219712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * exceeded or a band better describes the channels then a band is specified instead of a 220712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * channel list. 221712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills */ 222712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public abstract void fillBucketSettings(WifiNative.BucketSettings bucket, int maxChannels); 22339175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills 22439175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills /** 2259dc9a8750ecd1ab25c5b4c7d17c8930ca2ffb6c3Ningyuan Wang * Gets the list of channels scan. Will either be a collection of all channels or null 2269dc9a8750ecd1ab25c5b4c7d17c8930ca2ffb6c3Ningyuan Wang * if all channels should be scanned. 22739175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills */ 2289dc9a8750ecd1ab25c5b4c7d17c8930ca2ffb6c3Ningyuan Wang public abstract Set<Integer> getScanFreqs(); 229712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 23054e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills 23154e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills 23254e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills /* 23354e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills * Utility methods for converting band/channels to strings 23454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills */ 23554e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills 23654e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills /** 23754e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills * Create a string representation of the channels in the ScanSettings. 23854e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills * If it contains a list of channels then the channels are returned, otherwise a string name of 23954e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills * the band is returned. 24054e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills */ 24154e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills public static String toString(WifiScanner.ScanSettings scanSettings) { 24254e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills if (scanSettings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) { 24354e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills return toString(scanSettings.channels); 24454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills } else { 24554e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills return toString(scanSettings.band); 24654e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills } 24754e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills } 24854e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills 24954e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills /** 25054e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills * Create a string representation of the channels in the BucketSettings. 25154e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills * If it contains a list of channels then the channels are returned, otherwise a string name of 25254e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills * the band is returned. 25354e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills */ 25454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills public static String toString(WifiNative.BucketSettings bucketSettings) { 25554e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills if (bucketSettings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) { 25654e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills return toString(bucketSettings.channels, bucketSettings.num_channels); 25754e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills } else { 25854e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills return toString(bucketSettings.band); 25954e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills } 26054e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills } 26154e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills 26254e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills private static String toString(WifiScanner.ChannelSpec[] channels) { 26354e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills if (channels == null) { 26454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills return "null"; 26554e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills } 26654e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills 26754e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills StringBuilder sb = new StringBuilder(); 26854e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills sb.append("["); 26954e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills for (int c = 0; c < channels.length; c++) { 27054e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills sb.append(channels[c].frequency); 27154e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills if (c != channels.length - 1) { 27254e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills sb.append(","); 27354e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills } 27454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills } 27554e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills sb.append("]"); 27654e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills return sb.toString(); 27754e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills } 27854e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills 27954e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills private static String toString(WifiNative.ChannelSettings[] channels, int numChannels) { 28054e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills if (channels == null) { 28154e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills return "null"; 28254e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills } 28354e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills 28454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills StringBuilder sb = new StringBuilder(); 28554e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills sb.append("["); 28654e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills for (int c = 0; c < numChannels; c++) { 28754e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills sb.append(channels[c].frequency); 28854e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills if (c != numChannels - 1) { 28954e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills sb.append(","); 29054e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills } 29154e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills } 29254e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills sb.append("]"); 29354e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills return sb.toString(); 29454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills } 29554e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills 29654e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills private static String toString(int band) { 29754e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills switch (band) { 29854e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills case WifiScanner.WIFI_BAND_UNSPECIFIED: 29954e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills return "unspecified"; 30054e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills case WifiScanner.WIFI_BAND_24_GHZ: 30154e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills return "24Ghz"; 30254e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills case WifiScanner.WIFI_BAND_5_GHZ: 30354e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills return "5Ghz (no DFS)"; 30454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills case WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY: 30554e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills return "5Ghz (DFS only)"; 30654e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills case WifiScanner.WIFI_BAND_5_GHZ_WITH_DFS: 30754e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills return "5Ghz (DFS incl)"; 30854e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills case WifiScanner.WIFI_BAND_BOTH: 30954e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills return "24Ghz & 5Ghz (no DFS)"; 31054e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills case WifiScanner.WIFI_BAND_BOTH_WITH_DFS: 31154e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills return "24Ghz & 5Ghz (DFS incl)"; 31254e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills } 31354e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills 31454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills return "invalid band"; 31554e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills } 316712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills} 317