C++程序  |  285行  |  11.77 KB

/*
 * hidl interface for wpa_supplicant daemon
 * Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi>
 * Copyright (c) 2004-2016, Roshan Pius <rpius@google.com>
 *
 * This software may be distributed under the terms of the BSD license.
 * See README for more details.
 */

#ifndef WPA_SUPPLICANT_HIDL_STA_IFACE_H
#define WPA_SUPPLICANT_HIDL_STA_IFACE_H

#include <array>
#include <vector>

#include <android-base/macros.h>

#include <android/hardware/wifi/supplicant/1.2/ISupplicantStaIface.h>
#include <android/hardware/wifi/supplicant/1.2/ISupplicantStaIfaceCallback.h>
#include <android/hardware/wifi/supplicant/1.2/ISupplicantStaNetwork.h>

extern "C"
{
#include "utils/common.h"
#include "utils/includes.h"
#include "wpa_supplicant_i.h"
#include "config.h"
#include "driver_i.h"
#include "wpa.h"
}

namespace android {
namespace hardware {
namespace wifi {
namespace supplicant {
namespace V1_2 {
namespace implementation {
using namespace android::hardware::wifi::supplicant::V1_2;

/**
 * Implementation of StaIface hidl object. Each unique hidl
 * object is used for control operations on a specific interface
 * controlled by wpa_supplicant.
 */
class StaIface : public V1_2::ISupplicantStaIface
{
public:
	StaIface(struct wpa_global* wpa_global, const char ifname[]);
	~StaIface() override = default;
	// HIDL does not provide a built-in mechanism to let the server
	// invalidate a HIDL interface object after creation. If any client
	// process holds onto a reference to the object in their context,
	// any method calls on that reference will continue to be directed to
	// the server.
	// However Supplicant HAL needs to control the lifetime of these
	// objects. So, add a public |invalidate| method to all |Iface| and
	// |Network| objects.
	// This will be used to mark an object invalid when the corresponding
	// iface or network is removed.
	// All HIDL method implementations should check if the object is still
	// marked valid before processing them.
	void invalidate();
	bool isValid();

	// Hidl methods exposed.
	Return<void> getName(getName_cb _hidl_cb) override;
	Return<void> getType(getType_cb _hidl_cb) override;
	Return<void> addNetwork(addNetwork_cb _hidl_cb) override;
	Return<void> removeNetwork(
	    SupplicantNetworkId id, removeNetwork_cb _hidl_cb) override;
	Return<void> getNetwork(
	    SupplicantNetworkId id, getNetwork_cb _hidl_cb) override;
	Return<void> listNetworks(listNetworks_cb _hidl_cb) override;
	Return<void> registerCallback(
	    const sp<V1_0::ISupplicantStaIfaceCallback>& callback,
	    registerCallback_cb _hidl_cb) override;
	Return<void> registerCallback_1_1(
	    const sp<V1_1::ISupplicantStaIfaceCallback>& callback,
	    registerCallback_cb _hidl_cb) override;
	Return<void> registerCallback_1_2(
	    const sp<V1_2::ISupplicantStaIfaceCallback>& callback,
	    registerCallback_cb _hidl_cb) override;
	Return<void> reassociate(reassociate_cb _hidl_cb) override;
	Return<void> reconnect(reconnect_cb _hidl_cb) override;
	Return<void> disconnect(disconnect_cb _hidl_cb) override;
	Return<void> setPowerSave(
	    bool enable, setPowerSave_cb _hidl_cb) override;
	Return<void> initiateTdlsDiscover(
	    const hidl_array<uint8_t, 6>& mac_address,
	    initiateTdlsDiscover_cb _hidl_cb) override;
	Return<void> initiateTdlsSetup(
	    const hidl_array<uint8_t, 6>& mac_address,
	    initiateTdlsSetup_cb _hidl_cb) override;
	Return<void> initiateTdlsTeardown(
	    const hidl_array<uint8_t, 6>& mac_address,
	    initiateTdlsTeardown_cb _hidl_cb) override;
	Return<void> initiateAnqpQuery(
	    const hidl_array<uint8_t, 6>& mac_address,
	    const hidl_vec<ISupplicantStaIface::AnqpInfoId>& info_elements,
	    const hidl_vec<ISupplicantStaIface::Hs20AnqpSubtypes>& sub_types,
	    initiateAnqpQuery_cb _hidl_cb) override;
	Return<void> initiateHs20IconQuery(
	    const hidl_array<uint8_t, 6>& mac_address,
	    const hidl_string& file_name,
	    initiateHs20IconQuery_cb _hidl_cb) override;
	Return<void> getMacAddress(getMacAddress_cb _hidl_cb) override;
	Return<void> startRxFilter(startRxFilter_cb _hidl_cb) override;
	Return<void> stopRxFilter(stopRxFilter_cb _hidl_cb) override;
	Return<void> addRxFilter(
	    ISupplicantStaIface::RxFilterType type,
	    addRxFilter_cb _hidl_cb) override;
	Return<void> removeRxFilter(
	    ISupplicantStaIface::RxFilterType type,
	    removeRxFilter_cb _hidl_cb) override;
	Return<void> setBtCoexistenceMode(
	    ISupplicantStaIface::BtCoexistenceMode mode,
	    setBtCoexistenceMode_cb _hidl_cb) override;
	Return<void> setBtCoexistenceScanModeEnabled(
	    bool enable, setBtCoexistenceScanModeEnabled_cb _hidl_cb) override;
	Return<void> setSuspendModeEnabled(
	    bool enable, setSuspendModeEnabled_cb _hidl_cb) override;
	Return<void> setCountryCode(
	    const hidl_array<int8_t, 2>& code,
	    setCountryCode_cb _hidl_cb) override;
	Return<void> startWpsRegistrar(
	    const hidl_array<uint8_t, 6>& bssid, const hidl_string& pin,
	    startWpsRegistrar_cb _hidl_cb) override;
	Return<void> startWpsPbc(
	    const hidl_array<uint8_t, 6>& bssid,
	    startWpsPbc_cb _hidl_cb) override;
	Return<void> startWpsPinKeypad(
	    const hidl_string& pin, startWpsPinKeypad_cb _hidl_cb) override;
	Return<void> startWpsPinDisplay(
	    const hidl_array<uint8_t, 6>& bssid,
	    startWpsPinDisplay_cb _hidl_cb) override;
	Return<void> cancelWps(cancelWps_cb _hidl_cb) override;
	Return<void> setWpsDeviceName(
	    const hidl_string& name, setWpsDeviceName_cb _hidl_cb) override;
	Return<void> setWpsDeviceType(
	    const hidl_array<uint8_t, 8>& type,
	    setWpsDeviceType_cb _hidl_cb) override;
	Return<void> setWpsManufacturer(
	    const hidl_string& manufacturer,
	    setWpsManufacturer_cb _hidl_cb) override;
	Return<void> setWpsModelName(
	    const hidl_string& model_name,
	    setWpsModelName_cb _hidl_cb) override;
	Return<void> setWpsModelNumber(
	    const hidl_string& model_number,
	    setWpsModelNumber_cb _hidl_cb) override;
	Return<void> setWpsSerialNumber(
	    const hidl_string& serial_number,
	    setWpsSerialNumber_cb _hidl_cb) override;
	Return<void> setWpsConfigMethods(
	    uint16_t config_methods, setWpsConfigMethods_cb _hidl_cb) override;
	Return<void> setExternalSim(
	    bool useExternalSim, setExternalSim_cb _hidl_cb) override;
	Return<void> addExtRadioWork(
	    const hidl_string& name, uint32_t freq_in_mhz,
	    uint32_t timeout_in_sec, addExtRadioWork_cb _hidl_cb) override;
	Return<void> removeExtRadioWork(
	    uint32_t id, removeExtRadioWork_cb _hidl_cb) override;
	Return<void> enableAutoReconnect(
	    bool enable, enableAutoReconnect_cb _hidl_cb) override;
	Return<void> getKeyMgmtCapabilities(
	    getKeyMgmtCapabilities_cb _hidl_cb) override;
	Return<void> addDppPeerUri(const hidl_string& uri,
			addDppPeerUri_cb _hidl_cb) override;
	Return<void> removeDppUri(uint32_t bootstrap_id,
			removeDppUri_cb _hidl_cb) override;
	Return<void> startDppConfiguratorInitiator(uint32_t peer_bootstrap_id,
			uint32_t own_bootstrap_id, const hidl_string& ssid,
			const hidl_string& password, const hidl_string& psk,
			DppNetRole net_role, DppAkm security_akm,
			startDppConfiguratorInitiator_cb _hidl_cb) override;
	Return<void> startDppEnrolleeInitiator(uint32_t peer_bootstrap_id,
			uint32_t own_bootstrap_id,
			startDppConfiguratorInitiator_cb _hidl_cb) override;
	Return<void> stopDppInitiator(stopDppInitiator_cb _hidl_cb) override;

private:
	// Corresponding worker functions for the HIDL methods.
	std::pair<SupplicantStatus, std::string> getNameInternal();
	std::pair<SupplicantStatus, IfaceType> getTypeInternal();
	std::pair<SupplicantStatus, sp<ISupplicantNetwork>>
	addNetworkInternal();
	SupplicantStatus removeNetworkInternal(SupplicantNetworkId id);
	std::pair<SupplicantStatus, sp<ISupplicantNetwork>> getNetworkInternal(
	    SupplicantNetworkId id);
	std::pair<SupplicantStatus, std::vector<SupplicantNetworkId>>
	listNetworksInternal();
	SupplicantStatus registerCallbackInternal(
	    const sp<V1_0::ISupplicantStaIfaceCallback>& callback);
	SupplicantStatus registerCallbackInternal_1_1(
	    const sp<V1_1::ISupplicantStaIfaceCallback>& callback);
	SupplicantStatus reassociateInternal();
	SupplicantStatus reconnectInternal();
	SupplicantStatus disconnectInternal();
	SupplicantStatus setPowerSaveInternal(bool enable);
	SupplicantStatus initiateTdlsDiscoverInternal(
	    const std::array<uint8_t, 6>& mac_address);
	SupplicantStatus initiateTdlsSetupInternal(
	    const std::array<uint8_t, 6>& mac_address);
	SupplicantStatus initiateTdlsTeardownInternal(
	    const std::array<uint8_t, 6>& mac_address);
	SupplicantStatus initiateAnqpQueryInternal(
	    const std::array<uint8_t, 6>& mac_address,
	    const std::vector<ISupplicantStaIface::AnqpInfoId>& info_elements,
	    const std::vector<ISupplicantStaIface::Hs20AnqpSubtypes>&
		sub_types);
	SupplicantStatus initiateHs20IconQueryInternal(
	    const std::array<uint8_t, 6>& mac_address,
	    const std::string& file_name);
	std::pair<SupplicantStatus, std::array<uint8_t, 6>>
	getMacAddressInternal();
	SupplicantStatus startRxFilterInternal();
	SupplicantStatus stopRxFilterInternal();
	SupplicantStatus addRxFilterInternal(
	    ISupplicantStaIface::RxFilterType type);
	SupplicantStatus removeRxFilterInternal(
	    ISupplicantStaIface::RxFilterType type);
	SupplicantStatus setBtCoexistenceModeInternal(
	    ISupplicantStaIface::BtCoexistenceMode mode);
	SupplicantStatus setBtCoexistenceScanModeEnabledInternal(bool enable);
	SupplicantStatus setSuspendModeEnabledInternal(bool enable);
	SupplicantStatus setCountryCodeInternal(
	    const std::array<int8_t, 2>& code);
	SupplicantStatus startWpsRegistrarInternal(
	    const std::array<uint8_t, 6>& bssid, const std::string& pin);
	SupplicantStatus startWpsPbcInternal(
	    const std::array<uint8_t, 6>& bssid);
	SupplicantStatus startWpsPinKeypadInternal(const std::string& pin);
	std::pair<SupplicantStatus, std::string> startWpsPinDisplayInternal(
	    const std::array<uint8_t, 6>& bssid);
	SupplicantStatus cancelWpsInternal();
	SupplicantStatus setWpsDeviceNameInternal(const std::string& name);
	SupplicantStatus setWpsDeviceTypeInternal(
	    const std::array<uint8_t, 8>& type);
	SupplicantStatus setWpsManufacturerInternal(
	    const std::string& manufacturer);
	SupplicantStatus setWpsModelNameInternal(const std::string& model_name);
	SupplicantStatus setWpsModelNumberInternal(
	    const std::string& model_number);
	SupplicantStatus setWpsSerialNumberInternal(
	    const std::string& serial_number);
	SupplicantStatus setWpsConfigMethodsInternal(uint16_t config_methods);
	SupplicantStatus setExternalSimInternal(bool useExternalSim);
	std::pair<SupplicantStatus, uint32_t> addExtRadioWorkInternal(
	    const std::string& name, uint32_t freq_in_mhz,
	    uint32_t timeout_in_sec);
	SupplicantStatus removeExtRadioWorkInternal(uint32_t id);
	SupplicantStatus enableAutoReconnectInternal(bool enable);
	std::pair<SupplicantStatus, uint32_t> getKeyMgmtCapabilitiesInternal();
	std::pair<SupplicantStatus, uint32_t> addDppPeerUriInternal(const std::string& uri);
	SupplicantStatus removeDppUriInternal(uint32_t bootstrap_id);
	SupplicantStatus startDppConfiguratorInitiatorInternal(uint32_t peer_bootstrap_id,
			uint32_t own_bootstrap_id,
		    const std::string& ssid, const std::string& password,
			const std::string& psk, DppNetRole net_role, DppAkm security_akm);
	SupplicantStatus startDppEnrolleeInitiatorInternal(uint32_t peer_bootstrap_id,
			uint32_t own_bootstrap_id);
	SupplicantStatus stopDppInitiatorInternal();


	struct wpa_supplicant* retrieveIfacePtr();

	// Reference to the global wpa_struct. This is assumed to be valid for
	// the lifetime of the process.
	struct wpa_global* wpa_global_;
	// Name of the iface this hidl object controls
	const std::string ifname_;
	bool is_valid_;

	DISALLOW_COPY_AND_ASSIGN(StaIface);
};

}  // namespace implementation
}  // namespace V1_2
}  // namespace supplicant
}  // namespace wifi
}  // namespace hardware
}  // namespace android

#endif  // WPA_SUPPLICANT_HIDL_STA_IFACE_H