summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAjay Panicker <apanicke@google.com>2016-06-07 17:32:00 -0700
committerJessica Wagantall <jwagantall@cyngn.com>2016-07-07 09:57:52 -0700
commitef7a945bc1edd2300ebae0ac0d2134782189e402 (patch)
treeb708e76ad4f1786bf21beb4248e1af980a242c9a
parent8abdf11d75b3ca8d792b53e2b5e384520bfaeb3b (diff)
downloadandroid_system_bt-ef7a945bc1edd2300ebae0ac0d2134782189e402.tar.gz
android_system_bt-ef7a945bc1edd2300ebae0ac0d2134782189e402.tar.bz2
android_system_bt-ef7a945bc1edd2300ebae0ac0d2134782189e402.zip
Add guest mode functionality (2/3)
Add a flag to enable() to start Bluetooth in restricted mode. In restricted mode, all devices that are paired during restricted mode are deleted upon leaving restricted mode. Right now restricted mode is only entered while a guest user is active. Bug: 27410683 Ticket: CYNGNOS-3020 Change-Id: I8f23d28ef0aa3a8df13d469c73005c8e1b894d19 (cherry picked from commit 3676e76f8016fc722121503070745ce7bbf93780)
-rw-r--r--btif/include/btif_api.h17
-rw-r--r--btif/include/btif_storage.h12
-rw-r--r--btif/src/bluetooth.c15
-rw-r--r--btif/src/btif_config.c22
-rw-r--r--btif/src/btif_storage.c25
-rw-r--r--test/bluedroidtest/bluedroidtest.c2
-rw-r--r--test/suite/cases/adapter.c2
-rw-r--r--test/suite/main.c2
-rw-r--r--tools/bdtool/bdtool.c16
9 files changed, 100 insertions, 13 deletions
diff --git a/btif/include/btif_api.h b/btif/include/btif_api.h
index bf9ee3f29..fc1b67afe 100644
--- a/btif/include/btif_api.h
+++ b/btif/include/btif_api.h
@@ -87,6 +87,23 @@ bt_status_t btif_shutdown_bluetooth(void);
/*******************************************************************************
**
+** Function is_restricted_mode
+**
+** Description Checks if BT was enabled in restriced mode. In restricted
+** mode, bonds that are created are marked as temporary.
+** These bonds persist until we leave restricted mode, at
+** which point they will be deleted from the config. Also
+** while in restricted mode, the user can access devices
+** that are already paired before entering restricted mode,
+** but they cannot remove any of these devices.
+**
+** Returns bool
+**
+*******************************************************************************/
+bool is_restricted_mode(void);
+
+/*******************************************************************************
+**
** Function btif_get_adapter_properties
**
** Description Fetches all local adapter properties
diff --git a/btif/include/btif_storage.h b/btif/include/btif_storage.h
index e4d465c9f..46e4ced94 100644
--- a/btif/include/btif_storage.h
+++ b/btif/include/btif_storage.h
@@ -325,6 +325,18 @@ BOOLEAN btif_storage_is_fixed_pin_zeros_keyboard(bt_bdaddr_t *remote_bd_addr);
/*******************************************************************************
**
+** Function btif_storage_is_retricted_device
+**
+** Description BTIF storage API - checks if this device is a restricted device
+**
+** Returns TRUE if the device is labled as restricted
+** FALSE otherwise
+**
+*******************************************************************************/
+BOOLEAN btif_storage_is_restricted_device(const bt_bdaddr_t *remote_bd_addr);
+
+/*******************************************************************************
+**
** Function btif_storage_is_wiimote
**
** Description BTIF storage API - checks if this device is a wiimote
diff --git a/btif/src/bluetooth.c b/btif/src/bluetooth.c
index 8c8a6cb39..78c98ebc8 100644
--- a/btif/src/bluetooth.c
+++ b/btif/src/bluetooth.c
@@ -61,6 +61,7 @@
#include "osi/include/osi.h"
#include "stack_manager.h"
#include "btif_config.h"
+#include "btif_storage.h"
#include "l2cdefs.h"
#include "l2c_api.h"
@@ -80,6 +81,7 @@
************************************************************************************/
bt_callbacks_t *bt_hal_cbacks = NULL;
+bool restricted_mode = FALSE;
/** Operating System specific callouts for resource management */
bt_os_callouts_t *bt_os_callouts = NULL;
@@ -165,8 +167,10 @@ static int init(bt_callbacks_t *callbacks) {
return BT_STATUS_SUCCESS;
}
-static int enable(void) {
- LOG_INFO("%s", __func__);
+static int enable(bool start_restricted) {
+ LOG_INFO(LOG_TAG, "%s: start restricted = %d", __func__, start_restricted);
+
+ restricted_mode = start_restricted;
if (!interface_ready())
return BT_STATUS_NOT_READY;
@@ -193,6 +197,10 @@ static void ssrcleanup(void)
return;
}
+bool is_restricted_mode() {
+ return restricted_mode;
+}
+
static int get_adapter_properties(void)
{
/* sanity check */
@@ -303,6 +311,9 @@ static int cancel_bond(const bt_bdaddr_t *bd_addr)
static int remove_bond(const bt_bdaddr_t *bd_addr)
{
+ if (is_restricted_mode() && !btif_storage_is_restricted_device(bd_addr))
+ return BT_STATUS_SUCCESS;
+
/* sanity check */
if (interface_ready() == FALSE)
return BT_STATUS_NOT_READY;
diff --git a/btif/src/btif_config.c b/btif/src/btif_config.c
index 39f4bbcaf..3c05812fb 100644
--- a/btif/src/btif_config.c
+++ b/btif/src/btif_config.c
@@ -28,6 +28,7 @@
#include "osi/include/allocator.h"
#include "btcore/include/bdaddr.h"
#include "btif_common.h"
+#include "btif_api.h"
#include "btif_config.h"
#include "btif_config_transcode.h"
#include "btif_util.h"
@@ -47,6 +48,7 @@ static const period_ms_t CONFIG_SETTLE_PERIOD_MS = 3000;
static void timer_config_save_cb(void *data);
static void btif_config_write(UINT16 event, char *p_param);
static void btif_config_remove_unpaired(config_t *config);
+static void btif_config_remove_restricted(config_t *config);
// TODO(zachoverflow): Move these two functions out, because they are too specific for this file
// {grumpy-cat/no, monty-python/you-make-me-sad}
@@ -113,6 +115,10 @@ static future_t *init(void) {
btif_config_remove_unpaired(config);
+ // Cleanup temporary pairings if we have left guest mode
+ if (!is_restricted_mode())
+ btif_config_remove_restricted(config);
+
// TODO(sharvil): use a non-wake alarm for this once we have
// API support for it. There's no need to wake the system to
// write back to disk.
@@ -427,3 +433,19 @@ static void btif_config_remove_unpaired(config_t *conf) {
snode = config_section_next(snode);
}
}
+
+static void btif_config_remove_restricted(config_t* config) {
+ assert(config != NULL);
+
+ pthread_mutex_lock(&lock);
+ const config_section_node_t *snode = config_section_begin(config);
+ while (snode != config_section_end(config)) {
+ const char *section = config_section_name(snode);
+ if (string_is_bdaddr(section) && config_has_key(config, section, "Restricted")) {
+ BTIF_TRACE_DEBUG("%s: Removing restricted device %s", __func__, section);
+ config_remove_section(config, section);
+ }
+ snode = config_section_next(snode);
+ }
+ pthread_mutex_unlock(&lock);
+}
diff --git a/btif/src/btif_storage.c b/btif/src/btif_storage.c
index 895631194..4dfe27625 100644
--- a/btif/src/btif_storage.c
+++ b/btif/src/btif_storage.c
@@ -833,6 +833,13 @@ bt_status_t btif_storage_add_bonded_device(bt_bdaddr_t *remote_bd_addr,
int ret = btif_config_set_int(bdstr, "LinkKeyType", (int)key_type);
ret &= btif_config_set_int(bdstr, "PinLength", (int)pin_length);
ret &= btif_config_set_bin(bdstr, "LinkKey", link_key, sizeof(LINK_KEY));
+
+ if (is_restricted_mode()) {
+ BTIF_TRACE_WARNING("%s: '%s' pairing will be removed if unrestricted",
+ __func__, bdstr);
+ btif_config_set_int(bdstr, "Restricted", 1);
+ }
+
/* write bonded info immediately */
btif_config_flush();
return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
@@ -1726,6 +1733,24 @@ BOOLEAN btif_storage_is_fixed_pin_zeros_keyboard(bt_bdaddr_t *remote_bd_addr)
}
+/*******************************************************************************
+**
+** Function btif_storage_is_restricted_device
+**
+** Description BTIF storage API - checks if this device is a restricted device
+**
+** Returns TRUE if the device is labeled as restricted
+** FALSE otherwise
+**
+*******************************************************************************/
+BOOLEAN btif_storage_is_restricted_device(const bt_bdaddr_t *remote_bd_addr)
+{
+ bdstr_t bdstr;
+ bdaddr_to_string(remote_bd_addr, bdstr, sizeof(bdstr));
+
+ return btif_config_exist(bdstr, "Restricted");
+}
+
static const char *wii_names[4] = {
"Nintendo RVL-CNT-01", /* 1st gen */
"Nintendo RVL-CNT-01-TR", /* 2nd gen */
diff --git a/test/bluedroidtest/bluedroidtest.c b/test/bluedroidtest/bluedroidtest.c
index 4c70827f3..b19e036ba 100644
--- a/test/bluedroidtest/bluedroidtest.c
+++ b/test/bluedroidtest/bluedroidtest.c
@@ -599,7 +599,7 @@ void bdt_enable(void)
bdt_log("Bluetooth is already enabled");
return;
}
- status = sBtInterface->enable();
+ status = sBtInterface->enable(false);
check_return_status(status);
}
diff --git a/test/suite/cases/adapter.c b/test/suite/cases/adapter.c
index 651e0fcbb..c8e7c0388 100644
--- a/test/suite/cases/adapter.c
+++ b/test/suite/cases/adapter.c
@@ -24,7 +24,7 @@
bool adapter_enable_disable() {
int error;
- CALL_AND_WAIT(error = bt_interface->enable(), adapter_state_changed);
+ CALL_AND_WAIT(error = bt_interface->enable(false), adapter_state_changed);
TASSERT(error == BT_STATUS_SUCCESS, "Error enabling Bluetooth: %d", error);
TASSERT(adapter_get_state() == BT_STATE_ON, "Adapter did not turn on.");
diff --git a/test/suite/main.c b/test/suite/main.c
index 24cb862fd..4f4ad1e84 100644
--- a/test/suite/main.c
+++ b/test/suite/main.c
@@ -228,7 +228,7 @@ int main(int argc, char **argv) {
for (size_t i = 0; i < test_suite_size; ++i) {
if (!test_name || !strcmp(test_name, test_suite[i].function_name)) {
callbacks_init();
- CALL_AND_WAIT(bt_interface->enable(), adapter_state_changed);
+ CALL_AND_WAIT(bt_interface->enable(false), adapter_state_changed);
if (test_suite[i].function()) {
printf("[%4d] %-64s [%sPASS%s]\n", ++case_num, test_suite[i].function_name, GREEN, DEFAULT);
++pass;
diff --git a/tools/bdtool/bdtool.c b/tools/bdtool/bdtool.c
index 07fe321ad..9feafde0f 100644
--- a/tools/bdtool/bdtool.c
+++ b/tools/bdtool/bdtool.c
@@ -99,7 +99,7 @@ int main(int argc, char **argv) {
}
if (discover) {
- CALL_AND_WAIT(bt_interface->enable(), adapter_state_changed);
+ CALL_AND_WAIT(bt_interface->enable(false), adapter_state_changed);
fprintf(stdout, "BT adapter is up\n");
fprintf(stdout, "Starting to start discovery\n");
@@ -114,7 +114,7 @@ int main(int argc, char **argv) {
}
if (discoverable) {
- CALL_AND_WAIT(bt_interface->enable(), adapter_state_changed);
+ CALL_AND_WAIT(bt_interface->enable(false), adapter_state_changed);
fprintf(stdout, "BT adapter is up\n");
bt_property_t *property = property_new_scan_mode(BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE);
@@ -133,7 +133,7 @@ int main(int argc, char **argv) {
exit(1);
}
- CALL_AND_WAIT(bt_interface->enable(), adapter_state_changed);
+ CALL_AND_WAIT(bt_interface->enable(false), adapter_state_changed);
fprintf(stdout, "BT adapter is up\n");
int rc = bt_interface->create_bond(&bt_remote_bdaddr, 0 /* UNKNOWN; Currently not documented :( */);
@@ -143,7 +143,7 @@ int main(int argc, char **argv) {
}
if (up) {
- CALL_AND_WAIT(bt_interface->enable(), adapter_state_changed);
+ CALL_AND_WAIT(bt_interface->enable(false), adapter_state_changed);
fprintf(stdout, "BT adapter is up\n");
fprintf(stdout, "Waiting for %d seconds\n", timeout_in_sec);
@@ -151,7 +151,7 @@ int main(int argc, char **argv) {
}
if (get_name) {
- CALL_AND_WAIT(bt_interface->enable(), adapter_state_changed);
+ CALL_AND_WAIT(bt_interface->enable(false), adapter_state_changed);
fprintf(stdout, "BT adapter is up\n");
int error;
CALL_AND_WAIT(error = bt_interface->get_adapter_property(BT_PROPERTY_BDNAME), adapter_properties);
@@ -168,7 +168,7 @@ int main(int argc, char **argv) {
}
if (set_name) {
- CALL_AND_WAIT(bt_interface->enable(), adapter_state_changed);
+ CALL_AND_WAIT(bt_interface->enable(false), adapter_state_changed);
fprintf(stdout, "BT adapter is up\n");
bt_property_t *property = property_new_name(bd_name);
@@ -189,7 +189,7 @@ int main(int argc, char **argv) {
}
if (sco_listen) {
- CALL_AND_WAIT(bt_interface->enable(), adapter_state_changed);
+ CALL_AND_WAIT(bt_interface->enable(false), adapter_state_changed);
fprintf(stdout, "BT adapter is up\n");
bt_property_t *property = property_new_scan_mode(BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE);
@@ -221,7 +221,7 @@ int main(int argc, char **argv) {
exit(1);
}
- CALL_AND_WAIT(bt_interface->enable(), adapter_state_changed);
+ CALL_AND_WAIT(bt_interface->enable(false), adapter_state_changed);
fprintf(stdout, "BT adapter is up\n");
const btsock_interface_t *sock = bt_interface->get_profile_interface(BT_PROFILE_SOCKETS_ID);