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