summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVeerendranath Jakkam <vjakkam@codeaurora.org>2019-05-13 19:00:55 +0530
committerVeerendranath Jakkam <vjakkam@codeaurora.org>2019-05-21 12:49:53 +0000
commitd6510747191286af2784f7789b804071e53e268c (patch)
tree2cbda45276a3ce903bd85bf08cb112f30e5de8e6
parentcace2447b38fd25f642ea3f3ba34d570e1941c57 (diff)
Generate unique random mac address per AP interface
As per default design only single random MAC address can be generated and it is getting used for standalone SAP interface. But this approach is not valid in case of dual SAP. In dual SAP case as two interfaces can't use same MAC address, second SAP interface failing to come up with the random MAC address instead coming up with factory MAC address though MAC randomization enabled for SAP. This commit is to generate different random MAC address per SAP interface. Current maximum possible no.of active interfaces are limited five, So limited no.of random MAC addresses size also to five. Change-Id: Ia3cafa39917e758e0c25daaa31225114e60a9f5f CRs-fixed: 2449166
-rw-r--r--wifi/1.3/default/wifi_chip.cpp1
-rw-r--r--wifi/1.3/default/wifi_iface_util.cpp22
-rw-r--r--wifi/1.3/default/wifi_iface_util.h8
3 files changed, 25 insertions, 6 deletions
diff --git a/wifi/1.3/default/wifi_chip.cpp b/wifi/1.3/default/wifi_chip.cpp
index da83800ea1..09c105f741 100644
--- a/wifi/1.3/default/wifi_chip.cpp
+++ b/wifi/1.3/default/wifi_chip.cpp
@@ -801,6 +801,7 @@ std::pair<WifiStatus, sp<IWifiApIface>> WifiChip::createApIfaceInternal() {
}
iface_created = true;
}
+ iface_util_.lock()->setRandomMacAddressIndex(ap_ifaces_.size());
sp<WifiApIface> iface =
new WifiApIface(ifname, legacy_hal_, iface_util_, feature_flags_);
ap_ifaces_.push_back(iface);
diff --git a/wifi/1.3/default/wifi_iface_util.cpp b/wifi/1.3/default/wifi_iface_util.cpp
index 5d61271410..df5ab2a6fa 100644
--- a/wifi/1.3/default/wifi_iface_util.cpp
+++ b/wifi/1.3/default/wifi_iface_util.cpp
@@ -39,7 +39,10 @@ namespace V1_3 {
namespace implementation {
namespace iface_util {
-WifiIfaceUtil::WifiIfaceUtil() : random_mac_address_(nullptr) {}
+WifiIfaceUtil::WifiIfaceUtil() : random_mac_address_index_(0) {
+ for (int i=0; i < MAX_RANDOM_MAC_ADDR_INDEX; i++)
+ random_mac_address_[i] = nullptr;
+}
std::array<uint8_t, 6> WifiIfaceUtil::getFactoryMacAddress(
const std::string& iface_name) {
@@ -64,13 +67,22 @@ bool WifiIfaceUtil::setMacAddress(const std::string& iface_name,
return true;
}
+void WifiIfaceUtil::setRandomMacAddressIndex(int idx) {
+ if (idx >= MAX_RANDOM_MAC_ADDR_INDEX) {
+ LOG(ERROR) << "Requested random mac address index crossed max limit!!";
+ return;
+ }
+
+ random_mac_address_index_ = idx;
+}
+
std::array<uint8_t, 6> WifiIfaceUtil::getOrCreateRandomMacAddress() {
- if (random_mac_address_) {
- return *random_mac_address_.get();
+ if (random_mac_address_[random_mac_address_index_]) {
+ return *random_mac_address_[random_mac_address_index_].get();
}
- random_mac_address_ =
+ random_mac_address_[random_mac_address_index_] =
std::make_unique<std::array<uint8_t, 6>>(createRandomMacAddress());
- return *random_mac_address_.get();
+ return *random_mac_address_[random_mac_address_index_].get();
}
std::array<uint8_t, 6> WifiIfaceUtil::createRandomMacAddress() {
diff --git a/wifi/1.3/default/wifi_iface_util.h b/wifi/1.3/default/wifi_iface_util.h
index b2382344ed..35677989eb 100644
--- a/wifi/1.3/default/wifi_iface_util.h
+++ b/wifi/1.3/default/wifi_iface_util.h
@@ -17,6 +17,8 @@
#ifndef WIFI_IFACE_UTIL_H_
#define WIFI_IFACE_UTIL_H_
+#define MAX_RANDOM_MAC_ADDR_INDEX 5
+
#include <wifi_system/interface_tool.h>
#include <android/hardware/wifi/1.0/IWifi.h>
@@ -45,11 +47,15 @@ class WifiIfaceUtil {
// daemon. (So, changes on every reboot)
virtual std::array<uint8_t, 6> getOrCreateRandomMacAddress();
+ virtual void setRandomMacAddressIndex(int idx);
+
private:
std::array<uint8_t, 6> createRandomMacAddress();
wifi_system::InterfaceTool iface_tool_;
- std::unique_ptr<std::array<uint8_t, 6>> random_mac_address_;
+ std::unique_ptr<std::array<uint8_t, 6>> random_mac_address_[MAX_RANDOM_MAC_ADDR_INDEX];
+
+ int random_mac_address_index_;
};
} // namespace iface_util