16ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 26ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 36ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Copyright (C) 2004-2012 Broadcom Corporation 46ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 56ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Licensed under the Apache License, Version 2.0 (the "License"); 66ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * you may not use this file except in compliance with the License. 76ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * You may obtain a copy of the License at: 86ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 96ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * http://www.apache.org/licenses/LICENSE-2.0 106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Unless required by applicable law or agreed to in writing, software 126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * distributed under the License is distributed on an "AS IS" BASIS, 136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * See the License for the specific language governing permissions and 156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * limitations under the License. 166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * This file contains the pan action functions for the state machine. 226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 24e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 25e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bt_target.h" 26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if defined(PAN_INCLUDED) && (PAN_INCLUDED == TRUE) 28e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bta_api.h" 30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bta_sys.h" 31e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bd.h" 32e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "gki.h" 33e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "pan_api.h" 34e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bta_pan_api.h" 35e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bta_pan_int.h" 36e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bta_pan_co.h" 37e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <string.h> 38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* RX and TX data flow mask */ 41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define BTA_PAN_RX_MASK 0x0F 42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define BTA_PAN_TX_MASK 0xF0 43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 45e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_pan_conn_state_cback 47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 48e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Connection state callback from Pan profile 498e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 50e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 51e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 53e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_pan_conn_state_cback(UINT16 handle, BD_ADDR bd_addr, tPAN_RESULT state, 55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN is_role_change, UINT8 src_role, UINT8 dst_role) 56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 57e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_PAN_CONN * p_buf; 59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_PAN_SCB *p_scb; 60e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 61e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 62e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_buf = (tBTA_PAN_CONN *) GKI_getbuf(sizeof(tBTA_PAN_CONN))) != NULL) 63e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if((state == PAN_SUCCESS) && !is_role_change) 65e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->hdr.event = BTA_PAN_CONN_OPEN_EVT; 67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if((p_scb = bta_pan_scb_by_handle(handle)) == NULL) 68e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 69e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* allocate an scb */ 70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_scb = bta_pan_scb_alloc(); 71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 72e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* we have exceeded maximum number of connections */ 74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(!p_scb) 75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 76e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach PAN_Disconnect (handle); 77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_scb->handle = handle; 81e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_scb->local_role = src_role; 82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_scb->peer_role = dst_role; 83e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_scb->pan_flow_enable = TRUE; 84e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(p_scb->bd_addr, bd_addr); 85e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_init_q(&p_scb->data_queue); 86e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 87e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(src_role == PAN_ROLE_CLIENT) 88e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_scb->app_id = bta_pan_cb.app_id[0]; 89e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (src_role == PAN_ROLE_GN_SERVER) 90e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_scb->app_id = bta_pan_cb.app_id[1]; 91e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (src_role == PAN_ROLE_NAP_SERVER) 928e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy p_scb->app_id = bta_pan_cb.app_id[2]; 93e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 94e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if((state != PAN_SUCCESS) && !is_role_change) 96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->hdr.event = BTA_PAN_CONN_CLOSE_EVT; 98e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 99e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->result = state; 106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->hdr.layer_specific = handle; 107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_buf); 108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_pan_data_flow_cb 118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Data flow status callback from PAN 1208e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_pan_data_flow_cb(UINT16 handle, tPAN_RESULT result) 126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BT_HDR *p_buf; 128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_PAN_SCB *p_scb; 129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if((p_scb = bta_pan_scb_by_handle(handle)) == NULL) 131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(result == PAN_TX_FLOW_ON) 134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) 136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->layer_specific = handle; 138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->event = BTA_PAN_BNEP_FLOW_ENABLE_EVT; 139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_buf); 140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_co_rx_flow(handle, p_scb->app_id, TRUE); 142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if(result == PAN_TX_FLOW_OFF) 145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_scb->pan_flow_enable = FALSE; 148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_co_rx_flow(handle, p_scb->app_id, FALSE); 149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_pan_data_buf_ind_cback 159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description data indication callback from pan profile 1618e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_pan_data_buf_ind_cback(UINT16 handle, BD_ADDR src, BD_ADDR dst, UINT16 protocol, BT_HDR *p_buf, 167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN ext, BOOLEAN forward) 168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_PAN_SCB *p_scb; 170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BT_HDR * p_event; 171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BT_HDR *p_new_buf; 172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( sizeof(tBTA_PAN_DATA_PARAMS) > p_buf->offset ) 174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* offset smaller than data structure in front of actual data */ 176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_new_buf = (BT_HDR *)GKI_getpoolbuf( PAN_POOL_ID ); 177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(!p_new_buf) 178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach APPL_TRACE_WARNING0("Cannot get a PAN GKI buffer"); 180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf( p_buf ); 181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy( (UINT8 *)(p_new_buf+1)+sizeof(tBTA_PAN_DATA_PARAMS), (UINT8 *)(p_buf+1)+p_buf->offset, p_buf->len ); 186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_new_buf->len = p_buf->len; 187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_new_buf->offset = sizeof(tBTA_PAN_DATA_PARAMS); 188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf( p_buf ); 189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_new_buf = p_buf; 194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* copy params into the space before the data */ 196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(((tBTA_PAN_DATA_PARAMS *)p_new_buf)->src, src); 197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(((tBTA_PAN_DATA_PARAMS *)p_new_buf)->dst, dst); 198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ((tBTA_PAN_DATA_PARAMS *)p_new_buf)->protocol = protocol; 199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ((tBTA_PAN_DATA_PARAMS *)p_new_buf)->ext = ext; 200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ((tBTA_PAN_DATA_PARAMS *)p_new_buf)->forward = forward; 201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if((p_scb = bta_pan_scb_by_handle(handle)) == NULL) 204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 2058e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy 206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf( p_new_buf ); 207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_enqueue(&p_scb->data_queue, p_new_buf); 211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_event = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) 212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_event->layer_specific = handle; 214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_event->event = BTA_PAN_RX_FROM_BNEP_READY_EVT; 215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_event); 216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_pan_pfilt_ind_cback 224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2258e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** Description 2268e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_pan_pfilt_ind_cback(UINT16 handle, BOOLEAN indication,tBNEP_RESULT result, 232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 num_filters, UINT8 *p_filters) 233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_co_pfilt_ind(handle, indication, (tBTA_PAN_STATUS)((result == BNEP_SUCCESS) ? BTA_PAN_SUCCESS : BTA_PAN_FAIL), 236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_filters, p_filters); 237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_pan_mfilt_ind_cback 245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2468e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** Description 2478e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void bta_pan_mfilt_ind_cback(UINT16 handle, BOOLEAN indication,tBNEP_RESULT result, 253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 num_mfilters, UINT8 *p_mfilters) 254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_co_mfilt_ind(handle, indication, (tBTA_PAN_STATUS)((result == BNEP_SUCCESS) ? BTA_PAN_SUCCESS : BTA_PAN_FAIL), 257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach num_mfilters, p_mfilters); 258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_pan_enable 265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2668e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** Description 2678e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 2688e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_pan_enable(tBTA_PAN_DATA *p_data) 274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tPAN_REGISTER reg_data; 276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 initial_discoverability; 277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 initial_connectability; 278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 d_window; 279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 d_interval; 280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 c_window; 281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 c_interval; 282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_cb.p_cback = p_data->api_enable.p_cback; 284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach reg_data.pan_conn_state_cb = bta_pan_conn_state_cback; 286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach reg_data.pan_bridge_req_cb = NULL; 287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach reg_data.pan_data_buf_ind_cb = bta_pan_data_buf_ind_cback; 288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach reg_data.pan_data_ind_cb = NULL; 289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach reg_data.pan_pfilt_ind_cb = bta_pan_pfilt_ind_cback; 290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach reg_data.pan_mfilt_ind_cb = bta_pan_mfilt_ind_cback; 291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach reg_data.pan_tx_data_flow_cb = bta_pan_data_flow_cb; 292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* read connectability and discoverability settings. 2948e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy Pan profile changes the settings. We have to change it back to 295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach be consistent with other bta subsystems */ 296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach initial_connectability = BTM_ReadConnectability(&c_window, &c_interval); 297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach initial_discoverability = BTM_ReadDiscoverability(&d_window, &d_interval); 298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach PAN_Register (®_data); 301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* set it back to original value */ 304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetDiscoverability(initial_discoverability, d_window, d_interval); 305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_SetConnectability(initial_connectability, c_window, c_interval); 306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_cb.flow_mask = bta_pan_co_init(&bta_pan_cb.q_level); 308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_cb.p_cback(BTA_PAN_ENABLE_EVT, NULL); 309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_pan_set_role 315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3168e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** Description 3178e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_pan_set_role(tBTA_PAN_DATA *p_data) 322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tPAN_RESULT status; 324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_PAN_SET_ROLE set_role; 325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 sec[3]; 326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_cb.app_id[0] = p_data->api_set_role.user_app_id; 329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_cb.app_id[1] = p_data->api_set_role.gn_app_id; 330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_cb.app_id[2] = p_data->api_set_role.nap_app_id; 331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec[0] = p_data->api_set_role.user_sec_mask; 333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec[1] = p_data->api_set_role.gn_sec_mask; 334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec[2] = p_data->api_set_role.nap_sec_mask; 335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* set security correctly in api and here */ 337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = PAN_SetRole(p_data->api_set_role.role, sec, 338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->api_set_role.user_name, 339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->api_set_role.gn_name, 340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_data->api_set_role.nap_name); 341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3428e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy set_role.role = p_data->api_set_role.role; 343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(status == PAN_SUCCESS) 344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_data->api_set_role.role & PAN_ROLE_NAP_SERVER ) 346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_add_uuid(UUID_SERVCLASS_NAP); 347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_remove_uuid(UUID_SERVCLASS_NAP); 349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_data->api_set_role.role & PAN_ROLE_GN_SERVER ) 351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_add_uuid(UUID_SERVCLASS_GN); 352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_remove_uuid(UUID_SERVCLASS_GN); 354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_data->api_set_role.role & PAN_ROLE_CLIENT ) 356e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_add_uuid(UUID_SERVCLASS_PANU); 357e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 358e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_remove_uuid(UUID_SERVCLASS_PANU); 359e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 3608e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy set_role.status = BTA_PAN_SUCCESS; 361e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 362e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if status is not success clear everything */ 363e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 365e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach PAN_SetRole(0, 0, NULL, NULL, NULL); 366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_remove_uuid(UUID_SERVCLASS_NAP); 367e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_remove_uuid(UUID_SERVCLASS_GN); 368e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_remove_uuid(UUID_SERVCLASS_PANU); 3698e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy set_role.status = BTA_PAN_FAIL; 370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 3718e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy bta_pan_cb.p_cback(BTA_PAN_SET_ROLE_EVT, (tBTA_PAN *)&set_role); 372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_pan_disable 379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3808e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** Description 3818e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 3828e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 383e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 385e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_pan_disable(void) 388e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 389e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BT_HDR *p_buf; 391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_PAN_SCB *p_scb = &bta_pan_cb.scb[0]; 392e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 i; 393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 394e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 395e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* close all connections */ 396e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach PAN_SetRole (0, NULL, NULL, NULL, NULL); 397e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 398e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&(BTA_EIR_CANNED_UUID_LIST != TRUE) 399e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_remove_uuid(UUID_SERVCLASS_NAP); 400e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_remove_uuid(UUID_SERVCLASS_GN); 401e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_remove_uuid(UUID_SERVCLASS_PANU); 402e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 403e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* free all queued up data buffers */ 404e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i = 0; i < BTA_PAN_NUM_CONN; i++, p_scb++) 405e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 406e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_scb->in_use) 407e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 408e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach while((p_buf = (BT_HDR *)GKI_dequeue(&p_scb->data_queue)) != NULL) 409e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf(p_buf); 4108e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy 411e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_co_close(p_scb->handle, p_scb->app_id); 412e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 413e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 414e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 415e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 416e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 417e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 418e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach PAN_Deregister(); 419e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 420e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 421e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 422e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 423e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 424e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_pan_open 425e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4268e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** Description 427e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 428e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 429e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 430e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 431e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_pan_open(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data) 432e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 433e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tPAN_RESULT status; 434e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_PAN_OPEN data; 435e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_PAN_OPENING opening; 436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 4388e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy status = PAN_Connect (p_data->api_open.bd_addr, p_data->api_open.local_role, p_data->api_open.peer_role, 439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach &p_scb->handle); 440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 441e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 442e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(status == PAN_SUCCESS) 443e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 444e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 445e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(p_scb->bd_addr, p_data->api_open.bd_addr); 446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_scb->local_role = p_data->api_open.local_role; 447e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_scb->peer_role = p_data->api_open.peer_role; 448e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(opening.bd_addr, p_data->api_open.bd_addr); 449e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach opening.handle = p_scb->handle; 450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_cb.p_cback(BTA_PAN_OPENING_EVT, (tBTA_PAN *)&opening); 451e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 452e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 453e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 454e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 455e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 456e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_scb_dealloc(p_scb); 457e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(data.bd_addr, p_data->api_open.bd_addr); 458e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data.status = BTA_PAN_FAIL; 459e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_cb.p_cback(BTA_PAN_OPEN_EVT, (tBTA_PAN *)&data); 460e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 461e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 462e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 463e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 464e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 465e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 466e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 467e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_pan_close 468e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4698e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** Description 4708e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 4718e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 472e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 473e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 474e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 475e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 476e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_pan_api_close (tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data) 477e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 478e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_PAN_CONN * p_buf; 479e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 480e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach PAN_Disconnect (p_scb->handle); 481e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 482e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 483e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* send an event to BTA so that application will get the connection 484e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach close event */ 485e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_buf = (tBTA_PAN_CONN *) GKI_getbuf(sizeof(tBTA_PAN_CONN))) != NULL) 486e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 487e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->hdr.event = BTA_PAN_CONN_CLOSE_EVT; 488e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 489e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->hdr.layer_specific = p_scb->handle; 490e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_buf); 491e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 492e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 493e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 494e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 495e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 496e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 497e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 498e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_pan_conn_open 499e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 500e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description process connection open event 5018e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 502e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 503e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 504e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 505e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_pan_conn_open(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data) 506e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 507e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 508e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_PAN_OPEN data; 509e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 510e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bdcpy(data.bd_addr, p_scb->bd_addr); 511e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data.handle = p_scb->handle; 512e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data.local_role = p_scb->local_role; 513e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data.peer_role = p_scb->peer_role; 514e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 515e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_data->conn.result == PAN_SUCCESS) 516e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 517e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data.status = BTA_PAN_SUCCESS; 518e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_co_open(p_scb->handle, p_scb->app_id, p_scb->local_role, p_scb->peer_role, p_scb->bd_addr); 519e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 520e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 521e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 522e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 523e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_scb_dealloc(p_scb); 524e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data.status = BTA_PAN_FAIL; 525e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 526e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 527e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_scb->pan_flow_enable = TRUE; 528e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_scb->app_flow_enable = TRUE; 529e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 530e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_conn_open( BTA_ID_PAN ,p_scb->app_id, p_scb->bd_addr); 531e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 532e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_cb.p_cback(BTA_PAN_OPEN_EVT, (tBTA_PAN *)&data); 533e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 534e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 535e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 536e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 537e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 538e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 539e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_pan_conn_close 540e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 541e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description process connection close event 5428e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 5438e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 544e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 545e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 546e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 547e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 548e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_pan_conn_close(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data) 549e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 550e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 551e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTA_PAN_CLOSE data; 552e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BT_HDR *p_buf; 553e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 554e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach data.handle = p_data->hdr.layer_specific; 555e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 556e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 557e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_conn_close( BTA_ID_PAN ,p_scb->app_id, p_scb->bd_addr); 558e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 559e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* free all queued up data buffers */ 560e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach while((p_buf = (BT_HDR *)GKI_dequeue(&p_scb->data_queue)) != NULL) 561e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf(p_buf); 562e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 563e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_init_q(&p_scb->data_queue); 564e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 565e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_co_close(p_scb->handle, p_scb->app_id); 566e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 567e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_scb_dealloc(p_scb); 568e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 569e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_cb.p_cback(BTA_PAN_CLOSE_EVT, (tBTA_PAN *)&data); 570e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 571e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 572e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 573e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 574e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 575e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 576e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 577e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 578e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_pan_rx_path 579e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 580e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Handle data on the RX path (data sent from the phone to 581e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BTA). 5828e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 583e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 584e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 585e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 586e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 587e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_pan_rx_path(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data) 588e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 589e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if data path configured for rx pull */ 590e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((bta_pan_cb.flow_mask & BTA_PAN_RX_MASK) == BTA_PAN_RX_PULL) 591e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 592e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if we can accept data */ 593e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_scb->pan_flow_enable == TRUE) 594e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 595e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* call application callout function for rx path */ 596e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_co_rx_path(p_scb->handle, p_scb->app_id); 597e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 598e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 599e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* else data path configured for rx push */ 600e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 601e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 6028e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy 6038e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy } 604e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 605e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 606e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 607e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 608e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_pan_tx_path 609e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 610e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Handle the TX data path (data sent from BTA to the phone). 6118e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 612e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 613e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 614e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 615e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 616e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_pan_tx_path(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data) 617e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 6188e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy 619e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BT_HDR * p_buf; 620e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if data path configured for tx pull */ 621e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((bta_pan_cb.flow_mask & BTA_PAN_TX_MASK) == BTA_PAN_TX_PULL) 622e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 623e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* call application callout function for tx path */ 624e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_co_tx_path(p_scb->handle, p_scb->app_id); 625e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 626e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* free data that exceeds queue level */ 627e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach while(p_scb->data_queue.count > bta_pan_cb.q_level) 628e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf(GKI_dequeue(&p_scb->data_queue)); 629e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 630e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if configured for zero copy push */ 631e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if ((bta_pan_cb.flow_mask & BTA_PAN_TX_MASK) == BTA_PAN_TX_PUSH_BUF) 632e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 633e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if app can accept data */ 634e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_scb->app_flow_enable == TRUE) 635e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 636e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* read data from the queue */ 637e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_buf = (BT_HDR *)GKI_dequeue(&p_scb->data_queue)) != NULL) 638e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 639e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* send data to application */ 640e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_pan_co_tx_writebuf(p_scb->handle, 641e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_scb->app_id, 642e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ((tBTA_PAN_DATA_PARAMS *)p_buf)->src, 643e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ((tBTA_PAN_DATA_PARAMS *)p_buf)->dst, 644e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ((tBTA_PAN_DATA_PARAMS *)p_buf)->protocol, 645e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf, 646e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ((tBTA_PAN_DATA_PARAMS *)p_buf)->ext, 647e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ((tBTA_PAN_DATA_PARAMS *)p_buf)->forward); 648e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 649e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 650e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* free data that exceeds queue level */ 651e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach while(p_scb->data_queue.count > bta_pan_cb.q_level) 652e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf(GKI_dequeue(&p_scb->data_queue)); 653e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 654e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if there is more data to be passed to 655e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach upper layer */ 656e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_scb->data_queue.count) 657e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 658e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) 659e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 660e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->layer_specific = p_scb->handle; 661e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_buf->event = BTA_PAN_RX_FROM_BNEP_READY_EVT; 662e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach bta_sys_sendmsg(p_buf); 663e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 664e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 665e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 666e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 667e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 668e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 669e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 670e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 671e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 672e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 673e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_pan_tx_flow 674e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 675e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Set the application flow control state. 6768e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 677e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 678e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 679e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 680e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 681e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_pan_tx_flow(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data) 682e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 683e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_scb->app_flow_enable = p_data->ci_tx_flow.enable; 684e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 685e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 686e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 687e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 688e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_pan_write_buf 689e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 690e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Handle a bta_pan_ci_rx_writebuf() and send data to PAN. 6918e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 692e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 693e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 694e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 695e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 696e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_pan_write_buf(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data) 697e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 698e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((bta_pan_cb.flow_mask & BTA_PAN_RX_MASK) == BTA_PAN_RX_PUSH_BUF) 699e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 700e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 701e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach PAN_WriteBuf (p_scb->handle, 702e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ((tBTA_PAN_DATA_PARAMS *)p_data)->dst, 703e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ((tBTA_PAN_DATA_PARAMS *)p_data)->src, 704e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ((tBTA_PAN_DATA_PARAMS *)p_data)->protocol, 705e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (BT_HDR *)p_data, 706e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ((tBTA_PAN_DATA_PARAMS *)p_data)->ext); 707e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 708e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 709e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 710e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 711e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 712e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 713e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function bta_pan_free_buf 714e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 715e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Frees the data buffer during closing state 7168e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy** 717e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 718e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 719e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 720e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 721e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bta_pan_free_buf(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data) 722e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 723e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 724e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach GKI_freebuf(p_data); 725e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 726e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 727e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 728e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif /* PAN_INCLUDED */ 729