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 pan action functions for the state machine. 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen#if (PAN_INCLUDED == TRUE) 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29f355ef5a4d7fb667fc57a0dfb60f738d870e252eMyles Watson#include <string.h> 30f355ef5a4d7fb667fc57a0dfb60f738d870e252eMyles Watson 31258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h" 32cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bta_api.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_pan_api.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_pan_co.h" 35cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bta_pan_int.h" 36cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bta_sys.h" 37d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h" 38cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "pan_api.h" 395cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "utl.h" 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* RX and TX data flow mask */ 42cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#define BTA_PAN_RX_MASK 0x0F 43cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#define BTA_PAN_TX_MASK 0xF0 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_pm_conn_busy 488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description set pan pm connection busy state 508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Params p_scb: state machine control block of pan connection 528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 55ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 56cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_pan_pm_conn_busy(tBTA_PAN_SCB* p_scb) { 57cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((p_scb != NULL) && (p_scb->state != BTA_PAN_IDLE_ST)) 58cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_busy(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr); 5936f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure} 6036f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure 6136f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure/******************************************************************************* 628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_pm_conn_idle 648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description set pan pm connection idle state 668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Params p_scb: state machine control block of pan connection 688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 71ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 72cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_pan_pm_conn_idle(tBTA_PAN_SCB* p_scb) { 73cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((p_scb != NULL) && (p_scb->state != BTA_PAN_IDLE_ST)) 74cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_idle(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr); 7536f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure} 7636f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure 7736f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure/******************************************************************************* 788af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 798af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_conn_state_cback 808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Connection state callback from Pan profile 828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 87cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_pan_conn_state_cback(uint16_t handle, BD_ADDR bd_addr, 88cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tPAN_RESULT state, bool is_role_change, 89cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t src_role, uint8_t dst_role) { 90cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_PAN_SCB* p_scb; 91cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_PAN_CONN* p_buf = (tBTA_PAN_CONN*)osi_malloc(sizeof(tBTA_PAN_CONN)); 92cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 93cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((state == PAN_SUCCESS) && !is_role_change) { 94cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->hdr.event = BTA_PAN_CONN_OPEN_EVT; 95f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_scb = bta_pan_scb_by_handle(handle); 96f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_scb == NULL) { 97cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* allocate an scb */ 98cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb = bta_pan_scb_alloc(); 99717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov } 100cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* we have exceeded maximum number of connections */ 101cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!p_scb) { 102cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson PAN_Disconnect(handle); 103cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 106cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->handle = handle; 107cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->local_role = src_role; 108cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->peer_role = dst_role; 109cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->pan_flow_enable = true; 110cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(p_scb->bd_addr, bd_addr); 111cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->data_queue = fixed_queue_new(SIZE_MAX); 112cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 113cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (src_role == PAN_ROLE_CLIENT) 114cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->app_id = bta_pan_cb.app_id[0]; 115cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else if (src_role == PAN_ROLE_GN_SERVER) 116cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->app_id = bta_pan_cb.app_id[1]; 117cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else if (src_role == PAN_ROLE_NAP_SERVER) 118cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->app_id = bta_pan_cb.app_id[2]; 119cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else if ((state != PAN_SUCCESS) && !is_role_change) { 120cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->hdr.event = BTA_PAN_CONN_CLOSE_EVT; 121cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 122cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 123cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 125cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->result = state; 126cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->hdr.layer_specific = handle; 127cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 128cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_buf); 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_data_flow_cb 1348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Data flow status callback from PAN 1368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 141cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_pan_data_flow_cb(uint16_t handle, tPAN_RESULT result) { 142cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_PAN_SCB* p_scb; 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 144f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_scb = bta_pan_scb_by_handle(handle); 145f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_scb == NULL) return; 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 147cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (result == PAN_TX_FLOW_ON) { 148cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR)); 149cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->layer_specific = handle; 150cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->event = BTA_PAN_BNEP_FLOW_ENABLE_EVT; 151cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_buf); 152cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_co_rx_flow(handle, p_scb->app_id, true); 153cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else if (result == PAN_TX_FLOW_OFF) { 154cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->pan_flow_enable = false; 155cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_co_rx_flow(handle, p_scb->app_id, false); 156cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_data_buf_ind_cback 1628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description data indication callback from pan profile 1648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 1678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 1688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 169cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_pan_data_buf_ind_cback(uint16_t handle, BD_ADDR src, 170cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_ADDR dst, uint16_t protocol, 171cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_HDR* p_buf, bool ext, bool forward) { 172cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_PAN_SCB* p_scb; 173cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_HDR* p_new_buf; 174cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 175cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (sizeof(tBTA_PAN_DATA_PARAMS) > p_buf->offset) { 176cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* offset smaller than data structure in front of actual data */ 177cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_new_buf = (BT_HDR*)osi_malloc(PAN_BUF_SIZE); 178cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson memcpy((uint8_t*)(p_new_buf + 1) + sizeof(tBTA_PAN_DATA_PARAMS), 179cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (uint8_t*)(p_buf + 1) + p_buf->offset, p_buf->len); 180cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_new_buf->len = p_buf->len; 181cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_new_buf->offset = sizeof(tBTA_PAN_DATA_PARAMS); 182cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free(p_buf); 183cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 184cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_new_buf = p_buf; 185cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 186cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* copy params into the space before the data */ 187cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(((tBTA_PAN_DATA_PARAMS*)p_new_buf)->src, src); 188cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(((tBTA_PAN_DATA_PARAMS*)p_new_buf)->dst, dst); 189cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((tBTA_PAN_DATA_PARAMS*)p_new_buf)->protocol = protocol; 190cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((tBTA_PAN_DATA_PARAMS*)p_new_buf)->ext = ext; 191cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((tBTA_PAN_DATA_PARAMS*)p_new_buf)->forward = forward; 192cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 193f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_scb = bta_pan_scb_by_handle(handle); 194f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_scb == NULL) { 195cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free(p_new_buf); 196cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return; 197cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 198cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 199cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson fixed_queue_enqueue(p_scb->data_queue, p_new_buf); 200cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_HDR* p_event = (BT_HDR*)osi_malloc(sizeof(BT_HDR)); 201cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_event->layer_specific = handle; 202cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_event->event = BTA_PAN_RX_FROM_BNEP_READY_EVT; 203cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_event); 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_pfilt_ind_cback 2098af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2108af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description 2118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 2148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 216cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_pan_pfilt_ind_cback(uint16_t handle, bool indication, 217cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBNEP_RESULT result, uint16_t num_filters, 218cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t* p_filters) { 219cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_co_pfilt_ind( 220cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson handle, indication, 221cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_PAN_STATUS)((result == BNEP_SUCCESS) ? BTA_PAN_SUCCESS 222cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson : BTA_PAN_FAIL), 223cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson num_filters, p_filters); 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2278af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2288af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_mfilt_ind_cback 2298af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description 2318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 2348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 236cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_pan_mfilt_ind_cback(uint16_t handle, bool indication, 237cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBNEP_RESULT result, uint16_t num_mfilters, 238cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t* p_mfilters) { 239cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_co_mfilt_ind( 240cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson handle, indication, 241cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson (tBTA_PAN_STATUS)((result == BNEP_SUCCESS) ? BTA_PAN_SUCCESS 242cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson : BTA_PAN_FAIL), 243cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson num_mfilters, p_mfilters); 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_has_multiple_connections 2498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Check whether there are multiple GN/NAP connections to 2518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * different devices 2528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns bool 2558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 257cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic bool bta_pan_has_multiple_connections(uint8_t app_id) { 258cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_PAN_SCB* p_scb = NULL; 259cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bool found = false; 260cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BD_ADDR bd_addr; 261cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 262cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (uint8_t index = 0; index < BTA_PAN_NUM_CONN; index++) { 263cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb = &bta_pan_cb.scb[index]; 264cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_scb->in_use == true && app_id == p_scb->app_id) { 265cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* save temp bd_addr */ 266cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(bd_addr, p_scb->bd_addr); 267cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson found = true; 268cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson break; 2696b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney } 270cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 271cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 272cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* If cannot find a match then there is no connection at all */ 273cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (found == false) return false; 274cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 275cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* Find whether there is another connection with different device other than 276cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson PANU. 277cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson Could be same service or different service */ 278cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (uint8_t index = 0; index < BTA_PAN_NUM_CONN; index++) { 279cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb = &bta_pan_cb.scb[index]; 280cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_scb->in_use == true && p_scb->app_id != bta_pan_cb.app_id[0] && 281cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcmp(bd_addr, p_scb->bd_addr)) { 282cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return true; 2836b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney } 284cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 285cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson return false; 2866b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney} 2876b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney 2886b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney/******************************************************************************* 2898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_enable 2918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description 2938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 2978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 2988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 299cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_pan_enable(tBTA_PAN_DATA* p_data) { 300cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tPAN_REGISTER reg_data; 301cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t initial_discoverability; 302cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t initial_connectability; 303cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t d_window; 304cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t d_interval; 305cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t c_window; 306cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint16_t c_interval; 307cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 308cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_cb.p_cback = p_data->api_enable.p_cback; 309cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 310cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson reg_data.pan_conn_state_cb = bta_pan_conn_state_cback; 311cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson reg_data.pan_bridge_req_cb = NULL; 312cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson reg_data.pan_data_buf_ind_cb = bta_pan_data_buf_ind_cback; 313cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson reg_data.pan_data_ind_cb = NULL; 314cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson reg_data.pan_pfilt_ind_cb = bta_pan_pfilt_ind_cback; 315cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson reg_data.pan_mfilt_ind_cb = bta_pan_mfilt_ind_cback; 316cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson reg_data.pan_tx_data_flow_cb = bta_pan_data_flow_cb; 317cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 318cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* read connectability and discoverability settings. 319cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson Pan profile changes the settings. We have to change it back to 320cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson be consistent with other bta subsystems */ 321cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson initial_connectability = BTM_ReadConnectability(&c_window, &c_interval); 322cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson initial_discoverability = BTM_ReadDiscoverability(&d_window, &d_interval); 323cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 324cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson PAN_Register(®_data); 325cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 326cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* set it back to original value */ 327cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SetDiscoverability(initial_discoverability, d_window, d_interval); 328cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BTM_SetConnectability(initial_connectability, c_window, c_interval); 329cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 330cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_cb.flow_mask = bta_pan_co_init(&bta_pan_cb.q_level); 331cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_cb.p_cback(BTA_PAN_ENABLE_EVT, NULL); 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_set_role 3378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description 3398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 3418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 343cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_pan_set_role(tBTA_PAN_DATA* p_data) { 344cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tPAN_RESULT status; 345cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov tBTA_PAN bta_pan; 346cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t sec[3]; 347cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 348cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_cb.app_id[0] = p_data->api_set_role.user_app_id; 349cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_cb.app_id[1] = p_data->api_set_role.gn_app_id; 350cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_cb.app_id[2] = p_data->api_set_role.nap_app_id; 351cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 352cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec[0] = p_data->api_set_role.user_sec_mask; 353cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec[1] = p_data->api_set_role.gn_sec_mask; 354cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson sec[2] = p_data->api_set_role.nap_sec_mask; 355cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 356cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* set security correctly in api and here */ 357cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = PAN_SetRole( 358cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->api_set_role.role, sec, p_data->api_set_role.user_name, 359cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->api_set_role.gn_name, p_data->api_set_role.nap_name); 360cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 361cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bta_pan.set_role.role = p_data->api_set_role.role; 362cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (status == PAN_SUCCESS) { 363cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->api_set_role.role & PAN_ROLE_NAP_SERVER) 364cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_add_uuid(UUID_SERVCLASS_NAP); 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 366cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_remove_uuid(UUID_SERVCLASS_NAP); 367cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 368cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->api_set_role.role & PAN_ROLE_GN_SERVER) 369cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_add_uuid(UUID_SERVCLASS_GN); 370cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 371cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_remove_uuid(UUID_SERVCLASS_GN); 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 373cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->api_set_role.role & PAN_ROLE_CLIENT) 374cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_add_uuid(UUID_SERVCLASS_PANU); 375cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else 376cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_remove_uuid(UUID_SERVCLASS_PANU); 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 378cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bta_pan.set_role.status = BTA_PAN_SUCCESS; 379cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 380cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if status is not success clear everything */ 381cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else { 382cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson PAN_SetRole(0, 0, NULL, NULL, NULL); 383cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_remove_uuid(UUID_SERVCLASS_NAP); 384cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_remove_uuid(UUID_SERVCLASS_GN); 385cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_remove_uuid(UUID_SERVCLASS_PANU); 386cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bta_pan.set_role.status = BTA_PAN_FAIL; 387cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 388cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bta_pan_cb.p_cback(BTA_PAN_SET_ROLE_EVT, &bta_pan); 389cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson} 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_disable 3948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description 3968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 3998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 4008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 402cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_pan_disable(void) { 403cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_HDR* p_buf; 404cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_PAN_SCB* p_scb = &bta_pan_cb.scb[0]; 405cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson uint8_t i; 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 407cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* close all connections */ 408cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson PAN_SetRole(0, NULL, NULL, NULL, NULL); 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4101e61ce1ae3fe8ef72443b30907f1cf8acae39674Chris Manton#if (BTA_EIR_CANNED_UUID_LIST != TRUE) 411cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_remove_uuid(UUID_SERVCLASS_NAP); 412cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_remove_uuid(UUID_SERVCLASS_GN); 413cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_remove_uuid(UUID_SERVCLASS_PANU); 414cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#endif // BTA_EIR_CANNED_UUID_LIST 415cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* free all queued up data buffers */ 416cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson for (i = 0; i < BTA_PAN_NUM_CONN; i++, p_scb++) { 417cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_scb->in_use) { 418cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson while ((p_buf = (BT_HDR*)fixed_queue_try_dequeue(p_scb->data_queue)) != 419cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson NULL) 420cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free(p_buf); 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 422cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_co_close(p_scb->handle, p_scb->app_id); 423cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 424cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 426cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson PAN_Deregister(); 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4308af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4318af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_open 4328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description 4348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 4368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 438cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_pan_open(tBTA_PAN_SCB* p_scb, tBTA_PAN_DATA* p_data) { 439cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tPAN_RESULT status; 440cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov tBTA_PAN bta_pan; 441cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 442cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson status = PAN_Connect(p_data->api_open.bd_addr, p_data->api_open.local_role, 443cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->api_open.peer_role, &p_scb->handle); 444cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s pan connect status: %d", __func__, status); 445cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 446cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (status == PAN_SUCCESS) { 447cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bdcpy(p_scb->bd_addr, p_data->api_open.bd_addr); 448cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->local_role = p_data->api_open.local_role; 449cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->peer_role = p_data->api_open.peer_role; 450cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bdcpy(bta_pan.opening.bd_addr, p_data->api_open.bd_addr); 451cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bta_pan.opening.handle = p_scb->handle; 452cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bta_pan_cb.p_cback(BTA_PAN_OPENING_EVT, &bta_pan); 453cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 454cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 455cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_scb_dealloc(p_scb); 456cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bdcpy(bta_pan.open.bd_addr, p_data->api_open.bd_addr); 457cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bta_pan.open.status = BTA_PAN_FAIL; 458cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bta_pan.open.local_role = p_data->api_open.local_role; 459cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bta_pan.open.peer_role = p_data->api_open.peer_role; 460cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bta_pan_cb.p_cback(BTA_PAN_OPEN_EVT, &bta_pan); 461cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_close 4678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description 4698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 4738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 475cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_pan_api_close(tBTA_PAN_SCB* p_scb, UNUSED_ATTR tBTA_PAN_DATA* p_data) { 476cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson tBTA_PAN_CONN* p_buf = (tBTA_PAN_CONN*)osi_malloc(sizeof(tBTA_PAN_CONN)); 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 478cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson PAN_Disconnect(p_scb->handle); 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 480cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* 481cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * Send an event to BTA so that application will get the connection 482cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson * close event. 483cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson */ 484cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->hdr.event = BTA_PAN_CONN_CLOSE_EVT; 485cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->hdr.layer_specific = p_scb->handle; 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 487cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_buf); 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_conn_open 4938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description process connection open event 4958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 4978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 4988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 499cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_pan_conn_open(tBTA_PAN_SCB* p_scb, tBTA_PAN_DATA* p_data) { 500cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov tBTA_PAN bta_pan; 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 502cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson APPL_TRACE_DEBUG("%s pan connection result: %d", __func__, 503cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_data->conn.result); 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 505cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bdcpy(bta_pan.open.bd_addr, p_scb->bd_addr); 506cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bta_pan.open.handle = p_scb->handle; 507cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bta_pan.open.local_role = p_scb->local_role; 508cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bta_pan.open.peer_role = p_scb->peer_role; 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 510cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_data->conn.result == PAN_SUCCESS) { 511cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bta_pan.open.status = BTA_PAN_SUCCESS; 512e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_scb->pan_flow_enable = true; 513e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssen p_scb->app_flow_enable = true; 5146b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney bta_sys_conn_open(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr); 515cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } else { 516cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_scb_dealloc(p_scb); 517cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bta_pan.open.status = BTA_PAN_FAIL; 518cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 520cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->pan_flow_enable = true; 521cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->app_flow_enable = true; 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 523cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* If app_id is NAP/GN, check whether there are multiple connections. 524cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson If there are, provide a special app_id to dm to enforce master role only. 525cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson */ 526cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((p_scb->app_id == bta_pan_cb.app_id[1] || 527cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->app_id == bta_pan_cb.app_id[2]) && 528cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_has_multiple_connections(p_scb->app_id)) { 529cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->app_id = BTA_APP_ID_PAN_MULTI; 530cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 531cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 532cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_conn_open(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr); 533cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bta_pan_cb.p_cback(BTA_PAN_OPEN_EVT, &bta_pan); 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_conn_close 5398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description process connection close event 5418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 5458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 547cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_pan_conn_close(tBTA_PAN_SCB* p_scb, tBTA_PAN_DATA* p_data) { 548cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov tBTA_PAN bta_pan; 549cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_HDR* p_buf; 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 551cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bta_pan.close.handle = p_data->hdr.layer_specific; 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 553cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_conn_close(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr); 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 555cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* free all queued up data buffers */ 556cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson while ((p_buf = (BT_HDR*)fixed_queue_try_dequeue(p_scb->data_queue)) != NULL) 557cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free(p_buf); 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 559cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_scb_dealloc(p_scb); 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 561cf036139cc01bd0c79897087f5c1e995e92937d6Pavlin Radoslavov bta_pan_cb.p_cback(BTA_PAN_CLOSE_EVT, &bta_pan); 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_rx_path 5678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Handle data on the RX path (data sent from the phone to 5698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * BTA). 5708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 5738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 575cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_pan_rx_path(tBTA_PAN_SCB* p_scb, UNUSED_ATTR tBTA_PAN_DATA* p_data) { 576cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if data path configured for rx pull */ 577cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((bta_pan_cb.flow_mask & BTA_PAN_RX_MASK) == BTA_PAN_RX_PULL) { 578cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if we can accept data */ 579cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_scb->pan_flow_enable == true) { 580cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* call application callout function for rx path */ 581cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_co_rx_path(p_scb->handle, p_scb->app_id); 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 583cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 584cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* else data path configured for rx push */ 585cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else { 586cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5918af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_tx_path 5928af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Handle the TX data path (data sent from BTA to the phone). 5948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 5978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 5988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 599cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_pan_tx_path(tBTA_PAN_SCB* p_scb, UNUSED_ATTR tBTA_PAN_DATA* p_data) { 600cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if data path configured for tx pull */ 601cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((bta_pan_cb.flow_mask & BTA_PAN_TX_MASK) == BTA_PAN_TX_PULL) { 602cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_pm_conn_busy(p_scb); 603cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* call application callout function for tx path */ 604cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_co_tx_path(p_scb->handle, p_scb->app_id); 605cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 606cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* free data that exceeds queue level */ 607cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson while (fixed_queue_length(p_scb->data_queue) > bta_pan_cb.q_level) 608cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free(fixed_queue_try_dequeue(p_scb->data_queue)); 609cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_pm_conn_idle(p_scb); 610cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 611cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if configured for zero copy push */ 612cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson else if ((bta_pan_cb.flow_mask & BTA_PAN_TX_MASK) == BTA_PAN_TX_PUSH_BUF) { 613cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if app can accept data */ 614cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (p_scb->app_flow_enable == true) { 615cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson BT_HDR* p_buf; 616cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 617cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* read data from the queue */ 618f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_buf = (BT_HDR*)fixed_queue_try_dequeue(p_scb->data_queue); 619f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_buf != NULL) { 620cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* send data to application */ 621cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_co_tx_writebuf(p_scb->handle, p_scb->app_id, 622cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((tBTA_PAN_DATA_PARAMS*)p_buf)->src, 623cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((tBTA_PAN_DATA_PARAMS*)p_buf)->dst, 624cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((tBTA_PAN_DATA_PARAMS*)p_buf)->protocol, p_buf, 625cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((tBTA_PAN_DATA_PARAMS*)p_buf)->ext, 626cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((tBTA_PAN_DATA_PARAMS*)p_buf)->forward); 627cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 628cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* free data that exceeds queue level */ 629cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson while (fixed_queue_length(p_scb->data_queue) > bta_pan_cb.q_level) 630cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free(fixed_queue_try_dequeue(p_scb->data_queue)); 631cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 632cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson /* if there is more data to be passed to 633cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson upper layer */ 634cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if (!fixed_queue_is_empty(p_scb->data_queue)) { 635cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR)); 636cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->layer_specific = p_scb->handle; 637cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_buf->event = BTA_PAN_RX_FROM_BNEP_READY_EVT; 638cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_sys_sendmsg(p_buf); 639cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 641cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6468af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_tx_flow 6478af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6488af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Set the application flow control state. 6498af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6508af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6518af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 6528af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6538af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 654cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_pan_tx_flow(tBTA_PAN_SCB* p_scb, tBTA_PAN_DATA* p_data) { 655cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson p_scb->app_flow_enable = p_data->ci_tx_flow.enable; 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_write_buf 6618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Handle a bta_pan_ci_rx_writebuf() and send data to PAN. 6638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 6668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 668cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_pan_write_buf(tBTA_PAN_SCB* p_scb, tBTA_PAN_DATA* p_data) { 669cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson if ((bta_pan_cb.flow_mask & BTA_PAN_RX_MASK) == BTA_PAN_RX_PUSH_BUF) { 670cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_pm_conn_busy(p_scb); 671cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson 672cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson PAN_WriteBuf(p_scb->handle, ((tBTA_PAN_DATA_PARAMS*)p_data)->dst, 673cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((tBTA_PAN_DATA_PARAMS*)p_data)->src, 674cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((tBTA_PAN_DATA_PARAMS*)p_data)->protocol, (BT_HDR*)p_data, 675cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson ((tBTA_PAN_DATA_PARAMS*)p_data)->ext); 676cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson bta_pan_pm_conn_idle(p_scb); 677cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson } 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function bta_pan_free_buf 6838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description Frees the data buffer during closing state 6858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns void 6888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * 6898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/ 690cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_pan_free_buf(UNUSED_ATTR tBTA_PAN_SCB* p_scb, tBTA_PAN_DATA* p_data) { 691cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson osi_free(p_data); 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* PAN_INCLUDED */ 695