1 /****************************************************************************** 2 * 3 * Copyright (C) 2006-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 is the implementation of the JAVA API for Bluetooth Wireless 22 * Technology (JABWT) as specified by the JSR82 specificiation 23 * 24 ******************************************************************************/ 25 #include <string.h> 26 27 #include "bt_common.h" 28 #include "bta_api.h" 29 #include "bta_jv_api.h" 30 #include "bta_jv_int.h" 31 #include "bta_sys.h" 32 #include "gap_api.h" 33 #include "port_api.h" 34 #include "sdp_api.h" 35 #include "utl.h" 36 37 /***************************************************************************** 38 * Constants 39 ****************************************************************************/ 40 41 static const tBTA_SYS_REG bta_jv_reg = {bta_jv_sm_execute, NULL}; 42 43 /******************************************************************************* 44 * 45 * Function BTA_JvEnable 46 * 47 * Description Enable the Java I/F service. When the enable 48 * operation is complete the callback function will be 49 * called with a BTA_JV_ENABLE_EVT. This function must 50 * be called before other function in the JV API are 51 * called. 52 * 53 * Returns BTA_JV_SUCCESS if successful. 54 * BTA_JV_FAIL if internal failure. 55 * 56 ******************************************************************************/ 57 tBTA_JV_STATUS BTA_JvEnable(tBTA_JV_DM_CBACK* p_cback) { 58 tBTA_JV_STATUS status = BTA_JV_FAILURE; 59 int i; 60 61 APPL_TRACE_API("BTA_JvEnable"); 62 if (p_cback && false == bta_sys_is_register(BTA_ID_JV)) { 63 memset(&bta_jv_cb, 0, sizeof(tBTA_JV_CB)); 64 /* set handle to invalid value by default */ 65 for (i = 0; i < BTA_JV_PM_MAX_NUM; i++) { 66 bta_jv_cb.pm_cb[i].handle = BTA_JV_PM_HANDLE_CLEAR; 67 } 68 69 /* register with BTA system manager */ 70 bta_sys_register(BTA_ID_JV, &bta_jv_reg); 71 72 if (p_cback) { 73 tBTA_JV_API_ENABLE* p_buf = 74 (tBTA_JV_API_ENABLE*)osi_malloc(sizeof(tBTA_JV_API_ENABLE)); 75 p_buf->hdr.event = BTA_JV_API_ENABLE_EVT; 76 p_buf->p_cback = p_cback; 77 bta_sys_sendmsg(p_buf); 78 status = BTA_JV_SUCCESS; 79 } 80 } else { 81 APPL_TRACE_ERROR("JVenable fails"); 82 } 83 return (status); 84 } 85 86 /******************************************************************************* 87 * 88 * Function BTA_JvDisable 89 * 90 * Description Disable the Java I/F 91 * 92 * Returns void 93 * 94 ******************************************************************************/ 95 void BTA_JvDisable(void) { 96 BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR)); 97 98 APPL_TRACE_API("%s", __func__); 99 100 bta_sys_deregister(BTA_ID_JV); 101 p_buf->event = BTA_JV_API_DISABLE_EVT; 102 103 bta_sys_sendmsg(p_buf); 104 } 105 106 /******************************************************************************* 107 * 108 * Function BTA_JvIsEncrypted 109 * 110 * Description This function checks if the link to peer device is encrypted 111 * 112 * Returns true if encrypted. 113 * false if not. 114 * 115 ******************************************************************************/ 116 bool BTA_JvIsEncrypted(BD_ADDR bd_addr) { 117 bool is_encrypted = false; 118 uint8_t sec_flags, le_flags; 119 120 if (BTM_GetSecurityFlags(bd_addr, &sec_flags) && 121 BTM_GetSecurityFlagsByTransport(bd_addr, &le_flags, BT_TRANSPORT_LE)) { 122 if (sec_flags & BTM_SEC_FLAG_ENCRYPTED || le_flags & BTM_SEC_FLAG_ENCRYPTED) 123 is_encrypted = true; 124 } 125 return is_encrypted; 126 } 127 /******************************************************************************* 128 * 129 * Function BTA_JvGetChannelId 130 * 131 * Description This function reserves a SCN (server channel number) for 132 * applications running over RFCOMM, L2CAP of L2CAP_LE. 133 * It is primarily called by server profiles/applications to 134 * register their SCN into the SDP database. The SCN is 135 * reported by the tBTA_JV_DM_CBACK callback with a 136 * BTA_JV_GET_SCN_EVT for RFCOMM channels and 137 * BTA_JV_GET_PSM_EVT for L2CAP and LE. 138 * If the SCN/PSM reported is 0, that means all resources are 139 * exhausted. 140 * Parameters 141 * conn_type one of BTA_JV_CONN_TYPE_ 142 * user_data Any uservalue - will be returned in the resulting event. 143 * channel Only used for RFCOMM - to try to allocate a specific RFCOMM 144 * channel. 145 * 146 * Returns BTA_JV_SUCCESS, if the request is being processed. 147 * BTA_JV_FAILURE, otherwise. 148 * 149 ******************************************************************************/ 150 tBTA_JV_STATUS BTA_JvGetChannelId(int conn_type, uint32_t id, int32_t channel) { 151 tBTA_JV_API_ALLOC_CHANNEL* p_msg = 152 (tBTA_JV_API_ALLOC_CHANNEL*)osi_malloc(sizeof(tBTA_JV_API_ALLOC_CHANNEL)); 153 154 APPL_TRACE_API("%s", __func__); 155 156 p_msg->hdr.event = BTA_JV_API_GET_CHANNEL_EVT; 157 p_msg->type = conn_type; 158 p_msg->channel = channel; 159 if (conn_type == BTA_JV_CONN_TYPE_RFCOMM) { 160 p_msg->rfcomm_slot_id = id; 161 } else if (conn_type == BTA_JV_CONN_TYPE_L2CAP || 162 conn_type == BTA_JV_CONN_TYPE_L2CAP_LE) { 163 p_msg->l2cap_socket_id = id; 164 } else { 165 APPL_TRACE_ERROR("%s: Invalid connection type"); 166 return BTA_JV_FAILURE; 167 } 168 169 bta_sys_sendmsg(p_msg); 170 171 return BTA_JV_SUCCESS; 172 } 173 174 /******************************************************************************* 175 * 176 * Function BTA_JvFreeChannel 177 * 178 * Description This function frees a server channel number that was used 179 * by an application running over RFCOMM. 180 * Parameters 181 * channel The channel to free 182 * conn_type one of BTA_JV_CONN_TYPE_ 183 * 184 * Returns BTA_JV_SUCCESS, if the request is being processed. 185 * BTA_JV_FAILURE, otherwise. 186 * 187 ******************************************************************************/ 188 tBTA_JV_STATUS BTA_JvFreeChannel(uint16_t channel, int conn_type) { 189 tBTA_JV_API_FREE_CHANNEL* p_msg = 190 (tBTA_JV_API_FREE_CHANNEL*)osi_malloc(sizeof(tBTA_JV_API_FREE_CHANNEL)); 191 192 APPL_TRACE_API("%s", __func__); 193 194 p_msg->hdr.event = BTA_JV_API_FREE_SCN_EVT; 195 p_msg->scn = channel; 196 p_msg->type = conn_type; 197 198 bta_sys_sendmsg(p_msg); 199 200 return BTA_JV_SUCCESS; 201 } 202 203 /******************************************************************************* 204 * 205 * Function BTA_JvStartDiscovery 206 * 207 * Description This function performs service discovery for the services 208 * provided by the given peer device. When the operation is 209 * complete the tBTA_JV_DM_CBACK callback function will be 210 * called with a BTA_JV_DISCOVERY_COMP_EVT. 211 * 212 * Returns BTA_JV_SUCCESS, if the request is being processed. 213 * BTA_JV_FAILURE, otherwise. 214 * 215 ******************************************************************************/ 216 tBTA_JV_STATUS BTA_JvStartDiscovery(BD_ADDR bd_addr, uint16_t num_uuid, 217 tSDP_UUID* p_uuid_list, 218 uint32_t rfcomm_slot_id) { 219 tBTA_JV_API_START_DISCOVERY* p_msg = (tBTA_JV_API_START_DISCOVERY*)osi_malloc( 220 sizeof(tBTA_JV_API_START_DISCOVERY)); 221 222 APPL_TRACE_API("%s", __func__); 223 224 p_msg->hdr.event = BTA_JV_API_START_DISCOVERY_EVT; 225 bdcpy(p_msg->bd_addr, bd_addr); 226 p_msg->num_uuid = num_uuid; 227 memcpy(p_msg->uuid_list, p_uuid_list, num_uuid * sizeof(tSDP_UUID)); 228 p_msg->num_attr = 0; 229 p_msg->rfcomm_slot_id = rfcomm_slot_id; 230 231 bta_sys_sendmsg(p_msg); 232 233 return BTA_JV_SUCCESS; 234 } 235 236 /******************************************************************************* 237 * 238 * Function BTA_JvCreateRecord 239 * 240 * Description Create a service record in the local SDP database. 241 * When the operation is complete the tBTA_JV_DM_CBACK callback 242 * function will be called with a BTA_JV_CREATE_RECORD_EVT. 243 * 244 * Returns BTA_JV_SUCCESS, if the request is being processed. 245 * BTA_JV_FAILURE, otherwise. 246 * 247 ******************************************************************************/ 248 tBTA_JV_STATUS BTA_JvCreateRecordByUser(uint32_t rfcomm_slot_id) { 249 tBTA_JV_API_CREATE_RECORD* p_msg = 250 (tBTA_JV_API_CREATE_RECORD*)osi_malloc(sizeof(tBTA_JV_API_CREATE_RECORD)); 251 252 APPL_TRACE_API("%s", __func__); 253 254 p_msg->hdr.event = BTA_JV_API_CREATE_RECORD_EVT; 255 p_msg->rfcomm_slot_id = rfcomm_slot_id; 256 257 bta_sys_sendmsg(p_msg); 258 259 return BTA_JV_SUCCESS; 260 } 261 262 /******************************************************************************* 263 * 264 * Function BTA_JvDeleteRecord 265 * 266 * Description Delete a service record in the local SDP database. 267 * 268 * Returns BTA_JV_SUCCESS, if the request is being processed. 269 * BTA_JV_FAILURE, otherwise. 270 * 271 ******************************************************************************/ 272 tBTA_JV_STATUS BTA_JvDeleteRecord(uint32_t handle) { 273 tBTA_JV_API_ADD_ATTRIBUTE* p_msg = 274 (tBTA_JV_API_ADD_ATTRIBUTE*)osi_malloc(sizeof(tBTA_JV_API_ADD_ATTRIBUTE)); 275 276 APPL_TRACE_API("%s", __func__); 277 278 p_msg->hdr.event = BTA_JV_API_DELETE_RECORD_EVT; 279 p_msg->handle = handle; 280 281 bta_sys_sendmsg(p_msg); 282 283 return BTA_JV_SUCCESS; 284 } 285 286 /******************************************************************************* 287 * 288 * Function BTA_JvL2capConnectLE 289 * 290 * Description Initiate an LE connection as a L2CAP client to the given BD 291 * Address. 292 * When the connection is initiated or failed to initiate, 293 * tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_CL_INIT_EVT 294 * When the connection is established or failed, 295 * tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_OPEN_EVT 296 * 297 * Returns BTA_JV_SUCCESS, if the request is being processed. 298 * BTA_JV_FAILURE, otherwise. 299 * 300 ******************************************************************************/ 301 tBTA_JV_STATUS BTA_JvL2capConnectLE(tBTA_SEC sec_mask, tBTA_JV_ROLE role, 302 const tL2CAP_ERTM_INFO* ertm_info, 303 uint16_t remote_chan, uint16_t rx_mtu, 304 tL2CAP_CFG_INFO* cfg, BD_ADDR peer_bd_addr, 305 tBTA_JV_L2CAP_CBACK* p_cback, 306 uint32_t l2cap_socket_id) { 307 APPL_TRACE_API("%s", __func__); 308 309 if (p_cback == NULL) return BTA_JV_FAILURE; /* Nothing to do */ 310 311 tBTA_JV_API_L2CAP_CONNECT* p_msg = 312 (tBTA_JV_API_L2CAP_CONNECT*)osi_malloc(sizeof(tBTA_JV_API_L2CAP_CONNECT)); 313 p_msg->hdr.event = BTA_JV_API_L2CAP_CONNECT_LE_EVT; 314 p_msg->sec_mask = sec_mask; 315 p_msg->role = role; 316 p_msg->remote_chan = remote_chan; 317 p_msg->rx_mtu = rx_mtu; 318 if (cfg != NULL) { 319 p_msg->has_cfg = true; 320 p_msg->cfg = *cfg; 321 } else { 322 p_msg->has_cfg = false; 323 } 324 if (ertm_info != NULL) { 325 p_msg->has_ertm_info = true; 326 p_msg->ertm_info = *ertm_info; 327 } else { 328 p_msg->has_ertm_info = false; 329 } 330 memcpy(p_msg->peer_bd_addr, peer_bd_addr, sizeof(BD_ADDR)); 331 p_msg->p_cback = p_cback; 332 p_msg->l2cap_socket_id = l2cap_socket_id; 333 334 bta_sys_sendmsg(p_msg); 335 336 return BTA_JV_SUCCESS; 337 } 338 339 /******************************************************************************* 340 * 341 * Function BTA_JvL2capConnect 342 * 343 * Description Initiate a connection as a L2CAP client to the given BD 344 * Address. 345 * When the connection is initiated or failed to initiate, 346 * tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_CL_INIT_EVT 347 * When the connection is established or failed, 348 * tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_OPEN_EVT 349 * 350 * Returns BTA_JV_SUCCESS, if the request is being processed. 351 * BTA_JV_FAILURE, otherwise. 352 * 353 ******************************************************************************/ 354 tBTA_JV_STATUS BTA_JvL2capConnect(int conn_type, tBTA_SEC sec_mask, 355 tBTA_JV_ROLE role, 356 const tL2CAP_ERTM_INFO* ertm_info, 357 uint16_t remote_psm, uint16_t rx_mtu, 358 tL2CAP_CFG_INFO* cfg, BD_ADDR peer_bd_addr, 359 tBTA_JV_L2CAP_CBACK* p_cback, 360 uint32_t l2cap_socket_id) { 361 APPL_TRACE_API("%s", __func__); 362 363 if (p_cback == NULL) return BTA_JV_FAILURE; /* Nothing to do */ 364 365 tBTA_JV_API_L2CAP_CONNECT* p_msg = 366 (tBTA_JV_API_L2CAP_CONNECT*)osi_malloc(sizeof(tBTA_JV_API_L2CAP_CONNECT)); 367 p_msg->hdr.event = BTA_JV_API_L2CAP_CONNECT_EVT; 368 p_msg->type = conn_type; 369 p_msg->sec_mask = sec_mask; 370 p_msg->role = role; 371 p_msg->remote_psm = remote_psm; 372 p_msg->rx_mtu = rx_mtu; 373 if (cfg != NULL) { 374 p_msg->has_cfg = true; 375 p_msg->cfg = *cfg; 376 } else { 377 p_msg->has_cfg = false; 378 } 379 if (ertm_info != NULL) { 380 p_msg->has_ertm_info = true; 381 p_msg->ertm_info = *ertm_info; 382 } else { 383 p_msg->has_ertm_info = false; 384 } 385 memcpy(p_msg->peer_bd_addr, peer_bd_addr, sizeof(BD_ADDR)); 386 p_msg->p_cback = p_cback; 387 p_msg->l2cap_socket_id = l2cap_socket_id; 388 389 bta_sys_sendmsg(p_msg); 390 391 return BTA_JV_SUCCESS; 392 } 393 394 /******************************************************************************* 395 * 396 * Function BTA_JvL2capClose 397 * 398 * Description This function closes an L2CAP client connection 399 * 400 * Returns BTA_JV_SUCCESS, if the request is being processed. 401 * BTA_JV_FAILURE, otherwise. 402 * 403 ******************************************************************************/ 404 tBTA_JV_STATUS BTA_JvL2capClose(uint32_t handle) { 405 tBTA_JV_STATUS status = BTA_JV_FAILURE; 406 407 APPL_TRACE_API("%s", __func__); 408 409 if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback) { 410 tBTA_JV_API_L2CAP_CLOSE* p_msg = 411 (tBTA_JV_API_L2CAP_CLOSE*)osi_malloc(sizeof(tBTA_JV_API_L2CAP_CLOSE)); 412 p_msg->hdr.event = BTA_JV_API_L2CAP_CLOSE_EVT; 413 p_msg->handle = handle; 414 p_msg->p_cb = &bta_jv_cb.l2c_cb[handle]; 415 416 bta_sys_sendmsg(p_msg); 417 status = BTA_JV_SUCCESS; 418 } 419 420 return status; 421 } 422 423 /******************************************************************************* 424 * 425 * Function BTA_JvL2capCloseLE 426 * 427 * Description This function closes an L2CAP client connection for Fixed 428 * Channels Function is idempotent and no callbacks are called! 429 * 430 * Returns BTA_JV_SUCCESS, if the request is being processed. 431 * BTA_JV_FAILURE, otherwise. 432 * 433 ******************************************************************************/ 434 tBTA_JV_STATUS BTA_JvL2capCloseLE(uint32_t handle) { 435 tBTA_JV_API_L2CAP_CLOSE* p_msg = 436 (tBTA_JV_API_L2CAP_CLOSE*)osi_malloc(sizeof(tBTA_JV_API_L2CAP_CLOSE)); 437 438 APPL_TRACE_API("%s", __func__); 439 440 p_msg->hdr.event = BTA_JV_API_L2CAP_CLOSE_FIXED_EVT; 441 p_msg->handle = handle; 442 443 bta_sys_sendmsg(p_msg); 444 445 return BTA_JV_SUCCESS; 446 } 447 448 /******************************************************************************* 449 * 450 * Function BTA_JvL2capStartServer 451 * 452 * Description This function starts an L2CAP server and listens for an 453 * L2CAP connection from a remote Bluetooth device. When the 454 * server is started successfully, tBTA_JV_L2CAP_CBACK is 455 * called with BTA_JV_L2CAP_START_EVT. When the connection is 456 * established tBTA_JV_L2CAP_CBACK is called with 457 * BTA_JV_L2CAP_OPEN_EVT. 458 * 459 * Returns BTA_JV_SUCCESS, if the request is being processed. 460 * BTA_JV_FAILURE, otherwise. 461 * 462 ******************************************************************************/ 463 tBTA_JV_STATUS BTA_JvL2capStartServer(int conn_type, tBTA_SEC sec_mask, 464 tBTA_JV_ROLE role, 465 const tL2CAP_ERTM_INFO* ertm_info, 466 uint16_t local_psm, uint16_t rx_mtu, 467 tL2CAP_CFG_INFO* cfg, 468 tBTA_JV_L2CAP_CBACK* p_cback, 469 uint32_t l2cap_socket_id) { 470 APPL_TRACE_API("%s", __func__); 471 472 if (p_cback == NULL) return BTA_JV_FAILURE; /* Nothing to do */ 473 474 tBTA_JV_API_L2CAP_SERVER* p_msg = 475 (tBTA_JV_API_L2CAP_SERVER*)osi_malloc(sizeof(tBTA_JV_API_L2CAP_SERVER)); 476 p_msg->hdr.event = BTA_JV_API_L2CAP_START_SERVER_EVT; 477 p_msg->type = conn_type; 478 p_msg->sec_mask = sec_mask; 479 p_msg->role = role; 480 p_msg->local_psm = local_psm; 481 p_msg->rx_mtu = rx_mtu; 482 if (cfg != NULL) { 483 p_msg->has_cfg = true; 484 p_msg->cfg = *cfg; 485 } else { 486 p_msg->has_cfg = false; 487 } 488 if (ertm_info != NULL) { 489 p_msg->has_ertm_info = true; 490 p_msg->ertm_info = *ertm_info; 491 } else { 492 p_msg->has_ertm_info = false; 493 } 494 p_msg->p_cback = p_cback; 495 p_msg->l2cap_socket_id = l2cap_socket_id; 496 497 bta_sys_sendmsg(p_msg); 498 499 return BTA_JV_SUCCESS; 500 } 501 502 /******************************************************************************* 503 * 504 * Function BTA_JvL2capStartServerLE 505 * 506 * Description This function starts an LE L2CAP server and listens for an 507 * L2CAP connection from a remote Bluetooth device. When the 508 * server is started successfully, tBTA_JV_L2CAP_CBACK is 509 * called with BTA_JV_L2CAP_START_EVT. When the connection is 510 * established, tBTA_JV_L2CAP_CBACK is called with 511 * BTA_JV_L2CAP_OPEN_EVT. 512 * 513 * Returns BTA_JV_SUCCESS, if the request is being processed. 514 * BTA_JV_FAILURE, otherwise. 515 * 516 ******************************************************************************/ 517 tBTA_JV_STATUS BTA_JvL2capStartServerLE(tBTA_SEC sec_mask, tBTA_JV_ROLE role, 518 const tL2CAP_ERTM_INFO* ertm_info, 519 uint16_t local_chan, uint16_t rx_mtu, 520 tL2CAP_CFG_INFO* cfg, 521 tBTA_JV_L2CAP_CBACK* p_cback, 522 uint32_t l2cap_socket_id) { 523 APPL_TRACE_API("%s", __func__); 524 525 if (p_cback == NULL) return BTA_JV_FAILURE; /* Nothing to do */ 526 527 tBTA_JV_API_L2CAP_SERVER* p_msg = 528 (tBTA_JV_API_L2CAP_SERVER*)osi_malloc(sizeof(tBTA_JV_API_L2CAP_SERVER)); 529 p_msg->hdr.event = BTA_JV_API_L2CAP_START_SERVER_LE_EVT; 530 p_msg->sec_mask = sec_mask; 531 p_msg->role = role; 532 p_msg->local_chan = local_chan; 533 p_msg->rx_mtu = rx_mtu; 534 if (cfg != NULL) { 535 p_msg->has_cfg = true; 536 p_msg->cfg = *cfg; 537 } else { 538 p_msg->has_cfg = false; 539 } 540 if (ertm_info != NULL) { 541 p_msg->has_ertm_info = true; 542 p_msg->ertm_info = *ertm_info; 543 } else { 544 p_msg->has_ertm_info = false; 545 } 546 p_msg->p_cback = p_cback; 547 p_msg->l2cap_socket_id = l2cap_socket_id; 548 549 bta_sys_sendmsg(p_msg); 550 551 return BTA_JV_SUCCESS; 552 } 553 554 /******************************************************************************* 555 * 556 * Function BTA_JvL2capStopServer 557 * 558 * Description This function stops the L2CAP server. If the server has an 559 * active connection, it would be closed. 560 * 561 * Returns BTA_JV_SUCCESS, if the request is being processed. 562 * BTA_JV_FAILURE, otherwise. 563 * 564 ******************************************************************************/ 565 tBTA_JV_STATUS BTA_JvL2capStopServer(uint16_t local_psm, 566 uint32_t l2cap_socket_id) { 567 APPL_TRACE_API("%s", __func__); 568 569 tBTA_JV_API_L2CAP_SERVER* p_msg = 570 (tBTA_JV_API_L2CAP_SERVER*)osi_malloc(sizeof(tBTA_JV_API_L2CAP_SERVER)); 571 p_msg->hdr.event = BTA_JV_API_L2CAP_STOP_SERVER_EVT; 572 p_msg->local_psm = local_psm; 573 p_msg->l2cap_socket_id = l2cap_socket_id; 574 575 bta_sys_sendmsg(p_msg); 576 577 return BTA_JV_SUCCESS; 578 } 579 580 /******************************************************************************* 581 * 582 * Function BTA_JvL2capStopServerLE 583 * 584 * Description This function stops the LE L2CAP server. If the server has 585 * an active connection, it would be closed. 586 * 587 * Returns BTA_JV_SUCCESS, if the request is being processed. 588 * BTA_JV_FAILURE, otherwise. 589 * 590 ******************************************************************************/ 591 tBTA_JV_STATUS BTA_JvL2capStopServerLE(uint16_t local_chan, 592 uint32_t l2cap_socket_id) { 593 APPL_TRACE_API("%s", __func__); 594 595 tBTA_JV_API_L2CAP_SERVER* p_msg = 596 (tBTA_JV_API_L2CAP_SERVER*)osi_malloc(sizeof(tBTA_JV_API_L2CAP_SERVER)); 597 p_msg->hdr.event = BTA_JV_API_L2CAP_STOP_SERVER_LE_EVT; 598 p_msg->local_chan = local_chan; 599 p_msg->l2cap_socket_id = l2cap_socket_id; 600 601 bta_sys_sendmsg(p_msg); 602 603 return BTA_JV_SUCCESS; 604 } 605 606 /******************************************************************************* 607 * 608 * Function BTA_JvL2capRead 609 * 610 * Description This function reads data from an L2CAP connecti; 611 tBTA_JV_RFC_CB *p_cb = rc->p_cb; 612 on 613 * When the operation is complete, tBTA_JV_L2CAP_CBACK is 614 * called with BTA_JV_L2CAP_READ_EVT. 615 * 616 * Returns BTA_JV_SUCCESS, if the request is being processed. 617 * BTA_JV_FAILURE, otherwise. 618 * 619 ******************************************************************************/ 620 tBTA_JV_STATUS BTA_JvL2capRead(uint32_t handle, uint32_t req_id, 621 uint8_t* p_data, uint16_t len) { 622 tBTA_JV_STATUS status = BTA_JV_FAILURE; 623 tBTA_JV_L2CAP_READ evt_data; 624 625 APPL_TRACE_API("%s", __func__); 626 627 if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback) { 628 status = BTA_JV_SUCCESS; 629 evt_data.status = BTA_JV_FAILURE; 630 evt_data.handle = handle; 631 evt_data.req_id = req_id; 632 evt_data.p_data = p_data; 633 evt_data.len = 0; 634 635 if (BT_PASS == 636 GAP_ConnReadData((uint16_t)handle, p_data, len, &evt_data.len)) { 637 evt_data.status = BTA_JV_SUCCESS; 638 } 639 bta_jv_cb.l2c_cb[handle].p_cback(BTA_JV_L2CAP_READ_EVT, (tBTA_JV*)&evt_data, 640 bta_jv_cb.l2c_cb[handle].l2cap_socket_id); 641 } 642 643 return (status); 644 } 645 646 /******************************************************************************* 647 * 648 * Function BTA_JvL2capReady 649 * 650 * Description This function determined if there is data to read from 651 * an L2CAP connection 652 * 653 * Returns BTA_JV_SUCCESS, if data queue size is in *p_data_size. 654 * BTA_JV_FAILURE, if error. 655 * 656 ******************************************************************************/ 657 tBTA_JV_STATUS BTA_JvL2capReady(uint32_t handle, uint32_t* p_data_size) { 658 tBTA_JV_STATUS status = BTA_JV_FAILURE; 659 660 APPL_TRACE_API("%s: %d", __func__, handle); 661 if (p_data_size && handle < BTA_JV_MAX_L2C_CONN && 662 bta_jv_cb.l2c_cb[handle].p_cback) { 663 *p_data_size = 0; 664 if (BT_PASS == GAP_GetRxQueueCnt((uint16_t)handle, p_data_size)) { 665 status = BTA_JV_SUCCESS; 666 } 667 } 668 669 return (status); 670 } 671 672 /******************************************************************************* 673 * 674 * Function BTA_JvL2capWrite 675 * 676 * Description This function writes data to an L2CAP connection 677 * When the operation is complete, tBTA_JV_L2CAP_CBACK is 678 * called with BTA_JV_L2CAP_WRITE_EVT. Works for 679 * PSM-based connections 680 * 681 * Returns BTA_JV_SUCCESS, if the request is being processed. 682 * BTA_JV_FAILURE, otherwise. 683 * 684 ******************************************************************************/ 685 tBTA_JV_STATUS BTA_JvL2capWrite(uint32_t handle, uint32_t req_id, 686 uint8_t* p_data, uint16_t len, 687 uint32_t user_id) { 688 tBTA_JV_STATUS status = BTA_JV_FAILURE; 689 690 APPL_TRACE_API("%s", __func__); 691 692 if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback) { 693 tBTA_JV_API_L2CAP_WRITE* p_msg = 694 (tBTA_JV_API_L2CAP_WRITE*)osi_malloc(sizeof(tBTA_JV_API_L2CAP_WRITE)); 695 p_msg->hdr.event = BTA_JV_API_L2CAP_WRITE_EVT; 696 p_msg->handle = handle; 697 p_msg->req_id = req_id; 698 p_msg->p_data = p_data; 699 p_msg->p_cb = &bta_jv_cb.l2c_cb[handle]; 700 p_msg->len = len; 701 p_msg->user_id = user_id; 702 703 bta_sys_sendmsg(p_msg); 704 705 status = BTA_JV_SUCCESS; 706 } 707 708 return status; 709 } 710 711 /******************************************************************************* 712 * 713 * Function BTA_JvL2capWriteFixed 714 * 715 * Description This function writes data to an L2CAP connection 716 * When the operation is complete, tBTA_JV_L2CAP_CBACK is 717 * called with BTA_JV_L2CAP_WRITE_EVT. Works for 718 * fixed-channel connections 719 * 720 * Returns BTA_JV_SUCCESS, if the request is being processed. 721 * BTA_JV_FAILURE, otherwise. 722 * 723 ******************************************************************************/ 724 tBTA_JV_STATUS BTA_JvL2capWriteFixed(uint16_t channel, BD_ADDR* addr, 725 uint32_t req_id, 726 tBTA_JV_L2CAP_CBACK* p_cback, 727 uint8_t* p_data, uint16_t len, 728 uint32_t user_id) { 729 tBTA_JV_API_L2CAP_WRITE_FIXED* p_msg = 730 (tBTA_JV_API_L2CAP_WRITE_FIXED*)osi_malloc( 731 sizeof(tBTA_JV_API_L2CAP_WRITE_FIXED)); 732 733 APPL_TRACE_API("%s", __func__); 734 735 p_msg->hdr.event = BTA_JV_API_L2CAP_WRITE_FIXED_EVT; 736 p_msg->channel = channel; 737 memcpy(p_msg->addr, addr, sizeof(p_msg->addr)); 738 p_msg->req_id = req_id; 739 p_msg->p_data = p_data; 740 p_msg->p_cback = p_cback; 741 p_msg->len = len; 742 p_msg->user_id = user_id; 743 744 bta_sys_sendmsg(p_msg); 745 746 return BTA_JV_SUCCESS; 747 } 748 749 /******************************************************************************* 750 * 751 * Function BTA_JvRfcommConnect 752 * 753 * Description This function makes an RFCOMM conection to a remote BD 754 * Address. 755 * When the connection is initiated or failed to initiate, 756 * tBTA_JV_RFCOMM_CBACK is called with 757 * BTA_JV_RFCOMM_CL_INIT_EVT 758 * When the connection is established or failed, 759 * tBTA_JV_RFCOMM_CBACK is called with BTA_JV_RFCOMM_OPEN_EVT 760 * 761 * Returns BTA_JV_SUCCESS, if the request is being processed. 762 * BTA_JV_FAILURE, otherwise. 763 * 764 ******************************************************************************/ 765 tBTA_JV_STATUS BTA_JvRfcommConnect(tBTA_SEC sec_mask, tBTA_JV_ROLE role, 766 uint8_t remote_scn, BD_ADDR peer_bd_addr, 767 tBTA_JV_RFCOMM_CBACK* p_cback, 768 uint32_t rfcomm_slot_id) { 769 APPL_TRACE_API("%s", __func__); 770 771 if (p_cback == NULL) return BTA_JV_FAILURE; /* Nothing to do */ 772 773 tBTA_JV_API_RFCOMM_CONNECT* p_msg = (tBTA_JV_API_RFCOMM_CONNECT*)osi_malloc( 774 sizeof(tBTA_JV_API_RFCOMM_CONNECT)); 775 p_msg->hdr.event = BTA_JV_API_RFCOMM_CONNECT_EVT; 776 p_msg->sec_mask = sec_mask; 777 p_msg->role = role; 778 p_msg->remote_scn = remote_scn; 779 memcpy(p_msg->peer_bd_addr, peer_bd_addr, sizeof(BD_ADDR)); 780 p_msg->p_cback = p_cback; 781 p_msg->rfcomm_slot_id = rfcomm_slot_id; 782 783 bta_sys_sendmsg(p_msg); 784 785 return BTA_JV_SUCCESS; 786 } 787 788 /******************************************************************************* 789 * 790 * Function BTA_JvRfcommClose 791 * 792 * Description This function closes an RFCOMM connection 793 * 794 * Returns BTA_JV_SUCCESS, if the request is being processed. 795 * BTA_JV_FAILURE, otherwise. 796 * 797 ******************************************************************************/ 798 tBTA_JV_STATUS BTA_JvRfcommClose(uint32_t handle, uint32_t rfcomm_slot_id) { 799 tBTA_JV_STATUS status = BTA_JV_FAILURE; 800 uint32_t hi = ((handle & BTA_JV_RFC_HDL_MASK) & ~BTA_JV_RFCOMM_MASK) - 1; 801 uint32_t si = BTA_JV_RFC_HDL_TO_SIDX(handle); 802 803 APPL_TRACE_API("%s", __func__); 804 805 if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback && 806 si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si]) { 807 tBTA_JV_API_RFCOMM_CLOSE* p_msg = 808 (tBTA_JV_API_RFCOMM_CLOSE*)osi_malloc(sizeof(tBTA_JV_API_RFCOMM_CLOSE)); 809 p_msg->hdr.event = BTA_JV_API_RFCOMM_CLOSE_EVT; 810 p_msg->handle = handle; 811 p_msg->p_cb = &bta_jv_cb.rfc_cb[hi]; 812 p_msg->p_pcb = &bta_jv_cb.port_cb[p_msg->p_cb->rfc_hdl[si] - 1]; 813 p_msg->rfcomm_slot_id = rfcomm_slot_id; 814 815 bta_sys_sendmsg(p_msg); 816 817 status = BTA_JV_SUCCESS; 818 } 819 820 return status; 821 } 822 823 /******************************************************************************* 824 * 825 * Function BTA_JvRfcommStartServer 826 * 827 * Description This function starts listening for an RFCOMM connection 828 * request from a remote Bluetooth device. When the server is 829 * started successfully, tBTA_JV_RFCOMM_CBACK is called 830 * with BTA_JV_RFCOMM_START_EVT. 831 * When the connection is established, tBTA_JV_RFCOMM_CBACK 832 * is called with BTA_JV_RFCOMM_OPEN_EVT. 833 * 834 * Returns BTA_JV_SUCCESS, if the request is being processed. 835 * BTA_JV_FAILURE, otherwise. 836 * 837 ******************************************************************************/ 838 tBTA_JV_STATUS BTA_JvRfcommStartServer(tBTA_SEC sec_mask, tBTA_JV_ROLE role, 839 uint8_t local_scn, uint8_t max_session, 840 tBTA_JV_RFCOMM_CBACK* p_cback, 841 uint32_t rfcomm_slot_id) { 842 APPL_TRACE_API("%s", __func__); 843 844 if (p_cback == NULL) return BTA_JV_FAILURE; /* Nothing to do */ 845 846 tBTA_JV_API_RFCOMM_SERVER* p_msg = 847 (tBTA_JV_API_RFCOMM_SERVER*)osi_malloc(sizeof(tBTA_JV_API_RFCOMM_SERVER)); 848 if (max_session == 0) max_session = 1; 849 if (max_session > BTA_JV_MAX_RFC_SR_SESSION) { 850 APPL_TRACE_DEBUG("max_session is too big. use max (%d)", max_session, 851 BTA_JV_MAX_RFC_SR_SESSION); 852 max_session = BTA_JV_MAX_RFC_SR_SESSION; 853 } 854 p_msg->hdr.event = BTA_JV_API_RFCOMM_START_SERVER_EVT; 855 p_msg->sec_mask = sec_mask; 856 p_msg->role = role; 857 p_msg->local_scn = local_scn; 858 p_msg->max_session = max_session; 859 p_msg->p_cback = p_cback; 860 p_msg->rfcomm_slot_id = rfcomm_slot_id; // caller's private data 861 862 bta_sys_sendmsg(p_msg); 863 864 return BTA_JV_SUCCESS; 865 } 866 867 /******************************************************************************* 868 * 869 * Function BTA_JvRfcommStopServer 870 * 871 * Description This function stops the RFCOMM server. If the server has an 872 * active connection, it would be closed. 873 * 874 * Returns BTA_JV_SUCCESS, if the request is being processed. 875 * BTA_JV_FAILURE, otherwise. 876 * 877 ******************************************************************************/ 878 tBTA_JV_STATUS BTA_JvRfcommStopServer(uint32_t handle, 879 uint32_t rfcomm_slot_id) { 880 tBTA_JV_API_RFCOMM_SERVER* p_msg = 881 (tBTA_JV_API_RFCOMM_SERVER*)osi_malloc(sizeof(tBTA_JV_API_RFCOMM_SERVER)); 882 883 APPL_TRACE_API("%s", __func__); 884 885 p_msg->hdr.event = BTA_JV_API_RFCOMM_STOP_SERVER_EVT; 886 p_msg->handle = handle; 887 p_msg->rfcomm_slot_id = rfcomm_slot_id; // caller's private data 888 889 bta_sys_sendmsg(p_msg); 890 891 return BTA_JV_SUCCESS; 892 } 893 894 /******************************************************************************* 895 * 896 * Function BTA_JvRfcommGetPortHdl 897 * 898 * Description This function fetches the rfcomm port handle 899 * 900 * Returns BTA_JV_SUCCESS, if the request is being processed. 901 * BTA_JV_FAILURE, otherwise. 902 * 903 ******************************************************************************/ 904 uint16_t BTA_JvRfcommGetPortHdl(uint32_t handle) { 905 uint32_t hi = ((handle & BTA_JV_RFC_HDL_MASK) & ~BTA_JV_RFCOMM_MASK) - 1; 906 uint32_t si = BTA_JV_RFC_HDL_TO_SIDX(handle); 907 908 if (hi < BTA_JV_MAX_RFC_CONN && si < BTA_JV_MAX_RFC_SR_SESSION && 909 bta_jv_cb.rfc_cb[hi].rfc_hdl[si]) 910 return bta_jv_cb.port_cb[bta_jv_cb.rfc_cb[hi].rfc_hdl[si] - 1].port_handle; 911 else 912 return 0xffff; 913 } 914 915 /******************************************************************************* 916 * 917 * Function BTA_JvRfcommWrite 918 * 919 * Description This function writes data to an RFCOMM connection 920 * 921 * Returns BTA_JV_SUCCESS, if the request is being processed. 922 * BTA_JV_FAILURE, otherwise. 923 * 924 ******************************************************************************/ 925 tBTA_JV_STATUS BTA_JvRfcommWrite(uint32_t handle, uint32_t req_id) { 926 tBTA_JV_STATUS status = BTA_JV_FAILURE; 927 uint32_t hi = ((handle & BTA_JV_RFC_HDL_MASK) & ~BTA_JV_RFCOMM_MASK) - 1; 928 uint32_t si = BTA_JV_RFC_HDL_TO_SIDX(handle); 929 930 APPL_TRACE_API("%s", __func__); 931 932 APPL_TRACE_DEBUG("handle:0x%x, hi:%d, si:%d", handle, hi, si); 933 if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback && 934 si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si]) { 935 tBTA_JV_API_RFCOMM_WRITE* p_msg = 936 (tBTA_JV_API_RFCOMM_WRITE*)osi_malloc(sizeof(tBTA_JV_API_RFCOMM_WRITE)); 937 p_msg->hdr.event = BTA_JV_API_RFCOMM_WRITE_EVT; 938 p_msg->handle = handle; 939 p_msg->req_id = req_id; 940 p_msg->p_cb = &bta_jv_cb.rfc_cb[hi]; 941 p_msg->p_pcb = &bta_jv_cb.port_cb[p_msg->p_cb->rfc_hdl[si] - 1]; 942 APPL_TRACE_API("write ok"); 943 944 bta_sys_sendmsg(p_msg); 945 status = BTA_JV_SUCCESS; 946 } 947 948 return status; 949 } 950 951 /******************************************************************************* 952 * 953 * Function BTA_JVSetPmProfile 954 * 955 * Description: This function set or free power mode profile for different JV 956 * application. 957 * 958 * Parameters: handle, JV handle from RFCOMM or L2CAP 959 * app_id: app specific pm ID, can be BTA_JV_PM_ALL, see 960 * bta_dm_cfg.c for details 961 * BTA_JV_PM_ID_CLEAR: removes pm management on the handle. init_st 962 * is ignored and BTA_JV_CONN_CLOSE is called implicitly 963 * init_st: state after calling this API. typically it should be 964 * BTA_JV_CONN_OPEN 965 * 966 * Returns BTA_JV_SUCCESS, if the request is being processed. 967 * BTA_JV_FAILURE, otherwise. 968 * 969 * NOTE: BTA_JV_PM_ID_CLEAR: In general no need to be called as jv pm 970 * calls automatically 971 * BTA_JV_CONN_CLOSE to remove in case of connection close! 972 * 973 ******************************************************************************/ 974 tBTA_JV_STATUS BTA_JvSetPmProfile(uint32_t handle, tBTA_JV_PM_ID app_id, 975 tBTA_JV_CONN_STATE init_st) { 976 tBTA_JV_API_SET_PM_PROFILE* p_msg = (tBTA_JV_API_SET_PM_PROFILE*)osi_malloc( 977 sizeof(tBTA_JV_API_SET_PM_PROFILE)); 978 979 APPL_TRACE_API("%s handle:0x%x, app_id:%d", __func__, handle, app_id); 980 981 p_msg->hdr.event = BTA_JV_API_SET_PM_PROFILE_EVT; 982 p_msg->handle = handle; 983 p_msg->app_id = app_id; 984 p_msg->init_st = init_st; 985 986 bta_sys_sendmsg(p_msg); 987 988 return BTA_JV_SUCCESS; 989 } 990