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
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(PAN_INCLUDED) && (PAN_INCLUDED == TRUE)
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bd.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "pan_api.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_pan_api.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_pan_int.h"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_pan_co.h"
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
385cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "utl.h"
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* RX and TX data flow mask */
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_PAN_RX_MASK              0x0F
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_PAN_TX_MASK              0xF0
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4636f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
4736f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure ** Function    bta_pan_pm_conn_busy
4836f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
4936f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure ** Description set pan pm connection busy state
5036f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
5136f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure ** Params      p_scb: state machine control block of pan connection
5236f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
5336f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure ** Returns     void
5436f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
5536f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure *******************************************************************************/
5636f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpurestatic void bta_pan_pm_conn_busy(tBTA_PAN_SCB *p_scb)
5736f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure{
5836f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure    if ((p_scb != NULL) && (p_scb->state != BTA_PAN_IDLE_ST))
5936f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure        bta_sys_busy(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr);
6036f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure}
6136f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure
6236f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure/*******************************************************************************
6336f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
6436f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure ** Function    bta_pan_pm_conn_idle
6536f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
6636f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure ** Description set pan pm connection idle state
6736f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
6836f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure ** Params      p_scb: state machine control block of pan connection
6936f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
7036f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure ** Returns     void
7136f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
7236f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure *******************************************************************************/
7336f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpurestatic void bta_pan_pm_conn_idle(tBTA_PAN_SCB *p_scb)
7436f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure{
7536f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure    if ((p_scb != NULL) && (p_scb->state != BTA_PAN_IDLE_ST))
7636f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure        bta_sys_idle(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr);
7736f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure}
7836f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure
7936f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure/*******************************************************************************
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_conn_state_cback
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Connection state callback from Pan profile
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_pan_conn_state_cback(UINT16 handle, BD_ADDR bd_addr, tPAN_RESULT state,
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     BOOLEAN is_role_change, UINT8 src_role, UINT8 dst_role)
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_CONN * p_buf;
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_SCB     *p_scb;
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (tBTA_PAN_CONN *) GKI_getbuf(sizeof(tBTA_PAN_CONN))) != NULL)
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if((state == PAN_SUCCESS) && !is_role_change)
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf->hdr.event = BTA_PAN_CONN_OPEN_EVT;
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if((p_scb = bta_pan_scb_by_handle(handle)) == NULL)
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* allocate an scb */
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb = bta_pan_scb_alloc();
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* we have exceeded maximum number of connections */
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(!p_scb)
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                PAN_Disconnect (handle);
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->handle = handle;
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->local_role = src_role;
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->peer_role = dst_role;
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->pan_flow_enable = TRUE;
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdcpy(p_scb->bd_addr, bd_addr);
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_init_q(&p_scb->data_queue);
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(src_role == PAN_ROLE_CLIENT)
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->app_id = bta_pan_cb.app_id[0];
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (src_role == PAN_ROLE_GN_SERVER)
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->app_id = bta_pan_cb.app_id[1];
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (src_role == PAN_ROLE_NAP_SERVER)
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->app_id = bta_pan_cb.app_id[2];
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if((state != PAN_SUCCESS) && !is_role_change)
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf->hdr.event = BTA_PAN_CONN_CLOSE_EVT;
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->result = state;
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->hdr.layer_specific = handle;
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(p_buf);
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_data_flow_cb
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Data flow status callback from PAN
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_pan_data_flow_cb(UINT16 handle, tPAN_RESULT result)
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR  *p_buf;
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_SCB *p_scb;
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if((p_scb = bta_pan_scb_by_handle(handle)) == NULL)
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(result == PAN_TX_FLOW_ON)
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf->layer_specific = handle;
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf->event = BTA_PAN_BNEP_FLOW_ENABLE_EVT;
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_sendmsg(p_buf);
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_pan_co_rx_flow(handle, p_scb->app_id, TRUE);
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if(result == PAN_TX_FLOW_OFF)
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->pan_flow_enable = FALSE;
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_pan_co_rx_flow(handle, p_scb->app_id, FALSE);
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_data_buf_ind_cback
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      data indication callback from pan profile
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_pan_data_buf_ind_cback(UINT16 handle, BD_ADDR src, BD_ADDR dst, UINT16 protocol, BT_HDR *p_buf,
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                   BOOLEAN ext, BOOLEAN forward)
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_SCB *p_scb;
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR * p_event;
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_new_buf;
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( sizeof(tBTA_PAN_DATA_PARAMS) > p_buf->offset )
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* offset smaller than data structure in front of actual data */
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_new_buf = (BT_HDR *)GKI_getpoolbuf( PAN_POOL_ID );
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(!p_new_buf)
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
214e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_WARNING("Cannot get a PAN GKI buffer");
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf( p_buf );
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy( (UINT8 *)(p_new_buf+1)+sizeof(tBTA_PAN_DATA_PARAMS), (UINT8 *)(p_buf+1)+p_buf->offset, p_buf->len );
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_new_buf->len    = p_buf->len;
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_new_buf->offset = sizeof(tBTA_PAN_DATA_PARAMS);
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf( p_buf );
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_new_buf = p_buf;
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* copy params into the space before the data */
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(((tBTA_PAN_DATA_PARAMS *)p_new_buf)->src, src);
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(((tBTA_PAN_DATA_PARAMS *)p_new_buf)->dst, dst);
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ((tBTA_PAN_DATA_PARAMS *)p_new_buf)->protocol = protocol;
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ((tBTA_PAN_DATA_PARAMS *)p_new_buf)->ext = ext;
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ((tBTA_PAN_DATA_PARAMS *)p_new_buf)->forward = forward;
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if((p_scb = bta_pan_scb_by_handle(handle)) == NULL)
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf( p_new_buf );
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_enqueue(&p_scb->data_queue, p_new_buf);
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_event = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_event->layer_specific = handle;
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_event->event = BTA_PAN_RX_FROM_BNEP_READY_EVT;
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(p_event);
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_pfilt_ind_cback
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_pan_pfilt_ind_cback(UINT16 handle, BOOLEAN indication,tBNEP_RESULT result,
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    UINT16 num_filters, UINT8 *p_filters)
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_co_pfilt_ind(handle, indication, (tBTA_PAN_STATUS)((result == BNEP_SUCCESS) ? BTA_PAN_SUCCESS : BTA_PAN_FAIL),
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    num_filters, p_filters);
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_mfilt_ind_cback
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_pan_mfilt_ind_cback(UINT16 handle, BOOLEAN indication,tBNEP_RESULT result,
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    UINT16 num_mfilters, UINT8 *p_mfilters)
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_co_mfilt_ind(handle, indication, (tBTA_PAN_STATUS)((result == BNEP_SUCCESS) ? BTA_PAN_SUCCESS : BTA_PAN_FAIL),
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    num_mfilters, p_mfilters);
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_enable
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_enable(tBTA_PAN_DATA *p_data)
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tPAN_REGISTER reg_data;
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  initial_discoverability;
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  initial_connectability;
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  d_window;
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  d_interval;
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  c_window;
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  c_interval;
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.p_cback = p_data->api_enable.p_cback;
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_data.pan_conn_state_cb  = bta_pan_conn_state_cback;
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_data.pan_bridge_req_cb  = NULL;
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_data.pan_data_buf_ind_cb = bta_pan_data_buf_ind_cback;
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_data.pan_data_ind_cb = NULL;
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_data.pan_pfilt_ind_cb = bta_pan_pfilt_ind_cback;
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_data.pan_mfilt_ind_cb = bta_pan_mfilt_ind_cback;
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_data.pan_tx_data_flow_cb = bta_pan_data_flow_cb;
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* read connectability and discoverability settings.
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    Pan profile changes the settings. We have to change it back to
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    be consistent with other bta subsystems */
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    initial_connectability = BTM_ReadConnectability(&c_window, &c_interval);
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    initial_discoverability = BTM_ReadDiscoverability(&d_window, &d_interval);
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    PAN_Register (&reg_data);
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set it back to original value */
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SetDiscoverability(initial_discoverability, d_window, d_interval);
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SetConnectability(initial_connectability, c_window, c_interval);
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.flow_mask = bta_pan_co_init(&bta_pan_cb.q_level);
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.p_cback(BTA_PAN_ENABLE_EVT, NULL);
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_set_role
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_set_role(tBTA_PAN_DATA *p_data)
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tPAN_RESULT status;
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_SET_ROLE set_role;
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8  sec[3];
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.app_id[0] = p_data->api_set_role.user_app_id;
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.app_id[1] = p_data->api_set_role.gn_app_id;
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.app_id[2] = p_data->api_set_role.nap_app_id;
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sec[0] = p_data->api_set_role.user_sec_mask;
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sec[1] = p_data->api_set_role.gn_sec_mask;
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sec[2] = p_data->api_set_role.nap_sec_mask;
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set security correctly in api and here */
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = PAN_SetRole(p_data->api_set_role.role, sec,
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     p_data->api_set_role.user_name,
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     p_data->api_set_role.gn_name,
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     p_data->api_set_role.nap_name);
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    set_role.role = p_data->api_set_role.role;
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(status == PAN_SUCCESS)
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_data->api_set_role.role & PAN_ROLE_NAP_SERVER )
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_add_uuid(UUID_SERVCLASS_NAP);
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_remove_uuid(UUID_SERVCLASS_NAP);
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_data->api_set_role.role & PAN_ROLE_GN_SERVER )
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_add_uuid(UUID_SERVCLASS_GN);
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_remove_uuid(UUID_SERVCLASS_GN);
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_data->api_set_role.role & PAN_ROLE_CLIENT )
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_add_uuid(UUID_SERVCLASS_PANU);
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_remove_uuid(UUID_SERVCLASS_PANU);
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        set_role.status = BTA_PAN_SUCCESS;
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if status is not success clear everything */
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PAN_SetRole(0, 0, NULL, NULL, NULL);
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_remove_uuid(UUID_SERVCLASS_NAP);
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_remove_uuid(UUID_SERVCLASS_GN);
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_remove_uuid(UUID_SERVCLASS_PANU);
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        set_role.status = BTA_PAN_FAIL;
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.p_cback(BTA_PAN_SET_ROLE_EVT, (tBTA_PAN *)&set_role);
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_disable
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_disable(void)
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_SCB *p_scb = &bta_pan_cb.scb[0];
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i;
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* close all connections */
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    PAN_SetRole (0, NULL, NULL, NULL, NULL);
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&(BTA_EIR_CANNED_UUID_LIST != TRUE)
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_remove_uuid(UUID_SERVCLASS_NAP);
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_remove_uuid(UUID_SERVCLASS_GN);
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_remove_uuid(UUID_SERVCLASS_PANU);
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* free all queued up data buffers */
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTA_PAN_NUM_CONN; i++, p_scb++)
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_scb->in_use)
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            while((p_buf = (BT_HDR *)GKI_dequeue(&p_scb->data_queue)) != NULL)
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                GKI_freebuf(p_buf);
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_pan_co_close(p_scb->handle, p_scb->app_id);
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    PAN_Deregister();
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_open
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_open(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data)
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tPAN_RESULT status;
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_OPEN data;
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_OPENING    opening;
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = PAN_Connect (p_data->api_open.bd_addr, p_data->api_open.local_role, p_data->api_open.peer_role,
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        &p_scb->handle);
475e85eb5a7c3ea7eaca09cbb33920435d809b4dd3dNitin Shivpure    APPL_TRACE_DEBUG("%s pan connect status: %d", __func__, status);
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(status == PAN_SUCCESS)
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(p_scb->bd_addr, p_data->api_open.bd_addr);
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->local_role = p_data->api_open.local_role;
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->peer_role = p_data->api_open.peer_role;
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(opening.bd_addr, p_data->api_open.bd_addr);
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        opening.handle = p_scb->handle;
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_pan_cb.p_cback(BTA_PAN_OPENING_EVT, (tBTA_PAN *)&opening);
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_pan_scb_dealloc(p_scb);
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(data.bd_addr, p_data->api_open.bd_addr);
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        data.status = BTA_PAN_FAIL;
49484c63f1c985a30173fdf419167a3b85ba77a6d5bSharvil Nanavati        data.local_role = p_data->api_open.local_role;
49584c63f1c985a30173fdf419167a3b85ba77a6d5bSharvil Nanavati        data.peer_role = p_data->api_open.peer_role;
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_pan_cb.p_cback(BTA_PAN_OPEN_EVT, (tBTA_PAN *)&data);
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_close
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_api_close (tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data)
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_CONN * p_buf;
5165cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    PAN_Disconnect (p_scb->handle);
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send an event to BTA so that application will get the connection
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       close event */
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (tBTA_PAN_CONN *) GKI_getbuf(sizeof(tBTA_PAN_CONN))) != NULL)
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->hdr.event = BTA_PAN_CONN_CLOSE_EVT;
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->hdr.layer_specific = p_scb->handle;
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_sendmsg(p_buf);
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_conn_open
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      process connection open event
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_conn_open(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data)
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_OPEN data;
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
548e85eb5a7c3ea7eaca09cbb33920435d809b4dd3dNitin Shivpure    APPL_TRACE_DEBUG("%s pan connection result: %d", __func__, p_data->conn.result);
549e85eb5a7c3ea7eaca09cbb33920435d809b4dd3dNitin Shivpure
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(data.bd_addr, p_scb->bd_addr);
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    data.handle = p_scb->handle;
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    data.local_role = p_scb->local_role;
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    data.peer_role = p_scb->peer_role;
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_data->conn.result == PAN_SUCCESS)
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        data.status = BTA_PAN_SUCCESS;
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_pan_co_open(p_scb->handle, p_scb->app_id, p_scb->local_role, p_scb->peer_role, p_scb->bd_addr);
559e85eb5a7c3ea7eaca09cbb33920435d809b4dd3dNitin Shivpure        p_scb->pan_flow_enable = TRUE;
560e85eb5a7c3ea7eaca09cbb33920435d809b4dd3dNitin Shivpure        p_scb->app_flow_enable = TRUE;
561e85eb5a7c3ea7eaca09cbb33920435d809b4dd3dNitin Shivpure        bta_sys_conn_open(BTA_ID_PAN ,p_scb->app_id, p_scb->bd_addr);
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_pan_scb_dealloc(p_scb);
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        data.status = BTA_PAN_FAIL;
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.p_cback(BTA_PAN_OPEN_EVT, (tBTA_PAN *)&data);
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_conn_close
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      process connection close event
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_conn_close(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data)
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_CLOSE data;
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    data.handle = p_data->hdr.layer_specific;
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_conn_close( BTA_ID_PAN ,p_scb->app_id, p_scb->bd_addr);
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* free all queued up data buffers */
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while((p_buf = (BT_HDR *)GKI_dequeue(&p_scb->data_queue)) != NULL)
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf(p_buf);
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_init_q(&p_scb->data_queue);
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_co_close(p_scb->handle, p_scb->app_id);
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_scb_dealloc(p_scb);
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.p_cback(BTA_PAN_CLOSE_EVT, (tBTA_PAN *)&data);
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_rx_path
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Handle data on the RX path (data sent from the phone to
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTA).
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_rx_path(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data)
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6265cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
6275cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if data path configured for rx pull */
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((bta_pan_cb.flow_mask & BTA_PAN_RX_MASK) == BTA_PAN_RX_PULL)
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if we can accept data */
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_scb->pan_flow_enable == TRUE)
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* call application callout function for rx path */
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_pan_co_rx_path(p_scb->handle, p_scb->app_id);
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* else data path configured for rx push */
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_tx_path
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Handle the TX data path (data sent from BTA to the phone).
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_tx_path(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data)
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR * p_buf;
6585cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
6595cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if data path configured for tx pull */
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((bta_pan_cb.flow_mask & BTA_PAN_TX_MASK) == BTA_PAN_TX_PULL)
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
66336f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure        bta_pan_pm_conn_busy(p_scb);
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* call application callout function for tx path */
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_pan_co_tx_path(p_scb->handle, p_scb->app_id);
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* free data that exceeds queue level */
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while(p_scb->data_queue.count > bta_pan_cb.q_level)
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf(GKI_dequeue(&p_scb->data_queue));
67036f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure        bta_pan_pm_conn_idle(p_scb);
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if configured for zero copy push */
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if ((bta_pan_cb.flow_mask & BTA_PAN_TX_MASK) == BTA_PAN_TX_PUSH_BUF)
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if app can accept data */
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_scb->app_flow_enable == TRUE)
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* read data from the queue */
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_buf = (BT_HDR *)GKI_dequeue(&p_scb->data_queue)) != NULL)
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* send data to application */
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_pan_co_tx_writebuf(p_scb->handle,
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        p_scb->app_id,
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        ((tBTA_PAN_DATA_PARAMS *)p_buf)->src,
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        ((tBTA_PAN_DATA_PARAMS *)p_buf)->dst,
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        ((tBTA_PAN_DATA_PARAMS *)p_buf)->protocol,
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        p_buf,
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        ((tBTA_PAN_DATA_PARAMS *)p_buf)->ext,
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        ((tBTA_PAN_DATA_PARAMS *)p_buf)->forward);
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* free data that exceeds queue level  */
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            while(p_scb->data_queue.count > bta_pan_cb.q_level)
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                GKI_freebuf(GKI_dequeue(&p_scb->data_queue));
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if there is more data to be passed to
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            upper layer */
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(p_scb->data_queue.count)
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_buf->layer_specific = p_scb->handle;
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_buf->event = BTA_PAN_RX_FROM_BNEP_READY_EVT;
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_sys_sendmsg(p_buf);
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_tx_flow
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Set the application flow control state.
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_tx_flow(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data)
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_scb->app_flow_enable = p_data->ci_tx_flow.enable;
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_write_buf
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Handle a bta_pan_ci_rx_writebuf() and send data to PAN.
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_write_buf(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data)
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((bta_pan_cb.flow_mask & BTA_PAN_RX_MASK) == BTA_PAN_RX_PUSH_BUF)
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
74236f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure        bta_pan_pm_conn_busy(p_scb);
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PAN_WriteBuf (p_scb->handle,
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      ((tBTA_PAN_DATA_PARAMS *)p_data)->dst,
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      ((tBTA_PAN_DATA_PARAMS *)p_data)->src,
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      ((tBTA_PAN_DATA_PARAMS *)p_data)->protocol,
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (BT_HDR *)p_data,
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      ((tBTA_PAN_DATA_PARAMS *)p_data)->ext);
75036f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure        bta_pan_pm_conn_idle(p_scb);
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_free_buf
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Frees the data buffer during closing state
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_free_buf(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data)
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7675cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_scb);
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_freebuf(p_data);
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* PAN_INCLUDED */
774