15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2004-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains the audio gateway functions controlling the RFCOMM 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * connections. 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 27f355ef5a4d7fb667fc57a0dfb60f738d870e252eMyles Watson 28cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bt_common.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_api.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_co.h" 31cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bta_ag_int.h" 32cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bta_api.h" 33cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bta_sys.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 35d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_api.h" 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "rfcdefs.h" 385cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "utl.h" 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Event mask for RfCOMM port callback */ 41cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#define BTA_AG_PORT_EV_MASK PORT_EV_RXCHAR 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* each scb has its own rfcomm callbacks */ 44e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenvoid bta_ag_port_cback_1(uint32_t code, uint16_t port_handle); 45e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenvoid bta_ag_port_cback_2(uint32_t code, uint16_t port_handle); 46e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenvoid bta_ag_port_cback_3(uint32_t code, uint16_t port_handle); 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenvoid bta_ag_mgmt_cback_1(uint32_t code, uint16_t port_handle); 49e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenvoid bta_ag_mgmt_cback_2(uint32_t code, uint16_t port_handle); 50e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenvoid bta_ag_mgmt_cback_3(uint32_t code, uint16_t port_handle); 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonint bta_ag_data_cback_1(uint16_t port_handle, void* p_data, uint16_t len); 53cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonint bta_ag_data_cback_2(uint16_t port_handle, void* p_data, uint16_t len); 54cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonint bta_ag_data_cback_3(uint16_t port_handle, void* p_data, uint16_t len); 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* rfcomm callback function tables */ 57cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsontypedef tPORT_CALLBACK* tBTA_AG_PORT_CBACK; 58cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonconst tBTA_AG_PORT_CBACK bta_ag_port_cback_tbl[] = { 59cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_port_cback_1, bta_ag_port_cback_2, bta_ag_port_cback_3}; 60cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 61cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonconst tBTA_AG_PORT_CBACK bta_ag_mgmt_cback_tbl[] = { 62cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_mgmt_cback_1, bta_ag_mgmt_cback_2, bta_ag_mgmt_cback_3}; 63cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 64cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsontypedef tPORT_DATA_CALLBACK* tBTA_AG_DATA_CBACK; 65cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonconst tBTA_AG_DATA_CBACK bta_ag_data_cback_tbl[] = { 66cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_data_cback_1, bta_ag_data_cback_2, bta_ag_data_cback_3}; 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_ag_port_cback 718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description RFCOMM Port callback 738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 78d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonstatic void bta_ag_port_cback(UNUSED_ATTR uint32_t code, uint16_t port_handle, 79cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t handle) { 80cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_AG_SCB* p_scb; 81cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 82f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_scb = bta_ag_scb_by_idx(handle); 83f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_scb != NULL) { 84cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* ignore port events for port handles other than connected handle */ 85cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (port_handle != p_scb->conn_handle) { 86cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG( 87cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "ag_port_cback ignoring handle:%d conn_handle = %d other handle = %d", 88cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson port_handle, p_scb->conn_handle, handle); 89cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 91cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 92cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR)); 93cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->event = BTA_AG_RFC_DATA_EVT; 94cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->layer_specific = handle; 95cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_buf); 96cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_ag_mgmt_cback 1028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description RFCOMM management callback 1048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 109cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_ag_mgmt_cback(uint32_t code, uint16_t port_handle, 110cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t handle) { 111cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_AG_SCB* p_scb; 112cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t event; 113cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t i; 114cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool found_handle = false; 115cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 116cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("ag_mgmt_cback : code = %d, port_handle = %d, handle = %d", 117cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson code, port_handle, handle); 118cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 119f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_scb = bta_ag_scb_by_idx(handle); 120f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_scb != NULL) { 121cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* ignore close event for port handles other than connected handle */ 122cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((code != PORT_SUCCESS) && (port_handle != p_scb->conn_handle)) { 123cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("ag_mgmt_cback ignoring handle:%d", port_handle); 124cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 125cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 127cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (code == PORT_SUCCESS) { 128cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_scb->conn_handle) /* Outgoing connection */ 129cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson { 130cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (port_handle == p_scb->conn_handle) found_handle = true; 131cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else /* Incoming connection */ 132cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson { 133cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (i = 0; i < BTA_AG_NUM_IDX; i++) { 134cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (port_handle == p_scb->serv_handle[i]) found_handle = true; 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 136cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 138cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!found_handle) { 139cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_ERROR( 140cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "bta_ag_mgmt_cback: PORT_SUCCESS, ignoring handle = %d", 141cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson port_handle); 142cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 143cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 145cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson event = BTA_AG_RFC_OPEN_EVT; 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 147cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* distinguish server close events */ 148cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else if (port_handle == p_scb->conn_handle) { 149cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson event = BTA_AG_RFC_CLOSE_EVT; 150cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 151cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson event = BTA_AG_RFC_SRV_CLOSE_EVT; 152cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 153cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 154cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_AG_RFC* p_buf = (tBTA_AG_RFC*)osi_malloc(sizeof(tBTA_AG_RFC)); 155cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->hdr.event = event; 156cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->hdr.layer_specific = handle; 157cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->port_handle = port_handle; 158cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_buf); 159cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_ag_data_cback 1658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description RFCOMM data callback 1678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 172cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic int bta_ag_data_cback(UNUSED_ATTR uint16_t port_handle, void* p_data, 173cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t len, uint16_t handle) { 174cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* call data call-out directly */ 175cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_co_tx_write(handle, (uint8_t*)p_data, len); 176cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return 0; 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_ag_port_cback_1 to 3 1828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * bta_ag_mgmt_cback_1 to 3 1838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description RFCOMM callback functions. This is an easy way to 1858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * distinguish scb from the callback. 1868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 191cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_mgmt_cback_1(uint32_t code, uint16_t handle) { 192cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_mgmt_cback(code, handle, 1); 193cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson} 194cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_mgmt_cback_2(uint32_t code, uint16_t handle) { 195cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_mgmt_cback(code, handle, 2); 196cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson} 197cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_mgmt_cback_3(uint32_t code, uint16_t handle) { 198cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_mgmt_cback(code, handle, 3); 199cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson} 200cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_port_cback_1(uint32_t code, uint16_t handle) { 201cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_port_cback(code, handle, 1); 202cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson} 203cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_port_cback_2(uint32_t code, uint16_t handle) { 204cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_port_cback(code, handle, 2); 205cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson} 206cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_port_cback_3(uint32_t code, uint16_t handle) { 207cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_port_cback(code, handle, 3); 208cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson} 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_ag_data_cback_1 to 3 2138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description RFCOMM data callback functions. This is an easy way to 2158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * distinguish scb from the callback. 2168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 2198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 221cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonint bta_ag_data_cback_1(uint16_t port_handle, void* p_data, uint16_t len) { 222cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return bta_ag_data_cback(port_handle, p_data, len, 1); 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 224cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonint bta_ag_data_cback_2(uint16_t port_handle, void* p_data, uint16_t len) { 225cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return bta_ag_data_cback(port_handle, p_data, len, 2); 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 227cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonint bta_ag_data_cback_3(uint16_t port_handle, void* p_data, uint16_t len) { 228cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return bta_ag_data_cback(port_handle, p_data, len, 3); 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_ag_setup_port 2348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Setup RFCOMM port for use by AG. 2368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 2398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 241cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_setup_port(tBTA_AG_SCB* p_scb, uint16_t handle) { 242cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t i = bta_ag_scb_to_idx(p_scb) - 1; 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 244cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* set up data callback if using pass through mode */ 245cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_ag_cb.parse_mode == BTA_AG_PASS_THROUGH) { 246cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson PORT_SetDataCallback(handle, bta_ag_data_cback_tbl[i]); 247cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 249cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson PORT_SetEventMask(handle, BTA_AG_PORT_EV_MASK); 250cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson PORT_SetEventCallback(handle, bta_ag_port_cback_tbl[i]); 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_ag_start_servers 2568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Setup RFCOMM servers for use by AG. 2588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 2618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 263cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_start_servers(tBTA_AG_SCB* p_scb, tBTA_SERVICE_MASK services) { 264cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson int i; 265cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson int bta_ag_port_status; 266cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 267cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson services >>= BTA_HSP_SERVICE_ID; 268cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (i = 0; i < BTA_AG_NUM_IDX && services != 0; i++, services >>= 1) { 269cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if service is set in mask */ 270cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (services & 1) { 271cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SetSecurityLevel(false, "", bta_ag_sec_id[i], p_scb->serv_sec_mask, 272cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, 273cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_cb.profile[i].scn); 274cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 275cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_port_status = RFCOMM_CreateConnection( 276cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_uuid[i], bta_ag_cb.profile[i].scn, true, BTA_AG_MTU, 277cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (uint8_t*)bd_addr_any, &(p_scb->serv_handle[i]), 278cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_mgmt_cback_tbl[bta_ag_scb_to_idx(p_scb) - 1]); 279cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 280cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (bta_ag_port_status == PORT_SUCCESS) { 281cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_setup_port(p_scb, p_scb->serv_handle[i]); 282cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 283cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* TODO: CR#137125 to handle to error properly */ 284cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG( 285cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson "bta_ag_start_servers: RFCOMM_CreateConnection returned error:%d", 286cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_port_status); 287cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 289cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_ag_close_servers 2958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Close RFCOMM servers port for use by AG. 2978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 3008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 302cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_close_servers(tBTA_AG_SCB* p_scb, tBTA_SERVICE_MASK services) { 303cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson int i; 304cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 305cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson services >>= BTA_HSP_SERVICE_ID; 306cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (i = 0; i < BTA_AG_NUM_IDX && services != 0; i++, services >>= 1) { 307cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if service is set in mask */ 308cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (services & 1) { 309cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson RFCOMM_RemoveServer(p_scb->serv_handle[i]); 310cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->serv_handle[i] = 0; 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 312cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_ag_is_server_closed 3188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Returns true if all servers are closed. 3208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns true if all servers are closed, false otherwise 3238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 325cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonbool bta_ag_is_server_closed(tBTA_AG_SCB* p_scb) { 326cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t xx; 327cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool is_closed = true; 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 329cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (xx = 0; xx < BTA_AG_NUM_IDX; xx++) { 330cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_scb->serv_handle[xx] != 0) is_closed = false; 331cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 333cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return is_closed; 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_ag_rfc_do_open 3398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Open an RFCOMM connection to the peer device. 3418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 3448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 346cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_rfc_do_open(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data) { 347cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SetSecurityLevel(true, "", bta_ag_sec_id[p_scb->conn_service], 348cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->cli_sec_mask, BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, 349cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->peer_scn); 350cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 351cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (RFCOMM_CreateConnection( 352cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_uuid[p_scb->conn_service], p_scb->peer_scn, false, BTA_AG_MTU, 353cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->peer_addr, &(p_scb->conn_handle), 354cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_mgmt_cback_tbl[bta_ag_scb_to_idx(p_scb) - 1]) == 355cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson PORT_SUCCESS) { 356cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_setup_port(p_scb, p_scb->conn_handle); 357cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("bta_ag_rfc_do_open : conn_handle = %d", 358cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->conn_handle); 359cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 360cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* RFCOMM create connection failed; send ourselves RFCOMM close event */ 361cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else { 362cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_ag_sm_execute(p_scb, BTA_AG_RFC_CLOSE_EVT, p_data); 363cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_ag_rfc_do_close 3698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Close RFCOMM connection. 3718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 3748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 376cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_rfc_do_close(tBTA_AG_SCB* p_scb, UNUSED_ATTR tBTA_AG_DATA* p_data) { 377cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_scb->conn_handle) { 378cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson RFCOMM_RemoveConnection(p_scb->conn_handle); 379cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 380cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Close API was called while AG is in Opening state. */ 381cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Need to trigger the state machine to send callback to the app */ 382cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* and move back to INIT state. */ 383cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_AG_RFC* p_buf = (tBTA_AG_RFC*)osi_malloc(sizeof(tBTA_AG_RFC)); 384cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->hdr.event = BTA_AG_RFC_CLOSE_EVT; 385cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->hdr.layer_specific = bta_ag_scb_to_idx(p_scb); 386cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_buf); 387cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 388cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Cancel SDP if it had been started. */ 389cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* 390cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if(p_scb->p_disc_db) 391cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson { 392cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (void)SDP_CancelServiceSearch (p_scb->p_disc_db); 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 394cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson */ 395cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 397