diff options
author | Daisuke Niwa | 2017-04-06 05:02:15 -0500 |
---|---|---|
committer | Ningyuan Wang | 2017-04-27 12:34:55 -0500 |
commit | 33bbb8147436c2abf8f3e7b535b13b6c63bd3c64 (patch) | |
tree | ef92a5a6570618fffd7eed237632f0ced58a047b /scanning | |
parent | 6b9d3875d970c62f841fc25a97340b56be2a210b (diff) | |
download | system-connectivity-wificond-33bbb8147436c2abf8f3e7b535b13b6c63bd3c64.tar.gz system-connectivity-wificond-33bbb8147436c2abf8f3e7b535b13b6c63bd3c64.tar.xz system-connectivity-wificond-33bbb8147436c2abf8f3e7b535b13b6c63bd3c64.zip |
Support abortScan
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
Diffstat (limited to 'scanning')
-rw-r--r-- | scanning/scan_utils.cpp | 19 | ||||
-rw-r--r-- | scanning/scan_utils.h | 4 | ||||
-rw-r--r-- | scanning/scanner_impl.cpp | 14 | ||||
-rw-r--r-- | scanning/scanner_impl.h | 1 |
4 files changed, 38 insertions, 0 deletions
diff --git a/scanning/scan_utils.cpp b/scanning/scan_utils.cpp index 40a4355..2a521f0 100644 --- a/scanning/scan_utils.cpp +++ b/scanning/scan_utils.cpp | |||
@@ -303,6 +303,25 @@ bool ScanUtils::StopScheduledScan(uint32_t interface_index) { | |||
303 | return true; | 303 | return true; |
304 | } | 304 | } |
305 | 305 | ||
306 | bool ScanUtils::AbortScan(uint32_t interface_index) { | ||
307 | NL80211Packet abort_scan( | ||
308 | netlink_manager_->GetFamilyId(), | ||
309 | NL80211_CMD_ABORT_SCAN, | ||
310 | netlink_manager_->GetSequenceNumber(), | ||
311 | getpid()); | ||
312 | |||
313 | // Force an ACK response upon success. | ||
314 | abort_scan.AddFlag(NLM_F_ACK); | ||
315 | abort_scan.AddAttribute( | ||
316 | NL80211Attr<uint32_t>(NL80211_ATTR_IFINDEX, interface_index)); | ||
317 | |||
318 | if (!netlink_manager_->SendMessageAndGetAck(abort_scan)) { | ||
319 | LOG(ERROR) << "NL80211_CMD_ABORT_SCAN failed"; | ||
320 | return false; | ||
321 | } | ||
322 | return true; | ||
323 | } | ||
324 | |||
306 | bool ScanUtils::StartScheduledScan( | 325 | bool ScanUtils::StartScheduledScan( |
307 | uint32_t interface_index, | 326 | uint32_t interface_index, |
308 | uint32_t interval_ms, | 327 | uint32_t interval_ms, |
diff --git a/scanning/scan_utils.h b/scanning/scan_utils.h index 72398b6..84baeec 100644 --- a/scanning/scan_utils.h +++ b/scanning/scan_utils.h | |||
@@ -106,6 +106,10 @@ class ScanUtils { | |||
106 | // Returns false on error or when there is no scheduled scan running. | 106 | // Returns false on error or when there is no scheduled scan running. |
107 | virtual bool StopScheduledScan(uint32_t interface_index); | 107 | virtual bool StopScheduledScan(uint32_t interface_index); |
108 | 108 | ||
109 | // Abort ongoing single scan on interface with index |interface_index|. | ||
110 | // Returns true on success. | ||
111 | virtual bool AbortScan(uint32_t interface_index); | ||
112 | |||
109 | // Sign up to be notified when new scan results are available. | 113 | // Sign up to be notified when new scan results are available. |
110 | // |handler| will be called when the kernel signals to wificond that a scan | 114 | // |handler| will be called when the kernel signals to wificond that a scan |
111 | // has been completed on the given |interface_index|. See the declaration of | 115 | // has been completed on the given |interface_index|. See the declaration of |
diff --git a/scanning/scanner_impl.cpp b/scanning/scanner_impl.cpp index fe8a554..9edd876 100644 --- a/scanning/scanner_impl.cpp +++ b/scanning/scanner_impl.cpp | |||
@@ -282,6 +282,20 @@ Status ScannerImpl::stopPnoScan(bool* out_success) { | |||
282 | return Status::ok(); | 282 | return Status::ok(); |
283 | } | 283 | } |
284 | 284 | ||
285 | Status ScannerImpl::abortScan(bool* out_success) { | ||
286 | *out_success = false; | ||
287 | if (!CheckIsValid()) { | ||
288 | return Status::ok(); | ||
289 | } | ||
290 | |||
291 | if (!scan_started_) { | ||
292 | LOG(WARNING) << "Scan is not started. Ignore abort request"; | ||
293 | } else if (scan_utils_->AbortScan(interface_index_)) { | ||
294 | *out_success = true; | ||
295 | } | ||
296 | return Status::ok(); | ||
297 | } | ||
298 | |||
285 | Status ScannerImpl::subscribeScanEvents(const sp<IScanEvent>& handler) { | 299 | Status ScannerImpl::subscribeScanEvents(const sp<IScanEvent>& handler) { |
286 | if (!CheckIsValid()) { | 300 | if (!CheckIsValid()) { |
287 | return Status::ok(); | 301 | return Status::ok(); |
diff --git a/scanning/scanner_impl.h b/scanning/scanner_impl.h index d7f8728..2ca5251 100644 --- a/scanning/scanner_impl.h +++ b/scanning/scanner_impl.h | |||
@@ -62,6 +62,7 @@ class ScannerImpl : public android::net::wifi::BnWifiScannerImpl { | |||
62 | const ::com::android::server::wifi::wificond::PnoSettings& pno_settings, | 62 | const ::com::android::server::wifi::wificond::PnoSettings& pno_settings, |
63 | bool* out_success) override; | 63 | bool* out_success) override; |
64 | ::android::binder::Status stopPnoScan(bool* out_success) override; | 64 | ::android::binder::Status stopPnoScan(bool* out_success) override; |
65 | ::android::binder::Status abortScan(bool* out_success) override; | ||
65 | 66 | ||
66 | ::android::binder::Status subscribeScanEvents( | 67 | ::android::binder::Status subscribeScanEvents( |
67 | const ::android::sp<::android::net::wifi::IScanEvent>& handler) override; | 68 | const ::android::sp<::android::net::wifi::IScanEvent>& handler) override; |