Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef CHRE_CORE_WIFI_SCAN_REQUEST_H_
     18 #define CHRE_CORE_WIFI_SCAN_REQUEST_H_
     19 
     20 #include <cstddef>
     21 
     22 #include "chre_api/chre/wifi.h"
     23 #include "chre/util/dynamic_vector.h"
     24 #include "chre/util/fixed_size_vector.h"
     25 #include "chre/util/time.h"
     26 
     27 namespace chre {
     28 
     29 /**
     30  * The maximum length for a Wifi SSID. This value is taken from 802.11 7.3.2.1
     31  * and can also be found in the CHRE API wifi.h.
     32  */
     33 constexpr size_t kMaxWifiSsidLength = 32;
     34 
     35 /**
     36  * This WifiScanType is designed to wrap constants provided by the CHRE API to
     37  * improve type-safety. In addition, an invalid wifi scan type is added for
     38  * handling an app that is not requesting wifi scans.
     39  */
     40 enum class WifiScanType {
     41   Invalid,
     42   Active,
     43   ActivePlusPassiveDfs,
     44   Passive
     45 };
     46 
     47 /**
     48  * Translates a CHRE API enum wifi scan type to a WifiScanType. This funciton
     49  * also performs input validation and will default to WifiScanType::Invalid if
     50  * the provided value is not a valid enumeration.
     51  *
     52  * @param enumWifiScanType A potentially unsafe CHRE API enum wifi scan type.
     53  * @return a WifiScanType given a CHRE API wifi scan type.
     54  */
     55 WifiScanType getWifiScanTypeForEnum(enum chreWifiScanType enumWifiScanType);
     56 
     57 /**
     58  * An SSID can be modelled by a list of bytes.
     59  */
     60 typedef FixedSizeVector<uint8_t, kMaxWifiSsidLength> WifiSsid;
     61 
     62 /**
     63  * Models a request for wifi scans. This class implements the API set forth by
     64  * the RequestMultiplexer container in addition to specific functionality
     65  * required for requesting wifi scans.
     66  */
     67 class WifiScanRequest {
     68  public:
     69   /**
     70    * Default constructs a wifi scan request to the minimal possible
     71    * configuration. The WifiScanType is set to Invalid and the frequency and
     72    * SSID lists are both cleared.
     73    */
     74   WifiScanRequest();
     75 
     76   /**
     77    * Constructs a request for wifi scan results given a scan type, maximum scan
     78    * age, frequencies and SSID list as specified by the CHRE API. More details
     79    * about the parameters here can be found in the CHRE API.
     80    *
     81    * @param wifiScanType The type of scan being requested.
     82    * @param maxScanAge The maximum age of a detected wifi network to be
     83    *        reported.
     84    * @param frequencies The list of frequencies to search for networks on.
     85    * @param ssids The list of SSIDs to specifically search for.
     86    */
     87   WifiScanRequest(WifiScanType wifiScanType,
     88                   const Nanoseconds& maxScanAge,
     89                   DynamicVector<uint32_t>&& frequencies,
     90                   DynamicVector<WifiSsid>&& ssids);
     91 
     92   /**
     93    * @return the type of this scan request.
     94    */
     95   WifiScanType getScanType() const;
     96 
     97   /**
     98    * @return the maximum age of a scan result for this request.
     99    */
    100   const Nanoseconds& getMaxScanAge() const;
    101 
    102   /**
    103    * @return the frequencies associated with this request.
    104    */
    105   const DynamicVector<uint32_t>& getFrequencies() const;
    106 
    107   /**
    108    * @return the SSIDs associated with this request.
    109    */
    110   const DynamicVector<WifiSsid>& getSsids() const;
    111 
    112  private:
    113   //! The type of request for this scan.
    114   WifiScanType mScanType;
    115 
    116   //! The maximum allowable age for a scan result.
    117   Nanoseconds mMaxScanAge;
    118 
    119   //! The list of frequencies associated with this scan request.
    120   DynamicVector<uint32_t> mFrequencies;
    121 
    122   //! The list of SSIDs associated with this scan request.
    123   DynamicVector<WifiSsid> mSsids;
    124 };
    125 
    126 }  // namespace chre
    127 
    128 #endif  // CHRE_CORE_WIFI_SCAN_REQUEST_H_
    129