1*6dbdd20aSAndroid Build Coastguard Worker /* 2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project 3*6dbdd20aSAndroid Build Coastguard Worker * 4*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*6dbdd20aSAndroid Build Coastguard Worker * 8*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*6dbdd20aSAndroid Build Coastguard Worker * 10*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License. 15*6dbdd20aSAndroid Build Coastguard Worker */ 16*6dbdd20aSAndroid Build Coastguard Worker 17*6dbdd20aSAndroid Build Coastguard Worker #ifndef SRC_IPC_HOST_IMPL_H_ 18*6dbdd20aSAndroid Build Coastguard Worker #define SRC_IPC_HOST_IMPL_H_ 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard Worker #include <map> 21*6dbdd20aSAndroid Build Coastguard Worker #include <set> 22*6dbdd20aSAndroid Build Coastguard Worker #include <string> 23*6dbdd20aSAndroid Build Coastguard Worker #include <vector> 24*6dbdd20aSAndroid Build Coastguard Worker 25*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/task_runner.h" 26*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/scoped_file.h" 27*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/sys_types.h" 28*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/thread_checker.h" 29*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/unix_socket.h" 30*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/ipc/deferred.h" 31*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/ipc/host.h" 32*6dbdd20aSAndroid Build Coastguard Worker #include "src/ipc/buffered_frame_deserializer.h" 33*6dbdd20aSAndroid Build Coastguard Worker 34*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto { 35*6dbdd20aSAndroid Build Coastguard Worker namespace ipc { 36*6dbdd20aSAndroid Build Coastguard Worker 37*6dbdd20aSAndroid Build Coastguard Worker constexpr uint32_t kDefaultIpcTxTimeoutMs = 10000; 38*6dbdd20aSAndroid Build Coastguard Worker 39*6dbdd20aSAndroid Build Coastguard Worker class HostImpl : public Host, public base::UnixSocket::EventListener { 40*6dbdd20aSAndroid Build Coastguard Worker public: 41*6dbdd20aSAndroid Build Coastguard Worker HostImpl(const char* socket_name, base::TaskRunner*); 42*6dbdd20aSAndroid Build Coastguard Worker HostImpl(base::ScopedSocketHandle, base::TaskRunner*); 43*6dbdd20aSAndroid Build Coastguard Worker HostImpl(base::TaskRunner* task_runner); 44*6dbdd20aSAndroid Build Coastguard Worker ~HostImpl() override; 45*6dbdd20aSAndroid Build Coastguard Worker 46*6dbdd20aSAndroid Build Coastguard Worker // Host implementation. 47*6dbdd20aSAndroid Build Coastguard Worker bool ExposeService(std::unique_ptr<Service>) override; 48*6dbdd20aSAndroid Build Coastguard Worker void AdoptConnectedSocket_Fuchsia( 49*6dbdd20aSAndroid Build Coastguard Worker base::ScopedSocketHandle, 50*6dbdd20aSAndroid Build Coastguard Worker std::function<bool(int)> send_fd_cb) override; 51*6dbdd20aSAndroid Build Coastguard Worker void SetSocketSendTimeoutMs(uint32_t timeout_ms) override; 52*6dbdd20aSAndroid Build Coastguard Worker 53*6dbdd20aSAndroid Build Coastguard Worker // base::UnixSocket::EventListener implementation. 54*6dbdd20aSAndroid Build Coastguard Worker void OnNewIncomingConnection(base::UnixSocket*, 55*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<base::UnixSocket>) override; 56*6dbdd20aSAndroid Build Coastguard Worker void OnDisconnect(base::UnixSocket*) override; 57*6dbdd20aSAndroid Build Coastguard Worker void OnDataAvailable(base::UnixSocket*) override; 58*6dbdd20aSAndroid Build Coastguard Worker sock()59*6dbdd20aSAndroid Build Coastguard Worker const base::UnixSocket* sock() const { return sock_.get(); } 60*6dbdd20aSAndroid Build Coastguard Worker 61*6dbdd20aSAndroid Build Coastguard Worker private: 62*6dbdd20aSAndroid Build Coastguard Worker // Owns the per-client receive buffer (BufferedFrameDeserializer). 63*6dbdd20aSAndroid Build Coastguard Worker struct ClientConnection { 64*6dbdd20aSAndroid Build Coastguard Worker ~ClientConnection(); 65*6dbdd20aSAndroid Build Coastguard Worker ClientID id; 66*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<base::UnixSocket> sock; 67*6dbdd20aSAndroid Build Coastguard Worker BufferedFrameDeserializer frame_deserializer; 68*6dbdd20aSAndroid Build Coastguard Worker base::ScopedFile received_fd; 69*6dbdd20aSAndroid Build Coastguard Worker std::function<bool(int)> send_fd_cb_fuchsia; 70*6dbdd20aSAndroid Build Coastguard Worker // Peer identity set using IPCFrame sent by the client. These 3 fields 71*6dbdd20aSAndroid Build Coastguard Worker // should be used only for non-AF_UNIX connections AF_UNIX connections 72*6dbdd20aSAndroid Build Coastguard Worker // should only rely on the peer identity obtained from the socket. 73*6dbdd20aSAndroid Build Coastguard Worker uid_t uid_override = base::kInvalidUid; 74*6dbdd20aSAndroid Build Coastguard Worker pid_t pid_override = base::kInvalidPid; 75*6dbdd20aSAndroid Build Coastguard Worker 76*6dbdd20aSAndroid Build Coastguard Worker // |machine_id| is mapped from machine_id_hint (or socket hostname if 77*6dbdd20aSAndroid Build Coastguard Worker // |the client doesn't support machine_id_hint). 78*6dbdd20aSAndroid Build Coastguard Worker base::MachineID machine_id = base::kDefaultMachineID; 79*6dbdd20aSAndroid Build Coastguard Worker 80*6dbdd20aSAndroid Build Coastguard Worker pid_t GetLinuxPeerPid() const; 81*6dbdd20aSAndroid Build Coastguard Worker uid_t GetPosixPeerUid() const; GetMachineIDClientConnection82*6dbdd20aSAndroid Build Coastguard Worker base::MachineID GetMachineID() const { return machine_id; } 83*6dbdd20aSAndroid Build Coastguard Worker }; 84*6dbdd20aSAndroid Build Coastguard Worker struct ExposedService { 85*6dbdd20aSAndroid Build Coastguard Worker ExposedService(ServiceID, const std::string&, std::unique_ptr<Service>); 86*6dbdd20aSAndroid Build Coastguard Worker ~ExposedService(); 87*6dbdd20aSAndroid Build Coastguard Worker ExposedService(ExposedService&&) noexcept; 88*6dbdd20aSAndroid Build Coastguard Worker ExposedService& operator=(ExposedService&&); 89*6dbdd20aSAndroid Build Coastguard Worker 90*6dbdd20aSAndroid Build Coastguard Worker ServiceID id; 91*6dbdd20aSAndroid Build Coastguard Worker std::string name; 92*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<Service> instance; 93*6dbdd20aSAndroid Build Coastguard Worker }; 94*6dbdd20aSAndroid Build Coastguard Worker 95*6dbdd20aSAndroid Build Coastguard Worker HostImpl(const HostImpl&) = delete; 96*6dbdd20aSAndroid Build Coastguard Worker HostImpl& operator=(const HostImpl&) = delete; 97*6dbdd20aSAndroid Build Coastguard Worker 98*6dbdd20aSAndroid Build Coastguard Worker bool Initialize(const char* socket_name); 99*6dbdd20aSAndroid Build Coastguard Worker void OnReceivedFrame(ClientConnection*, const Frame&); 100*6dbdd20aSAndroid Build Coastguard Worker void OnBindService(ClientConnection*, const Frame&); 101*6dbdd20aSAndroid Build Coastguard Worker void OnInvokeMethod(ClientConnection*, const Frame&); 102*6dbdd20aSAndroid Build Coastguard Worker void OnSetPeerIdentity(ClientConnection*, const Frame&); 103*6dbdd20aSAndroid Build Coastguard Worker 104*6dbdd20aSAndroid Build Coastguard Worker void ReplyToMethodInvocation(ClientID, RequestID, AsyncResult<ProtoMessage>); 105*6dbdd20aSAndroid Build Coastguard Worker const ExposedService* GetServiceByName(const std::string&); 106*6dbdd20aSAndroid Build Coastguard Worker 107*6dbdd20aSAndroid Build Coastguard Worker static void SendFrame(ClientConnection*, const Frame&, int fd = -1); 108*6dbdd20aSAndroid Build Coastguard Worker 109*6dbdd20aSAndroid Build Coastguard Worker base::TaskRunner* const task_runner_; 110*6dbdd20aSAndroid Build Coastguard Worker std::map<ServiceID, ExposedService> services_; 111*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<base::UnixSocket> sock_; // The listening socket. 112*6dbdd20aSAndroid Build Coastguard Worker std::map<ClientID, std::unique_ptr<ClientConnection>> clients_; 113*6dbdd20aSAndroid Build Coastguard Worker std::map<base::UnixSocket*, ClientConnection*> clients_by_socket_; 114*6dbdd20aSAndroid Build Coastguard Worker ServiceID last_service_id_ = 0; 115*6dbdd20aSAndroid Build Coastguard Worker ClientID last_client_id_ = 0; 116*6dbdd20aSAndroid Build Coastguard Worker uint32_t socket_tx_timeout_ms_ = kDefaultIpcTxTimeoutMs; 117*6dbdd20aSAndroid Build Coastguard Worker PERFETTO_THREAD_CHECKER(thread_checker_) 118*6dbdd20aSAndroid Build Coastguard Worker base::WeakPtrFactory<HostImpl> weak_ptr_factory_; // Keep last. 119*6dbdd20aSAndroid Build Coastguard Worker }; 120*6dbdd20aSAndroid Build Coastguard Worker 121*6dbdd20aSAndroid Build Coastguard Worker } // namespace ipc 122*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto 123*6dbdd20aSAndroid Build Coastguard Worker 124*6dbdd20aSAndroid Build Coastguard Worker #endif // SRC_IPC_HOST_IMPL_H_ 125