binder: Implement Set/Get network params (Part 1)

Implement the following Set/Get methods:
1. SSID
2. BSSID
3. SetScanSSID

BUG: 1252274
Change-Id: Iac4be5892cd5b8c0f963b70efd36727812633907
TEST: Ran 'wpa_supplicant_binder_test'
Signed-off-by: Roshan Pius <rpius@google.com>
diff --git a/wpa_supplicant/binder/network.cpp b/wpa_supplicant/binder/network.cpp
index 5f7d06c..24bed4c 100644
--- a/wpa_supplicant/binder/network.cpp
+++ b/wpa_supplicant/binder/network.cpp
@@ -62,6 +62,32 @@
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
 	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+
+	if (ssid.empty() || ssid.size() > SSID_MAX_LEN) {
+		const std::string error_msg = "Invalid SSID value length: " +
+					      std::to_string(ssid.size()) + ".";
+		return android::binder::Status::fromExceptionCode(
+		    android::binder::Status::EX_ILLEGAL_ARGUMENT,
+		    error_msg.c_str());
+	}
+	// Free any existing ssid string.
+	if (wpa_ssid->ssid) {
+		os_free(wpa_ssid);
+	}
+	// This array needs to be a null terminated!.
+	wpa_ssid->ssid = (uint8_t *)os_malloc(ssid.size() + 1);
+	if (!wpa_ssid->ssid) {
+		return android::binder::Status::fromExceptionCode(
+		    ERROR_GENERIC, "Memory allocation failed.");
+	}
+	os_memcpy(wpa_ssid->ssid, ssid.data(), ssid.size());
+	wpa_ssid->ssid[ssid.size()] = '\0';
+	wpa_ssid->ssid_len = ssid.size();
+	if (wpa_ssid->passphrase) {
+		wpa_config_update_psk(wpa_ssid);
+	}
+	wpa_hexdump_ascii(
+	    MSG_MSGDUMP, "SSID", wpa_ssid->ssid, wpa_ssid->ssid_len);
 	return android::binder::Status::ok();
 }
 
@@ -69,6 +95,24 @@
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
 	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+
+	if (!bssid.empty() && bssid.size() != BSSID_LEN) {
+		const std::string error_msg = "Invalid BSSID value length: " +
+					      std::to_string(bssid.size()) +
+					      ".";
+		return android::binder::Status::fromExceptionCode(
+		    android::binder::Status::EX_ILLEGAL_ARGUMENT,
+		    error_msg.c_str());
+	}
+	// Empty array is used to clear out the BSSID value.
+	if (bssid.empty()) {
+		wpa_ssid->bssid_set = 0;
+		wpa_printf(MSG_MSGDUMP, "BSSID any");
+	} else {
+		os_memcpy(wpa_ssid->bssid, bssid.data(), ETH_ALEN);
+		wpa_ssid->bssid_set = 1;
+		wpa_hexdump(MSG_MSGDUMP, "BSSID", wpa_ssid->bssid, ETH_ALEN);
+	}
 	return android::binder::Status::ok();
 }
 
@@ -76,6 +120,8 @@
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
 	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+
+	wpa_ssid->scan_ssid = enable ? 1 : 0;
 	return android::binder::Status::ok();
 }
 
@@ -147,6 +193,8 @@
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
 	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+
+	ssid->assign(wpa_ssid->ssid, wpa_ssid->ssid + wpa_ssid->ssid_len);
 	return android::binder::Status::ok();
 }
 
@@ -154,6 +202,12 @@
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
 	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+
+	if (wpa_ssid->bssid_set) {
+		bssid->assign(wpa_ssid->bssid, wpa_ssid->bssid + ETH_ALEN);
+	} else {
+		bssid->clear();
+	}
 	return android::binder::Status::ok();
 }
 
@@ -161,6 +215,8 @@
 {
 	struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
 	RETURN_IF_NETWORK_INVALID(wpa_ssid);
+
+	*enable = (wpa_ssid->scan_ssid == 1);
 	return android::binder::Status::ok();
 }
 
@@ -237,13 +293,17 @@
 	if (wpa_ssid->disabled == 2) {
 		return android::binder::Status::fromServiceSpecificError(
 		    ERROR_GENERIC,
-		    "Cannot use Select with persistent P2P group");
+		    "Cannot use Enable with persistent P2P group");
 	}
 
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
-	wpa_s->scan_min_time.sec = 0;
-	wpa_s->scan_min_time.usec = 0;
-	wpa_supplicant_select_network(wpa_s, wpa_ssid);
+	if (no_connect) {
+		wpa_ssid->disabled = 0;
+	} else {
+		wpa_s->scan_min_time.sec = 0;
+		wpa_s->scan_min_time.usec = 0;
+		wpa_supplicant_enable_network(wpa_s, wpa_ssid);
+	}
 	return android::binder::Status::ok();
 }
 
@@ -271,17 +331,13 @@
 	if (wpa_ssid->disabled == 2) {
 		return android::binder::Status::fromServiceSpecificError(
 		    ERROR_GENERIC,
-		    "Cannot use Enable with persistent P2P group");
+		    "Cannot use Select with persistent P2P group");
 	}
 
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
-	if (no_connect) {
-		wpa_ssid->disabled = 0;
-	} else {
-		wpa_s->scan_min_time.sec = 0;
-		wpa_s->scan_min_time.usec = 0;
-		wpa_supplicant_enable_network(wpa_s, wpa_ssid);
-	}
+	wpa_s->scan_min_time.sec = 0;
+	wpa_s->scan_min_time.usec = 0;
+	wpa_supplicant_select_network(wpa_s, wpa_ssid);
 	return android::binder::Status::ok();
 }