Home | History | Annotate | Download | only in gap
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2009-2013 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 #include <string.h>
     20 
     21 #include "bt_target.h"
     22 #include "gap_int.h"
     23 #include "btm_int.h"
     24 #include "gki.h"
     25 #include "btu.h"
     26 
     27 /*******************************************************************************
     28 **
     29 ** Function         GAP_SetDiscoverableMode
     30 **
     31 ** Description      This function is called to allow or disallow a service to
     32 **                  discovered (Inquiry Scans).
     33 **
     34 ** Parameters:      mode        - GAP_NON_DISCOVERABLE, GAP_LIMITED_DISCOVERABLE,
     35 **                                  or GAP_GENERAL_DISCOVERABLE
     36 **
     37 **                  duration    - Amount of time for the duration of an inquiry scan.
     38 **                                The step size is in 0.625 msec intervals.
     39 **                                Range: 0x0012 - 0x1000 (11.25 - 2560 msecs)
     40 **
     41 **                                If a value of '0' is entered the default of
     42 **                                0x0012 (11.25 msecs) will be used.
     43 **                                Note: The duration must be less than or equal to
     44 **                                the interval.
     45 **
     46 **                  interval    - Amount of time between the start of two inquiry scans.
     47 **                                The step size is in 0.625 msec intervals.
     48 **                                Range: 0x0012 - 0x1000 (11.25 - 2560 msecs)
     49 **                                If a value of '0' is entered the default of
     50 **                                0x800 (1.28 secs) will be used.
     51 **
     52 **
     53 ** Returns          BT_PASS (0) if successful,
     54 **                  GAP_ERR_ILL_PARM if a bad parameter is detected,
     55 **                  GAP_DEVICE_NOT_UP if the device is not active,
     56 **                  GAP_ERR_PROCESSING if not enough resources to carry out request
     57 **
     58 *******************************************************************************/
     59 UINT16 GAP_SetDiscoverableMode (UINT16 mode, UINT16 duration, UINT16 interval)
     60 {
     61     tBTM_STATUS status;
     62 
     63     status = BTM_SetDiscoverability(mode, duration, interval);
     64 
     65     return (gap_convert_btm_status (status));
     66 }
     67 
     68 
     69 /*******************************************************************************
     70 **
     71 ** Function         GAP_ReadDiscoverableMode
     72 **
     73 ** Description      This function is called to retrieve the current discoverable mode
     74 **                  for the local device.
     75 **
     76 ** Parameters:      duration    - pointer to the amount of time of an inquiry scan.
     77 **                                The step size is in 0.625 msec intervals.
     78 **                                Range: 0x0012 - 0x1000 (11.25 - 2560 msecs)
     79 **
     80 **                  interval    - pointer to the amount of time between the start of
     81 **                                two inquiry scans.
     82 **                                The step size is in 0.625 msec intervals.
     83 **                                Range: 0x0012 - 0x1000 (11.25 - 2560 msecs)
     84 **
     85 **
     86 ** Returns          GAP_NON_DISCOVERABLE, GAP_LIMITED_DISCOVERABLE, or
     87 **                  GAP_GENERAL_DISCOVERABLE
     88 **
     89 *******************************************************************************/
     90 UINT16 GAP_ReadDiscoverableMode (UINT16 *duration, UINT16 *interval)
     91 {
     92     return (BTM_ReadDiscoverability(duration, interval));
     93 }
     94 
     95 
     96 /*******************************************************************************
     97 **
     98 ** Function         GAP_SetConnectableMode
     99 **
    100 ** Description      This function is called to allow or disallow a
    101 **                  connections on the local device.
    102 **
    103 ** Parameters:      mode        - GAP_NON_CONNECTABLE, GAP_CONNECTABLE,
    104 **
    105 **                  duration    - Amount of time for the duration of a page scan.
    106 **                                The step size is in 0.625 msec intervals.
    107 **                                Range: 0x0012 - 0x1000 (11.25 - 2560 msecs)
    108 **
    109 **                                If a value of '0' is entered the default of
    110 **                                0x0012 (11.25 msecs) will be used.
    111 **                                Note: The duration must be less than or equal to
    112 **                                the interval.
    113 **
    114 **                  interval    - Amount of time between the start of two page scans.
    115 **                                The step size is in 0.625 msec intervals.
    116 **                                Range: 0x0012 - 0x1000 (11.25 - 2560 msecs)
    117 **                                If a value of '0' is entered the default of
    118 **                                0x800 (1.28 secs) will be used.
    119 **
    120 **
    121 ** Returns          BT_PASS (0) if successful,
    122 **                  GAP_ERR_ILL_PARM if a bad parameter is detected,
    123 **                  GAP_DEVICE_NOT_UP if the device is not active,
    124 **                  GAP_ERR_PROCESSING if not enough resources to carry out request
    125 **
    126 *******************************************************************************/
    127 UINT16 GAP_SetConnectableMode (UINT16 mode, UINT16 duration, UINT16 interval)
    128 {
    129     tBTM_STATUS status;
    130 
    131     status = BTM_SetConnectability(mode, duration, interval);
    132 
    133     return (gap_convert_btm_status (status));
    134 }
    135 
    136 
    137 /*******************************************************************************
    138 **
    139 ** Function         GAP_FindAddrByName
    140 **
    141 ** Description      This function is called to retrieve a device address given
    142 **                  a device name.  It first looks in the current local inquiry
    143 **                  database for the device with the specified name.  If not found
    144 **                  it initiates a general inquiry.  Upon completion, it retrieves
    145 **                  the name for each device until a match is found or all devices
    146 **                  have been checked.  Note:  This process can take a while to
    147 **                  complete.
    148 **
    149 ** Parameters:      devname -
    150 **
    151 **                  inqparms - pointer to the inquiry information
    152 **                      mode - GAP_GENERAL_INQUIRY or GAP_LIMITED_INQUIRY inquiry
    153 **                      duration - length in 1.28 sec intervals
    154 **                      max_resps - maximum amount of devices to search for before ending the inquiry
    155 **                      filter_cond_type - GAP_CLR_INQUIRY_FILTER, GAP_FILTER_COND_DEVICE_CLASS, or
    156 **                                         GAP_FILTER_COND_BD_ADDR
    157 **                      filter_cond - value for the filter (based on filter_cond_type)
    158 **
    159 **
    160 ** Returns          BT_PASS if the name was immediately available.  (BD_ADDR is returned)
    161 **                  GAP_CMD_INITIATED if an inquiry has been initiated
    162 **
    163 *******************************************************************************/
    164 UINT16 GAP_FindAddrByName (BD_NAME devname, tGAP_INQ_PARMS *p_inq_parms, tGAP_CALLBACK *p_addr_cb,
    165                            BD_ADDR bd_addr)
    166 {
    167     UINT16           status;
    168     tBTM_STATUS      btm_status;
    169 
    170 
    171     /* If the remote name is retrieved automatically during an inquiry search the local db first */
    172     if ((status = gap_find_local_addr_by_name (devname, bd_addr)) != BT_PASS)
    173     {
    174         /* If this code is used, the name wasn't in the current inquiry database */
    175         /* A general inquiry must now be initiated */
    176         if (gap_cb.findaddr_cb.in_use == FALSE)
    177         {
    178             gap_cb.findaddr_cb.p_cback = p_addr_cb;
    179             gap_cb.findaddr_cb.p_cur_inq = (tBTM_INQ_INFO *) NULL;     /* Reset to the beginning of the database */
    180             BCM_STRNCPY_S ((char *)gap_cb.findaddr_cb.results.devname, sizeof(gap_cb.findaddr_cb.results.devname), (char *)devname, BTM_MAX_REM_BD_NAME_LEN);
    181 
    182             /* make sure we have an end of string char */
    183             gap_cb.findaddr_cb.results.devname[BTM_MAX_REM_BD_NAME_LEN] = 0;
    184 
    185             btm_status = BTM_StartInquiry (p_inq_parms, (tBTM_INQ_RESULTS_CB *) NULL,
    186                     (tBTM_CMPL_CB *) gap_find_addr_inq_cb);
    187                 gap_cb.findaddr_cb.in_use = TRUE;
    188 
    189             /* convert the error code into a GAP code and check the results for any errors */
    190             if ((status = gap_convert_btm_status (btm_status)) == GAP_CMD_INITIATED)
    191                 gap_cb.findaddr_cb.in_use = TRUE;
    192         }
    193         else
    194             status = GAP_ERR_BUSY;
    195     }
    196 
    197     return (status);
    198 }
    199 
    200 
    201 /*******************************************************************************
    202 **
    203 ** Function         GAP_ReadConnectableMode
    204 **
    205 ** Description      This function is called to retrieve the current connectability
    206 **                  mode for the local device.
    207 **
    208 ** Parameters:      duration    - pointer to the amount of time of an page scan.
    209 **                                The step size is in 0.625 msec intervals.
    210 **                                Range: 0x0012 - 0x1000 (11.25 - 2560 msecs)
    211 **
    212 **                  interval    - pointer to the amount of time between the start of
    213 **                                two page scans.
    214 **                                The step size is in 0.625 msec intervals.
    215 **                                Range: 0x0012 - 0x1000 (11.25 - 2560 msecs)
    216 **
    217 **
    218 ** Returns          GAP_NON_CONNECTABLE, GAP_CONNECTABLE
    219 **
    220 *******************************************************************************/
    221 
    222 UINT16 GAP_ReadConnectableMode (UINT16 *duration, UINT16 *interval)
    223 {
    224     return (BTM_ReadConnectability(duration, interval));
    225 }
    226 
    227 
    228 /*******************************************************************************
    229 **
    230 ** Function         GAP_SetSecurityMode
    231 **
    232 ** Description      Set security mode for the device
    233 **
    234 ** Returns          void
    235 **
    236 *******************************************************************************/
    237 void GAP_SetSecurityMode (UINT8 sec_mode)
    238 {
    239     BTM_SetSecurityMode (sec_mode);
    240 }
    241 
    242 
    243 /*******************************************************************************
    244 **
    245 ** Function         GAP_Bond
    246 **
    247 ** Description      This function is called to perform bonding with peer device
    248 **
    249 ** Parameters:      bd_addr      - Address of the device to bond
    250 **                  pin_len      - length in bytes of the PIN Code
    251 **                  p_pin        - pointer to array with the PIN Code
    252 **                  trusted_mask - bitwise OR of trusted services (array of UINT32)
    253 **
    254 *******************************************************************************/
    255 UINT8 GAP_Bond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
    256 {
    257     return ((UINT8) BTM_SecBond (bd_addr, pin_len, p_pin, trusted_mask));
    258 }
    259 
    260 
    261 /*******************************************************************************
    262 **
    263 ** Function         GAP_SecRegister
    264 **
    265 ** Description      Application manager calls this function to register for
    266 **                  security services.  There can be one and only one application
    267 **                  saving link keys.  BTM allows only first registration.
    268 **
    269 ** Returns          TRUE if registered OK, else FALSE
    270 **
    271 *******************************************************************************/
    272 BOOLEAN  GAP_SecRegister (tBTM_APPL_INFO *p_cb_info)
    273 {
    274     return (BTM_SecRegister (p_cb_info));
    275 }
    276 
    277 
    278 /*******************************************************************************
    279 **
    280 ** Function         GAP_PinRsp
    281 **
    282 ** Description      This function is called from UI after Security Manager submitted
    283 **                  PIN code request.
    284 **
    285 ** Parameters:      bd_addr      - Address of the device for which PIN was requested
    286 **                  res          - result of the operation BTM_SUCCESS if success
    287 **                  pin_len      - length in bytes of the PIN Code
    288 **                  p_pin        - pointer to array with the PIN Code
    289 **                  trusted_mask - bitwise OR of trusted services (array of UINT32)
    290 **
    291 *******************************************************************************/
    292 void GAP_PinRsp (BD_ADDR bd_addr, UINT8 res, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
    293 {
    294     BTM_PINCodeReply (bd_addr, res, pin_len, p_pin, trusted_mask);
    295 }
    296 
    297 
    298 /*******************************************************************************
    299 **
    300 ** Function         GAP_AuthorizeRsp
    301 **
    302 ** Description      This function is called from UI after Security Manager submitted
    303 **                  authorization request
    304 **
    305 ** Parameters:      bd_addr      - Address of the device for which PIN was requested
    306 **                  res          - result of the operation BTM_SUCCESS if success
    307 **                  trusted_mask - bitwise OR of trusted services (array of UINT32)
    308 **
    309 *******************************************************************************/
    310 void GAP_AuthorizeRsp (BD_ADDR bd_addr, UINT8 res, UINT32 trusted_mask[])
    311 {
    312     BTM_DeviceAuthorized (bd_addr, res, trusted_mask);
    313 }
    314 
    315 
    316 /*******************************************************************************
    317 **
    318 ** Function         GAP_SetPairableMode
    319 **
    320 ** Description      This function is called to allow or disallow pairing
    321 **                  on the local device.
    322 **
    323 ** Parameters:      mode        - GAP_ALLOW_PAIRING, GAP_DISALLOW_PAIRING
    324 **                  connect_only_pairable - TRUE or FALSE connect only to paired devices
    325 **
    326 **                  callback    - The callback is called when a pin number is requested.
    327 **
    328 ** Returns          BT_PASS (0) if successful, or a non-zero error code
    329 **
    330 *******************************************************************************/
    331 
    332 UINT16 GAP_SetPairableMode (UINT16 mode, BOOLEAN connect_only_paired)
    333 {
    334     tBTM_STATUS btm_status;
    335     UINT16      status = BT_PASS;
    336 
    337     if (mode == GAP_ALLOW_PAIRING)
    338     {
    339         btm_status = BTM_SetConnectability(BTM_CONNECTABLE, 0, 0);
    340 
    341         if ((status = gap_convert_btm_status (btm_status)) == BT_PASS)
    342             BTM_SetPairableMode (TRUE, connect_only_paired);
    343     }
    344     else if (mode == GAP_DISALLOW_PAIRING)
    345     {
    346         BTM_SetPairableMode (FALSE, connect_only_paired);
    347     }
    348     else
    349     {
    350         GAP_TRACE_ERROR1 ("GAP_SetPairableMode: illegal mode %d", mode);
    351         status = GAP_ERR_ILL_MODE;
    352     }
    353     return (status);
    354 }
    355 
    356 
    357 /*******************************************************************************
    358 **
    359 ** Function         GAP_StartInquiry
    360 **
    361 ** Description      This function initiates a single inquiry.
    362 **
    363 ** Parameters:      p_inqparms - pointer to the inquiry information
    364 **                      mode - GAP_GENERAL_INQUIRY or GAP_LIMITED_INQUIRY inquiry
    365 **                      duration - length in 1.28 sec intervals
    366 **                      max_resps - maximum amount of devices to search for before ending the inquiry
    367 **                      filter_cond_type - GAP_CLR_INQUIRY_FILTER, GAP_FILTER_COND_DEVICE_CLASS, or
    368 **                                         GAP_FILTER_COND_BD_ADDR
    369 **                      filter_cond - value for the filter (based on filter_cond_type)
    370 **
    371 **                  p_results_cb - Pointer to the callback routine which gets called
    372 **                                 upon receipt of an inquiry result. If this field is
    373 **                                 NULL, the application is not notified.
    374 **
    375 **                  p_cmpl_cb   - Pointer to the callback routine which gets called
    376 **                                upon completion.  If this field is NULL, the
    377 **                                application is not notified when completed.
    378 **
    379 **
    380 ** Returns          BT_PASS (0) if successful,
    381 **                  GAP_ERR_ILL_MODE if a bad mode parameter was passed
    382 **                  GAP_ERR_ILL_INQ_TIME if a bad interval or duration was passed
    383 **                  GAP_ERR_NO_CTRL_BLK if out of control blocks
    384 **                  GAP_ERR_ILL_PARM if a bad parameter was detected in BTM
    385 **                  GAP_ERR_BUSY if the device already has an iquiry active
    386 **                  GAP_DEVICE_NOT_UP if the device is not initialized yet
    387 **                  GAP_ERR_PROCESSING if any other BTM error was returned
    388 **
    389 *******************************************************************************/
    390 UINT16 GAP_StartInquiry (tGAP_INQ_PARMS *p_inq_parms, tGAP_CALLBACK *p_results_cb, tGAP_CALLBACK *p_cmpl_cb)
    391 {
    392     tGAP_INFO   *p_cb;
    393     tBTM_STATUS  btm_status;
    394     UINT16       retval;
    395 
    396     /*** Make sure the parameters are valid before continuing ***/
    397     if (p_inq_parms->mode != GAP_GENERAL_INQUIRY && p_inq_parms->mode != GAP_LIMITED_INQUIRY)
    398         return (GAP_ERR_ILL_MODE);
    399 
    400     if (p_inq_parms->duration < GAP_MIN_INQUIRY_LEN   ||
    401         p_inq_parms->duration > GAP_MAX_INQUIRY_LENGTH)
    402         return (GAP_ERR_ILL_INQ_TIME);
    403 
    404     /*** get a control block for this operation ***/
    405     if ((p_cb = gap_allocate_cb()) != NULL)
    406     {
    407         p_cb->gap_cback = p_cmpl_cb;
    408         p_cb->gap_inq_rslt_cback = p_results_cb;
    409         p_cb->event = GAP_EVT_INQUIRY_COMPLETE; /* Return event expected */
    410 
    411         btm_status = BTM_StartInquiry(p_inq_parms, gap_inq_results_cb,
    412                         (tBTM_CMPL_CB *) gap_cb.btm_cback[p_cb->index]);
    413 
    414         /* convert the error code into a GAP code and check the results for any errors */
    415         if ((retval = gap_convert_btm_status (btm_status)) != GAP_CMD_INITIATED)
    416             gap_free_cb(p_cb);      /* Error starting the inquiry */
    417     }
    418     else
    419         retval = GAP_ERR_NO_CTRL_BLK;
    420 
    421     return (retval);
    422 }
    423 
    424 
    425 /*******************************************************************************
    426 **
    427 ** Function         GAP_StartPeriodicInquiry
    428 **
    429 ** Description      This function initiates a periodic inquiry.
    430 **
    431 ** Parameters:      p_inqparms - pointer to the inquiry information
    432 **                      mode - GAP_GENERAL_INQUIRY or GAP_LIMITED_INQUIRY inquiry
    433 **                      duration - length in 1.28 sec intervals
    434 **                      max_resps - maximum amount of devices to search for before ending the inquiry
    435 **                      filter_cond_type - GAP_CLR_INQUIRY_FILTER, GAP_FILTER_COND_DEVICE_CLASS, or
    436 **                                         GAP_FILTER_COND_BD_ADDR
    437 **                      filter_cond - value for the filter (based on filter_cond_type)
    438 **
    439 **                  min_time    - Minimum amount of time between consecutive inquiries.
    440 **                                The value is in 1.28 second intervals.
    441 **                                Range: 0x0002 - 0xFFFE (2.56 - 83883.52 seconds)
    442 **
    443 **                  max_time    - Maximum amount of time between consecutive inquiries.
    444 **                                The value is in 1.28 sec intervals.
    445 **                                Range: 0x0003 - 0xFFFF (3.84 - 83884.8 seconds)
    446 **
    447 **                  p_results_cb - Pointer to the callback routine which gets called
    448 **                                 upon receipt of an inquiry result. If this field is
    449 **                                 NULL, the application is not notified.
    450 **
    451 **
    452 ** Returns          BT_PASS (0) if successful,
    453 **                  GAP_ERR_ILL_MODE if a bad mode parameter was passed
    454 **                  GAP_ERR_ILL_INQ_TIME if a bad interval or duration was passed
    455 **                  GAP_ERR_NO_CTRL_BLK if out of control blocks
    456 **                  GAP_ERR_ILL_PARM if a bad parameter was detected in BTM
    457 **                  GAP_ERR_BUSY if the device already has an iquiry active
    458 **                  GAP_DEVICE_NOT_UP if the device is not initialized yet
    459 **                  GAP_ERR_PROCESSING if any other BTM error was returned
    460 **
    461 *******************************************************************************/
    462 
    463 UINT16 GAP_StartPeriodicInquiry (tGAP_INQ_PARMS *p_inq_parms, UINT16 min_time,
    464                                  UINT16 max_time, tGAP_CALLBACK *p_results_cb)
    465 {
    466     tGAP_INFO   *p_cb;
    467     tBTM_STATUS  btm_status;
    468     UINT16       retval = BT_PASS;
    469 
    470     /*** Make sure the parameters are valid before continuing ***/
    471     if (p_inq_parms->mode != GAP_GENERAL_INQUIRY && p_inq_parms->mode != GAP_LIMITED_INQUIRY)
    472         return (GAP_ERR_ILL_MODE);
    473 
    474     if (p_inq_parms->duration < GAP_MIN_INQUIRY_LEN     ||
    475         p_inq_parms->duration > GAP_MAX_INQUIRY_LENGTH  ||
    476         min_time <= p_inq_parms->duration               ||
    477         min_time < GAP_PER_INQ_MIN_MIN_PERIOD           ||
    478         min_time > GAP_PER_INQ_MAX_MIN_PERIOD           ||
    479         max_time <= min_time                            ||
    480         max_time < GAP_PER_INQ_MIN_MAX_PERIOD)
    481     {
    482         return (GAP_ERR_ILL_INQ_TIME);
    483     }
    484 
    485     /*** get a control block for this operation ***/
    486     if ((p_cb = gap_allocate_cb()) != NULL)
    487     {
    488         p_cb->gap_inq_rslt_cback = p_results_cb;
    489         p_cb->event = GAP_EVT_INQUIRY_COMPLETE; /* mark the inquiry event active */
    490 
    491         btm_status = BTM_SetPeriodicInquiryMode(p_inq_parms, max_time, min_time,
    492                                                 gap_inq_results_cb);
    493 
    494         /* convert the error code into a GAP code and check the results for any errors */
    495         if ((retval = gap_convert_btm_status (btm_status)) != GAP_CMD_INITIATED)
    496             gap_free_cb(p_cb);      /* Error starting the inquiry */
    497     }
    498     else
    499         retval = GAP_ERR_NO_CTRL_BLK;
    500 
    501     return (retval);
    502 }
    503 
    504 
    505 /*******************************************************************************
    506 **
    507 ** Function         GAP_CancelInquiry
    508 **
    509 ** Description      This function cancels a single inquiry (if in progress)
    510 **
    511 ** Parameters:      None
    512 **
    513 ** Returns          BOOLEAN (TRUE if successful, otherwise FALSE)
    514 **
    515 *******************************************************************************/
    516 UINT16 GAP_CancelInquiry(void)
    517 {
    518     tGAP_INFO   *p_cb = &gap_cb.blk[0];
    519     UINT8        x;
    520     tBTM_STATUS  btm_status;
    521     UINT16       status;
    522 
    523     btm_status = BTM_CancelInquiry();
    524     if ((status = gap_convert_btm_status (btm_status)) == BT_PASS)
    525     {
    526         /* Free the control block that is waiting for the inquiry complete event */
    527         for (x = 0; x < GAP_MAX_BLOCKS; x++, p_cb++)
    528         {
    529             if (p_cb->in_use && p_cb->event == GAP_EVT_INQUIRY_COMPLETE)
    530             {
    531                 gap_free_cb(p_cb);
    532                 return (BT_PASS);
    533             }
    534         }
    535 
    536         /* If here the control block was not found */
    537         status = GAP_ERR_NO_CTRL_BLK;
    538     }
    539 
    540     return (status);
    541 }
    542 
    543 
    544 /*******************************************************************************
    545 **
    546 ** Function         GAP_CancelPeriodicInquiry
    547 **
    548 ** Description      This function cancels a periodic inquiry (if in progress)
    549 **
    550 ** Parameters:      None
    551 **
    552 ** Returns          BOOLEAN: (TRUE if successful, otherwise FALSE)
    553 **
    554 *******************************************************************************/
    555 UINT16 GAP_CancelPeriodicInquiry(void)
    556 {
    557     tGAP_INFO   *p_cb = &gap_cb.blk[0];
    558     UINT8        x;
    559     tBTM_STATUS  btm_status;
    560     UINT16       status;
    561 
    562     btm_status = BTM_CancelPeriodicInquiry();
    563     if ((status = gap_convert_btm_status (btm_status)) == BT_PASS)
    564     {
    565         /* Free the control block that is waiting for the inquiry complete event */
    566         for (x = 0; x < GAP_MAX_BLOCKS; x++, p_cb++)
    567         {
    568             if (p_cb->in_use && p_cb->event == GAP_EVT_INQUIRY_COMPLETE)
    569             {
    570                 gap_free_cb(p_cb);
    571                 return (BT_PASS);
    572             }
    573         }
    574 
    575         /* If here the control block was not found */
    576         status = GAP_ERR_NO_CTRL_BLK;
    577     }
    578 
    579     return (status);
    580 }
    581 
    582 
    583 /*******************************************************************************
    584 **
    585 ** Function         GAP_GetFirstInquiryResult
    586 **
    587 ** Description      This function retrieves the first valid inquiry result.
    588 **
    589 ** Parameters:      p_results - pointer to the inquiry results
    590 **
    591 ** Returns          BT_PASS (0) if successful, or a non-zero error code
    592 **                  GAP_EOINQDB if no more entries in the database.
    593 **
    594 *******************************************************************************/
    595 UINT16 GAP_GetFirstInquiryResult(tGAP_INQ_RESULTS *p_results)
    596 {
    597     UINT8 *ptr;
    598 
    599     gap_cb.cur_inqptr = BTM_InqFirstResult();
    600 
    601     if (gap_cb.cur_inqptr != NULL)
    602     {
    603         memcpy(p_results, &gap_cb.cur_inqptr->results, sizeof(tBTM_INQ_RESULTS));
    604 
    605         ptr = (UINT8 *)gap_cb.cur_inqptr->results.remote_bd_addr;
    606         GAP_TRACE_EVENT6("GAP_GetFirstInqResult %02x%02x%02x%02x%02x%02x",
    607                     ptr[0],ptr[1],ptr[2],ptr[3],ptr[4],ptr[5]);
    608         return(BT_PASS);
    609     }
    610     else
    611     {
    612         GAP_TRACE_EVENT0("GAP_FirstInqResults:  No BD_ADDRs Found");
    613         memset(p_results, 0, sizeof(tBTM_INQ_RESULTS));
    614         return(GAP_EOINQDB);
    615     }
    616 }
    617 
    618 
    619 /*******************************************************************************
    620 **
    621 ** Function         GAP_GetNextInquiryResult
    622 **
    623 ** Description      This function retrieves the next valid inquiry result.
    624 **
    625 ** Parameters:      p_results  - pointer to the inquiry results
    626 **
    627 ** Returns          BT_PASS (0) if successful, or a non-zero status code
    628 **                  GAP_EOINQDB if no more entries in the database.
    629 **
    630 *******************************************************************************/
    631 UINT16 GAP_GetNextInquiryResult(tGAP_INQ_RESULTS *p_results)
    632 {
    633     UINT8 *ptr;
    634 
    635     /*** if the current inquiry db pointer is NULL then call the first entry ***/
    636     if (gap_cb.cur_inqptr)
    637     {
    638         gap_cb.cur_inqptr = BTM_InqNextResult(gap_cb.cur_inqptr);
    639         if (gap_cb.cur_inqptr != NULL)
    640         {
    641             memcpy(p_results, &gap_cb.cur_inqptr->results,
    642                    sizeof(tGAP_INQ_RESULTS));
    643 
    644             ptr = (UINT8 *)gap_cb.cur_inqptr->results.remote_bd_addr;
    645             GAP_TRACE_EVENT6("GAP_GetNextInqResult %02x%02x%02x%02x%02x%02x",
    646                         ptr[0],ptr[1],ptr[2],ptr[3],ptr[4],ptr[5]);
    647 
    648             return(BT_PASS);
    649         }
    650         else
    651         {
    652             GAP_TRACE_EVENT0("GAP_NextInqResults:  No BD_ADDRs Found");
    653             memset(p_results, 0, sizeof(tBTM_INQ_RESULTS));
    654             return(GAP_EOINQDB);
    655         }
    656     }
    657     else
    658         return (GAP_GetFirstInquiryResult(p_results));
    659 }
    660 
    661 
    662 /*******************************************************************************
    663 **
    664 ** Function         GAP_ReadLocalDeviceInfo
    665 **
    666 ** Description      This function retrieves local device information to the caller.
    667 **
    668 ** Parameters:      name        - (output) pointer to the UTF-8 encoded string representing
    669 **                                the device name.
    670 **
    671 **                  addr        - (output) pointer to the Bluetooth device address (BD_ADDR).
    672 **
    673 **                  verinfo     - (output) pointer to the LMP version information.
    674 **
    675 **                  features    - (output) pointer to the LMP features for the device.
    676 **
    677 **                  NOTE:  Return parameters that are set to NULL are not retrieved.
    678 **
    679 ** Returns          BT_PASS (0) if successful, or a non-zero error code
    680 **
    681 *******************************************************************************/
    682 
    683 UINT16 GAP_ReadLocalDeviceInfo(UINT8 *name, BD_ADDR *addr, tGAP_LMP_VERSION *verinfo,
    684                                tGAP_LMP_FEATURES *features)
    685 {
    686     return (GAP_UNSUPPORTED);
    687 }
    688 
    689 
    690 
    691 /*******************************************************************************
    692 **
    693 ** Function         GAP_GetRemoteDeviceName
    694 **
    695 ** Description      The remote name is retrieved from the specified remote device.  If
    696 **                  GAP_CMD_INITIATED is returned by the function, the command was
    697 **                  successfully sent to the controller.  The GAP_EVT_NAME_RESP event
    698 **                  is passed in the callback when the remote device name has been retrieved.
    699 **
    700 ** Parameters:      addr        - The Bluetooth device address (BD_ADDR) of the remote
    701 **                                device.
    702 **
    703 **                  callback    - pointer to the callback which is called after the
    704 **                                remote device has been retrieved.
    705 **                                p_data in the callback points to the structure containing the
    706 **                                status, device name length, and the UTF-8 encoded
    707 **                                device name. (type tBTM_REMOTE_DEV_NAME)
    708 **                                The event field in the callback is set to GAP_EVT_REM_NAME_COMPLETE.
    709 **  The callback is not called unless (GAP_CMD_INITIATED) is returned.
    710 **
    711 **
    712 ** Returns
    713 **                  GAP_CMD_INITIATED if remote search successfully initiated
    714 **                  GAP_ERR_BUSY if a remote name request is already in progress,
    715 **                  GAP_ERR_NO_CTRL_BLK if out of control blocks (too many commands pending)
    716 **                  GAP_BAD_BD_ADDR if the device address is bad,
    717 **                  GAP_DEVICE_NOT_UP if the device has not been initialized yet
    718 **                  GAP_ERR_PROCESSING if any other BTM error has been returned
    719 **
    720 *******************************************************************************/
    721 UINT16 GAP_GetRemoteDeviceName (BD_ADDR addr, tGAP_CALLBACK *callback)
    722 {
    723     tGAP_INFO   *p_cb;
    724     UINT16       retval;
    725     tBTM_STATUS  btm_status;
    726 
    727     if ((p_cb = gap_allocate_cb()) != NULL)
    728     {
    729         p_cb->gap_cback = callback;
    730         p_cb->event = GAP_EVT_REM_NAME_COMPLETE;     /* Return event expected */
    731 
    732         btm_status = BTM_ReadRemoteDeviceName (addr, gap_cb.btm_cback[p_cb->index]);
    733 
    734         /* If the name was not returned immediately, or if an error occurred, release the control block */
    735         if ((retval = gap_convert_btm_status (btm_status)) != GAP_CMD_INITIATED)
    736             gap_free_cb (p_cb);
    737     }
    738     else
    739         retval = GAP_ERR_NO_CTRL_BLK;
    740 
    741     return (retval);
    742 }
    743 
    744 /*******************************************************************************
    745 **
    746 ** Function         GAP_SetDeviceClass
    747 **
    748 ** Description      This function updates the local Device Class.
    749 **
    750 ** Parameters:
    751 **                  p_cod   - Pointer to the device class to set to
    752 **
    753 **                  cmd     - the fields of the device class to update.
    754 **                            GAP_SET_COD_MAJOR_MINOR, - overwrite major, minor class
    755 **                            GAP_SET_COD_SERVICE_CLASS - set the bits in the input
    756 **                            GAP_CLR_COD_SERVICE_CLASS - clear the bits in the input
    757 **                            GAP_SET_COD_ALL - overwrite major, minor, set the bits in service class
    758 **                            GAP_INIT_COD - overwrite major, minor, and service class
    759 **
    760 ** Returns          BT_PASS (0) if successful,
    761 **                  GAP_ERR_BUSY if a discovery is already in progress
    762 **                  GAP_ERR_ILL_PARM if an illegal parameter was detected
    763 **                  GAP_ERR_PROCESSING if any other BTM error has been returned
    764 **
    765 *******************************************************************************/
    766 UINT16 GAP_SetDeviceClass(tGAP_COD *p_cod, UINT8 cmd)
    767 {
    768     tBTM_STATUS btm_status;
    769     UINT8 *dev;
    770     UINT16 service;
    771     UINT8  minor, major;
    772     DEV_CLASS dev_class;
    773 
    774     dev = BTM_ReadDeviceClass();
    775     BTM_COD_SERVICE_CLASS( service, dev );
    776     BTM_COD_MINOR_CLASS(minor, dev );
    777     BTM_COD_MAJOR_CLASS(major, dev );
    778 
    779     switch(cmd)
    780     {
    781     case GAP_SET_COD_MAJOR_MINOR:
    782         minor = p_cod->minor & BTM_COD_MINOR_CLASS_MASK;
    783         major = p_cod->major & BTM_COD_MAJOR_CLASS_MASK;
    784         break;
    785 
    786     case GAP_SET_COD_SERVICE_CLASS:
    787         /* clear out the bits that is not SERVICE_CLASS bits */
    788         p_cod->service &= BTM_COD_SERVICE_CLASS_MASK;
    789         service = service | p_cod->service;
    790         break;
    791 
    792     case GAP_CLR_COD_SERVICE_CLASS:
    793         p_cod->service &= BTM_COD_SERVICE_CLASS_MASK;
    794         service = service & (~p_cod->service);
    795         break;
    796 
    797     case GAP_SET_COD_ALL:
    798         minor = p_cod->minor & BTM_COD_MINOR_CLASS_MASK;
    799         major = p_cod->major & BTM_COD_MAJOR_CLASS_MASK;
    800         p_cod->service &= BTM_COD_SERVICE_CLASS_MASK;
    801         service = service | p_cod->service;
    802         break;
    803 
    804     case GAP_INIT_COD:
    805         minor = p_cod->minor & BTM_COD_MINOR_CLASS_MASK;
    806         major = p_cod->major & BTM_COD_MAJOR_CLASS_MASK;
    807         service = p_cod->service & BTM_COD_SERVICE_CLASS_MASK;
    808         break;
    809 
    810     default:
    811         return GAP_ERR_ILL_PARM;
    812     }
    813 
    814     /* convert the fields into the device class type */
    815     FIELDS_TO_COD(dev_class, minor, major, service);
    816 
    817     btm_status = BTM_SetDeviceClass(dev_class);
    818     return (gap_convert_btm_status (btm_status));
    819 }
    820 
    821 /*******************************************************************************
    822 **
    823 ** Function         GAP_ReadDeviceClass
    824 **
    825 ** Description      This function reads the local Device Class.
    826 **
    827 ** Parameters:
    828 **
    829 ** Returns          PASS
    830 **
    831 *******************************************************************************/
    832 UINT16   GAP_ReadDeviceClass(tGAP_COD *p_cod)
    833 {
    834     UINT8 *dev;
    835 
    836     dev = BTM_ReadDeviceClass();
    837 
    838     BTM_COD_SERVICE_CLASS( p_cod->service, dev );
    839     BTM_COD_MINOR_CLASS( p_cod->minor, dev );
    840     BTM_COD_MAJOR_CLASS( p_cod->major, dev );
    841 
    842     return (BT_PASS);
    843 }
    844 
    845 /*******************************************************************************
    846 **
    847 ** Function         GAP_SetTraceLevel
    848 **
    849 ** Description      This function sets the trace level for GAP.  If called with
    850 **                  a value of 0xFF, it simply returns the current trace level.
    851 **
    852 ** Returns          The new or current trace level
    853 **
    854 *******************************************************************************/
    855 UINT8 GAP_SetTraceLevel (UINT8 new_level)
    856 {
    857     if (new_level != 0xFF)
    858         gap_cb.trace_level = new_level;
    859 
    860     return (gap_cb.trace_level);
    861 }
    862 
    863 /*******************************************************************************
    864 **
    865 ** Function         GAP_Init
    866 **
    867 ** Description      Initializes the control blocks used by GAP.
    868 **
    869 **                  This routine should not be called except once per
    870 **                      stack invocation.
    871 **
    872 ** Returns          Nothing
    873 **
    874 *******************************************************************************/
    875 void GAP_Init(void)
    876 {
    877     memset (&gap_cb, 0, sizeof (tGAP_CB));
    878 
    879     /*** Initialize the callbacks for BTM; Needs to be one per GAP_MAX_BLOCKS ***/
    880     gap_cb.btm_cback[0] = gap_btm_cback0;
    881 #if GAP_MAX_BLOCKS > 1
    882     gap_cb.btm_cback[1] = gap_btm_cback1;
    883 #endif
    884 #if GAP_MAX_BLOCKS > 2
    885     gap_cb.btm_cback[2] = gap_btm_cback2;
    886 #endif
    887 
    888 #if defined(GAP_INITIAL_TRACE_LEVEL)
    889     gap_cb.trace_level = GAP_INITIAL_TRACE_LEVEL;
    890 #else
    891     gap_cb.trace_level = BT_TRACE_LEVEL_NONE;    /* No traces */
    892 #endif
    893 
    894     /* Initialize the connection control block if included in build */
    895 #if GAP_CONN_INCLUDED == TRUE
    896     gap_conn_init();
    897 #endif  /* GAP_CONN_INCLUDED */
    898 
    899 #if BLE_INCLUDED == TRUE
    900     gap_attr_db_init();
    901 #endif
    902 }
    903 
    904