1 #ifndef ANDROID_PDX_UDS_SERVICE_ENDPOINT_H_ 2 #define ANDROID_PDX_UDS_SERVICE_ENDPOINT_H_ 3 4 #include <sys/stat.h> 5 #include <map> 6 #include <memory> 7 #include <mutex> 8 #include <string> 9 #include <unordered_map> 10 #include <vector> 11 12 #include <pdx/service.h> 13 #include <pdx/service_endpoint.h> 14 #include <uds/channel_event_set.h> 15 #include <uds/service_dispatcher.h> 16 17 namespace android { 18 namespace pdx { 19 namespace uds { 20 21 class Endpoint : public pdx::Endpoint { 22 public: 23 enum { 24 kIpcTag = 0x00736674, // 'uds' 25 }; 26 27 // Blocking modes for service endpoint. Controls whether the epoll set is in 28 // blocking mode or not for message receive. 29 enum { 30 kBlocking = true, 31 kNonBlocking = false, 32 kDefaultBlocking = kNonBlocking, 33 }; 34 35 enum : mode_t { 36 kDefaultMode = 0, 37 }; 38 39 ~Endpoint() override = default; 40 41 uint32_t GetIpcTag() const override { return kIpcTag; } 42 Status<void> SetService(Service* service) override; 43 Status<void> SetChannel(int channel_id, Channel* channel) override; 44 Status<void> CloseChannel(int channel_id) override; 45 Status<void> ModifyChannelEvents(int channel_id, int clear_mask, 46 int set_mask) override; 47 Status<RemoteChannelHandle> PushChannel(Message* message, int flags, 48 Channel* channel, 49 int* channel_id) override; 50 Status<int> CheckChannel(const Message* message, ChannelReference ref, 51 Channel** channel) override; 52 Status<void> MessageReceive(Message* message) override; 53 Status<void> MessageReply(Message* message, int return_code) override; 54 Status<void> MessageReplyFd(Message* message, unsigned int push_fd) override; 55 Status<void> MessageReplyChannelHandle( 56 Message* message, const LocalChannelHandle& handle) override; 57 Status<void> MessageReplyChannelHandle( 58 Message* message, const BorrowedChannelHandle& handle) override; 59 Status<void> MessageReplyChannelHandle( 60 Message* message, const RemoteChannelHandle& handle) override; 61 Status<size_t> ReadMessageData(Message* message, const iovec* vector, 62 size_t vector_length) override; 63 Status<size_t> WriteMessageData(Message* message, const iovec* vector, 64 size_t vector_length) override; 65 Status<FileReference> PushFileHandle(Message* message, 66 const LocalHandle& handle) override; 67 Status<FileReference> PushFileHandle(Message* message, 68 const BorrowedHandle& handle) override; 69 Status<FileReference> PushFileHandle(Message* message, 70 const RemoteHandle& handle) override; 71 Status<ChannelReference> PushChannelHandle( 72 Message* message, const LocalChannelHandle& handle) override; 73 Status<ChannelReference> PushChannelHandle( 74 Message* message, const BorrowedChannelHandle& handle) override; 75 Status<ChannelReference> PushChannelHandle( 76 Message* message, const RemoteChannelHandle& handle) override; 77 LocalHandle GetFileHandle(Message* message, FileReference ref) const override; 78 LocalChannelHandle GetChannelHandle(Message* message, 79 ChannelReference ref) const override; 80 81 void* AllocateMessageState() override; 82 void FreeMessageState(void* state) override; 83 84 Status<void> Cancel() override; 85 86 // Open an endpoint at the given path. 87 // Second parameter is unused for UDS, but we have it here for compatibility 88 // in signature with servicefs::Endpoint::Create(). 89 // This method uses |endpoint_path| as a relative path to endpoint socket 90 // created by init process. 91 static std::unique_ptr<Endpoint> Create(const std::string& endpoint_path, 92 mode_t /*unused_mode*/ = kDefaultMode, 93 bool blocking = kDefaultBlocking); 94 95 // Helper method to create an endpoint at the given UDS socket path. This 96 // method physically creates and binds a socket at that path. 97 static std::unique_ptr<Endpoint> CreateAndBindSocket( 98 const std::string& endpoint_path, bool blocking = kDefaultBlocking); 99 100 // Helper method to create an endpoint from an existing socket FD. 101 // Mostly helpful for tests. 102 static std::unique_ptr<Endpoint> CreateFromSocketFd(LocalHandle socket_fd); 103 104 // Test helper method to register a new channel identified by |channel_fd| 105 // socket file descriptor. 106 Status<void> RegisterNewChannelForTests(LocalHandle channel_fd); 107 108 int epoll_fd() const { return epoll_fd_.Get(); } 109 110 private: 111 struct ChannelData { 112 LocalHandle data_fd; 113 ChannelEventSet event_set; 114 Channel* channel_state{nullptr}; 115 }; 116 117 // This class must be instantiated using Create() static methods above. 118 Endpoint(const std::string& endpoint_path, bool blocking, 119 bool use_init_socket_fd = true); 120 Endpoint(LocalHandle socket_fd); 121 122 void Init(LocalHandle socket_fd); 123 124 Endpoint(const Endpoint&) = delete; 125 void operator=(const Endpoint&) = delete; 126 127 uint32_t GetNextAvailableMessageId() { 128 return next_message_id_.fetch_add(1, std::memory_order_relaxed); 129 } 130 131 void BuildCloseMessage(int32_t channel_id, Message* message); 132 133 Status<void> AcceptConnection(Message* message); 134 Status<void> ReceiveMessageForChannel(const BorrowedHandle& channel_fd, 135 Message* message); 136 Status<void> OnNewChannel(LocalHandle channel_fd); 137 Status<std::pair<int32_t, ChannelData*>> OnNewChannelLocked( 138 LocalHandle channel_fd, Channel* channel_state); 139 Status<void> CloseChannelLocked(int32_t channel_id); 140 Status<void> ReenableEpollEvent(const BorrowedHandle& channel_fd); 141 Channel* GetChannelState(int32_t channel_id); 142 BorrowedHandle GetChannelSocketFd(int32_t channel_id); 143 BorrowedHandle GetChannelEventFd(int32_t channel_id); 144 int32_t GetChannelId(const BorrowedHandle& channel_fd); 145 Status<void> CreateChannelSocketPair(LocalHandle* local_socket, 146 LocalHandle* remote_socket); 147 148 std::string endpoint_path_; 149 bool is_blocking_; 150 LocalHandle socket_fd_; 151 LocalHandle cancel_event_fd_; 152 LocalHandle epoll_fd_; 153 154 mutable std::mutex channel_mutex_; 155 std::map<int32_t, ChannelData> channels_; 156 std::map<int, int32_t> channel_fd_to_id_; 157 int32_t last_channel_id_{0}; 158 159 Service* service_{nullptr}; 160 std::atomic<uint32_t> next_message_id_; 161 }; 162 163 } // namespace uds 164 } // namespace pdx 165 } // namespace android 166 167 #endif // ANDROID_PDX_UDS_PDX_SERVICE_ENDPOINT_H_ 168