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 code 22 * 23 ******************************************************************************/ 24 25 #define LOG_TAG "bt_l2cap" 26 27 #include <base/logging.h> 28 #include <stdio.h> 29 #include <stdlib.h> 30 #include <string.h> 31 32 #include "bt_common.h" 33 #include "bt_types.h" 34 #include "btm_api.h" 35 #include "btu.h" 36 #include "device/include/controller.h" 37 #include "hcidefs.h" 38 #include "hcimsgs.h" 39 #include "l2c_int.h" 40 #include "l2cdefs.h" 41 #include "osi/include/allocator.h" 42 #include "osi/include/log.h" 43 44 extern fixed_queue_t* btu_general_alarm_queue; 45 46 /******************************************************************************* 47 * 48 * Function L2CA_Register 49 * 50 * Description Other layers call this function to register for L2CAP 51 * services. 52 * 53 * Returns PSM to use or zero if error. Typically, the PSM returned 54 * is the same as was passed in, but for an outgoing-only 55 * connection to a dynamic PSM, a "virtual" PSM is returned 56 * and should be used in the calls to L2CA_ConnectReq(), 57 * L2CA_ErtmConnectReq() and L2CA_Deregister() 58 * 59 ******************************************************************************/ 60 uint16_t L2CA_Register(uint16_t psm, tL2CAP_APPL_INFO* p_cb_info) { 61 tL2C_RCB* p_rcb; 62 uint16_t vpsm = psm; 63 64 L2CAP_TRACE_API("L2CAP - L2CA_Register() called for PSM: 0x%04x", psm); 65 66 /* Verify that the required callback info has been filled in 67 ** Note: Connection callbacks are required but not checked 68 ** for here because it is possible to be only a client 69 ** or only a server. 70 */ 71 if ((!p_cb_info->pL2CA_ConfigCfm_Cb) || (!p_cb_info->pL2CA_ConfigInd_Cb) || 72 (!p_cb_info->pL2CA_DataInd_Cb) || (!p_cb_info->pL2CA_DisconnectInd_Cb)) { 73 L2CAP_TRACE_ERROR("L2CAP - no cb registering PSM: 0x%04x", psm); 74 return (0); 75 } 76 77 /* Verify PSM is valid */ 78 if (L2C_INVALID_PSM(psm)) { 79 L2CAP_TRACE_ERROR("L2CAP - invalid PSM value, PSM: 0x%04x", psm); 80 return (0); 81 } 82 83 /* Check if this is a registration for an outgoing-only connection to */ 84 /* a dynamic PSM. If so, allocate a "virtual" PSM for the app to use. */ 85 if ((psm >= 0x1001) && (p_cb_info->pL2CA_ConnectInd_Cb == NULL)) { 86 for (vpsm = 0x1002; vpsm < 0x8000; vpsm += 2) { 87 p_rcb = l2cu_find_rcb_by_psm(vpsm); 88 if (p_rcb == NULL) break; 89 } 90 91 L2CAP_TRACE_API("L2CA_Register - Real PSM: 0x%04x Virtual PSM: 0x%04x", 92 psm, vpsm); 93 } 94 95 /* If registration block already there, just overwrite it */ 96 p_rcb = l2cu_find_rcb_by_psm(vpsm); 97 if (p_rcb == NULL) { 98 p_rcb = l2cu_allocate_rcb(vpsm); 99 if (p_rcb == NULL) { 100 L2CAP_TRACE_WARNING("L2CAP - no RCB available, PSM: 0x%04x vPSM: 0x%04x", 101 psm, vpsm); 102 return (0); 103 } 104 } 105 106 p_rcb->api = *p_cb_info; 107 p_rcb->real_psm = psm; 108 109 return (vpsm); 110 } 111 112 /******************************************************************************* 113 * 114 * Function L2CA_Deregister 115 * 116 * Description Other layers call this function to de-register for L2CAP 117 * services. 118 * 119 * Returns void 120 * 121 ******************************************************************************/ 122 void L2CA_Deregister(uint16_t psm) { 123 tL2C_RCB* p_rcb; 124 tL2C_CCB* p_ccb; 125 tL2C_LCB* p_lcb; 126 int ii; 127 128 L2CAP_TRACE_API("L2CAP - L2CA_Deregister() called for PSM: 0x%04x", psm); 129 130 p_rcb = l2cu_find_rcb_by_psm(psm); 131 if (p_rcb != NULL) { 132 p_lcb = &l2cb.lcb_pool[0]; 133 for (ii = 0; ii < MAX_L2CAP_LINKS; ii++, p_lcb++) { 134 if (p_lcb->in_use) { 135 p_ccb = p_lcb->ccb_queue.p_first_ccb; 136 if ((p_ccb == NULL) || (p_lcb->link_state == LST_DISCONNECTING)) { 137 continue; 138 } 139 140 if ((p_ccb->in_use) && 141 ((p_ccb->chnl_state == CST_W4_L2CAP_DISCONNECT_RSP) || 142 (p_ccb->chnl_state == CST_W4_L2CA_DISCONNECT_RSP))) { 143 continue; 144 } 145 146 if (p_ccb->p_rcb == p_rcb) { 147 l2c_csm_execute(p_ccb, L2CEVT_L2CA_DISCONNECT_REQ, NULL); 148 } 149 } 150 } 151 l2cu_release_rcb(p_rcb); 152 } else { 153 L2CAP_TRACE_WARNING("L2CAP - PSM: 0x%04x not found for deregistration", 154 psm); 155 } 156 } 157 158 /******************************************************************************* 159 * 160 * Function L2CA_AllocatePSM 161 * 162 * Description Other layers call this function to find an unused PSM for 163 * L2CAP services. 164 * 165 * Returns PSM to use. 166 * 167 ******************************************************************************/ 168 uint16_t L2CA_AllocatePSM(void) { 169 bool done = false; 170 uint16_t psm = l2cb.dyn_psm; 171 172 L2CAP_TRACE_API("L2CA_AllocatePSM"); 173 while (!done) { 174 psm += 2; 175 if (psm > 0xfeff) { 176 psm = 0x1001; 177 } else if (psm & 0x0100) { 178 /* the upper byte must be even */ 179 psm += 0x0100; 180 } 181 182 /* if psm is in range of reserved BRCM Aware features */ 183 if ((BRCM_RESERVED_PSM_START <= psm) && (psm <= BRCM_RESERVED_PSM_END)) 184 continue; 185 186 /* make sure the newlly allocated psm is not used right now */ 187 if ((l2cu_find_rcb_by_psm(psm)) == NULL) done = true; 188 } 189 l2cb.dyn_psm = psm; 190 191 return (psm); 192 } 193 194 /******************************************************************************* 195 * 196 * Function L2CA_ConnectReq 197 * 198 * Description Higher layers call this function to create an L2CAP 199 * connection. Note that the connection is not established at 200 * this time, but connection establishment gets started. The 201 * callback function will be invoked when connection 202 * establishes or fails. 203 * 204 * Returns the CID of the connection, or 0 if it failed to start 205 * 206 ******************************************************************************/ 207 uint16_t L2CA_ConnectReq(uint16_t psm, BD_ADDR p_bd_addr) { 208 return L2CA_ErtmConnectReq(psm, p_bd_addr, NULL); 209 } 210 211 /******************************************************************************* 212 * 213 * Function L2CA_ErtmConnectReq 214 * 215 * Description Higher layers call this function to create an L2CAP 216 * connection. Note that the connection is not established at 217 * this time, but connection establishment gets started. The 218 * callback function will be invoked when connection 219 * establishes or fails. 220 * 221 * Parameters: PSM: L2CAP PSM for the connection 222 * BD address of the peer 223 * Enhaced retransmission mode configurations 224 225 * Returns the CID of the connection, or 0 if it failed to start 226 * 227 ******************************************************************************/ 228 uint16_t L2CA_ErtmConnectReq(uint16_t psm, BD_ADDR p_bd_addr, 229 tL2CAP_ERTM_INFO* p_ertm_info) { 230 tL2C_LCB* p_lcb; 231 tL2C_CCB* p_ccb; 232 tL2C_RCB* p_rcb; 233 234 L2CAP_TRACE_API( 235 "L2CA_ErtmConnectReq() PSM: 0x%04x BDA: %08x%04x p_ertm_info: 0x%08x " 236 "allowed:0x%x preferred:%d", 237 psm, (p_bd_addr[0] << 24) + (p_bd_addr[1] << 16) + (p_bd_addr[2] << 8) + 238 p_bd_addr[3], 239 (p_bd_addr[4] << 8) + p_bd_addr[5], p_ertm_info, 240 (p_ertm_info) ? p_ertm_info->allowed_modes : 0, 241 (p_ertm_info) ? p_ertm_info->preferred_mode : 0); 242 243 /* Fail if we have not established communications with the controller */ 244 if (!BTM_IsDeviceUp()) { 245 L2CAP_TRACE_WARNING("L2CAP connect req - BTU not ready"); 246 return (0); 247 } 248 /* Fail if the PSM is not registered */ 249 p_rcb = l2cu_find_rcb_by_psm(psm); 250 if (p_rcb == NULL) { 251 L2CAP_TRACE_WARNING("L2CAP - no RCB for L2CA_conn_req, PSM: 0x%04x", psm); 252 return (0); 253 } 254 255 /* First, see if we already have a link to the remote */ 256 /* assume all ERTM l2cap connection is going over BR/EDR for now */ 257 p_lcb = l2cu_find_lcb_by_bd_addr(p_bd_addr, BT_TRANSPORT_BR_EDR); 258 if (p_lcb == NULL) { 259 /* No link. Get an LCB and start link establishment */ 260 p_lcb = l2cu_allocate_lcb(p_bd_addr, false, BT_TRANSPORT_BR_EDR); 261 /* currently use BR/EDR for ERTM mode l2cap connection */ 262 if ((p_lcb == NULL) || 263 (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == false)) { 264 L2CAP_TRACE_WARNING( 265 "L2CAP - conn not started for PSM: 0x%04x p_lcb: 0x%08x", psm, 266 p_lcb); 267 return (0); 268 } 269 } 270 271 /* Allocate a channel control block */ 272 p_ccb = l2cu_allocate_ccb(p_lcb, 0); 273 if (p_ccb == NULL) { 274 L2CAP_TRACE_WARNING("L2CAP - no CCB for L2CA_conn_req, PSM: 0x%04x", psm); 275 return (0); 276 } 277 278 /* Save registration info */ 279 p_ccb->p_rcb = p_rcb; 280 281 if (p_ertm_info) { 282 p_ccb->ertm_info = *p_ertm_info; 283 284 /* Replace default indicators with the actual default pool */ 285 if (p_ccb->ertm_info.fcr_rx_buf_size == L2CAP_INVALID_ERM_BUF_SIZE) 286 p_ccb->ertm_info.fcr_rx_buf_size = L2CAP_FCR_RX_BUF_SIZE; 287 288 if (p_ccb->ertm_info.fcr_tx_buf_size == L2CAP_INVALID_ERM_BUF_SIZE) 289 p_ccb->ertm_info.fcr_tx_buf_size = L2CAP_FCR_TX_BUF_SIZE; 290 291 if (p_ccb->ertm_info.user_rx_buf_size == L2CAP_INVALID_ERM_BUF_SIZE) 292 p_ccb->ertm_info.user_rx_buf_size = L2CAP_USER_RX_BUF_SIZE; 293 294 if (p_ccb->ertm_info.user_tx_buf_size == L2CAP_INVALID_ERM_BUF_SIZE) 295 p_ccb->ertm_info.user_tx_buf_size = L2CAP_USER_TX_BUF_SIZE; 296 297 p_ccb->max_rx_mtu = 298 p_ertm_info->user_rx_buf_size - 299 (L2CAP_MIN_OFFSET + L2CAP_SDU_LEN_OFFSET + L2CAP_FCS_LEN); 300 } 301 302 /* If link is up, start the L2CAP connection */ 303 if (p_lcb->link_state == LST_CONNECTED) { 304 l2c_csm_execute(p_ccb, L2CEVT_L2CA_CONNECT_REQ, NULL); 305 } 306 307 /* If link is disconnecting, save link info to retry after disconnect 308 * Possible Race condition when a reconnect occurs 309 * on the channel during a disconnect of link. This 310 * ccb will be automatically retried after link disconnect 311 * arrives 312 */ 313 else if (p_lcb->link_state == LST_DISCONNECTING) { 314 L2CAP_TRACE_DEBUG("L2CAP API - link disconnecting: RETRY LATER"); 315 316 /* Save ccb so it can be started after disconnect is finished */ 317 p_lcb->p_pending_ccb = p_ccb; 318 } 319 320 L2CAP_TRACE_API("L2CAP - L2CA_conn_req(psm: 0x%04x) returned CID: 0x%04x", 321 psm, p_ccb->local_cid); 322 323 /* Return the local CID as our handle */ 324 return (p_ccb->local_cid); 325 } 326 327 /******************************************************************************* 328 * 329 * Function L2CA_RegisterLECoc 330 * 331 * Description Other layers call this function to register for L2CAP 332 * Connection Oriented Channel. 333 * 334 * Returns PSM to use or zero if error. Typically, the PSM returned 335 * is the same as was passed in, but for an outgoing-only 336 * connection to a dynamic PSM, a "virtual" PSM is returned 337 * and should be used in the calls to L2CA_ConnectLECocReq() 338 * and L2CA_DeregisterLECoc() 339 * 340 ******************************************************************************/ 341 uint16_t L2CA_RegisterLECoc(uint16_t psm, tL2CAP_APPL_INFO* p_cb_info) { 342 L2CAP_TRACE_API("%s called for LE PSM: 0x%04x", __func__, psm); 343 344 /* Verify that the required callback info has been filled in 345 ** Note: Connection callbacks are required but not checked 346 ** for here because it is possible to be only a client 347 ** or only a server. 348 */ 349 if ((!p_cb_info->pL2CA_DataInd_Cb) || (!p_cb_info->pL2CA_DisconnectInd_Cb)) { 350 L2CAP_TRACE_ERROR("%s No cb registering BLE PSM: 0x%04x", __func__, psm); 351 return 0; 352 } 353 354 /* Verify PSM is valid */ 355 if (!L2C_IS_VALID_LE_PSM(psm)) { 356 L2CAP_TRACE_ERROR("%s Invalid BLE PSM value, PSM: 0x%04x", __func__, psm); 357 return 0; 358 } 359 360 tL2C_RCB* p_rcb; 361 uint16_t vpsm = psm; 362 363 /* Check if this is a registration for an outgoing-only connection to */ 364 /* a dynamic PSM. If so, allocate a "virtual" PSM for the app to use. */ 365 if ((psm >= 0x0080) && (p_cb_info->pL2CA_ConnectInd_Cb == NULL)) { 366 for (vpsm = 0x0080; vpsm < 0x0100; vpsm++) { 367 p_rcb = l2cu_find_ble_rcb_by_psm(vpsm); 368 if (p_rcb == NULL) break; 369 } 370 371 L2CAP_TRACE_API("%s Real PSM: 0x%04x Virtual PSM: 0x%04x", __func__, psm, 372 vpsm); 373 } 374 375 /* If registration block already there, just overwrite it */ 376 p_rcb = l2cu_find_ble_rcb_by_psm(vpsm); 377 if (p_rcb == NULL) { 378 p_rcb = l2cu_allocate_ble_rcb(vpsm); 379 if (p_rcb == NULL) { 380 L2CAP_TRACE_WARNING("%s No BLE RCB available, PSM: 0x%04x vPSM: 0x%04x", 381 __func__, psm, vpsm); 382 return 0; 383 } 384 } 385 386 p_rcb->api = *p_cb_info; 387 p_rcb->real_psm = psm; 388 389 return vpsm; 390 } 391 392 /******************************************************************************* 393 * 394 * Function L2CA_DeregisterLECoc 395 * 396 * Description Other layers call this function to de-register for L2CAP 397 * Connection Oriented Channel. 398 * 399 * Returns void 400 * 401 ******************************************************************************/ 402 void L2CA_DeregisterLECoc(uint16_t psm) { 403 L2CAP_TRACE_API("%s called for PSM: 0x%04x", __func__, psm); 404 405 tL2C_RCB* p_rcb = l2cu_find_ble_rcb_by_psm(psm); 406 if (p_rcb == NULL) { 407 L2CAP_TRACE_WARNING("%s PSM: 0x%04x not found for deregistration", psm); 408 return; 409 } 410 411 tL2C_LCB* p_lcb = &l2cb.lcb_pool[0]; 412 for (int i = 0; i < MAX_L2CAP_LINKS; i++, p_lcb++) { 413 if (!p_lcb->in_use || p_lcb->transport != BT_TRANSPORT_LE) continue; 414 415 tL2C_CCB* p_ccb = p_lcb->ccb_queue.p_first_ccb; 416 if ((p_ccb == NULL) || (p_lcb->link_state == LST_DISCONNECTING)) continue; 417 418 if (p_ccb->in_use && (p_ccb->chnl_state == CST_W4_L2CAP_DISCONNECT_RSP || 419 p_ccb->chnl_state == CST_W4_L2CA_DISCONNECT_RSP)) 420 continue; 421 422 if (p_ccb->p_rcb == p_rcb) 423 l2c_csm_execute(p_ccb, L2CEVT_L2CA_DISCONNECT_REQ, NULL); 424 } 425 426 l2cu_release_rcb(p_rcb); 427 } 428 429 /******************************************************************************* 430 * 431 * Function L2CA_ConnectLECocReq 432 * 433 * Description Higher layers call this function to create an L2CAP 434 * connection. Note that the connection is not established at 435 * this time, but connection establishment gets started. The 436 * callback function will be invoked when connection 437 * establishes or fails. 438 * 439 * Parameters: PSM: L2CAP PSM for the connection 440 * BD address of the peer 441 * Local Coc configurations 442 443 * Returns the CID of the connection, or 0 if it failed to start 444 * 445 ******************************************************************************/ 446 uint16_t L2CA_ConnectLECocReq(uint16_t psm, BD_ADDR p_bd_addr, 447 tL2CAP_LE_CFG_INFO* p_cfg) { 448 L2CAP_TRACE_API("%s PSM: 0x%04x BDA: %02x:%02x:%02x:%02x:%02x:%02x", __func__, 449 psm, p_bd_addr[0], p_bd_addr[1], p_bd_addr[2], p_bd_addr[3], 450 p_bd_addr[4], p_bd_addr[5]); 451 452 /* Fail if we have not established communications with the controller */ 453 if (!BTM_IsDeviceUp()) { 454 L2CAP_TRACE_WARNING("%s BTU not ready", __func__); 455 return 0; 456 } 457 458 /* Fail if the PSM is not registered */ 459 tL2C_RCB* p_rcb = l2cu_find_ble_rcb_by_psm(psm); 460 if (p_rcb == NULL) { 461 L2CAP_TRACE_WARNING("%s No BLE RCB, PSM: 0x%04x", __func__, psm); 462 return 0; 463 } 464 465 /* First, see if we already have a le link to the remote */ 466 tL2C_LCB* p_lcb = l2cu_find_lcb_by_bd_addr(p_bd_addr, BT_TRANSPORT_LE); 467 if (p_lcb == NULL) { 468 /* No link. Get an LCB and start link establishment */ 469 p_lcb = l2cu_allocate_lcb(p_bd_addr, false, BT_TRANSPORT_LE); 470 if ((p_lcb == NULL) 471 /* currently use BR/EDR for ERTM mode l2cap connection */ 472 || (l2cu_create_conn(p_lcb, BT_TRANSPORT_LE) == false)) { 473 L2CAP_TRACE_WARNING("%s conn not started for PSM: 0x%04x p_lcb: 0x%08x", 474 __func__, psm, p_lcb); 475 return 0; 476 } 477 } 478 479 /* Allocate a channel control block */ 480 tL2C_CCB* p_ccb = l2cu_allocate_ccb(p_lcb, 0); 481 if (p_ccb == NULL) { 482 L2CAP_TRACE_WARNING("%s no CCB, PSM: 0x%04x", __func__, psm); 483 return 0; 484 } 485 486 /* Save registration info */ 487 p_ccb->p_rcb = p_rcb; 488 489 /* Save the configuration */ 490 if (p_cfg) memcpy(&p_ccb->local_conn_cfg, p_cfg, sizeof(tL2CAP_LE_CFG_INFO)); 491 492 /* If link is up, start the L2CAP connection */ 493 if (p_lcb->link_state == LST_CONNECTED) { 494 if (p_ccb->p_lcb->transport == BT_TRANSPORT_LE) { 495 L2CAP_TRACE_DEBUG("%s LE Link is up", __func__); 496 l2c_csm_execute(p_ccb, L2CEVT_L2CA_CONNECT_REQ, NULL); 497 } 498 } 499 500 /* If link is disconnecting, save link info to retry after disconnect 501 * Possible Race condition when a reconnect occurs 502 * on the channel during a disconnect of link. This 503 * ccb will be automatically retried after link disconnect 504 * arrives 505 */ 506 else if (p_lcb->link_state == LST_DISCONNECTING) { 507 L2CAP_TRACE_DEBUG("%s link disconnecting: RETRY LATER", __func__); 508 509 /* Save ccb so it can be started after disconnect is finished */ 510 p_lcb->p_pending_ccb = p_ccb; 511 } 512 513 L2CAP_TRACE_API("%s(psm: 0x%04x) returned CID: 0x%04x", __func__, psm, 514 p_ccb->local_cid); 515 516 /* Return the local CID as our handle */ 517 return p_ccb->local_cid; 518 } 519 520 /******************************************************************************* 521 * 522 * Function L2CA_ConnectLECocRsp 523 * 524 * Description Higher layers call this function to accept an incoming 525 * L2CAP COC connection, for which they had gotten an connect 526 * indication callback. 527 * 528 * Returns true for success, false for failure 529 * 530 ******************************************************************************/ 531 bool L2CA_ConnectLECocRsp(BD_ADDR p_bd_addr, uint8_t id, uint16_t lcid, 532 uint16_t result, uint16_t status, 533 tL2CAP_LE_CFG_INFO* p_cfg) { 534 L2CAP_TRACE_API( 535 "%s CID: 0x%04x Result: %d Status: %d BDA: %02x:%02x:%02x:%02x:%02x:%02x", 536 __func__, lcid, result, status, p_bd_addr[0], p_bd_addr[1], p_bd_addr[2], 537 p_bd_addr[3], p_bd_addr[4], p_bd_addr[5]); 538 539 /* First, find the link control block */ 540 tL2C_LCB* p_lcb = l2cu_find_lcb_by_bd_addr(p_bd_addr, BT_TRANSPORT_LE); 541 if (p_lcb == NULL) { 542 /* No link. Get an LCB and start link establishment */ 543 L2CAP_TRACE_WARNING("%s no LCB", __func__); 544 return false; 545 } 546 547 /* Now, find the channel control block */ 548 tL2C_CCB* p_ccb = l2cu_find_ccb_by_cid(p_lcb, lcid); 549 if (p_ccb == NULL) { 550 L2CAP_TRACE_WARNING("%s no CCB", __func__); 551 return false; 552 } 553 554 /* The IDs must match */ 555 if (p_ccb->remote_id != id) { 556 L2CAP_TRACE_WARNING("%s bad id. Expected: %d Got: %d", __func__, 557 p_ccb->remote_id, id); 558 return false; 559 } 560 561 if (p_cfg) memcpy(&p_ccb->local_conn_cfg, p_cfg, sizeof(tL2CAP_LE_CFG_INFO)); 562 563 if (result == L2CAP_CONN_OK) 564 l2c_csm_execute(p_ccb, L2CEVT_L2CA_CONNECT_RSP, NULL); 565 else { 566 tL2C_CONN_INFO conn_info; 567 memcpy(conn_info.bd_addr, p_bd_addr, BD_ADDR_LEN); 568 conn_info.l2cap_result = result; 569 conn_info.l2cap_status = status; 570 l2c_csm_execute(p_ccb, L2CEVT_L2CA_CONNECT_RSP_NEG, &conn_info); 571 } 572 573 return true; 574 } 575 576 /******************************************************************************* 577 * 578 * Function L2CA_GetPeerLECocConfig 579 * 580 * Description Get a peers configuration for LE Connection Oriented 581 * Channel. 582 * 583 * Parameters: local channel id 584 * Pointers to peers configuration storage area 585 * 586 * Return value: true if peer is connected 587 * 588 ******************************************************************************/ 589 bool L2CA_GetPeerLECocConfig(uint16_t lcid, tL2CAP_LE_CFG_INFO* peer_cfg) { 590 L2CAP_TRACE_API("%s CID: 0x%04x", __func__, lcid); 591 592 tL2C_CCB* p_ccb = l2cu_find_ccb_by_cid(NULL, lcid); 593 if (p_ccb == NULL) { 594 L2CAP_TRACE_ERROR("%s No CCB for CID:0x%04x", __func__, lcid); 595 return false; 596 } 597 598 if (peer_cfg != NULL) 599 memcpy(peer_cfg, &p_ccb->peer_conn_cfg, sizeof(tL2CAP_LE_CFG_INFO)); 600 601 return true; 602 } 603 604 bool L2CA_SetConnectionCallbacks(uint16_t local_cid, 605 const tL2CAP_APPL_INFO* callbacks) { 606 CHECK(callbacks != NULL); 607 CHECK(callbacks->pL2CA_ConnectInd_Cb == NULL); 608 CHECK(callbacks->pL2CA_ConnectCfm_Cb != NULL); 609 CHECK(callbacks->pL2CA_ConfigInd_Cb != NULL); 610 CHECK(callbacks->pL2CA_ConfigCfm_Cb != NULL); 611 CHECK(callbacks->pL2CA_DisconnectInd_Cb != NULL); 612 CHECK(callbacks->pL2CA_DisconnectCfm_Cb != NULL); 613 CHECK(callbacks->pL2CA_CongestionStatus_Cb != NULL); 614 CHECK(callbacks->pL2CA_DataInd_Cb != NULL); 615 CHECK(callbacks->pL2CA_TxComplete_Cb != NULL); 616 617 tL2C_CCB* channel_control_block = l2cu_find_ccb_by_cid(NULL, local_cid); 618 if (!channel_control_block) { 619 LOG_ERROR(LOG_TAG, 620 "%s no channel control block found for L2CAP LCID=0x%04x.", 621 __func__, local_cid); 622 return false; 623 } 624 625 // We're making a connection-specific registration control block so we check 626 // if we already have a private one allocated to us on the heap. If not, we 627 // make a new allocation, mark it as heap-allocated, and inherit the fields 628 // from the old control block. 629 tL2C_RCB* registration_control_block = channel_control_block->p_rcb; 630 if (!channel_control_block->should_free_rcb) { 631 registration_control_block = (tL2C_RCB*)osi_calloc(sizeof(tL2C_RCB)); 632 633 *registration_control_block = *channel_control_block->p_rcb; 634 channel_control_block->p_rcb = registration_control_block; 635 channel_control_block->should_free_rcb = true; 636 } 637 638 registration_control_block->api = *callbacks; 639 return true; 640 } 641 642 /******************************************************************************* 643 * 644 * Function L2CA_ConnectRsp 645 * 646 * Description Higher layers call this function to accept an incoming 647 * L2CAP connection, for which they had gotten an connect 648 * indication callback. 649 * 650 * Returns true for success, false for failure 651 * 652 ******************************************************************************/ 653 bool L2CA_ConnectRsp(BD_ADDR p_bd_addr, uint8_t id, uint16_t lcid, 654 uint16_t result, uint16_t status) { 655 return L2CA_ErtmConnectRsp(p_bd_addr, id, lcid, result, status, NULL); 656 } 657 658 /******************************************************************************* 659 * 660 * Function L2CA_ErtmConnectRsp 661 * 662 * Description Higher layers call this function to accept an incoming 663 * L2CAP connection, for which they had gotten an connect 664 * indication callback. 665 * 666 * Returns true for success, false for failure 667 * 668 ******************************************************************************/ 669 bool L2CA_ErtmConnectRsp(BD_ADDR p_bd_addr, uint8_t id, uint16_t lcid, 670 uint16_t result, uint16_t status, 671 tL2CAP_ERTM_INFO* p_ertm_info) { 672 tL2C_LCB* p_lcb; 673 tL2C_CCB* p_ccb; 674 675 L2CAP_TRACE_API( 676 "L2CA_ErtmConnectRsp() CID: 0x%04x Result: %d Status: %d BDA: " 677 "%08x%04x p_ertm_info:0x%08x", 678 lcid, result, status, (p_bd_addr[0] << 24) + (p_bd_addr[1] << 16) + 679 (p_bd_addr[2] << 8) + p_bd_addr[3], 680 (p_bd_addr[4] << 8) + p_bd_addr[5], p_ertm_info); 681 682 /* First, find the link control block */ 683 p_lcb = l2cu_find_lcb_by_bd_addr(p_bd_addr, BT_TRANSPORT_BR_EDR); 684 if (p_lcb == NULL) { 685 /* No link. Get an LCB and start link establishment */ 686 L2CAP_TRACE_WARNING("L2CAP - no LCB for L2CA_conn_rsp"); 687 return (false); 688 } 689 690 /* Now, find the channel control block */ 691 p_ccb = l2cu_find_ccb_by_cid(p_lcb, lcid); 692 if (p_ccb == NULL) { 693 L2CAP_TRACE_WARNING("L2CAP - no CCB for L2CA_conn_rsp"); 694 return (false); 695 } 696 697 /* The IDs must match */ 698 if (p_ccb->remote_id != id) { 699 L2CAP_TRACE_WARNING("L2CAP - bad id in L2CA_conn_rsp. Exp: %d Got: %d", 700 p_ccb->remote_id, id); 701 return (false); 702 } 703 704 if (p_ertm_info) { 705 p_ccb->ertm_info = *p_ertm_info; 706 707 /* Replace default indicators with the actual default pool */ 708 if (p_ccb->ertm_info.fcr_rx_buf_size == L2CAP_INVALID_ERM_BUF_SIZE) 709 p_ccb->ertm_info.fcr_rx_buf_size = L2CAP_FCR_RX_BUF_SIZE; 710 711 if (p_ccb->ertm_info.fcr_tx_buf_size == L2CAP_INVALID_ERM_BUF_SIZE) 712 p_ccb->ertm_info.fcr_tx_buf_size = L2CAP_FCR_TX_BUF_SIZE; 713 714 if (p_ccb->ertm_info.user_rx_buf_size == L2CAP_INVALID_ERM_BUF_SIZE) 715 p_ccb->ertm_info.user_rx_buf_size = L2CAP_USER_RX_BUF_SIZE; 716 717 if (p_ccb->ertm_info.user_tx_buf_size == L2CAP_INVALID_ERM_BUF_SIZE) 718 p_ccb->ertm_info.user_tx_buf_size = L2CAP_USER_TX_BUF_SIZE; 719 720 p_ccb->max_rx_mtu = 721 p_ertm_info->user_rx_buf_size - 722 (L2CAP_MIN_OFFSET + L2CAP_SDU_LEN_OFFSET + L2CAP_FCS_LEN); 723 } 724 725 if (result == L2CAP_CONN_OK) { 726 l2c_csm_execute(p_ccb, L2CEVT_L2CA_CONNECT_RSP, NULL); 727 } else { 728 tL2C_CONN_INFO conn_info; 729 730 conn_info.l2cap_result = result; 731 conn_info.l2cap_status = status; 732 733 if (result == L2CAP_CONN_PENDING) 734 l2c_csm_execute(p_ccb, L2CEVT_L2CA_CONNECT_RSP, &conn_info); 735 else 736 l2c_csm_execute(p_ccb, L2CEVT_L2CA_CONNECT_RSP_NEG, &conn_info); 737 } 738 739 return (true); 740 } 741 742 /******************************************************************************* 743 * 744 * Function L2CA_ConfigReq 745 * 746 * Description Higher layers call this function to send configuration. 747 * 748 * Note: The FCR options of p_cfg are not used. 749 * 750 * Returns true if configuration sent, else false 751 * 752 ******************************************************************************/ 753 bool L2CA_ConfigReq(uint16_t cid, tL2CAP_CFG_INFO* p_cfg) { 754 tL2C_CCB* p_ccb; 755 756 L2CAP_TRACE_API( 757 "L2CA_ConfigReq() CID 0x%04x: fcr_present:%d (mode %d) mtu_present:%d " 758 "(%d)", 759 cid, p_cfg->fcr_present, p_cfg->fcr.mode, p_cfg->mtu_present, p_cfg->mtu); 760 761 /* Find the channel control block. We don't know the link it is on. */ 762 p_ccb = l2cu_find_ccb_by_cid(NULL, cid); 763 if (p_ccb == NULL) { 764 L2CAP_TRACE_WARNING("L2CAP - no CCB for L2CA_cfg_req, CID: %d", cid); 765 return (false); 766 } 767 768 /* We need to have at least one mode type common with the peer */ 769 if (!l2c_fcr_adj_our_req_options(p_ccb, p_cfg)) return (false); 770 771 /* Don't adjust FCR options if not used */ 772 if ((!p_cfg->fcr_present) || (p_cfg->fcr.mode == L2CAP_FCR_BASIC_MODE)) { 773 /* FCR and FCS options are not used in basic mode */ 774 p_cfg->fcs_present = false; 775 p_cfg->ext_flow_spec_present = false; 776 777 if ((p_cfg->mtu_present) && (p_cfg->mtu > L2CAP_MTU_SIZE)) { 778 L2CAP_TRACE_WARNING("L2CAP - adjust MTU: %u too large", p_cfg->mtu); 779 p_cfg->mtu = L2CAP_MTU_SIZE; 780 } 781 } 782 783 /* Save the adjusted configuration in case it needs to be used for 784 * renegotiation */ 785 p_ccb->our_cfg = *p_cfg; 786 787 l2c_csm_execute(p_ccb, L2CEVT_L2CA_CONFIG_REQ, p_cfg); 788 789 return (true); 790 } 791 792 /******************************************************************************* 793 * 794 * Function L2CA_ConfigRsp 795 * 796 * Description Higher layers call this function to send a configuration 797 * response. 798 * 799 * Returns true if configuration response sent, else false 800 * 801 ******************************************************************************/ 802 bool L2CA_ConfigRsp(uint16_t cid, tL2CAP_CFG_INFO* p_cfg) { 803 tL2C_CCB* p_ccb; 804 805 L2CAP_TRACE_API( 806 "L2CA_ConfigRsp() CID: 0x%04x Result: %d MTU present:%d Flush TO:%d " 807 "FCR:%d FCS:%d", 808 cid, p_cfg->result, p_cfg->mtu_present, p_cfg->flush_to_present, 809 p_cfg->fcr_present, p_cfg->fcs_present); 810 811 /* Find the channel control block. We don't know the link it is on. */ 812 p_ccb = l2cu_find_ccb_by_cid(NULL, cid); 813 if (p_ccb == NULL) { 814 L2CAP_TRACE_WARNING("L2CAP - no CCB for L2CA_cfg_rsp, CID: %d", cid); 815 return (false); 816 } 817 818 if ((p_cfg->result == L2CAP_CFG_OK) || (p_cfg->result == L2CAP_CFG_PENDING)) 819 l2c_csm_execute(p_ccb, L2CEVT_L2CA_CONFIG_RSP, p_cfg); 820 else { 821 p_cfg->fcr_present = 822 false; /* FCR options already negotiated before this point */ 823 824 /* Clear out any cached options that are being returned as an error 825 * (excluding FCR) */ 826 if (p_cfg->mtu_present) p_ccb->peer_cfg.mtu_present = false; 827 if (p_cfg->flush_to_present) p_ccb->peer_cfg.flush_to_present = false; 828 if (p_cfg->qos_present) p_ccb->peer_cfg.qos_present = false; 829 830 l2c_csm_execute(p_ccb, L2CEVT_L2CA_CONFIG_RSP_NEG, p_cfg); 831 } 832 833 return (true); 834 } 835 836 /******************************************************************************* 837 * 838 * Function L2CA_DisconnectReq 839 * 840 * Description Higher layers call this function to disconnect a channel. 841 * 842 * Returns true if disconnect sent, else false 843 * 844 ******************************************************************************/ 845 bool L2CA_DisconnectReq(uint16_t cid) { 846 tL2C_CCB* p_ccb; 847 848 L2CAP_TRACE_API("L2CA_DisconnectReq() CID: 0x%04x", cid); 849 850 /* Find the channel control block. We don't know the link it is on. */ 851 p_ccb = l2cu_find_ccb_by_cid(NULL, cid); 852 if (p_ccb == NULL) { 853 L2CAP_TRACE_WARNING("L2CAP - no CCB for L2CA_disc_req, CID: %d", cid); 854 return (false); 855 } 856 857 l2c_csm_execute(p_ccb, L2CEVT_L2CA_DISCONNECT_REQ, NULL); 858 859 return (true); 860 } 861 862 /******************************************************************************* 863 * 864 * Function L2CA_DisconnectRsp 865 * 866 * Description Higher layers call this function to acknowledge the 867 * disconnection of a channel. 868 * 869 * Returns void 870 * 871 ******************************************************************************/ 872 bool L2CA_DisconnectRsp(uint16_t cid) { 873 tL2C_CCB* p_ccb; 874 875 L2CAP_TRACE_API("L2CA_DisconnectRsp() CID: 0x%04x", cid); 876 877 /* Find the channel control block. We don't know the link it is on. */ 878 p_ccb = l2cu_find_ccb_by_cid(NULL, cid); 879 if (p_ccb == NULL) { 880 L2CAP_TRACE_WARNING("L2CAP - no CCB for L2CA_disc_rsp, CID: %d", cid); 881 return (false); 882 } 883 884 l2c_csm_execute(p_ccb, L2CEVT_L2CA_DISCONNECT_RSP, NULL); 885 886 return (true); 887 } 888 889 /******************************************************************************* 890 * 891 * Function L2CA_Ping 892 * 893 * Description Higher layers call this function to send an echo request. 894 * 895 * Returns true if echo request sent, else false. 896 * 897 ******************************************************************************/ 898 bool L2CA_Ping(BD_ADDR p_bd_addr, tL2CA_ECHO_RSP_CB* p_callback) { 899 tL2C_LCB* p_lcb; 900 901 L2CAP_TRACE_API("L2CA_Ping() BDA: %02x-%02x-%02x-%02x-%02x-%02x", 902 p_bd_addr[0], p_bd_addr[1], p_bd_addr[2], p_bd_addr[3], 903 p_bd_addr[4], p_bd_addr[5]); 904 905 /* Fail if we have not established communications with the controller */ 906 if (!BTM_IsDeviceUp()) return (false); 907 908 /* First, see if we already have a link to the remote */ 909 p_lcb = l2cu_find_lcb_by_bd_addr(p_bd_addr, BT_TRANSPORT_BR_EDR); 910 if (p_lcb == NULL) { 911 /* No link. Get an LCB and start link establishment */ 912 p_lcb = l2cu_allocate_lcb(p_bd_addr, false, BT_TRANSPORT_BR_EDR); 913 if (p_lcb == NULL) { 914 L2CAP_TRACE_WARNING("L2CAP - no LCB for L2CA_ping"); 915 return (false); 916 } 917 if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == false) { 918 return (false); 919 } 920 921 p_lcb->p_echo_rsp_cb = p_callback; 922 923 return (true); 924 } 925 926 /* We only allow 1 ping outstanding at a time */ 927 if (p_lcb->p_echo_rsp_cb != NULL) { 928 L2CAP_TRACE_WARNING("L2CAP - rejected second L2CA_ping"); 929 return (false); 930 } 931 932 /* Have a link control block. If link is disconnecting, tell user to retry 933 * later */ 934 if (p_lcb->link_state == LST_DISCONNECTING) { 935 L2CAP_TRACE_WARNING("L2CAP - L2CA_ping rejected - link disconnecting"); 936 return (false); 937 } 938 939 /* Save address of callback */ 940 p_lcb->p_echo_rsp_cb = p_callback; 941 942 if (p_lcb->link_state == LST_CONNECTED) { 943 l2cu_adj_id(p_lcb, L2CAP_ADJ_BRCM_ID); /* Make sure not using Broadcom ID */ 944 l2cu_send_peer_echo_req(p_lcb, NULL, 0); 945 alarm_set_on_queue(p_lcb->l2c_lcb_timer, L2CAP_ECHO_RSP_TIMEOUT_MS, 946 l2c_lcb_timer_timeout, p_lcb, btu_general_alarm_queue); 947 } 948 949 return (true); 950 } 951 952 /******************************************************************************* 953 * 954 * Function L2CA_Echo 955 * 956 * Description Higher layers call this function to send an echo request 957 * with application-specific data. 958 * 959 * Returns true if echo request sent, else false. 960 * 961 ******************************************************************************/ 962 bool L2CA_Echo(BD_ADDR p_bd_addr, BT_HDR* p_data, 963 tL2CA_ECHO_DATA_CB* p_callback) { 964 tL2C_LCB* p_lcb; 965 uint8_t* pp; 966 967 L2CAP_TRACE_API("L2CA_Echo() BDA: %08X%04X", 968 ((p_bd_addr[0] << 24) + (p_bd_addr[1] << 16) + 969 (p_bd_addr[2] << 8) + (p_bd_addr[3])), 970 ((p_bd_addr[4] << 8) + (p_bd_addr[5]))); 971 972 /* Fail if we have not established communications with the controller */ 973 if (!BTM_IsDeviceUp()) return (false); 974 975 if ((memcmp(BT_BD_ANY, p_bd_addr, BD_ADDR_LEN) == 0) && (p_data == NULL)) { 976 /* Only register callback without sending message. */ 977 l2cb.p_echo_data_cb = p_callback; 978 return true; 979 } 980 981 /* We assume the upper layer will call this function only when the link is 982 * established. */ 983 p_lcb = l2cu_find_lcb_by_bd_addr(p_bd_addr, BT_TRANSPORT_BR_EDR); 984 if (p_lcb == NULL) { 985 L2CAP_TRACE_ERROR("L2CA_Echo ERROR : link not established"); 986 return false; 987 } 988 989 if (p_lcb->link_state != LST_CONNECTED) { 990 L2CAP_TRACE_ERROR("L2CA_Echo ERROR : link is not connected"); 991 return false; 992 } 993 994 /* Save address of callback */ 995 l2cb.p_echo_data_cb = p_callback; 996 997 /* Set the pointer to the beginning of the data */ 998 pp = (uint8_t*)(p_data + 1) + p_data->offset; 999 l2cu_adj_id(p_lcb, L2CAP_ADJ_BRCM_ID); /* Make sure not using Broadcom ID */ 1000 l2cu_send_peer_echo_req(p_lcb, pp, p_data->len); 1001 1002 return (true); 1003 } 1004 1005 bool L2CA_GetIdentifiers(uint16_t lcid, uint16_t* rcid, uint16_t* handle) { 1006 tL2C_CCB* control_block = l2cu_find_ccb_by_cid(NULL, lcid); 1007 if (!control_block) return false; 1008 1009 if (rcid) *rcid = control_block->remote_cid; 1010 if (handle) *handle = control_block->p_lcb->handle; 1011 1012 return true; 1013 } 1014 1015 /******************************************************************************* 1016 * 1017 * Function L2CA_SetIdleTimeout 1018 * 1019 * Description Higher layers call this function to set the idle timeout for 1020 * a connection, or for all future connections. The "idle 1021 * timeout" is the amount of time that a connection can remain 1022 * up with no L2CAP channels on it. A timeout of zero means 1023 * that the connection will be torn down immediately when the 1024 * last channel is removed. A timeout of 0xFFFF means no 1025 * timeout. Values are in seconds. 1026 * 1027 * Returns true if command succeeded, false if failed 1028 * 1029 * NOTE This timeout takes effect after at least 1 channel has been 1030 * established and removed. L2CAP maintains its own timer from 1031 * whan a connection is established till the first channel is 1032 * set up. 1033 ******************************************************************************/ 1034 bool L2CA_SetIdleTimeout(uint16_t cid, uint16_t timeout, bool is_global) { 1035 tL2C_CCB* p_ccb; 1036 tL2C_LCB* p_lcb; 1037 1038 if (is_global) { 1039 l2cb.idle_timeout = timeout; 1040 } else { 1041 /* Find the channel control block. We don't know the link it is on. */ 1042 p_ccb = l2cu_find_ccb_by_cid(NULL, cid); 1043 if (p_ccb == NULL) { 1044 L2CAP_TRACE_WARNING("L2CAP - no CCB for L2CA_SetIdleTimeout, CID: %d", 1045 cid); 1046 return (false); 1047 } 1048 1049 p_lcb = p_ccb->p_lcb; 1050 1051 if ((p_lcb) && (p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED)) 1052 p_lcb->idle_timeout = timeout; 1053 else 1054 return (false); 1055 } 1056 1057 return (true); 1058 } 1059 1060 /******************************************************************************* 1061 * 1062 * Function L2CA_SetIdleTimeoutByBdAddr 1063 * 1064 * Description Higher layers call this function to set the idle timeout for 1065 * a connection. The "idle timeout" is the amount of time that 1066 * a connection can remain up with no L2CAP channels on it. 1067 * A timeout of zero means that the connection will be torn 1068 * down immediately when the last channel is removed. 1069 * A timeout of 0xFFFF means no timeout. Values are in seconds. 1070 * A bd_addr is the remote BD address. If bd_addr = BT_BD_ANY, 1071 * then the idle timeouts for all active l2cap links will be 1072 * changed. 1073 * 1074 * Returns true if command succeeded, false if failed 1075 * 1076 * NOTE This timeout applies to all logical channels active on the 1077 * ACL link. 1078 ******************************************************************************/ 1079 bool L2CA_SetIdleTimeoutByBdAddr(BD_ADDR bd_addr, uint16_t timeout, 1080 tBT_TRANSPORT transport) { 1081 tL2C_LCB* p_lcb; 1082 1083 if (memcmp(BT_BD_ANY, bd_addr, BD_ADDR_LEN)) { 1084 p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, transport); 1085 if ((p_lcb) && (p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED)) { 1086 p_lcb->idle_timeout = timeout; 1087 1088 if (!p_lcb->ccb_queue.p_first_ccb) l2cu_no_dynamic_ccbs(p_lcb); 1089 } else 1090 return false; 1091 } else { 1092 int xx; 1093 tL2C_LCB* p_lcb = &l2cb.lcb_pool[0]; 1094 1095 for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) { 1096 if ((p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED)) { 1097 p_lcb->idle_timeout = timeout; 1098 1099 if (!p_lcb->ccb_queue.p_first_ccb) l2cu_no_dynamic_ccbs(p_lcb); 1100 } 1101 } 1102 } 1103 1104 return true; 1105 } 1106 1107 /******************************************************************************* 1108 * 1109 * Function L2CA_SetTraceLevel 1110 * 1111 * Description This function sets the trace level for L2CAP. If called with 1112 * a value of 0xFF, it simply reads the current trace level. 1113 * 1114 * Returns the new (current) trace level 1115 * 1116 ******************************************************************************/ 1117 uint8_t L2CA_SetTraceLevel(uint8_t new_level) { 1118 if (new_level != 0xFF) l2cb.l2cap_trace_level = new_level; 1119 1120 return (l2cb.l2cap_trace_level); 1121 } 1122 1123 /******************************************************************************* 1124 * 1125 * Function L2CA_SetDesireRole 1126 * 1127 * Description This function sets the desire role for L2CAP. 1128 * If the new role is L2CAP_ROLE_ALLOW_SWITCH, allow switch on 1129 * HciCreateConnection. 1130 * If the new role is L2CAP_ROLE_DISALLOW_SWITCH, do not allow 1131 * switch on HciCreateConnection. 1132 * 1133 * If the new role is a valid role (HCI_ROLE_MASTER or 1134 * HCI_ROLE_SLAVE), the desire role is set to the new value. 1135 * Otherwise, it is not changed. 1136 * 1137 * Returns the new (current) role 1138 * 1139 ******************************************************************************/ 1140 uint8_t L2CA_SetDesireRole(uint8_t new_role) { 1141 L2CAP_TRACE_API("L2CA_SetDesireRole() new:x%x, disallow_switch:%d", new_role, 1142 l2cb.disallow_switch); 1143 1144 if (L2CAP_ROLE_CHECK_SWITCH != (L2CAP_ROLE_CHECK_SWITCH & new_role)) { 1145 /* do not process the allow_switch when both bits are set */ 1146 if (new_role & L2CAP_ROLE_ALLOW_SWITCH) { 1147 l2cb.disallow_switch = false; 1148 } 1149 if (new_role & L2CAP_ROLE_DISALLOW_SWITCH) { 1150 l2cb.disallow_switch = true; 1151 } 1152 } 1153 1154 if (new_role == HCI_ROLE_MASTER || new_role == HCI_ROLE_SLAVE) 1155 l2cb.desire_role = new_role; 1156 1157 return (l2cb.desire_role); 1158 } 1159 1160 /******************************************************************************* 1161 * 1162 * Function L2CA_LocalLoopbackReq 1163 * 1164 * Description This function sets up a CID for local loopback 1165 * 1166 * Returns CID of 0 if none. 1167 * 1168 ******************************************************************************/ 1169 uint16_t L2CA_LocalLoopbackReq(uint16_t psm, uint16_t handle, 1170 BD_ADDR p_bd_addr) { 1171 tL2C_LCB* p_lcb; 1172 tL2C_CCB* p_ccb; 1173 tL2C_RCB* p_rcb; 1174 1175 L2CAP_TRACE_API("L2CA_LocalLoopbackReq() PSM: %d Handle: 0x%04x", psm, 1176 handle); 1177 1178 /* Fail if we have not established communications with the controller */ 1179 if (!BTM_IsDeviceUp()) { 1180 L2CAP_TRACE_WARNING("L2CAP loop req - BTU not ready"); 1181 return (0); 1182 } 1183 1184 /* Fail if the PSM is not registered */ 1185 p_rcb = l2cu_find_rcb_by_psm(psm); 1186 if (p_rcb == NULL) { 1187 L2CAP_TRACE_WARNING("L2CAP - no RCB for L2CA_conn_req, PSM: %d", psm); 1188 return (0); 1189 } 1190 1191 p_lcb = l2cu_allocate_lcb(p_bd_addr, false, BT_TRANSPORT_BR_EDR); 1192 if (p_lcb == NULL) { 1193 L2CAP_TRACE_WARNING("L2CAP - no LCB for L2CA_conn_req"); 1194 return (0); 1195 } 1196 1197 p_lcb->link_state = LST_CONNECTED; 1198 p_lcb->handle = handle; 1199 1200 /* Allocate a channel control block */ 1201 p_ccb = l2cu_allocate_ccb(p_lcb, 0); 1202 if (p_ccb == NULL) { 1203 L2CAP_TRACE_WARNING("L2CAP - no CCB for L2CA_conn_req"); 1204 return (0); 1205 } 1206 1207 /* Save registration info */ 1208 p_ccb->p_rcb = p_rcb; 1209 p_ccb->chnl_state = CST_OPEN; 1210 p_ccb->remote_cid = p_ccb->local_cid; 1211 p_ccb->config_done = CFG_DONE_MASK; 1212 1213 /* Return the local CID as our handle */ 1214 return (p_ccb->local_cid); 1215 } 1216 1217 /******************************************************************************* 1218 * 1219 * Function L2CA_SetAclPriority 1220 * 1221 * Description Sets the transmission priority for a channel. 1222 * (For initial implementation only two values are valid. 1223 * L2CAP_PRIORITY_NORMAL and L2CAP_PRIORITY_HIGH). 1224 * 1225 * Returns true if a valid channel, else false 1226 * 1227 ******************************************************************************/ 1228 bool L2CA_SetAclPriority(BD_ADDR bd_addr, uint8_t priority) { 1229 L2CAP_TRACE_API( 1230 "L2CA_SetAclPriority() bdaddr: %02x%02x%02x%02x%04x, priority:%d", 1231 bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], 1232 (bd_addr[4] << 8) + bd_addr[5], priority); 1233 1234 return (l2cu_set_acl_priority(bd_addr, priority, false)); 1235 } 1236 1237 /******************************************************************************* 1238 * 1239 * Function L2CA_FlowControl 1240 * 1241 * Description Higher layers call this function to flow control a channel. 1242 * 1243 * data_enabled - true data flows, false data is stopped 1244 * 1245 * Returns true if valid channel, else false 1246 * 1247 ******************************************************************************/ 1248 bool L2CA_FlowControl(uint16_t cid, bool data_enabled) { 1249 tL2C_CCB* p_ccb; 1250 bool on_off = !data_enabled; 1251 1252 L2CAP_TRACE_API("L2CA_FlowControl(%d) CID: 0x%04x", on_off, cid); 1253 1254 /* Find the channel control block. We don't know the link it is on. */ 1255 p_ccb = l2cu_find_ccb_by_cid(NULL, cid); 1256 if (p_ccb == NULL) { 1257 L2CAP_TRACE_WARNING( 1258 "L2CAP - no CCB for L2CA_FlowControl, CID: 0x%04x data_enabled: %d", 1259 cid, data_enabled); 1260 return (false); 1261 } 1262 1263 if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_ERTM_MODE) { 1264 L2CAP_TRACE_EVENT("L2CA_FlowControl() invalid mode:%d", 1265 p_ccb->peer_cfg.fcr.mode); 1266 return (false); 1267 } 1268 if (p_ccb->fcrb.local_busy != on_off) { 1269 p_ccb->fcrb.local_busy = on_off; 1270 1271 if ((p_ccb->chnl_state == CST_OPEN) && (!p_ccb->fcrb.wait_ack)) { 1272 if (on_off) 1273 l2c_fcr_send_S_frame(p_ccb, L2CAP_FCR_SUP_RNR, 0); 1274 else 1275 l2c_fcr_send_S_frame(p_ccb, L2CAP_FCR_SUP_RR, L2CAP_FCR_P_BIT); 1276 } 1277 } 1278 1279 return (true); 1280 } 1281 1282 /******************************************************************************* 1283 * 1284 * Function L2CA_SendTestSFrame 1285 * 1286 * Description Higher layers call this function to send a test S-frame. 1287 * 1288 * Returns true if valid Channel, else false 1289 * 1290 ******************************************************************************/ 1291 bool L2CA_SendTestSFrame(uint16_t cid, uint8_t sup_type, uint8_t back_track) { 1292 tL2C_CCB* p_ccb; 1293 1294 L2CAP_TRACE_API( 1295 "L2CA_SendTestSFrame() CID: 0x%04x Type: 0x%02x back_track: %u", cid, 1296 sup_type, back_track); 1297 1298 /* Find the channel control block. We don't know the link it is on. */ 1299 p_ccb = l2cu_find_ccb_by_cid(NULL, cid); 1300 if (p_ccb == NULL) { 1301 L2CAP_TRACE_WARNING("L2CAP - no CCB for L2CA_SendTestSFrame, CID: %d", cid); 1302 return (false); 1303 } 1304 1305 if ((p_ccb->chnl_state != CST_OPEN) || 1306 (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_ERTM_MODE)) 1307 return (false); 1308 1309 p_ccb->fcrb.next_seq_expected -= back_track; 1310 1311 l2c_fcr_send_S_frame( 1312 p_ccb, (uint16_t)(sup_type & 3), 1313 (uint16_t)(sup_type & (L2CAP_FCR_P_BIT | L2CAP_FCR_F_BIT))); 1314 1315 return (true); 1316 } 1317 1318 /******************************************************************************* 1319 * 1320 * Function L2CA_SetTxPriority 1321 * 1322 * Description Sets the transmission priority for a channel. 1323 * 1324 * Returns true if a valid channel, else false 1325 * 1326 ******************************************************************************/ 1327 bool L2CA_SetTxPriority(uint16_t cid, tL2CAP_CHNL_PRIORITY priority) { 1328 tL2C_CCB* p_ccb; 1329 1330 L2CAP_TRACE_API("L2CA_SetTxPriority() CID: 0x%04x, priority:%d", cid, 1331 priority); 1332 1333 /* Find the channel control block. We don't know the link it is on. */ 1334 p_ccb = l2cu_find_ccb_by_cid(NULL, cid); 1335 if (p_ccb == NULL) { 1336 L2CAP_TRACE_WARNING("L2CAP - no CCB for L2CA_SetTxPriority, CID: %d", cid); 1337 return (false); 1338 } 1339 1340 /* it will update the order of CCB in LCB by priority and update round robin 1341 * service variables */ 1342 l2cu_change_pri_ccb(p_ccb, priority); 1343 1344 return (true); 1345 } 1346 1347 /******************************************************************************* 1348 * 1349 * Function L2CA_SetChnlDataRate 1350 * 1351 * Description Sets the tx/rx data rate for a channel. 1352 * 1353 * Returns true if a valid channel, else false 1354 * 1355 ******************************************************************************/ 1356 bool L2CA_SetChnlDataRate(uint16_t cid, tL2CAP_CHNL_DATA_RATE tx, 1357 tL2CAP_CHNL_DATA_RATE rx) { 1358 tL2C_CCB* p_ccb; 1359 1360 L2CAP_TRACE_API("L2CA_SetChnlDataRate() CID: 0x%04x, tx:%d, rx:%d", cid, tx, 1361 rx); 1362 1363 /* Find the channel control block. We don't know the link it is on. */ 1364 p_ccb = l2cu_find_ccb_by_cid(NULL, cid); 1365 if (p_ccb == NULL) { 1366 L2CAP_TRACE_WARNING("L2CAP - no CCB for L2CA_SetChnlDataRate, CID: %d", 1367 cid); 1368 return (false); 1369 } 1370 1371 p_ccb->tx_data_rate = tx; 1372 p_ccb->rx_data_rate = rx; 1373 1374 /* Adjust channel buffer allocation */ 1375 l2c_link_adjust_chnl_allocation(); 1376 1377 return (true); 1378 } 1379 1380 /******************************************************************************* 1381 * 1382 * Function L2CA_SetFlushTimeout 1383 * 1384 * Description This function set the automatic flush time out in Baseband 1385 * for ACL-U packets. 1386 * BdAddr : the remote BD address of ACL link. If it is 1387 * BT_DB_ANY then the flush time out will be applied to 1388 * all ACL links. 1389 * FlushTimeout: flush time out in ms 1390 * 0x0000 : No automatic flush 1391 * L2CAP_NO_RETRANSMISSION : No retransmission 1392 * 0x0002 - 0xFFFE : flush time out, if 1393 * (flush_tout * 8) + 3 / 5) <= 1394 * HCI_MAX_AUTO_FLUSH_TOUT 1395 * (in 625us slot). 1396 * Otherwise, return false. 1397 * L2CAP_NO_AUTOMATIC_FLUSH : No automatic flush 1398 * 1399 * Returns true if command succeeded, false if failed 1400 * 1401 * NOTE This flush timeout applies to all logical channels active on 1402 * the ACL link. 1403 ******************************************************************************/ 1404 bool L2CA_SetFlushTimeout(BD_ADDR bd_addr, uint16_t flush_tout) { 1405 tL2C_LCB* p_lcb; 1406 uint16_t hci_flush_to; 1407 uint32_t temp; 1408 1409 /* no automatic flush (infinite timeout) */ 1410 if (flush_tout == 0x0000) { 1411 hci_flush_to = flush_tout; 1412 flush_tout = L2CAP_NO_AUTOMATIC_FLUSH; 1413 } 1414 /* no retransmission */ 1415 else if (flush_tout == L2CAP_NO_RETRANSMISSION) { 1416 /* not mandatory range for controller */ 1417 /* Packet is flushed before getting any ACK/NACK */ 1418 /* To do this, flush timeout should be 1 baseband slot */ 1419 hci_flush_to = flush_tout; 1420 } 1421 /* no automatic flush (infinite timeout) */ 1422 else if (flush_tout == L2CAP_NO_AUTOMATIC_FLUSH) { 1423 hci_flush_to = 0x0000; 1424 } else { 1425 /* convert L2CAP flush_to to 0.625 ms units, with round */ 1426 temp = (((uint32_t)flush_tout * 8) + 3) / 5; 1427 1428 /* if L2CAP flush_to within range of HCI, set HCI flush timeout */ 1429 if (temp > HCI_MAX_AUTO_FLUSH_TOUT) { 1430 L2CAP_TRACE_WARNING( 1431 "WARNING L2CA_SetFlushTimeout timeout(0x%x) is out of range", 1432 flush_tout); 1433 return false; 1434 } else { 1435 hci_flush_to = (uint16_t)temp; 1436 } 1437 } 1438 1439 if (memcmp(BT_BD_ANY, bd_addr, BD_ADDR_LEN)) { 1440 p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_BR_EDR); 1441 1442 if ((p_lcb) && (p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED)) { 1443 if (p_lcb->link_flush_tout != flush_tout) { 1444 p_lcb->link_flush_tout = flush_tout; 1445 1446 L2CAP_TRACE_API( 1447 "L2CA_SetFlushTimeout 0x%04x ms for bd_addr [...;%02x%02x%02x]", 1448 flush_tout, bd_addr[3], bd_addr[4], bd_addr[5]); 1449 1450 btsnd_hcic_write_auto_flush_tout(p_lcb->handle, hci_flush_to); 1451 } 1452 } else { 1453 L2CAP_TRACE_WARNING( 1454 "WARNING L2CA_SetFlushTimeout No lcb for bd_addr [...;%02x%02x%02x]", 1455 bd_addr[3], bd_addr[4], bd_addr[5]); 1456 return (false); 1457 } 1458 } else { 1459 int xx; 1460 p_lcb = &l2cb.lcb_pool[0]; 1461 1462 for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++) { 1463 if ((p_lcb->in_use) && (p_lcb->link_state == LST_CONNECTED)) { 1464 if (p_lcb->link_flush_tout != flush_tout) { 1465 p_lcb->link_flush_tout = flush_tout; 1466 1467 L2CAP_TRACE_API( 1468 "L2CA_SetFlushTimeout 0x%04x ms for bd_addr [...;%02x%02x%02x]", 1469 flush_tout, p_lcb->remote_bd_addr[3], p_lcb->remote_bd_addr[4], 1470 p_lcb->remote_bd_addr[5]); 1471 1472 btsnd_hcic_write_auto_flush_tout(p_lcb->handle, hci_flush_to); 1473 } 1474 } 1475 } 1476 } 1477 1478 return (true); 1479 } 1480 1481 /******************************************************************************* 1482 * 1483 * Function L2CA_GetPeerFeatures 1484 * 1485 * Description Get a peers features and fixed channel map 1486 * 1487 * Parameters: BD address of the peer 1488 * Pointers to features and channel mask storage area 1489 * 1490 * Return value: true if peer is connected 1491 * 1492 ******************************************************************************/ 1493 bool L2CA_GetPeerFeatures(BD_ADDR bd_addr, uint32_t* p_ext_feat, 1494 uint8_t* p_chnl_mask) { 1495 tL2C_LCB* p_lcb; 1496 1497 /* We must already have a link to the remote */ 1498 p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_BR_EDR); 1499 if (p_lcb == NULL) { 1500 L2CAP_TRACE_WARNING("L2CA_GetPeerFeatures() No BDA: %08x%04x", 1501 (bd_addr[0] << 24) + (bd_addr[1] << 16) + 1502 (bd_addr[2] << 8) + bd_addr[3], 1503 (bd_addr[4] << 8) + bd_addr[5]); 1504 return (false); 1505 } 1506 1507 L2CAP_TRACE_API( 1508 "L2CA_GetPeerFeatures() BDA: %08x%04x ExtFea: 0x%08x Chnl_Mask[0]: " 1509 "0x%02x", 1510 (bd_addr[0] << 24) + (bd_addr[1] << 16) + (bd_addr[2] << 8) + bd_addr[3], 1511 (bd_addr[4] << 8) + bd_addr[5], p_lcb->peer_ext_fea, 1512 p_lcb->peer_chnl_mask[0]); 1513 1514 *p_ext_feat = p_lcb->peer_ext_fea; 1515 1516 memcpy(p_chnl_mask, p_lcb->peer_chnl_mask, L2CAP_FIXED_CHNL_ARRAY_SIZE); 1517 1518 return (true); 1519 } 1520 1521 /******************************************************************************* 1522 * 1523 * Function L2CA_GetBDAddrbyHandle 1524 * 1525 * Description Get BD address for the given HCI handle 1526 * 1527 * Parameters: HCI handle 1528 * BD address of the peer 1529 * 1530 * Return value: true if found lcb for the given handle, false otherwise 1531 * 1532 ******************************************************************************/ 1533 bool L2CA_GetBDAddrbyHandle(uint16_t handle, BD_ADDR bd_addr) { 1534 tL2C_LCB* p_lcb = NULL; 1535 bool found_dev = false; 1536 1537 p_lcb = l2cu_find_lcb_by_handle(handle); 1538 if (p_lcb) { 1539 found_dev = true; 1540 memcpy(bd_addr, p_lcb->remote_bd_addr, BD_ADDR_LEN); 1541 } 1542 1543 return found_dev; 1544 } 1545 1546 /******************************************************************************* 1547 * 1548 * Function L2CA_GetChnlFcrMode 1549 * 1550 * Description Get the channel FCR mode 1551 * 1552 * Parameters: Local CID 1553 * 1554 * Return value: Channel mode 1555 * 1556 ******************************************************************************/ 1557 uint8_t L2CA_GetChnlFcrMode(uint16_t lcid) { 1558 tL2C_CCB* p_ccb = l2cu_find_ccb_by_cid(NULL, lcid); 1559 1560 if (p_ccb) { 1561 L2CAP_TRACE_API("L2CA_GetChnlFcrMode() returns mode %d", 1562 p_ccb->peer_cfg.fcr.mode); 1563 return (p_ccb->peer_cfg.fcr.mode); 1564 } 1565 1566 L2CAP_TRACE_API("L2CA_GetChnlFcrMode() returns mode L2CAP_FCR_BASIC_MODE"); 1567 return (L2CAP_FCR_BASIC_MODE); 1568 } 1569 1570 #if (L2CAP_NUM_FIXED_CHNLS > 0) 1571 /******************************************************************************* 1572 * 1573 * Function L2CA_RegisterFixedChannel 1574 * 1575 * Description Register a fixed channel. 1576 * 1577 * Parameters: Fixed Channel # 1578 * Channel Callbacks and config 1579 * 1580 * Return value: - 1581 * 1582 ******************************************************************************/ 1583 bool L2CA_RegisterFixedChannel(uint16_t fixed_cid, 1584 tL2CAP_FIXED_CHNL_REG* p_freg) { 1585 if ((fixed_cid < L2CAP_FIRST_FIXED_CHNL) || 1586 (fixed_cid > L2CAP_LAST_FIXED_CHNL)) { 1587 L2CAP_TRACE_ERROR("L2CA_RegisterFixedChannel() Invalid CID: 0x%04x", 1588 fixed_cid); 1589 1590 return (false); 1591 } 1592 1593 l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL] = *p_freg; 1594 return (true); 1595 } 1596 1597 /******************************************************************************* 1598 * 1599 * Function L2CA_ConnectFixedChnl 1600 * 1601 * Description Connect an fixed signalling channel to a remote device. 1602 * 1603 * Parameters: Fixed CID 1604 * BD Address of remote 1605 * 1606 * Return value: true if connection started 1607 * 1608 ******************************************************************************/ 1609 bool L2CA_ConnectFixedChnl(uint16_t fixed_cid, BD_ADDR rem_bda) { 1610 uint8_t phy = controller_get_interface()->get_le_all_initiating_phys(); 1611 return L2CA_ConnectFixedChnl(fixed_cid, rem_bda, phy); 1612 } 1613 1614 bool L2CA_ConnectFixedChnl(uint16_t fixed_cid, BD_ADDR rem_bda, 1615 uint8_t initiating_phys) { 1616 tL2C_LCB* p_lcb; 1617 tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; 1618 1619 L2CAP_TRACE_API( 1620 "%s() CID: 0x%04x BDA: %08x%04x", __func__, fixed_cid, 1621 (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], 1622 (rem_bda[4] << 8) + rem_bda[5]); 1623 1624 // Check CID is valid and registered 1625 if ((fixed_cid < L2CAP_FIRST_FIXED_CHNL) || 1626 (fixed_cid > L2CAP_LAST_FIXED_CHNL) || 1627 (l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb == 1628 NULL)) { 1629 L2CAP_TRACE_ERROR("%s() Invalid CID: 0x%04x", __func__, fixed_cid); 1630 return (false); 1631 } 1632 1633 // Fail if BT is not yet up 1634 if (!BTM_IsDeviceUp()) { 1635 L2CAP_TRACE_WARNING("%s(0x%04x) - BTU not ready", __func__, fixed_cid); 1636 return (false); 1637 } 1638 1639 if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID) 1640 transport = BT_TRANSPORT_LE; 1641 1642 tL2C_BLE_FIXED_CHNLS_MASK peer_channel_mask; 1643 1644 // If we already have a link to the remote, check if it supports that CID 1645 p_lcb = l2cu_find_lcb_by_bd_addr(rem_bda, transport); 1646 if (p_lcb != NULL) { 1647 // Fixed channels are mandatory on LE transports so ignore the received 1648 // channel mask and use the locally cached LE channel mask. 1649 1650 if (transport == BT_TRANSPORT_LE) 1651 peer_channel_mask = l2cb.l2c_ble_fixed_chnls_mask; 1652 else 1653 peer_channel_mask = p_lcb->peer_chnl_mask[0]; 1654 1655 // Check for supported channel 1656 if (!(peer_channel_mask & (1 << fixed_cid))) { 1657 L2CAP_TRACE_EVENT("%s() CID:0x%04x BDA: %08x%04x not supported", 1658 __func__, fixed_cid, 1659 (rem_bda[0] << 24) + (rem_bda[1] << 16) + 1660 (rem_bda[2] << 8) + rem_bda[3], 1661 (rem_bda[4] << 8) + rem_bda[5]); 1662 return false; 1663 } 1664 1665 // Get a CCB and link the lcb to it 1666 if (!l2cu_initialize_fixed_ccb( 1667 p_lcb, fixed_cid, 1668 &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL] 1669 .fixed_chnl_opts)) { 1670 L2CAP_TRACE_WARNING("%s(0x%04x) - LCB but no CCB", __func__, fixed_cid); 1671 return false; 1672 } 1673 1674 // racing with disconnecting, queue the connection request 1675 if (p_lcb->link_state == LST_DISCONNECTING) { 1676 L2CAP_TRACE_DEBUG("$s() - link disconnecting: RETRY LATER", __func__); 1677 /* Save ccb so it can be started after disconnect is finished */ 1678 p_lcb->p_pending_ccb = 1679 p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]; 1680 return true; 1681 } 1682 1683 (*l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedConn_Cb)( 1684 fixed_cid, p_lcb->remote_bd_addr, true, 0, p_lcb->transport); 1685 return true; 1686 } 1687 1688 // No link. Get an LCB and start link establishment 1689 p_lcb = l2cu_allocate_lcb(rem_bda, false, transport); 1690 if (p_lcb == NULL) { 1691 L2CAP_TRACE_WARNING("%s(0x%04x) - no LCB", __func__, fixed_cid); 1692 return false; 1693 } 1694 1695 // Get a CCB and link the lcb to it 1696 if (!l2cu_initialize_fixed_ccb( 1697 p_lcb, fixed_cid, &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL] 1698 .fixed_chnl_opts)) { 1699 p_lcb->disc_reason = L2CAP_CONN_NO_RESOURCES; 1700 L2CAP_TRACE_WARNING("%s(0x%04x) - no CCB", __func__, fixed_cid); 1701 l2cu_release_lcb(p_lcb); 1702 return false; 1703 } 1704 1705 if (!l2cu_create_conn(p_lcb, transport, initiating_phys)) { 1706 L2CAP_TRACE_WARNING("%s() - create_conn failed", __func__); 1707 l2cu_release_lcb(p_lcb); 1708 return false; 1709 } 1710 return true; 1711 } 1712 1713 /******************************************************************************* 1714 * 1715 * Function L2CA_SendFixedChnlData 1716 * 1717 * Description Write data on a fixed channel. 1718 * 1719 * Parameters: Fixed CID 1720 * BD Address of remote 1721 * Pointer to buffer of type BT_HDR 1722 * 1723 * Return value L2CAP_DW_SUCCESS, if data accepted 1724 * L2CAP_DW_FAILED, if error 1725 * 1726 ******************************************************************************/ 1727 uint16_t L2CA_SendFixedChnlData(uint16_t fixed_cid, BD_ADDR rem_bda, 1728 BT_HDR* p_buf) { 1729 tL2C_LCB* p_lcb; 1730 tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; 1731 1732 L2CAP_TRACE_API( 1733 "L2CA_SendFixedChnlData() CID: 0x%04x BDA: %08x%04x", fixed_cid, 1734 (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], 1735 (rem_bda[4] << 8) + rem_bda[5]); 1736 1737 if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID) 1738 transport = BT_TRANSPORT_LE; 1739 1740 // Check CID is valid and registered 1741 if ((fixed_cid < L2CAP_FIRST_FIXED_CHNL) || 1742 (fixed_cid > L2CAP_LAST_FIXED_CHNL) || 1743 (l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb == 1744 NULL)) { 1745 L2CAP_TRACE_ERROR("L2CA_SendFixedChnlData() Invalid CID: 0x%04x", 1746 fixed_cid); 1747 osi_free(p_buf); 1748 return (L2CAP_DW_FAILED); 1749 } 1750 1751 // Fail if BT is not yet up 1752 if (!BTM_IsDeviceUp()) { 1753 L2CAP_TRACE_WARNING("L2CA_SendFixedChnlData(0x%04x) - BTU not ready", 1754 fixed_cid); 1755 osi_free(p_buf); 1756 return (L2CAP_DW_FAILED); 1757 } 1758 1759 // We need to have a link up 1760 p_lcb = l2cu_find_lcb_by_bd_addr(rem_bda, transport); 1761 if (p_lcb == NULL || p_lcb->link_state == LST_DISCONNECTING) { 1762 /* if link is disconnecting, also report data sending failure */ 1763 L2CAP_TRACE_WARNING("L2CA_SendFixedChnlData(0x%04x) - no LCB", fixed_cid); 1764 osi_free(p_buf); 1765 return (L2CAP_DW_FAILED); 1766 } 1767 1768 tL2C_BLE_FIXED_CHNLS_MASK peer_channel_mask; 1769 1770 // Select peer channels mask to use depending on transport 1771 if (transport == BT_TRANSPORT_LE) 1772 peer_channel_mask = l2cb.l2c_ble_fixed_chnls_mask; 1773 else 1774 peer_channel_mask = p_lcb->peer_chnl_mask[0]; 1775 1776 if ((peer_channel_mask & (1 << fixed_cid)) == 0) { 1777 L2CAP_TRACE_WARNING( 1778 "L2CA_SendFixedChnlData() - peer does not support fixed chnl: 0x%04x", 1779 fixed_cid); 1780 osi_free(p_buf); 1781 return (L2CAP_DW_FAILED); 1782 } 1783 1784 p_buf->event = 0; 1785 p_buf->layer_specific = L2CAP_FLUSHABLE_CH_BASED; 1786 1787 if (!p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]) { 1788 if (!l2cu_initialize_fixed_ccb( 1789 p_lcb, fixed_cid, 1790 &l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL] 1791 .fixed_chnl_opts)) { 1792 L2CAP_TRACE_WARNING("L2CA_SendFixedChnlData() - no CCB for chnl: 0x%4x", 1793 fixed_cid); 1794 osi_free(p_buf); 1795 return (L2CAP_DW_FAILED); 1796 } 1797 } 1798 1799 // If already congested, do not accept any more packets 1800 if (p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->cong_sent) { 1801 L2CAP_TRACE_ERROR( 1802 "L2CAP - CID: 0x%04x cannot send, already congested \ 1803 xmit_hold_q.count: %u buff_quota: %u", 1804 fixed_cid, fixed_queue_length( 1805 p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL] 1806 ->xmit_hold_q), 1807 p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->buff_quota); 1808 osi_free(p_buf); 1809 return (L2CAP_DW_FAILED); 1810 } 1811 1812 l2c_enqueue_peer_data(p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL], 1813 p_buf); 1814 1815 l2c_link_check_send_pkts(p_lcb, NULL, NULL); 1816 1817 // If there is no dynamic CCB on the link, restart the idle timer each time 1818 // something is sent 1819 if (p_lcb->in_use && p_lcb->link_state == LST_CONNECTED && 1820 !p_lcb->ccb_queue.p_first_ccb) { 1821 l2cu_no_dynamic_ccbs(p_lcb); 1822 } 1823 1824 if (p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]->cong_sent) 1825 return (L2CAP_DW_CONGESTED); 1826 1827 return (L2CAP_DW_SUCCESS); 1828 } 1829 1830 /******************************************************************************* 1831 * 1832 * Function L2CA_RemoveFixedChnl 1833 * 1834 * Description Remove a fixed channel to a remote device. 1835 * 1836 * Parameters: Fixed CID 1837 * BD Address of remote 1838 * Idle timeout to use (or 0xFFFF if don't care) 1839 * 1840 * Return value: true if channel removed 1841 * 1842 ******************************************************************************/ 1843 bool L2CA_RemoveFixedChnl(uint16_t fixed_cid, BD_ADDR rem_bda) { 1844 tL2C_LCB* p_lcb; 1845 tL2C_CCB* p_ccb; 1846 tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; 1847 1848 /* Check CID is valid and registered */ 1849 if ((fixed_cid < L2CAP_FIRST_FIXED_CHNL) || 1850 (fixed_cid > L2CAP_LAST_FIXED_CHNL) || 1851 (l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].pL2CA_FixedData_Cb == 1852 NULL)) { 1853 L2CAP_TRACE_ERROR("L2CA_RemoveFixedChnl() Invalid CID: 0x%04x", fixed_cid); 1854 return (false); 1855 } 1856 1857 if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID) 1858 transport = BT_TRANSPORT_LE; 1859 1860 /* Is a fixed channel connected to the remote BDA ?*/ 1861 p_lcb = l2cu_find_lcb_by_bd_addr(rem_bda, transport); 1862 1863 if (((p_lcb) == NULL) || 1864 (!p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL])) { 1865 L2CAP_TRACE_WARNING( 1866 "L2CA_RemoveFixedChnl() CID: 0x%04x BDA: %08x%04x not connected", 1867 fixed_cid, (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + 1868 rem_bda[3], 1869 (rem_bda[4] << 8) + rem_bda[5]); 1870 return (false); 1871 } 1872 1873 L2CAP_TRACE_API( 1874 "L2CA_RemoveFixedChnl() CID: 0x%04x BDA: %08x%04x", fixed_cid, 1875 (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + rem_bda[3], 1876 (rem_bda[4] << 8) + rem_bda[5]); 1877 1878 /* Release the CCB, starting an inactivity timeout on the LCB if no other CCBs 1879 * exist */ 1880 p_ccb = p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL]; 1881 1882 p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL] = NULL; 1883 p_lcb->disc_reason = HCI_ERR_CONN_CAUSE_LOCAL_HOST; 1884 1885 // Retain the link for a few more seconds after SMP pairing is done, since 1886 // the Android platform always does service discovery after pairing is 1887 // complete. This will avoid the link down (pairing is complete) and an 1888 // immediate re-connection for service discovery. 1889 // Some devices do not do auto advertising when link is dropped, thus fail 1890 // the second connection and service discovery. 1891 if ((fixed_cid == L2CAP_ATT_CID) && !p_lcb->ccb_queue.p_first_ccb) 1892 p_lcb->idle_timeout = 0; 1893 1894 l2cu_release_ccb(p_ccb); 1895 1896 return (true); 1897 } 1898 1899 /******************************************************************************* 1900 * 1901 * Function L2CA_SetFixedChannelTout 1902 * 1903 * Description Higher layers call this function to set the idle timeout for 1904 * a fixed channel. The "idle timeout" is the amount of time 1905 * that a connection can remain up with no L2CAP channels on 1906 * it. A timeout of zero means that the connection will be torn 1907 * down immediately when the last channel is removed. 1908 * A timeout of 0xFFFF means no timeout. Values are in seconds. 1909 * A bd_addr is the remote BD address. If bd_addr = BT_BD_ANY, 1910 * then the idle timeouts for all active l2cap links will be 1911 * changed. 1912 * 1913 * Returns true if command succeeded, false if failed 1914 * 1915 ******************************************************************************/ 1916 bool L2CA_SetFixedChannelTout(BD_ADDR rem_bda, uint16_t fixed_cid, 1917 uint16_t idle_tout) { 1918 tL2C_LCB* p_lcb; 1919 tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; 1920 1921 if (fixed_cid >= L2CAP_ATT_CID && fixed_cid <= L2CAP_SMP_CID) 1922 transport = BT_TRANSPORT_LE; 1923 1924 /* Is a fixed channel connected to the remote BDA ?*/ 1925 p_lcb = l2cu_find_lcb_by_bd_addr(rem_bda, transport); 1926 if (((p_lcb) == NULL) || 1927 (!p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL])) { 1928 L2CAP_TRACE_WARNING( 1929 "L2CA_SetFixedChannelTout() CID: 0x%04x BDA: %08x%04x not connected", 1930 fixed_cid, (rem_bda[0] << 24) + (rem_bda[1] << 16) + (rem_bda[2] << 8) + 1931 rem_bda[3], 1932 (rem_bda[4] << 8) + rem_bda[5]); 1933 return (false); 1934 } 1935 1936 p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL] 1937 ->fixed_chnl_idle_tout = idle_tout; 1938 1939 if (p_lcb->in_use && p_lcb->link_state == LST_CONNECTED && 1940 !p_lcb->ccb_queue.p_first_ccb) { 1941 /* If there are no dynamic CCBs, (re)start the idle timer in case we changed 1942 * it */ 1943 l2cu_no_dynamic_ccbs(p_lcb); 1944 } 1945 1946 return true; 1947 } 1948 1949 #endif /* #if (L2CAP_NUM_FIXED_CHNLS > 0) */ 1950 1951 /******************************************************************************* 1952 * 1953 * Function L2CA_GetCurrentConfig 1954 * 1955 * Description This function returns configurations of L2CAP channel 1956 * pp_our_cfg : pointer of our saved configuration options 1957 * p_our_cfg_bits : valid config in bitmap 1958 * pp_peer_cfg: pointer of peer's saved configuration options 1959 * p_peer_cfg_bits : valid config in bitmap 1960 * 1961 * Returns true if successful 1962 * 1963 ******************************************************************************/ 1964 bool L2CA_GetCurrentConfig(uint16_t lcid, tL2CAP_CFG_INFO** pp_our_cfg, 1965 tL2CAP_CH_CFG_BITS* p_our_cfg_bits, 1966 tL2CAP_CFG_INFO** pp_peer_cfg, 1967 tL2CAP_CH_CFG_BITS* p_peer_cfg_bits) { 1968 tL2C_CCB* p_ccb; 1969 1970 L2CAP_TRACE_API("L2CA_GetCurrentConfig() CID: 0x%04x", lcid); 1971 1972 p_ccb = l2cu_find_ccb_by_cid(NULL, lcid); 1973 1974 if (p_ccb) { 1975 *pp_our_cfg = &(p_ccb->our_cfg); 1976 1977 /* convert valid config items into bitmap */ 1978 *p_our_cfg_bits = 0; 1979 if (p_ccb->our_cfg.mtu_present) *p_our_cfg_bits |= L2CAP_CH_CFG_MASK_MTU; 1980 if (p_ccb->our_cfg.qos_present) *p_our_cfg_bits |= L2CAP_CH_CFG_MASK_QOS; 1981 if (p_ccb->our_cfg.flush_to_present) 1982 *p_our_cfg_bits |= L2CAP_CH_CFG_MASK_FLUSH_TO; 1983 if (p_ccb->our_cfg.fcr_present) *p_our_cfg_bits |= L2CAP_CH_CFG_MASK_FCR; 1984 if (p_ccb->our_cfg.fcs_present) *p_our_cfg_bits |= L2CAP_CH_CFG_MASK_FCS; 1985 if (p_ccb->our_cfg.ext_flow_spec_present) 1986 *p_our_cfg_bits |= L2CAP_CH_CFG_MASK_EXT_FLOW_SPEC; 1987 1988 *pp_peer_cfg = &(p_ccb->peer_cfg); 1989 *p_peer_cfg_bits = p_ccb->peer_cfg_bits; 1990 1991 return true; 1992 } else { 1993 L2CAP_TRACE_ERROR("No CCB for CID:0x%04x", lcid); 1994 return false; 1995 } 1996 } 1997 1998 /******************************************************************************* 1999 * 2000 * Function L2CA_GetConnectionConfig 2001 * 2002 * Description This function returns configurations of L2CAP channel 2003 * pp_l2c_ccb : pointer to this channels L2CAP ccb data. 2004 * 2005 * Returns true if successful 2006 * 2007 ******************************************************************************/ 2008 bool L2CA_GetConnectionConfig(uint16_t lcid, uint16_t* mtu, uint16_t* rcid, 2009 uint16_t* handle) { 2010 tL2C_CCB* p_ccb = l2cu_find_ccb_by_cid(NULL, lcid); 2011 ; 2012 2013 L2CAP_TRACE_API("%s CID: 0x%04x", __func__, lcid); 2014 2015 if (p_ccb) { 2016 *mtu = L2CAP_MTU_SIZE; 2017 if (p_ccb->our_cfg.mtu_present) *mtu = p_ccb->our_cfg.mtu; 2018 2019 *rcid = p_ccb->remote_cid; 2020 *handle = p_ccb->p_lcb->handle; 2021 return true; 2022 } 2023 2024 L2CAP_TRACE_ERROR("%s No CCB for CID:0x%04x", __func__, lcid); 2025 return false; 2026 } 2027 2028 /******************************************************************************* 2029 * 2030 * Function L2CA_RegForNoCPEvt 2031 * 2032 * Description Register callback for Number of Completed Packets event. 2033 * 2034 * Input Param p_cb - callback for Number of completed packets event 2035 * p_bda - BT address of remote device 2036 * 2037 * Returns true if registered OK, else false 2038 * 2039 ******************************************************************************/ 2040 bool L2CA_RegForNoCPEvt(tL2CA_NOCP_CB* p_cb, BD_ADDR p_bda) { 2041 tL2C_LCB* p_lcb; 2042 2043 /* Find the link that is associated with this remote bdaddr */ 2044 p_lcb = l2cu_find_lcb_by_bd_addr(p_bda, BT_TRANSPORT_BR_EDR); 2045 2046 /* If no link for this handle, nothing to do. */ 2047 if (!p_lcb) return false; 2048 2049 p_lcb->p_nocp_cb = p_cb; 2050 2051 return true; 2052 } 2053 2054 /******************************************************************************* 2055 * 2056 * Function L2CA_DataWrite 2057 * 2058 * Description Higher layers call this function to write data. 2059 * 2060 * Returns L2CAP_DW_SUCCESS, if data accepted, else false 2061 * L2CAP_DW_CONGESTED, if data accepted and the channel is 2062 * congested 2063 * L2CAP_DW_FAILED, if error 2064 * 2065 ******************************************************************************/ 2066 uint8_t L2CA_DataWrite(uint16_t cid, BT_HDR* p_data) { 2067 L2CAP_TRACE_API("L2CA_DataWrite() CID: 0x%04x Len: %d", cid, p_data->len); 2068 return l2c_data_write(cid, p_data, L2CAP_FLUSHABLE_CH_BASED); 2069 } 2070 2071 /******************************************************************************* 2072 * 2073 * Function L2CA_SetChnlFlushability 2074 * 2075 * Description Higher layers call this function to set a channels 2076 * flushability flags 2077 * 2078 * Returns true if CID found, else false 2079 * 2080 ******************************************************************************/ 2081 bool L2CA_SetChnlFlushability(uint16_t cid, bool is_flushable) { 2082 #if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE) 2083 2084 tL2C_CCB* p_ccb; 2085 2086 /* Find the channel control block. We don't know the link it is on. */ 2087 p_ccb = l2cu_find_ccb_by_cid(NULL, cid); 2088 if (p_ccb == NULL) { 2089 L2CAP_TRACE_WARNING("L2CAP - no CCB for L2CA_SetChnlFlushability, CID: %d", 2090 cid); 2091 return (false); 2092 } 2093 2094 p_ccb->is_flushable = is_flushable; 2095 2096 L2CAP_TRACE_API("L2CA_SetChnlFlushability() CID: 0x%04x is_flushable: %d", 2097 cid, is_flushable); 2098 2099 #endif 2100 2101 return (true); 2102 } 2103 2104 /******************************************************************************* 2105 * 2106 * Function L2CA_DataWriteEx 2107 * 2108 * Description Higher layers call this function to write data with extended 2109 * flags. 2110 * flags : L2CAP_FLUSHABLE_CH_BASED 2111 * L2CAP_FLUSHABLE_PKT 2112 * L2CAP_NON_FLUSHABLE_PKT 2113 * 2114 * Returns L2CAP_DW_SUCCESS, if data accepted, else false 2115 * L2CAP_DW_CONGESTED, if data accepted and the channel is 2116 * congested 2117 * L2CAP_DW_FAILED, if error 2118 * 2119 ******************************************************************************/ 2120 uint8_t L2CA_DataWriteEx(uint16_t cid, BT_HDR* p_data, uint16_t flags) { 2121 L2CAP_TRACE_API("L2CA_DataWriteEx() CID: 0x%04x Len: %d Flags:0x%04X", cid, 2122 p_data->len, flags); 2123 return l2c_data_write(cid, p_data, flags); 2124 } 2125 2126 /******************************************************************************* 2127 * 2128 * Function L2CA_FlushChannel 2129 * 2130 * Description This function flushes none, some or all buffers queued up 2131 * for xmission for a particular CID. If called with 2132 * L2CAP_FLUSH_CHANS_GET (0), it simply returns the number 2133 * of buffers queued for that CID L2CAP_FLUSH_CHANS_ALL (0xffff) 2134 * flushes all buffers. All other values specifies the maximum 2135 * buffers to flush. 2136 * 2137 * Returns Number of buffers left queued for that CID 2138 * 2139 ******************************************************************************/ 2140 uint16_t L2CA_FlushChannel(uint16_t lcid, uint16_t num_to_flush) { 2141 tL2C_CCB* p_ccb; 2142 tL2C_LCB* p_lcb; 2143 uint16_t num_left = 0, num_flushed1 = 0, num_flushed2 = 0; 2144 2145 p_ccb = l2cu_find_ccb_by_cid(NULL, lcid); 2146 2147 if (!p_ccb || (p_ccb->p_lcb == NULL)) { 2148 L2CAP_TRACE_WARNING( 2149 "L2CA_FlushChannel() abnormally returning 0 CID: 0x%04x", lcid); 2150 return (0); 2151 } 2152 p_lcb = p_ccb->p_lcb; 2153 2154 if (num_to_flush != L2CAP_FLUSH_CHANS_GET) { 2155 L2CAP_TRACE_API( 2156 "L2CA_FlushChannel (FLUSH) CID: 0x%04x NumToFlush: %d QC: %u " 2157 "pFirst: 0x%08x", 2158 lcid, num_to_flush, fixed_queue_length(p_ccb->xmit_hold_q), 2159 fixed_queue_try_peek_first(p_ccb->xmit_hold_q)); 2160 } else { 2161 L2CAP_TRACE_API("L2CA_FlushChannel (QUERY) CID: 0x%04x", lcid); 2162 } 2163 2164 /* Cannot flush eRTM buffers once they have a sequence number */ 2165 if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_ERTM_MODE) { 2166 #if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE) 2167 if (num_to_flush != L2CAP_FLUSH_CHANS_GET) { 2168 /* If the controller supports enhanced flush, flush the data queued at the 2169 * controller */ 2170 if ((HCI_NON_FLUSHABLE_PB_SUPPORTED(BTM_ReadLocalFeatures())) && 2171 (BTM_GetNumScoLinks() == 0)) { 2172 if (l2cb.is_flush_active == false) { 2173 l2cb.is_flush_active = true; 2174 2175 /* The only packet type defined - 0 - Automatically-Flushable Only */ 2176 btsnd_hcic_enhanced_flush(p_lcb->handle, 0); 2177 } 2178 } 2179 } 2180 #endif 2181 2182 // Iterate though list and flush the amount requested from 2183 // the transmit data queue that satisfy the layer and event conditions. 2184 for (const list_node_t* node = list_begin(p_lcb->link_xmit_data_q); 2185 (num_to_flush > 0) && node != list_end(p_lcb->link_xmit_data_q);) { 2186 BT_HDR* p_buf = (BT_HDR*)list_node(node); 2187 node = list_next(node); 2188 if ((p_buf->layer_specific == 0) && (p_buf->event == lcid)) { 2189 num_to_flush--; 2190 num_flushed1++; 2191 2192 list_remove(p_lcb->link_xmit_data_q, p_buf); 2193 osi_free(p_buf); 2194 } 2195 } 2196 } 2197 2198 /* If needed, flush buffers in the CCB xmit hold queue */ 2199 while ((num_to_flush != 0) && (!fixed_queue_is_empty(p_ccb->xmit_hold_q))) { 2200 BT_HDR* p_buf = (BT_HDR*)fixed_queue_try_dequeue(p_ccb->xmit_hold_q); 2201 osi_free(p_buf); 2202 num_to_flush--; 2203 num_flushed2++; 2204 } 2205 2206 /* If app needs to track all packets, call him */ 2207 if ((p_ccb->p_rcb) && (p_ccb->p_rcb->api.pL2CA_TxComplete_Cb) && 2208 (num_flushed2)) 2209 (*p_ccb->p_rcb->api.pL2CA_TxComplete_Cb)(p_ccb->local_cid, num_flushed2); 2210 2211 /* Now count how many are left */ 2212 for (const list_node_t* node = list_begin(p_lcb->link_xmit_data_q); 2213 node != list_end(p_lcb->link_xmit_data_q); node = list_next(node)) { 2214 BT_HDR* p_buf = (BT_HDR*)list_node(node); 2215 if (p_buf->event == lcid) num_left++; 2216 } 2217 2218 /* Add in the number in the CCB xmit queue */ 2219 num_left += fixed_queue_length(p_ccb->xmit_hold_q); 2220 2221 /* Return the local number of buffers left for the CID */ 2222 L2CAP_TRACE_DEBUG("L2CA_FlushChannel() flushed: %u + %u, num_left: %u", 2223 num_flushed1, num_flushed2, num_left); 2224 2225 /* If we were congested, and now we are not, tell the app */ 2226 l2cu_check_channel_congestion(p_ccb); 2227 2228 return (num_left); 2229 } 2230