1 
2 /*
3  * Copyright (C) 2017 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #ifndef CHRE_HOST_HOST_PROTOCOL_HOST_H_
19 #define CHRE_HOST_HOST_PROTOCOL_HOST_H_
20 
21 #include <stdint.h>
22 
23 #include "chre/platform/shared/host_protocol_common.h"
24 #include "chre_host/host_messages_generated.h"
25 #include "flatbuffers/flatbuffers.h"
26 
27 namespace android {
28 namespace chre {
29 
30 /**
31  * Calling code should provide an implementation of this interface to handle
32  * parsed results from decodeMessageFromChre().
33  */
34 class IChreMessageHandlers {
35  public:
36   virtual ~IChreMessageHandlers() = default;
37 
38   virtual void handleNanoappMessage(
39       uint64_t appId, uint32_t messageType, uint16_t hostEndpoint,
40       const void *messageData, size_t messageDataLen) = 0;
41 
42   virtual void handleHubInfoResponse(
43       const char *name, const char *vendor,
44       const char *toolchain, uint32_t legacyPlatformVersion,
45       uint32_t legacyToolchainVersion, float peakMips, float stoppedPower,
46       float sleepPower, float peakPower, uint32_t maxMessageLen,
47       uint64_t platformId, uint32_t version) = 0;
48 
49   virtual void handleNanoappListResponse(
50       const ::chre::fbs::NanoappListResponseT& response) = 0;
51 
52   virtual void handleLoadNanoappResponse(
53       const ::chre::fbs::LoadNanoappResponseT& response) = 0;
54 };
55 
56 /**
57  * A set of helper methods that simplify the encode/decode of FlatBuffers
58  * messages used in communication with CHRE from the host.
59  */
60 class HostProtocolHost : public ::chre::HostProtocolCommon {
61  public:
62   /**
63    * Decodes a message sent from CHRE and invokes the appropriate handler
64    * function in the provided interface implementation to handle the parsed
65    * result.
66    *
67    * @param message Buffer containing a complete FlatBuffers CHRE message
68    * @param messageLen Size of the message, in bytes
69    * @param handlers Set of callbacks to handle the parsed message. If this
70    *        function returns success, then exactly one of these functions was
71    *        called.
72    *
73    * @return true if the message was parsed successfully and passed to a handler
74    */
75   static bool decodeMessageFromChre(const void *message, size_t messageLen,
76                                     IChreMessageHandlers& handlers);
77 
78   /**
79    * Encodes a message requesting hub information from CHRE
80    *
81    * @param builder A newly constructed FlatBufferBuilder that will be used to
82    *        construct the message
83    */
84   static void encodeHubInfoRequest(flatbuffers::FlatBufferBuilder& builder);
85 
86   /**
87    * Encodes a message requesting to load a nanoapp specified by the included
88    * binary payload and metadata.
89    *
90    * @param builder A newly constructed FlatBufferBuilder that will be used to
91    *        construct the message
92    */
93   static void encodeLoadNanoappRequest(
94       flatbuffers::FlatBufferBuilder& builder, uint32_t transactionId,
95       uint64_t appId, uint32_t appVersion, uint32_t targetApiVersion,
96       const std::vector<uint8_t>& nanoappBinary);
97 
98   /**
99    * Encodes a message requesting the list of loaded nanoapps from CHRE
100    *
101    * @param builder A newly constructed FlatBufferBuilder that will be used to
102    *        construct the message
103    */
104   static void encodeNanoappListRequest(flatbuffers::FlatBufferBuilder& builder);
105 
106   /**
107    * Decodes the host client ID included in the message container
108    *
109    * @param message Buffer containing a complete FlatBuffers CHRE message
110    * @param messageLen Size of the message, in bytes
111    * @param hostClientId Output parameter that will be populated with the client
112    *        ID included in the message on success
113    *
114    * @return true if the host client ID was successfully decoded from the
115    *         message
116    */
117   static bool extractHostClientId(const void *message, size_t messageLen,
118                                   uint16_t *hostClientId);
119 
120   /**
121    * Update the host client ID field in the MessageContainer.
122    *
123    * @param message Buffer containing a complete FlatBuffers CHRE message
124    * @param messageLen Size of the message, in bytes
125    * @param hostClientId The value to set the host client ID to
126    *
127    * @return true if the message was verified successfully, and we were able to
128    *         modify the host client ID field
129    */
130   static bool mutateHostClientId(void *message, size_t messageLen,
131                                  uint16_t hostClientId);
132 };
133 
134 }  // namespace chre
135 }  // namespace android
136 
137 #endif  // CHRE_HOST_HOST_PROTOCOL_HOST_H_
138