blob: ff1b01a2134c7639dc1c7b65882f2648c5b8469b [file] [log] [blame]
Steven Moreland5553ac42020-11-11 02:14:45 +00001/*
2 * Copyright (C) 2020 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#pragma once
17
18namespace android {
19
20#pragma clang diagnostic push
21#pragma clang diagnostic error "-Wpadded"
22
Steven Moreland826367f2021-09-10 14:05:31 -070023constexpr uint8_t RPC_CONNECTION_OPTION_INCOMING = 0x1; // default is outgoing
Steven Moreland659416d2021-05-11 00:47:50 +000024
Steven Moreland5623d1a2021-09-10 15:45:34 -070025constexpr uint32_t RPC_WIRE_ADDRESS_OPTION_CREATED = 1 << 0; // distinguish from '0' address
26constexpr uint32_t RPC_WIRE_ADDRESS_OPTION_FOR_SERVER = 1 << 1;
Steven Moreland01a6bad2021-06-11 00:59:20 +000027
28struct RpcWireAddress {
Steven Moreland5623d1a2021-09-10 15:45:34 -070029 uint32_t options;
30 uint32_t address;
31
32 static inline RpcWireAddress fromRaw(uint64_t raw) {
33 return *reinterpret_cast<RpcWireAddress*>(&raw);
34 }
35 static inline uint64_t toRaw(RpcWireAddress addr) {
36 return *reinterpret_cast<uint64_t*>(&addr);
37 }
Steven Moreland01a6bad2021-06-11 00:59:20 +000038};
Steven Moreland5623d1a2021-09-10 15:45:34 -070039static_assert(sizeof(RpcWireAddress) == sizeof(uint64_t));
Steven Moreland01a6bad2021-06-11 00:59:20 +000040
Steven Morelandc88b7fc2021-06-10 00:40:39 +000041/**
42 * This is sent to an RpcServer in order to request a new connection is created,
43 * either as part of a new session or an existing session
44 */
Steven Moreland659416d2021-05-11 00:47:50 +000045struct RpcConnectionHeader {
Steven Morelandbf57bce2021-07-26 15:26:12 -070046 uint32_t version; // maximum supported by caller
Steven Moreland659416d2021-05-11 00:47:50 +000047 uint8_t options;
Frederick Mayle69a0c992022-05-26 20:38:39 +000048 uint8_t fileDescriptorTransportMode;
49 uint8_t reservered[8];
Steven Moreland826367f2021-09-10 14:05:31 -070050 // Follows is sessionIdSize bytes.
51 // if size is 0, this is requesting a new session.
52 uint16_t sessionIdSize;
Steven Morelandbf57bce2021-07-26 15:26:12 -070053};
Steven Moreland826367f2021-09-10 14:05:31 -070054static_assert(sizeof(RpcConnectionHeader) == 16);
Steven Morelandbf57bce2021-07-26 15:26:12 -070055
56/**
57 * In response to an RpcConnectionHeader which corresponds to a new session,
58 * this returns information to the server.
59 */
60struct RpcNewSessionResponse {
61 uint32_t version; // maximum supported by callee <= maximum supported by caller
62 uint8_t reserved[4];
Steven Moreland659416d2021-05-11 00:47:50 +000063};
Steven Moreland14cd3fe2021-09-02 16:18:14 -070064static_assert(sizeof(RpcNewSessionResponse) == 8);
Steven Moreland659416d2021-05-11 00:47:50 +000065
Steven Morelandc88b7fc2021-06-10 00:40:39 +000066#define RPC_CONNECTION_INIT_OKAY "cci"
67
68/**
69 * Whenever a client connection is setup, this is sent as the initial
70 * transaction. The main use of this is in order to control the timing for when
Steven Moreland1b304292021-07-15 22:59:34 +000071 * an incoming connection is setup.
Steven Morelandc88b7fc2021-06-10 00:40:39 +000072 */
Steven Moreland19fc9f72021-06-10 03:57:30 +000073struct RpcOutgoingConnectionInit {
Steven Morelandc88b7fc2021-06-10 00:40:39 +000074 char msg[4];
75 uint8_t reserved[4];
76};
Steven Moreland14cd3fe2021-09-02 16:18:14 -070077static_assert(sizeof(RpcOutgoingConnectionInit) == 8);
Steven Morelandc88b7fc2021-06-10 00:40:39 +000078
Steven Moreland5553ac42020-11-11 02:14:45 +000079enum : uint32_t {
80 /**
81 * follows is RpcWireTransaction, if flags != oneway, reply w/ RPC_COMMAND_REPLY expected
82 */
83 RPC_COMMAND_TRANSACT = 0,
84 /**
85 * follows is RpcWireReply
86 */
87 RPC_COMMAND_REPLY,
88 /**
Steven Morelandfd1e8a02021-07-21 23:30:29 +000089 * follows is RpcDecStrong
Steven Moreland5553ac42020-11-11 02:14:45 +000090 *
91 * note - this in the protocol directly instead of as a 'special
92 * transaction' in order to keep it as lightweight as possible (we don't
93 * want to create a 'Parcel' object for every decref)
94 */
95 RPC_COMMAND_DEC_STRONG,
96};
97
98/**
99 * These commands are used when the address in an RpcWireTransaction is zero'd
100 * out (no address). This allows the transact/reply flow to be used for
101 * additional server commands, without making the protocol for
102 * transactions/replies more complicated.
103 */
104enum : uint32_t {
105 RPC_SPECIAL_TRANSACT_GET_ROOT = 0,
Steven Morelandf137de92021-04-24 01:54:26 +0000106 RPC_SPECIAL_TRANSACT_GET_MAX_THREADS = 1,
Steven Morelandbdb53ab2021-05-05 17:57:41 +0000107 RPC_SPECIAL_TRANSACT_GET_SESSION_ID = 2,
Steven Moreland5553ac42020-11-11 02:14:45 +0000108};
109
Steven Moreland5553ac42020-11-11 02:14:45 +0000110// serialization is like:
111// |RpcWireHeader|struct desginated by 'command'| (over and over again)
Frederick Mayleffe9ac22022-06-30 02:07:36 +0000112//
113// When file descriptors are included in out-of-band data (e.g. in unix domain
114// sockets), they are always paired with the RpcWireHeader bytes of the
115// transaction or reply the file descriptors belong to.
Steven Moreland5553ac42020-11-11 02:14:45 +0000116
117struct RpcWireHeader {
118 uint32_t command; // RPC_COMMAND_*
119 uint32_t bodySize;
120
121 uint32_t reserved[2];
122};
Steven Moreland14cd3fe2021-09-02 16:18:14 -0700123static_assert(sizeof(RpcWireHeader) == 16);
Steven Moreland5553ac42020-11-11 02:14:45 +0000124
Steven Morelandfd1e8a02021-07-21 23:30:29 +0000125struct RpcDecStrong {
126 RpcWireAddress address;
127 uint32_t amount;
128 uint32_t reserved;
129};
130static_assert(sizeof(RpcDecStrong) == 16);
131
Steven Moreland5553ac42020-11-11 02:14:45 +0000132struct RpcWireTransaction {
133 RpcWireAddress address;
134 uint32_t code;
135 uint32_t flags;
136
137 uint64_t asyncNumber;
138
Frederick Mayledc07cf82022-05-26 20:30:12 +0000139 // The size of the Parcel data directly following RpcWireTransaction.
140 uint32_t parcelDataSize;
141
142 uint32_t reserved[3];
Steven Moreland5553ac42020-11-11 02:14:45 +0000143
Devin Moore139913a2021-08-13 19:59:16 +0000144 uint8_t data[];
Steven Moreland5553ac42020-11-11 02:14:45 +0000145};
Steven Moreland5623d1a2021-09-10 15:45:34 -0700146static_assert(sizeof(RpcWireTransaction) == 40);
Steven Moreland5553ac42020-11-11 02:14:45 +0000147
148struct RpcWireReply {
149 int32_t status; // transact return
Frederick Mayledc07cf82022-05-26 20:30:12 +0000150
151 // -- Fields below only transmitted starting at protocol version 1 --
152
153 // The size of the Parcel data directly following RpcWireReply.
154 uint32_t parcelDataSize;
155
156 uint32_t reserved[3];
157
158 // Byte size of RpcWireReply in the wire protocol.
159 static size_t wireSize(uint32_t protocolVersion) {
160 if (protocolVersion == 0) {
161 return sizeof(int32_t);
162 }
163 return sizeof(RpcWireReply);
164 }
Steven Moreland5553ac42020-11-11 02:14:45 +0000165};
Frederick Mayledc07cf82022-05-26 20:30:12 +0000166static_assert(sizeof(RpcWireReply) == 20);
Steven Moreland5553ac42020-11-11 02:14:45 +0000167
168#pragma clang diagnostic pop
169
170} // namespace android