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 19 /****************************************************************************** 20 * 21 * this file contains the L2CAP API definitions 22 * 23 ******************************************************************************/ 24 #ifndef L2C_API_H 25 #define L2C_API_H 26 27 #include <stdbool.h> 28 29 #include "bt_target.h" 30 #include "hcidefs.h" 31 #include "l2cdefs.h" 32 33 /***************************************************************************** 34 * Constants 35 ****************************************************************************/ 36 37 /* Define the minimum offset that L2CAP needs in a buffer. This is made up of 38 * HCI type(1), len(2), handle(2), L2CAP len(2) and CID(2) => 9 39 */ 40 #define L2CAP_MIN_OFFSET 13 /* plus control(2), SDU length(2) */ 41 42 #define L2CAP_LCC_SDU_LENGTH 2 43 #define L2CAP_LCC_OFFSET \ 44 (L2CAP_MIN_OFFSET + L2CAP_LCC_SDU_LENGTH) /* plus SDU length(2) */ 45 46 /* ping result codes */ 47 #define L2CAP_PING_RESULT_OK 0 /* Ping reply received OK */ 48 #define L2CAP_PING_RESULT_NO_LINK 1 /* Link could not be setup */ 49 #define L2CAP_PING_RESULT_NO_RESP 2 /* Remote L2CAP did not reply */ 50 51 /* result code for L2CA_DataWrite() */ 52 #define L2CAP_DW_FAILED false 53 #define L2CAP_DW_SUCCESS true 54 #define L2CAP_DW_CONGESTED 2 55 56 /* Values for priority parameter to L2CA_SetAclPriority */ 57 #define L2CAP_PRIORITY_NORMAL 0 58 #define L2CAP_PRIORITY_HIGH 1 59 60 /* Values for priority parameter to L2CA_SetTxPriority */ 61 #define L2CAP_CHNL_PRIORITY_HIGH 0 62 #define L2CAP_CHNL_PRIORITY_MEDIUM 1 63 #define L2CAP_CHNL_PRIORITY_LOW 2 64 65 typedef uint8_t tL2CAP_CHNL_PRIORITY; 66 67 /* Values for Tx/Rx data rate parameter to L2CA_SetChnlDataRate */ 68 #define L2CAP_CHNL_DATA_RATE_HIGH 3 69 #define L2CAP_CHNL_DATA_RATE_MEDIUM 2 70 #define L2CAP_CHNL_DATA_RATE_LOW 1 71 #define L2CAP_CHNL_DATA_RATE_NO_TRAFFIC 0 72 73 typedef uint8_t tL2CAP_CHNL_DATA_RATE; 74 75 /* Data Packet Flags (bits 2-15 are reserved) */ 76 /* layer specific 14-15 bits are used for FCR SAR */ 77 #define L2CAP_FLUSHABLE_MASK 0x0003 78 #define L2CAP_FLUSHABLE_CH_BASED 0x0000 79 #define L2CAP_FLUSHABLE_PKT 0x0001 80 #define L2CAP_NON_FLUSHABLE_PKT 0x0002 81 82 /* L2CA_FlushChannel num_to_flush definitions */ 83 #define L2CAP_FLUSH_CHANS_ALL 0xffff 84 #define L2CAP_FLUSH_CHANS_GET 0x0000 85 86 /* special CID for Multi-AV for reporting congestion */ 87 #define L2CAP_MULTI_AV_CID 0 88 89 /* length of the HCI header block */ 90 /* HCI header(4) + SNK count(1) + FCR bits(1) + AV data length(2) */ 91 #define L2CAP_MULTI_AV_HCI_HDR_LEN 8 92 93 /* length of padding for 4 bytes align */ 94 #define L2CAP_MULTI_AV_PADDING_LEN 2 95 96 /* length of the HCI header block with padding for FCR */ 97 /* HCI header(4) + SNK count(1) + FCR bits(1) + AV data length(2) + padding(2) 98 */ 99 #define L2CAP_MULTI_AV_HCI_HDR_LEN_WITH_PADDING 10 100 101 /* length of the L2CAP header block */ 102 /* HCI header(4) + L2CAP header(4) + padding(4) or control word(2) + FCS(2) */ 103 #define L2CAP_MULTI_AV_L2C_HDR_LEN 12 104 105 /* definition used for L2CA_SetDesireRole */ 106 #define L2CAP_ROLE_SLAVE HCI_ROLE_SLAVE 107 #define L2CAP_ROLE_MASTER HCI_ROLE_MASTER 108 /* set this bit to allow switch at create conn */ 109 #define L2CAP_ROLE_ALLOW_SWITCH 0x80 110 /* set this bit to disallow switch at create conn */ 111 #define L2CAP_ROLE_DISALLOW_SWITCH 0x40 112 #define L2CAP_ROLE_CHECK_SWITCH 0xC0 113 114 /* Values for 'allowed_modes' field passed in structure tL2CAP_ERTM_INFO 115 */ 116 #define L2CAP_FCR_CHAN_OPT_BASIC (1 << L2CAP_FCR_BASIC_MODE) 117 #define L2CAP_FCR_CHAN_OPT_ERTM (1 << L2CAP_FCR_ERTM_MODE) 118 #define L2CAP_FCR_CHAN_OPT_STREAM (1 << L2CAP_FCR_STREAM_MODE) 119 120 #define L2CAP_FCR_CHAN_OPT_ALL_MASK \ 121 (L2CAP_FCR_CHAN_OPT_BASIC | L2CAP_FCR_CHAN_OPT_ERTM | \ 122 L2CAP_FCR_CHAN_OPT_STREAM) 123 124 /* Validity check for PSM. PSM values must be odd. Also, all PSM values must 125 * be assigned such that the least significant bit of the most sigificant 126 * octet equals zero. 127 */ 128 #define L2C_INVALID_PSM(psm) (((psm)&0x0101) != 0x0001) 129 #define L2C_IS_VALID_PSM(psm) (((psm)&0x0101) == 0x0001) 130 #define L2C_IS_VALID_LE_PSM(psm) (((psm) > 0x0000) && ((psm) < 0x0100)) 131 132 /***************************************************************************** 133 * Type Definitions 134 ****************************************************************************/ 135 136 typedef struct { 137 #define L2CAP_FCR_BASIC_MODE 0x00 138 #define L2CAP_FCR_ERTM_MODE 0x03 139 #define L2CAP_FCR_STREAM_MODE 0x04 140 #define L2CAP_FCR_LE_COC_MODE 0x05 141 142 uint8_t mode; 143 144 uint8_t tx_win_sz; 145 uint8_t max_transmit; 146 uint16_t rtrans_tout; 147 uint16_t mon_tout; 148 uint16_t mps; 149 } tL2CAP_FCR_OPTS; 150 151 /* Define a structure to hold the configuration parameters. Since the 152 * parameters are optional, for each parameter there is a boolean to 153 * use to signify its presence or absence. 154 */ 155 typedef struct { 156 uint16_t result; /* Only used in confirm messages */ 157 bool mtu_present; 158 uint16_t mtu; 159 bool qos_present; 160 FLOW_SPEC qos; 161 bool flush_to_present; 162 uint16_t flush_to; 163 bool fcr_present; 164 tL2CAP_FCR_OPTS fcr; 165 bool fcs_present; /* Optionally bypasses FCS checks */ 166 uint8_t fcs; /* '0' if desire is to bypass FCS, otherwise '1' */ 167 bool ext_flow_spec_present; 168 tHCI_EXT_FLOW_SPEC ext_flow_spec; 169 uint16_t flags; /* bit 0: 0-no continuation, 1-continuation */ 170 } tL2CAP_CFG_INFO; 171 172 /* Define a structure to hold the configuration parameter for LE L2CAP 173 * connection oriented channels. 174 */ 175 typedef struct { 176 uint16_t mtu; 177 uint16_t mps; 178 uint16_t credits; 179 } tL2CAP_LE_CFG_INFO; 180 181 /* L2CAP channel configured field bitmap */ 182 #define L2CAP_CH_CFG_MASK_MTU 0x0001 183 #define L2CAP_CH_CFG_MASK_QOS 0x0002 184 #define L2CAP_CH_CFG_MASK_FLUSH_TO 0x0004 185 #define L2CAP_CH_CFG_MASK_FCR 0x0008 186 #define L2CAP_CH_CFG_MASK_FCS 0x0010 187 #define L2CAP_CH_CFG_MASK_EXT_FLOW_SPEC 0x0020 188 189 typedef uint16_t tL2CAP_CH_CFG_BITS; 190 191 /********************************* 192 * Callback Functions Prototypes 193 *********************************/ 194 195 /* Connection indication callback prototype. Parameters are 196 * BD Address of remote 197 * Local CID assigned to the connection 198 * PSM that the remote wants to connect to 199 * Identifier that the remote sent 200 */ 201 typedef void(tL2CA_CONNECT_IND_CB)(BD_ADDR, uint16_t, uint16_t, uint8_t); 202 203 /* Connection confirmation callback prototype. Parameters are 204 * Local CID 205 * Result - 0 = connected, non-zero means failure reason 206 */ 207 typedef void(tL2CA_CONNECT_CFM_CB)(uint16_t, uint16_t); 208 209 /* Connection pending callback prototype. Parameters are 210 * Local CID 211 */ 212 typedef void(tL2CA_CONNECT_PND_CB)(uint16_t); 213 214 /* Configuration indication callback prototype. Parameters are 215 * Local CID assigned to the connection 216 * Pointer to configuration info 217 */ 218 typedef void(tL2CA_CONFIG_IND_CB)(uint16_t, tL2CAP_CFG_INFO*); 219 220 /* Configuration confirm callback prototype. Parameters are 221 * Local CID assigned to the connection 222 * Pointer to configuration info 223 */ 224 typedef void(tL2CA_CONFIG_CFM_CB)(uint16_t, tL2CAP_CFG_INFO*); 225 226 /* Disconnect indication callback prototype. Parameters are 227 * Local CID 228 * Boolean whether upper layer should ack this 229 */ 230 typedef void(tL2CA_DISCONNECT_IND_CB)(uint16_t, bool); 231 232 /* Disconnect confirm callback prototype. Parameters are 233 * Local CID 234 * Result 235 */ 236 typedef void(tL2CA_DISCONNECT_CFM_CB)(uint16_t, uint16_t); 237 238 /* QOS Violation indication callback prototype. Parameters are 239 * BD Address of violating device 240 */ 241 typedef void(tL2CA_QOS_VIOLATION_IND_CB)(BD_ADDR); 242 243 /* Data received indication callback prototype. Parameters are 244 * Local CID 245 * Address of buffer 246 */ 247 typedef void(tL2CA_DATA_IND_CB)(uint16_t, BT_HDR*); 248 249 /* Echo response callback prototype. Note that this is not included in the 250 * registration information, but is passed to L2CAP as part of the API to 251 * actually send an echo request. Parameters are 252 * Result 253 */ 254 typedef void(tL2CA_ECHO_RSP_CB)(uint16_t); 255 256 /* Callback function prototype to pass broadcom specific echo response */ 257 /* to the upper layer */ 258 typedef void(tL2CA_ECHO_DATA_CB)(BD_ADDR, uint16_t, uint8_t*); 259 260 /* Congestion status callback protype. This callback is optional. If 261 * an application tries to send data when the transmit queue is full, 262 * the data will anyways be dropped. The parameter is: 263 * Local CID 264 * true if congested, false if uncongested 265 */ 266 typedef void(tL2CA_CONGESTION_STATUS_CB)(uint16_t, bool); 267 268 /* Callback prototype for number of packets completed events. 269 * This callback notifies the application when Number of Completed Packets 270 * event has been received. 271 * This callback is originally designed for 3DG devices. 272 * The parameter is: 273 * peer BD_ADDR 274 */ 275 typedef void(tL2CA_NOCP_CB)(BD_ADDR); 276 277 /* Transmit complete callback protype. This callback is optional. If 278 * set, L2CAP will call it when packets are sent or flushed. If the 279 * count is 0xFFFF, it means all packets are sent for that CID (eRTM 280 * mode only). The parameters are: 281 * Local CID 282 * Number of SDUs sent or dropped 283 */ 284 typedef void(tL2CA_TX_COMPLETE_CB)(uint16_t, uint16_t); 285 286 /* Define the structure that applications use to register with 287 * L2CAP. This structure includes callback functions. All functions 288 * MUST be provided, with the exception of the "connect pending" 289 * callback and "congestion status" callback. 290 */ 291 typedef struct { 292 tL2CA_CONNECT_IND_CB* pL2CA_ConnectInd_Cb; 293 tL2CA_CONNECT_CFM_CB* pL2CA_ConnectCfm_Cb; 294 tL2CA_CONNECT_PND_CB* pL2CA_ConnectPnd_Cb; 295 tL2CA_CONFIG_IND_CB* pL2CA_ConfigInd_Cb; 296 tL2CA_CONFIG_CFM_CB* pL2CA_ConfigCfm_Cb; 297 tL2CA_DISCONNECT_IND_CB* pL2CA_DisconnectInd_Cb; 298 tL2CA_DISCONNECT_CFM_CB* pL2CA_DisconnectCfm_Cb; 299 tL2CA_QOS_VIOLATION_IND_CB* pL2CA_QoSViolationInd_Cb; 300 tL2CA_DATA_IND_CB* pL2CA_DataInd_Cb; 301 tL2CA_CONGESTION_STATUS_CB* pL2CA_CongestionStatus_Cb; 302 tL2CA_TX_COMPLETE_CB* pL2CA_TxComplete_Cb; 303 304 } tL2CAP_APPL_INFO; 305 306 /* Define the structure that applications use to create or accept 307 * connections with enhanced retransmission mode. 308 */ 309 typedef struct { 310 uint8_t preferred_mode; 311 uint8_t allowed_modes; 312 uint16_t user_rx_buf_size; 313 uint16_t user_tx_buf_size; 314 uint16_t fcr_rx_buf_size; 315 uint16_t fcr_tx_buf_size; 316 317 } tL2CAP_ERTM_INFO; 318 319 #define L2CA_REGISTER(a, b, c) L2CA_Register(a, (tL2CAP_APPL_INFO*)(b)) 320 #define L2CA_DEREGISTER(a) L2CA_Deregister(a) 321 #define L2CA_CONNECT_REQ(a, b, c) L2CA_ErtmConnectReq(a, b, c) 322 #define L2CA_CONNECT_RSP(a, b, c, d, e, f) L2CA_ErtmConnectRsp(a, b, c, d, e, f) 323 #define L2CA_CONFIG_REQ(a, b) L2CA_ConfigReq(a, b) 324 #define L2CA_CONFIG_RSP(a, b) L2CA_ConfigRsp(a, b) 325 #define L2CA_DISCONNECT_REQ(a) L2CA_DisconnectReq(a) 326 #define L2CA_DISCONNECT_RSP(a) L2CA_DisconnectRsp(a) 327 #define L2CA_DATA_WRITE(a, b) L2CA_DataWrite(a, b) 328 #define L2CA_REGISTER_COC(a, b, c) L2CA_RegisterLECoc(a, (tL2CAP_APPL_INFO*)(b)) 329 #define L2CA_DEREGISTER_COC(a) L2CA_DeregisterLECoc(a) 330 #define L2CA_CONNECT_COC_REQ(a, b, c) L2CA_ConnectLECocReq(a, b, c) 331 #define L2CA_CONNECT_COC_RSP(a, b, c, d, e, f) \ 332 L2CA_ConnectLECocRsp(a, b, c, d, e, f) 333 #define L2CA_GET_PEER_COC_CONFIG(a, b) L2CA_GetPeerLECocConfig(a, b) 334 335 /***************************************************************************** 336 * External Function Declarations 337 ****************************************************************************/ 338 339 /******************************************************************************* 340 * 341 * Function L2CA_Register 342 * 343 * Description Other layers call this function to register for L2CAP 344 * services. 345 * 346 * Returns PSM to use or zero if error. Typically, the PSM returned 347 * is the same as was passed in, but for an outgoing-only 348 * connection to a dynamic PSM, a "virtual" PSM is returned 349 * and should be used in the calls to L2CA_ConnectReq() and 350 * BTM_SetSecurityLevel(). 351 * 352 ******************************************************************************/ 353 extern uint16_t L2CA_Register(uint16_t psm, tL2CAP_APPL_INFO* p_cb_info); 354 355 /******************************************************************************* 356 * 357 * Function L2CA_Deregister 358 * 359 * Description Other layers call this function to deregister for L2CAP 360 * services. 361 * 362 * Returns void 363 * 364 ******************************************************************************/ 365 extern void L2CA_Deregister(uint16_t psm); 366 367 /******************************************************************************* 368 * 369 * Function L2CA_AllocatePSM 370 * 371 * Description Other layers call this function to find an unused PSM for 372 * L2CAP services. 373 * 374 * Returns PSM to use. 375 * 376 ******************************************************************************/ 377 extern uint16_t L2CA_AllocatePSM(void); 378 379 /******************************************************************************* 380 * 381 * Function L2CA_ConnectReq 382 * 383 * Description Higher layers call this function to create an L2CAP 384 * connection. 385 * Note that the connection is not established at this time, 386 * but connection establishment gets started. The callback 387 * will be invoked when connection establishes or fails. 388 * 389 * Returns the CID of the connection, or 0 if it failed to start 390 * 391 ******************************************************************************/ 392 extern uint16_t L2CA_ConnectReq(uint16_t psm, BD_ADDR p_bd_addr); 393 394 /******************************************************************************* 395 * 396 * Function L2CA_ConnectRsp 397 * 398 * Description Higher layers call this function to accept an incoming 399 * L2CAP connection, for which they had gotten an connect 400 * indication callback. 401 * 402 * Returns true for success, false for failure 403 * 404 ******************************************************************************/ 405 extern bool L2CA_ConnectRsp(BD_ADDR p_bd_addr, uint8_t id, uint16_t lcid, 406 uint16_t result, uint16_t status); 407 408 /******************************************************************************* 409 * 410 * Function L2CA_ErtmConnectReq 411 * 412 * Description Higher layers call this function to create an L2CAP 413 * connection that needs to use Enhanced Retransmission Mode. 414 * Note that the connection is not established at this time, 415 * but connection establishment gets started. The callback 416 * will be invoked when connection establishes or fails. 417 * 418 * Returns the CID of the connection, or 0 if it failed to start 419 * 420 ******************************************************************************/ 421 extern uint16_t L2CA_ErtmConnectReq(uint16_t psm, BD_ADDR p_bd_addr, 422 tL2CAP_ERTM_INFO* p_ertm_info); 423 424 /******************************************************************************* 425 * 426 * Function L2CA_RegisterLECoc 427 * 428 * Description Other layers call this function to register for L2CAP 429 * Connection Oriented Channel. 430 * 431 * Returns PSM to use or zero if error. Typically, the PSM returned 432 * is the same as was passed in, but for an outgoing-only 433 * connection to a dynamic PSM, a "virtual" PSM is returned 434 * and should be used in the calls to L2CA_ConnectLECocReq() 435 * and BTM_SetSecurityLevel(). 436 * 437 ******************************************************************************/ 438 extern uint16_t L2CA_RegisterLECoc(uint16_t psm, tL2CAP_APPL_INFO* p_cb_info); 439 440 /******************************************************************************* 441 * 442 * Function L2CA_DeregisterLECoc 443 * 444 * Description Other layers call this function to deregister for L2CAP 445 * Connection Oriented Channel. 446 * 447 * Returns void 448 * 449 ******************************************************************************/ 450 extern void L2CA_DeregisterLECoc(uint16_t psm); 451 452 /******************************************************************************* 453 * 454 * Function L2CA_ConnectLECocReq 455 * 456 * Description Higher layers call this function to create an L2CAP LE COC. 457 * Note that the connection is not established at this time, 458 * but connection establishment gets started. The callback 459 * will be invoked when connection establishes or fails. 460 * 461 * Returns the CID of the connection, or 0 if it failed to start 462 * 463 ******************************************************************************/ 464 extern uint16_t L2CA_ConnectLECocReq(uint16_t psm, BD_ADDR p_bd_addr, 465 tL2CAP_LE_CFG_INFO* p_cfg); 466 467 /******************************************************************************* 468 * 469 * Function L2CA_ConnectLECocRsp 470 * 471 * Description Higher layers call this function to accept an incoming 472 * L2CAP LE COC connection, for which they had gotten a connect 473 * indication callback. 474 * 475 * Returns true for success, false for failure 476 * 477 ******************************************************************************/ 478 extern bool L2CA_ConnectLECocRsp(BD_ADDR p_bd_addr, uint8_t id, uint16_t lcid, 479 uint16_t result, uint16_t status, 480 tL2CAP_LE_CFG_INFO* p_cfg); 481 482 /******************************************************************************* 483 * 484 * Function L2CA_GetPeerLECocConfig 485 * 486 * Description Get peers configuration for LE Connection Oriented Channel. 487 * 488 * Return value: true if peer is connected 489 * 490 ******************************************************************************/ 491 extern bool L2CA_GetPeerLECocConfig(uint16_t lcid, 492 tL2CAP_LE_CFG_INFO* peer_cfg); 493 494 // This function sets the callback routines for the L2CAP connection referred to 495 // by |local_cid|. The callback routines can only be modified for outgoing 496 // connections established by |L2CA_ConnectReq| or accepted incoming 497 // connections. |callbacks| must not be NULL. This function returns true if the 498 // callbacks could be updated, false if not (e.g. |local_cid| was not found). 499 bool L2CA_SetConnectionCallbacks(uint16_t local_cid, 500 const tL2CAP_APPL_INFO* callbacks); 501 502 /******************************************************************************* 503 * 504 * Function L2CA_ErtmConnectRsp 505 * 506 * Description Higher layers call this function to accept an incoming 507 * L2CAP connection, for which they had gotten an connect 508 * indication callback, and for which the higher layer wants 509 * to use Enhanced Retransmission Mode. 510 * 511 * Returns true for success, false for failure 512 * 513 ******************************************************************************/ 514 extern bool L2CA_ErtmConnectRsp(BD_ADDR p_bd_addr, uint8_t id, uint16_t lcid, 515 uint16_t result, uint16_t status, 516 tL2CAP_ERTM_INFO* p_ertm_info); 517 518 /******************************************************************************* 519 * 520 * Function L2CA_ConfigReq 521 * 522 * Description Higher layers call this function to send configuration. 523 * 524 * Returns true if configuration sent, else false 525 * 526 ******************************************************************************/ 527 extern bool L2CA_ConfigReq(uint16_t cid, tL2CAP_CFG_INFO* p_cfg); 528 529 /******************************************************************************* 530 * 531 * Function L2CA_ConfigRsp 532 * 533 * Description Higher layers call this function to send a configuration 534 * response. 535 * 536 * Returns true if configuration response sent, else false 537 * 538 ******************************************************************************/ 539 extern bool L2CA_ConfigRsp(uint16_t cid, tL2CAP_CFG_INFO* p_cfg); 540 541 /******************************************************************************* 542 * 543 * Function L2CA_DisconnectReq 544 * 545 * Description Higher layers call this function to disconnect a channel. 546 * 547 * Returns true if disconnect sent, else false 548 * 549 ******************************************************************************/ 550 extern bool L2CA_DisconnectReq(uint16_t cid); 551 552 /******************************************************************************* 553 * 554 * Function L2CA_DisconnectRsp 555 * 556 * Description Higher layers call this function to acknowledge the 557 * disconnection of a channel. 558 * 559 * Returns void 560 * 561 ******************************************************************************/ 562 extern bool L2CA_DisconnectRsp(uint16_t cid); 563 564 /******************************************************************************* 565 * 566 * Function L2CA_DataWrite 567 * 568 * Description Higher layers call this function to write data. 569 * 570 * Returns L2CAP_DW_SUCCESS, if data accepted, else false 571 * L2CAP_DW_CONGESTED, if data accepted and the channel is 572 * congested 573 * L2CAP_DW_FAILED, if error 574 * 575 ******************************************************************************/ 576 extern uint8_t L2CA_DataWrite(uint16_t cid, BT_HDR* p_data); 577 578 /******************************************************************************* 579 * 580 * Function L2CA_Ping 581 * 582 * Description Higher layers call this function to send an echo request. 583 * 584 * Returns true if echo request sent, else false. 585 * 586 ******************************************************************************/ 587 extern bool L2CA_Ping(BD_ADDR p_bd_addr, tL2CA_ECHO_RSP_CB* p_cb); 588 589 /******************************************************************************* 590 * 591 * Function L2CA_Echo 592 * 593 * Description Higher layers call this function to send an echo request 594 * with application-specific data. 595 * 596 * Returns true if echo request sent, else false. 597 * 598 ******************************************************************************/ 599 extern bool L2CA_Echo(BD_ADDR p_bd_addr, BT_HDR* p_data, 600 tL2CA_ECHO_DATA_CB* p_callback); 601 602 // Given a local channel identifier, |lcid|, this function returns the bound 603 // remote channel identifier, |rcid|, and the ACL link handle, |handle|. If 604 // |lcid| is not known or is invalid, this function returns false and does not 605 // modify the values pointed at by |rcid| and |handle|. |rcid| and |handle| may 606 // be NULL. 607 bool L2CA_GetIdentifiers(uint16_t lcid, uint16_t* rcid, uint16_t* handle); 608 609 /******************************************************************************* 610 * 611 * Function L2CA_SetIdleTimeout 612 * 613 * Description Higher layers call this function to set the idle timeout for 614 * a connection, or for all future connections. The "idle 615 * timeout" is the amount of time that a connection can remain 616 * up with no L2CAP channels on it. A timeout of zero means 617 * that the connection will be torn down immediately when the 618 * last channel is removed. A timeout of 0xFFFF means no 619 * timeout. Values are in seconds. 620 * 621 * Returns true if command succeeded, false if failed 622 * 623 ******************************************************************************/ 624 extern bool L2CA_SetIdleTimeout(uint16_t cid, uint16_t timeout, bool is_global); 625 626 /******************************************************************************* 627 * 628 * Function L2CA_SetIdleTimeoutByBdAddr 629 * 630 * Description Higher layers call this function to set the idle timeout for 631 * a connection. The "idle timeout" is the amount of time that 632 * a connection can remain up with no L2CAP channels on it. 633 * A timeout of zero means that the connection will be torn 634 * down immediately when the last channel is removed. 635 * A timeout of 0xFFFF means no timeout. Values are in seconds. 636 * A bd_addr is the remote BD address. If bd_addr = BT_BD_ANY, 637 * then the idle timeouts for all active l2cap links will be 638 * changed. 639 * 640 * Returns true if command succeeded, false if failed 641 * 642 * NOTE This timeout applies to all logical channels active on the 643 * ACL link. 644 ******************************************************************************/ 645 extern bool L2CA_SetIdleTimeoutByBdAddr(BD_ADDR bd_addr, uint16_t timeout, 646 tBT_TRANSPORT transport); 647 648 /******************************************************************************* 649 * 650 * Function L2CA_SetTraceLevel 651 * 652 * Description This function sets the trace level for L2CAP. If called with 653 * a value of 0xFF, it simply reads the current trace level. 654 * 655 * Returns the new (current) trace level 656 * 657 ******************************************************************************/ 658 extern uint8_t L2CA_SetTraceLevel(uint8_t trace_level); 659 660 /******************************************************************************* 661 * 662 * Function L2CA_SetDesireRole 663 * 664 * Description This function sets the desire role for L2CAP. 665 * If the new role is L2CAP_ROLE_ALLOW_SWITCH, allow switch on 666 * HciCreateConnection. 667 * If the new role is L2CAP_ROLE_DISALLOW_SWITCH, do not allow 668 * switch on HciCreateConnection. 669 * 670 * If the new role is a valid role (HCI_ROLE_MASTER or 671 * HCI_ROLE_SLAVE), the desire role is set to the new value. 672 * Otherwise, it is not changed. 673 * 674 * Returns the new (current) role 675 * 676 ******************************************************************************/ 677 extern uint8_t L2CA_SetDesireRole(uint8_t new_role); 678 679 /******************************************************************************* 680 * 681 * Function L2CA_LocalLoopbackReq 682 * 683 * Description This function sets up a CID for local loopback 684 * 685 * Returns CID of 0 if none. 686 * 687 ******************************************************************************/ 688 extern uint16_t L2CA_LocalLoopbackReq(uint16_t psm, uint16_t handle, 689 BD_ADDR p_bd_addr); 690 691 /******************************************************************************* 692 * 693 * Function L2CA_FlushChannel 694 * 695 * Description This function flushes none, some or all buffers queued up 696 * for xmission for a particular CID. If called with 697 * L2CAP_FLUSH_CHANS_GET (0), it simply returns the number 698 * of buffers queued for that CID L2CAP_FLUSH_CHANS_ALL (0xffff) 699 * flushes all buffers. All other values specifies the maximum 700 * buffers to flush. 701 * 702 * Returns Number of buffers left queued for that CID 703 * 704 ******************************************************************************/ 705 extern uint16_t L2CA_FlushChannel(uint16_t lcid, uint16_t num_to_flush); 706 707 /******************************************************************************* 708 * 709 * Function L2CA_SetAclPriority 710 * 711 * Description Sets the transmission priority for an ACL channel. 712 * (For initial implementation only two values are valid. 713 * L2CAP_PRIORITY_NORMAL and L2CAP_PRIORITY_HIGH). 714 * 715 * Returns true if a valid channel, else false 716 * 717 ******************************************************************************/ 718 extern bool L2CA_SetAclPriority(BD_ADDR bd_addr, uint8_t priority); 719 720 /******************************************************************************* 721 * 722 * Function L2CA_FlowControl 723 * 724 * Description Higher layers call this function to flow control a channel. 725 * 726 * data_enabled - true data flows, false data is stopped 727 * 728 * Returns true if valid channel, else false 729 * 730 ******************************************************************************/ 731 extern bool L2CA_FlowControl(uint16_t cid, bool data_enabled); 732 733 /******************************************************************************* 734 * 735 * Function L2CA_SendTestSFrame 736 * 737 * Description Higher layers call this function to send a test S-frame. 738 * 739 * Returns true if valid Channel, else false 740 * 741 ******************************************************************************/ 742 extern bool L2CA_SendTestSFrame(uint16_t cid, uint8_t sup_type, 743 uint8_t back_track); 744 745 /******************************************************************************* 746 * 747 * Function L2CA_SetTxPriority 748 * 749 * Description Sets the transmission priority for a channel. (FCR Mode) 750 * 751 * Returns true if a valid channel, else false 752 * 753 ******************************************************************************/ 754 extern bool L2CA_SetTxPriority(uint16_t cid, tL2CAP_CHNL_PRIORITY priority); 755 756 /******************************************************************************* 757 * 758 * Function L2CA_RegForNoCPEvt 759 * 760 * Description Register callback for Number of Completed Packets event. 761 * 762 * Input Param p_cb - callback for Number of completed packets event 763 * p_bda - BT address of remote device 764 * 765 * Returns 766 * 767 ******************************************************************************/ 768 extern bool L2CA_RegForNoCPEvt(tL2CA_NOCP_CB* p_cb, BD_ADDR p_bda); 769 770 /******************************************************************************* 771 * 772 * Function L2CA_SetChnlDataRate 773 * 774 * Description Sets the tx/rx data rate for a channel. 775 * 776 * Returns true if a valid channel, else false 777 * 778 ******************************************************************************/ 779 extern bool L2CA_SetChnlDataRate(uint16_t cid, tL2CAP_CHNL_DATA_RATE tx, 780 tL2CAP_CHNL_DATA_RATE rx); 781 782 typedef void(tL2CA_RESERVE_CMPL_CBACK)(void); 783 784 /******************************************************************************* 785 * 786 * Function L2CA_SetFlushTimeout 787 * 788 * Description This function set the automatic flush time out in Baseband 789 * for ACL-U packets. 790 * BdAddr : the remote BD address of ACL link. If it is 791 * BT_DB_ANY then the flush time out will be applied 792 * to all ACL link. 793 * FlushTimeout: flush time out in ms 794 * 0x0000 : No automatic flush 795 * L2CAP_NO_RETRANSMISSION : No retransmission 796 * 0x0002 - 0xFFFE : flush time out, if 797 * (flush_tout * 8) + 3 / 5) 798 * <= HCI_MAX_AUTO_FLUSH_TOUT 799 * (in 625us slot). 800 * Otherwise, return false. 801 * L2CAP_NO_AUTOMATIC_FLUSH : No automatic flush 802 * 803 * Returns true if command succeeded, false if failed 804 * 805 * NOTE This flush timeout applies to all logical channels active on 806 * the ACL link. 807 ******************************************************************************/ 808 extern bool L2CA_SetFlushTimeout(BD_ADDR bd_addr, uint16_t flush_tout); 809 810 /******************************************************************************* 811 * 812 * Function L2CA_DataWriteEx 813 * 814 * Description Higher layers call this function to write data with extended 815 * flags. 816 * flags : L2CAP_FLUSHABLE_CH_BASED 817 * L2CAP_FLUSHABLE_PKT 818 * L2CAP_NON_FLUSHABLE_PKT 819 * 820 * Returns L2CAP_DW_SUCCESS, if data accepted, else false 821 * L2CAP_DW_CONGESTED, if data accepted and the channel is 822 * congested 823 * L2CAP_DW_FAILED, if error 824 * 825 ******************************************************************************/ 826 extern uint8_t L2CA_DataWriteEx(uint16_t cid, BT_HDR* p_data, uint16_t flags); 827 828 /******************************************************************************* 829 * 830 * Function L2CA_SetChnlFlushability 831 * 832 * Description Higher layers call this function to set a channels 833 * flushability flags 834 * 835 * Returns true if CID found, else false 836 * 837 ******************************************************************************/ 838 extern bool L2CA_SetChnlFlushability(uint16_t cid, bool is_flushable); 839 840 /******************************************************************************* 841 * 842 * Function L2CA_GetPeerFeatures 843 * 844 * Description Get a peers features and fixed channel map 845 * 846 * Parameters: BD address of the peer 847 * Pointers to features and channel mask storage area 848 * 849 * Return value: true if peer is connected 850 * 851 ******************************************************************************/ 852 extern bool L2CA_GetPeerFeatures(BD_ADDR bd_addr, uint32_t* p_ext_feat, 853 uint8_t* p_chnl_mask); 854 855 /******************************************************************************* 856 * 857 * Function L2CA_GetBDAddrbyHandle 858 * 859 * Description Get BD address for the given HCI handle 860 * 861 * Parameters: HCI handle 862 * BD address of the peer 863 * 864 * Return value: true if found lcb for the given handle, false otherwise 865 * 866 ******************************************************************************/ 867 extern bool L2CA_GetBDAddrbyHandle(uint16_t handle, BD_ADDR bd_addr); 868 869 /******************************************************************************* 870 * 871 * Function L2CA_GetChnlFcrMode 872 * 873 * Description Get the channel FCR mode 874 * 875 * Parameters: Local CID 876 * 877 * Return value: Channel mode 878 * 879 ******************************************************************************/ 880 extern uint8_t L2CA_GetChnlFcrMode(uint16_t lcid); 881 882 /******************************************************************************* 883 * 884 * UCD callback prototypes 885 * 886 ******************************************************************************/ 887 888 /* UCD discovery. Parameters are 889 * BD Address of remote 890 * Data Type 891 * Data 892 */ 893 #define L2CAP_UCD_INFO_TYPE_RECEPTION 0x01 894 #define L2CAP_UCD_INFO_TYPE_MTU 0x02 895 896 typedef void(tL2CA_UCD_DISCOVER_CB)(BD_ADDR, uint8_t, uint32_t); 897 898 /* UCD data received. Parameters are 899 * BD Address of remote 900 * Pointer to buffer with data 901 */ 902 typedef void(tL2CA_UCD_DATA_CB)(BD_ADDR, BT_HDR*); 903 904 /* Congestion status callback protype. This callback is optional. If 905 * an application tries to send data when the transmit queue is full, 906 * the data will anyways be dropped. The parameter is: 907 * remote BD_ADDR 908 * true if congested, false if uncongested 909 */ 910 typedef void(tL2CA_UCD_CONGESTION_STATUS_CB)(BD_ADDR, bool); 911 912 /* UCD registration info (the callback addresses and PSM) 913 */ 914 typedef struct { 915 tL2CA_UCD_DISCOVER_CB* pL2CA_UCD_Discover_Cb; 916 tL2CA_UCD_DATA_CB* pL2CA_UCD_Data_Cb; 917 tL2CA_UCD_CONGESTION_STATUS_CB* pL2CA_UCD_Congestion_Status_Cb; 918 } tL2CAP_UCD_CB_INFO; 919 920 /******************************************************************************* 921 * 922 * Function L2CA_UcdRegister 923 * 924 * Description Register PSM on UCD. 925 * 926 * Parameters: tL2CAP_UCD_CB_INFO 927 * 928 * Return value: true if successs 929 * 930 ******************************************************************************/ 931 extern bool L2CA_UcdRegister(uint16_t psm, tL2CAP_UCD_CB_INFO* p_cb_info); 932 933 /******************************************************************************* 934 * 935 * Function L2CA_UcdDeregister 936 * 937 * Description Deregister PSM on UCD. 938 * 939 * Parameters: PSM 940 * 941 * Return value: true if successs 942 * 943 ******************************************************************************/ 944 extern bool L2CA_UcdDeregister(uint16_t psm); 945 946 /******************************************************************************* 947 * 948 * Function L2CA_UcdDiscover 949 * 950 * Description Discover UCD of remote device. 951 * 952 * Parameters: PSM 953 * BD_ADDR of remote device 954 * info_type : L2CAP_UCD_INFO_TYPE_RECEPTION 955 * L2CAP_UCD_INFO_TYPE_MTU 956 * 957 * 958 * Return value: true if successs 959 * 960 ******************************************************************************/ 961 extern bool L2CA_UcdDiscover(uint16_t psm, BD_ADDR rem_bda, uint8_t info_type); 962 963 /******************************************************************************* 964 * 965 * Function L2CA_UcdDataWrite 966 * 967 * Description Send UCD to remote device 968 * 969 * Parameters: PSM 970 * BD Address of remote 971 * Pointer to buffer of type BT_HDR 972 * flags : L2CAP_FLUSHABLE_CH_BASED 973 * L2CAP_FLUSHABLE_PKT 974 * L2CAP_NON_FLUSHABLE_PKT 975 * 976 * Return value L2CAP_DW_SUCCESS, if data accepted 977 * L2CAP_DW_FAILED, if error 978 * 979 ******************************************************************************/ 980 extern uint16_t L2CA_UcdDataWrite(uint16_t psm, BD_ADDR rem_bda, BT_HDR* p_buf, 981 uint16_t flags); 982 983 /******************************************************************************* 984 * 985 * Function L2CA_UcdSetIdleTimeout 986 * 987 * Description Set UCD Idle timeout. 988 * 989 * Parameters: BD Addr 990 * Timeout in second 991 * 992 * Return value: true if successs 993 * 994 ******************************************************************************/ 995 extern bool L2CA_UcdSetIdleTimeout(BD_ADDR rem_bda, uint16_t timeout); 996 997 /******************************************************************************* 998 * 999 * Function L2CA_UCDSetTxPriority 1000 * 1001 * Description Sets the transmission priority for a connectionless channel. 1002 * 1003 * Returns true if a valid channel, else false 1004 * 1005 ******************************************************************************/ 1006 extern bool L2CA_UCDSetTxPriority(BD_ADDR rem_bda, 1007 tL2CAP_CHNL_PRIORITY priority); 1008 1009 /******************************************************************************* 1010 * 1011 * Fixed Channel callback prototypes 1012 * 1013 ******************************************************************************/ 1014 1015 /* Fixed channel connected and disconnected. Parameters are 1016 * channel 1017 * BD Address of remote 1018 * true if channel is connected, false if disconnected 1019 * Reason for connection failure 1020 * transport : physical transport, BR/EDR or LE 1021 */ 1022 typedef void(tL2CA_FIXED_CHNL_CB)(uint16_t, BD_ADDR, bool, uint16_t, 1023 tBT_TRANSPORT); 1024 1025 /* Signalling data received. Parameters are 1026 * channel 1027 * BD Address of remote 1028 * Pointer to buffer with data 1029 */ 1030 typedef void(tL2CA_FIXED_DATA_CB)(uint16_t, BD_ADDR, BT_HDR*); 1031 1032 /* Congestion status callback protype. This callback is optional. If 1033 * an application tries to send data when the transmit queue is full, 1034 * the data will anyways be dropped. The parameter is: 1035 * remote BD_ADDR 1036 * true if congested, false if uncongested 1037 */ 1038 typedef void(tL2CA_FIXED_CONGESTION_STATUS_CB)(BD_ADDR, bool); 1039 1040 /* Fixed channel registration info (the callback addresses and channel config) 1041 */ 1042 typedef struct { 1043 tL2CA_FIXED_CHNL_CB* pL2CA_FixedConn_Cb; 1044 tL2CA_FIXED_DATA_CB* pL2CA_FixedData_Cb; 1045 tL2CA_FIXED_CONGESTION_STATUS_CB* pL2CA_FixedCong_Cb; 1046 tL2CAP_FCR_OPTS fixed_chnl_opts; 1047 1048 uint16_t default_idle_tout; 1049 tL2CA_TX_COMPLETE_CB* 1050 pL2CA_FixedTxComplete_Cb; /* fixed channel tx complete callback */ 1051 } tL2CAP_FIXED_CHNL_REG; 1052 1053 #if (L2CAP_NUM_FIXED_CHNLS > 0) 1054 /******************************************************************************* 1055 * 1056 * Function L2CA_RegisterFixedChannel 1057 * 1058 * Description Register a fixed channel. 1059 * 1060 * Parameters: Fixed Channel # 1061 * Channel Callbacks and config 1062 * 1063 * Return value: true if registered OK 1064 * 1065 ******************************************************************************/ 1066 extern bool L2CA_RegisterFixedChannel(uint16_t fixed_cid, 1067 tL2CAP_FIXED_CHNL_REG* p_freg); 1068 1069 /******************************************************************************* 1070 * 1071 * Function L2CA_ConnectFixedChnl 1072 * 1073 * Description Connect an fixed signalling channel to a remote device. 1074 * 1075 * Parameters: Fixed CID 1076 * BD Address of remote 1077 * 1078 * Return value: true if connection started 1079 * 1080 ******************************************************************************/ 1081 extern bool L2CA_ConnectFixedChnl(uint16_t fixed_cid, BD_ADDR bd_addr); 1082 extern bool L2CA_ConnectFixedChnl(uint16_t fixed_cid, BD_ADDR bd_addr, 1083 uint8_t initiating_phys); 1084 1085 /******************************************************************************* 1086 * 1087 * Function L2CA_SendFixedChnlData 1088 * 1089 * Description Write data on a fixed signalling channel. 1090 * 1091 * Parameters: Fixed CID 1092 * BD Address of remote 1093 * Pointer to buffer of type BT_HDR 1094 * 1095 * Return value L2CAP_DW_SUCCESS, if data accepted 1096 * L2CAP_DW_FAILED, if error 1097 * 1098 ******************************************************************************/ 1099 extern uint16_t L2CA_SendFixedChnlData(uint16_t fixed_cid, BD_ADDR rem_bda, 1100 BT_HDR* p_buf); 1101 1102 /******************************************************************************* 1103 * 1104 * Function L2CA_RemoveFixedChnl 1105 * 1106 * Description Remove a fixed channel to a remote device. 1107 * 1108 * Parameters: Fixed CID 1109 * BD Address of remote 1110 * Idle timeout to use (or 0xFFFF if don't care) 1111 * 1112 * Return value: true if channel removed 1113 * 1114 ******************************************************************************/ 1115 extern bool L2CA_RemoveFixedChnl(uint16_t fixed_cid, BD_ADDR rem_bda); 1116 1117 /******************************************************************************* 1118 * 1119 * Function L2CA_SetFixedChannelTout 1120 * 1121 * Description Higher layers call this function to set the idle timeout for 1122 * a fixed channel. The "idle timeout" is the amount of time 1123 * that a connection can remain up with no L2CAP channels on 1124 * it. A timeout of zero means that the connection will be torn 1125 * down immediately when the last channel is removed. 1126 * A timeout of 0xFFFF means no timeout. Values are in seconds. 1127 * A bd_addr is the remote BD address. If bd_addr = BT_BD_ANY, 1128 * then the idle timeouts for all active l2cap links will be 1129 * changed. 1130 * 1131 * Returns true if command succeeded, false if failed 1132 * 1133 ******************************************************************************/ 1134 extern bool L2CA_SetFixedChannelTout(BD_ADDR rem_bda, uint16_t fixed_cid, 1135 uint16_t idle_tout); 1136 1137 #endif /* (L2CAP_NUM_FIXED_CHNLS > 0) */ 1138 1139 /******************************************************************************* 1140 * 1141 * Function L2CA_GetCurrentConfig 1142 * 1143 * Description This function returns configurations of L2CAP channel 1144 * pp_our_cfg : pointer of our saved configuration options 1145 * p_our_cfg_bits : valid config in bitmap 1146 * pp_peer_cfg: pointer of peer's saved configuration options 1147 * p_peer_cfg_bits : valid config in bitmap 1148 * 1149 * Returns true if successful 1150 * 1151 ******************************************************************************/ 1152 extern bool L2CA_GetCurrentConfig(uint16_t lcid, tL2CAP_CFG_INFO** pp_our_cfg, 1153 tL2CAP_CH_CFG_BITS* p_our_cfg_bits, 1154 tL2CAP_CFG_INFO** pp_peer_cfg, 1155 tL2CAP_CH_CFG_BITS* p_peer_cfg_bits); 1156 1157 /******************************************************************************* 1158 * 1159 * Function L2CA_GetConnectionConfig 1160 * 1161 * Description This function polulates the mtu, remote cid & lm_handle for 1162 * a given local L2CAP channel 1163 * 1164 * Returns true if successful 1165 * 1166 ******************************************************************************/ 1167 extern bool L2CA_GetConnectionConfig(uint16_t lcid, uint16_t* mtu, 1168 uint16_t* rcid, uint16_t* handle); 1169 1170 /******************************************************************************* 1171 * 1172 * Function L2CA_CancelBleConnectReq 1173 * 1174 * Description Cancel a pending connection attempt to a BLE device. 1175 * 1176 * Parameters: BD Address of remote 1177 * 1178 * Return value: true if connection was cancelled 1179 * 1180 ******************************************************************************/ 1181 extern bool L2CA_CancelBleConnectReq(BD_ADDR rem_bda); 1182 1183 /******************************************************************************* 1184 * 1185 * Function L2CA_UpdateBleConnParams 1186 * 1187 * Description Update BLE connection parameters. 1188 * 1189 * Parameters: BD Address of remote 1190 * 1191 * Return value: true if update started 1192 * 1193 ******************************************************************************/ 1194 extern bool L2CA_UpdateBleConnParams(BD_ADDR rem_bdRa, uint16_t min_int, 1195 uint16_t max_int, uint16_t latency, 1196 uint16_t timeout); 1197 1198 /******************************************************************************* 1199 * 1200 * Function L2CA_EnableUpdateBleConnParams 1201 * 1202 * Description Update BLE connection parameters. 1203 * 1204 * Parameters: BD Address of remote 1205 * enable flag 1206 * 1207 * Return value: true if update started 1208 * 1209 ******************************************************************************/ 1210 extern bool L2CA_EnableUpdateBleConnParams(BD_ADDR rem_bda, bool enable); 1211 1212 /******************************************************************************* 1213 * 1214 * Function L2CA_GetBleConnRole 1215 * 1216 * Description This function returns the connection role. 1217 * 1218 * Returns link role. 1219 * 1220 ******************************************************************************/ 1221 extern uint8_t L2CA_GetBleConnRole(BD_ADDR bd_addr); 1222 1223 /******************************************************************************* 1224 * 1225 * Function L2CA_GetDisconnectReason 1226 * 1227 * Description This function returns the disconnect reason code. 1228 * 1229 * Parameters: BD Address of remote 1230 * Physical transport for the L2CAP connection (BR/EDR or LE) 1231 * 1232 * Returns disconnect reason 1233 * 1234 ******************************************************************************/ 1235 extern uint16_t L2CA_GetDisconnectReason(BD_ADDR remote_bda, 1236 tBT_TRANSPORT transport); 1237 1238 #endif /* L2C_API_H */ 1239