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