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
// 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.
}
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,
// 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
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();
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;