bta_gatts_act.cc revision a641b6fa2a25e1b5382945d13c4fa49d36084a78
1/******************************************************************************
2 *
3 *  Copyright (C) 2003-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 the GATT Server action functions for the state
22 *  machine.
23 *
24 ******************************************************************************/
25
26
27#include "bt_target.h"
28
29#if (BTA_GATT_INCLUDED == TRUE)
30
31#include "utl.h"
32#include "bt_common.h"
33#include "bta_sys.h"
34#include "bta_gatts_int.h"
35#include "bta_gatts_co.h"
36#include "btm_ble_api.h"
37#include "btif/include/btif_debug_conn.h"
38#include <string.h>
39
40static void bta_gatts_nv_save_cback(bool is_saved, tGATTS_HNDL_RANGE *p_hndl_range);
41static bool bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd, tGATTS_SRV_CHG_REQ *p_req,
42                                                tGATTS_SRV_CHG_RSP *p_rsp);
43
44static void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, uint16_t conn_id,
45                                      bool connected, tGATT_DISCONN_REASON reason,
46                                      tGATT_TRANSPORT transport);
47static void bta_gatts_send_request_cback (uint16_t conn_id,
48                                          uint32_t trans_id,
49                                          tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data);
50static void bta_gatts_cong_cback (uint16_t conn_id, bool congested);
51
52static tGATT_CBACK bta_gatts_cback =
53{
54    bta_gatts_conn_cback,
55    NULL,
56    NULL,
57    NULL,
58    bta_gatts_send_request_cback,
59    NULL,
60    bta_gatts_cong_cback
61};
62
63tGATT_APPL_INFO bta_gatts_nv_cback =
64{
65    bta_gatts_nv_save_cback,
66    bta_gatts_nv_srv_chg_cback
67};
68
69/*******************************************************************************
70**
71** Function         bta_gatts_nv_save_cback
72**
73** Description      NV save callback function.
74**
75** Parameter        is_add: true is to add a handle range; otherwise is to delete.
76** Returns          none.
77**
78*******************************************************************************/
79static void bta_gatts_nv_save_cback(bool is_add, tGATTS_HNDL_RANGE *p_hndl_range)
80{
81    bta_gatts_co_update_handle_range(is_add, (tBTA_GATTS_HNDL_RANGE *)p_hndl_range);
82}
83
84
85/*******************************************************************************
86**
87** Function         bta_gatts_nv_srv_chg_cback
88**
89** Description      NV save callback function.
90**
91** Parameter        is_add: true is to add a handle range; otherwise is to delete.
92** Returns          none.
93**
94*******************************************************************************/
95static bool bta_gatts_nv_srv_chg_cback(tGATTS_SRV_CHG_CMD cmd,
96                                              tGATTS_SRV_CHG_REQ *p_req, tGATTS_SRV_CHG_RSP *p_rsp)
97{
98    return bta_gatts_co_srv_chg((tBTA_GATTS_SRV_CHG_CMD) cmd,
99                                (tBTA_GATTS_SRV_CHG_REQ *) p_req,
100                                (tBTA_GATTS_SRV_CHG_RSP *) p_rsp);
101}
102
103
104/*******************************************************************************
105**
106** Function         bta_gatts_enable
107**
108** Description      enable BTA GATTS module.
109**
110** Returns          none.
111**
112*******************************************************************************/
113void bta_gatts_enable(tBTA_GATTS_CB *p_cb)
114{
115    uint8_t index=0;
116    tBTA_GATTS_HNDL_RANGE handle_range;
117
118    if (p_cb->enabled)
119    {
120        APPL_TRACE_DEBUG("GATTS already enabled.");
121    }
122    else
123    {
124        memset(p_cb, 0, sizeof(tBTA_GATTS_CB));
125
126        p_cb->enabled = true;
127
128        while ( bta_gatts_co_load_handle_range(index, &handle_range))
129        {
130            GATTS_AddHandleRange((tGATTS_HNDL_RANGE *)&handle_range);
131            memset(&handle_range, 0, sizeof(tGATTS_HNDL_RANGE));
132            index++;
133        }
134
135        APPL_TRACE_DEBUG("bta_gatts_enable: num of handle range added=%d", index);
136
137        if (!GATTS_NVRegister(&bta_gatts_nv_cback))
138        {
139            APPL_TRACE_ERROR("BTA GATTS NV register failed.");
140        }
141    }
142}
143
144/*******************************************************************************
145**
146** Function         bta_gatts_api_disable
147**
148** Description      disable BTA GATTS module.
149**
150** Returns          none.
151**
152*******************************************************************************/
153void bta_gatts_api_disable(tBTA_GATTS_CB *p_cb)
154{
155    uint8_t i;
156
157    if (p_cb->enabled)
158    {
159        for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
160        {
161            if (p_cb->rcb[i].in_use)
162            {
163                GATT_Deregister(p_cb->rcb[i].gatt_if);
164            }
165        }
166        memset(p_cb, 0, sizeof(tBTA_GATTS_CB));
167    }
168    else
169    {
170        APPL_TRACE_ERROR("GATTS not enabled");
171    }
172}
173
174/*******************************************************************************
175**
176** Function         bta_gatts_register
177**
178** Description      register an application.
179**
180** Returns          none.
181**
182*******************************************************************************/
183void bta_gatts_register(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg)
184{
185    tBTA_GATTS               cb_data;
186    tBTA_GATT_STATUS         status = BTA_GATT_OK;
187    uint8_t                    i, first_unuse = 0xff;
188
189    if (p_cb->enabled == false)
190    {
191        bta_gatts_enable(p_cb);
192    }
193
194    for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
195    {
196        if (p_cb->rcb[i].in_use)
197        {
198            if (bta_gatts_uuid_compare(p_cb->rcb[i].app_uuid, p_msg->api_reg.app_uuid))
199            {
200                APPL_TRACE_ERROR("application already registered.");
201                status = BTA_GATT_DUP_REG;
202                break;
203            }
204        }
205    }
206
207    if (status == BTA_GATT_OK)
208    {
209        for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
210        {
211            if (first_unuse == 0xff && !p_cb->rcb[i].in_use)
212            {
213                first_unuse = i;
214                break;
215            }
216        }
217
218        cb_data.reg_oper.server_if = BTA_GATTS_INVALID_IF;
219        memcpy(&cb_data.reg_oper.uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID));
220        if (first_unuse != 0xff)
221        {
222            APPL_TRACE_ERROR("register application first_unuse rcb_idx = %d", first_unuse);
223
224            p_cb->rcb[first_unuse].in_use = true;
225            p_cb->rcb[first_unuse].p_cback = p_msg->api_reg.p_cback;
226            memcpy(&p_cb->rcb[first_unuse].app_uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID));
227            cb_data.reg_oper.server_if      =
228            p_cb->rcb[first_unuse].gatt_if  =
229            GATT_Register(&p_msg->api_reg.app_uuid, &bta_gatts_cback);
230            if ( !p_cb->rcb[first_unuse].gatt_if) {
231                status = BTA_GATT_NO_RESOURCES;
232            } else {
233              tBTA_GATTS_INT_START_IF *p_buf =
234                  (tBTA_GATTS_INT_START_IF *)osi_malloc(sizeof(tBTA_GATTS_INT_START_IF));
235                p_buf->hdr.event = BTA_GATTS_INT_START_IF_EVT;
236                p_buf->server_if = p_cb->rcb[first_unuse].gatt_if;
237
238                bta_sys_sendmsg(p_buf);
239            }
240        } else {
241            status = BTA_GATT_NO_RESOURCES;
242        }
243
244    }
245    cb_data.reg_oper.status = status;
246    if (p_msg->api_reg.p_cback)
247        (*p_msg->api_reg.p_cback)(BTA_GATTS_REG_EVT, &cb_data);
248}
249
250
251/*******************************************************************************
252**
253** Function         bta_gatts_start_if
254**
255** Description      start an application interface.
256**
257** Returns          none.
258**
259*******************************************************************************/
260void bta_gatts_start_if(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg)
261{
262    UNUSED(p_cb);
263
264    if (bta_gatts_find_app_rcb_by_app_if(p_msg->int_start_if.server_if))
265    {
266        GATT_StartIf(p_msg->int_start_if.server_if);
267    }
268    else
269    {
270        APPL_TRACE_ERROR("Unable to start app.: Unknown interface =%d",
271            p_msg->int_start_if.server_if );
272    }
273}
274/*******************************************************************************
275**
276** Function         bta_gatts_deregister
277**
278** Description      deregister an application.
279**
280** Returns          none.
281**
282*******************************************************************************/
283void bta_gatts_deregister(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg)
284{
285    tBTA_GATT_STATUS    status = BTA_GATT_ERROR;
286    tBTA_GATTS_CBACK    *p_cback = NULL;
287    uint8_t               i;
288    tBTA_GATTS          cb_data;
289
290    cb_data.reg_oper.server_if = p_msg->api_dereg.server_if;
291    cb_data.reg_oper.status = status;
292
293    for (i = 0; i < BTA_GATTS_MAX_APP_NUM; i ++)
294    {
295        if (p_cb->rcb[i].in_use && p_cb->rcb[i].gatt_if == p_msg->api_dereg.server_if)
296        {
297            p_cback = p_cb->rcb[i].p_cback;
298            status = BTA_GATT_OK;
299
300            /* deregister the app */
301            GATT_Deregister(p_cb->rcb[i].gatt_if);
302
303            /* reset cb */
304            memset(&p_cb->rcb[i], 0, sizeof(tBTA_GATTS_RCB));
305            cb_data.reg_oper.status = status;
306            break;
307        }
308    }
309
310    if (p_cback)
311    {
312        (*p_cback)(BTA_GATTS_DEREG_EVT, &cb_data);
313    }
314    else
315    {
316        APPL_TRACE_ERROR("application not registered.");
317    }
318}
319
320/*******************************************************************************
321**
322** Function         bta_gatts_delete_service
323**
324** Description      action function to delete a service.
325**
326** Returns          none.
327**
328*******************************************************************************/
329void bta_gatts_delete_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
330{
331    tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
332    tBTA_GATTS      cb_data;
333
334    cb_data.srvc_oper.server_if = p_rcb->gatt_if;
335    // cb_data.srvc_oper.service_id = p_msg->api_add_incl_srvc.hdr.layer_specific;
336
337    if (GATTS_DeleteService(p_rcb->gatt_if,
338                            &p_srvc_cb->service_uuid,
339                            p_srvc_cb->service_id))
340    {
341        cb_data.srvc_oper.status = BTA_GATT_OK;
342        memset(p_srvc_cb, 0, sizeof(tBTA_GATTS_SRVC_CB));
343    }
344    else
345    {
346        cb_data.srvc_oper.status = BTA_GATT_ERROR;
347    }
348
349    if (p_rcb->p_cback)
350        (*p_rcb->p_cback)(BTA_GATTS_DELELTE_EVT, &cb_data);
351
352}
353
354/*******************************************************************************
355**
356** Function         bta_gatts_stop_service
357**
358** Description      action function to stop a service.
359**
360** Returns          none.
361**
362*******************************************************************************/
363void bta_gatts_stop_service(tBTA_GATTS_SRVC_CB *p_srvc_cb, tBTA_GATTS_DATA * p_msg)
364{
365    tBTA_GATTS_RCB *p_rcb = &bta_gatts_cb.rcb[p_srvc_cb->rcb_idx];
366    tBTA_GATTS      cb_data;
367    UNUSED(p_msg);
368
369    GATTS_StopService(p_srvc_cb->service_id);
370    cb_data.srvc_oper.server_if = p_rcb->gatt_if;
371    cb_data.srvc_oper.service_id = p_srvc_cb->service_id;
372    cb_data.srvc_oper.status = BTA_GATT_OK;
373    APPL_TRACE_ERROR("bta_gatts_stop_service service_id= %d", p_srvc_cb->service_id);
374
375    if (p_rcb->p_cback)
376        (*p_rcb->p_cback)(BTA_GATTS_STOP_EVT, &cb_data);
377
378}
379/*******************************************************************************
380**
381** Function         bta_gatts_send_rsp
382**
383** Description      GATTS send response.
384**
385** Returns          none.
386**
387*******************************************************************************/
388void bta_gatts_send_rsp (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
389{
390    UNUSED(p_cb);
391
392    if (GATTS_SendRsp (p_msg->api_rsp.hdr.layer_specific,
393                        p_msg->api_rsp.trans_id,
394                        p_msg->api_rsp.status,
395                        (tGATTS_RSP *)p_msg->api_rsp.p_rsp) != GATT_SUCCESS)
396    {
397        APPL_TRACE_ERROR("Sending response failed");
398    }
399
400}
401/*******************************************************************************
402**
403** Function         bta_gatts_indicate_handle
404**
405** Description      GATTS send handle value indication or notification.
406**
407** Returns          none.
408**
409*******************************************************************************/
410void bta_gatts_indicate_handle (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
411{
412    tBTA_GATTS_SRVC_CB  *p_srvc_cb;
413    tBTA_GATTS_RCB      *p_rcb = NULL;
414    tBTA_GATT_STATUS    status = BTA_GATT_ILLEGAL_PARAMETER;
415    tGATT_IF            gatt_if;
416    BD_ADDR             remote_bda;
417    tBTA_TRANSPORT transport;
418    tBTA_GATTS          cb_data;
419
420    p_srvc_cb = bta_gatts_find_srvc_cb_by_attr_id (p_cb, p_msg->api_indicate.attr_id);
421
422    if (p_srvc_cb )
423    {
424        if (GATT_GetConnectionInfor(p_msg->api_indicate.hdr.layer_specific,
425            &gatt_if, remote_bda, &transport))
426        {
427            p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
428
429            if (p_msg->api_indicate.need_confirm)
430
431                status = GATTS_HandleValueIndication (p_msg->api_indicate.hdr.layer_specific,
432                                                      p_msg->api_indicate.attr_id,
433                                                      p_msg->api_indicate.len,
434                                                      p_msg->api_indicate.value);
435            else
436                status = GATTS_HandleValueNotification (p_msg->api_indicate.hdr.layer_specific,
437                                                        p_msg->api_indicate.attr_id,
438                                                        p_msg->api_indicate.len,
439                                                        p_msg->api_indicate.value);
440
441            /* if over BR_EDR, inform PM for mode change */
442            if (transport == BTA_TRANSPORT_BR_EDR)
443            {
444                bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda);
445                bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, remote_bda);
446            }
447        }
448        else
449        {
450            APPL_TRACE_ERROR("Unknown connection ID: %d fail sending notification",
451                              p_msg->api_indicate.hdr.layer_specific);
452        }
453
454        if ((status != GATT_SUCCESS || !p_msg->api_indicate.need_confirm) &&
455            p_rcb && p_cb->rcb[p_srvc_cb->rcb_idx].p_cback)
456        {
457            cb_data.req_data.status = status;
458            cb_data.req_data.conn_id = p_msg->api_indicate.hdr.layer_specific;
459
460            (*p_rcb->p_cback)(BTA_GATTS_CONF_EVT, &cb_data);
461        }
462    }
463    else
464    {
465        APPL_TRACE_ERROR("Not an registered servce attribute ID: 0x%04x",
466                          p_msg->api_indicate.attr_id);
467    }
468}
469
470
471/*******************************************************************************
472**
473** Function         bta_gatts_open
474**
475** Description
476**
477** Returns          none.
478**
479*******************************************************************************/
480void bta_gatts_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
481{
482    tBTA_GATTS_RCB      *p_rcb=NULL;
483    tBTA_GATT_STATUS    status= BTA_GATT_ERROR;
484    uint16_t              conn_id;
485    UNUSED(p_cb);
486
487    if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_open.server_if)) != NULL)
488    {
489        /* should always get the connection ID */
490        if (GATT_Connect(p_rcb->gatt_if, p_msg->api_open.remote_bda,
491                        p_msg->api_open.is_direct, p_msg->api_open.transport))
492        {
493            status = BTA_GATT_OK;
494
495            if (GATT_GetConnIdIfConnected(p_rcb->gatt_if, p_msg->api_open.remote_bda,
496                                            &conn_id, p_msg->api_open.transport))
497            {
498                status = BTA_GATT_ALREADY_OPEN;
499            }
500        }
501    }
502    else
503    {
504        APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_open.server_if);
505    }
506
507    if (p_rcb && p_rcb->p_cback)
508        (*p_rcb->p_cback)(BTA_GATTS_OPEN_EVT,  (tBTA_GATTS *)&status);
509
510}
511/*******************************************************************************
512**
513** Function         bta_gatts_cancel_open
514**
515** Description
516**
517** Returns          none.
518**
519*******************************************************************************/
520void bta_gatts_cancel_open (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
521{
522    tBTA_GATTS_RCB      *p_rcb;
523    tBTA_GATT_STATUS    status= BTA_GATT_ERROR;
524    UNUSED(p_cb);
525
526    if ((p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_cancel_open.server_if)) != NULL)
527    {
528        if (!GATT_CancelConnect(p_rcb->gatt_if, p_msg->api_cancel_open.remote_bda,
529                                p_msg->api_cancel_open.is_direct))
530        {
531            APPL_TRACE_ERROR("bta_gatts_cancel_open failed for open request");
532        }
533        else
534        {
535            status= BTA_GATT_OK;
536        }
537    }
538    else
539    {
540        APPL_TRACE_ERROR("Inavlide server_if=%d", p_msg->api_cancel_open.server_if);
541    }
542
543    if (p_rcb && p_rcb->p_cback)
544        (*p_rcb->p_cback)(BTA_GATTS_CANCEL_OPEN_EVT,  (tBTA_GATTS *)&status);
545}
546/*******************************************************************************
547**
548** Function         bta_gatts_close
549**
550** Description
551**
552** Returns          none.
553**
554*******************************************************************************/
555void bta_gatts_close (tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
556{
557    tBTA_GATTS_RCB     *p_rcb;
558    tBTA_GATT_STATUS    status= BTA_GATT_ERROR;
559    tGATT_IF            gatt_if;
560    BD_ADDR             remote_bda;
561    tBTA_GATT_TRANSPORT transport;
562
563    UNUSED(p_cb);
564
565    if (GATT_GetConnectionInfor(p_msg->hdr.layer_specific, &gatt_if, remote_bda, &transport))
566    {
567        if (GATT_Disconnect(p_msg->hdr.layer_specific) != GATT_SUCCESS)
568        {
569            APPL_TRACE_ERROR("bta_gatts_close fail conn_id=%d", p_msg->hdr.layer_specific);
570        }
571        else
572        {
573            status= BTA_GATT_OK;
574        }
575
576        p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
577
578        if (p_rcb && p_rcb->p_cback)
579        {
580            if (transport == BTA_TRANSPORT_BR_EDR)
581                bta_sys_conn_close( BTA_ID_GATTS ,BTA_ALL_APP_ID, remote_bda);
582
583            (*p_rcb->p_cback)(BTA_GATTS_CLOSE_EVT,  (tBTA_GATTS *)&status);
584        }
585    }
586    else
587    {
588        APPL_TRACE_ERROR("Unknown connection ID: %d", p_msg->hdr.layer_specific);
589    }
590
591}
592/*******************************************************************************
593**
594** Function         bta_gatts_listen
595**
596** Description      Start or stop listening for LE connection on a GATT server
597**
598** Returns          none.
599**
600*******************************************************************************/
601void bta_gatts_listen(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA * p_msg)
602{
603    tBTA_GATTS_RCB     *p_rcb = bta_gatts_find_app_rcb_by_app_if(p_msg->api_listen.server_if);
604    tBTA_GATTS          cb_data;
605    UNUSED(p_cb);
606
607    cb_data.reg_oper.status = BTA_GATT_OK;
608    cb_data.reg_oper.server_if = p_msg->api_listen.server_if;
609
610    if (p_rcb == NULL)
611    {
612        APPL_TRACE_ERROR("Unknown GATTS application");
613        return;
614    }
615
616    if (!GATT_Listen(p_msg->api_listen.server_if,
617                     p_msg->api_listen.start,
618                     p_msg->api_listen.remote_bda))
619    {
620        cb_data.status = BTA_GATT_ERROR;
621        APPL_TRACE_ERROR("bta_gatts_listen Listen failed");
622    }
623
624    if (p_rcb->p_cback)
625        (*p_rcb->p_cback)(BTA_GATTS_LISTEN_EVT, &cb_data);
626}
627
628/*******************************************************************************
629**
630** Function         bta_gatts_request_cback
631**
632** Description      GATTS attribute request callback.
633**
634** Returns          none.
635**
636*******************************************************************************/
637static void bta_gatts_send_request_cback (uint16_t conn_id,
638                                          uint32_t trans_id,
639                                          tGATTS_REQ_TYPE req_type, tGATTS_DATA *p_data)
640{
641    tBTA_GATTS          cb_data;
642    tBTA_GATTS_RCB     *p_rcb;
643    tGATT_IF            gatt_if;
644    tBTA_GATT_TRANSPORT transport;
645
646    memset(&cb_data, 0 , sizeof(tBTA_GATTS));
647
648    if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport))
649    {
650        p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
651
652        APPL_TRACE_DEBUG("%s: conn_id=%d trans_id=%d req_type=%d",
653                         __func__, conn_id, trans_id, req_type);
654
655        if (p_rcb && p_rcb->p_cback)
656        {
657            /* if over BR_EDR, inform PM for mode change */
658            if (transport == BTA_TRANSPORT_BR_EDR)
659            {
660                bta_sys_busy(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda);
661                bta_sys_idle(BTA_ID_GATTS, BTA_ALL_APP_ID, cb_data.req_data.remote_bda);
662            }
663
664            cb_data.req_data.conn_id    = conn_id;
665            cb_data.req_data.trans_id   = trans_id;
666            cb_data.req_data.p_data     = (tBTA_GATTS_REQ_DATA *)p_data;
667
668            (*p_rcb->p_cback)(req_type,  &cb_data);
669        }
670        else
671        {
672            APPL_TRACE_ERROR("connection request on gatt_if[%d] is not interested", gatt_if);
673        }
674    }
675    else
676    {
677        APPL_TRACE_ERROR("request received on unknown connectino ID: %d", conn_id);
678    }
679}
680
681/*******************************************************************************
682**
683** Function         bta_gatts_conn_cback
684**
685** Description      connection callback.
686**
687** Returns          none.
688**
689*******************************************************************************/
690static void bta_gatts_conn_cback (tGATT_IF gatt_if, BD_ADDR bda, uint16_t conn_id,
691                                  bool connected, tGATT_DISCONN_REASON reason,
692                                  tGATT_TRANSPORT transport)
693{
694    tBTA_GATTS      cb_data;
695    uint8_t           evt = connected ? BTA_GATTS_CONNECT_EVT: BTA_GATTS_DISCONNECT_EVT;
696    tBTA_GATTS_RCB  *p_reg;
697
698    APPL_TRACE_DEBUG ("bta_gatts_conn_cback gatt_if=%d conn_id=%d connected=%d reason = 0x%04d",
699                        gatt_if, conn_id, connected, reason);
700    APPL_TRACE_DEBUG("bta_gatts_conn_cback  bda :%02x-%02x-%02x-%02x-%02x-%02x ",
701                      bda[0],  bda[1], bda[2],  bda[3], bda[4],  bda[5]);
702
703    bt_bdaddr_t bdaddr;
704    bdcpy(bdaddr.address, bda);
705    if (connected)
706        btif_debug_conn_state(bdaddr, BTIF_DEBUG_CONNECTED, GATT_CONN_UNKNOWN);
707    else
708        btif_debug_conn_state(bdaddr, BTIF_DEBUG_DISCONNECTED, reason);
709
710    p_reg = bta_gatts_find_app_rcb_by_app_if(gatt_if);
711
712    if (p_reg && p_reg->p_cback)
713    {
714        /* there is no RM for GATT */
715        if (transport == BTA_TRANSPORT_BR_EDR)
716        {
717            if (connected)
718                bta_sys_conn_open(BTA_ID_GATTS, BTA_ALL_APP_ID, bda);
719            else
720                bta_sys_conn_close( BTA_ID_GATTS ,BTA_ALL_APP_ID, bda);
721        }
722
723        cb_data.conn.conn_id = conn_id;
724        cb_data.conn.server_if = gatt_if;
725        cb_data.conn.reason = reason;
726        cb_data.conn.transport = transport;
727        memcpy(cb_data.conn.remote_bda, bda, BD_ADDR_LEN);
728        (*p_reg->p_cback)(evt, &cb_data);
729    }
730    else
731    {
732        APPL_TRACE_ERROR("bta_gatts_conn_cback server_if=%d not found",gatt_if);
733    }
734}
735
736/*******************************************************************************
737**
738** Function         bta_gatts_cong_cback
739**
740** Description      congestion callback.
741**
742** Returns          none.
743**
744*******************************************************************************/
745static void bta_gatts_cong_cback (uint16_t conn_id, bool congested)
746{
747    tBTA_GATTS_RCB *p_rcb;
748    tGATT_IF gatt_if;
749    tBTA_GATT_TRANSPORT transport;
750    tBTA_GATTS cb_data;
751
752    if (GATT_GetConnectionInfor(conn_id, &gatt_if, cb_data.req_data.remote_bda, &transport))
753    {
754        p_rcb = bta_gatts_find_app_rcb_by_app_if(gatt_if);
755
756        if (p_rcb && p_rcb->p_cback)
757        {
758            cb_data.congest.conn_id = conn_id;
759            cb_data.congest.congested = congested;
760
761            (*p_rcb->p_cback)(BTA_GATTS_CONGEST_EVT, &cb_data);
762        }
763    }
764}
765#endif /* BTA_GATT_INCLUDED */
766