/*
 * WPA Supplicant - Sta Iface Aidl interface
 * Copyright (c) 2021, Google Inc. All rights reserved.
 *
 * This software may be distributed under the terms of the BSD license.
 * See README for more details.
 */

#ifndef WPA_SUPPLICANT_AIDL_STA_IFACE_H
#define WPA_SUPPLICANT_AIDL_STA_IFACE_H

#include <array>
#include <vector>

#include <android-base/macros.h>

#include <aidl/android/hardware/wifi/supplicant/AnqpInfoId.h>
#include <aidl/android/hardware/wifi/supplicant/BnSupplicantStaIface.h>
#include <aidl/android/hardware/wifi/supplicant/BtCoexistenceMode.h>
#include <aidl/android/hardware/wifi/supplicant/Hs20AnqpSubtypes.h>
#include <aidl/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.h>
#include <aidl/android/hardware/wifi/supplicant/ISupplicantStaNetwork.h>
#include <aidl/android/hardware/wifi/supplicant/MloLinksInfo.h>
#include <aidl/android/hardware/wifi/supplicant/QosPolicyStatus.h>
#include <aidl/android/hardware/wifi/supplicant/RxFilterType.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 aidl {
namespace android {
namespace hardware {
namespace wifi {
namespace supplicant {

/**
 * Implementation of StaIface aidl object. Each unique aidl
 * object is used for control operations on a specific interface
 * controlled by wpa_supplicant.
 */
class StaIface : public BnSupplicantStaIface
{
public:
	StaIface(struct wpa_global* wpa_global, const char ifname[]);
	~StaIface() override = default;
	// AIDL does not provide a built-in mechanism to let the server
	// invalidate a AIDL 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 AIDL method implementations should check if the object is still
	// marked valid before processing them.
	void invalidate();
	bool isValid();

	// Aidl methods exposed.
  	::ndk::ScopedAStatus getName(std::string* _aidl_return) override;
	::ndk::ScopedAStatus getType(IfaceType* _aidl_return) override;
	::ndk::ScopedAStatus addNetwork(
		std::shared_ptr<ISupplicantStaNetwork>* _aidl_return) override;
	::ndk::ScopedAStatus removeNetwork(int32_t in_id) override;
	::ndk::ScopedAStatus filsHlpFlushRequest() override;
	::ndk::ScopedAStatus filsHlpAddRequest(
		const std::vector<uint8_t>& in_dst_mac,
		const std::vector<uint8_t>& in_pkt) override;
	::ndk::ScopedAStatus getNetwork(
		int32_t in_id, std::shared_ptr<ISupplicantStaNetwork>* _aidl_return) override;
	::ndk::ScopedAStatus listNetworks(std::vector<int32_t>* _aidl_return) override;
	::ndk::ScopedAStatus registerCallback(
		const std::shared_ptr<ISupplicantStaIfaceCallback>& in_callback) override;
	::ndk::ScopedAStatus reassociate() override;
	::ndk::ScopedAStatus reconnect() override;
	::ndk::ScopedAStatus disconnect() override;
	::ndk::ScopedAStatus setPowerSave(bool in_enable) override;
	::ndk::ScopedAStatus initiateTdlsDiscover(
		const std::vector<uint8_t>& in_macAddress) override;
	::ndk::ScopedAStatus initiateTdlsSetup(
		const std::vector<uint8_t>& in_macAddress) override;
	::ndk::ScopedAStatus initiateTdlsTeardown(
		const std::vector<uint8_t>& in_macAddress) override;
	::ndk::ScopedAStatus initiateAnqpQuery(
		const std::vector<uint8_t>& in_macAddress,
		const std::vector<AnqpInfoId>& in_infoElements,
		const std::vector<Hs20AnqpSubtypes>& in_subTypes) override;
	::ndk::ScopedAStatus initiateVenueUrlAnqpQuery(
		const std::vector<uint8_t>& in_macAddress) override;
	::ndk::ScopedAStatus initiateHs20IconQuery(
		const std::vector<uint8_t>& in_macAddress, const std::string& in_fileName) override;
	::ndk::ScopedAStatus getMacAddress(std::vector<uint8_t>* _aidl_return) override;
	::ndk::ScopedAStatus startRxFilter() override;
	::ndk::ScopedAStatus stopRxFilter() override;
	::ndk::ScopedAStatus addRxFilter(RxFilterType in_type) override;
	::ndk::ScopedAStatus removeRxFilter(RxFilterType in_type) override;
	::ndk::ScopedAStatus setBtCoexistenceMode(BtCoexistenceMode in_mode) override;
	::ndk::ScopedAStatus setBtCoexistenceScanModeEnabled(bool in_enable) override;
	::ndk::ScopedAStatus setSuspendModeEnabled(bool in_enable) override;
	::ndk::ScopedAStatus setCountryCode(const std::vector<uint8_t>& in_code) override;
	::ndk::ScopedAStatus startWpsRegistrar(
		const std::vector<uint8_t>& in_bssid, const std::string& in_pin) override;
	::ndk::ScopedAStatus startWpsPbc(const std::vector<uint8_t>& in_bssid) override;
	::ndk::ScopedAStatus startWpsPinDisplay(
		const std::vector<uint8_t>& in_bssid, std::string* _aidl_return) override;
	::ndk::ScopedAStatus startWpsPinKeypad(const std::string& in_pin) override;
	::ndk::ScopedAStatus cancelWps() override;
	::ndk::ScopedAStatus setWpsDeviceName(const std::string& in_name) override;
	::ndk::ScopedAStatus setWpsDeviceType(const std::vector<uint8_t>& in_type) override;
	::ndk::ScopedAStatus setWpsManufacturer(const std::string& in_manufacturer) override;
	::ndk::ScopedAStatus setWpsModelName(const std::string& in_modelName) override;
	::ndk::ScopedAStatus setWpsModelNumber(const std::string& in_modelNumber) override;
	::ndk::ScopedAStatus setWpsSerialNumber(const std::string& in_serialNumber) override;
	::ndk::ScopedAStatus setWpsConfigMethods(WpsConfigMethods in_configMethods) override;
	::ndk::ScopedAStatus setExternalSim(bool in_useExternalSim) override;
	::ndk::ScopedAStatus addExtRadioWork(
		const std::string& in_name, int32_t in_freqInMhz,
		int32_t in_timeoutInSec, int32_t* _aidl_return) override;
	::ndk::ScopedAStatus removeExtRadioWork(int32_t in_id) override;
	::ndk::ScopedAStatus enableAutoReconnect(bool in_enable) override;
	::ndk::ScopedAStatus getKeyMgmtCapabilities(KeyMgmtMask* _aidl_return) override;
	::ndk::ScopedAStatus addDppPeerUri(
		const std::string& in_uri, int32_t* _aidl_return) override;
	::ndk::ScopedAStatus removeDppUri(int32_t in_id) override;
	::ndk::ScopedAStatus startDppConfiguratorInitiator(
		int32_t in_peerBootstrapId, int32_t in_ownBootstrapId,
		const std::string& in_ssid, const std::string& in_password,
		const std::string& in_psk, DppNetRole in_netRole, DppAkm in_securityAkm,
		const std::vector<uint8_t>& in_privEcKey,
		std::vector<uint8_t>* _aidl_return) override;
	::ndk::ScopedAStatus startDppEnrolleeInitiator(
		int32_t in_peerBootstrapId, int32_t in_ownBootstrapId) override;
	::ndk::ScopedAStatus stopDppInitiator() override;
	::ndk::ScopedAStatus getConnectionCapabilities(ConnectionCapabilities* _aidl_return) override;
	::ndk::ScopedAStatus getWpaDriverCapabilities(WpaDriverCapabilitiesMask* _aidl_return) override;
	::ndk::ScopedAStatus setMboCellularDataStatus(bool in_available) override;
	::ndk::ScopedAStatus generateDppBootstrapInfoForResponder(
		const std::vector<uint8_t>& in_macAddress,
		const std::string& in_deviceInfo, DppCurve in_curve,
		DppResponderBootstrapInfo* _aidl_return) override;
	::ndk::ScopedAStatus startDppEnrolleeResponder(int32_t in_listenChannel) override;
	::ndk::ScopedAStatus stopDppResponder(int32_t in_ownBootstrapId) override;
	::ndk::ScopedAStatus generateSelfDppConfiguration(
		const std::string& in_ssid, const std::vector<uint8_t>& in_privEcKey) override;
	::ndk::ScopedAStatus setQosPolicyFeatureEnabled(bool in_enable) override;
	::ndk::ScopedAStatus sendQosPolicyResponse(
		int32_t in_qosPolicyRequestId, bool in_morePolicies,
		const std::vector<QosPolicyStatus>& in_qosPolicyStatusList) override;
	::ndk::ScopedAStatus removeAllQosPolicies() override;
	::ndk::ScopedAStatus getConnectionMloLinksInfo(MloLinksInfo* _aidl_return) override;
	::ndk::ScopedAStatus getSignalPollResults(
		std::vector<SignalPollResult>* results) override;
	::ndk::ScopedAStatus addQosPolicyRequestForScs(
		const std::vector<QosPolicyScsData>& in_qosPolicyData,
		std::vector<QosPolicyScsRequestStatus>* _aidl_return) override;
	::ndk::ScopedAStatus removeQosPolicyForScs(
		const std::vector<uint8_t>& in_scsPolicyIds,
		std::vector<QosPolicyScsRequestStatus>* _aidl_return) override;
	::ndk::ScopedAStatus configureMscs(const MscsParams& in_params) override;
	::ndk::ScopedAStatus disableMscs() override;

private:
	// Corresponding worker functions for the AIDL methods.
	std::pair<std::string, ndk::ScopedAStatus> getNameInternal();
	std::pair<IfaceType, ndk::ScopedAStatus> getTypeInternal();
	std::pair<std::shared_ptr<ISupplicantStaNetwork>, ndk::ScopedAStatus>
		addNetworkInternal();
	ndk::ScopedAStatus filsHlpFlushRequestInternal();
	ndk::ScopedAStatus filsHlpAddRequestInternal(
		const std::vector<uint8_t>& dst_mac,
		const std::vector<uint8_t>& pkt);
	ndk::ScopedAStatus removeNetworkInternal(int32_t id);
	std::pair<std::shared_ptr<ISupplicantStaNetwork>, ndk::ScopedAStatus>
		getNetworkInternal(int32_t id);
	std::pair<std::vector<int32_t>, ndk::ScopedAStatus>
		listNetworksInternal();
	ndk::ScopedAStatus registerCallbackInternal(
		const std::shared_ptr<ISupplicantStaIfaceCallback>& callback);
	ndk::ScopedAStatus reassociateInternal();
	ndk::ScopedAStatus reconnectInternal();
	ndk::ScopedAStatus disconnectInternal();
	ndk::ScopedAStatus setPowerSaveInternal(bool enable);
	ndk::ScopedAStatus initiateTdlsDiscoverInternal(
		const std::vector<uint8_t>& mac_address);
	ndk::ScopedAStatus initiateTdlsSetupInternal(
		const std::vector<uint8_t>& mac_address);
	ndk::ScopedAStatus initiateTdlsTeardownInternal(
		const std::vector<uint8_t>& mac_address);
	ndk::ScopedAStatus initiateAnqpQueryInternal(
		const std::vector<uint8_t>& mac_address,
		const std::vector<AnqpInfoId>& info_elements,
		const std::vector<Hs20AnqpSubtypes>&
		sub_types);
	ndk::ScopedAStatus initiateVenueUrlAnqpQueryInternal(
		const std::vector<uint8_t>& mac_address);
	ndk::ScopedAStatus initiateHs20IconQueryInternal(
		const std::vector<uint8_t>& mac_address,
		const std::string& file_name);
	std::pair<std::vector<uint8_t>, ndk::ScopedAStatus>
		getMacAddressInternal();
	ndk::ScopedAStatus startRxFilterInternal();
	ndk::ScopedAStatus stopRxFilterInternal();
	ndk::ScopedAStatus addRxFilterInternal(
		RxFilterType type);
	ndk::ScopedAStatus removeRxFilterInternal(
		RxFilterType type);
	ndk::ScopedAStatus setBtCoexistenceModeInternal(
		BtCoexistenceMode mode);
	ndk::ScopedAStatus setBtCoexistenceScanModeEnabledInternal(bool enable);
	ndk::ScopedAStatus setSuspendModeEnabledInternal(bool enable);
	ndk::ScopedAStatus setCountryCodeInternal(
		const std::vector<uint8_t>& code);
	ndk::ScopedAStatus startWpsRegistrarInternal(
		const std::vector<uint8_t>& bssid, const std::string& pin);
	ndk::ScopedAStatus startWpsPbcInternal(
		const std::vector<uint8_t>& bssid);
	ndk::ScopedAStatus startWpsPinKeypadInternal(const std::string& pin);
	std::pair<std::string, ndk::ScopedAStatus> startWpsPinDisplayInternal(
		const std::vector<uint8_t>& bssid);
	ndk::ScopedAStatus cancelWpsInternal();
	ndk::ScopedAStatus setWpsDeviceNameInternal(const std::string& name);
	ndk::ScopedAStatus setWpsDeviceTypeInternal(
		const std::vector<uint8_t>& type);
	ndk::ScopedAStatus setWpsManufacturerInternal(
		const std::string& manufacturer);
	ndk::ScopedAStatus setWpsModelNameInternal(const std::string& model_name);
	ndk::ScopedAStatus setWpsModelNumberInternal(
		const std::string& model_number);
	ndk::ScopedAStatus setWpsSerialNumberInternal(
		const std::string& serial_number);
	ndk::ScopedAStatus setWpsConfigMethodsInternal(WpsConfigMethods config_methods);
	ndk::ScopedAStatus setExternalSimInternal(bool useExternalSim);
	std::pair<uint32_t, ndk::ScopedAStatus> addExtRadioWorkInternal(
		const std::string& name, uint32_t freq_in_mhz,
		uint32_t timeout_in_sec);
	ndk::ScopedAStatus removeExtRadioWorkInternal(uint32_t id);
	ndk::ScopedAStatus enableAutoReconnectInternal(bool enable);
	std::pair<KeyMgmtMask, ndk::ScopedAStatus> getKeyMgmtCapabilitiesInternal();
	std::pair<uint32_t, ndk::ScopedAStatus> addDppPeerUriInternal(const std::string& uri);
	ndk::ScopedAStatus removeDppUriInternal(uint32_t bootstrap_id);
	std::pair<std::vector<uint8_t>, ndk::ScopedAStatus> 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, const std::vector<uint8_t> &privEcKey);
	ndk::ScopedAStatus startDppEnrolleeInitiatorInternal(uint32_t peer_bootstrap_id,
			uint32_t own_bootstrap_id);
	ndk::ScopedAStatus stopDppInitiatorInternal();
	std::pair<ConnectionCapabilities, ndk::ScopedAStatus> getConnectionCapabilitiesInternal();
	std::pair<WpaDriverCapabilitiesMask, ndk::ScopedAStatus> getWpaDriverCapabilitiesInternal();
	ndk::ScopedAStatus setMboCellularDataStatusInternal(bool available);
	std::pair<DppResponderBootstrapInfo, ndk::ScopedAStatus>
			generateDppBootstrapInfoForResponderInternal(
			const std::vector<uint8_t>& mac_address, const std::string& device_info,
			DppCurve curve);
	ndk::ScopedAStatus startDppEnrolleeResponderInternal(uint32_t listen_channel);
	ndk::ScopedAStatus stopDppResponderInternal(uint32_t own_bootstrap_id);
	ndk::ScopedAStatus generateSelfDppConfigurationInternal(
		const std::string& ssid, const std::vector<uint8_t> &privEcKey);
	ndk::ScopedAStatus setQosPolicyFeatureEnabledInternal(bool enable);
	ndk::ScopedAStatus sendQosPolicyResponseInternal(
		int32_t qos_policy_request_id, bool more_policies,
		const std::vector<QosPolicyStatus>& qos_policy_status_list);
	ndk::ScopedAStatus removeAllQosPoliciesInternal();
	std::pair<MloLinksInfo, ndk::ScopedAStatus> getConnectionMloLinksInfoInternal();
	std::pair<std::vector<SignalPollResult>, ndk::ScopedAStatus>
		getSignalPollResultsInternal();
	std::pair<std::vector<QosPolicyScsRequestStatus>, ndk::ScopedAStatus>
		addQosPolicyRequestForScsInternal(
		const std::vector<QosPolicyScsData>& qosPolicyData);
	std::pair<std::vector<QosPolicyScsRequestStatus>, ndk::ScopedAStatus>
		removeQosPolicyForScsInternal(
		const std::vector<uint8_t>& scsPolicyIds);
	::ndk::ScopedAStatus configureMscsInternal(const MscsParams& params);
	::ndk::ScopedAStatus disableMscsInternal();

	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 aidl object controls
	const std::string ifname_;
	bool is_valid_;

	DISALLOW_COPY_AND_ASSIGN(StaIface);
};

}  // namespace supplicant
}  // namespace wifi
}  // namespace hardware
}  // namespace android
}  // namespace aidl

#endif  // WPA_SUPPLICANT_AIDL_STA_IFACE_H
