gatt_api.h revision b5ba4fdbc433544de3806f8e82976898e444b491
1/****************************************************************************** 2 * 3 * Copyright (C) 1999-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#ifndef GATT_API_H 19#define GATT_API_H 20 21#include "bt_target.h" 22#include "btm_ble_api.h" 23#include "gattdefs.h" 24 25/***************************************************************************** 26 * Constants 27 ****************************************************************************/ 28/* Success code and error codes */ 29#define GATT_SUCCESS 0x00 30#define GATT_INVALID_HANDLE 0x01 31#define GATT_READ_NOT_PERMIT 0x02 32#define GATT_WRITE_NOT_PERMIT 0x03 33#define GATT_INVALID_PDU 0x04 34#define GATT_INSUF_AUTHENTICATION 0x05 35#define GATT_REQ_NOT_SUPPORTED 0x06 36#define GATT_INVALID_OFFSET 0x07 37#define GATT_INSUF_AUTHORIZATION 0x08 38#define GATT_PREPARE_Q_FULL 0x09 39#define GATT_NOT_FOUND 0x0a 40#define GATT_NOT_LONG 0x0b 41#define GATT_INSUF_KEY_SIZE 0x0c 42#define GATT_INVALID_ATTR_LEN 0x0d 43#define GATT_ERR_UNLIKELY 0x0e 44#define GATT_INSUF_ENCRYPTION 0x0f 45#define GATT_UNSUPPORT_GRP_TYPE 0x10 46#define GATT_INSUF_RESOURCE 0x11 47 48#define GATT_ILLEGAL_PARAMETER 0x87 49#define GATT_NO_RESOURCES 0x80 50#define GATT_INTERNAL_ERROR 0x81 51#define GATT_WRONG_STATE 0x82 52#define GATT_DB_FULL 0x83 53#define GATT_BUSY 0x84 54#define GATT_ERROR 0x85 55#define GATT_CMD_STARTED 0x86 56#define GATT_PENDING 0x88 57#define GATT_AUTH_FAIL 0x89 58#define GATT_MORE 0x8a 59#define GATT_INVALID_CFG 0x8b 60#define GATT_SERVICE_STARTED 0x8c 61#define GATT_ENCRYPED_MITM GATT_SUCCESS 62#define GATT_ENCRYPED_NO_MITM 0x8d 63#define GATT_NOT_ENCRYPTED 0x8e 64#define GATT_CONGESTED 0x8f 65 66/* 0xE0 ~ 0xFC reserved for future use */ 67 68/* Client Characteristic Configuration Descriptor Improperly Configured */ 69#define GATT_CCC_CFG_ERR 0xFD 70/* Procedure Already in progress */ 71#define GATT_PRC_IN_PROGRESS 0xFE 72/* Attribute value out of range */ 73#define GATT_OUT_OF_RANGE 0xFF 74typedef uint8_t tGATT_STATUS; 75 76#define GATT_RSP_ERROR 0x01 77#define GATT_REQ_MTU 0x02 78#define GATT_RSP_MTU 0x03 79#define GATT_REQ_FIND_INFO 0x04 80#define GATT_RSP_FIND_INFO 0x05 81#define GATT_REQ_FIND_TYPE_VALUE 0x06 82#define GATT_RSP_FIND_TYPE_VALUE 0x07 83#define GATT_REQ_READ_BY_TYPE 0x08 84#define GATT_RSP_READ_BY_TYPE 0x09 85#define GATT_REQ_READ 0x0A 86#define GATT_RSP_READ 0x0B 87#define GATT_REQ_READ_BLOB 0x0C 88#define GATT_RSP_READ_BLOB 0x0D 89#define GATT_REQ_READ_MULTI 0x0E 90#define GATT_RSP_READ_MULTI 0x0F 91#define GATT_REQ_READ_BY_GRP_TYPE 0x10 92#define GATT_RSP_READ_BY_GRP_TYPE 0x11 93/* 0001-0010 (write)*/ 94#define GATT_REQ_WRITE 0x12 95#define GATT_RSP_WRITE 0x13 96/* changed in V4.0 01001-0010(write cmd)*/ 97#define GATT_CMD_WRITE 0x52 98#define GATT_REQ_PREPARE_WRITE 0x16 99#define GATT_RSP_PREPARE_WRITE 0x17 100#define GATT_REQ_EXEC_WRITE 0x18 101#define GATT_RSP_EXEC_WRITE 0x19 102#define GATT_HANDLE_VALUE_NOTIF 0x1B 103#define GATT_HANDLE_VALUE_IND 0x1D 104#define GATT_HANDLE_VALUE_CONF 0x1E 105/* changed in V4.0 1101-0010 (signed write) see write cmd above*/ 106#define GATT_SIGN_CMD_WRITE 0xD2 107/* 0x1E = 30 + 1 = 31*/ 108#define GATT_OP_CODE_MAX (GATT_HANDLE_VALUE_CONF + 1) 109 110#define GATT_HANDLE_IS_VALID(x) ((x) != 0) 111 112#define GATT_CONN_UNKNOWN 0 113/* general L2cap failure */ 114#define GATT_CONN_L2C_FAILURE 1 115/* 0x08 connection timeout */ 116#define GATT_CONN_TIMEOUT HCI_ERR_CONNECTION_TOUT 117/* 0x13 connection terminate by peer user */ 118#define GATT_CONN_TERMINATE_PEER_USER HCI_ERR_PEER_USER 119/* 0x16 connectionterminated by local host */ 120#define GATT_CONN_TERMINATE_LOCAL_HOST HCI_ERR_CONN_CAUSE_LOCAL_HOST 121/* 0x03E connection fail to establish */ 122#define GATT_CONN_FAIL_ESTABLISH HCI_ERR_CONN_FAILED_ESTABLISHMENT 123/* 0x22 connection fail for LMP response tout */ 124#define GATT_CONN_LMP_TIMEOUT HCI_ERR_LMP_RESPONSE_TIMEOUT 125/* 0x0100 L2CAP connection cancelled */ 126#define GATT_CONN_CANCEL L2CAP_CONN_CANCEL 127typedef uint16_t tGATT_DISCONN_REASON; 128 129/* MAX GATT MTU size 130*/ 131#ifndef GATT_MAX_MTU_SIZE 132#define GATT_MAX_MTU_SIZE 517 133#endif 134 135/* max legth of an attribute value 136*/ 137#ifndef GATT_MAX_ATTR_LEN 138#define GATT_MAX_ATTR_LEN 600 139#endif 140 141/* default GATT MTU size over LE link 142*/ 143#define GATT_DEF_BLE_MTU_SIZE 23 144 145/* invalid connection ID 146*/ 147#define GATT_INVALID_CONN_ID 0xFFFF 148 149#ifndef GATT_CL_MAX_LCB 150#define GATT_CL_MAX_LCB 22 151#endif 152 153#ifndef GATT_MAX_SCCB 154#define GATT_MAX_SCCB 10 155#endif 156 157/* GATT notification caching timer, default to be three seconds 158*/ 159#ifndef GATTC_NOTIF_TIMEOUT 160#define GATTC_NOTIF_TIMEOUT 3 161#endif 162 163/***************************************************************************** 164 * GATT Structure Definition 165 ****************************************************************************/ 166 167/* Attribute permissions 168*/ 169#define GATT_PERM_READ (1 << 0) /* bit 0 */ 170#define GATT_PERM_READ_ENCRYPTED (1 << 1) /* bit 1 */ 171#define GATT_PERM_READ_ENC_MITM (1 << 2) /* bit 2 */ 172#define GATT_PERM_WRITE (1 << 4) /* bit 4 */ 173#define GATT_PERM_WRITE_ENCRYPTED (1 << 5) /* bit 5 */ 174#define GATT_PERM_WRITE_ENC_MITM (1 << 6) /* bit 6 */ 175#define GATT_PERM_WRITE_SIGNED (1 << 7) /* bit 7 */ 176#define GATT_PERM_WRITE_SIGNED_MITM (1 << 8) /* bit 8 */ 177typedef uint16_t tGATT_PERM; 178 179/* the MS nibble of tGATT_PERM; key size 7=0; size 16=9 */ 180#define GATT_ENCRYPT_KEY_SIZE_MASK (0xF000) 181 182#define GATT_READ_ALLOWED \ 183 (GATT_PERM_READ | GATT_PERM_READ_ENCRYPTED | GATT_PERM_READ_ENC_MITM) 184#define GATT_READ_AUTH_REQUIRED (GATT_PERM_READ_ENCRYPTED) 185#define GATT_READ_MITM_REQUIRED (GATT_PERM_READ_ENC_MITM) 186#define GATT_READ_ENCRYPTED_REQUIRED \ 187 (GATT_PERM_READ_ENCRYPTED | GATT_PERM_READ_ENC_MITM) 188 189#define GATT_WRITE_ALLOWED \ 190 (GATT_PERM_WRITE | GATT_PERM_WRITE_ENCRYPTED | GATT_PERM_WRITE_ENC_MITM | \ 191 GATT_PERM_WRITE_SIGNED | GATT_PERM_WRITE_SIGNED_MITM) 192 193#define GATT_WRITE_AUTH_REQUIRED \ 194 (GATT_PERM_WRITE_ENCRYPTED | GATT_PERM_WRITE_SIGNED) 195 196#define GATT_WRITE_MITM_REQUIRED \ 197 (GATT_PERM_WRITE_ENC_MITM | GATT_PERM_WRITE_SIGNED_MITM) 198 199#define GATT_WRITE_ENCRYPTED_PERM \ 200 (GATT_PERM_WRITE_ENCRYPTED | GATT_PERM_WRITE_ENC_MITM) 201 202#define GATT_WRITE_SIGNED_PERM \ 203 (GATT_PERM_WRITE_SIGNED | GATT_PERM_WRITE_SIGNED_MITM) 204 205/* Characteristic properties 206*/ 207#define GATT_CHAR_PROP_BIT_BROADCAST (1 << 0) 208#define GATT_CHAR_PROP_BIT_READ (1 << 1) 209#define GATT_CHAR_PROP_BIT_WRITE_NR (1 << 2) 210#define GATT_CHAR_PROP_BIT_WRITE (1 << 3) 211#define GATT_CHAR_PROP_BIT_NOTIFY (1 << 4) 212#define GATT_CHAR_PROP_BIT_INDICATE (1 << 5) 213#define GATT_CHAR_PROP_BIT_AUTH (1 << 6) 214#define GATT_CHAR_PROP_BIT_EXT_PROP (1 << 7) 215typedef uint8_t tGATT_CHAR_PROP; 216 217/* Format of the value of a characteristic. enumeration type 218*/ 219enum { 220 GATT_FORMAT_RES, /* rfu */ 221 GATT_FORMAT_BOOL, /* 0x01 boolean */ 222 GATT_FORMAT_2BITS, /* 0x02 2 bit */ 223 GATT_FORMAT_NIBBLE, /* 0x03 nibble */ 224 GATT_FORMAT_UINT8, /* 0x04 uint8 */ 225 GATT_FORMAT_UINT12, /* 0x05 uint12 */ 226 GATT_FORMAT_UINT16, /* 0x06 uint16 */ 227 GATT_FORMAT_UINT24, /* 0x07 uint24 */ 228 GATT_FORMAT_UINT32, /* 0x08 uint32 */ 229 GATT_FORMAT_UINT48, /* 0x09 uint48 */ 230 GATT_FORMAT_UINT64, /* 0x0a uint64 */ 231 GATT_FORMAT_UINT128, /* 0x0B uint128 */ 232 GATT_FORMAT_SINT8, /* 0x0C signed 8 bit integer */ 233 GATT_FORMAT_SINT12, /* 0x0D signed 12 bit integer */ 234 GATT_FORMAT_SINT16, /* 0x0E signed 16 bit integer */ 235 GATT_FORMAT_SINT24, /* 0x0F signed 24 bit integer */ 236 GATT_FORMAT_SINT32, /* 0x10 signed 32 bit integer */ 237 GATT_FORMAT_SINT48, /* 0x11 signed 48 bit integer */ 238 GATT_FORMAT_SINT64, /* 0x12 signed 64 bit integer */ 239 GATT_FORMAT_SINT128, /* 0x13 signed 128 bit integer */ 240 GATT_FORMAT_FLOAT32, /* 0x14 float 32 */ 241 GATT_FORMAT_FLOAT64, /* 0x15 float 64*/ 242 GATT_FORMAT_SFLOAT, /* 0x16 IEEE-11073 16 bit SFLOAT */ 243 GATT_FORMAT_FLOAT, /* 0x17 IEEE-11073 32 bit SFLOAT */ 244 GATT_FORMAT_DUINT16, /* 0x18 IEEE-20601 format */ 245 GATT_FORMAT_UTF8S, /* 0x19 UTF-8 string */ 246 GATT_FORMAT_UTF16S, /* 0x1a UTF-16 string */ 247 GATT_FORMAT_STRUCT, /* 0x1b Opaque structure*/ 248 GATT_FORMAT_MAX /* 0x1c or above reserved */ 249}; 250typedef uint8_t tGATT_FORMAT; 251 252/* Characteristic Presentation Format Descriptor value 253*/ 254typedef struct { 255 uint16_t unit; /* as UUIUD defined by SIG */ 256 uint16_t descr; /* as UUID as defined by SIG */ 257 tGATT_FORMAT format; 258 int8_t exp; 259 uint8_t name_spc; /* The name space of the description */ 260} tGATT_CHAR_PRES; 261 262/* Characteristic Report reference Descriptor format 263*/ 264typedef struct { 265 uint8_t rpt_id; /* report ID */ 266 uint8_t rpt_type; /* report type */ 267} tGATT_CHAR_RPT_REF; 268 269#define GATT_VALID_RANGE_MAX_SIZE 16 270typedef struct { 271 uint8_t format; 272 uint16_t len; 273 uint8_t lower_range[GATT_VALID_RANGE_MAX_SIZE]; /* in little endian format */ 274 uint8_t upper_range[GATT_VALID_RANGE_MAX_SIZE]; 275} tGATT_VALID_RANGE; 276 277/* Characteristic Aggregate Format attribute value 278*/ 279#define GATT_AGGR_HANDLE_NUM_MAX 10 280typedef struct { 281 uint8_t num_handle; 282 uint16_t handle_list[GATT_AGGR_HANDLE_NUM_MAX]; 283} tGATT_CHAR_AGGRE; 284 285/* Characteristic descriptor: Extended Properties value 286*/ 287/* permits reliable writes of the Characteristic Value */ 288#define GATT_CHAR_BIT_REL_WRITE 0x0001 289/* permits writes to the characteristic descriptor */ 290#define GATT_CHAR_BIT_WRITE_AUX 0x0002 291 292/* characteristic descriptor: client configuration value 293*/ 294#define GATT_CLT_CONFIG_NONE 0x0000 295#define GATT_CLT_CONFIG_NOTIFICATION 0x0001 296#define GATT_CLT_CONFIG_INDICATION 0x0002 297typedef uint16_t tGATT_CLT_CHAR_CONFIG; 298 299/* characteristic descriptor: server configuration value 300*/ 301#define GATT_SVR_CONFIG_NONE 0x0000 302#define GATT_SVR_CONFIG_BROADCAST 0x0001 303typedef uint16_t tGATT_SVR_CHAR_CONFIG; 304 305/* Characteristic descriptor: Extended Properties value 306*/ 307/* permits reliable writes of the Characteristic Value */ 308#define GATT_CHAR_BIT_REL_WRITE 0x0001 309/* permits writes to the characteristic descriptor */ 310#define GATT_CHAR_BIT_WRITE_AUX 0x0002 311 312/* authentication requirement 313*/ 314#define GATT_AUTH_REQ_NONE 0 315#define GATT_AUTH_REQ_NO_MITM 1 /* unauthenticated encryption */ 316#define GATT_AUTH_REQ_MITM 2 /* authenticated encryption */ 317#define GATT_AUTH_REQ_SIGNED_NO_MITM 3 318#define GATT_AUTH_REQ_SIGNED_MITM 4 319typedef uint8_t tGATT_AUTH_REQ; 320 321/* Attribute Value structure 322*/ 323typedef struct { 324 uint16_t conn_id; 325 uint16_t handle; /* attribute handle */ 326 uint16_t offset; /* attribute value offset, if no offfset is needed for the 327 command, ignore it */ 328 uint16_t len; /* length of attribute value */ 329 tGATT_AUTH_REQ auth_req; /* authentication request */ 330 uint8_t value[GATT_MAX_ATTR_LEN]; /* the actual attribute value */ 331} tGATT_VALUE; 332 333/* Union of the event data which is used in the server respond API to carry the 334 * server response information 335*/ 336typedef union { 337 /* data type member event */ 338 tGATT_VALUE attr_value; /* READ, HANDLE_VALUE_IND, PREPARE_WRITE */ 339 /* READ_BLOB, READ_BY_TYPE */ 340 uint16_t handle; /* WRITE, WRITE_BLOB */ 341 342} tGATTS_RSP; 343 344/* Transports for the primary service */ 345#define GATT_TRANSPORT_LE BT_TRANSPORT_LE 346#define GATT_TRANSPORT_BR_EDR BT_TRANSPORT_BR_EDR 347#define GATT_TRANSPORT_LE_BR_EDR (BT_TRANSPORT_LE | BT_TRANSPORT_BR_EDR) 348typedef uint8_t tGATT_TRANSPORT; 349 350#define GATT_PREP_WRITE_CANCEL 0x00 351#define GATT_PREP_WRITE_EXEC 0x01 352typedef uint8_t tGATT_EXEC_FLAG; 353 354/* read request always based on UUID */ 355typedef struct { 356 uint16_t handle; 357 uint16_t offset; 358 bool is_long; 359 bt_gatt_db_attribute_type_t 360 gatt_type; /* are we writing characteristic or descriptor */ 361} tGATT_READ_REQ; 362 363/* write request data */ 364typedef struct { 365 uint16_t handle; /* attribute handle */ 366 uint16_t offset; /* attribute value offset, if no offfset is needed for the 367 command, ignore it */ 368 uint16_t len; /* length of attribute value */ 369 uint8_t value[GATT_MAX_ATTR_LEN]; /* the actual attribute value */ 370 bool need_rsp; /* need write response */ 371 bool is_prep; /* is prepare write */ 372 bt_gatt_db_attribute_type_t 373 gatt_type; /* are we writing characteristic or descriptor */ 374} tGATT_WRITE_REQ; 375 376/* callback data for server access request from client */ 377typedef union { 378 tGATT_READ_REQ read_req; /* read request, read by Type, read blob */ 379 380 tGATT_WRITE_REQ write_req; /* write */ 381 /* prepare write */ 382 /* write blob */ 383 uint16_t handle; /* handle value confirmation */ 384 uint16_t mtu; /* MTU exchange request */ 385 tGATT_EXEC_FLAG exec_write; /* execute write */ 386} tGATTS_DATA; 387 388typedef uint8_t tGATT_SERV_IF; /* GATT Service Interface */ 389 390enum { 391 GATTS_REQ_TYPE_READ_CHARACTERISTIC = 1, /* Char read request */ 392 GATTS_REQ_TYPE_READ_DESCRIPTOR, /* Desc read request */ 393 GATTS_REQ_TYPE_WRITE_CHARACTERISTIC, /* Char write request */ 394 GATTS_REQ_TYPE_WRITE_DESCRIPTOR, /* Desc write request */ 395 GATTS_REQ_TYPE_WRITE_EXEC, /* Execute write */ 396 GATTS_REQ_TYPE_MTU, /* MTU exchange information */ 397 GATTS_REQ_TYPE_CONF /* handle value confirmation */ 398}; 399typedef uint8_t tGATTS_REQ_TYPE; 400 401/* Client Used Data Structure 402*/ 403/* definition of different discovery types */ 404enum { 405 GATT_DISC_SRVC_ALL = 1, /* discover all services */ 406 GATT_DISC_SRVC_BY_UUID, /* discover service of a special type */ 407 GATT_DISC_INC_SRVC, /* discover the included service within a service */ 408 GATT_DISC_CHAR, /* discover characteristics of a service with/without type 409 requirement */ 410 GATT_DISC_CHAR_DSCPT, /* discover characteristic descriptors of a character */ 411 GATT_DISC_MAX /* maximnun discover type */ 412}; 413typedef uint8_t tGATT_DISC_TYPE; 414 415/* Discover parameters of different discovery types 416*/ 417typedef struct { 418 tBT_UUID service; 419 uint16_t s_handle; 420 uint16_t e_handle; 421} tGATT_DISC_PARAM; 422 423/* GATT read type enumeration 424*/ 425enum { 426 GATT_READ_BY_TYPE = 1, 427 GATT_READ_BY_HANDLE, 428 GATT_READ_MULTIPLE, 429 GATT_READ_CHAR_VALUE, 430 GATT_READ_PARTIAL, 431 GATT_READ_MAX 432}; 433typedef uint8_t tGATT_READ_TYPE; 434 435/* Read By Type Request (GATT_READ_BY_TYPE) Data 436*/ 437typedef struct { 438 tGATT_AUTH_REQ auth_req; 439 uint16_t s_handle; 440 uint16_t e_handle; 441 tBT_UUID uuid; 442} tGATT_READ_BY_TYPE; 443 444/* GATT_READ_MULTIPLE request data 445*/ 446#define GATT_MAX_READ_MULTI_HANDLES \ 447 10 /* Max attributes to read in one request */ 448typedef struct { 449 tGATT_AUTH_REQ auth_req; 450 uint16_t num_handles; /* number of handles to read */ 451 uint16_t handles[GATT_MAX_READ_MULTI_HANDLES]; /* handles list to be read */ 452} tGATT_READ_MULTI; 453 454/* Read By Handle Request (GATT_READ_BY_HANDLE) data */ 455typedef struct { 456 tGATT_AUTH_REQ auth_req; 457 uint16_t handle; 458} tGATT_READ_BY_HANDLE; 459 460/* READ_BT_HANDLE_Request data */ 461typedef struct { 462 tGATT_AUTH_REQ auth_req; 463 uint16_t handle; 464 uint16_t offset; 465} tGATT_READ_PARTIAL; 466 467/* Read Request Data 468*/ 469typedef union { 470 tGATT_READ_BY_TYPE service; 471 tGATT_READ_BY_TYPE char_type; /* characterisitc type */ 472 tGATT_READ_MULTI read_multiple; 473 tGATT_READ_BY_HANDLE by_handle; 474 tGATT_READ_PARTIAL partial; 475} tGATT_READ_PARAM; 476 477/* GATT write type enumeration */ 478enum { GATT_WRITE_NO_RSP = 1, GATT_WRITE, GATT_WRITE_PREPARE }; 479typedef uint8_t tGATT_WRITE_TYPE; 480 481/* Client Operation Complete Callback Data 482*/ 483typedef union { 484 tGATT_VALUE att_value; 485 uint16_t mtu; 486 uint16_t handle; 487} tGATT_CL_COMPLETE; 488 489/* GATT client operation type, used in client callback function 490*/ 491#define GATTC_OPTYPE_NONE 0 492#define GATTC_OPTYPE_DISCOVERY 1 493#define GATTC_OPTYPE_READ 2 494#define GATTC_OPTYPE_WRITE 3 495#define GATTC_OPTYPE_EXE_WRITE 4 496#define GATTC_OPTYPE_CONFIG 5 497#define GATTC_OPTYPE_NOTIFICATION 6 498#define GATTC_OPTYPE_INDICATION 7 499typedef uint8_t tGATTC_OPTYPE; 500 501/* characteristic declaration 502*/ 503typedef struct { 504 tGATT_CHAR_PROP char_prop; /* characterisitc properties */ 505 uint16_t val_handle; /* characteristic value attribute handle */ 506 tBT_UUID char_uuid; /* characteristic UUID type */ 507} tGATT_CHAR_DCLR_VAL; 508 509/* primary service group data 510*/ 511typedef struct { 512 uint16_t e_handle; /* ending handle of the group */ 513 tBT_UUID service_type; /* group type */ 514} tGATT_GROUP_VALUE; 515 516/* included service attribute value 517*/ 518typedef struct { 519 tBT_UUID service_type; /* included service UUID */ 520 uint16_t s_handle; /* starting handle */ 521 uint16_t e_handle; /* ending handle */ 522} tGATT_INCL_SRVC; 523 524typedef union { 525 tGATT_INCL_SRVC incl_service; /* include service value */ 526 tGATT_GROUP_VALUE group_value; /* Service UUID type. 527 This field is used with GATT_DISC_SRVC_ALL 528 or GATT_DISC_SRVC_BY_UUID 529 type of discovery result callback. */ 530 531 uint16_t handle; /* When used with GATT_DISC_INC_SRVC type discovery result, 532 it is the included service starting handle.*/ 533 534 tGATT_CHAR_DCLR_VAL 535 dclr_value; /* Characteristic declaration value. 536 This field is used with GATT_DISC_CHAR type discovery.*/ 537} tGATT_DISC_VALUE; 538 539/* discover result record 540*/ 541typedef struct { 542 tBT_UUID type; 543 uint16_t handle; 544 tGATT_DISC_VALUE value; 545} tGATT_DISC_RES; 546 547#define GATT_LINK_IDLE_TIMEOUT_WHEN_NO_APP \ 548 1 /* start a idle timer for this duration \ 549 when no application need to use the link */ 550 551#define GATT_LINK_NO_IDLE_TIMEOUT 0xFFFF 552 553#define GATT_INVALID_ACL_HANDLE 0xFFFF 554/* discover result callback function */ 555typedef void(tGATT_DISC_RES_CB)(uint16_t conn_id, tGATT_DISC_TYPE disc_type, 556 tGATT_DISC_RES* p_data); 557 558/* discover complete callback function */ 559typedef void(tGATT_DISC_CMPL_CB)(uint16_t conn_id, tGATT_DISC_TYPE disc_type, 560 tGATT_STATUS status); 561 562/* Define a callback function for when read/write/disc/config operation is 563 * completed. */ 564typedef void(tGATT_CMPL_CBACK)(uint16_t conn_id, tGATTC_OPTYPE op, 565 tGATT_STATUS status, tGATT_CL_COMPLETE* p_data); 566 567/* Define a callback function when an initialized connection is established. */ 568typedef void(tGATT_CONN_CBACK)(tGATT_IF gatt_if, BD_ADDR bda, uint16_t conn_id, 569 bool connected, tGATT_DISCONN_REASON reason, 570 tBT_TRANSPORT transport); 571 572/* attribute request callback for ATT server */ 573typedef void(tGATT_REQ_CBACK)(uint16_t conn_id, uint32_t trans_id, 574 tGATTS_REQ_TYPE type, tGATTS_DATA* p_data); 575 576/* channel congestion/uncongestion callback */ 577typedef void(tGATT_CONGESTION_CBACK)(uint16_t conn_id, bool congested); 578 579/* Define a callback function when encryption is established. */ 580typedef void(tGATT_ENC_CMPL_CB)(tGATT_IF gatt_if, BD_ADDR bda); 581 582/* Define a callback function when phy is updated. */ 583typedef void(tGATT_PHY_UPDATE_CB)(tGATT_IF gatt_if, uint16_t conn_id, 584 uint8_t tx_phy, uint8_t rx_phy, 585 uint8_t status); 586 587/* Define a callback function when connection parameters are updated */ 588typedef void(tGATT_CONN_UPDATE_CB)(tGATT_IF gatt_if, uint16_t conn_id, 589 uint16_t interval, uint16_t latency, 590 uint16_t timeout, uint8_t status); 591 592/* Define the structure that applications use to register with 593 * GATT. This structure includes callback functions. All functions 594 * MUST be provided. 595*/ 596typedef struct { 597 tGATT_CONN_CBACK* p_conn_cb; 598 tGATT_CMPL_CBACK* p_cmpl_cb; 599 tGATT_DISC_RES_CB* p_disc_res_cb; 600 tGATT_DISC_CMPL_CB* p_disc_cmpl_cb; 601 tGATT_REQ_CBACK* p_req_cb; 602 tGATT_ENC_CMPL_CB* p_enc_cmpl_cb; 603 tGATT_CONGESTION_CBACK* p_congestion_cb; 604 tGATT_PHY_UPDATE_CB* p_phy_update_cb; 605 tGATT_CONN_UPDATE_CB* p_conn_update_cb; 606} tGATT_CBACK; 607 608/***************** Start Handle Management Definitions *********************/ 609 610typedef struct { 611 tBT_UUID app_uuid128; 612 tBT_UUID svc_uuid; 613 uint16_t s_handle; 614 uint16_t e_handle; 615 bool is_primary; /* primary service or secondary */ 616} tGATTS_HNDL_RANGE; 617 618#define GATTS_SRV_CHG_CMD_ADD_CLIENT 1 619#define GATTS_SRV_CHG_CMD_UPDATE_CLIENT 2 620#define GATTS_SRV_CHG_CMD_REMOVE_CLIENT 3 621#define GATTS_SRV_CHG_CMD_READ_NUM_CLENTS 4 622#define GATTS_SRV_CHG_CMD_READ_CLENT 5 623typedef uint8_t tGATTS_SRV_CHG_CMD; 624 625typedef struct { 626 BD_ADDR bda; 627 bool srv_changed; 628} tGATTS_SRV_CHG; 629 630typedef union { 631 tGATTS_SRV_CHG srv_chg; 632 uint8_t client_read_index; /* only used for sequential reading client srv chg 633 info */ 634} tGATTS_SRV_CHG_REQ; 635 636typedef union { 637 tGATTS_SRV_CHG srv_chg; 638 uint8_t num_clients; 639} tGATTS_SRV_CHG_RSP; 640 641/* Attibute server handle ranges NV storage callback functions 642*/ 643typedef void(tGATTS_NV_SAVE_CBACK)(bool is_saved, 644 tGATTS_HNDL_RANGE* p_hndl_range); 645typedef bool(tGATTS_NV_SRV_CHG_CBACK)(tGATTS_SRV_CHG_CMD cmd, 646 tGATTS_SRV_CHG_REQ* p_req, 647 tGATTS_SRV_CHG_RSP* p_rsp); 648 649typedef struct { 650 tGATTS_NV_SAVE_CBACK* p_nv_save_callback; 651 tGATTS_NV_SRV_CHG_CBACK* p_srv_chg_callback; 652} tGATT_APPL_INFO; 653 654/******************** End Handle Management Definitions ********************/ 655 656/******************************************************************************* 657 * External Function Declarations 658 ******************************************************************************/ 659 660/******************************************************************************* 661 * 662 * Function GATT_SetTraceLevel 663 * 664 * Description This function sets the trace level. If called with 665 * a value of 0xFF, it simply returns the current trace level. 666 * 667 * Returns The new or current trace level 668 * 669 ******************************************************************************/ 670extern uint8_t GATT_SetTraceLevel(uint8_t new_level); 671 672/******************************************************************************/ 673/* GATT Profile API Functions */ 674/******************************************************************************/ 675/* GATT Profile Server Functions */ 676/******************************************************************************/ 677/******************************************************************************* 678 * 679 * Function GATTS_AddHandleRange 680 * 681 * Description This function add the allocated handles range for the 682 * specified application UUID, service UUID and service 683 * instance 684 * 685 * Parameter p_hndl_range: pointer to allocated handles information 686 * 687 * Returns true if handle range is added sucessfully; otherwise false. 688 * 689 ******************************************************************************/ 690 691extern bool GATTS_AddHandleRange(tGATTS_HNDL_RANGE* p_hndl_range); 692 693/******************************************************************************* 694 * 695 * Function GATTS_NVRegister 696 * 697 * Description Application manager calls this function to register for 698 * NV save callback function. There can be one and only one 699 * NV save callback function. 700 * 701 * Parameter p_cb_info : callback informaiton 702 * 703 * Returns true if registered OK, else false 704 * 705 ******************************************************************************/ 706extern bool GATTS_NVRegister(tGATT_APPL_INFO* p_cb_info); 707 708/* Converts 16bit uuid to bt_uuid_t that can be used when adding 709 * service/characteristic/descriptor with GATTS_AddService */ 710void uuid_128_from_16(bt_uuid_t* uuid, uint16_t uuid16); 711 712/******************************************************************************* 713 * 714 * Function BTA_GATTS_AddService 715 * 716 * Description Add a service. When service is ready, a callback 717 * event BTA_GATTS_ADD_SRVC_EVT is called to report status 718 * and handles to the profile. 719 * 720 * Parameters server_if: server interface. 721 * service: pointer array describing service. 722 * count: number of elements in service array. 723 * 724 * Returns on success GATT_SERVICE_STARTED is returned, and 725 * attribute_handle field inside service elements are filled. 726 * on error error status is returned. 727 * 728 ******************************************************************************/ 729extern uint16_t GATTS_AddService(tGATT_IF gatt_if, btgatt_db_element_t* service, 730 int count); 731 732/******************************************************************************* 733 * 734 * Function GATTS_DeleteService 735 * 736 * Description This function is called to delete a service. 737 * 738 * Parameter gatt_if : application interface 739 * p_svc_uuid : service UUID 740 * svc_inst : instance of the service inside the 741 * application 742 * 743 * Returns true if operation succeed, else false 744 * 745 ******************************************************************************/ 746extern bool GATTS_DeleteService(tGATT_IF gatt_if, tBT_UUID* p_svc_uuid, 747 uint16_t svc_inst); 748 749/******************************************************************************* 750 * 751 * Function GATTS_StopService 752 * 753 * Description This function is called to stop a service 754 * 755 * Parameter service_handle : this is the start handle of a service 756 * 757 * Returns None. 758 * 759 ******************************************************************************/ 760extern void GATTS_StopService(uint16_t service_handle); 761 762/******************************************************************************* 763 * 764 * Function GATTs_HandleValueIndication 765 * 766 * Description This function sends a handle value indication to a client. 767 * 768 * Parameter conn_id: connection identifier. 769 * attr_handle: Attribute handle of this handle value 770 * indication. 771 * val_len: Length of the indicated attribute value. 772 * p_val: Pointer to the indicated attribute value data. 773 * 774 * Returns GATT_SUCCESS if sucessfully sent or queued; otherwise error 775 * code. 776 * 777 ******************************************************************************/ 778extern tGATT_STATUS GATTS_HandleValueIndication(uint16_t conn_id, 779 uint16_t attr_handle, 780 uint16_t val_len, 781 uint8_t* p_val); 782 783/******************************************************************************* 784 * 785 * Function GATTS_HandleValueNotification 786 * 787 * Description This function sends a handle value notification to a client. 788 * 789 * Parameter conn_id: connection identifier. 790 * attr_handle: Attribute handle of this handle value 791 * indication. 792 * val_len: Length of the indicated attribute value. 793 * p_val: Pointer to the indicated attribute value data. 794 * 795 * Returns GATT_SUCCESS if sucessfully sent; otherwise error code. 796 * 797 ******************************************************************************/ 798extern tGATT_STATUS GATTS_HandleValueNotification(uint16_t conn_id, 799 uint16_t attr_handle, 800 uint16_t val_len, 801 uint8_t* p_val); 802 803/******************************************************************************* 804 * 805 * Function GATTS_SendRsp 806 * 807 * Description This function sends the server response to client. 808 * 809 * Parameter conn_id: connection identifier. 810 * trans_id: transaction id 811 * status: response status 812 * p_msg: pointer to message parameters structure. 813 * 814 * Returns GATT_SUCCESS if sucessfully sent; otherwise error code. 815 * 816 ******************************************************************************/ 817extern tGATT_STATUS GATTS_SendRsp(uint16_t conn_id, uint32_t trans_id, 818 tGATT_STATUS status, tGATTS_RSP* p_msg); 819 820/******************************************************************************/ 821/* GATT Profile Client Functions */ 822/******************************************************************************/ 823 824/******************************************************************************* 825 * 826 * Function GATTC_ConfigureMTU 827 * 828 * Description This function is called to configure the ATT MTU size for 829 * a connection on an LE transport. 830 * 831 * Parameters conn_id: connection identifier. 832 * mtu - attribute MTU size.. 833 * 834 * Returns GATT_SUCCESS if command started successfully. 835 * 836 ******************************************************************************/ 837extern tGATT_STATUS GATTC_ConfigureMTU(uint16_t conn_id, uint16_t mtu); 838 839extern void GATTC_ReadPHY( 840 uint16_t conn_id, 841 base::Callback<void(uint8_t tx_phy, uint8_t rx_phy, uint8_t status)> cb); 842extern void GATTC_SetPreferredPHY(uint16_t conn_id, uint8_t tx_phy, 843 uint8_t rx_phy, uint16_t phy_options); 844 845/******************************************************************************* 846 * 847 * Function GATTC_Discover 848 * 849 * Description This function is called to do a discovery procedure on ATT 850 * server. 851 * 852 * Parameters conn_id: connection identifier. 853 * disc_type:discovery type. 854 * p_param: parameters of discovery requirement. 855 * 856 * Returns GATT_SUCCESS if command received/sent successfully. 857 * 858 ******************************************************************************/ 859extern tGATT_STATUS GATTC_Discover(uint16_t conn_id, tGATT_DISC_TYPE disc_type, 860 tGATT_DISC_PARAM* p_param); 861/******************************************************************************* 862 * 863 * Function GATTC_Read 864 * 865 * Description This function is called to read the value of an attribute 866 * from the server. 867 * 868 * Parameters conn_id: connection identifier. 869 * type - attribute read type. 870 * p_read - read operation parameters. 871 * 872 * Returns GATT_SUCCESS if command started successfully. 873 * 874 ******************************************************************************/ 875extern tGATT_STATUS GATTC_Read(uint16_t conn_id, tGATT_READ_TYPE type, 876 tGATT_READ_PARAM* p_read); 877 878/******************************************************************************* 879 * 880 * Function GATTC_Write 881 * 882 * Description This function is called to read the value of an attribute 883 * from the server. 884 * 885 * Parameters conn_id: connection identifier. 886 * type - attribute write type. 887 * p_write - write operation parameters. 888 * 889 * Returns GATT_SUCCESS if command started successfully. 890 * 891 ******************************************************************************/ 892extern tGATT_STATUS GATTC_Write(uint16_t conn_id, tGATT_WRITE_TYPE type, 893 tGATT_VALUE* p_write); 894 895/******************************************************************************* 896 * 897 * Function GATTC_ExecuteWrite 898 * 899 * Description This function is called to send an Execute write request to 900 * the server. 901 * 902 * Parameters conn_id: connection identifier. 903 * is_execute - to execute or cancel the prepare write 904 * request(s) 905 * 906 * Returns GATT_SUCCESS if command started successfully. 907 * 908 ******************************************************************************/ 909extern tGATT_STATUS GATTC_ExecuteWrite(uint16_t conn_id, bool is_execute); 910 911/******************************************************************************* 912 * 913 * Function GATTC_SendHandleValueConfirm 914 * 915 * Description This function is called to send a handle value confirmation 916 * as response to a handle value notification from server. 917 * 918 * Parameters conn_id: connection identifier. 919 * handle: the handle of the attribute confirmation. 920 * 921 * Returns GATT_SUCCESS if command started successfully. 922 * 923 ******************************************************************************/ 924extern tGATT_STATUS GATTC_SendHandleValueConfirm(uint16_t conn_id, 925 uint16_t handle); 926 927/******************************************************************************* 928 * 929 * Function GATT_SetIdleTimeout 930 * 931 * Description This function (common to both client and server) sets the 932 * idle timeout for a tansport connection 933 * 934 * Parameter bd_addr: target device bd address. 935 * idle_tout: timeout value in seconds. 936 * transport: trasnport option. 937 * 938 * Returns void 939 * 940 ******************************************************************************/ 941extern void GATT_SetIdleTimeout(BD_ADDR bd_addr, uint16_t idle_tout, 942 tGATT_TRANSPORT transport); 943 944/******************************************************************************* 945 * 946 * Function GATT_Register 947 * 948 * Description This function is called to register an application 949 * with GATT 950 * 951 * Parameter p_app_uuid128: Application UUID 952 * p_cb_info: callback functions. 953 * 954 * Returns 0 for error, otherwise the index of the client registered 955 * with GATT 956 * 957 ******************************************************************************/ 958extern tGATT_IF GATT_Register(tBT_UUID* p_app_uuid128, tGATT_CBACK* p_cb_info); 959 960/******************************************************************************* 961 * 962 * Function GATT_Deregister 963 * 964 * Description This function deregistered the application from GATT. 965 * 966 * Parameters gatt_if: applicaiton interface. 967 * 968 * Returns None. 969 * 970 ******************************************************************************/ 971extern void GATT_Deregister(tGATT_IF gatt_if); 972 973/******************************************************************************* 974 * 975 * Function GATT_StartIf 976 * 977 * Description This function is called after registration to start 978 * receiving callbacks for registered interface. Function may 979 * call back with connection status and queued notifications 980 * 981 * Parameter gatt_if: applicaiton interface. 982 * 983 * Returns None 984 * 985 ******************************************************************************/ 986extern void GATT_StartIf(tGATT_IF gatt_if); 987 988/******************************************************************************* 989 * 990 * Function GATT_Connect 991 * 992 * Description This function initiate a connecttion to a remote device on 993 * GATT channel. 994 * 995 * Parameters gatt_if: applicaiton interface 996 * bd_addr: peer device address. 997 * is_direct: is a direct connection or a background auto 998 * connection 999 * transport : Physical transport for GATT connection 1000 * (BR/EDR or LE) 1001 * opportunistic: will not keep device connected if other apps 1002 * disconnect, will not update connected apps counter, when 1003 * disconnected won't cause physical disconnection. 1004 * 1005 * Returns true if connection started; else false 1006 * 1007 ******************************************************************************/ 1008extern bool GATT_Connect(tGATT_IF gatt_if, BD_ADDR bd_addr, bool is_direct, 1009 tBT_TRANSPORT transport, bool opportunistic); 1010 1011/******************************************************************************* 1012 * 1013 * Function GATT_CancelConnect 1014 * 1015 * Description Terminate the connection initiation to a remote device on a 1016 * GATT channel. 1017 * 1018 * Parameters gatt_if: client interface. If 0 used as unconditionally 1019 * disconnect, typically used for direct connection 1020 * cancellation. 1021 * bd_addr: peer device address. 1022 * is_direct: is a direct conenection or a background auto 1023 * connection 1024 * 1025 * Returns true if connection started; else false 1026 * 1027 ******************************************************************************/ 1028extern bool GATT_CancelConnect(tGATT_IF gatt_if, BD_ADDR bd_addr, 1029 bool is_direct); 1030 1031/******************************************************************************* 1032 * 1033 * Function GATT_Disconnect 1034 * 1035 * Description Disconnect the GATT channel for this registered application. 1036 * 1037 * Parameters conn_id: connection identifier. 1038 * 1039 * Returns GATT_SUCCESS if disconnected. 1040 * 1041 ******************************************************************************/ 1042extern tGATT_STATUS GATT_Disconnect(uint16_t conn_id); 1043 1044/******************************************************************************* 1045 * 1046 * Function GATT_GetConnectionInfor 1047 * 1048 * Description Use conn_id to find its associated BD address and 1049 * application interface 1050 * 1051 * Parameters conn_id: connection id (input) 1052 * p_gatt_if: applicaiton interface (output) 1053 * bd_addr: peer device address. (output) 1054 * transport : physical transport of the GATT connection 1055 * (BR/EDR or LE) 1056 * 1057 * Returns true the ligical link information is found for conn_id 1058 * 1059 ******************************************************************************/ 1060extern bool GATT_GetConnectionInfor(uint16_t conn_id, tGATT_IF* p_gatt_if, 1061 BD_ADDR bd_addr, 1062 tBT_TRANSPORT* p_transport); 1063 1064/******************************************************************************* 1065 * 1066 * Function GATT_GetConnIdIfConnected 1067 * 1068 * Description Find the conn_id if the logical link for a BD address 1069 * and application interface is connected 1070 * 1071 * Parameters gatt_if: applicaiton interface (input) 1072 * bd_addr: peer device address. (input) 1073 * p_conn_id: connection id (output) 1074 * transport : physical transport of the GATT connection 1075 * (BR/EDR or LE) 1076 * 1077 * Returns true the ligical link is connected 1078 * 1079 ******************************************************************************/ 1080extern bool GATT_GetConnIdIfConnected(tGATT_IF gatt_if, BD_ADDR bd_addr, 1081 uint16_t* p_conn_id, 1082 tBT_TRANSPORT transport); 1083 1084/******************************************************************************* 1085 * 1086 * Function GATT_ConfigServiceChangeCCC 1087 * 1088 * Description Configure service change indication on remote device 1089 * 1090 * Returns None. 1091 * 1092 ******************************************************************************/ 1093extern void GATT_ConfigServiceChangeCCC(BD_ADDR remote_bda, bool enable, 1094 tBT_TRANSPORT transport); 1095 1096// Enables the GATT profile on the device. 1097// It clears out the control blocks, and registers with L2CAP. 1098extern void gatt_init(void); 1099 1100// Frees resources used by the GATT profile. 1101extern void gatt_free(void); 1102 1103// Link encryption complete notification for all encryption process 1104// initiated outside GATT. 1105extern void gatt_notify_enc_cmpl(BD_ADDR bd_addr); 1106 1107// Reset bg device list. 1108extern void gatt_reset_bgdev_list(void); 1109 1110#endif /* GATT_API_H */ 1111