Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2a034a6c authored by Ajay Panicker's avatar Ajay Panicker Committed by Andre Eisenbach
Browse files

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
parent d99b1ee5
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -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


+26 −16
Original line number Diff line number Diff line
@@ -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 */