211 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*
 | |
|  * Copyright (C) 2016 The Android Open Source Project
 | |
|  *
 | |
|  * Licensed under the Apache License, Version 2.0 (the "License");
 | |
|  * you may not use this file except in compliance with the License.
 | |
|  * You may obtain a copy of the License at
 | |
|  *
 | |
|  *      http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing, software
 | |
|  * distributed under the License is distributed on an "AS IS" BASIS,
 | |
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|  * See the License for the specific language governing permissions and
 | |
|  * limitations under the License.
 | |
|  */
 | |
| 
 | |
| #ifndef WIFICOND_SCANNING_SCAN_UTILS_H_
 | |
| #define WIFICOND_SCANNING_SCAN_UTILS_H_
 | |
| 
 | |
| #include <memory>
 | |
| #include <vector>
 | |
| 
 | |
| #include <android-base/macros.h>
 | |
| 
 | |
| #include "wificond/net/netlink_manager.h"
 | |
| 
 | |
| namespace android {
 | |
| namespace net {
 | |
| namespace wifi {
 | |
| namespace nl80211 {
 | |
| 
 | |
| class NativeScanResult;
 | |
| class RadioChainInfo;
 | |
| 
 | |
| }  // namespace nl80211
 | |
| }  // namespace wifi
 | |
| }  // namespace net
 | |
| }  // namespace android
 | |
| 
 | |
| namespace android {
 | |
| namespace wificond {
 | |
| 
 | |
| class NL80211NestedAttr;
 | |
| class NL80211Packet;
 | |
| 
 | |
| struct SchedScanIntervalSetting {
 | |
|   struct ScanPlan {
 | |
|     uint32_t interval_ms;
 | |
|     uint32_t n_iterations;
 | |
|   };
 | |
|   std::vector<ScanPlan> plans;
 | |
|   // After |plans| has been exhausted, scan at every
 | |
|   // |final_interval_ms|.
 | |
|   uint32_t final_interval_ms{0};
 | |
| };
 | |
| 
 | |
| struct SchedScanReqFlags {
 | |
|   bool request_random_mac;
 | |
|   bool request_low_power;
 | |
|   bool request_sched_scan_relative_rssi;
 | |
| };
 | |
| 
 | |
| // Provides scanning helper functions.
 | |
| class ScanUtils {
 | |
|  public:
 | |
|   explicit ScanUtils(NetlinkManager* netlink_manager);
 | |
|   virtual ~ScanUtils();
 | |
| 
 | |
|   // Send 'get scan results' request to kernel and get the latest scan results.
 | |
|   // |interface_index| is the index of interface we want to get scan results
 | |
|   // from.
 | |
|   // A vector of ScanResult object will be returned by |*out_scan_results|.
 | |
|   // Returns true on success.
 | |
|   virtual bool GetScanResult(
 | |
|       uint32_t interface_index,
 | |
|       std::vector<android::net::wifi::nl80211::NativeScanResult>* out_scan_results);
 | |
| 
 | |
|   // Send scan request to kernel for interface with index |interface_index|.
 | |
|   // - |request_random_mac| If true, request device/driver to use a random MAC
 | |
|   // address during scan. Requires |supports_random_mac_sched_scan|
 | |
|   // address during scan.
 | |
|   // - |scan_type| Type of scan to perform. One of,
 | |
|   // |SCAN_TYPE_LOW_SPAN| (prioritize to reduce latency over other scan
 | |
|   // performance attributes),
 | |
|   // |SCAN_TYPE_LOW_POWER| (prioritize to reduce power consumption over other
 | |
|   // scan performance attributes),
 | |
|   // |SCAN_TYPE_HIGH_ACCURACY| (prioritize to increase accuracy over other scan
 | |
|   // performance atrributes) OR
 | |
|   // |SCAN_TYPE_DEFAULT| (no prioritization).
 | |
|   // - |enable_6ghz_rnr| Whether to scan for collocated 6Ghz APs reported by by 2.4/5Ghz APs.
 | |
|   // - |ssids| is a vector of ssids we request to scan, which mostly is used
 | |
|   // for hidden networks.
 | |
|   // If |ssids| is an empty vector, it will do a passive scan.
 | |
|   // If |ssids| contains an empty string, it will a scan for all ssids.
 | |
|   // - |freqs| is a vector of frequencies we request to scan.
 | |
|   // If |freqs| is an empty vector, it will scan all supported frequencies.
 | |
|   // - |error_code| contains the errno kernel replied when this returns false.
 | |
|   // Returns true on success.
 | |
|   virtual bool Scan(uint32_t interface_index,
 | |
|                     bool request_random_mac,
 | |
|                     int scan_type,
 | |
|                     bool enable_6ghz_rnr,
 | |
|                     const std::vector<std::vector<uint8_t>>& ssids,
 | |
|                     const std::vector<uint32_t>& freqs,
 | |
|                     int* error_code);
 | |
| 
 | |
|   // Send scan request to kernel for interface with index |interface_index|.
 | |
|   // - |inteval_ms| is the expected scan interval in milliseconds.
 | |
|   // - |rssi_threshold_2g| is the minimum RSSI threshold value as a filter for
 | |
|   // 2GHz band.
 | |
|   // - |rssi_threshold_5g| is the minimum RSSI threshold value as a filter for
 | |
|   // 5GHz band.
 | |
|   // - |scan_ssids| is a vector of ssids we request to scan, which is mostly
 | |
|   // used for hidden networks.
 | |
|   // - |request_random_mac| If true, request device/driver to use a random MAC
 | |
|   // address during scan. Requires |supports_random_mac_sched_scan|
 | |
|   // - |request_low_power|: If true, prioritize power consumption over
 | |
|   // other scan performance attributes.
 | |
|   // Requires |supports_low_power_oneshot_scan|.
 | |
|   // - |request_sched_scan_relative_rssi| is sched_scan flag for better BSS's from connected BSS.
 | |
|   // If |request_sched_scan_relative_rssi| is true, it will fill scan rssi adjust to
 | |
|   // get BSS's with better RSSI from connected BSS.
 | |
|   // - |scan_ssids| is the list of ssids to actively scan for.
 | |
|   // If |scan_ssids| is an empty vector, it will do a passive scan.
 | |
|   // If |scan_ssids| contains an empty string, it will a scan for all ssids.
 | |
|   // - |match_ssids| is the list of ssids that we want to add as filters.
 | |
|   // - |freqs| is a vector of frequencies we request to scan.
 | |
|   // If |freqs| is an empty vector, it will scan all supported frequencies.
 | |
|   // - |error_code| contains the errno kernel replied when this returns false.
 | |
|   // Only BSSs match the |match_ssids| and |rssi_threshold| will be returned as
 | |
|   // scan results.
 | |
|   // Returns true on success.
 | |
|   virtual bool StartScheduledScan(
 | |
|       uint32_t interface_index,
 | |
|       const SchedScanIntervalSetting& interval_setting,
 | |
|       int32_t rssi_threshold_2g,
 | |
|       int32_t rssi_threshold_5g,
 | |
|       int32_t rssi_threshold_6g,
 | |
|       const SchedScanReqFlags& req_flags,
 | |
|       const std::vector<std::vector<uint8_t>>& scan_ssids,
 | |
|       const std::vector<std::vector<uint8_t>>& match_ssids,
 | |
|       const std::vector<uint32_t>& freqs,
 | |
|       int* error_code);
 | |
| 
 | |
|   // Stop existing scheduled scan on interface with index |interface_index|.
 | |
|   // Returns true on success.
 | |
|   // Returns false on error or when there is no scheduled scan running.
 | |
|   virtual bool StopScheduledScan(uint32_t interface_index);
 | |
| 
 | |
|   // Abort ongoing single scan on interface with index |interface_index|.
 | |
|   // Returns true on success.
 | |
|   virtual bool AbortScan(uint32_t interface_index);
 | |
| 
 | |
|   // Visible for testing.
 | |
|   // Get a timestamp for the scan result |bss| represents.
 | |
|   // This timestamp records the time passed since boot when last time the
 | |
|   // AP was seen.
 | |
|   virtual bool GetBssTimestampForTesting(
 | |
|       const NL80211NestedAttr& bss,
 | |
|        uint64_t* last_seen_since_boot_microseconds);
 | |
| 
 | |
|   // Sign up to be notified when new scan results are available.
 | |
|   // |handler| will be called when the kernel signals to wificond that a scan
 | |
|   // has been completed on the given |interface_index|.  See the declaration of
 | |
|   // OnScanResultsReadyHandler for documentation on the semantics of this
 | |
|   // callback.
 | |
|   virtual void SubscribeScanResultNotification(
 | |
|       uint32_t interface_index,
 | |
|       OnScanResultsReadyHandler handler);
 | |
| 
 | |
|   // Cancel the sign-up of receiving new scan result notification from
 | |
|   // interface with index |interface_index|.
 | |
|   virtual void UnsubscribeScanResultNotification(uint32_t interface_index);
 | |
| 
 | |
|   // Sign up to be notified when new scan results are available.
 | |
|   // |handler| will be called when the kernel signals to wificond that a
 | |
|   // scheduled scan has been completed on the given |interface_index|.
 | |
|   // See the declaration of OnSchedScanResultsReadyHandler for documentation
 | |
|   // on the semantics of this callback.
 | |
|   virtual void SubscribeSchedScanResultNotification(
 | |
|       uint32_t interface_index,
 | |
|       OnSchedScanResultsReadyHandler handler);
 | |
| 
 | |
|   // Cancel the sign-up of receiving new scheduled scan result notification from
 | |
|   // interface with index |interface_index|.
 | |
|   virtual void UnsubscribeSchedScanResultNotification(uint32_t interface_index);
 | |
| 
 | |
|  private:
 | |
|   bool GetBssTimestamp(const NL80211NestedAttr& bss,
 | |
|                        uint64_t* last_seen_since_boot_microseconds);
 | |
|   bool ParseRadioChainInfos(
 | |
|       const NL80211NestedAttr& bss,
 | |
|       std::vector<android::net::wifi::nl80211::RadioChainInfo>
 | |
|         *radio_chain_infos);
 | |
|   bool GetSSIDFromInfoElement(const std::vector<uint8_t>& ie,
 | |
|                               std::vector<uint8_t>* ssid);
 | |
|   // Converts a NL80211_CMD_NEW_SCAN_RESULTS packet to a ScanResult object.
 | |
|   bool ParseScanResult(
 | |
|       std::unique_ptr<const NL80211Packet> packet,
 | |
|       android::net::wifi::nl80211::NativeScanResult* scan_result);
 | |
| 
 | |
|   NetlinkManager* netlink_manager_;
 | |
| 
 | |
|   DISALLOW_COPY_AND_ASSIGN(ScanUtils);
 | |
| };
 | |
| 
 | |
| }  // namespace wificond
 | |
| }  // namespace android
 | |
| 
 | |
| #endif  // WIFICOND_SCANNING_SCAN_UTILS_H_
 |