Home | History | Annotate | Download | only in offload
      1 /*
      2  * Copyright (C) 2016 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 #include "wificond/scanning/offload/offload_scan_utils.h"
     17 
     18 #include <android-base/logging.h>
     19 #include <utils/Timers.h>
     20 
     21 #include "wificond/scanning/offload/scan_stats.h"
     22 #include "wificond/scanning/scan_result.h"
     23 
     24 using ::com::android::server::wifi::wificond::NativeScanResult;
     25 using ::com::android::server::wifi::wificond::NativeScanStats;
     26 using android::hardware::wifi::offload::V1_0::ScanResult;
     27 using android::hardware::wifi::offload::V1_0::ScanParam;
     28 using android::hardware::wifi::offload::V1_0::ScanFilter;
     29 using android::hardware::wifi::offload::V1_0::ScanStats;
     30 using android::hardware::wifi::offload::V1_0::NetworkInfo;
     31 using android::hardware::hidl_vec;
     32 using std::vector;
     33 
     34 namespace android {
     35 namespace wificond {
     36 
     37 bool OffloadScanUtils::convertToNativeScanResults(
     38     const vector<ScanResult>& scan_result,
     39     vector<NativeScanResult>* native_scan_result) {
     40   if (native_scan_result == nullptr) return false;
     41   for (size_t i = 0; i < scan_result.size(); i++) {
     42     NativeScanResult single_scan_result;
     43     single_scan_result.ssid.assign(scan_result[i].networkInfo.ssid.begin(),
     44                                    scan_result[i].networkInfo.ssid.end());
     45     for (size_t j = 0; j < scan_result[i].bssid.elementCount(); j++) {
     46       single_scan_result.bssid.push_back(scan_result[i].bssid[j]);
     47     }
     48     single_scan_result.frequency = scan_result[i].frequency;
     49     single_scan_result.signal_mbm = scan_result[i].rssi;
     50     single_scan_result.tsf = systemTime(SYSTEM_TIME_MONOTONIC) / 1000;
     51     single_scan_result.capability = scan_result[i].capability;
     52     single_scan_result.associated = false;
     53     native_scan_result->push_back(std::move(single_scan_result));
     54   }
     55   return true;
     56 }
     57 
     58 ScanParam OffloadScanUtils::createScanParam(
     59     const vector<vector<uint8_t>>& ssid_list,
     60     const vector<uint32_t>& frequency_list, uint32_t scan_interval_ms) {
     61   ScanParam scan_param;
     62   scan_param.disconnectedModeScanIntervalMs = scan_interval_ms;
     63   scan_param.frequencyList = frequency_list;
     64   vector<hidl_vec<uint8_t>> ssid_list_tmp;
     65   for (const auto& ssid : ssid_list) {
     66     ssid_list_tmp.push_back(ssid);
     67   }
     68   scan_param.ssidList = ssid_list_tmp;
     69   return scan_param;
     70 }
     71 
     72 ScanFilter OffloadScanUtils::createScanFilter(
     73     const vector<vector<uint8_t>>& ssids, const vector<uint8_t>& flags,
     74     int8_t rssi_threshold) {
     75   ScanFilter scan_filter;
     76   vector<NetworkInfo> nw_info_list;
     77   size_t i = 0;
     78   scan_filter.rssiThreshold = rssi_threshold;
     79   // Note that the number of ssids should match the number of security flags
     80   for (const auto& ssid : ssids) {
     81     NetworkInfo nw_info;
     82     nw_info.ssid = ssid;
     83     if (i < flags.size()) {
     84       nw_info.flags = flags[i++];
     85     } else {
     86       continue;
     87     }
     88     nw_info_list.push_back(nw_info);
     89   }
     90   scan_filter.preferredNetworkInfoList = nw_info_list;
     91   return scan_filter;
     92 }
     93 
     94 NativeScanStats OffloadScanUtils::convertToNativeScanStats(
     95     const ScanStats& scanStats) {
     96   uint32_t num_channels_scanned = 0;
     97   uint32_t scan_duration_ms = 0;
     98   vector<uint8_t> histogram_channels;
     99 
    100   for (size_t i = 0; i < scanStats.scanRecord.size(); i++) {
    101     scan_duration_ms += scanStats.scanRecord[i].durationMs;
    102     num_channels_scanned += scanStats.scanRecord[i].numChannelsScanned;
    103   }
    104   for (size_t i = 0; i < scanStats.histogramChannelsScanned.size(); i++) {
    105     histogram_channels.push_back(scanStats.histogramChannelsScanned[i]);
    106   }
    107 
    108   NativeScanStats native_scan_stats(
    109       scanStats.numScansRequestedByWifi, scanStats.numScansServicedByWifi,
    110       scanStats.subscriptionDurationMs, scan_duration_ms, num_channels_scanned,
    111       histogram_channels);
    112   return native_scan_stats;
    113 }
    114 
    115 }  // namespace wificond
    116 }  // namespace android
    117