Merge "CameraProvider: Refactor legacy name regex code" into oc-dev
diff --git a/camera/device/1.0/ICameraDevicePreviewCallback.hal b/camera/device/1.0/ICameraDevicePreviewCallback.hal
index e772301..4c9b517 100644
--- a/camera/device/1.0/ICameraDevicePreviewCallback.hal
+++ b/camera/device/1.0/ICameraDevicePreviewCallback.hal
@@ -17,6 +17,7 @@
package android.hardware.camera.device@1.0;
import android.hardware.camera.common@1.0::types;
+import android.hardware.graphics.allocator@2.0::types;
import android.hardware.graphics.common@1.0::types;
/**
@@ -88,7 +89,7 @@
*
* @return Status The status code for this operation.
*/
- setUsage(ProducerUsageFlags usage) generates (Status status);
+ setUsage(ProducerUsage usage) generates (Status status);
/**
* Set the expected buffering mode for the preview output.
diff --git a/camera/device/1.0/default/Android.bp b/camera/device/1.0/default/Android.bp
index 2fe0699..af94b0f 100644
--- a/camera/device/1.0/default/Android.bp
+++ b/camera/device/1.0/default/Android.bp
@@ -24,8 +24,8 @@
"libcamera_metadata",
],
static_libs: [
- "android.hardware.camera.common@1.0-helper",
- "libgrallocusage"
+ "android.hardware.camera.common@1.0-helper"
],
export_include_dirs: ["."]
}
+
diff --git a/camera/device/1.0/default/CameraDevice.cpp b/camera/device/1.0/default/CameraDevice.cpp
index 5c4723d..877c6e7 100644
--- a/camera/device/1.0/default/CameraDevice.cpp
+++ b/camera/device/1.0/default/CameraDevice.cpp
@@ -21,8 +21,6 @@
#include <hidlmemory/mapping.h>
#include <utils/Trace.h>
-#include <grallocusage/GrallocUsageConversion.h>
-
#include "CameraDevice_1_0.h"
namespace android {
@@ -32,6 +30,7 @@
namespace V1_0 {
namespace implementation {
+using ::android::hardware::graphics::allocator::V2_0::ProducerUsage;
using ::android::hardware::graphics::common::V1_0::PixelFormat;
HandleImporter& CameraDevice::sHandleImporter = HandleImporter::getInstance();
@@ -260,10 +259,7 @@
}
object->cleanUpCirculatingBuffers();
- ProducerUsageFlags producerUsage;
- uint64_t consumerUsage;
- ::android_convertGralloc0To1Usage(usage, &producerUsage, &consumerUsage);
- return getStatusT(object->mPreviewCallback->setUsage(producerUsage));
+ return getStatusT(object->mPreviewCallback->setUsage((ProducerUsage) usage));
}
int CameraDevice::sSetSwapInterval(struct preview_stream_ops *w, int interval) {
diff --git a/camera/device/1.0/types.hal b/camera/device/1.0/types.hal
index 0b3445f..ce5205e 100644
--- a/camera/device/1.0/types.hal
+++ b/camera/device/1.0/types.hal
@@ -16,10 +16,6 @@
package android.hardware.camera.device@1.0;
-import android.hardware.graphics.allocator@2.0::types;
-
-typedef bitfield<ProducerUsage> ProducerUsageFlags;
-
enum CameraFacing : uint32_t {
/** The facing of the camera is opposite to that of the screen. */
BACK = 0,
diff --git a/camera/device/3.2/default/Android.bp b/camera/device/3.2/default/Android.bp
index 5a81d41..e0dc5ff 100644
--- a/camera/device/3.2/default/Android.bp
+++ b/camera/device/3.2/default/Android.bp
@@ -17,8 +17,7 @@
"libcamera_metadata"
],
static_libs: [
- "android.hardware.camera.common@1.0-helper",
- "libgrallocusage"
+ "android.hardware.camera.common@1.0-helper"
],
export_include_dirs: ["."]
}
diff --git a/camera/device/3.2/default/CameraDeviceSession.cpp b/camera/device/3.2/default/CameraDeviceSession.cpp
index f2f9e5e..5b3024b 100644
--- a/camera/device/3.2/default/CameraDeviceSession.cpp
+++ b/camera/device/3.2/default/CameraDeviceSession.cpp
@@ -611,7 +611,7 @@
return Void();
}
mStreamMap[id].rotation = (int) requestedConfiguration.streams[i].rotation;
- mStreamMap[id].usage = convertFromHidlUsage(requestedConfiguration.streams[i].usage);
+ mStreamMap[id].usage = (uint32_t) requestedConfiguration.streams[i].usage;
}
streams[i] = &mStreamMap[id];
}
diff --git a/camera/device/3.2/default/convert.cpp b/camera/device/3.2/default/convert.cpp
index c99d903..35676df 100644
--- a/camera/device/3.2/default/convert.cpp
+++ b/camera/device/3.2/default/convert.cpp
@@ -15,12 +15,8 @@
*/
#define LOG_TAG "android.hardware.camera.device@3.2-convert-impl"
-#include <inttypes.h>
-
#include <android/log.h>
-#include <grallocusage/GrallocUsageConversion.h>
-
#include "include/convert.h"
namespace android {
@@ -32,7 +28,6 @@
using ::android::hardware::graphics::common::V1_0::Dataspace;
using ::android::hardware::graphics::common::V1_0::PixelFormat;
-using ::android::hardware::graphics::allocator::V2_0::ConsumerUsage;
using ::android::hardware::camera::device::V3_2::ConsumerUsageFlags;
using ::android::hardware::camera::device::V3_2::ProducerUsageFlags;
@@ -71,37 +66,23 @@
dst->format = (int) src.format;
dst->data_space = (android_dataspace_t) src.dataSpace;
dst->rotation = (int) src.rotation;
- dst->usage = convertFromHidlUsage(src.usage);
+ dst->usage = (uint32_t) src.usage;
// Fields to be filled by HAL (max_buffers, priv) are initialized to 0
dst->max_buffers = 0;
dst->priv = 0;
return;
}
-uint32_t convertFromHidlUsage(ConsumerUsageFlags usage) {
- uint32_t dstUsage = 0;
- dstUsage = ::android_convertGralloc1To0Usage(/*producerUsage*/ 0, usage);
- // Compatibility workaround - add HW_CAMERA_ZSL when ConsumerUsage.CAMERA is set, to
- // match pre-HIDL expected usage flags
- if ( (usage & ConsumerUsage::CAMERA) == static_cast<uint64_t>(ConsumerUsage::CAMERA)) {
- dstUsage |= GRALLOC_USAGE_HW_CAMERA_ZSL;
- }
- return dstUsage;
-}
-
void convertToHidl(const Camera3Stream* src, HalStream* dst) {
dst->id = src->mId;
dst->overrideFormat = (PixelFormat) src->format;
dst->maxBuffers = src->max_buffers;
- ConsumerUsageFlags consumerUsage;
- ProducerUsageFlags producerUsage;
- ::android_convertGralloc0To1Usage(src->usage, &producerUsage, &consumerUsage);
if (src->stream_type == CAMERA3_STREAM_OUTPUT) {
dst->consumerUsage = (ConsumerUsageFlags) 0;
- dst->producerUsage = producerUsage;
+ dst->producerUsage = (ProducerUsageFlags) src->usage;
} else if (src->stream_type == CAMERA3_STREAM_INPUT) {
dst->producerUsage = (ProducerUsageFlags) 0;
- dst->consumerUsage = consumerUsage;
+ dst->consumerUsage = (ConsumerUsageFlags) src->usage;
} else {
//Should not reach here per current HIDL spec, but we might end up adding
// bi-directional stream to HIDL.
diff --git a/camera/device/3.2/default/include/convert.h b/camera/device/3.2/default/include/convert.h
index 7c8e02f..96891f0 100644
--- a/camera/device/3.2/default/include/convert.h
+++ b/camera/device/3.2/default/include/convert.h
@@ -45,8 +45,6 @@
void convertFromHidl(const Stream &src, Camera3Stream* dst);
void convertToHidl(const Camera3Stream* src, HalStream* dst);
-uint32_t convertFromHidlUsage(ConsumerUsageFlags usage);
-
void convertFromHidl(
buffer_handle_t*, BufferStatus, camera3_stream_t*, int acquireFence, // inputs
camera3_stream_buffer_t* dst);
diff --git a/camera/provider/2.4/vts/functional/Android.bp b/camera/provider/2.4/vts/functional/Android.bp
index 02c42c9..a0be5cb 100644
--- a/camera/provider/2.4/vts/functional/Android.bp
+++ b/camera/provider/2.4/vts/functional/Android.bp
@@ -33,10 +33,7 @@
"libgui",
"libui"
],
- static_libs: [
- "VtsHalHidlTargetTestBase",
- "libgrallocusage"
- ],
+ static_libs: ["VtsHalHidlTargetTestBase"],
cflags: [
"-O0",
"-g",
diff --git a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp
index 4d3c6eb..74e6efe 100644
--- a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp
+++ b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp
@@ -21,7 +21,6 @@
#include "CameraParameters.h"
#include <system/camera.h>
#include <android/log.h>
-#include <grallocusage/GrallocUsageConversion.h>
#include <ui/GraphicBuffer.h>
#include <VtsHalHidlTargetTestBase.h>
#include <gui/BufferQueue.h>
@@ -54,7 +53,6 @@
using ::android::Surface;
using ::android::CameraParameters;
using ::android::hardware::graphics::common::V1_0::PixelFormat;
-using ::android::hardware::graphics::allocator::V2_0::ConsumerUsage;
using ::android::hardware::graphics::allocator::V2_0::ProducerUsage;
using ::android::hardware::camera::common::V1_0::Status;
using ::android::hardware::camera::common::V1_0::CameraDeviceStatus;
@@ -62,8 +60,6 @@
using ::android::hardware::camera::common::V1_0::TorchModeStatus;
using ::android::hardware::camera::provider::V2_4::ICameraProvider;
using ::android::hardware::camera::provider::V2_4::ICameraProviderCallback;
-using ::android::hardware::camera::device::V3_2::ProducerUsageFlags;
-using ::android::hardware::camera::device::V3_2::ConsumerUsageFlags;
using ::android::hardware::camera::device::V3_2::ICameraDevice;
using ::android::hardware::camera::device::V3_2::BufferCache;
using ::android::hardware::camera::device::V3_2::CaptureRequest;
@@ -84,7 +80,6 @@
using ::android::hardware::camera::device::V3_2::MsgType;
using ::android::hardware::camera::device::V3_2::ErrorMsg;
using ::android::hardware::camera::device::V3_2::ErrorCode;
-using ::android::hardware::camera::device::V1_0::ProducerUsageFlags;
using ::android::hardware::camera::device::V1_0::CameraFacing;
using ::android::hardware::camera::device::V1_0::NotifyCallbackMsg;
using ::android::hardware::camera::device::V1_0::CommandType;
@@ -238,7 +233,7 @@
Return<Status> setCrop(int32_t left, int32_t top,
int32_t right, int32_t bottom) override;
- Return<Status> setUsage(ProducerUsageFlags usage) override;
+ Return<Status> setUsage(ProducerUsage usage) override;
Return<Status> setSwapInterval(int32_t interval) override;
@@ -413,11 +408,10 @@
return mapToStatus(rc);
}
-Return<Status> PreviewWindowCb::setUsage(ProducerUsageFlags usage) {
- int dstUsage = ::android_convertGralloc1To0Usage(usage, /*consumerUsage*/ 0);
- auto rc = native_window_set_usage(mAnw.get(), dstUsage);
+Return<Status> PreviewWindowCb::setUsage(ProducerUsage usage) {
+ auto rc = native_window_set_usage(mAnw.get(), static_cast<int>(usage));
if (rc == ::android::OK) {
- mPreviewUsage = dstUsage;
+ mPreviewUsage = static_cast<int>(usage);
}
return mapToStatus(rc);
}
@@ -2205,7 +2199,7 @@
static_cast<uint32_t> (input.width),
static_cast<uint32_t> (input.height),
static_cast<PixelFormat> (input.format),
- static_cast<ConsumerUsageFlags>(ConsumerUsage::CAMERA), 0,
+ GRALLOC_USAGE_HW_CAMERA_ZSL, 0,
StreamRotation::ROTATION_0};
Stream inputStream = {streamId++, StreamType::INPUT,
static_cast<uint32_t> (input.width),
@@ -2437,7 +2431,7 @@
static_cast<uint32_t> (blobIter.width),
static_cast<uint32_t> (blobIter.height),
static_cast<PixelFormat> (blobIter.format),
- static_cast<ConsumerUsageFlags>(ConsumerUsage::VIDEO_ENCODER), 0,
+ GRALLOC_USAGE_HW_VIDEO_ENCODER, 0,
StreamRotation::ROTATION_0};
::android::hardware::hidl_vec<Stream> streams = {
videoStream, blobStream};
diff --git a/configstore/1.0/default/SurfaceFlingerConfigs.cpp b/configstore/1.0/default/SurfaceFlingerConfigs.cpp
index 9469ab4..70bd803 100644
--- a/configstore/1.0/default/SurfaceFlingerConfigs.cpp
+++ b/configstore/1.0/default/SurfaceFlingerConfigs.cpp
@@ -12,7 +12,6 @@
Return<void> SurfaceFlingerConfigs::vsyncEventPhaseOffsetNs(vsyncEventPhaseOffsetNs_cb _hidl_cb) {
#ifdef VSYNC_EVENT_PHASE_OFFSET_NS
_hidl_cb({true, VSYNC_EVENT_PHASE_OFFSET_NS});
- LOG(INFO) << "vsync event phase offset ns = " << VSYNC_EVENT_PHASE_OFFSET_NS;
#else
_hidl_cb({false, 0});
#endif
@@ -22,7 +21,6 @@
Return<void> SurfaceFlingerConfigs::vsyncSfEventPhaseOffsetNs(vsyncEventPhaseOffsetNs_cb _hidl_cb) {
#ifdef SF_VSYNC_EVENT_PHASE_OFFSET_NS
_hidl_cb({true, SF_VSYNC_EVENT_PHASE_OFFSET_NS});
- LOG(INFO) << "sfvsync event phase offset ns = " << SF_VSYNC_EVENT_PHASE_OFFSET_NS;
#else
_hidl_cb({false, 0});
#endif
@@ -32,7 +30,6 @@
Return<void> SurfaceFlingerConfigs::useContextPriority(useContextPriority_cb _hidl_cb) {
#ifdef USE_CONTEXT_PRIORITY
_hidl_cb({true, USE_CONTEXT_PRIORITY});
- LOG(INFO) << "SurfaceFlinger useContextPriority=" << USE_CONTEXT_PRIORITY;
#else
_hidl_cb({false, false});
#endif
@@ -42,7 +39,6 @@
Return<void> SurfaceFlingerConfigs::maxFrameBufferAcquiredBuffers(maxFrameBufferAcquiredBuffers_cb _hidl_cb) {
#ifdef NUM_FRAMEBUFFER_SURFACE_BUFFERS
_hidl_cb({true, NUM_FRAMEBUFFER_SURFACE_BUFFERS});
- LOG(INFO) << "SurfaceFlinger FrameBuffer max acquired buffers : " << NUM_FRAMEBUFFER_SURFACE_BUFFERS;
#else
_hidl_cb({false, 0});
#endif
@@ -55,7 +51,6 @@
value = true;
#endif
_hidl_cb({true, value});
- LOG(INFO) << "SurfaceFlinger Display: " << (value ? "Wide Color" : "Standard Color");
return Void();
}
@@ -65,7 +60,6 @@
value = false;
#endif
_hidl_cb({true, value});
- LOG(INFO) << "SurfaceFlinger hasSyncFramework: " << value;
return Void();
}
@@ -75,14 +69,12 @@
value = true;
#endif
_hidl_cb({true, value});
- LOG(INFO) << "SurfaceFlinger Display: " << (value ? "HDR" : "SDR");
return Void();
}
Return<void> SurfaceFlingerConfigs::presentTimeOffsetFromVSyncNs(presentTimeOffsetFromVSyncNs_cb _hidl_cb) {
#ifdef PRESENT_TIME_OFFSET_FROM_VSYNC_NS
_hidl_cb({true, PRESENT_TIME_OFFSET_FROM_VSYNC_NS});
- LOG(INFO) << "SurfaceFlinger presentTimeStampOffsetNs = " << PRESENT_TIME_OFFSET_FROM_VSYNC_NS;
#else
_hidl_cb({false, 0});
#endif
@@ -95,7 +87,6 @@
value = true;
#endif
_hidl_cb({true, value});
- LOG(INFO) << "SurfaceFlinger forceHwcForRGBtoYUV: " << value;
return Void();
}
@@ -104,7 +95,6 @@
#ifdef MAX_VIRTUAL_DISPLAY_DIMENSION
maxSize = MAX_VIRTUAL_DISPLAY_DIMENSION;
_hidl_cb({true, maxSize});
- LOG(INFO) << "SurfaceFlinger MaxVirtualDisplaySize: " << maxSize;
#else
_hidl_cb({false, maxSize});
#endif
@@ -119,7 +109,6 @@
specified = true;
#endif
_hidl_cb({specified, value});
- LOG(INFO) << "SurfaceFlinger UseVrFlinger: " << (value ? "true" : "false");
return Void();
}
diff --git a/configstore/utils/Android.bp b/configstore/utils/Android.bp
index aa420d1..2c8aad6 100644
--- a/configstore/utils/Android.bp
+++ b/configstore/utils/Android.bp
@@ -14,14 +14,22 @@
// limitations under the License.
//
-cc_library_headers {
+cc_library_shared {
name: "android.hardware.configstore-utils",
defaults: ["hidl_defaults"],
+
+ srcs: [ "ConfigStoreUtils.cpp" ],
+
export_include_dirs: ["include"],
+
shared_libs: [
+ "android.hardware.configstore@1.0",
+ "libbase",
"libhidlbase"
],
export_shared_lib_headers: [
+ "android.hardware.configstore@1.0",
+ "libbase",
"libhidlbase"
],
}
diff --git a/configstore/utils/ConfigStoreUtils.cpp b/configstore/utils/ConfigStoreUtils.cpp
new file mode 100644
index 0000000..5a1fb42
--- /dev/null
+++ b/configstore/utils/ConfigStoreUtils.cpp
@@ -0,0 +1,40 @@
+//
+// Copyright (C) 2017 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.
+//
+
+#define LOG_TAG "ConfigStore"
+
+#include <android-base/logging.h>
+#include <configstore/Utils.h>
+
+namespace android {
+namespace hardware {
+namespace details {
+
+bool wouldLogInfo() {
+ return WOULD_LOG(INFO);
+}
+
+void logAlwaysInfo(const std::string& message) {
+ LOG(INFO) << message;
+}
+
+void logAlwaysError(const std::string& message) {
+ LOG(ERROR) << message;
+}
+
+} // namespace details
+} // namespace hardware
+} // namespace android
diff --git a/configstore/utils/include/configstore/Utils.h b/configstore/utils/include/configstore/Utils.h
index 46cc9b0..a54ce85 100644
--- a/configstore/utils/include/configstore/Utils.h
+++ b/configstore/utils/include/configstore/Utils.h
@@ -17,24 +17,31 @@
#ifndef ANDROID_HARDWARE_CONFIGSTORE_UTILS_H
#define ANDROID_HARDWARE_CONFIGSTORE_UTILS_H
+#include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
#include <hidl/Status.h>
-#include <stdatomic.h>
-#pragma push_macro("LOG_TAG")
-#undef LOG_TAG
-#define LOG_TAG "ConfigStoreUtil"
+#include <sstream>
namespace android {
namespace hardware {
+
+namespace details {
+// Templated classes can use the below method
+// to avoid creating dependencies on liblog.
+bool wouldLogInfo();
+void logAlwaysInfo(const std::string& message);
+void logAlwaysError(const std::string& message);
+} // namespace details
+
namespace configstore {
+using namespace android::hardware::configstore::V1_0;
// arguments V: type for the value (i.e., OptionalXXX)
// I: interface class name
// func: member function pointer
-using namespace V1_0;
-
template<typename V, typename I, android::hardware::Return<void> (I::* func)
(std::function<void(const V&)>)>
decltype(V::value) get(const decltype(V::value) &defValue) {
+ using namespace android::hardware::details;
auto getHelper = []()->V {
V ret;
sp<I> configs = I::getService();
@@ -47,7 +54,11 @@
ret = v;
});
if (!status.isOk()) {
- ALOGE("HIDL call failed. %s", status.description().c_str());
+ std::ostringstream oss;
+ oss << "HIDL call failed for retrieving a config item from "
+ "configstore : "
+ << status.description().c_str();
+ logAlwaysError(oss.str());
ret.specified = false;
}
}
@@ -56,6 +67,24 @@
};
static V cachedValue = getHelper();
+ if (wouldLogInfo()) {
+ std::string iname = __PRETTY_FUNCTION__;
+ // func name starts with "func = " in __PRETTY_FUNCTION__
+ auto pos = iname.find("func = ");
+ if (pos != std::string::npos) {
+ iname = iname.substr(pos + sizeof("func = "));
+ iname.pop_back(); // remove trailing ']'
+ } else {
+ iname += " (unknown)";
+ }
+
+ std::ostringstream oss;
+ oss << iname << " retrieved: "
+ << (cachedValue.specified ? cachedValue.value : defValue)
+ << (cachedValue.specified ? "" : " (default)");
+ logAlwaysInfo(oss.str());
+ }
+
return cachedValue.specified ? cachedValue.value : defValue;
}
@@ -99,6 +128,4 @@
} // namespace hardware
} // namespace android
-#pragma pop_macro("LOG_TAG")
-
#endif // ANDROID_HARDWARE_CONFIGSTORE_UTILS_H
diff --git a/drm/1.0/vts/functional/drm_hal_vendor_test.cpp b/drm/1.0/vts/functional/drm_hal_vendor_test.cpp
index dcfee4e..bd78442c 100644
--- a/drm/1.0/vts/functional/drm_hal_vendor_test.cpp
+++ b/drm/1.0/vts/functional/drm_hal_vendor_test.cpp
@@ -973,8 +973,12 @@
testing::ValuesIn(gVendorModules->getVendorModulePaths()));
int main(int argc, char** argv) {
- gVendorModules =
- new drm_vts::VendorModules("/data/nativetest/drm_hidl_test/vendor");
+#if defined(__LP64__)
+ const char *kModulePath = "/data/local/tmp/64/lib";
+#else
+ const char *kModulePath = "/data/local/tmp/32/lib";
+#endif
+ gVendorModules = new drm_vts::VendorModules(kModulePath);
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
diff --git a/drm/1.0/vts/functional/vendor/lib/libvtswidevine.so b/drm/1.0/vts/functional/vendor/lib/libvtswidevine.so
deleted file mode 100755
index d365b34..0000000
--- a/drm/1.0/vts/functional/vendor/lib/libvtswidevine.so
+++ /dev/null
Binary files differ
diff --git a/keymaster/3.0/vts/functional/Android.mk b/keymaster/3.0/vts/functional/Android.mk
index 4265b9f..4098664 100644
--- a/keymaster/3.0/vts/functional/Android.mk
+++ b/keymaster/3.0/vts/functional/Android.mk
@@ -15,7 +15,7 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_MODULE := keymaster_hidl_hal_test
+LOCAL_MODULE := VtsHalKeymasterV3_0TargetTest
LOCAL_SRC_FILES := \
authorization_set.cpp \
attestation_record.cpp \
diff --git a/keymaster/3.0/vts/functional/keymaster_hidl_hal_test.cpp b/keymaster/3.0/vts/functional/keymaster_hidl_hal_test.cpp
index 2382f0b..edb1cd1 100644
--- a/keymaster/3.0/vts/functional/keymaster_hidl_hal_test.cpp
+++ b/keymaster/3.0/vts/functional/keymaster_hidl_hal_test.cpp
@@ -46,6 +46,8 @@
// non-gtest argument will be used as the service name.
string service_name = "default";
+static bool arm_deleteAllKeys = false;
+
namespace android {
namespace hardware {
@@ -488,13 +490,20 @@
return ExportKey(format, key_blob_, client_id, app_data, key_material);
}
- ErrorCode DeleteKey(HidlBuf* key_blob) {
+ ErrorCode DeleteKey(HidlBuf* key_blob, bool keep_key_blob = false) {
ErrorCode error = keymaster_->deleteKey(*key_blob);
- *key_blob = HidlBuf();
+ if (!keep_key_blob) *key_blob = HidlBuf();
return error;
}
- ErrorCode DeleteKey() { return DeleteKey(&key_blob_); }
+ ErrorCode DeleteKey(bool keep_key_blob = false) {
+ return DeleteKey(&key_blob_, keep_key_blob);
+ }
+
+ ErrorCode DeleteAllKeys() {
+ ErrorCode error = keymaster_->deleteAllKeys();
+ return error;
+ }
ErrorCode GetCharacteristics(const HidlBuf& key_blob, const HidlBuf& client_id,
const HidlBuf& app_data, KeyCharacteristics* key_characteristics) {
@@ -3893,6 +3902,124 @@
&cert_chain));
}
+typedef KeymasterHidlTest KeyDeletionTest;
+
+/**
+ * KeyDeletionTest.DeleteKey
+ *
+ * This test checks that if rollback protection is implemented, DeleteKey invalidates a formerly
+ * valid key blob.
+ */
+TEST_F(KeyDeletionTest, DeleteKey) {
+ ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
+ .RsaSigningKey(1024, 3)
+ .Digest(Digest::NONE)
+ .Padding(PaddingMode::NONE)
+ .Authorization(TAG_NO_AUTH_REQUIRED)));
+
+ // Delete must work if rollback protection is implemented
+ AuthorizationSet teeEnforced(key_characteristics_.teeEnforced);
+ bool rollback_protected = teeEnforced.Contains(TAG_ROLLBACK_RESISTANT);
+
+ if (rollback_protected) {
+ ASSERT_EQ(ErrorCode::OK, DeleteKey(true /* keep key blob */));
+ } else {
+ auto delete_result = DeleteKey(true /* keep key blob */);
+ ASSERT_TRUE(delete_result == ErrorCode::OK | delete_result == ErrorCode::UNIMPLEMENTED);
+ }
+
+ string message = "12345678901234567890123456789012";
+ AuthorizationSet begin_out_params;
+
+ if (rollback_protected) {
+ EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB,
+ Begin(KeyPurpose::SIGN, key_blob_,
+ AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE),
+ &begin_out_params, &op_handle_));
+ } else {
+ EXPECT_EQ(ErrorCode::OK,
+ Begin(KeyPurpose::SIGN, key_blob_,
+ AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE),
+ &begin_out_params, &op_handle_));
+ }
+ AbortIfNeeded();
+ key_blob_ = HidlBuf();
+}
+
+/**
+ * KeyDeletionTest.DeleteInvalidKey
+ *
+ * This test checks that the HAL excepts invalid key blobs.
+ */
+TEST_F(KeyDeletionTest, DeleteInvalidKey) {
+ // Generate key just to check if rollback protection is implemented
+ ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
+ .RsaSigningKey(1024, 3)
+ .Digest(Digest::NONE)
+ .Padding(PaddingMode::NONE)
+ .Authorization(TAG_NO_AUTH_REQUIRED)));
+
+ // Delete must work if rollback protection is implemented
+ AuthorizationSet teeEnforced(key_characteristics_.teeEnforced);
+ bool rollback_protected = teeEnforced.Contains(TAG_ROLLBACK_RESISTANT);
+
+ // Delete the key we don't care about the result at this point.
+ DeleteKey();
+
+ // Now create an invalid key blob and delete it.
+ key_blob_ = HidlBuf("just some garbage data which is not a valid key blob");
+
+ if (rollback_protected) {
+ ASSERT_EQ(ErrorCode::OK, DeleteKey());
+ } else {
+ auto delete_result = DeleteKey();
+ ASSERT_TRUE(delete_result == ErrorCode::OK | delete_result == ErrorCode::UNIMPLEMENTED);
+ }
+}
+
+/**
+ * KeyDeletionTest.DeleteAllKeys
+ *
+ * This test is disarmed by default. To arm it use --arm_deleteAllKeys.
+ *
+ * BEWARE: This test has serious side effects. All user keys will be lost! This includes
+ * FBE/FDE encryption keys, which means that the device will not even boot until after the
+ * device has been wiped manually (e.g., fastboot flashall -w), and new FBE/FDE keys have
+ * been provisioned. Use this test only on dedicated testing devices that have no valuable
+ * credentials stored in Keystore/Keymaster.
+ */
+TEST_F(KeyDeletionTest, DeleteAllKeys) {
+ if (!arm_deleteAllKeys) return;
+ ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
+ .RsaSigningKey(1024, 3)
+ .Digest(Digest::NONE)
+ .Padding(PaddingMode::NONE)
+ .Authorization(TAG_NO_AUTH_REQUIRED)));
+
+ // Delete must work if rollback protection is implemented
+ AuthorizationSet teeEnforced(key_characteristics_.teeEnforced);
+ bool rollback_protected = teeEnforced.Contains(TAG_ROLLBACK_RESISTANT);
+
+ ASSERT_EQ(ErrorCode::OK, DeleteAllKeys());
+
+ string message = "12345678901234567890123456789012";
+ AuthorizationSet begin_out_params;
+
+ if (rollback_protected) {
+ EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB,
+ Begin(KeyPurpose::SIGN, key_blob_,
+ AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE),
+ &begin_out_params, &op_handle_));
+ } else {
+ EXPECT_EQ(ErrorCode::OK,
+ Begin(KeyPurpose::SIGN, key_blob_,
+ AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE),
+ &begin_out_params, &op_handle_));
+ }
+ AbortIfNeeded();
+ key_blob_ = HidlBuf();
+}
+
} // namespace test
} // namespace V3_0
} // namespace keymaster
@@ -3901,9 +4028,19 @@
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
- if (argc == 2) {
- ALOGI("Running keymaster VTS against service \"%s\"", argv[1]);
- service_name = argv[1];
+ std::vector<std::string> positional_args;
+ for (int i = 1; i < argc; ++i) {
+ if (argv[i][0] == '-') {
+ if (std::string(argv[i]) == "--arm_deleteAllKeys") {
+ arm_deleteAllKeys = true;
+ }
+ } else {
+ positional_args.push_back(argv[i]);
+ }
+ }
+ if (positional_args.size()) {
+ ALOGI("Running keymaster VTS against service \"%s\"", positional_args[0].c_str());
+ service_name = positional_args[0];
}
int status = RUN_ALL_TESTS();
ALOGI("Test result = %d", status);
diff --git a/usb/1.0/default/service.cpp b/usb/1.0/default/service.cpp
index 4605a4c..43ab6f0 100644
--- a/usb/1.0/default/service.cpp
+++ b/usb/1.0/default/service.cpp
@@ -27,13 +27,21 @@
using android::hardware::usb::V1_0::IUsb;
using android::hardware::usb::V1_0::implementation::Usb;
+using android::status_t;
+using android::OK;
+
int main() {
android::sp<IUsb> service = new Usb();
configureRpcThreadpool(1, true /*callerWillJoin*/);
- service->registerAsService();
+ status_t status = service->registerAsService();
- ALOGI("USB HAL Ready.");
- joinRpcThreadpool();
+ if (status == OK) {
+ ALOGI("USB HAL Ready.");
+ joinRpcThreadpool();
+ }
+
+ ALOGE("Cannot register USB HAL service");
+ return 1;
}
diff --git a/wifi/1.0/default/hidl_callback_util.h b/wifi/1.0/default/hidl_callback_util.h
index 7136279..b7100c8 100644
--- a/wifi/1.0/default/hidl_callback_util.h
+++ b/wifi/1.0/default/hidl_callback_util.h
@@ -82,7 +82,7 @@
return true;
}
- const std::set<android::sp<CallbackType>> getCallbacks() { return cb_set_; }
+ const std::set<android::sp<CallbackType>>& getCallbacks() { return cb_set_; }
// Death notification for callbacks.
void onObjectDeath(uint64_t cookie) {
diff --git a/wifi/1.0/default/hidl_struct_util.cpp b/wifi/1.0/default/hidl_struct_util.cpp
index c005213..83b2e53 100644
--- a/wifi/1.0/default/hidl_struct_util.cpp
+++ b/wifi/1.0/default/hidl_struct_util.cpp
@@ -417,17 +417,25 @@
const wifi_ie& legacy_ie = (*reinterpret_cast<const wifi_ie*>(next_ie));
uint32_t curr_ie_len = kIeHeaderLen + legacy_ie.len;
if (next_ie + curr_ie_len > ies_end) {
- return false;
+ LOG(ERROR) << "Error parsing IE blob. Next IE: " << (void *)next_ie
+ << ", Curr IE len: " << curr_ie_len << ", IEs End: " << (void *)ies_end;
+ break;
}
WifiInformationElement hidl_ie;
if (!convertLegacyIeToHidl(legacy_ie, &hidl_ie)) {
- return false;
+ LOG(ERROR) << "Error converting IE. Id: " << legacy_ie.id
+ << ", len: " << legacy_ie.len;
+ break;
}
hidl_ies->push_back(std::move(hidl_ie));
next_ie += curr_ie_len;
}
- // Ensure that the blob has been fully consumed.
- return (next_ie == ies_end);
+ // Check if the blob has been fully consumed.
+ if (next_ie != ies_end) {
+ LOG(ERROR) << "Failed to fully parse IE blob. Next IE: " << (void *)next_ie
+ << ", IEs End: " << (void *)ies_end;
+ }
+ return true;
}
bool convertLegacyGscanResultToHidl(
@@ -774,10 +782,104 @@
CHECK(false);
}
+legacy_hal::NanMatchAlg convertHidlNanMatchAlgToLegacy(NanMatchAlg type) {
+ switch (type) {
+ case NanMatchAlg::MATCH_ONCE:
+ return legacy_hal::NAN_MATCH_ALG_MATCH_ONCE;
+ case NanMatchAlg::MATCH_CONTINUOUS:
+ return legacy_hal::NAN_MATCH_ALG_MATCH_CONTINUOUS;
+ case NanMatchAlg::MATCH_NEVER:
+ return legacy_hal::NAN_MATCH_ALG_MATCH_NEVER;
+ }
+ CHECK(false);
+}
+
+legacy_hal::NanPublishType convertHidlNanPublishTypeToLegacy(NanPublishType type) {
+ switch (type) {
+ case NanPublishType::UNSOLICITED:
+ return legacy_hal::NAN_PUBLISH_TYPE_UNSOLICITED;
+ case NanPublishType::SOLICITED:
+ return legacy_hal::NAN_PUBLISH_TYPE_SOLICITED;
+ case NanPublishType::UNSOLICITED_SOLICITED:
+ return legacy_hal::NAN_PUBLISH_TYPE_UNSOLICITED_SOLICITED;
+ }
+ CHECK(false);
+}
+
+legacy_hal::NanTxType convertHidlNanTxTypeToLegacy(NanTxType type) {
+ switch (type) {
+ case NanTxType::BROADCAST:
+ return legacy_hal::NAN_TX_TYPE_BROADCAST;
+ case NanTxType::UNICAST:
+ return legacy_hal::NAN_TX_TYPE_UNICAST;
+ }
+ CHECK(false);
+}
+
+legacy_hal::NanSubscribeType convertHidlNanSubscribeTypeToLegacy(NanSubscribeType type) {
+ switch (type) {
+ case NanSubscribeType::PASSIVE:
+ return legacy_hal::NAN_SUBSCRIBE_TYPE_PASSIVE;
+ case NanSubscribeType::ACTIVE:
+ return legacy_hal::NAN_SUBSCRIBE_TYPE_ACTIVE;
+ }
+ CHECK(false);
+}
+
+legacy_hal::NanSRFType convertHidlNanSrfTypeToLegacy(NanSrfType type) {
+ switch (type) {
+ case NanSrfType::BLOOM_FILTER:
+ return legacy_hal::NAN_SRF_ATTR_BLOOM_FILTER;
+ case NanSrfType::PARTIAL_MAC_ADDR:
+ return legacy_hal::NAN_SRF_ATTR_PARTIAL_MAC_ADDR;
+ }
+ CHECK(false);
+}
+
+legacy_hal::NanDataPathChannelCfg convertHidlNanDataPathChannelCfgToLegacy(
+ NanDataPathChannelCfg type) {
+ switch (type) {
+ case NanDataPathChannelCfg::CHANNEL_NOT_REQUESTED:
+ return legacy_hal::NAN_DP_CHANNEL_NOT_REQUESTED;
+ case NanDataPathChannelCfg::REQUEST_CHANNEL_SETUP:
+ return legacy_hal::NAN_DP_REQUEST_CHANNEL_SETUP;
+ case NanDataPathChannelCfg::FORCE_CHANNEL_SETUP:
+ return legacy_hal::NAN_DP_FORCE_CHANNEL_SETUP;
+ }
+ CHECK(false);
+}
+
NanStatusType convertLegacyNanStatusTypeToHidl(
legacy_hal::NanStatusType type) {
- // values are identical - may need to do a mapping if they diverge in the future
- return (NanStatusType) type;
+ switch (type) {
+ case legacy_hal::NAN_STATUS_SUCCESS:
+ return NanStatusType::SUCCESS;
+ case legacy_hal::NAN_STATUS_INTERNAL_FAILURE:
+ return NanStatusType::INTERNAL_FAILURE;
+ case legacy_hal::NAN_STATUS_PROTOCOL_FAILURE:
+ return NanStatusType::PROTOCOL_FAILURE;
+ case legacy_hal::NAN_STATUS_INVALID_PUBLISH_SUBSCRIBE_ID:
+ return NanStatusType::INVALID_SESSION_ID;
+ case legacy_hal::NAN_STATUS_NO_RESOURCE_AVAILABLE:
+ return NanStatusType::NO_RESOURCES_AVAILABLE;
+ case legacy_hal::NAN_STATUS_INVALID_PARAM:
+ return NanStatusType::INVALID_ARGS;
+ case legacy_hal::NAN_STATUS_INVALID_REQUESTOR_INSTANCE_ID:
+ return NanStatusType::INVALID_PEER_ID;
+ case legacy_hal::NAN_STATUS_INVALID_NDP_ID:
+ return NanStatusType::INVALID_NDP_ID;
+ case legacy_hal::NAN_STATUS_NAN_NOT_ALLOWED:
+ return NanStatusType::NAN_NOT_ALLOWED;
+ case legacy_hal::NAN_STATUS_NO_OTA_ACK:
+ return NanStatusType::NO_OTA_ACK;
+ case legacy_hal::NAN_STATUS_ALREADY_ENABLED:
+ return NanStatusType::ALREADY_ENABLED;
+ case legacy_hal::NAN_STATUS_FOLLOWUP_QUEUE_FULL:
+ return NanStatusType::FOLLOWUP_TX_QUEUE_FULL;
+ case legacy_hal::NAN_STATUS_UNSUPPORTED_CONCURRENCY_NAN_DISABLED:
+ return NanStatusType::UNSUPPORTED_CONCURRENCY_NAN_DISABLED;
+ }
+ CHECK(false);
}
bool convertHidlNanEnableRequestToLegacy(
@@ -931,7 +1033,7 @@
memcpy(legacy_request->service_name, hidl_request.baseConfigs.serviceName.data(),
legacy_request->service_name_len);
legacy_request->publish_match_indicator =
- (legacy_hal::NanMatchAlg) hidl_request.baseConfigs.discoveryMatchIndicator;
+ convertHidlNanMatchAlgToLegacy(hidl_request.baseConfigs.discoveryMatchIndicator);
legacy_request->service_specific_info_len = hidl_request.baseConfigs.serviceSpecificInfo.size();
if (legacy_request->service_specific_info_len > NAN_MAX_SERVICE_SPECIFIC_INFO_LEN) {
LOG(ERROR) << "convertHidlNanPublishRequestToLegacy: service_specific_info_len too large";
@@ -1018,8 +1120,8 @@
legacy_request->ranging_auto_response = hidl_request.baseConfigs.rangingRequired ?
legacy_hal::NAN_RANGING_AUTO_RESPONSE_ENABLE : legacy_hal::NAN_RANGING_AUTO_RESPONSE_DISABLE;
legacy_request->sdea_params.range_report = legacy_hal::NAN_DISABLE_RANGE_REPORT;
- legacy_request->publish_type = (legacy_hal::NanPublishType) hidl_request.publishType;
- legacy_request->tx_type = (legacy_hal::NanTxType) hidl_request.txType;
+ legacy_request->publish_type = convertHidlNanPublishTypeToLegacy(hidl_request.publishType);
+ legacy_request->tx_type = convertHidlNanTxTypeToLegacy(hidl_request.txType);
legacy_request->service_responder_policy = hidl_request.autoAcceptDataPathRequests ?
legacy_hal::NAN_SERVICE_ACCEPT_POLICY_ALL : legacy_hal::NAN_SERVICE_ACCEPT_POLICY_NONE;
@@ -1047,7 +1149,7 @@
memcpy(legacy_request->service_name, hidl_request.baseConfigs.serviceName.data(),
legacy_request->service_name_len);
legacy_request->subscribe_match_indicator =
- (legacy_hal::NanMatchAlg) hidl_request.baseConfigs.discoveryMatchIndicator;
+ convertHidlNanMatchAlgToLegacy(hidl_request.baseConfigs.discoveryMatchIndicator);
legacy_request->service_specific_info_len = hidl_request.baseConfigs.serviceSpecificInfo.size();
if (legacy_request->service_specific_info_len > NAN_MAX_SERVICE_SPECIFIC_INFO_LEN) {
LOG(ERROR) << "convertHidlNanSubscribeRequestToLegacy: service_specific_info_len too large";
@@ -1134,8 +1236,8 @@
legacy_request->ranging_auto_response = hidl_request.baseConfigs.rangingRequired ?
legacy_hal::NAN_RANGING_AUTO_RESPONSE_ENABLE : legacy_hal::NAN_RANGING_AUTO_RESPONSE_DISABLE;
legacy_request->sdea_params.range_report = legacy_hal::NAN_DISABLE_RANGE_REPORT;
- legacy_request->subscribe_type = (legacy_hal::NanSubscribeType) hidl_request.subscribeType;
- legacy_request->serviceResponseFilter = (legacy_hal::NanSRFType) hidl_request.srfType;
+ legacy_request->subscribe_type = convertHidlNanSubscribeTypeToLegacy(hidl_request.subscribeType);
+ legacy_request->serviceResponseFilter = convertHidlNanSrfTypeToLegacy(hidl_request.srfType);
legacy_request->serviceResponseInclude = hidl_request.srfRespondIfInAddressSet ?
legacy_hal::NAN_SRF_INCLUDE_RESPOND : legacy_hal::NAN_SRF_INCLUDE_DO_NOT_RESPOND;
legacy_request->useServiceResponseFilter = hidl_request.shouldUseSrf ?
@@ -1295,7 +1397,7 @@
legacy_request->requestor_instance_id = hidl_request.peerId;
memcpy(legacy_request->peer_disc_mac_addr, hidl_request.peerDiscMacAddr.data(), 6);
legacy_request->channel_request_type =
- (legacy_hal::NanDataPathChannelCfg) hidl_request.channelRequestType;
+ convertHidlNanDataPathChannelCfgToLegacy(hidl_request.channelRequestType);
legacy_request->channel = hidl_request.channel;
strcpy(legacy_request->ndp_iface, hidl_request.ifaceName.c_str());
legacy_request->ndp_cfg.security_cfg = (hidl_request.securityConfig.securityType
diff --git a/wifi/1.0/default/wifi_chip.cpp b/wifi/1.0/default/wifi_chip.cpp
index 9c41a40..319e126 100644
--- a/wifi/1.0/default/wifi_chip.cpp
+++ b/wifi/1.0/default/wifi_chip.cpp
@@ -855,7 +855,8 @@
for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
if (!callback->onDebugRingBufferDataAvailable(hidl_status, data).isOk()) {
LOG(ERROR) << "Failed to invoke onDebugRingBufferDataAvailable"
- << " callback";
+ << " callback on: " << toString(callback);
+
}
}
};