@ -7,28 +7,24 @@
* See README for more details .
*/
# include "binder_manager.h"
# include "supplicant.h"
# include "binder_manager.h"
namespace wpa_supplicant_binder {
Supplicant : : Supplicant ( struct wpa_global * global )
: wpa_global_ ( global )
{
}
Supplicant : : Supplicant ( struct wpa_global * global ) : wpa_global_ ( global ) { }
android : : binder : : Status Supplicant : : CreateInterface (
const android : : os : : PersistableBundle & params ,
android : : sp < fi : : w1 : : wpa_supplicant : : IIface > * aidl_return )
const android : : os : : PersistableBundle & params ,
android : : sp < fi : : w1 : : wpa_supplicant : : IIface > * aidl_return )
{
android : : String16 driver , ifname , confname , bridge_ifname ;
/* Check if required Ifname argument is missing */
if ( ! params . getString ( android : : String16 ( " Ifname " ) , & ifname ) )
return android : : binder : : Status : : fromServiceSpecificError (
ERROR_INVALID_ARGS ,
android : : String8 ( " Ifname missing in params. " ) ) ;
ERROR_INVALID_ARGS ,
android : : String8 ( " Ifname missing in params. " ) ) ;
/* Retrieve the remaining params from the dictionary */
params . getString ( android : : String16 ( " Driver " ) , & driver ) ;
params . getString ( android : : String16 ( " ConfigFile " ) , & confname ) ;
@ -38,11 +34,12 @@ android::binder::Status Supplicant::CreateInterface(
* Try to get the wpa_supplicant record for this iface , return
* an error if we already control it .
*/
if ( wpa_supplicant_get_iface ( wpa_global_ ,
android : : String8 ( ifname ) . string ( ) ) ! = NULL )
if ( wpa_supplicant_get_iface (
wpa_global_ , android : : String8 ( ifname ) . string ( ) ) ! = NULL )
return android : : binder : : Status : : fromServiceSpecificError (
ERROR_IFACE_EXISTS ,
android : : String8 ( " wpa_supplicant already controls this interface. " ) ) ;
ERROR_IFACE_EXISTS ,
android : : String8 ( " wpa_supplicant already controls this "
" interface. " ) ) ;
android : : binder : : Status status ;
struct wpa_supplicant * wpa_s = NULL ;
@ -52,36 +49,38 @@ android::binder::Status Supplicant::CreateInterface(
iface . driver = os_strdup ( android : : String8 ( driver ) . string ( ) ) ;
iface . ifname = os_strdup ( android : : String8 ( ifname ) . string ( ) ) ;
iface . confname = os_strdup ( android : : String8 ( confname ) . string ( ) ) ;
iface . bridge_ifname = os_strdup (
android : : String8 ( bridge_ifname ) . string ( ) ) ;
iface . bridge_ifname =
os_strdup ( android : : String8 ( bridge_ifname ) . string ( ) ) ;
/* Otherwise, have wpa_supplicant attach to it. */
wpa_s = wpa_supplicant_add_iface ( wpa_global_ , & iface , NULL ) ;
/* The supplicant core creates a corresponding binder object via
* BinderManager when | wpa_supplicant_add_iface | is called . */
if ( ! wpa_s | | ! wpa_s - > binder_object_key ) {
status = android : : binder : : Status : : fromServiceSpecificError (
ERROR_UNKNOWN ,
android : : String8 ( " wpa_supplicant couldn't grab this interface. " ) ) ;
ERROR_UNKNOWN ,
android : : String8 (
" wpa_supplicant couldn't grab this interface. " ) ) ;
} else {
BinderManager * binder_manager = BinderManager : : getInstance ( ) ;
if ( ! binder_manager | |
binder_manager - > getIfaceBinderObjectByKey (
wpa_s - > binder_object_key , aidl_return ) )
status = android : : binder : : Status : : fromServiceSpecificError (
wpa_s - > binder_object_key , aidl_return ) )
status =
android : : binder : : Status : : fromServiceSpecificError (
ERROR_UNKNOWN ,
android : : String8 ( " wpa_supplicant encountered a binder error. " ) ) ;
android : : String8 ( " wpa_supplicant encountered a "
" binder error. " ) ) ;
else
status = android : : binder : : Status : : ok ( ) ;
}
os_free ( ( void * ) iface . driver ) ;
os_free ( ( void * ) iface . ifname ) ;
os_free ( ( void * ) iface . confname ) ;
os_free ( ( void * ) iface . bridge_ifname ) ;
os_free ( ( void * ) iface . driver ) ;
os_free ( ( void * ) iface . ifname ) ;
os_free ( ( void * ) iface . confname ) ;
os_free ( ( void * ) iface . bridge_ifname ) ;
return status ;
}
android : : binder : : Status Supplicant : : RemoveInterface ( const std : : string & ifname )
{
struct wpa_supplicant * wpa_s ;
@ -89,35 +88,38 @@ android::binder::Status Supplicant::RemoveInterface(const std::string &ifname)
wpa_s = wpa_supplicant_get_iface ( wpa_global_ , ifname . c_str ( ) ) ;
if ( ! wpa_s | | ! wpa_s - > binder_object_key )
return android : : binder : : Status : : fromServiceSpecificError (
ERROR_IFACE_UNKNOWN ,
android : : String8 ( " wpa_supplicant does not control this interface. " ) ) ;
ERROR_IFACE_UNKNOWN ,
android : : String8 ( " wpa_supplicant does not control this "
" interface. " ) ) ;
if ( wpa_supplicant_remove_iface ( wpa_global_ , wpa_s , 0 ) )
return android : : binder : : Status : : fromServiceSpecificError (
ERROR_UNKNOWN ,
android : : String8 ( " wpa_supplicant couldn't remove this interface. " ) ) ;
ERROR_UNKNOWN ,
android : : String8 (
" wpa_supplicant couldn't remove this interface. " ) ) ;
return android : : binder : : Status : : ok ( ) ;
}
android : : binder : : Status Supplicant : : GetInterface (
const std : : string & ifname ,
android : : sp < fi : : w1 : : wpa_supplicant : : IIface > * aidl_return )
const std : : string & ifname ,
android : : sp < fi : : w1 : : wpa_supplicant : : IIface > * aidl_return )
{
struct wpa_supplicant * wpa_s ;
wpa_s = wpa_supplicant_get_iface ( wpa_global_ , ifname . c_str ( ) ) ;
if ( ! wpa_s | | ! wpa_s - > binder_object_key )
return android : : binder : : Status : : fromServiceSpecificError (
ERROR_IFACE_UNKNOWN ,
android : : String8 ( " wpa_supplicant does not control this interface. " ) ) ;
ERROR_IFACE_UNKNOWN ,
android : : String8 (
" wpa_supplicant does not control this interface. " ) ) ;
BinderManager * binder_manager = BinderManager : : getInstance ( ) ;
if ( ! binder_manager | |
binder_manager - > getIfaceBinderObjectByKey ( wpa_s - > binder_object_key ,
aidl_return ) )
binder_manager - > getIfaceBinderObjectByKey (
wpa_s - > binder_object_key , aidl_return ) )
return android : : binder : : Status : : fromServiceSpecificError (
ERROR_UNKNOWN ,
android : : String8 ( " wpa_supplicant encountered a binder error. " ) ) ;
ERROR_UNKNOWN ,
android : : String8 (
" wpa_supplicant encountered a binder error. " ) ) ;
return android : : binder : : Status : : ok ( ) ;
}