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"
31258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "pan_api.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_pan_api.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_pan_int.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_pan_co.h"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
375cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "utl.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* RX and TX data flow mask */
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_PAN_RX_MASK              0x0F
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_PAN_TX_MASK              0xF0
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4536f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
4636f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure ** Function    bta_pan_pm_conn_busy
4736f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
4836f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure ** Description set pan pm connection busy state
4936f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
5036f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure ** Params      p_scb: state machine control block of pan connection
5136f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
5236f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure ** Returns     void
5336f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
5436f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure *******************************************************************************/
5536f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpurestatic void bta_pan_pm_conn_busy(tBTA_PAN_SCB *p_scb)
5636f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure{
5736f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure    if ((p_scb != NULL) && (p_scb->state != BTA_PAN_IDLE_ST))
5836f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure        bta_sys_busy(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr);
5936f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure}
6036f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure
6136f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure/*******************************************************************************
6236f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
6336f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure ** Function    bta_pan_pm_conn_idle
6436f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
6536f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure ** Description set pan pm connection idle state
6636f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
6736f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure ** Params      p_scb: state machine control block of pan connection
6836f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
6936f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure ** Returns     void
7036f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure **
7136f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure *******************************************************************************/
7236f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpurestatic void bta_pan_pm_conn_idle(tBTA_PAN_SCB *p_scb)
7336f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure{
7436f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure    if ((p_scb != NULL) && (p_scb->state != BTA_PAN_IDLE_ST))
7536f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure        bta_sys_idle(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr);
7636f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure}
7736f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure
7836f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure/*******************************************************************************
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_conn_state_cback
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Connection state callback from Pan profile
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_pan_conn_state_cback(UINT16 handle, BD_ADDR bd_addr, tPAN_RESULT state,
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     BOOLEAN is_role_change, UINT8 src_role, UINT8 dst_role)
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
915fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    tBTA_PAN_SCB *p_scb;
925fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    tBTA_PAN_CONN *p_buf = (tBTA_PAN_CONN *)osi_malloc(sizeof(tBTA_PAN_CONN));
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
945fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    if ((state == PAN_SUCCESS) && !is_role_change) {
955fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_buf->hdr.event = BTA_PAN_CONN_OPEN_EVT;
965fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        if ((p_scb = bta_pan_scb_by_handle(handle)) == NULL) {
975fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov            /* allocate an scb */
985fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov            p_scb = bta_pan_scb_alloc();
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1005fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        /* we have exceeded maximum number of connections */
1015fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        if (!p_scb) {
1025fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov            PAN_Disconnect (handle);
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1065fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_scb->handle = handle;
1075fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_scb->local_role = src_role;
1085fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_scb->peer_role = dst_role;
1095fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_scb->pan_flow_enable = TRUE;
1105fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        bdcpy(p_scb->bd_addr, bd_addr);
1115fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_scb->data_queue = fixed_queue_new(SIZE_MAX);
1125fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov
1135fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        if (src_role == PAN_ROLE_CLIENT)
1145fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov            p_scb->app_id = bta_pan_cb.app_id[0];
1155fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        else if (src_role == PAN_ROLE_GN_SERVER)
1165fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov            p_scb->app_id = bta_pan_cb.app_id[1];
1175fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        else if (src_role == PAN_ROLE_NAP_SERVER)
1185fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov            p_scb->app_id = bta_pan_cb.app_id[2];
1195fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    }
1205fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    else if ((state != PAN_SUCCESS) && !is_role_change) {
1215fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_buf->hdr.event = BTA_PAN_CONN_CLOSE_EVT;
1225fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    } else {
1235fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        return;
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1265fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_buf->result = state;
1275fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_buf->hdr.layer_specific = handle;
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1295fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    bta_sys_sendmsg(p_buf);
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_data_flow_cb
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Data flow status callback from PAN
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_pan_data_flow_cb(UINT16 handle, tPAN_RESULT result)
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_SCB *p_scb;
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1465fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    if ((p_scb = bta_pan_scb_by_handle(handle)) == NULL)
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1495fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    if (result == PAN_TX_FLOW_ON) {
1505fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        BT_HDR *p_buf = (BT_HDR *) osi_malloc(sizeof(BT_HDR));
1515fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_buf->layer_specific = handle;
1525fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_buf->event = BTA_PAN_BNEP_FLOW_ENABLE_EVT;
1535fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        bta_sys_sendmsg(p_buf);
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_pan_co_rx_flow(handle, p_scb->app_id, TRUE);
1555fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    } else if (result == PAN_TX_FLOW_OFF) {
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->pan_flow_enable = FALSE;
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_pan_co_rx_flow(handle, p_scb->app_id, FALSE);
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_data_buf_ind_cback
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      data indication callback from pan profile
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1715738f83aeb59361a0a2eda2460113f6dc919427The 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,
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                   BOOLEAN ext, BOOLEAN forward)
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_SCB *p_scb;
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_new_buf;
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1775fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    if (sizeof(tBTA_PAN_DATA_PARAMS) > p_buf->offset) {
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* offset smaller than data structure in front of actual data */
179abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov        p_new_buf = (BT_HDR *)osi_malloc(PAN_BUF_SIZE);
1805fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        memcpy((UINT8 *)(p_new_buf + 1) + sizeof(tBTA_PAN_DATA_PARAMS),
1815fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov               (UINT8 *)(p_buf + 1) + p_buf->offset, p_buf->len);
1825fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_new_buf->len    = p_buf->len;
1835fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_new_buf->offset = sizeof(tBTA_PAN_DATA_PARAMS);
1845fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        osi_free(p_buf);
1855fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    } else {
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_new_buf = p_buf;
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* copy params into the space before the data */
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(((tBTA_PAN_DATA_PARAMS *)p_new_buf)->src, src);
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(((tBTA_PAN_DATA_PARAMS *)p_new_buf)->dst, dst);
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ((tBTA_PAN_DATA_PARAMS *)p_new_buf)->protocol = protocol;
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ((tBTA_PAN_DATA_PARAMS *)p_new_buf)->ext = ext;
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ((tBTA_PAN_DATA_PARAMS *)p_new_buf)->forward = forward;
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1955fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    if ((p_scb = bta_pan_scb_by_handle(handle)) == NULL) {
196abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov        osi_free(p_new_buf);
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2001a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov    fixed_queue_enqueue(p_scb->data_queue, p_new_buf);
2015fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    BT_HDR *p_event = (BT_HDR *)osi_malloc(sizeof(BT_HDR));
2025fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_event->layer_specific = handle;
2035fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_event->event = BTA_PAN_RX_FROM_BNEP_READY_EVT;
2045fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    bta_sys_sendmsg(p_event);
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_pfilt_ind_cback
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_pan_pfilt_ind_cback(UINT16 handle, BOOLEAN indication,tBNEP_RESULT result,
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    UINT16 num_filters, UINT8 *p_filters)
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_co_pfilt_ind(handle, indication, (tBTA_PAN_STATUS)((result == BNEP_SUCCESS) ? BTA_PAN_SUCCESS : BTA_PAN_FAIL),
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    num_filters, p_filters);
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_mfilt_ind_cback
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_pan_mfilt_ind_cback(UINT16 handle, BOOLEAN indication,tBNEP_RESULT result,
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    UINT16 num_mfilters, UINT8 *p_mfilters)
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_co_mfilt_ind(handle, indication, (tBTA_PAN_STATUS)((result == BNEP_SUCCESS) ? BTA_PAN_SUCCESS : BTA_PAN_FAIL),
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    num_mfilters, p_mfilters);
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2506b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney** Function         bta_pan_has_multiple_connections
2516b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney**
2526b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney** Description      Check whether there are multiple GN/NAP connections to
2536b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney**                  different devices
2546b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney**
2556b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney**
2566b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney** Returns          BOOLEAN
2576b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney**
2586b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney*******************************************************************************/
2596b24485cec18ea111b05bc23f61d9c3f6a6b8747tturneystatic BOOLEAN bta_pan_has_multiple_connections(UINT8 app_id)
2606b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney{
2616b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    tBTA_PAN_SCB *p_scb = NULL;
2626b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    BOOLEAN     found = FALSE;
2636b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    BD_ADDR     bd_addr;
2646b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney
2656b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    for (UINT8 index = 0; index < BTA_PAN_NUM_CONN; index++)
2666b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    {
2676b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney        p_scb = &bta_pan_cb.scb[index];
2686b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney        if (p_scb->in_use == TRUE && app_id == p_scb->app_id)
2696b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney        {
2706b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney            /* save temp bd_addr */
2716b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney            bdcpy(bd_addr, p_scb->bd_addr);
2726b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney            found = TRUE;
2736b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney            break;
2746b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney        }
2756b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    }
2766b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney
2776b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    /* If cannot find a match then there is no connection at all */
2786b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    if (found == FALSE)
2796b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney        return FALSE;
2806b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney
2816b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    /* Find whether there is another connection with different device other than PANU.
2826b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney        Could be same service or different service */
2836b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    for (UINT8 index = 0; index < BTA_PAN_NUM_CONN; index++)
2846b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    {
2856b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney        p_scb = &bta_pan_cb.scb[index];
2866b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney        if (p_scb->in_use == TRUE && p_scb->app_id != bta_pan_cb.app_id[0] &&
2876b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney                bdcmp(bd_addr, p_scb->bd_addr))
2886b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney        {
2896b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney            return TRUE;
2906b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney        }
2916b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    }
2926b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    return FALSE;
2936b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney}
2946b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney
2956b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney/*******************************************************************************
2966b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney**
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_enable
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_enable(tBTA_PAN_DATA *p_data)
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tPAN_REGISTER reg_data;
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  initial_discoverability;
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  initial_connectability;
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  d_window;
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  d_interval;
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  c_window;
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  c_interval;
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.p_cback = p_data->api_enable.p_cback;
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_data.pan_conn_state_cb  = bta_pan_conn_state_cback;
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_data.pan_bridge_req_cb  = NULL;
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_data.pan_data_buf_ind_cb = bta_pan_data_buf_ind_cback;
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_data.pan_data_ind_cb = NULL;
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_data.pan_pfilt_ind_cb = bta_pan_pfilt_ind_cback;
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_data.pan_mfilt_ind_cb = bta_pan_mfilt_ind_cback;
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_data.pan_tx_data_flow_cb = bta_pan_data_flow_cb;
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* read connectability and discoverability settings.
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    Pan profile changes the settings. We have to change it back to
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    be consistent with other bta subsystems */
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    initial_connectability = BTM_ReadConnectability(&c_window, &c_interval);
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    initial_discoverability = BTM_ReadDiscoverability(&d_window, &d_interval);
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    PAN_Register (&reg_data);
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set it back to original value */
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SetDiscoverability(initial_discoverability, d_window, d_interval);
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SetConnectability(initial_connectability, c_window, c_interval);
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.flow_mask = bta_pan_co_init(&bta_pan_cb.q_level);
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.p_cback(BTA_PAN_ENABLE_EVT, NULL);
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_set_role
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_set_role(tBTA_PAN_DATA *p_data)
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tPAN_RESULT status;
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_SET_ROLE set_role;
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8  sec[3];
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.app_id[0] = p_data->api_set_role.user_app_id;
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.app_id[1] = p_data->api_set_role.gn_app_id;
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.app_id[2] = p_data->api_set_role.nap_app_id;
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sec[0] = p_data->api_set_role.user_sec_mask;
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sec[1] = p_data->api_set_role.gn_sec_mask;
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sec[2] = p_data->api_set_role.nap_sec_mask;
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set security correctly in api and here */
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = PAN_SetRole(p_data->api_set_role.role, sec,
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     p_data->api_set_role.user_name,
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     p_data->api_set_role.gn_name,
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     p_data->api_set_role.nap_name);
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    set_role.role = p_data->api_set_role.role;
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(status == PAN_SUCCESS)
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_data->api_set_role.role & PAN_ROLE_NAP_SERVER )
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_add_uuid(UUID_SERVCLASS_NAP);
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_remove_uuid(UUID_SERVCLASS_NAP);
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_data->api_set_role.role & PAN_ROLE_GN_SERVER )
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_add_uuid(UUID_SERVCLASS_GN);
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_remove_uuid(UUID_SERVCLASS_GN);
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_data->api_set_role.role & PAN_ROLE_CLIENT )
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_add_uuid(UUID_SERVCLASS_PANU);
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_remove_uuid(UUID_SERVCLASS_PANU);
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        set_role.status = BTA_PAN_SUCCESS;
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if status is not success clear everything */
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PAN_SetRole(0, 0, NULL, NULL, NULL);
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_remove_uuid(UUID_SERVCLASS_NAP);
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_remove_uuid(UUID_SERVCLASS_GN);
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_remove_uuid(UUID_SERVCLASS_PANU);
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        set_role.status = BTA_PAN_FAIL;
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.p_cback(BTA_PAN_SET_ROLE_EVT, (tBTA_PAN *)&set_role);
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
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** Function         bta_pan_disable
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_disable(void)
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_SCB *p_scb = &bta_pan_cb.scb[0];
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i;
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* close all connections */
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    PAN_SetRole (0, NULL, NULL, NULL, NULL);
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4311e61ce1ae3fe8ef72443b30907f1cf8acae39674Chris Manton#if (BTA_EIR_CANNED_UUID_LIST != TRUE)
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_remove_uuid(UUID_SERVCLASS_NAP);
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_remove_uuid(UUID_SERVCLASS_GN);
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_remove_uuid(UUID_SERVCLASS_PANU);
4351e61ce1ae3fe8ef72443b30907f1cf8acae39674Chris Manton#endif // BTA_EIR_CANNED_UUID_LIST
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* free all queued up data buffers */
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTA_PAN_NUM_CONN; i++, p_scb++)
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_scb->in_use)
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4411a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov            while ((p_buf = (BT_HDR *)fixed_queue_try_dequeue(p_scb->data_queue)) != NULL)
442abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov                osi_free(p_buf);
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_pan_co_close(p_scb->handle, p_scb->app_id);
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
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    PAN_Deregister();
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_open
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_open(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data)
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tPAN_RESULT status;
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_OPEN data;
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_OPENING    opening;
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4715738f83aeb59361a0a2eda2460113f6dc919427The 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,
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        &p_scb->handle);
473e85eb5a7c3ea7eaca09cbb33920435d809b4dd3dNitin Shivpure    APPL_TRACE_DEBUG("%s pan connect status: %d", __func__, status);
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(status == PAN_SUCCESS)
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(p_scb->bd_addr, p_data->api_open.bd_addr);
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->local_role = p_data->api_open.local_role;
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->peer_role = p_data->api_open.peer_role;
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(opening.bd_addr, p_data->api_open.bd_addr);
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        opening.handle = p_scb->handle;
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_pan_cb.p_cback(BTA_PAN_OPENING_EVT, (tBTA_PAN *)&opening);
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_pan_scb_dealloc(p_scb);
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(data.bd_addr, p_data->api_open.bd_addr);
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        data.status = BTA_PAN_FAIL;
49284c63f1c985a30173fdf419167a3b85ba77a6d5bSharvil Nanavati        data.local_role = p_data->api_open.local_role;
49384c63f1c985a30173fdf419167a3b85ba77a6d5bSharvil Nanavati        data.peer_role = p_data->api_open.peer_role;
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_pan_cb.p_cback(BTA_PAN_OPEN_EVT, (tBTA_PAN *)&data);
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
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** Function         bta_pan_close
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_api_close (tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data)
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5135fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    tBTA_PAN_CONN *p_buf = (tBTA_PAN_CONN *)osi_malloc(sizeof(tBTA_PAN_CONN));
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5155fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    UNUSED(p_data);
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5175fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    PAN_Disconnect(p_scb->handle);
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5195fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    /*
5205fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov     * Send an event to BTA so that application will get the connection
5215fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov     * close event.
5225fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov     */
5235fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_buf->hdr.event = BTA_PAN_CONN_CLOSE_EVT;
5245fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_buf->hdr.layer_specific = p_scb->handle;
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5265fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    bta_sys_sendmsg(p_buf);
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_conn_open
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      process connection open event
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_conn_open(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data)
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_OPEN data;
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
543e85eb5a7c3ea7eaca09cbb33920435d809b4dd3dNitin Shivpure    APPL_TRACE_DEBUG("%s pan connection result: %d", __func__, p_data->conn.result);
544e85eb5a7c3ea7eaca09cbb33920435d809b4dd3dNitin Shivpure
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdcpy(data.bd_addr, p_scb->bd_addr);
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    data.handle = p_scb->handle;
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    data.local_role = p_scb->local_role;
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    data.peer_role = p_scb->peer_role;
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_data->conn.result == PAN_SUCCESS)
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        data.status = BTA_PAN_SUCCESS;
553e85eb5a7c3ea7eaca09cbb33920435d809b4dd3dNitin Shivpure        p_scb->pan_flow_enable = TRUE;
554e85eb5a7c3ea7eaca09cbb33920435d809b4dd3dNitin Shivpure        p_scb->app_flow_enable = TRUE;
555e85eb5a7c3ea7eaca09cbb33920435d809b4dd3dNitin Shivpure        bta_sys_conn_open(BTA_ID_PAN ,p_scb->app_id, p_scb->bd_addr);
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_pan_scb_dealloc(p_scb);
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        data.status = BTA_PAN_FAIL;
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5636b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    p_scb->pan_flow_enable = TRUE;
5646b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    p_scb->app_flow_enable = TRUE;
5656b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney
5666b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    /* If app_id is NAP/GN, check whether there are multiple connections.
5676b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney       If there are, provide a special app_id to dm to enforce master role only. */
5686b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    if ((p_scb->app_id == bta_pan_cb.app_id[1] || p_scb->app_id == bta_pan_cb.app_id[2]) &&
5696b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney            bta_pan_has_multiple_connections(p_scb->app_id))
5706b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    {
5716b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney        p_scb->app_id = BTA_APP_ID_PAN_MULTI;
5726b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    }
5736b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney
5746b24485cec18ea111b05bc23f61d9c3f6a6b8747tturney    bta_sys_conn_open(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr);
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.p_cback(BTA_PAN_OPEN_EVT, (tBTA_PAN *)&data);
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_conn_close
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      process connection close event
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_conn_close(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data)
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_CLOSE data;
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    data.handle = p_data->hdr.layer_specific;
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_conn_close( BTA_ID_PAN ,p_scb->app_id, p_scb->bd_addr);
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* free all queued up data buffers */
6021a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov    while ((p_buf = (BT_HDR *)fixed_queue_try_dequeue(p_scb->data_queue)) != NULL)
603abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov        osi_free(p_buf);
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_scb_dealloc(p_scb);
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.p_cback(BTA_PAN_CLOSE_EVT, (tBTA_PAN *)&data);
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**
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_rx_path
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Handle data on the RX path (data sent from the phone to
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTA).
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_rx_path(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data)
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6275cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
6285cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if data path configured for rx pull */
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((bta_pan_cb.flow_mask & BTA_PAN_RX_MASK) == BTA_PAN_RX_PULL)
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if we can accept data */
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_scb->pan_flow_enable == TRUE)
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* call application callout function for rx path */
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_pan_co_rx_path(p_scb->handle, p_scb->app_id);
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* else data path configured for rx push */
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
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**
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_tx_path
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Handle the TX data path (data sent from BTA to the phone).
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_tx_path(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data)
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
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 */
6681a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        while (fixed_queue_length(p_scb->data_queue) > bta_pan_cb.q_level)
669abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov            osi_free(fixed_queue_try_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        {
6785fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov            BT_HDR *p_buf;
6795fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* read data from the queue */
6811a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov            if ((p_buf = (BT_HDR *)fixed_queue_try_dequeue(p_scb->data_queue)) != NULL)
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* send data to application */
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_pan_co_tx_writebuf(p_scb->handle,
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        p_scb->app_id,
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        ((tBTA_PAN_DATA_PARAMS *)p_buf)->src,
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        ((tBTA_PAN_DATA_PARAMS *)p_buf)->dst,
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        ((tBTA_PAN_DATA_PARAMS *)p_buf)->protocol,
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        p_buf,
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        ((tBTA_PAN_DATA_PARAMS *)p_buf)->ext,
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        ((tBTA_PAN_DATA_PARAMS *)p_buf)->forward);
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* free data that exceeds queue level  */
6951a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov            while (fixed_queue_length(p_scb->data_queue) > bta_pan_cb.q_level)
696abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov                osi_free(fixed_queue_try_dequeue(p_scb->data_queue));
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if there is more data to be passed to
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            upper layer */
7001a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov            if (!fixed_queue_is_empty(p_scb->data_queue))
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
7025fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov                p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR));
7035fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov                p_buf->layer_specific = p_scb->handle;
7045fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov                p_buf->event = BTA_PAN_RX_FROM_BNEP_READY_EVT;
7055fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov                bta_sys_sendmsg(p_buf);
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** Function         bta_pan_tx_flow
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Set the application flow control state.
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_tx_flow(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data)
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_scb->app_flow_enable = p_data->ci_tx_flow.enable;
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_write_buf
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Handle a bta_pan_ci_rx_writebuf() and send data to PAN.
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_write_buf(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data)
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((bta_pan_cb.flow_mask & BTA_PAN_RX_MASK) == BTA_PAN_RX_PUSH_BUF)
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
74036f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure        bta_pan_pm_conn_busy(p_scb);
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PAN_WriteBuf (p_scb->handle,
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      ((tBTA_PAN_DATA_PARAMS *)p_data)->dst,
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      ((tBTA_PAN_DATA_PARAMS *)p_data)->src,
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      ((tBTA_PAN_DATA_PARAMS *)p_data)->protocol,
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (BT_HDR *)p_data,
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      ((tBTA_PAN_DATA_PARAMS *)p_data)->ext);
74836f43cc4b0ce38007c29d573f251ec594d95b180Nitin Shivpure        bta_pan_pm_conn_idle(p_scb);
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
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** Function         bta_pan_free_buf
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Frees the data buffer during closing state
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_free_buf(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data)
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7655cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_scb);
766abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    osi_free(p_data);
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* PAN_INCLUDED */
770