binder: INetwork Set/Get params interface

Add the skeletal interface for setting/getting network params. This CL
only adds the network params for non-enterprise networks.

While there,
Move the validity check for binder object to a macro that can be used
in all the binder methods.

BUG: 30251509
TEST: Will add integration tests once the implementation is complete.

Change-Id: If574320617854c0764d300d05c4143f5b9ed430c
Signed-off-by: Roshan Pius <rpius@google.com>
diff --git a/wpa_supplicant/binder/fi/w1/wpa_supplicant/INetwork.aidl b/wpa_supplicant/binder/fi/w1/wpa_supplicant/INetwork.aidl
index 08e5783..01c765a 100644
--- a/wpa_supplicant/binder/fi/w1/wpa_supplicant/INetwork.aidl
+++ b/wpa_supplicant/binder/fi/w1/wpa_supplicant/INetwork.aidl
@@ -25,6 +25,54 @@
 	const int ERROR_NETWORK_INVALID = 2;
 
 	/**
+	 * Constants used in Set/Get network params.
+	 */
+	/** Max length of SSID param. */
+	const int SSID_MAX_LEN = 32;
+
+	/** Length of BSSID param. */
+	const int BSSID_LEN = 6;
+
+	/** Min length of PSK passphrase param. */
+	const int PSK_PASSPHRASE_MIN_LEN = 8;
+
+	/** Max length of PSK passphrase param. */
+	const int PSK_PASSPHRASE_MAX_LEN = 63;
+
+	/** Max number of WEP keys param. */
+	const int WEP_KEYS_MAX_NUM = 4;
+
+	/** Max length of each WEP keys param. */
+	const int WEP_KEY_MAX_LEN = 16;
+
+	/** Possble mask of values for KeyMgmt param. */
+	const int KEY_MGMT_MASK_NONE = 0x01;
+	const int KEY_MGMT_MASK_WPA_PSK = 0x02;
+	const int KEY_MGMT_MASK_WPA_EAP = 0x04;
+	const int KEY_MGMT_MASK_IEEE8021X = 0xFF;
+
+	/** Possble mask of values for Proto param. */
+	const int PROTO_MASK_WPA = 0x01;
+	const int PROTO_MASK_RSN = 0x02;
+	const int PROTO_MASK_OSEN = 0x04;
+
+	/** Possble mask of values for AuthAlg param. */
+	const int AUTH_ALG_MASK_OPEN = 0x01;
+	const int AUTH_ALG_MASK_SHARED = 0x02;
+	const int AUTH_ALG_MASK_LEAP = 0x04;
+
+	/** Possble mask of values for GroupCipher param. */
+	const int GROUP_CIPHER_MASK_WEP40 = 0x01;
+	const int GROUP_CIPHER_MASK_WEP104 = 0x02;
+	const int GROUP_CIPHER_MASK_TKIP = 0x04;
+	const int GROUP_CIPHER_MASK_CCMP = 0x08;
+
+	/** Possble mask of values for PairwiseCipher param. */
+	const int PAIRWISE_CIPHER_MASK_NONE = 0x01;
+	const int PAIRWISE_CIPHER_MASK_TKIP = 0x02;
+	const int PAIRWISE_CIPHER_MASK_CCMP = 0x04;
+
+	/**
 	 * Retrieves the ID allocated to this network by wpa_supplicant.
 	 *
 	 * This is not the |SSID| of the network, but an internal identifier for
@@ -50,4 +98,125 @@
 	 *        instance.
 	 */
 	void RegisterCallback(in INetworkCallback callback);
+
+	/**
+	 * Setters for the various network params.
+	 * These correspond to elements of |wpa_sssid| struct used internally by
+	 * wpa_supplicant to represent each network.
+	 */
+	/** Set SSID for this network. Max length of |SSID_MAX_LEN|. */
+	void SetSSID(in byte[] ssid);
+
+	/**
+	 * Set the network to only connect to an AP with provided BSSSID.
+	 * Pass array of size 0 to clear this param.
+	 * Length of the value should be |BSSID_LEN|.
+	 */
+	void SetBSSID(in byte[] bssid);
+
+	/** Set whether to send Probe Requests for this network (hidden). */
+	void SetScanSSID(boolean enable);
+
+	/** Combination of |KEY_MGMT_MASK_*| values above. */
+	void SetKeyMgmt(int key_mgmt_mask);
+
+	/** Combination of |PROTO_MASK_*| values above. */
+	void SetProto(int proto_mask);
+
+	/** Combination of |AUTH_ALG_MASK_*| values above. */
+	void SetAuthAlg(int auth_alg_mask);
+
+	/** Combination of |GROUP_CIPHER_MASK_*| values above. */
+	void SetGroupCipher(int group_cipher_mask);
+
+	/** Combination of |PAIRWISE_CIPHER_MASK_*| values above. */
+	void SetPairwiseCipher(int pairwise_cipher_mask);
+
+	/**
+	 * Set passphrase for WPA_PSK network.
+	 * Min length of value is |PSK_PASSPHRASE_MIN_LEN|.
+	 * Max length of value is |PSK_PASSPHRASE_MAX_LEN|.
+	 */
+	void SetPskPassphrase(String psk);
+
+	/**
+	 * Set WEP key for WEP network.
+	 * Max length of each key is |WEP_KEY_MAX_LEN|.
+	 *
+	 * @param key_idx Index of wep key to be set.
+	 *                Max of |WEP_KEYS_MAX_NUM| keys.
+	 */
+	void SetWepKey(int key_idx, in byte[] wep_key);
+
+	/** Set default Tx key index for WEP network. */
+	void SetWepTxKeyIdx(int wep_tx_key_idx);
+
+	/** Set whether RequirePMF is enabled for this network. */
+	void SetRequirePMF(boolean enable);
+
+	/**
+	 * Getters for the various network params.
+	 */
+	/** Get SSID for this network. */
+	byte[] GetSSID();
+
+	/** Get the BSSID set for this network. */
+	byte[] GetBSSID();
+
+	/** Get whether Probe Requests are being sent for this network (hidden). */
+	boolean GetScanSSID();
+
+	/** Combination of |KEY_MGMT_MASK_*| values above. */
+	int GetKeyMgmt();
+
+	/** Combination of |PROTO_MASK_*| values above. */
+	int GetProto();
+
+	/** Combination of |AUTH_ALG_MASK_*| values above. */
+	int GetAuthAlg();
+
+	/** Combination of |GROUP_CIPHER_MASK_*| values above. */
+	int GetGroupCipher();
+
+	/** Combination of |PAIRWISE_CIPHER_MASK_*| values above. */
+	int GetPairwiseCipher();
+
+	/** Get passphrase for WPA_PSK network. */
+	String GetPskPassphrase();
+
+	/**
+	 * Get WEP key for WEP network.
+	 *
+	 * @param key_idx Index of wep key to be fetched.
+	 *                Max of |WEP_KEYS_MAX_NUM| keys.
+	 */
+	byte[] GetWepKey(int key_idx);
+
+	/** Get default Tx key index for WEP network. */
+	int GetWepTxKeyIdx();
+
+	/** Get whether RequirePMF is enabled for this network. */
+	boolean GetRequirePMF();
+
+	/**
+	 * Enable the network for connection purposes.
+	 *
+	 * This may trigger a connection to the network.
+	 *
+	 * @param no_connect Only enable the network, dont trigger a connect.
+	 */
+	void Enable(boolean no_connect);
+
+	/**
+	 * Disable the network for connection purposes.
+	 *
+	 * This may trigger a disconnection from the network, if currently
+	 * connected to this network.
+	 */
+	void Disable();
+
+	/**
+	 * Initiate connection to this network.
+	 */
+	void Select();
 }
diff --git a/wpa_supplicant/binder/iface.cpp b/wpa_supplicant/binder/iface.cpp
index d5a6502..280e191 100644
--- a/wpa_supplicant/binder/iface.cpp
+++ b/wpa_supplicant/binder/iface.cpp
@@ -12,6 +12,17 @@
 
 namespace wpa_supplicant_binder {
 
+#define RETURN_IF_IFACE_INVALID(wpa_s)                                         \
+	{                                                                      \
+		if (!wpa_s) {                                                  \
+			return android::binder::Status::                       \
+			    fromServiceSpecificError(                          \
+				ERROR_IFACE_INVALID, "wpa_supplicant does "    \
+						     "not control this "       \
+						     "interface.");            \
+		}                                                              \
+	} // #define RETURN_IF_IFACE_INVALID(wpa_s)
+
 Iface::Iface(struct wpa_global *wpa_global, const char ifname[])
     : wpa_global_(wpa_global), ifname_(ifname)
 {
@@ -21,13 +32,7 @@
 {
 	// We could directly return the name we hold, but let's verify
 	// if the underlying iface still exists.
-	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
-	if (!wpa_s) {
-		return android::binder::Status::fromServiceSpecificError(
-		    ERROR_IFACE_INVALID,
-		    "wpa_supplicant does not control this interface.");
-	}
-
+	RETURN_IF_IFACE_INVALID(retrieveIfacePtr());
 	*iface_name_out = ifname_;
 	return android::binder::Status::ok();
 }
@@ -36,11 +41,7 @@
     android::sp<fi::w1::wpa_supplicant::INetwork> *network_object_out)
 {
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
-	if (!wpa_s) {
-		return android::binder::Status::fromServiceSpecificError(
-		    ERROR_IFACE_INVALID,
-		    "wpa_supplicant does not control this interface.");
-	}
+	RETURN_IF_IFACE_INVALID(wpa_s);
 
 	struct wpa_ssid *ssid = wpa_supplicant_add_network(wpa_s);
 	if (!ssid) {
@@ -62,11 +63,7 @@
 android::binder::Status Iface::RemoveNetwork(int network_id)
 {
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
-	if (!wpa_s) {
-		return android::binder::Status::fromServiceSpecificError(
-		    ERROR_IFACE_INVALID,
-		    "wpa_supplicant does not control this interface.");
-	}
+	RETURN_IF_IFACE_INVALID(wpa_s);
 
 	int result = wpa_supplicant_remove_network(wpa_s, network_id);
 	if (result == -1) {
@@ -88,11 +85,7 @@
     android::sp<fi::w1::wpa_supplicant::INetwork> *network_object_out)
 {
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
-	if (!wpa_s) {
-		return android::binder::Status::fromServiceSpecificError(
-		    ERROR_IFACE_INVALID,
-		    "wpa_supplicant does not control this interface.");
-	}
+	RETURN_IF_IFACE_INVALID(wpa_s);
 
 	struct wpa_ssid *ssid = wpa_config_get_network(wpa_s->conf, network_id);
 	if (!ssid) {
@@ -116,11 +109,8 @@
     const android::sp<fi::w1::wpa_supplicant::IIfaceCallback> &callback)
 {
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
-	if (!wpa_s) {
-		return android::binder::Status::fromServiceSpecificError(
-		    ERROR_IFACE_INVALID,
-		    "wpa_supplicant does not control this interface.");
-	}
+	RETURN_IF_IFACE_INVALID(wpa_s);
+
 	BinderManager *binder_manager = BinderManager::getInstance();
 	if (!binder_manager ||
 	    binder_manager->addIfaceCallbackBinderObject(ifname_, callback)) {
diff --git a/wpa_supplicant/binder/network.cpp b/wpa_supplicant/binder/network.cpp
index 000204d..6e14328 100644
--- a/wpa_supplicant/binder/network.cpp
+++ b/wpa_supplicant/binder/network.cpp
@@ -12,6 +12,17 @@
 
 namespace wpa_supplicant_binder {
 
+#define RETURN_IF_NETWORK_INVALID(wpa_ssid)                                    \
+	{                                                                      \
+		if (!wpa_ssid) {                                               \
+			return android::binder::Status::                       \
+			    fromServiceSpecificError(                          \
+				ERROR_NETWORK_INVALID, "wpa_supplicant does "  \
+						       "not control this "     \
+						       "network.");            \
+		}                                                              \
+	} // #define RETURN_IF_NETWORK_INVALID(wpa_ssid)
+
 Network::Network(
     struct wpa_global *wpa_global, const char ifname[], int network_id)
     : wpa_global_(wpa_global), ifname_(ifname), network_id_(network_id)
@@ -20,26 +31,14 @@
 
 android::binder::Status Network::GetId(int *network_id_out)
 {
-	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	if (!wpa_ssid) {
-		return android::binder::Status::fromServiceSpecificError(
-		    ERROR_NETWORK_INVALID,
-		    "wpa_supplicant does not control this network.");
-	}
-
+	RETURN_IF_NETWORK_INVALID(retrieveNetworkPtr());
 	*network_id_out = network_id_;
 	return android::binder::Status::ok();
 }
 
 android::binder::Status Network::GetInterfaceName(std::string *ifname_out)
 {
-	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	if (!wpa_ssid) {
-		return android::binder::Status::fromServiceSpecificError(
-		    ERROR_NETWORK_INVALID,
-		    "wpa_supplicant does not control this network.");
-	}
-
+	RETURN_IF_NETWORK_INVALID(retrieveNetworkPtr());
 	*ifname_out = ifname_;
 	return android::binder::Status::ok();
 }
@@ -47,12 +46,7 @@
 android::binder::Status Network::RegisterCallback(
     const android::sp<fi::w1::wpa_supplicant::INetworkCallback> &callback)
 {
-	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
-	if (!wpa_ssid) {
-		return android::binder::Status::fromServiceSpecificError(
-		    ERROR_NETWORK_INVALID,
-		    "wpa_supplicant does not control this network.");
-	}
+	RETURN_IF_NETWORK_INVALID(retrieveNetworkPtr());
 	BinderManager *binder_manager = BinderManager::getInstance();
 	if (!binder_manager ||
 	    binder_manager->addNetworkCallbackBinderObject(
@@ -64,6 +58,198 @@
 	return android::binder::Status::ok();
 }
 
+android::binder::Status Network::SetSSID(const std::vector<uint8_t> &ssid)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::SetBSSID(const std::vector<uint8_t> &bssid)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::SetScanSSID(bool enable)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::SetKeyMgmt(int32_t key_mgmt_mask)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::SetProto(int32_t proto_mask)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::SetAuthAlg(int32_t auth_alg_mask)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::SetGroupCipher(int32_t group_cipher_mask)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::SetPairwiseCipher(int32_t pairwise_cipher_mask)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::SetPskPassphrase(const std::string &psk)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status
+Network::SetWepKey(int key_idx, const std::vector<uint8_t> &wep_key)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::SetWepTxKeyIdx(int32_t wep_tx_key_idx)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::SetRequirePMF(bool enable)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::GetSSID(std::vector<uint8_t> *ssid)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::GetBSSID(std::vector<uint8_t> *bssid)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::GetScanSSID(bool *enable)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::GetKeyMgmt(int32_t *key_mgmt_mask)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::GetProto(int32_t *proto_mask)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::GetAuthAlg(int32_t *auth_alg_mask)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::GetGroupCipher(int32_t *group_cipher_mask)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status
+Network::GetPairwiseCipher(int32_t *pairwise_cipher_mask)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::GetPskPassphrase(std::string *psk)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status
+Network::GetWepKey(int key_idx, std::vector<uint8_t> *wep_key)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::GetWepTxKeyIdx(int32_t *wep_tx_key_idx)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::GetRequirePMF(bool *enable)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::Enable(bool no_connect)
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::Disable()
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
+android::binder::Status Network::Select()
+{
+	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
+	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+	return android::binder::Status::ok();
+}
+
 /**
  * Retrieve the underlying |wpa_ssid| struct pointer for
  * this network.
diff --git a/wpa_supplicant/binder/network.h b/wpa_supplicant/binder/network.h
index ae47639..8a28aae 100644
--- a/wpa_supplicant/binder/network.h
+++ b/wpa_supplicant/binder/network.h
@@ -42,6 +42,43 @@
 	android::binder::Status RegisterCallback(
 	    const android::sp<fi::w1::wpa_supplicant::INetworkCallback>
 		&callback) override;
+	android::binder::Status
+	SetSSID(const std::vector<uint8_t> &ssid) override;
+	android::binder::Status
+	SetBSSID(const std::vector<uint8_t> &bssid) override;
+	android::binder::Status SetScanSSID(bool enable) override;
+	android::binder::Status SetKeyMgmt(int32_t key_mgmt_mask) override;
+	android::binder::Status SetProto(int32_t proto_mask) override;
+	android::binder::Status SetAuthAlg(int32_t auth_alg_mask) override;
+	android::binder::Status
+	SetGroupCipher(int32_t group_cipher_mask) override;
+	android::binder::Status
+	SetPairwiseCipher(int32_t pairwise_cipher_mask) override;
+	android::binder::Status
+	SetPskPassphrase(const std::string &psk) override;
+	android::binder::Status
+	SetWepKey(int key_idx, const std::vector<uint8_t> &wep_key) override;
+	android::binder::Status SetWepTxKeyIdx(int32_t wep_tx_key_idx) override;
+	android::binder::Status SetRequirePMF(bool enable) override;
+	android::binder::Status GetSSID(std::vector<uint8_t> *ssid) override;
+	android::binder::Status GetBSSID(std::vector<uint8_t> *bssid) override;
+	android::binder::Status GetScanSSID(bool *enable) override;
+	android::binder::Status GetKeyMgmt(int32_t *key_mgmt_mask) override;
+	android::binder::Status GetProto(int32_t *proto_mask) override;
+	android::binder::Status GetAuthAlg(int32_t *auth_alg_mask) override;
+	android::binder::Status
+	GetGroupCipher(int32_t *group_cipher_mask) override;
+	android::binder::Status
+	GetPairwiseCipher(int32_t *pairwise_cipher_mask) override;
+	android::binder::Status GetPskPassphrase(std::string *psk) override;
+	android::binder::Status
+	GetWepKey(int key_idx, std::vector<uint8_t> *wep_key) override;
+	android::binder::Status
+	GetWepTxKeyIdx(int32_t *wep_tx_key_idx) override;
+	android::binder::Status GetRequirePMF(bool *enable) override;
+	android::binder::Status Enable(bool no_connect) override;
+	android::binder::Status Disable() override;
+	android::binder::Status Select() override;
 
 private:
 	struct wpa_ssid *retrieveNetworkPtr();