1*03f9172cSAndroid Build Coastguard Worker /* 2*03f9172cSAndroid Build Coastguard Worker * aidl interface for wpa_supplicant daemon 3*03f9172cSAndroid Build Coastguard Worker * Copyright (c) 2004-2018, Jouni Malinen <[email protected]> 4*03f9172cSAndroid Build Coastguard Worker * Copyright (c) 2004-2018, Roshan Pius <[email protected]> 5*03f9172cSAndroid Build Coastguard Worker * 6*03f9172cSAndroid Build Coastguard Worker * This software may be distributed under the terms of the BSD license. 7*03f9172cSAndroid Build Coastguard Worker * See README for more details. 8*03f9172cSAndroid Build Coastguard Worker */ 9*03f9172cSAndroid Build Coastguard Worker 10*03f9172cSAndroid Build Coastguard Worker #include "hostapd.h" 11*03f9172cSAndroid Build Coastguard Worker #include <android/binder_process.h> 12*03f9172cSAndroid Build Coastguard Worker #include <android/binder_manager.h> 13*03f9172cSAndroid Build Coastguard Worker 14*03f9172cSAndroid Build Coastguard Worker extern "C" 15*03f9172cSAndroid Build Coastguard Worker { 16*03f9172cSAndroid Build Coastguard Worker #include "aidl.h" 17*03f9172cSAndroid Build Coastguard Worker #include "utils/common.h" 18*03f9172cSAndroid Build Coastguard Worker #include "utils/eloop.h" 19*03f9172cSAndroid Build Coastguard Worker #include "utils/includes.h" 20*03f9172cSAndroid Build Coastguard Worker } 21*03f9172cSAndroid Build Coastguard Worker 22*03f9172cSAndroid Build Coastguard Worker using aidl::android::hardware::wifi::hostapd::Hostapd; 23*03f9172cSAndroid Build Coastguard Worker 24*03f9172cSAndroid Build Coastguard Worker // This file is a bridge between the hostapd code written in 'C' and the aidl 25*03f9172cSAndroid Build Coastguard Worker // interface in C++. So, using "C" style static globals here! 26*03f9172cSAndroid Build Coastguard Worker static int aidl_fd = -1; 27*03f9172cSAndroid Build Coastguard Worker static std::shared_ptr<Hostapd> service; 28*03f9172cSAndroid Build Coastguard Worker 29*03f9172cSAndroid Build Coastguard Worker void hostapd_aidl_sock_handler( 30*03f9172cSAndroid Build Coastguard Worker int /* sock */, void * /* eloop_ctx */, void * /* sock_ctx */) 31*03f9172cSAndroid Build Coastguard Worker { 32*03f9172cSAndroid Build Coastguard Worker ABinderProcess_handlePolledCommands(); 33*03f9172cSAndroid Build Coastguard Worker } 34*03f9172cSAndroid Build Coastguard Worker 35*03f9172cSAndroid Build Coastguard Worker int hostapd_aidl_init(struct hapd_interfaces *interfaces) 36*03f9172cSAndroid Build Coastguard Worker { 37*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_INFO, "Initializing aidl control"); 38*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_INFO, "Interface version: %d", Hostapd::version); 39*03f9172cSAndroid Build Coastguard Worker std::string instance; // declared here to allow use of goto 40*03f9172cSAndroid Build Coastguard Worker 41*03f9172cSAndroid Build Coastguard Worker ABinderProcess_setupPolling(&aidl_fd); 42*03f9172cSAndroid Build Coastguard Worker if (aidl_fd < 0) 43*03f9172cSAndroid Build Coastguard Worker goto err; 44*03f9172cSAndroid Build Coastguard Worker 45*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_INFO, "Processing aidl events on FD %d", aidl_fd); 46*03f9172cSAndroid Build Coastguard Worker // Look for read events from the aidl socket in the eloop. 47*03f9172cSAndroid Build Coastguard Worker if (eloop_register_read_sock( 48*03f9172cSAndroid Build Coastguard Worker aidl_fd, hostapd_aidl_sock_handler, interfaces, NULL) < 0) 49*03f9172cSAndroid Build Coastguard Worker goto err; 50*03f9172cSAndroid Build Coastguard Worker 51*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "Make service"); 52*03f9172cSAndroid Build Coastguard Worker service = ndk::SharedRefBase::make<Hostapd>(interfaces); 53*03f9172cSAndroid Build Coastguard Worker if (!service) 54*03f9172cSAndroid Build Coastguard Worker goto err; 55*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "Add service"); 56*03f9172cSAndroid Build Coastguard Worker instance = std::string() + Hostapd::descriptor + "/default"; 57*03f9172cSAndroid Build Coastguard Worker if (AServiceManager_addService(service->asBinder().get(), instance.c_str()) != STATUS_OK) 58*03f9172cSAndroid Build Coastguard Worker goto err; 59*03f9172cSAndroid Build Coastguard Worker return 0; 60*03f9172cSAndroid Build Coastguard Worker err: 61*03f9172cSAndroid Build Coastguard Worker hostapd_aidl_deinit(interfaces); 62*03f9172cSAndroid Build Coastguard Worker return -1; 63*03f9172cSAndroid Build Coastguard Worker } 64*03f9172cSAndroid Build Coastguard Worker 65*03f9172cSAndroid Build Coastguard Worker void hostapd_aidl_deinit(struct hapd_interfaces *interfaces) 66*03f9172cSAndroid Build Coastguard Worker { 67*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_INFO, "Deiniting aidl control"); 68*03f9172cSAndroid Build Coastguard Worker // Before aidl deinit, make sure call terminate to clear callback_ 69*03f9172cSAndroid Build Coastguard Worker if (service) { 70*03f9172cSAndroid Build Coastguard Worker service->terminate(); 71*03f9172cSAndroid Build Coastguard Worker } 72*03f9172cSAndroid Build Coastguard Worker eloop_unregister_read_sock(aidl_fd); 73*03f9172cSAndroid Build Coastguard Worker aidl_fd = -1; 74*03f9172cSAndroid Build Coastguard Worker } 75