Home | History | Annotate | Download | only in gatt
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2010-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 is the implementation of the API for GATT server of BTA.
     22  *
     23  ******************************************************************************/
     24 
     25 #include "bt_target.h"
     26 
     27 #if defined(BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)
     28 
     29 #include <string.h>
     30 #include "gki.h"
     31 #include "bta_sys.h"
     32 #include "bta_gatt_api.h"
     33 #include "bta_gatts_int.h"
     34 
     35 /*****************************************************************************
     36 **  Constants
     37 *****************************************************************************/
     38 
     39 static const tBTA_SYS_REG bta_gatts_reg =
     40 {
     41     bta_gatts_hdl_event,
     42     BTA_GATTS_Disable
     43 };
     44 
     45 /*******************************************************************************
     46 **
     47 ** Function         BTA_GATTS_Disable
     48 **
     49 ** Description      This function is called to disable GATTS module
     50 **
     51 ** Parameters       None.
     52 **
     53 ** Returns          None
     54 **
     55 *******************************************************************************/
     56 void BTA_GATTS_Disable(void)
     57 {
     58     BT_HDR  *p_buf;
     59 
     60     if (bta_sys_is_register(BTA_ID_GATTS) == FALSE)
     61     {
     62         APPL_TRACE_WARNING0("GATTS Module not enabled/already disabled");
     63         return;
     64     }
     65 
     66     if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
     67     {
     68         p_buf->event = BTA_GATTS_API_DISABLE_EVT;
     69         bta_sys_sendmsg(p_buf);
     70     }
     71     bta_sys_deregister(BTA_ID_GATTS);
     72 
     73 }
     74 
     75 /*******************************************************************************
     76 **
     77 ** Function         BTA_GATTS_AppRegister
     78 **
     79 ** Description      This function is called to register application callbacks
     80 **                    with BTA GATTS module.
     81 **
     82 ** Parameters       p_app_uuid - applicaiton UUID
     83 **                  p_cback - pointer to the application callback function.
     84 **
     85 ** Returns          None
     86 **
     87 *******************************************************************************/
     88 void BTA_GATTS_AppRegister(tBT_UUID *p_app_uuid, tBTA_GATTS_CBACK *p_cback)
     89 {
     90     tBTA_GATTS_API_REG  *p_buf;
     91 
     92     /* register with BTA system manager */
     93    if (bta_sys_is_register(BTA_ID_GATTS) == FALSE)
     94    {
     95         GKI_sched_lock();
     96         bta_sys_register(BTA_ID_GATTS, &bta_gatts_reg);
     97         GKI_sched_unlock();
     98     }
     99 
    100     if ((p_buf = (tBTA_GATTS_API_REG *) GKI_getbuf(sizeof(tBTA_GATTS_API_REG))) != NULL)
    101     {
    102         p_buf->hdr.event    = BTA_GATTS_API_REG_EVT;
    103 
    104         if (p_app_uuid != NULL)
    105             memcpy(&p_buf->app_uuid, p_app_uuid, sizeof(tBT_UUID));
    106         p_buf->p_cback      = p_cback;
    107 
    108         bta_sys_sendmsg(p_buf);
    109     }
    110     return;
    111 }
    112 
    113 
    114 
    115 /*******************************************************************************
    116 **
    117 ** Function         BTA_GATTS_AppDeregister
    118 **
    119 ** Description      De-register with GATT Server.
    120 **
    121 ** Parameters       app_id: applicatino ID.
    122 **
    123 ** Returns          void
    124 **
    125 *******************************************************************************/
    126 void BTA_GATTS_AppDeregister(tBTA_GATTS_IF server_if)
    127 {
    128     tBTA_GATTS_API_DEREG  *p_buf;
    129 
    130     if ((p_buf = (tBTA_GATTS_API_DEREG *) GKI_getbuf(sizeof(tBTA_GATTS_API_DEREG))) != NULL)
    131     {
    132         p_buf->hdr.event    = BTA_GATTS_API_DEREG_EVT;
    133         p_buf->server_if    = server_if;
    134 
    135         bta_sys_sendmsg(p_buf);
    136     }
    137     return;
    138 }
    139 
    140 /*******************************************************************************
    141 **
    142 ** Function         BTA_GATTS_CreateService
    143 **
    144 ** Description      Create a service. When service creation is done, a callback
    145 **                  event BTA_GATTS_CREATE_SRVC_EVT is called to report status
    146 **                  and service ID to the profile. The service ID obtained in
    147 **                  the callback function needs to be used when adding included
    148 **                  service and characteristics/descriptors into the service.
    149 **
    150 ** Parameters       app_id: Profile ID this service is belonged to.
    151 **                  p_service_uuid: service UUID.
    152 **                  inst: instance ID number of this service.
    153 **                  num_handle: numble of handle requessted for this service.
    154 **                  is_primary: is this service a primary one or not.
    155 **
    156 ** Returns          void
    157 **
    158 *******************************************************************************/
    159 void BTA_GATTS_CreateService(tBTA_GATTS_IF server_if, tBT_UUID *p_service_uuid, UINT8 inst,
    160                              UINT16 num_handle, BOOLEAN is_primary)
    161 {
    162     tBTA_GATTS_API_CREATE_SRVC  *p_buf;
    163 
    164     if ((p_buf = (tBTA_GATTS_API_CREATE_SRVC *) GKI_getbuf(sizeof(tBTA_GATTS_API_CREATE_SRVC))) != NULL)
    165     {
    166         p_buf->hdr.event = BTA_GATTS_API_CREATE_SRVC_EVT;
    167 
    168         p_buf->server_if = server_if;
    169         p_buf->inst = inst;
    170         memcpy(&p_buf->service_uuid, p_service_uuid, sizeof(tBT_UUID));
    171         p_buf->num_handle = num_handle;
    172         p_buf->is_pri = is_primary;
    173 
    174         bta_sys_sendmsg(p_buf);
    175     }
    176     return;
    177 }
    178 /*******************************************************************************
    179 **
    180 ** Function         BTA_GATTS_AddIncludeService
    181 **
    182 ** Description      This function is called to add an included service. After included
    183 **                  service is included, a callback event BTA_GATTS_ADD_INCL_SRVC_EVT
    184 **                  is reported the included service ID.
    185 **
    186 ** Parameters       service_id: service ID to which this included service is to
    187 **                              be added.
    188 **                  included_service_id: the service ID to be included.
    189 **
    190 ** Returns          void
    191 **
    192 *******************************************************************************/
    193 void BTA_GATTS_AddIncludeService(UINT16 service_id, UINT16 included_service_id)
    194 {
    195     tBTA_GATTS_API_ADD_INCL_SRVC  *p_buf;
    196 
    197     if ((p_buf =
    198          (tBTA_GATTS_API_ADD_INCL_SRVC *) GKI_getbuf(sizeof(tBTA_GATTS_API_ADD_INCL_SRVC)))
    199         != NULL)
    200     {
    201         p_buf->hdr.event = BTA_GATTS_API_ADD_INCL_SRVC_EVT;
    202 
    203         p_buf->hdr.layer_specific = service_id;
    204         p_buf->included_service_id = included_service_id;
    205 
    206         bta_sys_sendmsg(p_buf);
    207     }
    208     return;
    209 
    210 }
    211 /*******************************************************************************
    212 **
    213 ** Function         BTA_GATTS_AddCharacteristic
    214 **
    215 ** Description      This function is called to add a characteristic into a service.
    216 **
    217 ** Parameters       service_id: service ID to which this included service is to
    218 **                              be added.
    219 **                  p_char_uuid : Characteristic UUID.
    220 **                  perm      : Characteristic value declaration attribute permission.
    221 **                  property  : Characteristic Properties
    222 **
    223 ** Returns          None
    224 **
    225 *******************************************************************************/
    226 void BTA_GATTS_AddCharacteristic (UINT16 service_id,  tBT_UUID  *p_char_uuid,
    227                                   tBTA_GATT_PERM perm, tBTA_GATT_CHAR_PROP property)
    228 {
    229     tBTA_GATTS_API_ADD_CHAR  *p_buf;
    230 
    231     if ((p_buf = (tBTA_GATTS_API_ADD_CHAR *) GKI_getbuf(sizeof(tBTA_GATTS_API_ADD_CHAR))) != NULL)
    232     {
    233         memset(p_buf, 0, sizeof(tBTA_GATTS_API_ADD_CHAR));
    234 
    235         p_buf->hdr.event = BTA_GATTS_API_ADD_CHAR_EVT;
    236         p_buf->hdr.layer_specific = service_id;
    237         p_buf->perm = perm;
    238         p_buf->property = property;
    239 
    240         if (p_char_uuid)
    241         {
    242             memcpy(&p_buf->char_uuid, p_char_uuid, sizeof(tBT_UUID));
    243         }
    244         bta_sys_sendmsg(p_buf);
    245     }
    246     return;
    247 }
    248 
    249 /*******************************************************************************
    250 **
    251 ** Function         BTA_GATTS_AddCharDescriptor
    252 **
    253 ** Description      This function is called to add characteristic descriptor. When
    254 **                  it's done, a callback event BTA_GATTS_ADD_DESCR_EVT is called
    255 **                  to report the status and an ID number for this descriptor.
    256 **
    257 ** Parameters       service_id: service ID to which this charatceristic descriptor is to
    258 **                              be added.
    259 **                  perm: descriptor access permission.
    260 **                  p_descr_uuid: descriptor UUID.
    261 **
    262 ** Returns          returns status.
    263 **
    264 *******************************************************************************/
    265 void BTA_GATTS_AddCharDescriptor (UINT16 service_id,
    266                                   tBTA_GATT_PERM perm,
    267                                   tBT_UUID  * p_descr_uuid)
    268 {
    269     tBTA_GATTS_API_ADD_DESCR  *p_buf;
    270     UINT16  len = sizeof(tBTA_GATTS_API_ADD_DESCR);
    271 
    272 
    273     if ((p_buf = (tBTA_GATTS_API_ADD_DESCR *) GKI_getbuf(len)) != NULL)
    274     {
    275         memset(p_buf, 0, len);
    276 
    277         p_buf->hdr.event = BTA_GATTS_API_ADD_DESCR_EVT;
    278         p_buf->hdr.layer_specific = service_id;
    279         p_buf->perm = perm;
    280 
    281         if (p_descr_uuid)
    282         {
    283             memcpy(&p_buf->descr_uuid, p_descr_uuid, sizeof(tBT_UUID));
    284         }
    285         bta_sys_sendmsg(p_buf);
    286     }
    287     return;
    288 
    289 }
    290 
    291 /*******************************************************************************
    292 **
    293 ** Function         BTA_GATTS_DeleteService
    294 **
    295 ** Description      This function is called to delete a service. When this is done,
    296 **                  a callback event BTA_GATTS_DELETE_EVT is report with the status.
    297 **
    298 ** Parameters       service_id: service_id to be deleted.
    299 **
    300 ** Returns          returns none.
    301 **
    302 *******************************************************************************/
    303 void  BTA_GATTS_DeleteService(UINT16 service_id)
    304 {
    305     BT_HDR  *p_buf;
    306 
    307     if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
    308     {
    309         p_buf->event = BTA_GATTS_API_DEL_SRVC_EVT;
    310 
    311         p_buf->layer_specific = service_id;
    312 
    313         bta_sys_sendmsg(p_buf);
    314     }
    315     return;
    316 
    317 }
    318 
    319 /*******************************************************************************
    320 **
    321 ** Function         BTA_GATTS_StartService
    322 **
    323 ** Description      This function is called to start a service.
    324 **
    325 ** Parameters       service_id: the service ID to be started.
    326 **                  sup_transport: supported trasnport.
    327 **
    328 ** Returns          None.
    329 **
    330 *******************************************************************************/
    331 void  BTA_GATTS_StartService(UINT16 service_id, tBTA_GATT_TRANSPORT sup_transport)
    332 {
    333     tBTA_GATTS_API_START  *p_buf;
    334 
    335     if ((p_buf = (tBTA_GATTS_API_START *) GKI_getbuf(sizeof(tBTA_GATTS_API_START))) != NULL)
    336     {
    337         p_buf->hdr.event = BTA_GATTS_API_START_SRVC_EVT;
    338 
    339         p_buf->hdr.layer_specific = service_id;
    340         p_buf->transport = sup_transport;
    341 
    342         bta_sys_sendmsg(p_buf);
    343     }
    344     return;
    345 }
    346 
    347 /*******************************************************************************
    348 **
    349 ** Function         BTA_GATTS_StopService
    350 **
    351 ** Description      This function is called to stop a service.
    352 **
    353 ** Parameters       service_id - service to be topped.
    354 **
    355 ** Returns          None
    356 **
    357 *******************************************************************************/
    358 void BTA_GATTS_StopService(UINT16 service_id)
    359 {
    360     BT_HDR  *p_buf;
    361 
    362     if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
    363     {
    364         p_buf->event = BTA_GATTS_API_STOP_SRVC_EVT;
    365 
    366         p_buf->layer_specific = service_id;
    367 
    368         bta_sys_sendmsg(p_buf);
    369     }
    370     return;
    371 }
    372 
    373 /*******************************************************************************
    374 **
    375 ** Function         BTA_GATTS_HandleValueIndication
    376 **
    377 ** Description      This function is called to read a characteristics descriptor.
    378 **
    379 ** Parameters       bda - remote device bd address to indicate.
    380 **					attr_id - attribute ID to indicate.
    381 **                  data_len - indicate data length.
    382 **                  p_data: data to indicate.
    383 **                  need_confirm - if this indication expects a confirmation or not.
    384 **
    385 ** Returns          None
    386 **
    387 *******************************************************************************/
    388 void BTA_GATTS_HandleValueIndication (UINT16 conn_id, UINT16 attr_id, UINT16 data_len,
    389                                       UINT8 *p_data, BOOLEAN need_confirm)
    390 {
    391     tBTA_GATTS_API_INDICATION  *p_buf;
    392     UINT16  len = sizeof(tBTA_GATTS_API_INDICATION);
    393 
    394     if ((p_buf = (tBTA_GATTS_API_INDICATION *) GKI_getbuf(len)) != NULL)
    395     {
    396         memset(p_buf, 0, len);
    397 
    398         p_buf->hdr.event = BTA_GATTS_API_INDICATION_EVT;
    399         p_buf->hdr.layer_specific = conn_id;
    400         p_buf->attr_id = attr_id;
    401         p_buf->need_confirm = need_confirm;
    402 
    403         if (data_len > 0 && p_data != NULL)
    404         {
    405             p_buf->len = data_len;
    406             memcpy(p_buf->value, p_data, data_len);
    407 
    408         }
    409         bta_sys_sendmsg(p_buf);
    410     }
    411     return;
    412 
    413 }
    414 /*******************************************************************************
    415 **
    416 ** Function         BTA_GATTS_SendRsp
    417 **
    418 ** Description      This function is called to send a response to a request.
    419 **
    420 ** Parameters       conn_id - connection identifier.
    421 **                  trans_id - transaction ID.
    422 **                  status - response status
    423 **                  p_msg - response data.
    424 **
    425 ** Returns          None
    426 **
    427 *******************************************************************************/
    428 void BTA_GATTS_SendRsp (UINT16 conn_id, UINT32 trans_id,
    429                         tBTA_GATT_STATUS status, tBTA_GATTS_RSP *p_msg)
    430 {
    431     tBTA_GATTS_API_RSP  *p_buf;
    432     UINT16  len = sizeof(tBTA_GATTS_API_RSP) + sizeof(tBTA_GATTS_RSP);
    433 
    434     if ((p_buf = (tBTA_GATTS_API_RSP *) GKI_getbuf(len)) != NULL)
    435     {
    436         memset(p_buf, 0, len);
    437 
    438         p_buf->hdr.event    = BTA_GATTS_API_RSP_EVT;
    439         p_buf->hdr.layer_specific = conn_id;
    440         p_buf->trans_id = trans_id;
    441         p_buf->status = status;
    442 
    443         if (p_msg != NULL)
    444         {
    445             p_buf->p_rsp = (tBTA_GATTS_RSP *)(p_buf + 1);
    446             memcpy(p_buf->p_rsp, p_msg, sizeof(tBTA_GATTS_RSP));
    447         }
    448 
    449         bta_sys_sendmsg(p_buf);
    450     }
    451     return;
    452 
    453 }
    454 
    455 
    456 
    457 /*******************************************************************************
    458 **
    459 ** Function         BTA_GATTS_Open
    460 **
    461 ** Description      Open a direct open connection or add a background auto connection
    462 **                  bd address
    463 **
    464 ** Parameters       server_if: server interface.
    465 **                  remote_bda: remote device BD address.
    466 **                  is_direct: direct connection or background auto connection
    467 **
    468 ** Returns          void
    469 **
    470 *******************************************************************************/
    471 void BTA_GATTS_Open(tBTA_GATTS_IF server_if, BD_ADDR remote_bda, BOOLEAN is_direct)
    472 {
    473     tBTA_GATTS_API_OPEN  *p_buf;
    474 
    475     if ((p_buf = (tBTA_GATTS_API_OPEN *) GKI_getbuf(sizeof(tBTA_GATTS_API_OPEN))) != NULL)
    476     {
    477         p_buf->hdr.event = BTA_GATTS_API_OPEN_EVT;
    478         p_buf->server_if = server_if;
    479         p_buf->is_direct = is_direct;
    480         memcpy(p_buf->remote_bda, remote_bda, BD_ADDR_LEN);
    481 
    482         bta_sys_sendmsg(p_buf);
    483     }
    484     return;
    485 }
    486 
    487 
    488 /*******************************************************************************
    489 **
    490 ** Function         BTA_GATTS_CancelOpen
    491 **
    492 ** Description      Cancel a direct open connection or remove a background auto connection
    493 **                  bd address
    494 **
    495 ** Parameters       server_if: server interface.
    496 **                  remote_bda: remote device BD address.
    497 **                  is_direct: direct connection or background auto connection
    498 **
    499 ** Returns          void
    500 **
    501 *******************************************************************************/
    502 void BTA_GATTS_CancelOpen(tBTA_GATTS_IF server_if, BD_ADDR remote_bda, BOOLEAN is_direct)
    503 {
    504     tBTA_GATTS_API_CANCEL_OPEN  *p_buf;
    505 
    506     if ((p_buf = (tBTA_GATTS_API_CANCEL_OPEN *) GKI_getbuf(sizeof(tBTA_GATTS_API_CANCEL_OPEN))) != NULL)
    507     {
    508         p_buf->hdr.event = BTA_GATTS_API_CANCEL_OPEN_EVT;
    509         p_buf->server_if = server_if;
    510         p_buf->is_direct = is_direct;
    511         memcpy(p_buf->remote_bda, remote_bda, BD_ADDR_LEN);
    512         bta_sys_sendmsg(p_buf);
    513     }
    514     return;
    515 }
    516 
    517 /*******************************************************************************
    518 **
    519 ** Function         BTA_GATTS_Close
    520 **
    521 ** Description      Close a connection  a remote device.
    522 **
    523 ** Parameters       conn_id: connectino ID to be closed.
    524 **
    525 ** Returns          void
    526 **
    527 *******************************************************************************/
    528 void BTA_GATTS_Close(UINT16 conn_id)
    529 {
    530     BT_HDR  *p_buf;
    531 
    532     if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
    533     {
    534         p_buf->event = BTA_GATTS_API_CLOSE_EVT;
    535         p_buf->layer_specific = conn_id;
    536         bta_sys_sendmsg(p_buf);
    537     }
    538     return;
    539 
    540 }
    541 /*******************************************************************************
    542 **
    543 ** Function         BTA_GATTS_Listen
    544 **
    545 ** Description      Start advertisement to listen for connection request for a
    546 **                  GATT server
    547 **
    548 ** Parameters       server_if: server interface.
    549 **                  start: to start or stop listening for connection
    550 **                  remote_bda: remote device BD address, if listen to all device
    551 **                              use NULL.
    552 **
    553 ** Returns          void
    554 **
    555 *******************************************************************************/
    556 void BTA_GATTS_Listen(tBTA_GATTS_IF server_if, BOOLEAN start, BD_ADDR_PTR target_bda)
    557 {
    558     tBTA_GATTS_API_LISTEN  *p_buf;
    559 
    560     if ((p_buf = (tBTA_GATTS_API_LISTEN *) GKI_getbuf((UINT16)(sizeof(tBTA_GATTS_API_LISTEN) + BD_ADDR_LEN))) != NULL)
    561     {
    562         p_buf->hdr.event = BTA_GATTS_API_LISTEN_EVT;
    563 
    564         p_buf->server_if    = server_if;
    565         p_buf->start        = start;
    566 
    567         if (target_bda)
    568         {
    569             p_buf->remote_bda = (UINT8*)(p_buf + 1);
    570             memcpy(p_buf->remote_bda, target_bda, BD_ADDR_LEN);
    571         }
    572         else
    573             p_buf->remote_bda = NULL;
    574 
    575         bta_sys_sendmsg(p_buf);
    576     }
    577     return;
    578 }
    579 
    580 #endif /* BTA_GATT_INCLUDED */
    581