nvram_messages.h revision 417e23fa8c8c8f9dd77a19e60c47b46d5454000d
1/* 2 * Copyright (C) 2016 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 17#ifndef NVRAM_MESSAGES_NVRAM_MESSAGES_H_ 18#define NVRAM_MESSAGES_NVRAM_MESSAGES_H_ 19 20#include <hardware/nvram_defs.h> 21 22#include <nvram/messages/blob.h> 23#include <nvram/messages/compiler.h> 24#include <nvram/messages/struct.h> 25#include <nvram/messages/tagged_union.h> 26#include <nvram/messages/vector.h> 27 28namespace nvram { 29 30enum Command { 31 COMMAND_GET_INFO = 1, 32 COMMAND_CREATE_SPACE = 2, 33 COMMAND_GET_SPACE_INFO = 3, 34 COMMAND_DELETE_SPACE = 4, 35 COMMAND_DISABLE_CREATE = 5, 36 COMMAND_WRITE_SPACE = 6, 37 COMMAND_READ_SPACE = 7, 38 COMMAND_LOCK_SPACE_WRITE = 8, 39 COMMAND_LOCK_SPACE_READ = 9, 40}; 41 42// COMMAND_GET_INFO request/response. 43struct GetInfoRequest {}; 44 45struct GetInfoResponse { 46 uint64_t total_size = 0; 47 uint64_t available_size = 0; 48 uint64_t max_space_size = 0; 49 uint32_t max_spaces = 0; 50 Vector<uint32_t> space_list; 51}; 52 53// COMMAND_CREATE_SPACE request/response. 54struct CreateSpaceRequest { 55 uint32_t index = 0; 56 uint64_t size = 0; 57 Vector<nvram_control_t> controls; 58 Blob authorization_value; 59}; 60 61struct CreateSpaceResponse {}; 62 63// COMMAND_GET_SPACE_INFO request/response. 64struct GetSpaceInfoRequest { 65 uint32_t index = 0; 66}; 67 68struct GetSpaceInfoResponse { 69 uint64_t size = 0; 70 Vector<nvram_control_t> controls; 71 bool read_locked = false; 72 bool write_locked = false; 73}; 74 75// COMMAND_DELETE_SPACE request/response. 76struct DeleteSpaceRequest { 77 uint32_t index = 0; 78 Blob authorization_value; 79}; 80 81struct DeleteSpaceResponse {}; 82 83// COMMAND_DISABLE_CREATE request/response. 84struct DisableCreateRequest {}; 85 86struct DisableCreateResponse {}; 87 88// COMMAND_WRITE_SPACE request/response. 89struct WriteSpaceRequest { 90 uint32_t index = 0; 91 Blob buffer; 92 Blob authorization_value; 93}; 94 95struct WriteSpaceResponse {}; 96 97// COMMAND_READ_SPACE request/response. 98struct ReadSpaceRequest { 99 uint32_t index = 0; 100 Blob authorization_value; 101}; 102 103struct ReadSpaceResponse { 104 Blob buffer; 105}; 106 107// COMMAND_LOCK_SPACE_WRITE request/response. 108struct LockSpaceWriteRequest { 109 uint32_t index = 0; 110 Blob authorization_value; 111}; 112 113struct LockSpaceWriteResponse {}; 114 115// COMMAND_LOCK_SPACE_READ request/response. 116struct LockSpaceReadRequest { 117 uint32_t index = 0; 118 Blob authorization_value; 119}; 120 121struct LockSpaceReadResponse {}; 122 123// Generic request message, carrying command-specific payload. The slot set in 124// the payload determines the requested command. 125using RequestUnion = TaggedUnion< 126 Command, 127 TaggedUnionMember<COMMAND_GET_INFO, GetInfoRequest>, 128 TaggedUnionMember<COMMAND_CREATE_SPACE, CreateSpaceRequest>, 129 TaggedUnionMember<COMMAND_GET_SPACE_INFO, GetSpaceInfoRequest>, 130 TaggedUnionMember<COMMAND_DELETE_SPACE, DeleteSpaceRequest>, 131 TaggedUnionMember<COMMAND_DISABLE_CREATE, DisableCreateRequest>, 132 TaggedUnionMember<COMMAND_WRITE_SPACE, WriteSpaceRequest>, 133 TaggedUnionMember<COMMAND_READ_SPACE, ReadSpaceRequest>, 134 TaggedUnionMember<COMMAND_LOCK_SPACE_WRITE, LockSpaceWriteRequest>, 135 TaggedUnionMember<COMMAND_LOCK_SPACE_READ, LockSpaceReadRequest>>; 136struct Request { 137 RequestUnion payload; 138}; 139 140// Generic response message, carrying a result code and command-specific 141// payload. 142using ResponseUnion = TaggedUnion< 143 Command, 144 TaggedUnionMember<COMMAND_GET_INFO, GetInfoResponse>, 145 TaggedUnionMember<COMMAND_CREATE_SPACE, CreateSpaceResponse>, 146 TaggedUnionMember<COMMAND_GET_SPACE_INFO, GetSpaceInfoResponse>, 147 TaggedUnionMember<COMMAND_DELETE_SPACE, DeleteSpaceResponse>, 148 TaggedUnionMember<COMMAND_DISABLE_CREATE, DisableCreateResponse>, 149 TaggedUnionMember<COMMAND_WRITE_SPACE, WriteSpaceResponse>, 150 TaggedUnionMember<COMMAND_READ_SPACE, ReadSpaceResponse>, 151 TaggedUnionMember<COMMAND_LOCK_SPACE_WRITE, LockSpaceWriteResponse>, 152 TaggedUnionMember<COMMAND_LOCK_SPACE_READ, LockSpaceReadResponse>>; 153struct Response { 154 nvram_result_t result = NV_RESULT_SUCCESS; 155 ResponseUnion payload; 156}; 157 158// Encoding and decoding functions. Template instantiations are provided for the 159// |Request| and |Response| wrapper types declared above. 160 161// Encode |msg| to |blob|. Returns true if successful. 162template <typename Message> 163bool Encode(const Message& msg, Blob* blob); 164 165// Encode |msg| to |buffer|, which is of size |*size|. Updates |*size| to 166// indicate the number of bytes written. Returns true on success. 167template <typename Message> 168bool Encode(const Message& msg, void* buffer, size_t* size); 169 170// Decode |msg| from the |data| buffer, which contains |size| bytes. Returns 171// true if successful. 172template <typename Message> 173bool Decode(const uint8_t* data, size_t size, Message* msg); 174 175} // namespace nvram 176 177#endif // NVRAM_MESSAGES_NVRAM_MESSAGES_H_ 178