/* * Copyright (C) 2016 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 <nvram/messages/nvram_messages.h> #include <nvram/messages/blob.h> #include <nvram/messages/io.h> #include <nvram/messages/proto.hpp> namespace nvram { // Descriptors for the message types. // IMPORTANT: The field numbers specified here correspond to protocol buffer // fields on the wire. While they are arbitrary, they should never be // reordered, reassigned, or overloaded once defined. template<> struct DescriptorForType<GetInfoRequest> { static constexpr auto kFields = MakeFieldList(); }; template<> struct DescriptorForType<GetInfoResponse> { static constexpr auto kFields = MakeFieldList(MakeField(1, &GetInfoResponse::total_size), MakeField(2, &GetInfoResponse::available_size), MakeField(3, &GetInfoResponse::max_spaces), MakeField(4, &GetInfoResponse::space_list), MakeField(5, &GetInfoResponse::max_space_size), MakeField(6, &GetInfoResponse::wipe_disabled)); }; template<> struct DescriptorForType<CreateSpaceRequest> { static constexpr auto kFields = MakeFieldList(MakeField(1, &CreateSpaceRequest::index), MakeField(2, &CreateSpaceRequest::size), MakeField(3, &CreateSpaceRequest::controls), MakeField(4, &CreateSpaceRequest::authorization_value)); }; template<> struct DescriptorForType<CreateSpaceResponse> { static constexpr auto kFields = MakeFieldList(); }; template<> struct DescriptorForType<GetSpaceInfoRequest> { static constexpr auto kFields = MakeFieldList(MakeField(1, &GetSpaceInfoRequest::index)); }; template<> struct DescriptorForType<GetSpaceInfoResponse> { static constexpr auto kFields = MakeFieldList(MakeField(1, &GetSpaceInfoResponse::size), MakeField(2, &GetSpaceInfoResponse::controls), MakeField(3, &GetSpaceInfoResponse::read_locked), MakeField(4, &GetSpaceInfoResponse::write_locked)); }; template<> struct DescriptorForType<DeleteSpaceRequest> { static constexpr auto kFields = MakeFieldList(MakeField(1, &DeleteSpaceRequest::index), MakeField(2, &DeleteSpaceRequest::authorization_value)); }; template<> struct DescriptorForType<DeleteSpaceResponse> { static constexpr auto kFields = MakeFieldList(); }; template<> struct DescriptorForType<DisableCreateRequest> { static constexpr auto kFields = MakeFieldList(); }; template<> struct DescriptorForType<DisableCreateResponse> { static constexpr auto kFields = MakeFieldList(); }; template<> struct DescriptorForType<WriteSpaceRequest> { static constexpr auto kFields = MakeFieldList(MakeField(1, &WriteSpaceRequest::index), MakeField(2, &WriteSpaceRequest::buffer), MakeField(3, &WriteSpaceRequest::authorization_value)); }; template<> struct DescriptorForType<WriteSpaceResponse> { static constexpr auto kFields = MakeFieldList(); }; template<> struct DescriptorForType<ReadSpaceRequest> { static constexpr auto kFields = MakeFieldList(MakeField(1, &ReadSpaceRequest::index), MakeField(2, &ReadSpaceRequest::authorization_value)); }; template<> struct DescriptorForType<ReadSpaceResponse> { static constexpr auto kFields = MakeFieldList(MakeField(1, &ReadSpaceResponse::buffer)); }; template<> struct DescriptorForType<LockSpaceWriteRequest> { static constexpr auto kFields = MakeFieldList(MakeField(1, &LockSpaceWriteRequest::index), MakeField(2, &LockSpaceWriteRequest::authorization_value)); }; template<> struct DescriptorForType<LockSpaceWriteResponse> { static constexpr auto kFields = MakeFieldList(); }; template<> struct DescriptorForType<LockSpaceReadRequest> { static constexpr auto kFields = MakeFieldList(MakeField(1, &LockSpaceReadRequest::index), MakeField(2, &LockSpaceReadRequest::authorization_value)); }; template<> struct DescriptorForType<LockSpaceReadResponse> { static constexpr auto kFields = MakeFieldList(); }; template<> struct DescriptorForType<WipeStorageRequest> { static constexpr auto kFields = MakeFieldList(); }; template<> struct DescriptorForType<WipeStorageResponse> { static constexpr auto kFields = MakeFieldList(); }; template<> struct DescriptorForType<DisableWipeRequest> { static constexpr auto kFields = MakeFieldList(); }; template<> struct DescriptorForType<DisableWipeResponse> { static constexpr auto kFields = MakeFieldList(); }; template<> struct DescriptorForType<Request> { static constexpr auto kFields = MakeFieldList( MakeOneOfField(1, &Request::payload, COMMAND_GET_INFO), MakeOneOfField(2, &Request::payload, COMMAND_CREATE_SPACE), MakeOneOfField(3, &Request::payload, COMMAND_GET_SPACE_INFO), MakeOneOfField(4, &Request::payload, COMMAND_DELETE_SPACE), MakeOneOfField(5, &Request::payload, COMMAND_DISABLE_CREATE), MakeOneOfField(6, &Request::payload, COMMAND_WRITE_SPACE), MakeOneOfField(7, &Request::payload, COMMAND_READ_SPACE), MakeOneOfField(8, &Request::payload, COMMAND_LOCK_SPACE_WRITE), MakeOneOfField(9, &Request::payload, COMMAND_LOCK_SPACE_READ), MakeOneOfField(10, &Request::payload, COMMAND_WIPE_STORAGE), MakeOneOfField(11, &Request::payload, COMMAND_DISABLE_WIPE)); }; template<> struct DescriptorForType<Response> { static constexpr auto kFields = MakeFieldList( MakeField(1, &Response::result), MakeOneOfField(2, &Response::payload, COMMAND_GET_INFO), MakeOneOfField(3, &Response::payload, COMMAND_CREATE_SPACE), MakeOneOfField(4, &Response::payload, COMMAND_GET_SPACE_INFO), MakeOneOfField(5, &Response::payload, COMMAND_DELETE_SPACE), MakeOneOfField(6, &Response::payload, COMMAND_DISABLE_CREATE), MakeOneOfField(7, &Response::payload, COMMAND_WRITE_SPACE), MakeOneOfField(8, &Response::payload, COMMAND_READ_SPACE), MakeOneOfField(9, &Response::payload, COMMAND_LOCK_SPACE_WRITE), MakeOneOfField(10, &Response::payload, COMMAND_LOCK_SPACE_READ), MakeOneOfField(11, &Response::payload, COMMAND_WIPE_STORAGE), MakeOneOfField(12, &Response::payload, COMMAND_DISABLE_WIPE)); }; template <typename Message> bool Encode(const Message& msg, Blob* blob) { BlobOutputStreamBuffer stream(blob); return nvram::proto::Encode(msg, &stream) && stream.Truncate(); } template <typename Message> bool Encode(const Message& msg, void* buffer, size_t* size) { ArrayOutputStreamBuffer stream(buffer, *size); if (!nvram::proto::Encode(msg, &stream)) { return false; } *size = stream.bytes_written(); return true; } template <typename Message> bool Decode(const uint8_t* data, size_t size, Message* msg) { InputStreamBuffer stream(data, size); return nvram::proto::Decode(msg, &stream) && stream.Done(); } // Instantiate the templates for the |Request| and |Response| message types. template NVRAM_EXPORT bool Encode<Request>(const Request&, Blob*); template NVRAM_EXPORT bool Encode<Request>(const Request&, void*, size_t*); template NVRAM_EXPORT bool Decode<Request>(const uint8_t*, size_t, Request*); template NVRAM_EXPORT bool Encode<Response>(const Response&, Blob*); template NVRAM_EXPORT bool Encode<Response>(const Response&, void*, size_t*); template NVRAM_EXPORT bool Decode<Response>(const uint8_t*, size_t, Response*); } // namespace nvram