OSDN Git Service

Add support of randomized mac address to wificond ScanUtils
authorNingyuan Wang <nywang@google.com>
Fri, 9 Dec 2016 23:56:25 +0000 (15:56 -0800)
committerNingyuan Wang <nywang@google.com>
Fri, 20 Jan 2017 18:25:28 +0000 (10:25 -0800)
Bug: 33218723
Change-Id: I81e3507f4cc46894b8ae35f0df0814006ddc1ead
Test: compile

scanning/scan_utils.cpp
scanning/scan_utils.h
scanning/scanner_impl.cpp
tests/mock_scan_utils.h
tests/scan_utils_unittest.cpp

index 081ed65..a777e32 100644 (file)
@@ -213,13 +213,15 @@ bool ScanUtils::GetSSIDFromInfoElement(const vector<uint8_t>& ie,
   return false;
 }
 
-bool ScanUtils::StartFullScan(uint32_t interface_index) {
+bool ScanUtils::StartFullScan(uint32_t interface_index,
+                              bool request_random_mac) {
   // Using empty SSID for a wildcard scan.
   vector<vector<uint8_t>> ssids{vector<uint8_t>{0}};
-  return Scan(interface_index, ssids, vector<uint32_t>());
+  return Scan(interface_index, request_random_mac, ssids, vector<uint32_t>());
 }
 
 bool ScanUtils::Scan(uint32_t interface_index,
+                     bool request_random_mac,
                      const vector<vector<uint8_t>>& ssids,
                      const vector<uint32_t>& freqs) {
   NL80211Packet trigger_scan(
@@ -253,6 +255,11 @@ bool ScanUtils::Scan(uint32_t interface_index,
     trigger_scan.AddAttribute(freqs_attr);
   }
 
+  if (request_random_mac) {
+    trigger_scan.AddAttribute(
+        NL80211Attr<uint32_t>(NL80211_ATTR_SCAN_FLAGS,
+                              NL80211_SCAN_FLAG_RANDOM_ADDR));
+  }
   // We are receiving an ERROR/ACK message instead of the actual
   // scan results here, so it is OK to expect a timely response because
   // kernel is supposed to send the ERROR/ACK back before the scan starts.
@@ -297,6 +304,7 @@ bool ScanUtils::StartScheduledScan(
     uint32_t interface_index,
     uint32_t interval_ms,
     int32_t rssi_threshold,
+    bool request_random_mac,
     const std::vector<std::vector<uint8_t>>& scan_ssids,
     const std::vector<std::vector<uint8_t>>& match_ssids,
     const std::vector<uint32_t>& freqs) {
@@ -347,6 +355,11 @@ bool ScanUtils::StartScheduledScan(
   start_sched_scan.AddAttribute(
       NL80211Attr<uint32_t>(NL80211_ATTR_SCHED_SCAN_INTERVAL, interval_ms));
   start_sched_scan.AddAttribute(scan_match_attr);
+  if (request_random_mac) {
+    start_sched_scan.AddAttribute(
+        NL80211Attr<uint32_t>(NL80211_ATTR_SCAN_FLAGS,
+                              NL80211_SCAN_FLAG_RANDOM_ADDR));
+  }
 
   vector<unique_ptr<const NL80211Packet>> response;
   if (!netlink_manager_->SendMessageAndGetAck(start_sched_scan)) {
index da1011a..29cc7b4 100644 (file)
@@ -60,10 +60,18 @@ class ScanUtils {
 
   // Start a full scan on interface with index |interface_index|.
   // This will scan for all ssids and frequencies.
+  // |request_random_mac| is used for asking device/driver to use a random MAC
+  // address during scan.
+  // This flag should only be set if kernel supports this feature as
+  // |supports_random_mac_oneshot_scan| indicates.
   // Returns true on success.
-  virtual bool StartFullScan(uint32_t interface_index);
+  virtual bool StartFullScan(uint32_t interface_index, bool request_random_mac);
 
   // Send scan request to kernel for interface with index |interface_index|.
+  // |request_random_mac| is used for asking device/driver to use a random MAC
+  // address during scan.
+  // This flag should only be set if kernel supports this feature as
+  // |supports_random_mac_oneshot_scan| indicates.
   // |ssids| is a vector of ssids we request to scan, which mostly is used
   // for hidden networks.
   // If |ssids| is an empty vector, it will do a passive scan.
@@ -72,6 +80,7 @@ class ScanUtils {
   // If |freqs| is an empty vector, it will scan all supported frequencies.
   // Returns true on success.
   virtual bool Scan(uint32_t interface_index,
+                    bool request_random_mac,
                     const std::vector<std::vector<uint8_t>>& ssids,
                     const std::vector<uint32_t>& freqs);
 
@@ -80,6 +89,10 @@ class ScanUtils {
   // |rssi_threshold| is the minimum RSSI threshold value as a filter.
   // |scan_ssids| is a vector of ssids we request to scan, which is mostly
   // used for hidden networks.
+  // |request_random_mac| is used for asking device/driver to use a random MAC
+  // address during scan.
+  // This flag should only be set if kernel supports this feature as
+  // as |supports_random_mac_sched_scan| indicates.
   // If |scan_ssids| is an empty vector, it will do a passive scan.
   // If |scan_ssids| contains an empty string, it will a scan for all ssids.
   // |freqs| is a vector of frequencies we request to scan.
@@ -92,6 +105,7 @@ class ScanUtils {
       uint32_t interface_index,
       uint32_t interval_ms,
       int32_t rssi_threshold,
+      bool request_random_mac,
       const std::vector<std::vector<uint8_t>>& scan_ssids,
       const std::vector<std::vector<uint8_t>>& match_ssids,
       const std::vector<uint32_t>& freqs);
index 491e4a4..c976b35 100644 (file)
@@ -107,8 +107,11 @@ Status ScannerImpl::scan(const SingleScanSettings& scan_settings,
   if (!CheckIsValid()) {
     return Status::ok();
   }
+
+  bool random_mac =  wiphy_features_.supports_random_mac_oneshot_scan;
+
   if (scan_settings.is_full_scan_) {
-    if (!scan_utils_->StartFullScan(interface_index_)) {
+    if (!scan_utils_->StartFullScan(interface_index_, random_mac)) {
       *out_success = false;
       return Status::ok();
     }
@@ -124,7 +127,7 @@ Status ScannerImpl::scan(const SingleScanSettings& scan_settings,
     freqs.push_back(channel.frequency_);
   }
 
-  if (!scan_utils_->Scan(interface_index_, ssids, freqs)) {
+  if (!scan_utils_->Scan(interface_index_, random_mac, ssids, freqs)) {
     *out_success = false;
     LOG(ERROR) << "Failed to start a scan";
     return Status::ok();
index ab4a64b..0deae65 100644 (file)
@@ -29,15 +29,17 @@ class MockScanUtils : public ScanUtils {
   MockScanUtils(NetlinkManager* netlink_manager);
   ~MockScanUtils() override = default;
 
-  MOCK_METHOD1(StartFullScan, bool(
-      uint32_t interface_index));
+  MOCK_METHOD2(StartFullScan, bool(
+      uint32_t interface_index,
+      bool random_mac));
 
   MOCK_METHOD2(GetScanResult, bool(
       uint32_t interface_index,
       std::vector<::com::android::server::wifi::wificond::NativeScanResult>* out_scan_results));
 
-  MOCK_METHOD3(Scan, bool(
+  MOCK_METHOD4(Scan, bool(
       uint32_t interface_index,
+      bool random_mac,
       const std::vector<std::vector<uint8_t>>& ssids,
       const std::vector<uint32_t>& freqs));
 
index 3cfca96..527b4a3 100644 (file)
@@ -49,6 +49,7 @@ constexpr uint32_t kFakeScheduledScanIntervalMs = 20000;
 constexpr uint32_t kFakeSequenceNumber = 1984;
 constexpr int kFakeErrorCode = EIO;
 constexpr int32_t kFakeRssiThreshold = -80;
+constexpr bool kFakeUseRandomMAC = true;
 
 // Currently, control messages are only created by the kernel and sent to us.
 // Therefore NL80211Packet doesn't have corresponding constructor.
@@ -129,7 +130,7 @@ TEST_F(ScanUtilsTest, CanSendScanRequest) {
               WillOnce(Invoke(bind(
                   AppendMessageAndReturn, response, true, _1, _2)));
 
-  EXPECT_TRUE(scan_utils_.Scan(kFakeInterfaceIndex, {}, {}));
+  EXPECT_TRUE(scan_utils_.Scan(kFakeInterfaceIndex, kFakeUseRandomMAC, {}, {}));
   // TODO(b/34231420): Add validation of requested scan ssids, threshold,
   // and frequencies.
 }
@@ -142,7 +143,7 @@ TEST_F(ScanUtilsTest, CanHandleScanRequestFailure) {
           DoesNL80211PacketMatchCommand(NL80211_CMD_TRIGGER_SCAN), _)).
               WillOnce(Invoke(bind(
                   AppendMessageAndReturn, response, true, _1, _2)));
-  EXPECT_FALSE(scan_utils_.Scan(kFakeInterfaceIndex, {}, {}));
+  EXPECT_FALSE(scan_utils_.Scan(kFakeInterfaceIndex, kFakeUseRandomMAC, {}, {}));
 }
 
 TEST_F(ScanUtilsTest, CanSendSchedScanRequest) {
@@ -155,7 +156,8 @@ TEST_F(ScanUtilsTest, CanSendSchedScanRequest) {
                   AppendMessageAndReturn, response, true, _1, _2)));
   EXPECT_TRUE(scan_utils_.StartScheduledScan(
       kFakeInterfaceIndex,
-      kFakeScheduledScanIntervalMs, kFakeRssiThreshold, {}, {}, {}));
+      kFakeScheduledScanIntervalMs,
+      kFakeRssiThreshold, kFakeUseRandomMAC, {}, {}, {}));
   // TODO(b/34231420): Add validation of requested scan ssids, threshold,
   // and frequencies.
 }
@@ -170,7 +172,8 @@ TEST_F(ScanUtilsTest, CanHandleSchedScanRequestFailure) {
                   AppendMessageAndReturn, response, true, _1, _2)));
   EXPECT_FALSE(scan_utils_.StartScheduledScan(
       kFakeInterfaceIndex,
-      kFakeScheduledScanIntervalMs, kFakeRssiThreshold, {}, {}, {}));
+      kFakeScheduledScanIntervalMs,
+      kFakeRssiThreshold, kFakeUseRandomMAC, {}, {}, {}));
 }
 
 TEST_F(ScanUtilsTest, CanSendFullScanRequest) {
@@ -181,7 +184,7 @@ TEST_F(ScanUtilsTest, CanSendFullScanRequest) {
           DoesNL80211PacketMatchCommand(NL80211_CMD_TRIGGER_SCAN), _)).
               WillOnce(Invoke(bind(
                   AppendMessageAndReturn, response, true, _1, _2)));
-  EXPECT_TRUE(scan_utils_.StartFullScan(kFakeInterfaceIndex));
+  EXPECT_TRUE(scan_utils_.StartFullScan(kFakeInterfaceIndex, kFakeUseRandomMAC));
 }
 
 TEST_F(ScanUtilsTest, CanHandleFullScanRequestFailure) {
@@ -192,7 +195,7 @@ TEST_F(ScanUtilsTest, CanHandleFullScanRequestFailure) {
           DoesNL80211PacketMatchCommand(NL80211_CMD_TRIGGER_SCAN), _)).
               WillOnce(Invoke(bind(
                   AppendMessageAndReturn, response, true, _1, _2)));
-  EXPECT_FALSE(scan_utils_.StartFullScan(kFakeInterfaceIndex));
+  EXPECT_FALSE(scan_utils_.StartFullScan(kFakeInterfaceIndex, kFakeUseRandomMAC));
 }
 
 }  // namespace wificond