summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJessica Wagantall <jwagantall@cyngn.com>2016-07-07 12:32:54 -0700
committerJessica Wagantall <jwagantall@cyngn.com>2016-07-07 14:16:05 -0700
commit8c6a7c500e1a160b3fffaf1ffd5d826659fdffe5 (patch)
tree1e95cbbabe6f2b5b2e17edf2841c7f921eff39c0
parent2e63e65c7a558415f64a1957bd9cc060ab10f64e (diff)
parent514139f4b40cbb035bb92f3e24d5a389d75db9e6 (diff)
downloadandroid_system_bt-8c6a7c500e1a160b3fffaf1ffd5d826659fdffe5.tar.gz
android_system_bt-8c6a7c500e1a160b3fffaf1ffd5d826659fdffe5.tar.bz2
android_system_bt-8c6a7c500e1a160b3fffaf1ffd5d826659fdffe5.zip
Merge remote-tracking branch 'remotes/android-6.0.1_r52' into HEAD
Ticket: CYNGNOS-3020 Change-Id: I0d26ff4917b8886ca5fcc54b235bdb6afe8d8925
-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_hh.c9
-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
10 files changed, 108 insertions, 14 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_hh.c b/btif/src/btif_hh.c
index 8188942b5..88e767a91 100644
--- a/btif/src/btif_hh.c
+++ b/btif/src/btif_hh.c
@@ -33,6 +33,8 @@
#define LOG_TAG "bt_btif_hh"
+#include <cutils/log.h>
+
#include "bta_api.h"
#include "bta_hh_api.h"
#include "btif_storage.h"
@@ -257,7 +259,12 @@ static void toggle_os_keylockstates(int fd, int changedlockstates)
*******************************************************************************/
static BT_HDR *create_pbuf(UINT16 len, UINT8 *data)
{
- BT_HDR* p_buf = GKI_getbuf((UINT16) (len + BTA_HH_MIN_OFFSET + sizeof(BT_HDR)));
+ UINT16 buflen = (UINT16) (len + BTA_HH_MIN_OFFSET + sizeof(BT_HDR));
+ if (buflen < len) {
+ android_errorWriteWithInfoLog(0x534e4554, "28672558", -1, NULL, 0);
+ return NULL;
+ }
+ BT_HDR* p_buf = GKI_getbuf(buflen);
if (p_buf) {
UINT8* pbuf_data;
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);