From c1553d3cab1a17cad8713ee61e1833903c0a6d89 Mon Sep 17 00:00:00 2001 From: Ajay Panicker <apanicke@google.com> Date: Mon, 3 Aug 2015 16:29:31 -0700 Subject: [PATCH] Load factory Bluetooth address from system property Implemented a check to grab the ro.boot.btmacaddr property in case the device fails to receive an address beforehand. Bug: 22618015 Change-Id: Ie322888e114a732f8e85c81793e3e5e5eacffc7a --- btif/include/btif_common.h | 10 +++++++++ btif/src/btif_core.c | 42 +++++++++++++++++++++++--------------- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/btif/include/btif_common.h b/btif/include/btif_common.h index 2c4276d9..7e8c5064 100644 --- a/btif/include/btif_common.h +++ b/btif/include/btif_common.h @@ -145,6 +145,16 @@ enum #define PERSIST_BDADDR_PROPERTY "persist.service.bdroid.bdaddr" #endif +/** + * FACTORY_BT_BDADDR_PROPERTY + * If there is no valid bdaddr available from PROPERTY_BT_BDADDR_PATH + * and there is no available persistent bdaddr available from + * PERSIST_BDADDR_PROPERTY use a factory set address + */ +#ifndef FACTORY_BT_ADDR_PROPERTY +#define FACTORY_BT_ADDR_PROPERTY "ro.boot.btmacaddr" +#endif + #define FACTORY_BT_BDADDR_STORAGE_LEN 17 diff --git a/btif/src/btif_core.c b/btif/src/btif_core.c index d552e5ca..0ff9651f 100644 --- a/btif/src/btif_core.c +++ b/btif/src/btif_core.c @@ -123,6 +123,7 @@ static const char *BT_JNI_WORKQUEUE_NAME = "bt_jni_workqueue"; ************************************************************************************/ static void btif_jni_associate(UNUSED_ATTR uint16_t event, UNUSED_ATTR char *p_param); static void btif_jni_disassociate(UNUSED_ATTR uint16_t event, UNUSED_ATTR char *p_param); +static bool btif_fetch_property(const char *key, bt_bdaddr_t *addr); /* sends message to btif task */ static void btif_sendmsg(void *p_msg); @@ -316,9 +317,22 @@ void btif_thread_post(thread_fn func, void *context) { thread_post(bt_jni_workqueue_thread, func, context); } +static bool btif_fetch_property(const char *key, bt_bdaddr_t *addr) { + char val[PROPERTY_VALUE_MAX] = {0}; + + if (property_get(key, val, NULL)) { + if (string_to_bdaddr(val, addr)) { + BTIF_TRACE_DEBUG("%s: Got BDA %s", __func__, val); + return TRUE; + } + BTIF_TRACE_DEBUG("%s: System Property did not contain valid bdaddr", __func__); + } + return FALSE; +} + static void btif_fetch_local_bdaddr(bt_bdaddr_t *local_addr) { - char val[256]; + char val[PROPERTY_VALUE_MAX] = {0}; uint8_t valid_bda = FALSE; int val_size = 0; const uint8_t null_bdaddr[BD_ADDR_LEN] = {0,0,0,0,0,0}; @@ -328,22 +342,19 @@ static void btif_fetch_local_bdaddr(bt_bdaddr_t *local_addr) { int addr_fd; - BTIF_TRACE_DEBUG("local bdaddr is stored in %s", val); + BTIF_TRACE_DEBUG("%s, local bdaddr is stored in %s", __func__, val); if ((addr_fd = open(val, O_RDONLY)) != -1) { memset(val, 0, sizeof(val)); read(addr_fd, val, FACTORY_BT_BDADDR_STORAGE_LEN); - string_to_bdaddr(val, local_addr); /* If this is not a reserved/special bda, then use it */ - if (memcmp(local_addr->address, null_bdaddr, BD_ADDR_LEN) != 0) + if ((string_to_bdaddr(val, local_addr)) && + (memcmp(local_addr->address, null_bdaddr, BD_ADDR_LEN) != 0)) { valid_bda = TRUE; - BTIF_TRACE_DEBUG("Got Factory BDA %02X:%02X:%02X:%02X:%02X:%02X", - local_addr->address[0], local_addr->address[1], local_addr->address[2], - local_addr->address[3], local_addr->address[4], local_addr->address[5]); + BTIF_TRACE_DEBUG("%s: Got Factory BDA %s", __func__, val); } - close(addr_fd); } } @@ -360,14 +371,13 @@ static void btif_fetch_local_bdaddr(bt_bdaddr_t *local_addr) } /* No factory BDADDR found. Look for previously generated random BDA */ - if ((!valid_bda) && \ - (property_get(PERSIST_BDADDR_PROPERTY, val, NULL))) - { - string_to_bdaddr(val, local_addr); - valid_bda = TRUE; - BTIF_TRACE_DEBUG("Got prior random BDA %02X:%02X:%02X:%02X:%02X:%02X", - local_addr->address[0], local_addr->address[1], local_addr->address[2], - local_addr->address[3], local_addr->address[4], local_addr->address[5]); + if (!valid_bda) { + valid_bda = btif_fetch_property(PERSIST_BDADDR_PROPERTY, local_addr); + } + + /* No BDADDR found in file. Look for BDA in factory property */ + if (!valid_bda) { + valid_bda = btif_fetch_property(FACTORY_BT_ADDR_PROPERTY, local_addr); } /* Generate new BDA if necessary */ -- GitLab