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