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