LOCAL_PATH := $(call my-dir)
wificond_cpp_flags := -std=c++11 -Wall -Werror -Wno-unused-parameter
+# TODO(b/33211652): Remove once ScannerImpl is fleshed out.
+wificond_cpp_flags += -Wno-unused-private-field
wificond_parent_dir := $(LOCAL_PATH)/../
wificond_includes := \
$(wificond_parent_dir)
}
ClientInterfaceImpl::ClientInterfaceImpl(
+ uint32_t wiphy_index,
const std::string& interface_name,
uint32_t interface_index,
const std::vector<uint8_t>& interface_mac_addr,
SupplicantManager* supplicant_manager,
NetlinkUtils* netlink_utils,
ScanUtils* scan_utils)
- : interface_name_(interface_name),
+ : wiphy_index_(wiphy_index),
+ interface_name_(interface_name),
interface_index_(interface_index),
interface_mac_addr_(interface_mac_addr),
if_tool_(if_tool),
netlink_utils_(netlink_utils),
scan_utils_(scan_utils),
mlme_event_handler_(new MlmeEventHandlerImpl(this)),
- binder_(new ClientInterfaceBinder(this)),
- scanner_(new ScannerImpl(interface_index, scan_utils)) {
+ binder_(new ClientInterfaceBinder(this)) {
netlink_utils_->SubscribeMlmeEvent(
interface_index_,
mlme_event_handler_.get());
+ netlink_utils_->GetWiphyInfo(wiphy_index_,
+ &band_info_,
+ &scan_capabilities_,
+ &wiphy_features_);
+ scanner_ = new ScannerImpl(interface_index_,
+ band_info_,
+ scan_capabilities_,
+ wiphy_features_,
+ scan_utils_);
}
ClientInterfaceImpl::~ClientInterfaceImpl() {
#include "android/net/wifi/IClientInterface.h"
#include "wificond/net/mlme_event_handler.h"
+#include "wificond/net/netlink_utils.h"
#include "wificond/scanning/scanner_impl.h"
namespace android {
class ClientInterfaceBinder;
class ClientInterfaceImpl;
-class NetlinkUtils;
class ScanUtils;
class MlmeEventHandlerImpl : public MlmeEventHandler {
class ClientInterfaceImpl {
public:
ClientInterfaceImpl(
+ uint32_t wiphy_index,
const std::string& interface_name,
uint32_t interface_index,
const std::vector<uint8_t>& interface_mac_addr,
private:
bool RefreshAssociateFreq();
+ const uint32_t wiphy_index_;
const std::string interface_name_;
const uint32_t interface_index_;
const std::vector<uint8_t> interface_mac_addr_;
ScanUtils* const scan_utils_;
const std::unique_ptr<MlmeEventHandlerImpl> mlme_event_handler_;
const android::sp<ClientInterfaceBinder> binder_;
- const android::sp<ScannerImpl> scanner_;
+ android::sp<ScannerImpl> scanner_;
+ // Cached information for this connection.
std::vector<uint8_t> bssid_;
uint32_t associate_freq_;
+ // Capability information for this wiphy/interface.
+ BandInfo band_info_;
+ ScanCapabilities scan_capabilities_;
+ WiphyFeatures wiphy_features_;
+
DISALLOW_COPY_AND_ASSIGN(ClientInterfaceImpl);
friend class MlmeEventHandlerImpl;
};
bool NetlinkUtils::GetWiphyInfo(
uint32_t wiphy_index,
BandInfo* out_band_info,
- ScanCapabilities* out_scan_capabilities) {
+ ScanCapabilities* out_scan_capabilities,
+ WiphyFeatures* out_wiphy_features) {
NL80211Packet get_wiphy(
netlink_manager_->GetFamilyId(),
NL80211_CMD_GET_WIPHY,
!ParseScanCapabilities(response.get(), out_scan_capabilities)) {
return false;
}
+ uint32_t feature_flags;
+ if (!response->GetAttributeValue(NL80211_ATTR_FEATURE_FLAGS,
+ &feature_flags)) {
+ LOG(ERROR) << "Failed to get NL80211_ATTR_FEATURE_FLAGS";
+ return false;
+ }
+ *out_wiphy_features = WiphyFeatures(feature_flags);
return true;
}
#include <string>
#include <vector>
+#include <linux/nl80211.h>
+
#include <android-base/macros.h>
namespace android {
uint8_t max_match_sets;
};
+struct WiphyFeatures {
+ WiphyFeatures()
+ : supports_random_mac_oneshot_scan(false),
+ supports_random_mac_sched_scan(false) {}
+ WiphyFeatures(uint32_t feature_flags)
+ : supports_random_mac_oneshot_scan(
+ feature_flags & NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR),
+ supports_random_mac_sched_scan(
+ feature_flags & NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR) {}
+ // This device/driver supports using a random MAC address during scan
+ // (while not associated).
+ bool supports_random_mac_oneshot_scan;
+ // This device/driver supports using a random MAC address for every
+ // scan iteration during scheduled scan (while not associated).
+ bool supports_random_mac_sched_scan;
+ // There are other flags included in NL80211_ATTR_FEATURE_FLAGS.
+ // We will add them once we find them useful.
+};
+
struct StationInfo {
StationInfo() = default;
StationInfo(uint32_t station_tx_packets_,
uint32_t* index,
std::vector<uint8_t>* mac_addr);
- // Get wifi wiphy info from kernel.
- // |*out_band_info| is the lists of frequencies in specific bands.
- // |*out_scan_capabilities| is the lists of parameters specifying the
- // scanning capability of underlying implementation.
+ // Get wiphy capability information from kernel.
// Returns true on success.
virtual bool GetWiphyInfo(uint32_t wiphy_index,
BandInfo* out_band_info,
- ScanCapabilities* out_scan_capabilities);
+ ScanCapabilities* out_scan_capabilities,
+ WiphyFeatures* out_wiphy_features);
// Get station info from kernel.
// |*out_station_info]| is the struct of available station information.
namespace wificond {
ScannerImpl::ScannerImpl(uint32_t interface_index,
+ const BandInfo& band_info,
+ const ScanCapabilities& scan_capabilities,
+ const WiphyFeatures& wiphy_features,
ScanUtils* scan_utils)
: valid_(true),
interface_index_(interface_index),
+ band_info_(band_info),
+ scan_capabilities_(scan_capabilities),
+ wiphy_features_(wiphy_features),
scan_utils_(scan_utils) {
- // Keep compiler happy.
- // Delete this when implementions are checked in.
- if (scan_utils_ == nullptr) {
- LOG(ERROR) << "Invalid ScanUtils for ScannerImpl on interface: "
- << interface_index_;
- }
}
ScannerImpl::~ScannerImpl() {
#include <binder/Status.h>
#include "android/net/wifi/BnWifiScannerImpl.h"
+#include "wificond/net/netlink_utils.h"
namespace android {
namespace wificond {
class ScannerImpl : public android::net::wifi::BnWifiScannerImpl {
public:
- ScannerImpl(uint32_t interface_index_,
+ ScannerImpl(uint32_t interface_index,
+ const BandInfo& band_info,
+ const ScanCapabilities& scan_capabilities,
+ const WiphyFeatures& wiphy_features,
ScanUtils* scan_utils_);
~ScannerImpl();
void Invalidate() { valid_ = false; }
private:
bool valid_;
uint32_t interface_index_;
+
+ // Scanning relevant capability information for this wiphy/interface.
+ const BandInfo band_info_;
+ const ScanCapabilities scan_capabilities_;
+ const WiphyFeatures wiphy_features_;
+
ScanUtils* scan_utils_;
DISALLOW_COPY_AND_ASSIGN(ScannerImpl);
}
unique_ptr<ClientInterfaceImpl> client_interface(new ClientInterfaceImpl(
+ wiphy_index_,
interface_name,
interface_index,
interface_mac_addr,
namespace wificond {
namespace {
+const uint32_t kTestWiphyIndex = 2;
const char kTestInterfaceName[] = "testwifi0";
const uint32_t kTestInterfaceIndex = 42;
protected:
void SetUp() override {
+ EXPECT_CALL(*netlink_utils_,
+ SubscribeMlmeEvent(kTestInterfaceIndex, _));
+ EXPECT_CALL(*netlink_utils_,
+ GetWiphyInfo(kTestWiphyIndex, _, _, _));
client_interface_.reset(new ClientInterfaceImpl{
+ kTestWiphyIndex,
kTestInterfaceName,
kTestInterfaceIndex,
vector<uint8_t>{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
if_tool_.get(),
supplicant_manager_.get(),
- &netlink_utils_,
- &scan_utils_});
+ netlink_utils_.get(),
+ scan_utils_.get()});
}
void TearDown() override {
+ EXPECT_CALL(*netlink_utils_,
+ UnsubscribeMlmeEvent(kTestInterfaceIndex));
EXPECT_CALL(*supplicant_manager_, StopSupplicant())
.WillOnce(Return(false));
}
new NiceMock<MockSupplicantManager>};
unique_ptr<NiceMock<MockNetlinkManager>> netlink_manager_{
new NiceMock<MockNetlinkManager>()};
- MockNetlinkUtils netlink_utils_{netlink_manager_.get()};
- MockScanUtils scan_utils_{netlink_manager_.get()};
+ unique_ptr<NiceMock<MockNetlinkUtils>> netlink_utils_{
+ new NiceMock<MockNetlinkUtils>(netlink_manager_.get())};
+ unique_ptr<NiceMock<MockScanUtils>> scan_utils_{
+ new NiceMock<MockScanUtils>(netlink_manager_.get())};
unique_ptr<ClientInterfaceImpl> client_interface_;
}; // class ClientInterfaceImplTest
~MockNetlinkUtils() override = default;
MOCK_METHOD1(GetWiphyIndex, bool(uint32_t* out_wiphy_index));
+ MOCK_METHOD1(UnsubscribeMlmeEvent, void(uint32_t interface_index));
+ MOCK_METHOD2(SubscribeMlmeEvent,
+ void(uint32_t interface_index,
+ MlmeEventHandler* handler));
MOCK_METHOD4(GetInterfaceInfo,
bool(uint32_t wiphy_index,
std::string* name,
uint32_t* index,
std::vector<uint8_t>* mac_address));
+ MOCK_METHOD4(GetWiphyInfo,
+ bool(uint32_t wiphy_index,
+ BandInfo* band_info,
+ ScanCapabilities* scan_capabilities,
+ WiphyFeatures* wiphy_features));
}; // class MockNetlinkUtils