Home | History | Annotate | Download | only in messages
      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 
     28 namespace nvram {
     29 
     30 enum Command {
     31   // Commands corresponding to the API defined in the access-controlled NVRAM
     32   // HAL spec. Note that some commands service multiple HAL API calls.
     33   COMMAND_GET_INFO = 1,
     34   COMMAND_CREATE_SPACE = 2,
     35   COMMAND_GET_SPACE_INFO = 3,
     36   COMMAND_DELETE_SPACE = 4,
     37   COMMAND_DISABLE_CREATE = 5,
     38   COMMAND_WRITE_SPACE = 6,
     39   COMMAND_READ_SPACE = 7,
     40   COMMAND_LOCK_SPACE_WRITE = 8,
     41   COMMAND_LOCK_SPACE_READ = 9,
     42 
     43   // The wipe commands are provided as a utility for clearing NVRAM during
     44   // hardware reset. These are not accessible via the HAL API, but may be used
     45   // by implementations to implement NVRAM clearing on full device reset.
     46   COMMAND_WIPE_STORAGE = 10,
     47   COMMAND_DISABLE_WIPE = 11,
     48 };
     49 
     50 // COMMAND_GET_INFO request/response.
     51 struct GetInfoRequest {};
     52 
     53 struct GetInfoResponse {
     54   uint64_t total_size = 0;
     55   uint64_t available_size = 0;
     56   uint64_t max_space_size = 0;
     57   uint32_t max_spaces = 0;
     58   Vector<uint32_t> space_list;
     59   bool wipe_disabled = false;
     60 };
     61 
     62 // COMMAND_CREATE_SPACE request/response.
     63 struct CreateSpaceRequest {
     64   uint32_t index = 0;
     65   uint64_t size = 0;
     66   Vector<nvram_control_t> controls;
     67   Blob authorization_value;
     68 };
     69 
     70 struct CreateSpaceResponse {};
     71 
     72 // COMMAND_GET_SPACE_INFO request/response.
     73 struct GetSpaceInfoRequest {
     74   uint32_t index = 0;
     75 };
     76 
     77 struct GetSpaceInfoResponse {
     78   uint64_t size = 0;
     79   Vector<nvram_control_t> controls;
     80   bool read_locked = false;
     81   bool write_locked = false;
     82 };
     83 
     84 // COMMAND_DELETE_SPACE request/response.
     85 struct DeleteSpaceRequest {
     86   uint32_t index = 0;
     87   Blob authorization_value;
     88 };
     89 
     90 struct DeleteSpaceResponse {};
     91 
     92 // COMMAND_DISABLE_CREATE request/response.
     93 struct DisableCreateRequest {};
     94 
     95 struct DisableCreateResponse {};
     96 
     97 // COMMAND_WRITE_SPACE request/response.
     98 struct WriteSpaceRequest {
     99   uint32_t index = 0;
    100   Blob buffer;
    101   Blob authorization_value;
    102 };
    103 
    104 struct WriteSpaceResponse {};
    105 
    106 // COMMAND_READ_SPACE request/response.
    107 struct ReadSpaceRequest {
    108   uint32_t index = 0;
    109   Blob authorization_value;
    110 };
    111 
    112 struct ReadSpaceResponse {
    113   Blob buffer;
    114 };
    115 
    116 // COMMAND_LOCK_SPACE_WRITE request/response.
    117 struct LockSpaceWriteRequest {
    118   uint32_t index = 0;
    119   Blob authorization_value;
    120 };
    121 
    122 struct LockSpaceWriteResponse {};
    123 
    124 // COMMAND_LOCK_SPACE_READ request/response.
    125 struct LockSpaceReadRequest {
    126   uint32_t index = 0;
    127   Blob authorization_value;
    128 };
    129 
    130 struct LockSpaceReadResponse {};
    131 
    132 // COMMAND_WIPE request/response.
    133 struct WipeStorageRequest {};
    134 struct WipeStorageResponse {};
    135 
    136 // COMMAND_DISABLE_WIPE request/response.
    137 struct DisableWipeRequest {};
    138 struct DisableWipeResponse {};
    139 
    140 // Generic request message, carrying command-specific payload. The slot set in
    141 // the payload determines the requested command.
    142 using RequestUnion = TaggedUnion<
    143     Command,
    144     TaggedUnionMember<COMMAND_GET_INFO, GetInfoRequest>,
    145     TaggedUnionMember<COMMAND_CREATE_SPACE, CreateSpaceRequest>,
    146     TaggedUnionMember<COMMAND_GET_SPACE_INFO, GetSpaceInfoRequest>,
    147     TaggedUnionMember<COMMAND_DELETE_SPACE, DeleteSpaceRequest>,
    148     TaggedUnionMember<COMMAND_DISABLE_CREATE, DisableCreateRequest>,
    149     TaggedUnionMember<COMMAND_WRITE_SPACE, WriteSpaceRequest>,
    150     TaggedUnionMember<COMMAND_READ_SPACE, ReadSpaceRequest>,
    151     TaggedUnionMember<COMMAND_LOCK_SPACE_WRITE, LockSpaceWriteRequest>,
    152     TaggedUnionMember<COMMAND_LOCK_SPACE_READ, LockSpaceReadRequest>,
    153     TaggedUnionMember<COMMAND_WIPE_STORAGE, WipeStorageRequest>,
    154     TaggedUnionMember<COMMAND_DISABLE_WIPE, DisableWipeRequest>>;
    155 struct Request {
    156   RequestUnion payload;
    157 };
    158 
    159 // Generic response message, carrying a result code and command-specific
    160 // payload.
    161 using ResponseUnion = TaggedUnion<
    162     Command,
    163     TaggedUnionMember<COMMAND_GET_INFO, GetInfoResponse>,
    164     TaggedUnionMember<COMMAND_CREATE_SPACE, CreateSpaceResponse>,
    165     TaggedUnionMember<COMMAND_GET_SPACE_INFO, GetSpaceInfoResponse>,
    166     TaggedUnionMember<COMMAND_DELETE_SPACE, DeleteSpaceResponse>,
    167     TaggedUnionMember<COMMAND_DISABLE_CREATE, DisableCreateResponse>,
    168     TaggedUnionMember<COMMAND_WRITE_SPACE, WriteSpaceResponse>,
    169     TaggedUnionMember<COMMAND_READ_SPACE, ReadSpaceResponse>,
    170     TaggedUnionMember<COMMAND_LOCK_SPACE_WRITE, LockSpaceWriteResponse>,
    171     TaggedUnionMember<COMMAND_LOCK_SPACE_READ, LockSpaceReadResponse>,
    172     TaggedUnionMember<COMMAND_WIPE_STORAGE, WipeStorageResponse>,
    173     TaggedUnionMember<COMMAND_DISABLE_WIPE, DisableWipeResponse>>;
    174 struct Response {
    175   nvram_result_t result = NV_RESULT_SUCCESS;
    176   ResponseUnion payload;
    177 };
    178 
    179 // Encoding and decoding functions. Template instantiations are provided for the
    180 // |Request| and |Response| wrapper types declared above.
    181 
    182 // Encode |msg| to |blob|. Returns true if successful.
    183 template <typename Message>
    184 bool Encode(const Message& msg, Blob* blob);
    185 
    186 // Encode |msg| to |buffer|, which is of size |*size|. Updates |*size| to
    187 // indicate the number of bytes written. Returns true on success.
    188 template <typename Message>
    189 bool Encode(const Message& msg, void* buffer, size_t* size);
    190 
    191 // Decode |msg| from the |data| buffer, which contains |size| bytes. Returns
    192 // true if successful.
    193 template <typename Message>
    194 bool Decode(const uint8_t* data, size_t size, Message* msg);
    195 
    196 }  // namespace nvram
    197 
    198 #endif  // NVRAM_MESSAGES_NVRAM_MESSAGES_H_
    199