1*7ba4dab5SXin Li /*
2*7ba4dab5SXin Li * Copyright (C) 2016 The Android Open Source Project
3*7ba4dab5SXin Li *
4*7ba4dab5SXin Li * Licensed under the Apache License, Version 2.0 (the "License");
5*7ba4dab5SXin Li * you may not use this file except in compliance with the License.
6*7ba4dab5SXin Li * You may obtain a copy of the License at
7*7ba4dab5SXin Li *
8*7ba4dab5SXin Li * http://www.apache.org/licenses/LICENSE-2.0
9*7ba4dab5SXin Li *
10*7ba4dab5SXin Li * Unless required by applicable law or agreed to in writing, software
11*7ba4dab5SXin Li * distributed under the License is distributed on an "AS IS" BASIS,
12*7ba4dab5SXin Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*7ba4dab5SXin Li * See the License for the specific language governing permissions and
14*7ba4dab5SXin Li * limitations under the License.
15*7ba4dab5SXin Li */
16*7ba4dab5SXin Li
17*7ba4dab5SXin Li #include <nvram/messages/nvram_messages.h>
18*7ba4dab5SXin Li
19*7ba4dab5SXin Li #include <nvram/messages/blob.h>
20*7ba4dab5SXin Li #include <nvram/messages/io.h>
21*7ba4dab5SXin Li #include <nvram/messages/proto.hpp>
22*7ba4dab5SXin Li
23*7ba4dab5SXin Li namespace nvram {
24*7ba4dab5SXin Li
25*7ba4dab5SXin Li // Descriptors for the message types.
26*7ba4dab5SXin Li
27*7ba4dab5SXin Li // IMPORTANT: The field numbers specified here correspond to protocol buffer
28*7ba4dab5SXin Li // fields on the wire. While they are arbitrary, they should never be
29*7ba4dab5SXin Li // reordered, reassigned, or overloaded once defined.
30*7ba4dab5SXin Li template<> struct DescriptorForType<GetInfoRequest> {
31*7ba4dab5SXin Li static constexpr auto kFields = MakeFieldList();
32*7ba4dab5SXin Li };
33*7ba4dab5SXin Li
34*7ba4dab5SXin Li template<> struct DescriptorForType<GetInfoResponse> {
35*7ba4dab5SXin Li static constexpr auto kFields =
36*7ba4dab5SXin Li MakeFieldList(MakeField(1, &GetInfoResponse::total_size),
37*7ba4dab5SXin Li MakeField(2, &GetInfoResponse::available_size),
38*7ba4dab5SXin Li MakeField(3, &GetInfoResponse::max_spaces),
39*7ba4dab5SXin Li MakeField(4, &GetInfoResponse::space_list),
40*7ba4dab5SXin Li MakeField(5, &GetInfoResponse::max_space_size),
41*7ba4dab5SXin Li MakeField(6, &GetInfoResponse::wipe_disabled));
42*7ba4dab5SXin Li };
43*7ba4dab5SXin Li
44*7ba4dab5SXin Li template<> struct DescriptorForType<CreateSpaceRequest> {
45*7ba4dab5SXin Li static constexpr auto kFields =
46*7ba4dab5SXin Li MakeFieldList(MakeField(1, &CreateSpaceRequest::index),
47*7ba4dab5SXin Li MakeField(2, &CreateSpaceRequest::size),
48*7ba4dab5SXin Li MakeField(3, &CreateSpaceRequest::controls),
49*7ba4dab5SXin Li MakeField(4, &CreateSpaceRequest::authorization_value));
50*7ba4dab5SXin Li };
51*7ba4dab5SXin Li
52*7ba4dab5SXin Li template<> struct DescriptorForType<CreateSpaceResponse> {
53*7ba4dab5SXin Li static constexpr auto kFields = MakeFieldList();
54*7ba4dab5SXin Li };
55*7ba4dab5SXin Li
56*7ba4dab5SXin Li template<> struct DescriptorForType<GetSpaceInfoRequest> {
57*7ba4dab5SXin Li static constexpr auto kFields =
58*7ba4dab5SXin Li MakeFieldList(MakeField(1, &GetSpaceInfoRequest::index));
59*7ba4dab5SXin Li };
60*7ba4dab5SXin Li
61*7ba4dab5SXin Li template<> struct DescriptorForType<GetSpaceInfoResponse> {
62*7ba4dab5SXin Li static constexpr auto kFields =
63*7ba4dab5SXin Li MakeFieldList(MakeField(1, &GetSpaceInfoResponse::size),
64*7ba4dab5SXin Li MakeField(2, &GetSpaceInfoResponse::controls),
65*7ba4dab5SXin Li MakeField(3, &GetSpaceInfoResponse::read_locked),
66*7ba4dab5SXin Li MakeField(4, &GetSpaceInfoResponse::write_locked));
67*7ba4dab5SXin Li };
68*7ba4dab5SXin Li
69*7ba4dab5SXin Li template<> struct DescriptorForType<DeleteSpaceRequest> {
70*7ba4dab5SXin Li static constexpr auto kFields =
71*7ba4dab5SXin Li MakeFieldList(MakeField(1, &DeleteSpaceRequest::index),
72*7ba4dab5SXin Li MakeField(2, &DeleteSpaceRequest::authorization_value));
73*7ba4dab5SXin Li };
74*7ba4dab5SXin Li
75*7ba4dab5SXin Li template<> struct DescriptorForType<DeleteSpaceResponse> {
76*7ba4dab5SXin Li static constexpr auto kFields = MakeFieldList();
77*7ba4dab5SXin Li };
78*7ba4dab5SXin Li
79*7ba4dab5SXin Li template<> struct DescriptorForType<DisableCreateRequest> {
80*7ba4dab5SXin Li static constexpr auto kFields = MakeFieldList();
81*7ba4dab5SXin Li };
82*7ba4dab5SXin Li
83*7ba4dab5SXin Li template<> struct DescriptorForType<DisableCreateResponse> {
84*7ba4dab5SXin Li static constexpr auto kFields = MakeFieldList();
85*7ba4dab5SXin Li };
86*7ba4dab5SXin Li
87*7ba4dab5SXin Li template<> struct DescriptorForType<WriteSpaceRequest> {
88*7ba4dab5SXin Li static constexpr auto kFields =
89*7ba4dab5SXin Li MakeFieldList(MakeField(1, &WriteSpaceRequest::index),
90*7ba4dab5SXin Li MakeField(2, &WriteSpaceRequest::buffer),
91*7ba4dab5SXin Li MakeField(3, &WriteSpaceRequest::authorization_value));
92*7ba4dab5SXin Li };
93*7ba4dab5SXin Li
94*7ba4dab5SXin Li template<> struct DescriptorForType<WriteSpaceResponse> {
95*7ba4dab5SXin Li static constexpr auto kFields = MakeFieldList();
96*7ba4dab5SXin Li };
97*7ba4dab5SXin Li
98*7ba4dab5SXin Li template<> struct DescriptorForType<ReadSpaceRequest> {
99*7ba4dab5SXin Li static constexpr auto kFields =
100*7ba4dab5SXin Li MakeFieldList(MakeField(1, &ReadSpaceRequest::index),
101*7ba4dab5SXin Li MakeField(2, &ReadSpaceRequest::authorization_value));
102*7ba4dab5SXin Li };
103*7ba4dab5SXin Li
104*7ba4dab5SXin Li template<> struct DescriptorForType<ReadSpaceResponse> {
105*7ba4dab5SXin Li static constexpr auto kFields =
106*7ba4dab5SXin Li MakeFieldList(MakeField(1, &ReadSpaceResponse::buffer));
107*7ba4dab5SXin Li };
108*7ba4dab5SXin Li
109*7ba4dab5SXin Li template<> struct DescriptorForType<LockSpaceWriteRequest> {
110*7ba4dab5SXin Li static constexpr auto kFields =
111*7ba4dab5SXin Li MakeFieldList(MakeField(1, &LockSpaceWriteRequest::index),
112*7ba4dab5SXin Li MakeField(2, &LockSpaceWriteRequest::authorization_value));
113*7ba4dab5SXin Li };
114*7ba4dab5SXin Li
115*7ba4dab5SXin Li template<> struct DescriptorForType<LockSpaceWriteResponse> {
116*7ba4dab5SXin Li static constexpr auto kFields = MakeFieldList();
117*7ba4dab5SXin Li };
118*7ba4dab5SXin Li
119*7ba4dab5SXin Li template<> struct DescriptorForType<LockSpaceReadRequest> {
120*7ba4dab5SXin Li static constexpr auto kFields =
121*7ba4dab5SXin Li MakeFieldList(MakeField(1, &LockSpaceReadRequest::index),
122*7ba4dab5SXin Li MakeField(2, &LockSpaceReadRequest::authorization_value));
123*7ba4dab5SXin Li };
124*7ba4dab5SXin Li
125*7ba4dab5SXin Li template<> struct DescriptorForType<LockSpaceReadResponse> {
126*7ba4dab5SXin Li static constexpr auto kFields = MakeFieldList();
127*7ba4dab5SXin Li };
128*7ba4dab5SXin Li
129*7ba4dab5SXin Li template<> struct DescriptorForType<WipeStorageRequest> {
130*7ba4dab5SXin Li static constexpr auto kFields = MakeFieldList();
131*7ba4dab5SXin Li };
132*7ba4dab5SXin Li
133*7ba4dab5SXin Li template<> struct DescriptorForType<WipeStorageResponse> {
134*7ba4dab5SXin Li static constexpr auto kFields = MakeFieldList();
135*7ba4dab5SXin Li };
136*7ba4dab5SXin Li
137*7ba4dab5SXin Li template<> struct DescriptorForType<DisableWipeRequest> {
138*7ba4dab5SXin Li static constexpr auto kFields = MakeFieldList();
139*7ba4dab5SXin Li };
140*7ba4dab5SXin Li
141*7ba4dab5SXin Li template<> struct DescriptorForType<DisableWipeResponse> {
142*7ba4dab5SXin Li static constexpr auto kFields = MakeFieldList();
143*7ba4dab5SXin Li };
144*7ba4dab5SXin Li
145*7ba4dab5SXin Li template<> struct DescriptorForType<Request> {
146*7ba4dab5SXin Li static constexpr auto kFields = MakeFieldList(
147*7ba4dab5SXin Li MakeOneOfField(1, &Request::payload, COMMAND_GET_INFO),
148*7ba4dab5SXin Li MakeOneOfField(2, &Request::payload, COMMAND_CREATE_SPACE),
149*7ba4dab5SXin Li MakeOneOfField(3, &Request::payload, COMMAND_GET_SPACE_INFO),
150*7ba4dab5SXin Li MakeOneOfField(4, &Request::payload, COMMAND_DELETE_SPACE),
151*7ba4dab5SXin Li MakeOneOfField(5, &Request::payload, COMMAND_DISABLE_CREATE),
152*7ba4dab5SXin Li MakeOneOfField(6, &Request::payload, COMMAND_WRITE_SPACE),
153*7ba4dab5SXin Li MakeOneOfField(7, &Request::payload, COMMAND_READ_SPACE),
154*7ba4dab5SXin Li MakeOneOfField(8, &Request::payload, COMMAND_LOCK_SPACE_WRITE),
155*7ba4dab5SXin Li MakeOneOfField(9, &Request::payload, COMMAND_LOCK_SPACE_READ),
156*7ba4dab5SXin Li MakeOneOfField(10, &Request::payload, COMMAND_WIPE_STORAGE),
157*7ba4dab5SXin Li MakeOneOfField(11, &Request::payload, COMMAND_DISABLE_WIPE));
158*7ba4dab5SXin Li };
159*7ba4dab5SXin Li
160*7ba4dab5SXin Li template<> struct DescriptorForType<Response> {
161*7ba4dab5SXin Li static constexpr auto kFields = MakeFieldList(
162*7ba4dab5SXin Li MakeField(1, &Response::result),
163*7ba4dab5SXin Li MakeOneOfField(2, &Response::payload, COMMAND_GET_INFO),
164*7ba4dab5SXin Li MakeOneOfField(3, &Response::payload, COMMAND_CREATE_SPACE),
165*7ba4dab5SXin Li MakeOneOfField(4, &Response::payload, COMMAND_GET_SPACE_INFO),
166*7ba4dab5SXin Li MakeOneOfField(5, &Response::payload, COMMAND_DELETE_SPACE),
167*7ba4dab5SXin Li MakeOneOfField(6, &Response::payload, COMMAND_DISABLE_CREATE),
168*7ba4dab5SXin Li MakeOneOfField(7, &Response::payload, COMMAND_WRITE_SPACE),
169*7ba4dab5SXin Li MakeOneOfField(8, &Response::payload, COMMAND_READ_SPACE),
170*7ba4dab5SXin Li MakeOneOfField(9, &Response::payload, COMMAND_LOCK_SPACE_WRITE),
171*7ba4dab5SXin Li MakeOneOfField(10, &Response::payload, COMMAND_LOCK_SPACE_READ),
172*7ba4dab5SXin Li MakeOneOfField(11, &Response::payload, COMMAND_WIPE_STORAGE),
173*7ba4dab5SXin Li MakeOneOfField(12, &Response::payload, COMMAND_DISABLE_WIPE));
174*7ba4dab5SXin Li };
175*7ba4dab5SXin Li
176*7ba4dab5SXin Li template <typename Message>
Encode(const Message & msg,Blob * blob)177*7ba4dab5SXin Li bool Encode(const Message& msg, Blob* blob) {
178*7ba4dab5SXin Li BlobOutputStreamBuffer stream(blob);
179*7ba4dab5SXin Li return nvram::proto::Encode(msg, &stream) && stream.Truncate();
180*7ba4dab5SXin Li }
181*7ba4dab5SXin Li
182*7ba4dab5SXin Li template <typename Message>
Encode(const Message & msg,void * buffer,size_t * size)183*7ba4dab5SXin Li bool Encode(const Message& msg, void* buffer, size_t* size) {
184*7ba4dab5SXin Li ArrayOutputStreamBuffer stream(buffer, *size);
185*7ba4dab5SXin Li if (!nvram::proto::Encode(msg, &stream)) {
186*7ba4dab5SXin Li return false;
187*7ba4dab5SXin Li }
188*7ba4dab5SXin Li *size = stream.bytes_written();
189*7ba4dab5SXin Li return true;
190*7ba4dab5SXin Li }
191*7ba4dab5SXin Li
192*7ba4dab5SXin Li template <typename Message>
Decode(const uint8_t * data,size_t size,Message * msg)193*7ba4dab5SXin Li bool Decode(const uint8_t* data, size_t size, Message* msg) {
194*7ba4dab5SXin Li InputStreamBuffer stream(data, size);
195*7ba4dab5SXin Li return nvram::proto::Decode(msg, &stream) && stream.Done();
196*7ba4dab5SXin Li }
197*7ba4dab5SXin Li
198*7ba4dab5SXin Li // Instantiate the templates for the |Request| and |Response| message types.
199*7ba4dab5SXin Li template NVRAM_EXPORT bool Encode<Request>(const Request&, Blob*);
200*7ba4dab5SXin Li template NVRAM_EXPORT bool Encode<Request>(const Request&, void*, size_t*);
201*7ba4dab5SXin Li template NVRAM_EXPORT bool Decode<Request>(const uint8_t*, size_t, Request*);
202*7ba4dab5SXin Li
203*7ba4dab5SXin Li template NVRAM_EXPORT bool Encode<Response>(const Response&, Blob*);
204*7ba4dab5SXin Li template NVRAM_EXPORT bool Encode<Response>(const Response&, void*, size_t*);
205*7ba4dab5SXin Li template NVRAM_EXPORT bool Decode<Response>(const uint8_t*, size_t, Response*);
206*7ba4dab5SXin Li
207*7ba4dab5SXin Li } // namespace nvram
208