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