Merge "wifi: add pmk cache interface"

This commit is contained in:
Jimmy Chen
2019-09-27 02:17:48 +00:00
committed by Android (Google) Code Review
10 changed files with 305 additions and 1 deletions

View File

@@ -507,7 +507,7 @@
</hal>
<hal format="hidl" optional="true">
<name>android.hardware.wifi.supplicant</name>
<version>1.0-2</version>
<version>1.0-3</version>
<interface>
<name>ISupplicant</name>
<instance>default</instance>

View File

@@ -9,6 +9,8 @@ hidl_interface {
srcs: [
"types.hal",
"ISupplicant.hal",
"ISupplicantStaIface.hal",
"ISupplicantStaIfaceCallback.hal",
"ISupplicantStaNetwork.hal",
],
interfaces: [

View File

@@ -0,0 +1,46 @@
/*
* Copyright 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.hardware.wifi.supplicant@1.3;
import @1.0::SupplicantStatus;
import @1.2::ISupplicantStaIface;
import @1.3::ISupplicantStaIfaceCallback;
/**
* Interface exposed by the supplicant for each station mode network
* interface (e.g wlan0) it controls.
*/
interface ISupplicantStaIface extends @1.2::ISupplicantStaIface {
/**
* Register for callbacks from this interface.
*
* These callbacks are invoked for events that are specific to this interface.
* Registration of multiple callback objects is supported. These objects must
* be automatically deleted when the corresponding client process is dead or
* if this interface is removed.
*
* @param callback An instance of the |ISupplicantStaIfaceCallback| HIDL
* interface object.
* @return status Status of the operation.
* Possible status codes:
* |SupplicantStatusCode.SUCCESS|,
* |SupplicantStatusCode.FAILURE_UNKNOWN|,
* |SupplicantStatusCode.FAILURE_IFACE_INVALID|
*/
registerCallback_1_3(ISupplicantStaIfaceCallback callback)
generates (SupplicantStatus status);
};

View File

@@ -0,0 +1,38 @@
/*
* Copyright 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.hardware.wifi.supplicant@1.3;
import @1.2::ISupplicantStaIfaceCallback;
/**
* Callback Interface exposed by the supplicant service
* for each station mode interface (ISupplicantStaIface).
*
* Clients need to host an instance of this HIDL interface object and
* pass a reference of the object to the supplicant via the
* corresponding |ISupplicantStaIface.registerCallback_1_3| method.
*/
interface ISupplicantStaIfaceCallback extends @1.2::ISupplicantStaIfaceCallback {
/**
* Indicates PMK cache added event.
*
* @param expirationTimeInSec expiration time in seconds
* @param serializedEntry is serialized PMK cache entry, the content is
* opaque for the framework and depends on the native implementation.
*/
oneway onPmkCacheAdded(int64_t expirationTimeInSec, vec<uint8_t> serializedEntry);
};

View File

@@ -47,4 +47,19 @@ interface ISupplicantStaNetwork extends @1.2::ISupplicantStaNetwork {
* @return ocspType ocsp type.
*/
getOcsp() generates (SupplicantStatus status, OcspType ocspType);
/**
* Add a PMK into supplicant PMK cache.
*
* @param serializedEntry is serialized PMK cache entry, the content is
* opaque for the framework and depends on the native implementation.
* @return status Status of the operation
* Possible status codes:
* |SupplicantStatusCode.SUCCESS|,
* |SupplicantStatusCode.FAILURE_ARGS_INVALID|,
* |SupplicantStatusCode.FAILURE_UNKNOWN|,
* |SupplicantStatusCode.FAILURE_NETWORK_INVALID|
*/
setPmkCache(vec<uint8_t> serializedEntry)
generates (SupplicantStatus status);
};

View File

@@ -42,6 +42,7 @@ cc_test {
defaults: ["VtsHalTargetTestDefaults"],
srcs: [
"VtsHalWifiSupplicantV1_3TargetTest.cpp",
"supplicant_sta_iface_hidl_test.cpp",
"supplicant_sta_network_hidl_test.cpp",
],
static_libs: [

View File

@@ -21,8 +21,13 @@
#include "supplicant_hidl_test_utils_1_3.h"
using ::android::sp;
using ::android::hardware::wifi::supplicant::V1_3::ISupplicantStaIface;
using ::android::hardware::wifi::supplicant::V1_3::ISupplicantStaNetwork;
sp<ISupplicantStaIface> getSupplicantStaIface_1_3() {
return ISupplicantStaIface::castFrom(getSupplicantStaIface());
}
sp<ISupplicantStaNetwork> createSupplicantStaNetwork_1_3() {
return ISupplicantStaNetwork::castFrom(createSupplicantStaNetwork());
}

View File

@@ -17,8 +17,11 @@
#ifndef SUPPLICANT_HIDL_TEST_UTILS_1_3_H
#define SUPPLICANT_HIDL_TEST_UTILS_1_3_H
#include <android/hardware/wifi/supplicant/1.3/ISupplicantStaIface.h>
#include <android/hardware/wifi/supplicant/1.3/ISupplicantStaNetwork.h>
android::sp<android::hardware::wifi::supplicant::V1_3::ISupplicantStaIface>
getSupplicantStaIface_1_3();
android::sp<android::hardware::wifi::supplicant::V1_3::ISupplicantStaNetwork>
createSupplicantStaNetwork_1_3();

View File

@@ -0,0 +1,181 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <VtsHalHidlTargetTestBase.h>
#include <android/hardware/wifi/supplicant/1.2/types.h>
#include <android/hardware/wifi/supplicant/1.3/ISupplicantStaIface.h>
#include <android/hardware/wifi/supplicant/1.3/ISupplicantStaIfaceCallback.h>
#include <android/hardware/wifi/supplicant/1.3/ISupplicantStaNetwork.h>
#include <android/hardware/wifi/supplicant/1.3/types.h>
#include <hidl/HidlSupport.h>
#include <hidl/Status.h>
#include "supplicant_hidl_test_utils.h"
#include "supplicant_hidl_test_utils_1_3.h"
using ::android::sp;
using ::android::hardware::hidl_array;
using ::android::hardware::hidl_string;
using ::android::hardware::hidl_vec;
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::hardware::wifi::supplicant::V1_0::SupplicantStatus;
using ::android::hardware::wifi::supplicant::V1_0::SupplicantStatusCode;
using ::android::hardware::wifi::supplicant::V1_2::DppAkm;
using ::android::hardware::wifi::supplicant::V1_2::DppFailureCode;
using ::android::hardware::wifi::supplicant::V1_2::DppProgressCode;
using ::android::hardware::wifi::supplicant::V1_3::ISupplicantStaIface;
using ::android::hardware::wifi::supplicant::V1_3::ISupplicantStaIfaceCallback;
using ::android::hardware::wifi::supplicant::V1_3::ISupplicantStaNetwork;
class SupplicantStaIfaceHidlTest : public ::testing::VtsHalHidlTargetTestBase {
public:
virtual void SetUp() override {
startSupplicantAndWaitForHidlService();
EXPECT_TRUE(turnOnExcessiveLogging());
sta_iface_ = getSupplicantStaIface_1_3();
ASSERT_NE(sta_iface_.get(), nullptr);
}
virtual void TearDown() override { stopSupplicant(); }
int64_t pmkCacheExpirationTimeInSec;
std::vector<uint8_t> serializedPmkCacheEntry;
protected:
// ISupplicantStaIface object used for all tests in this fixture.
sp<ISupplicantStaIface> sta_iface_;
};
class IfaceCallback : public ISupplicantStaIfaceCallback {
Return<void> onNetworkAdded(uint32_t /* id */) override { return Void(); }
Return<void> onNetworkRemoved(uint32_t /* id */) override { return Void(); }
Return<void> onStateChanged(
ISupplicantStaIfaceCallback::State /* newState */,
const hidl_array<uint8_t, 6>& /*bssid */, uint32_t /* id */,
const hidl_vec<uint8_t>& /* ssid */) override {
return Void();
}
Return<void> onAnqpQueryDone(
const hidl_array<uint8_t, 6>& /* bssid */,
const ISupplicantStaIfaceCallback::AnqpData& /* data */,
const ISupplicantStaIfaceCallback::Hs20AnqpData& /* hs20Data */)
override {
return Void();
}
virtual Return<void> onHs20IconQueryDone(
const hidl_array<uint8_t, 6>& /* bssid */,
const hidl_string& /* fileName */,
const hidl_vec<uint8_t>& /* data */) override {
return Void();
}
virtual Return<void> onHs20SubscriptionRemediation(
const hidl_array<uint8_t, 6>& /* bssid */,
ISupplicantStaIfaceCallback::OsuMethod /* osuMethod */,
const hidl_string& /* url*/) override {
return Void();
}
Return<void> onHs20DeauthImminentNotice(
const hidl_array<uint8_t, 6>& /* bssid */, uint32_t /* reasonCode */,
uint32_t /* reAuthDelayInSec */,
const hidl_string& /* url */) override {
return Void();
}
Return<void> onDisconnected(const hidl_array<uint8_t, 6>& /* bssid */,
bool /* locallyGenerated */,
ISupplicantStaIfaceCallback::ReasonCode
/* reasonCode */) override {
return Void();
}
Return<void> onAssociationRejected(
const hidl_array<uint8_t, 6>& /* bssid */,
ISupplicantStaIfaceCallback::StatusCode /* statusCode */,
bool /*timedOut */) override {
return Void();
}
Return<void> onAuthenticationTimeout(
const hidl_array<uint8_t, 6>& /* bssid */) override {
return Void();
}
Return<void> onBssidChanged(
ISupplicantStaIfaceCallback::BssidChangeReason /* reason */,
const hidl_array<uint8_t, 6>& /* bssid */) override {
return Void();
}
Return<void> onEapFailure() override { return Void(); }
Return<void> onEapFailure_1_1(
ISupplicantStaIfaceCallback::EapErrorCode /* eapErrorCode */) override {
return Void();
}
Return<void> onWpsEventSuccess() override { return Void(); }
Return<void> onWpsEventFail(
const hidl_array<uint8_t, 6>& /* bssid */,
ISupplicantStaIfaceCallback::WpsConfigError /* configError */,
ISupplicantStaIfaceCallback::WpsErrorIndication /* errorInd */)
override {
return Void();
}
Return<void> onWpsEventPbcOverlap() override { return Void(); }
Return<void> onExtRadioWorkStart(uint32_t /* id */) override {
return Void();
}
Return<void> onExtRadioWorkTimeout(uint32_t /* id*/) override {
return Void();
}
Return<void> onDppSuccessConfigReceived(
const hidl_vec<uint8_t>& /* ssid */, const hidl_string& /* password */,
const hidl_array<uint8_t, 32>& /* psk */,
DppAkm /* securityAkm */) override {
return Void();
}
Return<void> onDppSuccessConfigSent() override { return Void(); }
Return<void> onDppProgress(DppProgressCode /* code */) override {
return Void();
}
Return<void> onDppFailure(DppFailureCode /* code */) override {
return Void();
}
Return<void> onPmkCacheAdded(
int64_t /* expirationTimeInSec */,
const hidl_vec<uint8_t>& /* serializedEntry */) override {
return Void();
}
};
class IfacePmkCacheCallback : public IfaceCallback {
SupplicantStaIfaceHidlTest& parent_;
Return<void> onPmkCacheAdded(
int64_t expirationTimeInSec,
const hidl_vec<uint8_t>& serializedEntry) override {
parent_.pmkCacheExpirationTimeInSec = expirationTimeInSec;
parent_.serializedPmkCacheEntry = serializedEntry;
return Void();
}
public:
IfacePmkCacheCallback(SupplicantStaIfaceHidlTest& parent)
: parent_(parent) {}
};
/*
* RegisterCallback_1_3
*/
TEST_F(SupplicantStaIfaceHidlTest, RegisterCallback_1_3) {
sta_iface_->registerCallback_1_3(
new IfaceCallback(), [](const SupplicantStatus& status) {
EXPECT_EQ(SupplicantStatusCode::SUCCESS, status.code);
});
}

View File

@@ -71,3 +71,16 @@ TEST_F(SupplicantStaNetworkHidlTest, SetGetOcsp) {
EXPECT_EQ(testOcspType, ocspType);
});
}
/*
* SetPmkCacheEntry
*/
TEST_F(SupplicantStaNetworkHidlTest, SetPmkCache) {
uint8_t bytes[128] = {0};
std::vector<uint8_t> serializedEntry(bytes, bytes + sizeof(bytes));
sta_network_->setPmkCache(
serializedEntry, [](const SupplicantStatus &status) {
EXPECT_EQ(SupplicantStatusCode::SUCCESS, status.code);
});
}