nvram_messages.h revision a715cb1840f9a0c813c90707a351687f7a77950e
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 uint32_t max_spaces = 0; 49 Vector<uint32_t> space_list; 50}; 51 52// COMMAND_CREATE_SPACE request/response. 53struct CreateSpaceRequest { 54 uint32_t index = 0; 55 uint64_t size = 0; 56 Vector<nvram_control_t> controls; 57 Blob authorization_value; 58}; 59 60struct CreateSpaceResponse {}; 61 62// COMMAND_GET_SPACE_INFO request/response. 63struct GetSpaceInfoRequest { 64 uint32_t index = 0; 65}; 66 67struct GetSpaceInfoResponse { 68 uint64_t size = 0; 69 Vector<nvram_control_t> controls; 70 bool read_locked = false; 71 bool write_locked = false; 72}; 73 74// COMMAND_DELETE_SPACE request/response. 75struct DeleteSpaceRequest { 76 uint32_t index = 0; 77 Blob authorization_value; 78}; 79 80struct DeleteSpaceResponse {}; 81 82// COMMAND_DISABLE_CREATE request/response. 83struct DisableCreateRequest {}; 84 85struct DisableCreateResponse {}; 86 87// COMMAND_WRITE_SPACE request/response. 88struct WriteSpaceRequest { 89 uint32_t index = 0; 90 Blob buffer; 91 Blob authorization_value; 92}; 93 94struct WriteSpaceResponse {}; 95 96// COMMAND_READ_SPACE request/response. 97struct ReadSpaceRequest { 98 uint32_t index = 0; 99 Blob authorization_value; 100}; 101 102struct ReadSpaceResponse { 103 Blob buffer; 104}; 105 106// COMMAND_LOCK_SPACE_WRITE request/response. 107struct LockSpaceWriteRequest { 108 uint32_t index = 0; 109 Blob authorization_value; 110}; 111 112struct LockSpaceWriteResponse {}; 113 114// COMMAND_LOCK_SPACE_READ request/response. 115struct LockSpaceReadRequest { 116 uint32_t index = 0; 117 Blob authorization_value; 118}; 119 120struct LockSpaceReadResponse {}; 121 122// Generic request message, carrying command-specific payload. The slot set in 123// the payload determines the requested command. 124using RequestUnion = TaggedUnion< 125 Command, 126 TaggedUnionMember<COMMAND_GET_INFO, GetInfoRequest>, 127 TaggedUnionMember<COMMAND_CREATE_SPACE, CreateSpaceRequest>, 128 TaggedUnionMember<COMMAND_GET_SPACE_INFO, GetSpaceInfoRequest>, 129 TaggedUnionMember<COMMAND_DELETE_SPACE, DeleteSpaceRequest>, 130 TaggedUnionMember<COMMAND_DISABLE_CREATE, DisableCreateRequest>, 131 TaggedUnionMember<COMMAND_WRITE_SPACE, WriteSpaceRequest>, 132 TaggedUnionMember<COMMAND_READ_SPACE, ReadSpaceRequest>, 133 TaggedUnionMember<COMMAND_LOCK_SPACE_WRITE, LockSpaceWriteRequest>, 134 TaggedUnionMember<COMMAND_LOCK_SPACE_READ, LockSpaceReadRequest>>; 135struct Request { 136 RequestUnion payload; 137}; 138 139// Generic response message, carrying a result code and command-specific 140// payload. 141using ResponseUnion = TaggedUnion< 142 Command, 143 TaggedUnionMember<COMMAND_GET_INFO, GetInfoResponse>, 144 TaggedUnionMember<COMMAND_CREATE_SPACE, CreateSpaceResponse>, 145 TaggedUnionMember<COMMAND_GET_SPACE_INFO, GetSpaceInfoResponse>, 146 TaggedUnionMember<COMMAND_DELETE_SPACE, DeleteSpaceResponse>, 147 TaggedUnionMember<COMMAND_DISABLE_CREATE, DisableCreateResponse>, 148 TaggedUnionMember<COMMAND_WRITE_SPACE, WriteSpaceResponse>, 149 TaggedUnionMember<COMMAND_READ_SPACE, ReadSpaceResponse>, 150 TaggedUnionMember<COMMAND_LOCK_SPACE_WRITE, LockSpaceWriteResponse>, 151 TaggedUnionMember<COMMAND_LOCK_SPACE_READ, LockSpaceReadResponse>>; 152struct Response { 153 nvram_result_t result = NV_RESULT_SUCCESS; 154 ResponseUnion payload; 155}; 156 157// Encoding and decoding functions. Template instantiations are provided for the 158// |Request| and |Response| wrapper types declared above. 159 160// Encode |msg| to |blob|. Returns true if successful. 161template <typename Message> 162bool Encode(const Message& msg, Blob* blob); 163 164// Decode |msg| from the |data| buffer, which contains |size| bytes. Returns 165// true if successful. 166template <typename Message> 167bool Decode(const uint8_t* data, size_t size, Message* msg); 168 169} // namespace nvram 170 171#endif // NVRAM_MESSAGES_NVRAM_MESSAGES_H_ 172