Bluetooth: Set BD address from boot property

Read the Bluetooth Mac address from property and use it for
provisioning the Bluetooth address.
If there desired property is not available or any error in reading
property, Bluetooth address written using btnvtool will be used

Change-Id: I4a2644c912119ca5d231a88dbd801db902abbb24
CRs-fixed: 787516
diff --git a/libbt-vendor/Android.mk b/libbt-vendor/Android.mk
index 540592b..3414909 100644
--- a/libbt-vendor/Android.mk
+++ b/libbt-vendor/Android.mk
@@ -64,6 +64,7 @@
 LOCAL_MODULE_OWNER := qcom
 
 LOCAL_CFLAGS += -DBT_NV_SUPPORT
+#LOCAL_CFLAGS += -DREAD_BT_ADDR_FROM_PROP
 
 include $(LOCAL_PATH)/vnd_buildcfg.mk
 
diff --git a/libbt-vendor/src/bt_vendor_qcom.c b/libbt-vendor/src/bt_vendor_qcom.c
index 8e15c81..0545a6e 100644
--- a/libbt-vendor/src/bt_vendor_qcom.c
+++ b/libbt-vendor/src/bt_vendor_qcom.c
@@ -25,6 +25,7 @@
  ******************************************************************************/
 
 #define LOG_TAG "bt_vendor"
+#define BLUETOOTH_MAC_ADDR_BOOT_PROPERTY "ro.boot.btmacaddr"
 
 #include <utils/Log.h>
 #include <cutils/properties.h>
@@ -529,7 +530,32 @@
     return 0;
 }
 
+#ifdef READ_BT_ADDR_FROM_PROP
+static bool validate_tok(char* bdaddr_tok) {
+    int i = 0;
+    bool ret;
 
+    if (strlen(bdaddr_tok) != 2) {
+        ret = FALSE;
+        ALOGE("Invalid token length");
+    } else {
+        ret = TRUE;
+        for (i=0; i<2; i++) {
+            if ((bdaddr_tok[i] >= '0' && bdaddr_tok[i] <= '9') ||
+                (bdaddr_tok[i] >= 'A' && bdaddr_tok[i] <= 'F') ||
+                (bdaddr_tok[i] >= 'a' && bdaddr_tok[i] <= 'f')) {
+                ret = TRUE;
+                ALOGV("%s: tok %s @ %d is good", __func__, bdaddr_tok, i);
+             } else {
+                ret = FALSE;
+                ALOGE("invalid character in tok: %s at ind: %d", bdaddr_tok, i);
+                break;
+             }
+        }
+    }
+    return ret;
+}
+#endif /*READ_BT_ADDR_FROM_PROP*/
 
 int connect_to_local_socket(char* name) {
        socklen_t len; int sk = -1;
@@ -584,6 +610,14 @@
     bool is_ant_req = false;
     char wipower_status[PROPERTY_VALUE_MAX];
     char emb_wp_mode[PROPERTY_VALUE_MAX];
+    char bt_version[PROPERTY_VALUE_MAX];
+    bool ignore_boot_prop = TRUE;
+#ifdef READ_BT_ADDR_FROM_PROP
+    int i = 0;
+    static char bd_addr[PROPERTY_VALUE_MAX];
+    uint8_t local_bd_addr_from_prop[6];
+    char* tok;
+#endif
 
     ALOGV("bt-vendor : op for %d", opcode);
 
@@ -717,8 +751,43 @@
                                     }
                                     ALOGV("rome_soc_init is started");
                                     property_set("wc_transport.soc_initialized", "0");
+#ifdef READ_BT_ADDR_FROM_PROP
+                                    /*Give priority to read BD address from boot property*/
+                                    ignore_boot_prop = FALSE;
+                                    if (property_get(BLUETOOTH_MAC_ADDR_BOOT_PROPERTY, bd_addr, NULL)) {
+                                        ALOGV("BD address read from Boot property: %s\n", bd_addr);
+                                        tok =  strtok(bd_addr, ":");
+                                        while (tok != NULL) {
+                                            ALOGV("bd add [%d]: %d ", i, strtol(tok, NULL, 16));
+                                            if (i>=6) {
+                                                ALOGE("bd property of invalid length");
+                                                ignore_boot_prop = TRUE;
+                                                break;
+                                            }
+                                            if (!validate_tok(tok)) {
+                                                ALOGE("Invalid token in BD address");
+                                                ignore_boot_prop = TRUE;
+                                                break;
+                                            }
+                                            local_bd_addr_from_prop[5-i] = strtol(tok, NULL, 16);
+                                            tok = strtok(NULL, ":");
+                                            i++;
+                                        }
+                                        if (i == 6 && !ignore_boot_prop) {
+                                            ALOGV("Valid BD address read from prop");
+                                            memcpy(vnd_local_bd_addr, local_bd_addr_from_prop, sizeof(vnd_local_bd_addr));
+                                            ignore_boot_prop = FALSE;
+                                        } else {
+                                            ALOGE("There are not enough tokens in BD addr");
+                                            ignore_boot_prop = TRUE;
+                                        }
+                                    } else {
+                                        ALOGE("BD address boot property not set");
+                                        ignore_boot_prop = TRUE;
+                                    }
+#endif //READ_BT_ADDR_FROM_PROP
                                     /* Always read BD address from NV file */
-                                    if(!bt_vendor_nv_read(1, vnd_local_bd_addr))
+                                    if(ignore_boot_prop && !bt_vendor_nv_read(1, vnd_local_bd_addr))
                                     {
                                        /* Since the BD address is configured in boot time We should not be here */
                                        ALOGI("Failed to read BD address. Use the one from bluedroid stack/ftm");