1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#ifndef ANDROID_PDX_UDS_IPC_HELPER_H_
2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#define ANDROID_PDX_UDS_IPC_HELPER_H_
3e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
4e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <sys/socket.h>
5e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <utility>
6e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <vector>
7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
8e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/rpc/serializable.h>
9e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/rpc/serialization.h>
10e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/status.h>
11e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/utility.h>
12e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
13e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace android {
14e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace pdx {
15e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace uds {
16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
17d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko// Test interfaces used for unit-testing payload sending/receiving over sockets.
18d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenkoclass SendInterface {
19d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko public:
20d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko  virtual ssize_t Send(int socket_fd, const void* data, size_t size,
21d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko                       int flags) = 0;
22d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko  virtual ssize_t SendMessage(int socket_fd, const msghdr* msg, int flags) = 0;
23d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko
24d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko protected:
25d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko  virtual ~SendInterface() = default;
26d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko};
27d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko
28d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenkoclass RecvInterface {
29d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko public:
30d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko  virtual ssize_t Receive(int socket_fd, void* data, size_t size,
31d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko                          int flags) = 0;
32d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko  virtual ssize_t ReceiveMessage(int socket_fd, msghdr* msg, int flags) = 0;
33d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko
34d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko protected:
35d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko  virtual ~RecvInterface() = default;
36d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko};
37d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko
38d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko// Helper methods that allow to send/receive data through abstract interfaces.
39d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko// Useful for mocking out the underlying socket I/O.
40d618b567630d347be0929ea25ce6c68921005ed6Alex VakulenkoStatus<void> SendAll(SendInterface* sender, const BorrowedHandle& socket_fd,
41d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko                     const void* data, size_t size);
42d618b567630d347be0929ea25ce6c68921005ed6Alex VakulenkoStatus<void> SendMsgAll(SendInterface* sender, const BorrowedHandle& socket_fd,
43d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko                        const msghdr* msg);
44d618b567630d347be0929ea25ce6c68921005ed6Alex VakulenkoStatus<void> RecvAll(RecvInterface* receiver, const BorrowedHandle& socket_fd,
45d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko                     void* data, size_t size);
46d618b567630d347be0929ea25ce6c68921005ed6Alex VakulenkoStatus<void> RecvMsgAll(RecvInterface* receiver,
47d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko                        const BorrowedHandle& socket_fd, msghdr* msg);
48d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko
49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#define RETRY_EINTR(fnc_call)                 \
50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ([&]() -> decltype(fnc_call) {              \
51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    decltype(fnc_call) result;                \
52e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    do {                                      \
53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      result = (fnc_call);                    \
54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    } while (result == -1 && errno == EINTR); \
55e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return result;                            \
56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  })()
57e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
58e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoclass SendPayload : public MessageWriter, public OutputResourceMapper {
59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko public:
60d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko  SendPayload(SendInterface* sender = nullptr) : sender_{sender} {}
6109aa736ee6136787b18807d7ab459feba23cec04Alex Vakulenko  Status<void> Send(const BorrowedHandle& socket_fd);
6209aa736ee6136787b18807d7ab459feba23cec04Alex Vakulenko  Status<void> Send(const BorrowedHandle& socket_fd, const ucred* cred);
63e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
64e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // MessageWriter
65e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  void* GetNextWriteBufferSection(size_t size) override;
66e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  OutputResourceMapper* GetOutputResourceMapper() override;
67e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
68e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // OutputResourceMapper
69f0a7bd033941e26e380232a0515e903cf8e678e5Alex Vakulenko  Status<FileReference> PushFileHandle(const LocalHandle& handle) override;
70f0a7bd033941e26e380232a0515e903cf8e678e5Alex Vakulenko  Status<FileReference> PushFileHandle(const BorrowedHandle& handle) override;
71f0a7bd033941e26e380232a0515e903cf8e678e5Alex Vakulenko  Status<FileReference> PushFileHandle(const RemoteHandle& handle) override;
72f0a7bd033941e26e380232a0515e903cf8e678e5Alex Vakulenko  Status<ChannelReference> PushChannelHandle(
73f0a7bd033941e26e380232a0515e903cf8e678e5Alex Vakulenko      const LocalChannelHandle& handle) override;
74f0a7bd033941e26e380232a0515e903cf8e678e5Alex Vakulenko  Status<ChannelReference> PushChannelHandle(
75e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      const BorrowedChannelHandle& handle) override;
76f0a7bd033941e26e380232a0515e903cf8e678e5Alex Vakulenko  Status<ChannelReference> PushChannelHandle(
77e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      const RemoteChannelHandle& handle) override;
78e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
79e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko private:
80d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko  SendInterface* sender_;
81e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ByteBuffer buffer_;
82e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<int> file_handles_;
83e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko};
84e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
85e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoclass ReceivePayload : public MessageReader, public InputResourceMapper {
86e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko public:
87d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko  ReceivePayload(RecvInterface* receiver = nullptr) : receiver_{receiver} {}
8809aa736ee6136787b18807d7ab459feba23cec04Alex Vakulenko  Status<void> Receive(const BorrowedHandle& socket_fd);
8909aa736ee6136787b18807d7ab459feba23cec04Alex Vakulenko  Status<void> Receive(const BorrowedHandle& socket_fd, ucred* cred);
90e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
91e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // MessageReader
92e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  BufferSection GetNextReadBufferSection() override;
93e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  void ConsumeReadBufferSectionData(const void* new_start) override;
94e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  InputResourceMapper* GetInputResourceMapper() override;
95e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
96e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // InputResourceMapper
97e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  bool GetFileHandle(FileReference ref, LocalHandle* handle) override;
98e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  bool GetChannelHandle(ChannelReference ref,
99e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                        LocalChannelHandle* handle) override;
100e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
101e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko private:
102d618b567630d347be0929ea25ce6c68921005ed6Alex Vakulenko  RecvInterface* receiver_;
103e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ByteBuffer buffer_;
104e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<LocalHandle> file_handles_;
105e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  size_t read_pos_{0};
106e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko};
107e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
108e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotemplate <typename FileHandleType>
109e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoclass ChannelInfo {
110e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko public:
111e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  FileHandleType data_fd;
112e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  FileHandleType event_fd;
113e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
114e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko private:
115e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  PDX_SERIALIZABLE_MEMBERS(ChannelInfo, data_fd, event_fd);
116e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko};
117e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
118e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotemplate <typename FileHandleType>
119e41826ac301b9afad1cbfe59c57e27f2495be968Alex Vakulenkoclass ChannelConnectionInfo {
120e41826ac301b9afad1cbfe59c57e27f2495be968Alex Vakulenko public:
121e41826ac301b9afad1cbfe59c57e27f2495be968Alex Vakulenko  FileHandleType channel_fd;
122e41826ac301b9afad1cbfe59c57e27f2495be968Alex Vakulenko
123e41826ac301b9afad1cbfe59c57e27f2495be968Alex Vakulenko private:
124e41826ac301b9afad1cbfe59c57e27f2495be968Alex Vakulenko  PDX_SERIALIZABLE_MEMBERS(ChannelConnectionInfo, channel_fd);
125e41826ac301b9afad1cbfe59c57e27f2495be968Alex Vakulenko};
126e41826ac301b9afad1cbfe59c57e27f2495be968Alex Vakulenko
127e41826ac301b9afad1cbfe59c57e27f2495be968Alex Vakulenkotemplate <typename FileHandleType>
128e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoclass RequestHeader {
129e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko public:
130e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  int32_t op{0};
131e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ucred cred;
132e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  uint32_t send_len{0};
133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  uint32_t max_recv_len{0};
134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<FileHandleType> file_descriptors;
135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<ChannelInfo<FileHandleType>> channels;
136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::array<uint8_t, 32> impulse_payload;
137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  bool is_impulse{false};
138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko private:
140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  PDX_SERIALIZABLE_MEMBERS(RequestHeader, op, send_len, max_recv_len,
141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                           file_descriptors, channels, impulse_payload,
142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                           is_impulse);
143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko};
144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
145e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotemplate <typename FileHandleType>
146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoclass ResponseHeader {
147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko public:
148e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  int32_t ret_code{0};
149e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  uint32_t recv_len{0};
150e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<FileHandleType> file_descriptors;
151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  std::vector<ChannelInfo<FileHandleType>> channels;
152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko private:
154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  PDX_SERIALIZABLE_MEMBERS(ResponseHeader, ret_code, recv_len, file_descriptors,
155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                           channels);
156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko};
157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotemplate <typename T>
15909aa736ee6136787b18807d7ab459feba23cec04Alex Vakulenkoinline Status<void> SendData(const BorrowedHandle& socket_fd, const T& data) {
160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  SendPayload payload;
161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  rpc::Serialize(data, &payload);
162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return payload.Send(socket_fd);
163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotemplate <typename FileHandleType>
16609aa736ee6136787b18807d7ab459feba23cec04Alex Vakulenkoinline Status<void> SendData(const BorrowedHandle& socket_fd,
167e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                             const RequestHeader<FileHandleType>& request) {
168e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  SendPayload payload;
169e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  rpc::Serialize(request, &payload);
170e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return payload.Send(socket_fd, &request.cred);
171e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
172e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
17309aa736ee6136787b18807d7ab459feba23cec04Alex VakulenkoStatus<void> SendData(const BorrowedHandle& socket_fd, const void* data,
17409aa736ee6136787b18807d7ab459feba23cec04Alex Vakulenko                      size_t size);
17509aa736ee6136787b18807d7ab459feba23cec04Alex VakulenkoStatus<void> SendDataVector(const BorrowedHandle& socket_fd, const iovec* data,
17609aa736ee6136787b18807d7ab459feba23cec04Alex Vakulenko                            size_t count);
177e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
178e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotemplate <typename T>
17909aa736ee6136787b18807d7ab459feba23cec04Alex Vakulenkoinline Status<void> ReceiveData(const BorrowedHandle& socket_fd, T* data) {
180e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ReceivePayload payload;
181e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Status<void> status = payload.Receive(socket_fd);
182e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (status && rpc::Deserialize(data, &payload) != rpc::ErrorCode::NO_ERROR)
183e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    status.SetError(EIO);
184e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return status;
185e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
186e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
187e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotemplate <typename FileHandleType>
18809aa736ee6136787b18807d7ab459feba23cec04Alex Vakulenkoinline Status<void> ReceiveData(const BorrowedHandle& socket_fd,
189e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                RequestHeader<FileHandleType>* request) {
190e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ReceivePayload payload;
191e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Status<void> status = payload.Receive(socket_fd, &request->cred);
192e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (status && rpc::Deserialize(request, &payload) != rpc::ErrorCode::NO_ERROR)
193e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    status.SetError(EIO);
194e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return status;
195e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
196e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
19709aa736ee6136787b18807d7ab459feba23cec04Alex VakulenkoStatus<void> ReceiveData(const BorrowedHandle& socket_fd, void* data,
19809aa736ee6136787b18807d7ab459feba23cec04Alex Vakulenko                         size_t size);
19909aa736ee6136787b18807d7ab459feba23cec04Alex VakulenkoStatus<void> ReceiveDataVector(const BorrowedHandle& socket_fd,
20009aa736ee6136787b18807d7ab459feba23cec04Alex Vakulenko                               const iovec* data, size_t count);
201e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
202e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkosize_t CountVectorSize(const iovec* data, size_t count);
203e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkovoid InitRequest(android::pdx::uds::RequestHeader<BorrowedHandle>* request,
204e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                 int opcode, uint32_t send_len, uint32_t max_recv_len,
205e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                 bool is_impulse);
206e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
207e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoStatus<void> WaitForEndpoint(const std::string& endpoint_path,
208e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                             int64_t timeout_ms);
209e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
210e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // namespace uds
211e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // namespace pdx
212e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // namespace android
213e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
214e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif  // ANDROID_PDX_UDS_IPC_HELPER_H_
215