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