diff options
author | Jessica Wagantall <jwagantall@cyngn.com> | 2016-07-07 12:32:54 -0700 |
---|---|---|
committer | Jessica Wagantall <jwagantall@cyngn.com> | 2016-07-07 14:16:05 -0700 |
commit | 8c6a7c500e1a160b3fffaf1ffd5d826659fdffe5 (patch) | |
tree | 1e95cbbabe6f2b5b2e17edf2841c7f921eff39c0 | |
parent | 2e63e65c7a558415f64a1957bd9cc060ab10f64e (diff) | |
parent | 514139f4b40cbb035bb92f3e24d5a389d75db9e6 (diff) | |
download | android_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.h | 17 | ||||
-rw-r--r-- | btif/include/btif_storage.h | 12 | ||||
-rw-r--r-- | btif/src/bluetooth.c | 15 | ||||
-rw-r--r-- | btif/src/btif_config.c | 22 | ||||
-rw-r--r-- | btif/src/btif_hh.c | 9 | ||||
-rw-r--r-- | btif/src/btif_storage.c | 25 | ||||
-rw-r--r-- | test/bluedroidtest/bluedroidtest.c | 2 | ||||
-rw-r--r-- | test/suite/cases/adapter.c | 2 | ||||
-rw-r--r-- | test/suite/main.c | 2 | ||||
-rw-r--r-- | tools/bdtool/bdtool.c | 16 |
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); |