• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  *  Copyright (C) 1999-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  *  This file contains functions for the Bluetooth Device Manager
22  *
23  ******************************************************************************/
24 
25 #include <stdlib.h>
26 #include <string.h>
27 #include <stdio.h>
28 #include <stddef.h>
29 
30 #include "bt_types.h"
31 #include "device/include/controller.h"
32 #include "bt_common.h"
33 #include "hcimsgs.h"
34 #include "btu.h"
35 #include "btm_api.h"
36 #include "btm_int.h"
37 #include "hcidefs.h"
38 #include "l2c_api.h"
39 
40 /*******************************************************************************
41 **
42 ** Function         BTM_SecAddDevice
43 **
44 ** Description      Add/modify device.  This function will be normally called
45 **                  during host startup to restore all required information
46 **                  stored in the NVRAM.
47 **
48 ** Parameters:      bd_addr          - BD address of the peer
49 **                  dev_class        - Device Class
50 **                  bd_name          - Name of the peer device.  NULL if unknown.
51 **                  features         - Remote device's features (up to 3 pages). NULL if not known
52 **                  trusted_mask     - Bitwise OR of services that do not
53 **                                     require authorization. (array of UINT32)
54 **                  link_key         - Connection link key. NULL if unknown.
55 **
56 ** Returns          TRUE if added OK, else FALSE
57 **
58 *******************************************************************************/
BTM_SecAddDevice(BD_ADDR bd_addr,DEV_CLASS dev_class,BD_NAME bd_name,UINT8 * features,UINT32 trusted_mask[],LINK_KEY link_key,UINT8 key_type,tBTM_IO_CAP io_cap,UINT8 pin_length)59 BOOLEAN BTM_SecAddDevice (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name,
60                           UINT8 *features, UINT32 trusted_mask[],
61                           LINK_KEY link_key, UINT8 key_type, tBTM_IO_CAP io_cap,
62                           UINT8 pin_length)
63 {
64     BTM_TRACE_API("%s: link key type:%x", __func__, key_type);
65 
66     tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
67     if (!p_dev_rec)
68     {
69         p_dev_rec = btm_sec_allocate_dev_rec();
70 
71         memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN);
72         p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_BR_EDR);
73 
74 #if BLE_INCLUDED == TRUE
75         /* use default value for background connection params */
76         /* update conn params, use default value for background connection params */
77         memset(&p_dev_rec->conn_params, 0xff, sizeof(tBTM_LE_CONN_PRAMS));
78 #endif
79     } else {
80         /* "Bump" timestamp for existing record */
81         p_dev_rec->timestamp = btm_cb.dev_rec_count++;
82 
83         /* TODO(eisenbach):
84          * Small refactor, but leaving original logic for now.
85          * On the surface, this does not make any sense at all. Why change the
86          * bond state for an existing device here? This logic should be verified
87          * as part of a larger refactor.
88          */
89         p_dev_rec->bond_type = BOND_TYPE_UNKNOWN;
90     }
91 
92     if (dev_class)
93         memcpy (p_dev_rec->dev_class, dev_class, DEV_CLASS_LEN);
94 
95     memset(p_dev_rec->sec_bd_name, 0, sizeof(tBTM_BD_NAME));
96 
97     if (bd_name && bd_name[0])
98     {
99         p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
100         strlcpy ((char *)p_dev_rec->sec_bd_name,
101                  (char *)bd_name, BTM_MAX_REM_BD_NAME_LEN);
102     }
103 
104     p_dev_rec->num_read_pages = 0;
105     if (features)
106     {
107         BOOLEAN found = FALSE;
108         memcpy (p_dev_rec->features, features, sizeof (p_dev_rec->features));
109         for (int i = HCI_EXT_FEATURES_PAGE_MAX; !found && i >= 0; i--)
110         {
111             for (int j = 0; j < HCI_FEATURE_BYTES_PER_PAGE; j++)
112             {
113                 if (p_dev_rec->features[i][j] != 0)
114                 {
115                     found = TRUE;
116                     p_dev_rec->num_read_pages = i + 1;
117                     break;
118                 }
119             }
120         }
121     } else {
122         memset (p_dev_rec->features, 0, sizeof (p_dev_rec->features));
123     }
124 
125     BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask);
126 
127     if (link_key)
128     {
129         BTM_TRACE_EVENT ("%s: BDA: %02x:%02x:%02x:%02x:%02x:%02x", __func__,
130                           bd_addr[0], bd_addr[1], bd_addr[2],
131                           bd_addr[3], bd_addr[4], bd_addr[5]);
132         p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN;
133         memcpy (p_dev_rec->link_key, link_key, LINK_KEY_LEN);
134         p_dev_rec->link_key_type = key_type;
135         p_dev_rec->pin_code_length = pin_length;
136 
137         if (pin_length >= 16 ||
138             key_type == BTM_LKEY_TYPE_AUTH_COMB ||
139             key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) {
140             // Set the flag if the link key was made by using either a 16 digit
141             // pin or MITM.
142             p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED | BTM_SEC_LINK_KEY_AUTHED;
143         }
144     }
145 
146 #if defined(BTIF_MIXED_MODE_INCLUDED) && (BTIF_MIXED_MODE_INCLUDED == TRUE)
147     if (key_type  < BTM_MAX_PRE_SM4_LKEY_TYPE)
148         p_dev_rec->sm4 = BTM_SM4_KNOWN;
149     else
150         p_dev_rec->sm4 = BTM_SM4_TRUE;
151 #endif
152 
153     p_dev_rec->rmt_io_caps = io_cap;
154     p_dev_rec->device_type |= BT_DEVICE_TYPE_BREDR;
155 
156     return(TRUE);
157 }
158 
159 
160 /*******************************************************************************
161 **
162 ** Function         BTM_SecDeleteDevice
163 **
164 ** Description      Free resources associated with the device.
165 **
166 ** Parameters:      bd_addr          - BD address of the peer
167 **
168 ** Returns          TRUE if removed OK, FALSE if not found or ACL link is active
169 **
170 *******************************************************************************/
BTM_SecDeleteDevice(BD_ADDR bd_addr)171 BOOLEAN BTM_SecDeleteDevice (BD_ADDR bd_addr)
172 {
173     if (BTM_IsAclConnectionUp(bd_addr, BT_TRANSPORT_LE) ||
174         BTM_IsAclConnectionUp(bd_addr, BT_TRANSPORT_BR_EDR))
175     {
176         BTM_TRACE_WARNING("%s FAILED: Cannot Delete when connection is active", __func__);
177         return FALSE;
178     }
179 
180     tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev(bd_addr);
181     if (p_dev_rec != NULL)
182     {
183         btm_sec_free_dev(p_dev_rec);
184         /* Tell controller to get rid of the link key, if it has one stored */
185         BTM_DeleteStoredLinkKey (p_dev_rec->bd_addr, NULL);
186     }
187 
188     return TRUE;
189 }
190 
191 /*******************************************************************************
192 **
193 ** Function         BTM_SecClearSecurityFlags
194 **
195 ** Description      Reset the security flags (mark as not-paired) for a given
196 **                  remove device.
197 **
198 *******************************************************************************/
BTM_SecClearSecurityFlags(BD_ADDR bd_addr)199 extern void BTM_SecClearSecurityFlags (BD_ADDR bd_addr)
200 {
201     tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev(bd_addr);
202     if (p_dev_rec == NULL)
203         return;
204 
205     p_dev_rec->sec_flags = 0;
206     p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
207     p_dev_rec->sm4 = BTM_SM4_UNKNOWN;
208 }
209 
210 /*******************************************************************************
211 **
212 ** Function         BTM_SecReadDevName
213 **
214 ** Description      Looks for the device name in the security database for the
215 **                  specified BD address.
216 **
217 ** Returns          Pointer to the name or NULL
218 **
219 *******************************************************************************/
BTM_SecReadDevName(BD_ADDR bd_addr)220 char *BTM_SecReadDevName (BD_ADDR bd_addr)
221 {
222     char *p_name = NULL;
223     tBTM_SEC_DEV_REC *p_srec;
224 
225     if ((p_srec = btm_find_dev(bd_addr)) != NULL)
226         p_name = (char *)p_srec->sec_bd_name;
227 
228     return(p_name);
229 }
230 
is_bd_addr_equal(void * data,void * context)231 bool is_bd_addr_equal(void *data, void *context)
232 {
233     tBTM_SEC_DEV_REC *p_dev_rec = data;
234     BD_ADDR *bd_addr = context;
235 
236     if (!memcmp(p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN))
237         return false;
238 
239     return true;
240 }
241 
242 /*******************************************************************************
243 **
244 ** Function         btm_sec_alloc_dev
245 **
246 ** Description      Look for the record in the device database for the record
247 **                  with specified address
248 **
249 ** Returns          Pointer to the record or NULL
250 **
251 *******************************************************************************/
btm_sec_alloc_dev(BD_ADDR bd_addr)252 tBTM_SEC_DEV_REC *btm_sec_alloc_dev (BD_ADDR bd_addr)
253 {
254     tBTM_INQ_INFO    *p_inq_info;
255     BTM_TRACE_EVENT ("btm_sec_alloc_dev");
256 
257     tBTM_SEC_DEV_REC *p_dev_rec = btm_sec_allocate_dev_rec();
258 
259     /* Check with the BT manager if details about remote device are known */
260     /* outgoing connection */
261     if ((p_inq_info = BTM_InqDbRead(bd_addr)) != NULL)
262     {
263         memcpy (p_dev_rec->dev_class, p_inq_info->results.dev_class, DEV_CLASS_LEN);
264 
265 #if BLE_INCLUDED == TRUE
266         p_dev_rec->device_type = p_inq_info->results.device_type;
267         p_dev_rec->ble.ble_addr_type = p_inq_info->results.ble_addr_type;
268 #endif
269     }
270     else if (!memcmp (bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN))
271             memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN);
272 
273 #if BLE_INCLUDED == TRUE
274     /* update conn params, use default value for background connection params */
275     memset(&p_dev_rec->conn_params, 0xff, sizeof(tBTM_LE_CONN_PRAMS));
276 #endif
277 
278     memcpy (p_dev_rec->bd_addr, bd_addr, BD_ADDR_LEN);
279 
280 #if BLE_INCLUDED == TRUE
281     p_dev_rec->ble_hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_LE);
282 #endif
283     p_dev_rec->hci_handle = BTM_GetHCIConnHandle (bd_addr, BT_TRANSPORT_BR_EDR);
284 
285     return(p_dev_rec);
286 }
287 
288 
289 /*******************************************************************************
290 **
291 ** Function         btm_sec_free_dev
292 **
293 ** Description      Mark device record as not used
294 **
295 *******************************************************************************/
btm_sec_free_dev(tBTM_SEC_DEV_REC * p_dev_rec)296 void btm_sec_free_dev (tBTM_SEC_DEV_REC *p_dev_rec)
297 {
298 #if BLE_INCLUDED == TRUE
299     /* Clear out any saved BLE keys */
300     btm_sec_clear_ble_keys (p_dev_rec);
301 #endif
302     list_remove(btm_cb.sec_dev_rec, p_dev_rec);
303 }
304 
305 /*******************************************************************************
306 **
307 ** Function         btm_dev_support_switch
308 **
309 ** Description      This function is called by the L2CAP to check if remote
310 **                  device supports role switch
311 **
312 ** Parameters:      bd_addr       - Address of the peer device
313 **
314 ** Returns          TRUE if device is known and role switch is supported
315 **
316 *******************************************************************************/
btm_dev_support_switch(BD_ADDR bd_addr)317 BOOLEAN btm_dev_support_switch (BD_ADDR bd_addr)
318 {
319     tBTM_SEC_DEV_REC  *p_dev_rec;
320     UINT8   xx;
321     BOOLEAN feature_empty = TRUE;
322 
323 #if BTM_SCO_INCLUDED == TRUE
324     /* Role switch is not allowed if a SCO is up */
325     if (btm_is_sco_active_by_bdaddr(bd_addr))
326         return(FALSE);
327 #endif
328     p_dev_rec = btm_find_dev (bd_addr);
329     if (p_dev_rec && controller_get_interface()->supports_master_slave_role_switch())
330     {
331         if (HCI_SWITCH_SUPPORTED(p_dev_rec->features[HCI_EXT_FEATURES_PAGE_0]))
332         {
333             BTM_TRACE_DEBUG("btm_dev_support_switch return TRUE (feature found)");
334             return (TRUE);
335         }
336 
337         /* If the feature field is all zero, we never received them */
338         for (xx = 0 ; xx < BD_FEATURES_LEN ; xx++)
339         {
340             if (p_dev_rec->features[HCI_EXT_FEATURES_PAGE_0][xx] != 0x00)
341             {
342                 feature_empty = FALSE; /* at least one is != 0 */
343                 break;
344             }
345         }
346 
347         /* If we don't know peer's capabilities, assume it supports Role-switch */
348         if (feature_empty)
349         {
350             BTM_TRACE_DEBUG("btm_dev_support_switch return TRUE (feature empty)");
351             return (TRUE);
352         }
353     }
354 
355     BTM_TRACE_DEBUG("btm_dev_support_switch return FALSE");
356     return(FALSE);
357 }
358 
is_handle_equal(void * data,void * context)359 bool is_handle_equal(void *data, void *context)
360 {
361     tBTM_SEC_DEV_REC *p_dev_rec = data;
362     UINT16 *handle = context;
363 
364     if (p_dev_rec->hci_handle == *handle
365 #if BLE_INCLUDED == TRUE
366      || p_dev_rec->ble_hci_handle == *handle
367 #endif
368      )
369         return false;
370 
371     return true;
372 }
373 
374 /*******************************************************************************
375 **
376 ** Function         btm_find_dev_by_handle
377 **
378 ** Description      Look for the record in the device database for the record
379 **                  with specified handle
380 **
381 ** Returns          Pointer to the record or NULL
382 **
383 *******************************************************************************/
btm_find_dev_by_handle(UINT16 handle)384 tBTM_SEC_DEV_REC *btm_find_dev_by_handle (UINT16 handle)
385 {
386     list_node_t *n = list_foreach(btm_cb.sec_dev_rec, is_handle_equal, &handle);
387     if (n)
388         return list_node(n);
389 
390     return NULL;
391 }
392 
is_address_equal(void * data,void * context)393 bool is_address_equal(void *data, void *context)
394 {
395     tBTM_SEC_DEV_REC *p_dev_rec = data;
396     BD_ADDR *bd_addr = context;
397 
398     if (!memcmp (p_dev_rec->bd_addr, *bd_addr, BD_ADDR_LEN))
399         return false;
400 #if BLE_INCLUDED == TRUE
401     // If a LE random address is looking for device record
402     if (!memcmp(p_dev_rec->ble.pseudo_addr, *bd_addr, BD_ADDR_LEN))
403         return false;
404 
405     if (btm_ble_addr_resolvable(*bd_addr, p_dev_rec))
406         return false;
407 #endif
408     return true;
409 }
410 
411 /*******************************************************************************
412 **
413 ** Function         btm_find_dev
414 **
415 ** Description      Look for the record in the device database for the record
416 **                  with specified BD address
417 **
418 ** Returns          Pointer to the record or NULL
419 **
420 *******************************************************************************/
btm_find_dev(const BD_ADDR bd_addr)421 tBTM_SEC_DEV_REC *btm_find_dev(const BD_ADDR bd_addr)
422 {
423     if (!bd_addr)
424         return NULL;
425 
426     list_node_t *n = list_foreach(btm_cb.sec_dev_rec, is_address_equal, (void*)bd_addr);
427     if (n)
428         return list_node(n);
429 
430     return NULL;
431 }
432 
433 /*******************************************************************************
434 **
435 ** Function         btm_consolidate_dev
436 5**
437 ** Description      combine security records if identified as same peer
438 **
439 ** Returns          none
440 **
441 *******************************************************************************/
btm_consolidate_dev(tBTM_SEC_DEV_REC * p_target_rec)442 void btm_consolidate_dev(tBTM_SEC_DEV_REC *p_target_rec)
443 {
444 #if BLE_INCLUDED == TRUE
445     tBTM_SEC_DEV_REC temp_rec = *p_target_rec;
446 
447     BTM_TRACE_DEBUG("%s", __func__);
448 
449     list_node_t *end = list_end(btm_cb.sec_dev_rec);
450     for (list_node_t *node = list_begin(btm_cb.sec_dev_rec); node != end; node = list_next(node)) {
451         tBTM_SEC_DEV_REC *p_dev_rec = list_node(node);
452 
453         if (p_target_rec == p_dev_rec)
454             continue;
455 
456         if (!memcmp (p_dev_rec->bd_addr, p_target_rec->bd_addr, BD_ADDR_LEN))
457         {
458             memcpy(p_target_rec, p_dev_rec, sizeof(tBTM_SEC_DEV_REC));
459             p_target_rec->ble = temp_rec.ble;
460             p_target_rec->ble_hci_handle = temp_rec.ble_hci_handle;
461             p_target_rec->enc_key_size = temp_rec.enc_key_size;
462             p_target_rec->conn_params = temp_rec.conn_params;
463             p_target_rec->device_type |= temp_rec.device_type;
464             p_target_rec->sec_flags |= temp_rec.sec_flags;
465 
466             p_target_rec->new_encryption_key_is_p256 = temp_rec.new_encryption_key_is_p256;
467             p_target_rec->no_smp_on_br = temp_rec.no_smp_on_br;
468             p_target_rec->bond_type = temp_rec.bond_type;
469 
470             /* remove the combined record */
471             list_remove(btm_cb.sec_dev_rec, p_dev_rec);
472             break;
473         }
474 
475         /* an RPA device entry is a duplicate of the target record */
476         if (btm_ble_addr_resolvable(p_dev_rec->bd_addr, p_target_rec))
477         {
478             if (memcmp(p_target_rec->ble.pseudo_addr, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0)
479             {
480                 p_target_rec->ble.ble_addr_type = p_dev_rec->ble.ble_addr_type;
481                 p_target_rec->device_type |= p_dev_rec->device_type;
482 
483                 /* remove the combined record */
484                 list_remove(btm_cb.sec_dev_rec, p_dev_rec);
485             }
486             break;
487         }
488     }
489 #endif
490 }
491 
492 /*******************************************************************************
493 **
494 ** Function         btm_find_or_alloc_dev
495 **
496 ** Description      Look for the record in the device database for the record
497 **                  with specified BD address
498 **
499 ** Returns          Pointer to the record or NULL
500 **
501 *******************************************************************************/
btm_find_or_alloc_dev(BD_ADDR bd_addr)502 tBTM_SEC_DEV_REC *btm_find_or_alloc_dev (BD_ADDR bd_addr)
503 {
504     tBTM_SEC_DEV_REC *p_dev_rec;
505     BTM_TRACE_EVENT ("btm_find_or_alloc_dev");
506     if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
507     {
508 
509         /* Allocate a new device record or reuse the oldest one */
510         p_dev_rec = btm_sec_alloc_dev (bd_addr);
511     }
512     return(p_dev_rec);
513 }
514 
515 /*******************************************************************************
516 **
517 ** Function         btm_find_oldest_dev_rec
518 **
519 ** Description      Locates the oldest device in use. It first looks for
520 **                  the oldest non-paired device.  If all devices are paired it
521 **                  returns the oldest paired device.
522 **
523 ** Returns          Pointer to the record or NULL
524 **
525 *******************************************************************************/
btm_find_oldest_dev_rec(void)526 static tBTM_SEC_DEV_REC* btm_find_oldest_dev_rec (void)
527 {
528     tBTM_SEC_DEV_REC *p_oldest = NULL;
529     UINT32       ts_oldest = 0xFFFFFFFF;
530     tBTM_SEC_DEV_REC *p_oldest_paired = NULL;
531     UINT32       ts_oldest_paired = 0xFFFFFFFF;
532 
533     list_node_t *end = list_end(btm_cb.sec_dev_rec);
534     for (list_node_t *node = list_begin(btm_cb.sec_dev_rec); node != end; node = list_next(node)) {
535         tBTM_SEC_DEV_REC *p_dev_rec = list_node(node);
536 
537         if ((p_dev_rec->sec_flags & (BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LE_LINK_KEY_KNOWN)) == 0) {
538             // Device is not paired
539             if (p_dev_rec->timestamp < ts_oldest) {
540                 p_oldest = p_dev_rec;
541                 ts_oldest = p_dev_rec->timestamp;
542             }
543         } else {
544             // Paired device
545             if (p_dev_rec->timestamp < ts_oldest_paired) {
546                 p_oldest_paired = p_dev_rec;
547                 ts_oldest_paired = p_dev_rec->timestamp;
548             }
549         }
550     }
551 
552     // If we did not find any non-paired devices, use the oldest paired one...
553     if (ts_oldest == 0xFFFFFFFF)
554         p_oldest = p_oldest_paired;
555 
556     return p_oldest;
557 }
558 
559 /*******************************************************************************
560 **
561 ** Function         btm_sec_allocate_dev_rec
562 **
563 ** Description      Attempts to allocate a new device record. If we have
564 **                  exceeded the maximum number of allowable records to
565 **                  allocate, the oldest record will be deleted to make room
566 **                  for the new record.
567 **
568 ** Returns          Pointer to the newly allocated record
569 **
570 *******************************************************************************/
btm_sec_allocate_dev_rec(void)571 tBTM_SEC_DEV_REC* btm_sec_allocate_dev_rec(void)
572 {
573     tBTM_SEC_DEV_REC *p_dev_rec = NULL;
574 
575     if (list_length(btm_cb.sec_dev_rec) > BTM_SEC_MAX_DEVICE_RECORDS)
576     {
577         p_dev_rec = btm_find_oldest_dev_rec();
578         list_remove(btm_cb.sec_dev_rec, p_dev_rec);
579     }
580 
581     p_dev_rec = osi_calloc(sizeof(tBTM_SEC_DEV_REC));
582     list_append(btm_cb.sec_dev_rec, p_dev_rec);
583 
584     // Initialize defaults
585     p_dev_rec->sec_flags = BTM_SEC_IN_USE;
586     p_dev_rec->bond_type = BOND_TYPE_UNKNOWN;
587     p_dev_rec->timestamp = btm_cb.dev_rec_count++;
588 
589     return p_dev_rec;
590 }
591 
592 /*******************************************************************************
593 **
594 ** Function         btm_get_bond_type_dev
595 **
596 ** Description      Get the bond type for a device in the device database
597 **                  with specified BD address
598 **
599 ** Returns          The device bond type if known, otherwise BOND_TYPE_UNKNOWN
600 **
601 *******************************************************************************/
btm_get_bond_type_dev(BD_ADDR bd_addr)602 tBTM_BOND_TYPE btm_get_bond_type_dev(BD_ADDR bd_addr)
603 {
604     tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev(bd_addr);
605 
606     if (p_dev_rec == NULL)
607         return BOND_TYPE_UNKNOWN;
608 
609     return p_dev_rec->bond_type;
610 }
611 
612 /*******************************************************************************
613 **
614 ** Function         btm_set_bond_type_dev
615 **
616 ** Description      Set the bond type for a device in the device database
617 **                  with specified BD address
618 **
619 ** Returns          TRUE on success, otherwise FALSE
620 **
621 *******************************************************************************/
btm_set_bond_type_dev(BD_ADDR bd_addr,tBTM_BOND_TYPE bond_type)622 BOOLEAN btm_set_bond_type_dev(BD_ADDR bd_addr, tBTM_BOND_TYPE bond_type)
623 {
624     tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev(bd_addr);
625 
626     if (p_dev_rec == NULL)
627         return FALSE;
628 
629     p_dev_rec->bond_type = bond_type;
630     return TRUE;
631 }
632