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; 20712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Willsimport 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 that offers channel manipulation utilities when the channels in a band are not 28712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * known. Operations performed may simplify any band to include all channels. 29712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills */ 30712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Willspublic class NoBandChannelHelper extends ChannelHelper { 31712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 32798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills /** 33798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills * These parameters are used to estimate the scan duration. 34798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills * This is a guess at the number of channels the device supports for use when a ScanSettings 35798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills * specifies a band instead of a list of channels. 36798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills */ 37798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills private static final int ALL_BAND_CHANNEL_COUNT_ESTIMATE = 36; 38798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills 3939175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills @Override 4039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills public boolean settingsContainChannel(WifiScanner.ScanSettings settings, int channel) { 4139175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills if (settings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) { 4239175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills for (int i = 0; i < settings.channels.length; ++i) { 4339175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills if (settings.channels[i].frequency == channel) { 4439175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills return true; 4539175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } 4639175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } 4739175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills return false; 4839175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } else { 4939175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills return true; 5039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } 5139175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } 5239175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills 53798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills @Override 54798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills public WifiScanner.ChannelSpec[] getAvailableScanChannels(int band) { 55798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills return NO_CHANNELS; // not supported 56798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills } 57798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills 58798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills @Override 59798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills public int estimateScanDuration(WifiScanner.ScanSettings settings) { 60798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills if (settings.band == WifiScanner.WIFI_BAND_UNSPECIFIED) { 61798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills return settings.channels.length * SCAN_PERIOD_PER_CHANNEL_MS; 62798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills } else { 63798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills return ALL_BAND_CHANNEL_COUNT_ESTIMATE * SCAN_PERIOD_PER_CHANNEL_MS; 64798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills } 65798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills } 66798a997d2e5bf8b3278bfeaa7ca841394e2db4b9Mitchell Wills 67712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills /** 68712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * ChannelCollection that merges channels without knowing which channels are in each band. In 69712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * order to do this if any band is added or the maxChannels is exceeded then all channels will 70712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills * be included. 71712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills */ 72712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public class NoBandChannelCollection extends ChannelCollection { 73712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills private final ArraySet<Integer> mChannels = new ArraySet<Integer>(); 74712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills private boolean mAllChannels = false; 75712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 76712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills @Override 77712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public void addChannel(int frequency) { 78712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills mChannels.add(frequency); 79712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 80712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 81712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills @Override 82712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public void addBand(int band) { 83712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills if (band != WifiScanner.WIFI_BAND_UNSPECIFIED) { 84712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills mAllChannels = true; 85712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 86712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 87712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 88712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills @Override 8939175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills public boolean containsChannel(int channel) { 9039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills return mAllChannels || mChannels.contains(channel); 9139175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } 9239175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills 9339175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills @Override 94216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius public boolean containsBand(int band) { 95216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius if (band != WifiScanner.WIFI_BAND_UNSPECIFIED) { 96216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius return mAllChannels; 97216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 98216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius return false; 99216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 100216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius 101216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius @Override 102216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius public boolean partiallyContainsBand(int band) { 103216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius // We don't need to partially collapse settings in supplicant scanner because we 104216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius // don't have any limitation on the number of channels that can be scanned. We also 105216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius // don't currently keep track of bands very well in NoBandChannelHelper. 106216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius return false; 107216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 108216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius 109216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius @Override 11039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills public boolean isEmpty() { 11139175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills return !mAllChannels && mChannels.isEmpty(); 11239175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } 11339175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills 11439175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills @Override 1154e1f32efceee1db37bfb1e2624b434dbfb055686Mitchell Wills public boolean isAllChannels() { 1164e1f32efceee1db37bfb1e2624b434dbfb055686Mitchell Wills return mAllChannels; 1174e1f32efceee1db37bfb1e2624b434dbfb055686Mitchell Wills } 1184e1f32efceee1db37bfb1e2624b434dbfb055686Mitchell Wills 1194e1f32efceee1db37bfb1e2624b434dbfb055686Mitchell Wills @Override 120712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public void clear() { 121712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills mAllChannels = false; 122712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills mChannels.clear(); 123712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 124712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 125712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills @Override 126216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius public Set<Integer> getMissingChannelsFromBand(int band) { 127216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius // We don't need to partially collapse settings in supplicant scanner because we 128216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius // don't have any limitation on the number of channels that can be scanned. We also 129216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius // don't currently keep track of bands very well in NoBandChannelHelper. 130216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius return new ArraySet<Integer>(); 131216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 132216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius 133216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius @Override 134216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius public Set<Integer> getContainingChannelsFromBand(int band) { 135216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius // We don't need to partially collapse settings in supplicant scanner because we 136216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius // don't have any limitation on the number of channels that can be scanned. We also 137216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius // don't currently keep track of bands very well in NoBandChannelHelper. 138216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius return new ArraySet<Integer>(); 139216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 140216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius 141216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius @Override 142216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius public Set<Integer> getChannelSet() { 143216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius if (!isEmpty() && !mAllChannels) { 144216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius return mChannels; 145216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } else { 146216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius return new ArraySet<>(); 147216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 148216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius } 149216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius 150216eb45e7fb44a1ba8edc156d08b532a17219f66Roshan Pius @Override 151712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public void fillBucketSettings(WifiNative.BucketSettings bucketSettings, int maxChannels) { 152712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills if (mAllChannels || mChannels.size() > maxChannels) { 153712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills bucketSettings.band = WifiScanner.WIFI_BAND_BOTH_WITH_DFS; 154712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills bucketSettings.num_channels = 0; 155712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills bucketSettings.channels = null; 156712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } else { 157712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills bucketSettings.band = WifiScanner.WIFI_BAND_UNSPECIFIED; 158712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills bucketSettings.num_channels = mChannels.size(); 159712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills bucketSettings.channels = new WifiNative.ChannelSettings[mChannels.size()]; 160712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills for (int i = 0; i < mChannels.size(); ++i) { 161712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills WifiNative.ChannelSettings channelSettings = new WifiNative.ChannelSettings(); 162712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills channelSettings.frequency = mChannels.valueAt(i); 163712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills bucketSettings.channels[i] = channelSettings; 164712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 165712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 166712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 16739175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills 16839175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills @Override 16939175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills public Set<Integer> getSupplicantScanFreqs() { 17039175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills if (mAllChannels) { 17139175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills return null; 17239175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } else { 17339175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills return new ArraySet<Integer>(mChannels); 17439175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } 17539175cc807488dd849e2c530f8be30dd674fbd9fMitchell Wills } 176712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 177712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills 178712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills @Override 179712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public ChannelCollection createChannelCollection() { 180712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills return new NoBandChannelCollection(); 181712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills } 182712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills} 183