1 // 2 // Copyright (C) 2016 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 17 #include "shill/binder/binder_control.h" 18 19 #include <base/bind.h> 20 #include <binder/IServiceManager.h> 21 #include <binderwrapper/binder_wrapper.h> 22 #include <brillo/binder_watcher.h> 23 24 // TODO(samueltan): remove when shill is no longer dependent on DBus proxies. 25 #include <dbus/service_constants.h> 26 27 #include "shill/manager.h" 28 29 #include "shill/binder/device_binder_adaptor.h" 30 #include "shill/binder/manager_binder_adaptor.h" 31 #include "shill/binder/service_binder_adaptor.h" 32 #include "shill/dbus/chromeos_dhcpcd_listener.h" 33 #include "shill/dbus/chromeos_dhcpcd_proxy.h" 34 #include "shill/ipconfig_adaptor_stub.h" 35 #include "shill/profile_adaptor_stub.h" 36 #include "shill/rpc_task_adaptor_stub.h" 37 #include "shill/third_party_vpn_adaptor_stub.h" 38 #include "shill/dbus/chromeos_firewalld_proxy.h" 39 #include "shill/power_manager_proxy_stub.h" 40 #include "shill/upstart/upstart_proxy_stub.h" 41 #if !defined(DISABLE_WIFI) 42 #include "shill/dbus/chromeos_supplicant_bss_proxy.h" 43 #endif // DISABLE_WIFI 44 #if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X) 45 #include "shill/dbus/chromeos_supplicant_interface_proxy.h" 46 #include "shill/dbus/chromeos_supplicant_network_proxy.h" 47 #include "shill/dbus/chromeos_supplicant_process_proxy.h" 48 #endif // DISABLE_WIFI || DISABLE_WIRED_8021X 49 50 using android::BinderWrapper; 51 using android::defaultServiceManager; 52 using std::string; 53 using std::to_string; 54 55 namespace shill { 56 57 // static. 58 const char BinderControl::kNullRpcIdentifier[] = "-1"; 59 60 BinderControl::BinderControl(EventDispatcher* dispatcher) 61 : next_unique_binder_adaptor_id_(0), 62 dispatcher_(dispatcher), 63 null_identifier_(kNullRpcIdentifier) { 64 BinderWrapper::Create(); 65 // Watch Binder events in the main loop 66 brillo::BinderWatcher binder_watcher; 67 CHECK(binder_watcher.Init()) << "Binder FD watcher init failed"; 68 69 // Also initialize D-Bus, which we will use alongside Binder for IPC with 70 // daemons that do not yet support Binder. 71 // TODO(samueltan): remove when shill is no longer dependent on DBus proxies. 72 dbus::Bus::Options options; 73 options.bus_type = dbus::Bus::SYSTEM; 74 proxy_bus_ = new dbus::Bus(options); 75 CHECK(proxy_bus_->Connect()); 76 } 77 78 BinderControl::~BinderControl() { 79 // TODO(samueltan): remove when shill is no longer dependent on DBus proxies. 80 if (proxy_bus_) { 81 proxy_bus_->ShutdownAndBlock(); 82 } 83 } 84 85 const string& BinderControl::NullRPCIdentifier() { return null_identifier_; } 86 87 void BinderControl::RegisterManagerObject( 88 Manager* manager, const base::Closure& registration_done_callback) { 89 // Binder manager object registration is performed synchronously, and 90 // ManagerBinderAdaptor::RegisterAsync does not 91 // actually use the callback passed to it. However, since the caller of this 92 // function expects |registration_done_callback| to be called asynchronously, 93 // post the callback to the message loop ourselves. 94 manager->RegisterAsync(base::Callback<void(bool)>()); 95 dispatcher_->PostTask(registration_done_callback); 96 } 97 98 DeviceAdaptorInterface* BinderControl::CreateDeviceAdaptor(Device* device) { 99 return CreateAdaptor<Device, DeviceAdaptorInterface, DeviceBinderAdaptor>( 100 device); 101 } 102 103 IPConfigAdaptorInterface* BinderControl::CreateIPConfigAdaptor( 104 IPConfig* config) { 105 return new IPConfigAdaptorStub(to_string(next_unique_binder_adaptor_id_++)); 106 } 107 108 ManagerAdaptorInterface* BinderControl::CreateManagerAdaptor(Manager* manager) { 109 return CreateAdaptor<Manager, ManagerAdaptorInterface, ManagerBinderAdaptor>( 110 manager); 111 } 112 113 ProfileAdaptorInterface* BinderControl::CreateProfileAdaptor(Profile* profile) { 114 return new ProfileAdaptorStub(to_string(next_unique_binder_adaptor_id_++)); 115 } 116 117 RPCTaskAdaptorInterface* BinderControl::CreateRPCTaskAdaptor(RPCTask* task) { 118 return new RPCTaskAdaptorStub(to_string(next_unique_binder_adaptor_id_++)); 119 } 120 121 ServiceAdaptorInterface* BinderControl::CreateServiceAdaptor(Service* service) { 122 return CreateAdaptor<Service, ServiceAdaptorInterface, ServiceBinderAdaptor>( 123 service); 124 } 125 126 #ifndef DISABLE_VPN 127 ThirdPartyVpnAdaptorInterface* BinderControl::CreateThirdPartyVpnAdaptor( 128 ThirdPartyVpnDriver* driver) { 129 return new ThirdPartyVpnAdaptorStub( 130 to_string(next_unique_binder_adaptor_id_++)); 131 } 132 #endif 133 134 PowerManagerProxyInterface* BinderControl::CreatePowerManagerProxy( 135 PowerManagerProxyDelegate* delegate, 136 const base::Closure& service_appeared_callback, 137 const base::Closure& service_vanished_callback) { 138 return new PowerManagerProxyStub(); 139 } 140 141 #if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X) 142 SupplicantProcessProxyInterface* BinderControl::CreateSupplicantProcessProxy( 143 const base::Closure& service_appeared_callback, 144 const base::Closure& service_vanished_callback) { 145 return new ChromeosSupplicantProcessProxy(dispatcher_, proxy_bus_, 146 service_appeared_callback, 147 service_vanished_callback); 148 } 149 150 SupplicantInterfaceProxyInterface* 151 BinderControl::CreateSupplicantInterfaceProxy( 152 SupplicantEventDelegateInterface* delegate, const string& object_path) { 153 return new ChromeosSupplicantInterfaceProxy(proxy_bus_, object_path, 154 delegate); 155 } 156 157 SupplicantNetworkProxyInterface* BinderControl::CreateSupplicantNetworkProxy( 158 const string& object_path) { 159 return new ChromeosSupplicantNetworkProxy(proxy_bus_, object_path); 160 } 161 #endif // DISABLE_WIFI || DISABLE_WIRED_8021X 162 163 #if !defined(DISABLE_WIFI) 164 SupplicantBSSProxyInterface* BinderControl::CreateSupplicantBSSProxy( 165 WiFiEndpoint* wifi_endpoint, const string& object_path) { 166 return new ChromeosSupplicantBSSProxy(proxy_bus_, object_path, wifi_endpoint); 167 } 168 #endif // DISABLE_WIFI 169 170 DHCPCDListenerInterface* BinderControl::CreateDHCPCDListener( 171 DHCPProvider* provider) { 172 return new ChromeosDHCPCDListener(proxy_bus_, dispatcher_, provider); 173 } 174 175 DHCPProxyInterface* BinderControl::CreateDHCPProxy(const string& service) { 176 return new ChromeosDHCPCDProxy(proxy_bus_, service); 177 } 178 179 UpstartProxyInterface* BinderControl::CreateUpstartProxy() { 180 return new UpstartProxyStub(); 181 } 182 183 FirewallProxyInterface* BinderControl::CreateFirewallProxy() { 184 return new ChromeosFirewalldProxy(proxy_bus_); 185 } 186 187 template <typename Object, typename AdaptorInterface, typename Adaptor> 188 AdaptorInterface* BinderControl::CreateAdaptor(Object* object) { 189 return new Adaptor(object, to_string(next_unique_binder_adaptor_id_++)); 190 } 191 192 } // namespace shill 193