OSDN Git Service

Change abortScan() binder API to void
[android-x86/system-connectivity-wificond.git] / scanning / scanner_impl.cpp
index 7a25777..2c1b1d0 100644 (file)
@@ -103,12 +103,12 @@ Status ScannerImpl::getAvailable2gChannels(
                                &scan_capabilities_,
                                &wiphy_features_)) {
     LOG(ERROR) << "Failed to get wiphy info from kernel";
-    *out_frequencies = nullptr;
+    out_frequencies->reset(nullptr);
     return Status::ok();
   }
 
-  **out_frequencies = vector<int32_t>(band_info.band_2g.begin(),
-                                      band_info.band_2g.end());
+  out_frequencies->reset(new vector<int32_t>(band_info.band_2g.begin(),
+                                             band_info.band_2g.end()));
   return Status::ok();
 }
 
@@ -123,12 +123,12 @@ Status ScannerImpl::getAvailable5gNonDFSChannels(
                                &scan_capabilities_,
                                &wiphy_features_)) {
     LOG(ERROR) << "Failed to get wiphy info from kernel";
-    *out_frequencies = nullptr;
+    out_frequencies->reset(nullptr);
     return Status::ok();
   }
 
-  **out_frequencies = vector<int32_t>(band_info.band_5g.begin(),
-                                      band_info.band_5g.end());
+  out_frequencies->reset(new vector<int32_t>(band_info.band_5g.begin(),
+                                             band_info.band_5g.end()));
   return Status::ok();
 }
 
@@ -143,12 +143,12 @@ Status ScannerImpl::getAvailableDFSChannels(
                                &scan_capabilities_,
                                &wiphy_features_)) {
     LOG(ERROR) << "Failed to get wiphy info from kernel";
-    *out_frequencies = nullptr;
+    out_frequencies->reset(nullptr);
     return Status::ok();
   }
 
-  **out_frequencies = vector<int32_t>(band_info.band_dfs.begin(),
-                                      band_info.band_dfs.end());
+  out_frequencies->reset(new vector<int32_t>(band_info.band_dfs.begin(),
+                                             band_info.band_dfs.end()));
   return Status::ok();
 }
 
@@ -165,6 +165,7 @@ Status ScannerImpl::getScanResults(vector<NativeScanResult>* out_scan_results) {
 Status ScannerImpl::scan(const SingleScanSettings& scan_settings,
                          bool* out_success) {
   if (!CheckIsValid()) {
+    *out_success = false;
     return Status::ok();
   }
 
@@ -177,15 +178,18 @@ Status ScannerImpl::scan(const SingleScanSettings& scan_settings,
 
   // Initialize it with an empty ssid for a wild card scan.
   vector<vector<uint8_t>> ssids = {{}};
+
+  vector<vector<uint8_t>> skipped_scan_ssids;
   for (auto& network : scan_settings.hidden_networks_) {
     if (ssids.size() + 1 > scan_capabilities_.max_num_scan_ssids) {
-      LOG(WARNING) << "Skip scan ssid for single scan: "
-                   << string(network.ssid_.begin(), network.ssid_.end());
+      skipped_scan_ssids.emplace_back(network.ssid_);
       continue;
     }
     ssids.push_back(network.ssid_);
   }
 
+  LogSsidList(skipped_scan_ssids, "Skip scan ssid for single scan");
+
   vector<uint32_t> freqs;
   for (auto& channel : scan_settings.channel_settings_) {
     freqs.push_back(channel.frequency_);
@@ -203,6 +207,7 @@ Status ScannerImpl::scan(const SingleScanSettings& scan_settings,
 Status ScannerImpl::startPnoScan(const PnoSettings& pno_settings,
                                  bool* out_success) {
   if (!CheckIsValid()) {
+    *out_success = false;
     return Status::ok();
   }
   if (pno_scan_started_) {
@@ -214,25 +219,28 @@ Status ScannerImpl::startPnoScan(const PnoSettings& pno_settings,
   // Empty frequency list: scan all frequencies.
   vector<uint32_t> freqs;
 
+  vector<vector<uint8_t>> skipped_scan_ssids;
+  vector<vector<uint8_t>> skipped_match_ssids;
   for (auto& network : pno_settings.pno_networks_) {
     // Add hidden network ssid.
     if (network.is_hidden_) {
       if (scan_ssids.size() + 1 > scan_capabilities_.max_num_sched_scan_ssids) {
-        LOG(WARNING) << "Skip scan ssid for pno scan: "
-                     << string(network.ssid_.begin(), network.ssid_.end());
+        skipped_scan_ssids.emplace_back(network.ssid_);
         continue;
       }
       scan_ssids.push_back(network.ssid_);
     }
 
     if (match_ssids.size() + 1 > scan_capabilities_.max_match_sets) {
-      LOG(WARNING) << "Skip match ssid for pno scan: "
-                   << string(network.ssid_.begin(), network.ssid_.end());
+      skipped_match_ssids.emplace_back(network.ssid_);
       continue;
     }
     match_ssids.push_back(network.ssid_);
   }
 
+  LogSsidList(skipped_scan_ssids, "Skip scan ssid for pno scan");
+  LogSsidList(skipped_match_ssids, "Skip match ssid for pno scan");
+
   // Only request MAC address randomization when station is not associated.
   bool request_random_mac = wiphy_features_.supports_random_mac_sched_scan &&
       !client_interface_->IsAssociated();
@@ -240,15 +248,16 @@ Status ScannerImpl::startPnoScan(const PnoSettings& pno_settings,
   if (!scan_utils_->StartScheduledScan(interface_index_,
                                        pno_settings.interval_ms_,
                                        // TODO: honor both rssi thresholds.
-                                       pno_settings.min_2g_rssi_,
+                                       pno_settings.min_5g_rssi_,
                                        request_random_mac,
                                        scan_ssids,
                                        match_ssids,
                                        freqs)) {
     *out_success = false;
-    LOG(ERROR) << "Failed to start scheduled scan";
+    LOG(ERROR) << "Failed to start pno scan";
     return Status::ok();
   }
+  LOG(INFO) << "Pno scan started";
   pno_scan_started_ = true;
   *out_success = true;
   return Status::ok();
@@ -256,6 +265,7 @@ Status ScannerImpl::startPnoScan(const PnoSettings& pno_settings,
 
 Status ScannerImpl::stopPnoScan(bool* out_success) {
   if (!CheckIsValid()) {
+    *out_success = false;
     return Status::ok();
   }
 
@@ -266,11 +276,27 @@ Status ScannerImpl::stopPnoScan(bool* out_success) {
     *out_success = false;
     return Status::ok();
   }
+  LOG(INFO) << "Pno scan stopped";
   pno_scan_started_ = false;
   *out_success = true;
   return Status::ok();
 }
 
+Status ScannerImpl::abortScan() {
+  if (!CheckIsValid()) {
+    return Status::ok();
+  }
+
+  if (!scan_started_) {
+    LOG(WARNING) << "Scan is not started. Ignore abort request";
+    return Status::ok();
+  }
+  if (!scan_utils_->AbortScan(interface_index_)) {
+    LOG(WARNING) << "Abort scan failed";
+  }
+  return Status::ok();
+}
+
 Status ScannerImpl::subscribeScanEvents(const sp<IScanEvent>& handler) {
   if (!CheckIsValid()) {
     return Status::ok();
@@ -314,7 +340,9 @@ void ScannerImpl::OnScanResultsReady(
     bool aborted,
     vector<vector<uint8_t>>& ssids,
     vector<uint32_t>& frequencies) {
-  LOG(INFO) << "Received scan result notification from kernel.";
+  if (!scan_started_) {
+    LOG(INFO) << "Received external scan result notification from kernel.";
+  }
   scan_started_ = false;
   if (scan_event_handler_ != nullptr) {
     // TODO: Pass other parameters back once we find framework needs them.
@@ -337,14 +365,31 @@ void ScannerImpl::OnSchedScanResultsReady(uint32_t interface_index,
       // This stop notification might result from our own request.
       // See the document for NL80211_CMD_SCHED_SCAN_STOPPED in nl80211.h.
       if (pno_scan_started_) {
+        LOG(WARNING) << "Unexpected pno scan stopped event";
         pno_scan_event_handler_->OnPnoScanFailed();
       }
       pno_scan_started_ = false;
     } else {
+      LOG(INFO) << "Pno scan result ready event";
       pno_scan_event_handler_->OnPnoNetworkFound();
     }
   }
 }
 
+void ScannerImpl::LogSsidList(vector<vector<uint8_t>>& ssid_list,
+                              string prefix) {
+  if (ssid_list.empty()) {
+    return;
+  }
+  string ssid_list_string;
+  for (auto& ssid : ssid_list) {
+    ssid_list_string += string(ssid.begin(), ssid.end());
+    if (&ssid != &ssid_list.back()) {
+      ssid_list_string += ", ";
+    }
+  }
+  LOG(WARNING) << prefix << ": " << ssid_list_string;
+}
+
 }  // namespace wificond
 }  // namespace android