OSDN Git Service

Support abortScan
authorDaisuke Niwa <daisuke.x.niwa@sonymobile.com>
Thu, 6 Apr 2017 10:02:15 +0000 (19:02 +0900)
committerNingyuan Wang <nywang@google.com>
Thu, 27 Apr 2017 17:34:55 +0000 (10:34 -0700)
Support to abortScan instead of "ABORT_SCAN" command of
wpa_supplicant.
When STA scan triggered by wificond is ongoing, abortScan sends
NL80211_CMD_ABORT_SCAN to kernel to stop it.

Bug: 37227357
BUg: 37743832
Test: Manual test
Change-Id: I542088e7711bd7e32a22685397af8e7f3a8ccdf7

aidl/android/net/wifi/IWifiScannerImpl.aidl
scanning/scan_utils.cpp
scanning/scan_utils.h
scanning/scanner_impl.cpp
scanning/scanner_impl.h

index ce8f5c5..145310d 100644 (file)
@@ -65,5 +65,10 @@ interface IWifiScannerImpl {
   // Returns false on failure or there is no existing scheduled scan.
   boolean stopPnoScan();
 
+  // Abort ongoing scan.
+  // Returns true on success.
+  // Returns false on failure or there is no ongoing scan.
+  boolean abortScan();
+
   // TODO(nywang) add more interfaces.
 }
index 40a4355..2a521f0 100644 (file)
@@ -303,6 +303,25 @@ bool ScanUtils::StopScheduledScan(uint32_t interface_index) {
   return true;
 }
 
+bool ScanUtils::AbortScan(uint32_t interface_index) {
+  NL80211Packet abort_scan(
+      netlink_manager_->GetFamilyId(),
+      NL80211_CMD_ABORT_SCAN,
+      netlink_manager_->GetSequenceNumber(),
+      getpid());
+
+  // Force an ACK response upon success.
+  abort_scan.AddFlag(NLM_F_ACK);
+  abort_scan.AddAttribute(
+      NL80211Attr<uint32_t>(NL80211_ATTR_IFINDEX, interface_index));
+
+  if (!netlink_manager_->SendMessageAndGetAck(abort_scan)) {
+    LOG(ERROR) << "NL80211_CMD_ABORT_SCAN failed";
+    return false;
+  }
+  return true;
+}
+
 bool ScanUtils::StartScheduledScan(
     uint32_t interface_index,
     uint32_t interval_ms,
index 72398b6..84baeec 100644 (file)
@@ -106,6 +106,10 @@ class ScanUtils {
   // 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);
+
   // 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
index fe8a554..9edd876 100644 (file)
@@ -282,6 +282,20 @@ Status ScannerImpl::stopPnoScan(bool* out_success) {
   return Status::ok();
 }
 
+Status ScannerImpl::abortScan(bool* out_success) {
+  *out_success = false;
+  if (!CheckIsValid()) {
+    return Status::ok();
+  }
+
+  if (!scan_started_) {
+    LOG(WARNING) << "Scan is not started. Ignore abort request";
+  } else if (scan_utils_->AbortScan(interface_index_)) {
+    *out_success = true;
+  }
+  return Status::ok();
+}
+
 Status ScannerImpl::subscribeScanEvents(const sp<IScanEvent>& handler) {
   if (!CheckIsValid()) {
     return Status::ok();
index d7f8728..2ca5251 100644 (file)
@@ -62,6 +62,7 @@ class ScannerImpl : public android::net::wifi::BnWifiScannerImpl {
       const ::com::android::server::wifi::wificond::PnoSettings& pno_settings,
       bool* out_success) override;
   ::android::binder::Status stopPnoScan(bool* out_success) override;
+  ::android::binder::Status abortScan(bool* out_success) override;
 
   ::android::binder::Status subscribeScanEvents(
       const ::android::sp<::android::net::wifi::IScanEvent>& handler) override;