blob: 92fbf505eb28e9b2633f3fc1c19981235a43be61 [file] [log] [blame]
Chris Yed13f7b52021-06-24 12:52:55 -07001/*
2 * Copyright (C) 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#include <VtsCoreUtil.h>
17
18#include <aidl/Gtest.h>
19#include <aidl/Vintf.h>
20#include <android/hardware/wifi/hostapd/BnHostapd.h>
21#include <binder/IServiceManager.h>
22#include <binder/ProcessState.h>
23
24using android::ProcessState;
25using android::sp;
26using android::String16;
27using android::hardware::wifi::hostapd::BandMask;
28using android::hardware::wifi::hostapd::ChannelParams;
29using android::hardware::wifi::hostapd::DebugLevel;
30using android::hardware::wifi::hostapd::EncryptionType;
31using android::hardware::wifi::hostapd::FrequencyRange;
32using android::hardware::wifi::hostapd::Ieee80211ReasonCode;
33using android::hardware::wifi::hostapd::IfaceParams;
34using android::hardware::wifi::hostapd::IHostapd;
35using android::hardware::wifi::hostapd::NetworkParams;
36
37namespace {
38const unsigned char kNwSsid[] = {'t', 'e', 's', 't', '1', '2', '3', '4', '5'};
39const String16 kIfaceName = String16("wlan0");
40const String16 kPassphrase = String16("test12345");
41const String16 kInvalidMinPassphrase = String16("test");
42const String16 kInvalidMaxPassphrase = String16(
43 "0123456789012345678901234567890123456789012345678901234567890123456789");
44const int kIfaceChannel = 6;
45const int kIfaceInvalidChannel = 567;
46const std::vector<uint8_t> kTestZeroMacAddr(6, 0x0);
47const Ieee80211ReasonCode kTestDisconnectReasonCode =
48 Ieee80211ReasonCode::WLAN_REASON_UNSPECIFIED;
49
50inline BandMask operator|(BandMask a, BandMask b) {
51 return static_cast<BandMask>(static_cast<int32_t>(a) |
52 static_cast<int32_t>(b));
53}
54} // namespace
55
56class HostapdAidl : public testing::TestWithParam<std::string> {
57 public:
58 virtual void SetUp() override {
59 hostapd = android::waitForDeclaredService<IHostapd>(
60 String16(GetParam().c_str()));
61 ASSERT_NE(hostapd, nullptr);
62 EXPECT_TRUE(hostapd->setDebugParams(DebugLevel::EXCESSIVE).isOk());
63 isAcsSupport = testing::checkSubstringInCommandOutput(
64 "/system/bin/cmd wifi get-softap-supported-features",
65 "wifi_softap_acs_supported");
66 isWpa3SaeSupport = testing::checkSubstringInCommandOutput(
67 "/system/bin/cmd wifi get-softap-supported-features",
68 "wifi_softap_wpa3_sae_supported");
69 isBridgedSupport = testing::checkSubstringInCommandOutput(
70 "/system/bin/cmd wifi get-softap-supported-features",
71 "wifi_softap_bridged_ap_supported");
72 }
73
74 virtual void TearDown() override {
75 hostapd->terminate();
76 // Wait 3 seconds to allow terminate to complete
77 sleep(3);
78 }
79
80 sp<IHostapd> hostapd;
81 bool isAcsSupport;
82 bool isWpa3SaeSupport;
83 bool isBridgedSupport;
84
85 IfaceParams getIfaceParamsWithoutAcs(String16 iface_name) {
86 IfaceParams iface_params;
87 ChannelParams channelParams;
88 std::vector<ChannelParams> vec_channelParams;
89
90 iface_params.name = iface_name;
91 iface_params.hwModeParams.enable80211N = true;
92 iface_params.hwModeParams.enable80211AC = false;
93 iface_params.hwModeParams.enable80211AX = false;
94 iface_params.hwModeParams.enable6GhzBand = false;
95
96 channelParams.enableAcs = false;
97 channelParams.acsShouldExcludeDfs = false;
98 channelParams.channel = kIfaceChannel;
99 channelParams.bandMask = BandMask::BAND_2_GHZ;
100
101 vec_channelParams.push_back(channelParams);
102 iface_params.channelParams = vec_channelParams;
103 return iface_params;
104 }
105
106 IfaceParams getIfaceParamsWithBridgedModeACS(String16 iface_name) {
107 IfaceParams iface_params = getIfaceParamsWithoutAcs(iface_name);
108 iface_params.channelParams[0].enableAcs = true;
109 iface_params.channelParams[0].acsShouldExcludeDfs = true;
110
111 std::vector<ChannelParams> vec_channelParams;
112 vec_channelParams.push_back(iface_params.channelParams[0]);
113
114 ChannelParams second_channelParams;
115 second_channelParams.channel = 0;
116 second_channelParams.enableAcs = true;
117 second_channelParams.bandMask = BandMask::BAND_5_GHZ;
118 vec_channelParams.push_back(second_channelParams);
119
120 iface_params.channelParams = vec_channelParams;
121 return iface_params;
122 }
123
124 IfaceParams getIfaceParamsWithAcs(String16 iface_name) {
125 IfaceParams iface_params = getIfaceParamsWithoutAcs(iface_name);
126 iface_params.channelParams[0].enableAcs = true;
127 iface_params.channelParams[0].acsShouldExcludeDfs = true;
128 iface_params.channelParams[0].channel = 0;
129 iface_params.channelParams[0].bandMask =
130 iface_params.channelParams[0].bandMask | BandMask::BAND_5_GHZ;
131 return iface_params;
132 }
133
134 IfaceParams getIfaceParamsWithAcsAndFreqRange(String16 iface_name) {
135 IfaceParams iface_params = getIfaceParamsWithAcs(iface_name);
136 FrequencyRange freqRange;
137 freqRange.startMhz = 2412;
138 freqRange.endMhz = 2462;
139 std::vector<FrequencyRange> vec_FrequencyRange;
140 vec_FrequencyRange.push_back(freqRange);
141 iface_params.channelParams[0].acsChannelFreqRangesMhz =
142 vec_FrequencyRange;
143 return iface_params;
144 }
145
146 IfaceParams getIfaceParamsWithAcsAndInvalidFreqRange(String16 iface_name) {
147 IfaceParams iface_params =
148 getIfaceParamsWithAcsAndFreqRange(iface_name);
149 iface_params.channelParams[0].acsChannelFreqRangesMhz[0].startMhz =
150 222;
151 iface_params.channelParams[0].acsChannelFreqRangesMhz[0].endMhz =
152 999;
153 return iface_params;
154 }
155
156 IfaceParams getIfaceParamsWithInvalidChannel(String16 iface_name) {
157 IfaceParams iface_params = getIfaceParamsWithoutAcs(iface_name);
158 iface_params.channelParams[0].channel = kIfaceInvalidChannel;
159 return iface_params;
160 }
161
162 NetworkParams getOpenNwParams() {
163 NetworkParams nw_params;
164 nw_params.ssid =
165 std::vector<uint8_t>(kNwSsid, kNwSsid + sizeof(kNwSsid));
166 nw_params.isHidden = false;
167 nw_params.encryptionType = EncryptionType::NONE;
168 nw_params.isMetered = true;
169 return nw_params;
170 }
171
172 NetworkParams getPskNwParamsWithNonMetered() {
173 NetworkParams nw_params = getOpenNwParams();
174 nw_params.encryptionType = EncryptionType::WPA2;
175 nw_params.passphrase = kPassphrase;
176 nw_params.isMetered = false;
177 return nw_params;
178 }
179
180 NetworkParams getPskNwParams() {
181 NetworkParams nw_params = getOpenNwParams();
182 nw_params.encryptionType = EncryptionType::WPA2;
183 nw_params.passphrase = kPassphrase;
184 return nw_params;
185 }
186
187 NetworkParams getInvalidPskNwParams() {
188 NetworkParams nw_params = getOpenNwParams();
189 nw_params.encryptionType = EncryptionType::WPA2;
190 nw_params.passphrase = kInvalidMaxPassphrase;
191 return nw_params;
192 }
193
194 NetworkParams getSaeTransitionNwParams() {
195 NetworkParams nw_params = getOpenNwParams();
196 nw_params.encryptionType = EncryptionType::WPA3_SAE_TRANSITION;
197 nw_params.passphrase = kPassphrase;
198 return nw_params;
199 }
200
201 NetworkParams getInvalidSaeTransitionNwParams() {
202 NetworkParams nw_params = getOpenNwParams();
203 nw_params.encryptionType = EncryptionType::WPA2;
204 nw_params.passphrase = kInvalidMinPassphrase;
205 return nw_params;
206 }
207
208 NetworkParams getSaeNwParams() {
209 NetworkParams nw_params = getOpenNwParams();
210 nw_params.encryptionType = EncryptionType::WPA3_SAE;
211 nw_params.passphrase = kPassphrase;
212 return nw_params;
213 }
214
215 NetworkParams getInvalidSaeNwParams() {
216 NetworkParams nw_params = getOpenNwParams();
217 nw_params.encryptionType = EncryptionType::WPA3_SAE;
218 nw_params.passphrase = String16("");
219 return nw_params;
220 }
221};
222
223/**
224 * Adds an access point with PSK network config & ACS enabled.
225 * Access point creation should pass.
226 */
227TEST_P(HostapdAidl, AddPskAccessPointWithAcs) {
228 if (!isAcsSupport) GTEST_SKIP() << "Missing ACS support";
229 auto status = hostapd->addAccessPoint(getIfaceParamsWithAcs(kIfaceName),
230 getPskNwParams());
231 EXPECT_TRUE(status.isOk());
232}
233
234/**
235 * Adds an access point with PSK network config, ACS enabled & frequency Range.
236 * Access point creation should pass.
237 */
238TEST_P(HostapdAidl, AddPskAccessPointWithAcsAndFreqRange) {
239 if (!isAcsSupport) GTEST_SKIP() << "Missing ACS support";
240 auto status = hostapd->addAccessPoint(
241 getIfaceParamsWithAcsAndFreqRange(kIfaceName), getPskNwParams());
242 EXPECT_TRUE(status.isOk());
243}
244
245/**
246 * Adds an access point with invalid channel range.
247 * Access point creation should fail.
248 */
249TEST_P(HostapdAidl, AddPskAccessPointWithAcsAndInvalidFreqRange) {
250 if (!isAcsSupport) GTEST_SKIP() << "Missing ACS support";
251 auto status = hostapd->addAccessPoint(
252 getIfaceParamsWithAcsAndInvalidFreqRange(kIfaceName), getPskNwParams());
253 EXPECT_FALSE(status.isOk());
254}
255
256/**
257 * Adds an access point with Open network config & ACS enabled.
258 * Access point creation should pass.
259 */
260TEST_P(HostapdAidl, AddOpenAccessPointWithAcs) {
261 if (!isAcsSupport) GTEST_SKIP() << "Missing ACS support";
262 auto status = hostapd->addAccessPoint(getIfaceParamsWithAcs(kIfaceName),
263 getOpenNwParams());
264 EXPECT_TRUE(status.isOk());
265}
266
267/**
268 * Adds an access point with PSK network config & ACS disabled.
269 * Access point creation should pass.
270 */
271TEST_P(HostapdAidl, AddPskAccessPointWithoutAcs) {
272 auto status = hostapd->addAccessPoint(getIfaceParamsWithoutAcs(kIfaceName),
273 getPskNwParams());
274 EXPECT_TRUE(status.isOk());
275}
276
277/**
278 * Adds an access point with PSK network config, ACS disabled & Non metered.
279 * Access point creation should pass.
280 */
281TEST_P(HostapdAidl, AddPskAccessPointWithoutAcsAndNonMetered) {
282 auto status = hostapd->addAccessPoint(getIfaceParamsWithoutAcs(kIfaceName),
283 getPskNwParamsWithNonMetered());
284 EXPECT_TRUE(status.isOk());
285}
286
287/**
288 * Adds an access point with Open network config & ACS disabled.
289 * Access point creation should pass.
290 */
291TEST_P(HostapdAidl, AddOpenAccessPointWithoutAcs) {
292 auto status = hostapd->addAccessPoint(getIfaceParamsWithoutAcs(kIfaceName),
293 getOpenNwParams());
294 EXPECT_TRUE(status.isOk());
295}
296
297/**
298 * Adds an access point with SAE Transition network config & ACS disabled.
299 * Access point creation should pass.
300 */
301TEST_P(HostapdAidl, AddSaeTransitionAccessPointWithoutAcs) {
302 if (!isWpa3SaeSupport) GTEST_SKIP() << "Missing SAE support";
303 auto status = hostapd->addAccessPoint(getIfaceParamsWithoutAcs(kIfaceName),
304 getSaeTransitionNwParams());
305 EXPECT_TRUE(status.isOk());
306}
307
308/**
309 * Adds an access point with SAE network config & ACS disabled.
310 * Access point creation should pass.
311 */
312TEST_P(HostapdAidl, AddSAEAccessPointWithoutAcs) {
313 if (!isWpa3SaeSupport) GTEST_SKIP() << "Missing SAE support";
314 auto status = hostapd->addAccessPoint(getIfaceParamsWithoutAcs(kIfaceName),
315 getSaeNwParams());
316 EXPECT_TRUE(status.isOk());
317}
318
319/**
320 * Adds & then removes an access point with PSK network config & ACS enabled.
321 * Access point creation & removal should pass.
322 */
323TEST_P(HostapdAidl, RemoveAccessPointWithAcs) {
324 if (!isAcsSupport) GTEST_SKIP() << "Missing ACS support";
325 auto status = hostapd->addAccessPoint(getIfaceParamsWithAcs(kIfaceName),
326 getPskNwParams());
327 EXPECT_TRUE(status.isOk());
328 EXPECT_TRUE(hostapd->removeAccessPoint(kIfaceName).isOk());
329}
330
331/**
332 * Adds & then removes an access point with PSK network config & ACS disabled.
333 * Access point creation & removal should pass.
334 */
335TEST_P(HostapdAidl, RemoveAccessPointWithoutAcs) {
336 auto status = hostapd->addAccessPoint(getIfaceParamsWithoutAcs(kIfaceName),
337 getPskNwParams());
338 EXPECT_TRUE(status.isOk());
339 EXPECT_TRUE(hostapd->removeAccessPoint(kIfaceName).isOk());
340}
341
342/**
343 * Adds an access point with invalid channel.
344 * Access point creation should fail.
345 */
346TEST_P(HostapdAidl, AddPskAccessPointWithInvalidChannel) {
347 auto status = hostapd->addAccessPoint(
348 getIfaceParamsWithInvalidChannel(kIfaceName), getPskNwParams());
349 EXPECT_FALSE(status.isOk());
350}
351
352/**
353 * Adds an access point with invalid PSK network config.
354 * Access point creation should fail.
355 */
356TEST_P(HostapdAidl, AddInvalidPskAccessPointWithoutAcs) {
357 auto status = hostapd->addAccessPoint(getIfaceParamsWithoutAcs(kIfaceName),
358 getInvalidPskNwParams());
359 EXPECT_FALSE(status.isOk());
360}
361
362/**
363 * Adds an access point with invalid SAE transition network config.
364 * Access point creation should fail.
365 */
366TEST_P(HostapdAidl, AddInvalidSaeTransitionAccessPointWithoutAcs) {
367 if (!isWpa3SaeSupport) GTEST_SKIP() << "Missing SAE support";
368 auto status = hostapd->addAccessPoint(getIfaceParamsWithoutAcs(kIfaceName),
369 getInvalidSaeTransitionNwParams());
370 EXPECT_FALSE(status.isOk());
371}
372
373/**
374 * Adds an access point with invalid SAE network config.
375 * Access point creation should fail.
376 */
377TEST_P(HostapdAidl, AddInvalidSaeAccessPointWithoutAcs) {
378 if (!isWpa3SaeSupport) GTEST_SKIP() << "Missing SAE support";
379 auto status = hostapd->addAccessPoint(getIfaceParamsWithoutAcs(kIfaceName),
380 getInvalidSaeNwParams());
381 EXPECT_FALSE(status.isOk());
382}
383
384/**
385 * forceClientDisconnect should fail when hotspot interface available.
386 */
387TEST_P(HostapdAidl, DisconnectClientWhenIfacAvailable) {
388 auto status = hostapd->addAccessPoint(getIfaceParamsWithoutAcs(kIfaceName),
389 getOpenNwParams());
390 EXPECT_TRUE(status.isOk());
391
392 status = hostapd->forceClientDisconnect(kIfaceName, kTestZeroMacAddr,
393 kTestDisconnectReasonCode);
394 EXPECT_FALSE(status.isOk());
395}
396
397/**
398 * AddAccessPointWithDualBandConfig should pass
399 */
400TEST_P(HostapdAidl, AddAccessPointWithDualBandConfig) {
401 if (!isBridgedSupport) GTEST_SKIP() << "Missing Bridged AP support";
402 auto status = hostapd->addAccessPoint(
403 getIfaceParamsWithBridgedModeACS(kIfaceName), getOpenNwParams());
404 EXPECT_TRUE(status.isOk());
405}
406
407INSTANTIATE_TEST_SUITE_P(
408 Hostapd, HostapdAidl,
409 testing::ValuesIn(android::getAidlHalInstanceNames(IHostapd::descriptor)),
410 android::PrintInstanceNameToString);
411
412int main(int argc, char **argv) {
413 ::testing::InitGoogleTest(&argc, argv);
414 ProcessState::self()->setThreadPoolMaxThreadCount(1);
415 ProcessState::self()->startThreadPool();
416 return RUN_ALL_TESTS();
417}