namespace {
-constexpr uint32_t kFakeSequenceNumber = 162;
+constexpr uint8_t kFakeMaxNumScanSSIDs = 10;
+constexpr uint8_t kFakeMaxNumSchedScanSSIDs = 16;
+constexpr uint8_t kFakeMaxMatchSets = 18;
constexpr uint16_t kFakeFamilyId = 14;
+constexpr uint32_t kFakeFrequency1 = 2412;
+constexpr uint32_t kFakeFrequency2 = 2437;
+constexpr uint32_t kFakeFrequency3 = 2484;
+constexpr uint32_t kFakeFrequency4 = 5200;
+constexpr uint32_t kFakeFrequency5 = 5400;
+constexpr uint32_t kFakeFrequency6 = 5600;
+constexpr uint32_t kFakeSequenceNumber = 162;
constexpr uint16_t kFakeWiphyIndex = 8;
constexpr int kFakeErrorCode = EIO;
const char kFakeInterfaceName[] = "testif0";
&interface_mac_addr));
}
+TEST_F(NetlinkUtilsTest, CanGetWiphyInfo) {
+ NL80211Packet new_wiphy(
+ netlink_manager_->GetFamilyId(),
+ NL80211_CMD_NEW_WIPHY,
+ netlink_manager_->GetSequenceNumber(),
+ getpid());
+ new_wiphy.AddAttribute(NL80211Attr<uint32_t>(NL80211_ATTR_WIPHY,
+ kFakeWiphyIndex));
+
+ // Insert band information to mock netlink response.
+
+ NL80211NestedAttr freq_2g_1(1);
+ NL80211NestedAttr freq_2g_2(2);
+ NL80211NestedAttr freq_2g_3(3);
+ NL80211NestedAttr freq_5g_1(4);
+ NL80211NestedAttr freq_5g_2(5);
+ NL80211NestedAttr freq_dfs_1(6);
+ freq_2g_1.AddAttribute(NL80211Attr<uint32_t>(NL80211_FREQUENCY_ATTR_FREQ,
+ kFakeFrequency1));
+ freq_2g_2.AddAttribute(NL80211Attr<uint32_t>(NL80211_FREQUENCY_ATTR_FREQ,
+ kFakeFrequency2));
+ freq_2g_3.AddAttribute(NL80211Attr<uint32_t>(NL80211_FREQUENCY_ATTR_FREQ,
+ kFakeFrequency3));
+ freq_5g_1.AddAttribute(NL80211Attr<uint32_t>(NL80211_FREQUENCY_ATTR_FREQ,
+ kFakeFrequency4));
+ freq_5g_2.AddAttribute(NL80211Attr<uint32_t>(NL80211_FREQUENCY_ATTR_FREQ,
+ kFakeFrequency5));
+ // DFS frequency.
+ freq_dfs_1.AddAttribute(NL80211Attr<uint32_t>(NL80211_FREQUENCY_ATTR_FREQ,
+ kFakeFrequency6));
+ freq_dfs_1.AddAttribute(NL80211Attr<uint32_t>(
+ NL80211_FREQUENCY_ATTR_DFS_STATE,
+ NL80211_DFS_USABLE));
+
+ NL80211NestedAttr band_2g_freqs(NL80211_BAND_ATTR_FREQS);
+ NL80211NestedAttr band_5g_freqs(NL80211_BAND_ATTR_FREQS);
+ band_2g_freqs.AddAttribute(freq_2g_1);
+ band_2g_freqs.AddAttribute(freq_2g_2);
+ band_2g_freqs.AddAttribute(freq_2g_3);
+ band_5g_freqs.AddAttribute(freq_5g_1);
+ band_5g_freqs.AddAttribute(freq_5g_2);
+ band_5g_freqs.AddAttribute(freq_dfs_1);
+
+ NL80211NestedAttr band_2g_attr(1);
+ NL80211NestedAttr band_5g_attr(2);
+ band_2g_attr.AddAttribute(band_2g_freqs);
+ band_5g_attr.AddAttribute(band_5g_freqs);
+
+ NL80211NestedAttr band_attr(NL80211_ATTR_WIPHY_BANDS);
+ band_attr.AddAttribute(band_2g_attr);
+ band_attr.AddAttribute(band_5g_attr);
+
+ new_wiphy.AddAttribute(band_attr);
+
+ // Insert scan capabilities to mock netlink response.
+ new_wiphy.AddAttribute(NL80211Attr<uint8_t>(NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
+ kFakeMaxNumScanSSIDs));
+ new_wiphy.AddAttribute(NL80211Attr<uint8_t>(
+ NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS,
+ kFakeMaxNumSchedScanSSIDs));
+ new_wiphy.AddAttribute(NL80211Attr<uint8_t>(NL80211_ATTR_MAX_MATCH_SETS,
+ kFakeMaxMatchSets));
+
+ // Insert wiphy features to mock netlink response.
+ new_wiphy.AddAttribute(NL80211Attr<uint32_t>(
+ NL80211_ATTR_FEATURE_FLAGS,
+ NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR));
+
+ vector<NL80211Packet> response = {new_wiphy};
+
+ EXPECT_CALL(*netlink_manager_, SendMessageAndGetResponses(_, _)).
+ WillOnce(DoAll(MakeupResponse(response), Return(true)));
+
+ BandInfo band_info;
+ ScanCapabilities scan_capabilities;
+ WiphyFeatures wiphy_features;
+ EXPECT_TRUE(netlink_utils_->GetWiphyInfo(kFakeWiphyIndex,
+ &band_info,
+ &scan_capabilities,
+ &wiphy_features));
+
+ // Verify band information.
+ vector<uint32_t> band_2g_expected = {kFakeFrequency1,
+ kFakeFrequency2, kFakeFrequency3};
+ vector<uint32_t> band_5g_expected = {kFakeFrequency4, kFakeFrequency5};
+ vector<uint32_t> band_dfs_expected = {kFakeFrequency6};
+ EXPECT_EQ(band_info.band_2g, band_2g_expected);
+ EXPECT_EQ(band_info.band_5g, band_5g_expected);
+ EXPECT_EQ(band_info.band_dfs, band_dfs_expected);
+
+ // Verify scan capabilities.
+ EXPECT_EQ(scan_capabilities.max_num_scan_ssids,
+ kFakeMaxNumScanSSIDs);
+ EXPECT_EQ(scan_capabilities.max_num_sched_scan_ssids,
+ kFakeMaxNumSchedScanSSIDs);
+ EXPECT_EQ(scan_capabilities.max_match_sets,
+ kFakeMaxMatchSets);
+
+ // Verify wiphy features.
+ EXPECT_TRUE(wiphy_features.supports_random_mac_oneshot_scan);
+ EXPECT_FALSE(wiphy_features.supports_random_mac_sched_scan);
+}
+
+TEST_F(NetlinkUtilsTest, CanHandleGetWiphyInfoError) {
+ // Mock an error response from kernel.
+ vector<NL80211Packet> response = {CreateControlMessageError(kFakeErrorCode)};
+
+ EXPECT_CALL(*netlink_manager_, SendMessageAndGetResponses(_, _)).
+ WillOnce(DoAll(MakeupResponse(response), Return(true)));
+
+ BandInfo band_info;
+ ScanCapabilities scan_capabilities;
+ WiphyFeatures wiphy_features;
+ EXPECT_FALSE(netlink_utils_->GetWiphyInfo(kFakeWiphyIndex,
+ &band_info,
+ &scan_capabilities,
+ &wiphy_features));
+}
+
} // namespace wificond
} // namespace android