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