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();
}