1 /****************************************************************************** 2 * 3 * Copyright (C) 2009-2012 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19 /************************************************************************************ 20 * 21 * Filename: btif_storage.c 22 * 23 * Description: Stores the local BT adapter and remote device properties in 24 * NVRAM storage, typically as xml file in the 25 * mobile's filesystem 26 * 27 * 28 */ 29 #include <stdlib.h> 30 #include <time.h> 31 #include <string.h> 32 #include <ctype.h> 33 #include <alloca.h> 34 35 36 #include <hardware/bluetooth.h> 37 #include "btif_config.h" 38 #define LOG_TAG "BTIF_STORAGE" 39 40 #include "btif_api.h" 41 42 #include "btif_util.h" 43 #include "bd.h" 44 #include "gki.h" 45 #include "bta_hh_api.h" 46 #include "btif_hh.h" 47 48 #include <cutils/log.h> 49 #define info(fmt, ...) ALOGI ("%s(L%d): " fmt,__FUNCTION__, __LINE__, ## __VA_ARGS__) 50 #define debug(fmt, ...) ALOGD ("%s(L%d): " fmt,__FUNCTION__, __LINE__, ## __VA_ARGS__) 51 #define warn(fmt, ...) ALOGW ("## WARNING : %s(L%d): " fmt "##",__FUNCTION__, __LINE__, ## __VA_ARGS__) 52 #define error(fmt, ...) ALOGE ("## ERROR : %s(L%d): " fmt "##",__FUNCTION__, __LINE__, ## __VA_ARGS__) 53 #define asrt(s) if(!(s)) ALOGE ("## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__) 54 55 /************************************************************************************ 56 ** Constants & Macros 57 ************************************************************************************/ 58 59 #define BTIF_STORAGE_PATH_BLUEDROID "/data/misc/bluedroid" 60 61 //#define BTIF_STORAGE_PATH_ADAPTER_INFO "adapter_info" 62 //#define BTIF_STORAGE_PATH_REMOTE_DEVICES "remote_devices" 63 #define BTIF_STORAGE_PATH_REMOTE_DEVTIME "Timestamp" 64 #define BTIF_STORAGE_PATH_REMOTE_DEVCLASS "DevClass" 65 #define BTIF_STORAGE_PATH_REMOTE_DEVTYPE "DevType" 66 #define BTIF_STORAGE_PATH_REMOTE_NAME "Name" 67 //#define BTIF_STORAGE_PATH_REMOTE_LINKKEYS "remote_linkkeys" 68 #define BTIF_STORAGE_PATH_REMOTE_ALIASE "Aliase" 69 #define BTIF_STORAGE_PATH_REMOTE_SERVICE "Service" 70 #define BTIF_STORAGE_PATH_REMOTE_HIDINFO "HidInfo" 71 #define BTIF_STORAGE_KEY_ADAPTER_NAME "Name" 72 #define BTIF_STORAGE_KEY_ADAPTER_SCANMODE "ScanMode" 73 #define BTIF_STORAGE_KEY_ADAPTER_DISC_TIMEOUT "DiscoveryTimeout" 74 75 76 #define BTIF_AUTO_PAIR_CONF_FILE "/etc/bluetooth/auto_pair_devlist.conf" 77 #define BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST "AutoPairBlacklist" 78 #define BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_ADDR "AddressBlacklist" 79 #define BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_EXACTNAME "ExactNameBlacklist" 80 #define BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_PARTIALNAME "PartialNameBlacklist" 81 #define BTIF_STORAGE_KEY_AUTOPAIR_FIXPIN_KBLIST "FixedPinZerosKeyboardBlacklist" 82 #define BTIF_STORAGE_KEY_AUTOPAIR_DYNAMIC_BLACKLIST_ADDR "DynamicAddressBlacklist" 83 84 #define BTIF_AUTO_PAIR_CONF_VALUE_SEPARATOR "," 85 #define BTIF_AUTO_PAIR_CONF_SPACE ' ' 86 #define BTIF_AUTO_PAIR_CONF_COMMENT '#' 87 #define BTIF_AUTO_PAIR_CONF_KEY_VAL_DELIMETER "=" 88 89 90 /* This is a local property to add a device found */ 91 #define BT_PROPERTY_REMOTE_DEVICE_TIMESTAMP 0xFF 92 93 #define BTIF_STORAGE_GET_ADAPTER_PROP(t,v,l,p) \ 94 {p.type=t;p.val=v;p.len=l; btif_storage_get_adapter_property(&p);} 95 96 #define BTIF_STORAGE_GET_REMOTE_PROP(b,t,v,l,p) \ 97 {p.type=t;p.val=v;p.len=l;btif_storage_get_remote_device_property(b,&p);} 98 99 #define STORAGE_BDADDR_STRING_SZ (18) /* 00:11:22:33:44:55 */ 100 #define STORAGE_UUID_STRING_SIZE (36+1) /* 00001200-0000-1000-8000-00805f9b34fb; */ 101 #define STORAGE_PINLEN_STRING_MAX_SIZE (2) /* ascii pinlen max chars */ 102 #define STORAGE_KEYTYPE_STRING_MAX_SIZE (1) /* ascii keytype max chars */ 103 104 #define STORAGE_KEY_TYPE_MAX (10) 105 106 #define STORAGE_HID_ATRR_MASK_SIZE (4) 107 #define STORAGE_HID_SUB_CLASS_SIZE (2) 108 #define STORAGE_HID_APP_ID_SIZE (2) 109 #define STORAGE_HID_VENDOR_ID_SIZE (4) 110 #define STORAGE_HID_PRODUCT_ID_SIZE (4) 111 #define STORAGE_HID_VERSION_SIZE (4) 112 #define STORAGE_HID_CTRY_CODE_SIZE (2) 113 #define STORAGE_HID_DESC_LEN_SIZE (4) 114 #define STORAGE_HID_DESC_MAX_SIZE (2*512) 115 116 /* <18 char bd addr> <space> LIST< <36 char uuid> <;> > <keytype (dec)> <pinlen> */ 117 #define BTIF_REMOTE_SERVICES_ENTRY_SIZE_MAX (STORAGE_BDADDR_STRING_SZ + 1 +\ 118 STORAGE_UUID_STRING_SIZE*BT_MAX_NUM_UUIDS + \ 119 STORAGE_PINLEN_STRING_MAX_SIZE +\ 120 STORAGE_KEYTYPE_STRING_MAX_SIZE) 121 122 #define STORAGE_REMOTE_LINKKEYS_ENTRY_SIZE (LINK_KEY_LEN*2 + 1 + 2 + 1 + 2) 123 124 /* <18 char bd addr> <space>LIST <attr_mask> <space> > <sub_class> <space> <app_id> <space> 125 <vendor_id> <space> > <product_id> <space> <version> <space> 126 <ctry_code> <space> > <desc_len> <space> <desc_list> <space> */ 127 #define BTIF_HID_INFO_ENTRY_SIZE_MAX (STORAGE_BDADDR_STRING_SZ + 1 +\ 128 STORAGE_HID_ATRR_MASK_SIZE + 1 +\ 129 STORAGE_HID_SUB_CLASS_SIZE + 1 +\ 130 STORAGE_HID_APP_ID_SIZE+ 1 +\ 131 STORAGE_HID_VENDOR_ID_SIZE+ 1 +\ 132 STORAGE_HID_PRODUCT_ID_SIZE+ 1 +\ 133 STORAGE_HID_VERSION_SIZE+ 1 +\ 134 STORAGE_HID_CTRY_CODE_SIZE+ 1 +\ 135 STORAGE_HID_DESC_LEN_SIZE+ 1 +\ 136 STORAGE_HID_DESC_MAX_SIZE+ 1 ) 137 138 139 /* currently remote services is the potentially largest entry */ 140 #define BTIF_STORAGE_MAX_LINE_SZ BTIF_REMOTE_SERVICES_ENTRY_SIZE_MAX 141 142 143 /* check against unv max entry size at compile time */ 144 #if (BTIF_STORAGE_ENTRY_MAX_SIZE > UNV_MAXLINE_LENGTH) 145 #error "btif storage entry size exceeds unv max line size" 146 #endif 147 148 149 #define BTIF_STORAGE_HL_APP "hl_app" 150 #define BTIF_STORAGE_HL_APP_CB "hl_app_cb" 151 #define BTIF_STORAGE_HL_APP_DATA "hl_app_data_" 152 #define BTIF_STORAGE_HL_APP_MDL_DATA "hl_app_mdl_data_" 153 /************************************************************************************ 154 ** Local type definitions 155 ************************************************************************************/ 156 typedef struct 157 { 158 uint32_t num_devices; 159 bt_bdaddr_t devices[BTM_SEC_MAX_DEVICE_RECORDS]; 160 } btif_bonded_devices_t; 161 162 /************************************************************************************ 163 ** Extern variables 164 ************************************************************************************/ 165 extern UINT16 bta_service_id_to_uuid_lkup_tbl [BTA_MAX_SERVICE_ID]; 166 extern bt_bdaddr_t btif_local_bd_addr; 167 /************************************************************************************ 168 ** Static variables 169 ************************************************************************************/ 170 171 /************************************************************************************ 172 ** Static functions 173 ************************************************************************************/ 174 /******************************************************************************* 175 ** 176 ** Function btif_in_make_filename 177 ** 178 ** Description Internal helper function to create NVRAM file path 179 ** from address and filename 180 ** 181 ** Returns NVRAM file path if successfull, NULL otherwise 182 ** 183 *******************************************************************************/ 184 static char* btif_in_make_filename(bt_bdaddr_t *bd_addr, char *fname) 185 { 186 static char path[256]; 187 bdstr_t bdstr; 188 189 if (fname == NULL)return NULL; 190 if (bd_addr) 191 { 192 sprintf(path, "%s/%s/%s", BTIF_STORAGE_PATH_BLUEDROID, 193 bd2str(bd_addr, &bdstr), fname); 194 } 195 else 196 { 197 /* local adapter */ 198 sprintf(path, "%s/LOCAL/%s", BTIF_STORAGE_PATH_BLUEDROID, fname); 199 } 200 201 return(char*)path; 202 } 203 /******************************************************************************* 204 ** 205 ** Function btif_in_split_uuids_string_to_list 206 ** 207 ** Description Internal helper function to split the string of UUIDs 208 ** read from the NVRAM to an array 209 ** 210 ** Returns None 211 ** 212 *******************************************************************************/ 213 static void btif_in_split_uuids_string_to_list(char *str, bt_uuid_t *p_uuid, 214 uint32_t *p_num_uuid) 215 { 216 char buf[64]; 217 char *p_start = str; 218 char *p_needle; 219 uint32_t num = 0; 220 do 221 { 222 //p_needle = strchr(p_start, ';'); 223 p_needle = strchr(p_start, ' '); 224 if (p_needle < p_start) break; 225 memset(buf, 0, sizeof(buf)); 226 strncpy(buf, p_start, (p_needle-p_start)); 227 string_to_uuid(buf, p_uuid + num); 228 num++; 229 p_start = ++p_needle; 230 231 } while (*p_start != 0); 232 *p_num_uuid = num; 233 } 234 static int prop2cfg(bt_bdaddr_t *remote_bd_addr, bt_property_t *prop) 235 { 236 bdstr_t bdstr = {0}; 237 if(remote_bd_addr) 238 bd2str(remote_bd_addr, &bdstr); 239 debug("in, bd addr:%s, prop type:%d, len:%d", bdstr, prop->type, prop->len); 240 char value[1024]; 241 if(prop->len <= 0 || prop->len > (int)sizeof(value) - 1) 242 { 243 error("property type:%d, len:%d is invalid", prop->type, prop->len); 244 return FALSE; 245 } 246 switch(prop->type) 247 { 248 case BT_PROPERTY_REMOTE_DEVICE_TIMESTAMP: 249 btif_config_set_int("Remote", bdstr, 250 BTIF_STORAGE_PATH_REMOTE_DEVTIME, (int)time(NULL)); 251 break; 252 case BT_PROPERTY_BDNAME: 253 strncpy(value, (char*)prop->val, prop->len); 254 value[prop->len]='\0'; 255 if(remote_bd_addr) 256 btif_config_set_str("Remote", bdstr, 257 BTIF_STORAGE_PATH_REMOTE_NAME, value); 258 else btif_config_set_str("Local", "Adapter", 259 BTIF_STORAGE_KEY_ADAPTER_NAME, value); 260 break; 261 case BT_PROPERTY_REMOTE_FRIENDLY_NAME: 262 strncpy(value, (char*)prop->val, prop->len); 263 value[prop->len]='\0'; 264 btif_config_set_str("Remote", bdstr, BTIF_STORAGE_PATH_REMOTE_ALIASE, value); 265 break; 266 case BT_PROPERTY_ADAPTER_SCAN_MODE: 267 btif_config_set_int("Local", "Adapter", 268 BTIF_STORAGE_KEY_ADAPTER_SCANMODE, *(int*)prop->val); 269 break; 270 case BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT: 271 btif_config_set_int("Local", "Adapter", 272 BTIF_STORAGE_KEY_ADAPTER_DISC_TIMEOUT, *(int*)prop->val); 273 break; 274 case BT_PROPERTY_CLASS_OF_DEVICE: 275 btif_config_set_int("Remote", bdstr, 276 BTIF_STORAGE_PATH_REMOTE_DEVCLASS, *(int*)prop->val); 277 break; 278 case BT_PROPERTY_TYPE_OF_DEVICE: 279 btif_config_set_int("Remote", bdstr, 280 BTIF_STORAGE_PATH_REMOTE_DEVTYPE, *(int*)prop->val); 281 break; 282 case BT_PROPERTY_UUIDS: 283 { 284 uint32_t i; 285 char buf[64]; 286 value[0] = 0; 287 for (i=0; i < (prop->len)/sizeof(bt_uuid_t); i++) 288 { 289 bt_uuid_t *p_uuid = (bt_uuid_t*)prop->val + i; 290 memset(buf, 0, sizeof(buf)); 291 uuid_to_string(p_uuid, buf); 292 strcat(value, buf); 293 //strcat(value, ";"); 294 strcat(value, " "); 295 } 296 btif_config_set_str("Remote", bdstr, BTIF_STORAGE_PATH_REMOTE_SERVICE, value); 297 btif_config_save(); 298 break; 299 } 300 default: 301 error("Unknow prop type:%d", prop->type); 302 return FALSE; 303 } 304 return TRUE; 305 } 306 static int cfg2prop(bt_bdaddr_t *remote_bd_addr, bt_property_t *prop) 307 { 308 bdstr_t bdstr = {0}; 309 if(remote_bd_addr) 310 bd2str(remote_bd_addr, &bdstr); 311 debug("in, bd addr:%s, prop type:%d, len:%d", bdstr, prop->type, prop->len); 312 if(prop->len <= 0) 313 { 314 error("property type:%d, len:%d is invalid", prop->type, prop->len); 315 return FALSE; 316 } 317 int ret = FALSE; 318 switch(prop->type) 319 { 320 case BT_PROPERTY_REMOTE_DEVICE_TIMESTAMP: 321 if(prop->len >= (int)sizeof(int)) 322 ret = btif_config_get_int("Remote", bdstr, 323 BTIF_STORAGE_PATH_REMOTE_DEVTIME, (int*)prop->val); 324 break; 325 case BT_PROPERTY_BDNAME: 326 { 327 int len = prop->len; 328 if(remote_bd_addr) 329 ret = btif_config_get_str("Remote", bdstr, 330 BTIF_STORAGE_PATH_REMOTE_NAME, (char*)prop->val, &len); 331 else ret = btif_config_get_str("Local", "Adapter", 332 BTIF_STORAGE_KEY_ADAPTER_NAME, (char*)prop->val, &len); 333 if(ret && len && len <= prop->len) 334 prop->len = len - 1; 335 else 336 { 337 prop->len = 0; 338 ret = FALSE; 339 } 340 break; 341 } 342 case BT_PROPERTY_REMOTE_FRIENDLY_NAME: 343 { 344 int len = prop->len; 345 ret = btif_config_get_str("Remote", bdstr, 346 BTIF_STORAGE_PATH_REMOTE_ALIASE, (char*)prop->val, &len); 347 if(ret && len && len <= prop->len) 348 prop->len = len - 1; 349 else 350 { 351 prop->len = 0; 352 ret = FALSE; 353 } 354 break; 355 } 356 case BT_PROPERTY_ADAPTER_SCAN_MODE: 357 if(prop->len >= (int)sizeof(int)) 358 ret = btif_config_get_int("Local", "Adapter", 359 BTIF_STORAGE_KEY_ADAPTER_SCANMODE, (int*)prop->val); 360 break; 361 case BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT: 362 if(prop->len >= (int)sizeof(int)) 363 ret = btif_config_get_int("Local", "Adapter", 364 BTIF_STORAGE_KEY_ADAPTER_DISC_TIMEOUT, (int*)prop->val); 365 break; 366 case BT_PROPERTY_CLASS_OF_DEVICE: 367 if(prop->len >= (int)sizeof(int)) 368 ret = btif_config_get_int("Remote", bdstr, 369 BTIF_STORAGE_PATH_REMOTE_DEVCLASS, (int*)prop->val); 370 break; 371 case BT_PROPERTY_TYPE_OF_DEVICE: 372 if(prop->len >= (int)sizeof(int)) 373 ret = btif_config_get_int("Remote", 374 bdstr, BTIF_STORAGE_PATH_REMOTE_DEVTYPE, (int*)prop->val); 375 break; 376 case BT_PROPERTY_UUIDS: 377 { 378 char value[1280]; 379 int size = sizeof(value); 380 if(btif_config_get_str("Remote", bdstr, 381 BTIF_STORAGE_PATH_REMOTE_SERVICE, value, &size)) 382 { 383 bt_uuid_t *p_uuid = (bt_uuid_t*)prop->val; 384 uint32_t num_uuids = 0; 385 btif_in_split_uuids_string_to_list(value, p_uuid, &num_uuids); 386 prop->len = num_uuids * sizeof(bt_uuid_t); 387 ret = TRUE; 388 } 389 break; 390 } 391 default: 392 error("Unknow prop type:%d", prop->type); 393 return FALSE; 394 } 395 return ret; 396 } 397 398 399 /******************************************************************************* 400 ** 401 ** Function btif_in_fetch_bonded_devices 402 ** 403 ** Description Internal helper function to fetch the bonded devices 404 ** from NVRAM 405 ** 406 ** Returns BT_STATUS_SUCCESS if successful, BT_STATUS_FAIL otherwise 407 ** 408 *******************************************************************************/ 409 static bt_status_t btif_in_fetch_bonded_devices(btif_bonded_devices_t *p_bonded_devices, int add) 410 { 411 debug("in add:%d", add); 412 memset(p_bonded_devices, 0, sizeof(btif_bonded_devices_t)); 413 414 char kname[128], vname[128]; 415 short kpos; 416 int kname_size; 417 kname_size = sizeof(kname); 418 kname[0] = 0; 419 kpos = 0; 420 do 421 { 422 kpos = btif_config_next_key(kpos, "Remote", kname, &kname_size); 423 debug("Remote device:%s, size:%d", kname, kname_size); 424 int type = BTIF_CFG_TYPE_BIN; 425 LINK_KEY link_key; 426 int size = sizeof(link_key); 427 if(btif_config_get("Remote", kname, "LinkKey", (char*)link_key, &size, &type)) 428 { 429 int linkkey_type; 430 if(btif_config_get_int("Remote", kname, "LinkKeyType", &linkkey_type)) 431 { 432 //int pin_len; 433 //btif_config_get_int("Remote", kname, "PinLength", &pin_len)) 434 bt_bdaddr_t bd_addr; 435 str2bd(kname, &bd_addr); 436 if(add) 437 { 438 DEV_CLASS dev_class = {0, 0, 0}; 439 int cod; 440 if(btif_config_get_int("Remote", kname, "DevClass", &cod)) 441 uint2devclass((UINT32)cod, dev_class); 442 BTA_DmAddDevice(bd_addr.address, dev_class, link_key, 0, 0, (UINT8)linkkey_type, 0); 443 } 444 memcpy(&p_bonded_devices->devices[p_bonded_devices->num_devices++], &bd_addr, sizeof(bt_bdaddr_t)); 445 } 446 else error("bounded device:%s, LinkKeyType or PinLength is invalid", kname); 447 } 448 else debug("Remote device:%s, no link key", kname); 449 kname_size = sizeof(kname); 450 kname[0] = 0; 451 } while(kpos != -1); 452 debug("out"); 453 return BT_STATUS_SUCCESS; 454 } 455 456 static int hex_str_to_int(const char* str, int size) 457 { 458 int n = 0; 459 char c = *str++; 460 while (size-- != 0) 461 { 462 n <<= 4; 463 if (c >= '0' && c <= '9') { 464 n |= c - '0'; 465 } 466 else if (c >= 'a' && c <= 'z') { 467 n |= c - 'a' + 10; 468 } 469 else // (c >= 'A' && c <= 'Z') 470 { 471 n |= c - 'A' + 10; 472 } 473 474 c = *str++; 475 } 476 return n; 477 } 478 479 /************************************************************************************ 480 ** Externs 481 ************************************************************************************/ 482 483 /************************************************************************************ 484 ** Functions 485 ************************************************************************************/ 486 487 /** functions are synchronous. 488 * functions can be called by both internal modules such as BTIF_DM and by external entiries from HAL via BTIF_context_switch 489 * For OUT parameters, caller is expected to provide the memory. 490 * Caller is expected to provide a valid pointer to 'property->value' based on the property->type 491 */ 492 /******************************************************************************* 493 ** 494 ** Function btif_storage_get_adapter_property 495 ** 496 ** Description BTIF storage API - Fetches the adapter property->type 497 ** from NVRAM and fills property->val. 498 ** Caller should provide memory for property->val and 499 ** set the property->val 500 ** 501 ** Returns BT_STATUS_SUCCESS if the fetch was successful, 502 ** BT_STATUS_FAIL otherwise 503 ** 504 *******************************************************************************/ 505 bt_status_t btif_storage_get_adapter_property(bt_property_t *property) 506 { 507 508 /* Special handling for adapter BD_ADDR and BONDED_DEVICES */ 509 if (property->type == BT_PROPERTY_BDADDR) 510 { 511 BD_ADDR addr; 512 bt_bdaddr_t *bd_addr = (bt_bdaddr_t*)property->val; 513 /* This has been cached in btif. Just fetch it from there */ 514 memcpy(bd_addr, &btif_local_bd_addr, sizeof(bt_bdaddr_t)); 515 property->len = sizeof(bt_bdaddr_t); 516 return BT_STATUS_SUCCESS; 517 } 518 else if (property->type == BT_PROPERTY_ADAPTER_BONDED_DEVICES) 519 { 520 btif_bonded_devices_t bonded_devices; 521 522 btif_in_fetch_bonded_devices(&bonded_devices, 0); 523 524 BTIF_TRACE_DEBUG2("%s: Number of bonded devices: %d Property:BT_PROPERTY_ADAPTER_BONDED_DEVICES", __FUNCTION__, bonded_devices.num_devices); 525 526 if (bonded_devices.num_devices > 0) 527 { 528 property->len = bonded_devices.num_devices * sizeof(bt_bdaddr_t); 529 memcpy(property->val, bonded_devices.devices, property->len); 530 } 531 532 /* if there are no bonded_devices, then length shall be 0 */ 533 return BT_STATUS_SUCCESS; 534 } 535 else if (property->type == BT_PROPERTY_UUIDS) 536 { 537 /* publish list of local supported services */ 538 bt_uuid_t *p_uuid = (bt_uuid_t*)property->val; 539 uint32_t num_uuids = 0; 540 uint32_t i; 541 542 tBTA_SERVICE_MASK service_mask = btif_get_enabled_services_mask(); 543 BTIF_TRACE_ERROR2("%s service_mask:0x%x", __FUNCTION__, service_mask); 544 for (i=0; i < BTA_MAX_SERVICE_ID; i++) 545 { 546 /* This should eventually become a function when more services are enabled */ 547 if (service_mask 548 &(tBTA_SERVICE_MASK)(1 << i)) 549 { 550 switch (i) 551 { 552 case BTA_HFP_SERVICE_ID: 553 { 554 uuid16_to_uuid128(UUID_SERVCLASS_AG_HANDSFREE, 555 p_uuid+num_uuids); 556 num_uuids++; 557 } 558 /* intentional fall through: Send both BFP & HSP UUIDs if HFP is enabled */ 559 case BTA_HSP_SERVICE_ID: 560 { 561 uuid16_to_uuid128(UUID_SERVCLASS_HEADSET_AUDIO_GATEWAY, 562 p_uuid+num_uuids); 563 num_uuids++; 564 }break; 565 case BTA_A2DP_SERVICE_ID: 566 { 567 uuid16_to_uuid128(UUID_SERVCLASS_AUDIO_SOURCE, 568 p_uuid+num_uuids); 569 num_uuids++; 570 }break; 571 } 572 } 573 } 574 property->len = (num_uuids)*sizeof(bt_uuid_t); 575 return BT_STATUS_SUCCESS; 576 } 577 578 /* fall through for other properties */ 579 if(!cfg2prop(NULL, property)) 580 { 581 return btif_dm_get_adapter_property(property); 582 } 583 return BT_STATUS_SUCCESS; 584 } 585 586 /******************************************************************************* 587 ** 588 ** Function btif_storage_set_adapter_property 589 ** 590 ** Description BTIF storage API - Stores the adapter property 591 ** to NVRAM 592 ** 593 ** Returns BT_STATUS_SUCCESS if the store was successful, 594 ** BT_STATUS_FAIL otherwise 595 ** 596 *******************************************************************************/ 597 bt_status_t btif_storage_set_adapter_property(bt_property_t *property) 598 { 599 return prop2cfg(NULL, property) ? BT_STATUS_SUCCESS : BT_STATUS_FAIL; 600 } 601 602 /******************************************************************************* 603 ** 604 ** Function btif_storage_get_remote_device_property 605 ** 606 ** Description BTIF storage API - Fetches the remote device property->type 607 ** from NVRAM and fills property->val. 608 ** Caller should provide memory for property->val and 609 ** set the property->val 610 ** 611 ** Returns BT_STATUS_SUCCESS if the fetch was successful, 612 ** BT_STATUS_FAIL otherwise 613 ** 614 *******************************************************************************/ 615 bt_status_t btif_storage_get_remote_device_property(bt_bdaddr_t *remote_bd_addr, 616 bt_property_t *property) 617 { 618 return cfg2prop(remote_bd_addr, property) ? BT_STATUS_SUCCESS : BT_STATUS_FAIL; 619 } 620 /******************************************************************************* 621 ** 622 ** Function btif_storage_set_remote_device_property 623 ** 624 ** Description BTIF storage API - Stores the remote device property 625 ** to NVRAM 626 ** 627 ** Returns BT_STATUS_SUCCESS if the store was successful, 628 ** BT_STATUS_FAIL otherwise 629 ** 630 *******************************************************************************/ 631 bt_status_t btif_storage_set_remote_device_property(bt_bdaddr_t *remote_bd_addr, 632 bt_property_t *property) 633 { 634 return prop2cfg(remote_bd_addr, property) ? BT_STATUS_SUCCESS : BT_STATUS_FAIL; 635 } 636 637 /******************************************************************************* 638 ** 639 ** Function btif_storage_add_remote_device 640 ** 641 ** Description BTIF storage API - Adds a newly discovered device to NVRAM 642 ** along with the timestamp. Also, stores the various 643 ** properties - RSSI, BDADDR, NAME (if found in EIR) 644 ** 645 ** Returns BT_STATUS_SUCCESS if the store was successful, 646 ** BT_STATUS_FAIL otherwise 647 ** 648 *******************************************************************************/ 649 bt_status_t btif_storage_add_remote_device(bt_bdaddr_t *remote_bdaddr, 650 uint32_t num_properties, 651 bt_property_t *properties) 652 { 653 uint32_t i = 0; 654 /* TODO: If writing a property, fails do we go back undo the earlier 655 * written properties? */ 656 for (i=0; i < num_properties; i++) 657 { 658 /* Ignore the RSSI as this is not stored in DB */ 659 if (properties[i].type == BT_PROPERTY_REMOTE_RSSI) 660 continue; 661 662 /* BD_ADDR for remote device needs special handling as we also store timestamp */ 663 if (properties[i].type == BT_PROPERTY_BDADDR) 664 { 665 bt_property_t addr_prop; 666 memcpy(&addr_prop, &properties[i], sizeof(bt_property_t)); 667 addr_prop.type = BT_PROPERTY_REMOTE_DEVICE_TIMESTAMP; 668 btif_storage_set_remote_device_property(remote_bdaddr, 669 &addr_prop); 670 } 671 else 672 { 673 btif_storage_set_remote_device_property(remote_bdaddr, 674 &properties[i]); 675 } 676 } 677 return BT_STATUS_SUCCESS; 678 } 679 680 /******************************************************************************* 681 ** 682 ** Function btif_storage_add_bonded_device 683 ** 684 ** Description BTIF storage API - Adds the newly bonded device to NVRAM 685 ** along with the link-key, Key type and Pin key length 686 ** 687 ** Returns BT_STATUS_SUCCESS if the store was successful, 688 ** BT_STATUS_FAIL otherwise 689 ** 690 *******************************************************************************/ 691 692 bt_status_t btif_storage_add_bonded_device(bt_bdaddr_t *remote_bd_addr, 693 LINK_KEY link_key, 694 uint8_t key_type, 695 uint8_t pin_length) 696 { 697 bdstr_t bdstr; 698 bd2str(remote_bd_addr, &bdstr); 699 int ret = btif_config_set_int("Remote", bdstr, "LinkKeyType", (int)key_type); 700 ret &= btif_config_set_int("Remote", bdstr, "PinLength", (int)pin_length); 701 ret &= btif_config_set("Remote", bdstr, "LinkKey", (const char*)link_key, sizeof(LINK_KEY), BTIF_CFG_TYPE_BIN); 702 btif_config_save(); 703 return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL; 704 } 705 706 /******************************************************************************* 707 ** 708 ** Function btif_storage_remove_bonded_device 709 ** 710 ** Description BTIF storage API - Deletes the bonded device from NVRAM 711 ** 712 ** Returns BT_STATUS_SUCCESS if the deletion was successful, 713 ** BT_STATUS_FAIL otherwise 714 ** 715 *******************************************************************************/ 716 bt_status_t btif_storage_remove_bonded_device(bt_bdaddr_t *remote_bd_addr) 717 { 718 bdstr_t bdstr; 719 bd2str(remote_bd_addr, &bdstr); 720 debug("in bd addr:%s", bdstr); 721 int ret = btif_config_remove("Remote", bdstr, "LinkKeyType"); 722 ret &= btif_config_remove("Remote", bdstr, "PinLength"); 723 ret &= btif_config_remove("Remote", bdstr, "LinkKey"); 724 btif_config_save(); 725 return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL; 726 727 } 728 729 /******************************************************************************* 730 ** 731 ** Function btif_storage_load_bonded_devices 732 ** 733 ** Description BTIF storage API - Loads all the bonded devices from NVRAM 734 ** and adds to the BTA. 735 ** Additionally, this API also invokes the adaper_properties_cb 736 ** and remote_device_properties_cb for each of the bonded devices. 737 ** 738 ** Returns BT_STATUS_SUCCESS if successful, BT_STATUS_FAIL otherwise 739 ** 740 *******************************************************************************/ 741 bt_status_t btif_storage_load_bonded_devices(void) 742 { 743 char *fname; 744 btif_bonded_devices_t bonded_devices; 745 uint32_t i = 0; 746 bt_property_t adapter_props[6]; 747 uint32_t num_props = 0; 748 bt_property_t remote_properties[8]; 749 bt_bdaddr_t addr; 750 bt_bdname_t name, alias; 751 bt_scan_mode_t mode; 752 uint32_t disc_timeout; 753 bt_bdaddr_t *devices_list; 754 bt_uuid_t local_uuids[BT_MAX_NUM_UUIDS]; 755 bt_uuid_t remote_uuids[BT_MAX_NUM_UUIDS]; 756 uint32_t cod, devtype; 757 758 btif_in_fetch_bonded_devices(&bonded_devices, 1); 759 760 /* Now send the adapter_properties_cb with all adapter_properties */ 761 { 762 memset(adapter_props, 0, sizeof(adapter_props)); 763 764 /* BD_ADDR */ 765 BTIF_STORAGE_GET_ADAPTER_PROP(BT_PROPERTY_BDADDR, &addr, sizeof(addr), 766 adapter_props[num_props]); 767 num_props++; 768 769 /* BD_NAME */ 770 BTIF_STORAGE_GET_ADAPTER_PROP(BT_PROPERTY_BDNAME, &name, sizeof(name), 771 adapter_props[num_props]); 772 num_props++; 773 774 /* SCAN_MODE */ 775 /* TODO: At the time of BT on, always report the scan mode as 0 irrespective 776 of the scan_mode during the previous enable cycle. 777 This needs to be re-visited as part of the app/stack enable sequence 778 synchronization */ 779 mode = BT_SCAN_MODE_NONE; 780 adapter_props[num_props].type = BT_PROPERTY_ADAPTER_SCAN_MODE; 781 adapter_props[num_props].len = sizeof(mode); 782 adapter_props[num_props].val = &mode; 783 num_props++; 784 785 /* DISC_TIMEOUT */ 786 BTIF_STORAGE_GET_ADAPTER_PROP(BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT, 787 &disc_timeout, sizeof(disc_timeout), 788 adapter_props[num_props]); 789 num_props++; 790 791 /* BONDED_DEVICES */ 792 devices_list = (bt_bdaddr_t*)malloc(sizeof(bt_bdaddr_t)*bonded_devices.num_devices); 793 adapter_props[num_props].type = BT_PROPERTY_ADAPTER_BONDED_DEVICES; 794 adapter_props[num_props].len = bonded_devices.num_devices * sizeof(bt_bdaddr_t); 795 adapter_props[num_props].val = devices_list; 796 for (i=0; i < bonded_devices.num_devices; i++) 797 { 798 memcpy(devices_list + i, &bonded_devices.devices[i], sizeof(bt_bdaddr_t)); 799 } 800 num_props++; 801 802 /* LOCAL UUIDs */ 803 BTIF_STORAGE_GET_ADAPTER_PROP(BT_PROPERTY_UUIDS, 804 local_uuids, sizeof(local_uuids), 805 adapter_props[num_props]); 806 num_props++; 807 808 btif_adapter_properties_evt(BT_STATUS_SUCCESS, num_props, adapter_props); 809 810 free(devices_list); 811 } 812 813 BTIF_TRACE_EVENT2("%s: %d bonded devices found", __FUNCTION__, bonded_devices.num_devices); 814 815 { 816 for (i = 0; i < bonded_devices.num_devices; i++) 817 { 818 bt_bdaddr_t *p_remote_addr; 819 820 num_props = 0; 821 p_remote_addr = &bonded_devices.devices[i]; 822 memset(remote_properties, 0, sizeof(remote_properties)); 823 BTIF_STORAGE_GET_REMOTE_PROP(p_remote_addr, BT_PROPERTY_BDNAME, 824 &name, sizeof(name), 825 remote_properties[num_props]); 826 num_props++; 827 828 BTIF_STORAGE_GET_REMOTE_PROP(p_remote_addr, BT_PROPERTY_REMOTE_FRIENDLY_NAME, 829 &alias, sizeof(alias), 830 remote_properties[num_props]); 831 num_props++; 832 833 BTIF_STORAGE_GET_REMOTE_PROP(p_remote_addr, BT_PROPERTY_CLASS_OF_DEVICE, 834 &cod, sizeof(cod), 835 remote_properties[num_props]); 836 num_props++; 837 838 BTIF_STORAGE_GET_REMOTE_PROP(p_remote_addr, BT_PROPERTY_TYPE_OF_DEVICE, 839 &devtype, sizeof(devtype), 840 remote_properties[num_props]); 841 num_props++; 842 843 BTIF_STORAGE_GET_REMOTE_PROP(p_remote_addr, BT_PROPERTY_UUIDS, 844 remote_uuids, sizeof(remote_uuids), 845 remote_properties[num_props]); 846 num_props++; 847 848 btif_remote_properties_evt(BT_STATUS_SUCCESS, p_remote_addr, 849 num_props, remote_properties); 850 } 851 } 852 return BT_STATUS_SUCCESS; 853 } 854 855 /******************************************************************************* 856 ** 857 ** Function btif_storage_add_hid_device_info 858 ** 859 ** Description BTIF storage API - Adds the hid information of bonded hid devices-to NVRAM 860 ** 861 ** Returns BT_STATUS_SUCCESS if the store was successful, 862 ** BT_STATUS_FAIL otherwise 863 ** 864 *******************************************************************************/ 865 866 bt_status_t btif_storage_add_hid_device_info(bt_bdaddr_t *remote_bd_addr, 867 UINT16 attr_mask, UINT8 sub_class, 868 UINT8 app_id, UINT16 vendor_id, 869 UINT16 product_id, UINT16 version, 870 UINT8 ctry_code, UINT16 dl_len, UINT8 *dsc_list) 871 { 872 bdstr_t bdstr; 873 bd2str(remote_bd_addr, &bdstr); 874 btif_config_set_int("Remote", bdstr, "HidAttrMask", attr_mask); 875 btif_config_set_int("Remote", bdstr, "HidSubClass", sub_class); 876 btif_config_set_int("Remote", bdstr, "HidAppId", app_id); 877 btif_config_set_int("Remote", bdstr, "HidVendorId", vendor_id); 878 btif_config_set_int("Remote", bdstr, "HidProductId", product_id); 879 btif_config_set_int("Remote", bdstr, "HidVersion", version); 880 btif_config_set_int("Remote", bdstr, "HidCountryCode", ctry_code); 881 if(dl_len > 0) 882 btif_config_set("Remote", bdstr, "HidDescriptor", (const char*)dsc_list, dl_len, BTIF_CFG_TYPE_BIN); 883 return BT_STATUS_SUCCESS; 884 } 885 886 /******************************************************************************* 887 ** 888 ** Function btif_storage_load_bonded_hid_info 889 ** 890 ** Description BTIF storage API - Loads hid info for all the bonded devices from NVRAM 891 ** and adds those devices to the BTA_HH. 892 ** 893 ** Returns BT_STATUS_SUCCESS if successful, BT_STATUS_FAIL otherwise 894 ** 895 *******************************************************************************/ 896 bt_status_t btif_storage_load_bonded_hid_info(void) 897 { 898 debug("in"); 899 bt_bdaddr_t bd_addr; 900 tBTA_HH_DEV_DSCP_INFO dscp_info; 901 uint32_t i; 902 uint16_t attr_mask; 903 uint8_t sub_class; 904 uint8_t app_id; 905 906 char kname[128], vname[128]; 907 short kpos; 908 int kname_size; 909 kname_size = sizeof(kname); 910 kname[0] = 0; 911 kpos = 0; 912 memset(&dscp_info, 0, sizeof(dscp_info)); 913 do 914 { 915 kpos = btif_config_next_key(kpos, "Remote", kname, &kname_size); 916 debug("Remote device:%s, size:%d", kname, kname_size); 917 int value; 918 if(btif_config_get_int("Remote", kname, "HidAttrMask", &value)) 919 { 920 attr_mask = (uint16_t)value; 921 922 btif_config_get_int("Remote", kname, "HidSubClass", &value); 923 sub_class = (uint8_t)value; 924 925 btif_config_get_int("Remote", kname, "HidAppId", &value); 926 app_id = (uint8_t)value; 927 928 btif_config_get_int("Remote", kname, "HidVendorId", &value); 929 dscp_info.vendor_id = (uint16_t) value; 930 931 btif_config_get_int("Remote", kname, "HidProductId", &value); 932 dscp_info.product_id = (uint16_t) value; 933 934 btif_config_get_int("Remote", kname, "HidVersion", &value); 935 dscp_info.version = (uint8_t) value; 936 937 btif_config_get_int("Remote", kname, "HidCountryCode", &value); 938 dscp_info.ctry_code = (uint8_t) value; 939 940 int len = 0; 941 int type; 942 btif_config_get("Remote", kname, "HidDescriptor", NULL, &len, &type); 943 if(len > 0) 944 { 945 dscp_info.descriptor.dl_len = (uint16_t)len; 946 dscp_info.descriptor.dsc_list = (uint8_t*)alloca(len); 947 btif_config_get("Remote", kname, "HidDescriptor", (char*)dscp_info.descriptor.dsc_list, &len, &type); 948 } 949 str2bd(kname, &bd_addr); 950 // add extracted information to BTA HH 951 if (btif_hh_add_added_dev(bd_addr,attr_mask)) 952 { 953 BTA_HhAddDev(bd_addr.address, attr_mask, sub_class, 954 app_id, dscp_info); 955 } 956 } 957 } while(kpos != -1); 958 959 return BT_STATUS_SUCCESS; 960 } 961 962 /******************************************************************************* 963 ** 964 ** Function btif_storage_remove_hid_info 965 ** 966 ** Description BTIF storage API - Deletes the bonded hid device info from NVRAM 967 ** 968 ** Returns BT_STATUS_SUCCESS if the deletion was successful, 969 ** BT_STATUS_FAIL otherwise 970 ** 971 *******************************************************************************/ 972 bt_status_t btif_storage_remove_hid_info(bt_bdaddr_t *remote_bd_addr) 973 { 974 char *fname; 975 int ret; 976 bdstr_t bdstr; 977 bd2str(remote_bd_addr, &bdstr); 978 979 btif_config_remove("Remote", bdstr, "HidAttrMask"); 980 btif_config_remove("Remote", bdstr, "HidSubClass"); 981 btif_config_remove("Remote", bdstr, "HidAppId"); 982 btif_config_remove("Remote", bdstr, "HidVendorId"); 983 btif_config_remove("Remote", bdstr, "HidProductId"); 984 btif_config_remove("Remote", bdstr, "HidVersion"); 985 btif_config_remove("Remote", bdstr, "HidCountryCode"); 986 btif_config_remove("Remote", bdstr, "HidDescriptor"); 987 return BT_STATUS_SUCCESS; 988 } 989 990 /******************************************************************************* 991 ** 992 ** Function btif_storage_read_hl_apps_cb 993 ** 994 ** Description BTIF storage API - Read HL application control block from NVRAM 995 ** 996 ** Returns BT_STATUS_SUCCESS if the operation was successful, 997 ** BT_STATUS_FAIL otherwise 998 ** 999 *******************************************************************************/ 1000 bt_status_t btif_storage_read_hl_apps_cb(char *value, int value_size) 1001 { 1002 bt_status_t bt_status = BT_STATUS_SUCCESS; 1003 int read_size=value_size, read_type=BTIF_CFG_TYPE_BIN; 1004 1005 if (!btif_config_exist("Local", BTIF_STORAGE_HL_APP, BTIF_STORAGE_HL_APP_CB)) 1006 { 1007 memset(value, value_size, 0); 1008 if (!btif_config_set("Local", BTIF_STORAGE_HL_APP,BTIF_STORAGE_HL_APP_CB, 1009 value, value_size, BTIF_CFG_TYPE_BIN)) 1010 { 1011 bt_status = BT_STATUS_FAIL; 1012 } 1013 else 1014 { 1015 btif_config_save(); 1016 } 1017 } 1018 else 1019 { 1020 if (!btif_config_get("Local", BTIF_STORAGE_HL_APP, BTIF_STORAGE_HL_APP_CB, 1021 value, &read_size, &read_type)) 1022 { 1023 bt_status = BT_STATUS_FAIL; 1024 } 1025 else 1026 { 1027 if ((read_size != value_size) || (read_type != BTIF_CFG_TYPE_BIN) ) 1028 { 1029 BTIF_TRACE_ERROR4("%s value_size=%d read_size=%d read_type=%d", 1030 __FUNCTION__, value_size, read_size, read_type); 1031 bt_status = BT_STATUS_FAIL; 1032 } 1033 } 1034 1035 } 1036 1037 BTIF_TRACE_DEBUG3("%s status=%d value_size=%d", __FUNCTION__, bt_status, value_size); 1038 return bt_status; 1039 } 1040 1041 1042 /******************************************************************************* 1043 ** 1044 ** Function btif_storage_write_hl_apps_cb 1045 ** 1046 ** Description BTIF storage API - Write HL application control block to NVRAM 1047 ** 1048 ** Returns BT_STATUS_SUCCESS if the operation was successful, 1049 ** BT_STATUS_FAIL otherwise 1050 ** 1051 *******************************************************************************/ 1052 bt_status_t btif_storage_write_hl_apps_cb(char *value, int value_size) 1053 { 1054 bt_status_t bt_status = BT_STATUS_SUCCESS; 1055 1056 if (!btif_config_set("Local", BTIF_STORAGE_HL_APP, BTIF_STORAGE_HL_APP_CB, 1057 value, value_size, BTIF_CFG_TYPE_BIN)) 1058 { 1059 bt_status = BT_STATUS_FAIL; 1060 } 1061 else 1062 { 1063 btif_config_save(); 1064 } 1065 BTIF_TRACE_DEBUG3("%s status=%d value_size=%d", __FUNCTION__, bt_status, value_size); 1066 1067 return bt_status; 1068 } 1069 1070 bt_status_t btif_storage_read_hl_data(char *fname, char *value, int value_size) 1071 { 1072 bt_status_t bt_status = BT_STATUS_SUCCESS; 1073 int read_size=value_size, read_type=BTIF_CFG_TYPE_BIN; 1074 1075 if (!btif_config_get("Local", BTIF_STORAGE_HL_APP, fname, value, &read_size, &read_type)) 1076 { 1077 bt_status = BT_STATUS_FAIL; 1078 } 1079 else 1080 { 1081 if ((read_size != value_size) || (read_type != BTIF_CFG_TYPE_BIN) ) 1082 { 1083 BTIF_TRACE_ERROR4("%s value_size=%d read_size=%d read_type=%d", 1084 __FUNCTION__, value_size, read_size, read_type); 1085 bt_status = BT_STATUS_FAIL; 1086 } 1087 } 1088 1089 return bt_status; 1090 } 1091 1092 bt_status_t btif_storage_write_hl_data(char *fname, char *value, int value_size) 1093 { 1094 bt_status_t bt_status = BT_STATUS_SUCCESS; 1095 1096 if (!btif_config_set("Local", BTIF_STORAGE_HL_APP, fname, value, value_size, BTIF_CFG_TYPE_BIN)) 1097 { 1098 bt_status = BT_STATUS_FAIL; 1099 } 1100 else 1101 { 1102 btif_config_save(); 1103 } 1104 BTIF_TRACE_DEBUG3("%s status=%d value_size=%d", __FUNCTION__, bt_status, value_size); 1105 1106 return bt_status; 1107 1108 } 1109 1110 /******************************************************************************* 1111 ** 1112 ** Function btif_storage_read_hl_app_data 1113 ** 1114 ** Description BTIF storage API - Read HL application configuration from NVRAM 1115 ** 1116 ** Returns BT_STATUS_SUCCESS if the operation was successful, 1117 ** BT_STATUS_FAIL otherwise 1118 ** 1119 *******************************************************************************/ 1120 bt_status_t btif_storage_read_hl_app_data(UINT8 app_idx, char *value, int value_size) 1121 { 1122 char fname[256]; 1123 bt_status_t bt_status = BT_STATUS_SUCCESS; 1124 1125 BTIF_TRACE_DEBUG1("%s ", __FUNCTION__); 1126 sprintf(fname, "%s%d", BTIF_STORAGE_HL_APP_DATA, app_idx); 1127 bt_status = btif_storage_read_hl_data(fname, value, value_size); 1128 BTIF_TRACE_DEBUG3("%s read item:(%s) bt_status=%d", __FUNCTION__, fname, bt_status); 1129 1130 return bt_status; 1131 } 1132 1133 /******************************************************************************* 1134 ** 1135 ** Function btif_storage_write_hl_app_data 1136 ** 1137 ** Description BTIF storage API - Write HL application MDL configuration from NVRAM 1138 ** 1139 ** Returns BT_STATUS_SUCCESS if the operation was successful, 1140 ** BT_STATUS_FAIL otherwise 1141 ** 1142 *******************************************************************************/ 1143 bt_status_t btif_storage_write_hl_app_data(UINT8 app_idx, char *value, int value_size) 1144 { 1145 char fname[256]; 1146 bt_status_t bt_status = BT_STATUS_SUCCESS; 1147 1148 1149 BTIF_TRACE_DEBUG1("%s ", __FUNCTION__); 1150 sprintf(fname, "%s%d", BTIF_STORAGE_HL_APP_DATA, app_idx); 1151 bt_status = btif_storage_write_hl_data(fname, value, value_size); 1152 BTIF_TRACE_DEBUG3("%s write item:(%s) bt_status=%d", __FUNCTION__, fname, bt_status); 1153 1154 return bt_status; 1155 } 1156 1157 /******************************************************************************* 1158 ** 1159 ** Function btif_storage_read_hl_mdl_data 1160 ** 1161 ** Description BTIF storage API - Read HL application MDL configuration from NVRAM 1162 ** 1163 ** Returns BT_STATUS_SUCCESS if the operation was successful, 1164 ** BT_STATUS_FAIL otherwise 1165 ** 1166 *******************************************************************************/ 1167 bt_status_t btif_storage_read_hl_mdl_data(UINT8 app_idx, char *value, int value_size) 1168 { 1169 char fname[256], tmp[3]; 1170 bt_status_t bt_status = BT_STATUS_SUCCESS; 1171 int status, i, buf_size; 1172 char *p_buf; 1173 1174 BTIF_TRACE_DEBUG1("%s ", __FUNCTION__); 1175 sprintf(fname, "%s%d", BTIF_STORAGE_HL_APP_MDL_DATA, app_idx); 1176 bt_status = btif_storage_read_hl_data(fname, value, value_size); 1177 BTIF_TRACE_DEBUG3("%s read item:(%s) bt_status=%d", __FUNCTION__, fname, bt_status); 1178 1179 return bt_status; 1180 } 1181 1182 /******************************************************************************* 1183 ** 1184 ** Function btif_storage_write_hl_mdl_data 1185 ** 1186 ** Description BTIF storage API - Write HL application MDL configuration from NVRAM 1187 ** 1188 ** Returns BT_STATUS_SUCCESS if the operation was successful, 1189 ** BT_STATUS_FAIL otherwise 1190 ** 1191 *******************************************************************************/ 1192 bt_status_t btif_storage_write_hl_mdl_data(UINT8 app_idx, char *value, int value_size) 1193 { 1194 char fname[256]; 1195 bt_status_t bt_status = BT_STATUS_SUCCESS; 1196 int status, i, buf_size; 1197 char *p_buf; 1198 1199 BTIF_TRACE_DEBUG1("%s ", __FUNCTION__); 1200 sprintf(fname, "%s%d", BTIF_STORAGE_HL_APP_MDL_DATA, app_idx); 1201 bt_status = btif_storage_write_hl_data(fname, value, value_size); 1202 BTIF_TRACE_DEBUG3("%s write item:(%s) bt_status=%d", __FUNCTION__, fname, bt_status); 1203 1204 return bt_status; 1205 } 1206 1207 /******************************************************************************* 1208 ** 1209 ** Function btif_storage_load_autopair_device_list 1210 ** 1211 ** Description BTIF storage API - Populates auto pair device list 1212 ** 1213 ** Returns BT_STATUS_SUCCESS if the auto pair blacklist is successfully populated 1214 ** BT_STATUS_FAIL otherwise 1215 ** 1216 *******************************************************************************/ 1217 1218 bt_status_t btif_storage_load_autopair_device_list() 1219 { 1220 char *key_name, *key_value; 1221 int i=0; 1222 char linebuf[BTIF_STORAGE_MAX_LINE_SZ]; 1223 char *line; 1224 FILE *fp; 1225 1226 if(!btif_config_exist("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST, NULL)) 1227 { 1228 /* first time loading of auto pair blacklist configuration */ 1229 1230 fp = fopen (BTIF_AUTO_PAIR_CONF_FILE, "r"); 1231 1232 if (fp == NULL) 1233 { 1234 ALOGE("%s: Failed to open auto pair blacklist conf file at %s", __FUNCTION__,BTIF_AUTO_PAIR_CONF_FILE ); 1235 return BT_STATUS_FAIL; 1236 } 1237 1238 /* read through auto_pairing.conf file and create the key value pairs specific to auto pair blacklist devices */ 1239 while (fgets(linebuf, BTIF_STORAGE_MAX_LINE_SZ, fp) != NULL) 1240 { 1241 /* trip leading white spaces */ 1242 while (linebuf[i] == BTIF_AUTO_PAIR_CONF_SPACE) 1243 i++; 1244 1245 /* skip commented lines */ 1246 if (linebuf[i] == BTIF_AUTO_PAIR_CONF_COMMENT) 1247 continue; 1248 1249 line = (char*)&(linebuf[i]); 1250 1251 if (line == NULL) 1252 continue; 1253 1254 key_name = strtok(line, BTIF_AUTO_PAIR_CONF_KEY_VAL_DELIMETER); 1255 1256 if (key_name == NULL) 1257 continue; 1258 else if((strcmp(key_name, BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_ADDR) == 0) || 1259 (strcmp(key_name, BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_EXACTNAME) ==0) || 1260 (strcmp(key_name, BTIF_STORAGE_KEY_AUTOPAIR_FIXPIN_KBLIST) ==0 ) || 1261 (strcmp(key_name, BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_PARTIALNAME) == 0) || 1262 (strcmp(key_name, BTIF_STORAGE_KEY_AUTOPAIR_DYNAMIC_BLACKLIST_ADDR) == 0)) 1263 { 1264 key_value = strtok(NULL, BTIF_AUTO_PAIR_CONF_KEY_VAL_DELIMETER); 1265 btif_config_set_str("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST, key_name, key_value); 1266 } 1267 } 1268 fclose(fp); 1269 } 1270 return BT_STATUS_SUCCESS; 1271 } 1272 1273 /******************************************************************************* 1274 ** 1275 ** Function btif_storage_is_device_autopair_blacklisted 1276 ** 1277 ** Description BTIF storage API Checks if the given device is blacklisted for auto pairing 1278 ** 1279 ** Returns TRUE if the device is found in the auto pair blacklist 1280 ** FALSE otherwise 1281 ** 1282 *******************************************************************************/ 1283 BOOLEAN btif_storage_is_device_autopair_blacklisted(bt_bdaddr_t *remote_dev_addr) 1284 { 1285 char *token; 1286 int ret; 1287 bdstr_t bdstr; 1288 char *dev_name_str; 1289 uint8_t i = 0; 1290 char value[BTIF_STORAGE_MAX_LINE_SZ]; 1291 int value_size = sizeof(value); 1292 1293 bd2str(remote_dev_addr, &bdstr); 1294 1295 /* Consider only Lower Address Part from BD Address */ 1296 bdstr[8] = '\0'; 1297 1298 if(btif_config_get_str("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST, 1299 BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_ADDR, value, &value_size)) 1300 { 1301 if (strcasestr(value,bdstr) != NULL) 1302 return TRUE; 1303 } 1304 1305 dev_name_str = BTM_SecReadDevName((remote_dev_addr->address)); 1306 1307 if (dev_name_str != NULL) 1308 { 1309 value_size = sizeof(value); 1310 if(btif_config_get_str("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST, 1311 BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_EXACTNAME, value, &value_size)) 1312 { 1313 if (strstr(value,dev_name_str) != NULL) 1314 return TRUE; 1315 } 1316 value_size = sizeof(value); 1317 if(btif_config_get_str("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST, 1318 BTIF_STORAGE_KEY_AUTOPAIR_BLACKLIST_PARTIALNAME, value, &value_size)) 1319 { 1320 token = strtok(value, BTIF_AUTO_PAIR_CONF_VALUE_SEPARATOR); 1321 while (token != NULL) 1322 { 1323 if (strstr(dev_name_str, token) != NULL) 1324 return TRUE; 1325 1326 token = strtok(NULL, BTIF_AUTO_PAIR_CONF_VALUE_SEPARATOR); 1327 } 1328 } 1329 } 1330 if(btif_config_get_str("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST, 1331 BTIF_STORAGE_KEY_AUTOPAIR_DYNAMIC_BLACKLIST_ADDR, value, &value_size)) 1332 { 1333 if (strstr(value,bdstr) != NULL) 1334 return TRUE; 1335 } 1336 return FALSE; 1337 } 1338 1339 /******************************************************************************* 1340 ** 1341 ** Function btif_storage_add_device_to_autopair_blacklist 1342 ** 1343 ** Description BTIF storage API - Add a remote device to the auto pairing blacklist 1344 ** 1345 ** Returns BT_STATUS_SUCCESS if the device is successfully added to the auto pair blacklist 1346 ** BT_STATUS_FAIL otherwise 1347 ** 1348 *******************************************************************************/ 1349 bt_status_t btif_storage_add_device_to_autopair_blacklist(bt_bdaddr_t *remote_dev_addr) 1350 { 1351 int ret; 1352 bdstr_t bdstr; 1353 char linebuf[BTIF_STORAGE_MAX_LINE_SZ+20]; 1354 char input_value [20]; 1355 1356 bd2str(remote_dev_addr, &bdstr); 1357 strncpy(input_value, (char*)bdstr, 20); 1358 strncat(input_value,BTIF_AUTO_PAIR_CONF_VALUE_SEPARATOR, 20); 1359 int line_size = sizeof(linebuf); 1360 if(btif_config_get_str("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST, 1361 BTIF_STORAGE_KEY_AUTOPAIR_DYNAMIC_BLACKLIST_ADDR, linebuf, &line_size)) 1362 { 1363 /* Append this address to the dynamic List of BD address */ 1364 strncat (linebuf, input_value, BTIF_STORAGE_MAX_LINE_SZ); 1365 } 1366 else 1367 { 1368 strncpy( linebuf,input_value, BTIF_STORAGE_MAX_LINE_SZ); 1369 } 1370 1371 /* Write back the key value */ 1372 ret = btif_config_set_str("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST, 1373 BTIF_STORAGE_KEY_AUTOPAIR_DYNAMIC_BLACKLIST_ADDR, linebuf); 1374 1375 return ret ? BT_STATUS_SUCCESS:BT_STATUS_FAIL; 1376 } 1377 1378 /******************************************************************************* 1379 ** 1380 ** Function btif_storage_is_fixed_pin_zeros_keyboard 1381 ** 1382 ** Description BTIF storage API - checks if this device has fixed PIN key device list 1383 ** 1384 ** Returns TRUE if the device is found in the fixed pin keyboard device list 1385 ** FALSE otherwise 1386 ** 1387 *******************************************************************************/ 1388 BOOLEAN btif_storage_is_fixed_pin_zeros_keyboard(bt_bdaddr_t *remote_dev_addr) 1389 { 1390 int ret; 1391 bdstr_t bdstr; 1392 char *dev_name_str; 1393 uint8_t i = 0; 1394 char linebuf[BTIF_STORAGE_MAX_LINE_SZ]; 1395 1396 bd2str(remote_dev_addr, &bdstr); 1397 1398 /*consider on LAP part of BDA string*/ 1399 bdstr[8] = '\0'; 1400 1401 int line_size = sizeof(linebuf); 1402 if(btif_config_get_str("Local", BTIF_STORAGE_PATH_AUTOPAIR_BLACKLIST, 1403 BTIF_STORAGE_KEY_AUTOPAIR_FIXPIN_KBLIST, linebuf, &line_size)) 1404 { 1405 if (strcasestr(linebuf,bdstr) != NULL) 1406 return TRUE; 1407 } 1408 return FALSE; 1409 1410 } 1411