blob: 067c4ad551554f7aaaf729b233a67f202b4f2157 [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 Moreland659416d2021-05-11 00:47:50 +000023enum : uint8_t {
Steven Moreland1b304292021-07-15 22:59:34 +000024 RPC_CONNECTION_OPTION_INCOMING = 0x1, // default is outgoing
Steven Moreland659416d2021-05-11 00:47:50 +000025};
26
Steven Moreland01a6bad2021-06-11 00:59:20 +000027constexpr uint64_t RPC_WIRE_ADDRESS_OPTION_CREATED = 1 << 0; // distinguish from '0' address
28constexpr uint64_t RPC_WIRE_ADDRESS_OPTION_FOR_SERVER = 1 << 1;
29
30struct RpcWireAddress {
31 uint64_t options;
32 uint8_t address[32];
33};
Steven Moreland14cd3fe2021-09-02 16:18:14 -070034static_assert(sizeof(RpcWireAddress) == 40);
Steven Moreland01a6bad2021-06-11 00:59:20 +000035
Steven Morelandc88b7fc2021-06-10 00:40:39 +000036/**
37 * This is sent to an RpcServer in order to request a new connection is created,
38 * either as part of a new session or an existing session
39 */
Steven Moreland659416d2021-05-11 00:47:50 +000040struct RpcConnectionHeader {
Steven Morelandbf57bce2021-07-26 15:26:12 -070041 uint32_t version; // maximum supported by caller
42 uint8_t reserver0[4];
Steven Moreland01a6bad2021-06-11 00:59:20 +000043 RpcWireAddress sessionId;
Steven Moreland659416d2021-05-11 00:47:50 +000044 uint8_t options;
Steven Morelandbf57bce2021-07-26 15:26:12 -070045 uint8_t reserved1[7];
46};
Steven Moreland14cd3fe2021-09-02 16:18:14 -070047static_assert(sizeof(RpcConnectionHeader) == 56);
Steven Morelandbf57bce2021-07-26 15:26:12 -070048
49/**
50 * In response to an RpcConnectionHeader which corresponds to a new session,
51 * this returns information to the server.
52 */
53struct RpcNewSessionResponse {
54 uint32_t version; // maximum supported by callee <= maximum supported by caller
55 uint8_t reserved[4];
Steven Moreland659416d2021-05-11 00:47:50 +000056};
Steven Moreland14cd3fe2021-09-02 16:18:14 -070057static_assert(sizeof(RpcNewSessionResponse) == 8);
Steven Moreland659416d2021-05-11 00:47:50 +000058
Steven Morelandc88b7fc2021-06-10 00:40:39 +000059#define RPC_CONNECTION_INIT_OKAY "cci"
60
61/**
62 * Whenever a client connection is setup, this is sent as the initial
63 * transaction. The main use of this is in order to control the timing for when
Steven Moreland1b304292021-07-15 22:59:34 +000064 * an incoming connection is setup.
Steven Morelandc88b7fc2021-06-10 00:40:39 +000065 */
Steven Moreland19fc9f72021-06-10 03:57:30 +000066struct RpcOutgoingConnectionInit {
Steven Morelandc88b7fc2021-06-10 00:40:39 +000067 char msg[4];
68 uint8_t reserved[4];
69};
Steven Moreland14cd3fe2021-09-02 16:18:14 -070070static_assert(sizeof(RpcOutgoingConnectionInit) == 8);
Steven Morelandc88b7fc2021-06-10 00:40:39 +000071
Steven Moreland5553ac42020-11-11 02:14:45 +000072enum : uint32_t {
73 /**
74 * follows is RpcWireTransaction, if flags != oneway, reply w/ RPC_COMMAND_REPLY expected
75 */
76 RPC_COMMAND_TRANSACT = 0,
77 /**
78 * follows is RpcWireReply
79 */
80 RPC_COMMAND_REPLY,
81 /**
82 * follows is RpcWireAddress
83 *
84 * note - this in the protocol directly instead of as a 'special
85 * transaction' in order to keep it as lightweight as possible (we don't
86 * want to create a 'Parcel' object for every decref)
87 */
88 RPC_COMMAND_DEC_STRONG,
89};
90
91/**
92 * These commands are used when the address in an RpcWireTransaction is zero'd
93 * out (no address). This allows the transact/reply flow to be used for
94 * additional server commands, without making the protocol for
95 * transactions/replies more complicated.
96 */
97enum : uint32_t {
98 RPC_SPECIAL_TRANSACT_GET_ROOT = 0,
Steven Morelandf137de92021-04-24 01:54:26 +000099 RPC_SPECIAL_TRANSACT_GET_MAX_THREADS = 1,
Steven Morelandbdb53ab2021-05-05 17:57:41 +0000100 RPC_SPECIAL_TRANSACT_GET_SESSION_ID = 2,
Steven Moreland5553ac42020-11-11 02:14:45 +0000101};
102
Steven Moreland5553ac42020-11-11 02:14:45 +0000103// serialization is like:
104// |RpcWireHeader|struct desginated by 'command'| (over and over again)
105
106struct RpcWireHeader {
107 uint32_t command; // RPC_COMMAND_*
108 uint32_t bodySize;
109
110 uint32_t reserved[2];
111};
Steven Moreland14cd3fe2021-09-02 16:18:14 -0700112static_assert(sizeof(RpcWireHeader) == 16);
Steven Moreland5553ac42020-11-11 02:14:45 +0000113
Steven Moreland5553ac42020-11-11 02:14:45 +0000114struct RpcWireTransaction {
115 RpcWireAddress address;
116 uint32_t code;
117 uint32_t flags;
118
119 uint64_t asyncNumber;
120
121 uint32_t reserved[4];
122
Devin Moore139913a2021-08-13 19:59:16 +0000123 uint8_t data[];
Steven Moreland5553ac42020-11-11 02:14:45 +0000124};
Steven Moreland14cd3fe2021-09-02 16:18:14 -0700125static_assert(sizeof(RpcWireTransaction) == 72);
Steven Moreland5553ac42020-11-11 02:14:45 +0000126
127struct RpcWireReply {
128 int32_t status; // transact return
Devin Moore139913a2021-08-13 19:59:16 +0000129 uint8_t data[];
Steven Moreland5553ac42020-11-11 02:14:45 +0000130};
Steven Moreland14cd3fe2021-09-02 16:18:14 -0700131static_assert(sizeof(RpcWireReply) == 4);
Steven Moreland5553ac42020-11-11 02:14:45 +0000132
133#pragma clang diagnostic pop
134
135} // namespace android