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 main functions and 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(BTA_PAN_INCLUDED) && (BTA_PAN_INCLUDED == TRUE)
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.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 "bd.h"
375cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "utl.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Constants and types
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* state machine action enumeration list */
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_PAN_API_CLOSE,
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_PAN_TX_PATH,
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_PAN_RX_PATH,
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_PAN_TX_FLOW,
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_PAN_WRITE_BUF,
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_PAN_CONN_OPEN,
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_PAN_CONN_CLOSE,
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_PAN_FREE_BUF,
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_PAN_IGNORE
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* type for action functions */
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef void (*tBTA_PAN_ACTION)(tBTA_PAN_SCB *p_scb, tBTA_PAN_DATA *p_data);
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* action function list */
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_PAN_ACTION bta_pan_action[] =
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_api_close,
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_tx_path,
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_rx_path,
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_tx_flow,
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_write_buf,
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_conn_open,
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_conn_close,
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_free_buf,
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* state table information */
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_PAN_ACTIONS              1       /* number of actions */
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_PAN_NEXT_STATE           1       /* position of next state */
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_PAN_NUM_COLS             2       /* number of columns in state tables */
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* state table for listen state */
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 bta_pan_st_idle[][BTA_PAN_NUM_COLS] =
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* API_CLOSE */          {BTA_PAN_API_CLOSE,              BTA_PAN_IDLE_ST},
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* CI_TX_READY */        {BTA_PAN_IGNORE,                 BTA_PAN_IDLE_ST},
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* CI_RX_READY */        {BTA_PAN_IGNORE,                 BTA_PAN_IDLE_ST},
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* CI_TX_FLOW */         {BTA_PAN_IGNORE,                 BTA_PAN_IDLE_ST},
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* CI_RX_WRITE */        {BTA_PAN_IGNORE,                 BTA_PAN_IDLE_ST},
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* CI_RX_WRITEBUF */     {BTA_PAN_IGNORE,                 BTA_PAN_IDLE_ST},
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* PAN_CONN_OPEN */      {BTA_PAN_CONN_OPEN,              BTA_PAN_OPEN_ST},
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* PAN_CONN_CLOSE */     {BTA_PAN_CONN_OPEN,              BTA_PAN_IDLE_ST},
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* FLOW_ENABLE */        {BTA_PAN_IGNORE,                 BTA_PAN_IDLE_ST},
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* BNEP_DATA */          {BTA_PAN_IGNORE,                 BTA_PAN_IDLE_ST}
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* state table for open state */
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 bta_pan_st_open[][BTA_PAN_NUM_COLS] =
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* API_CLOSE */          {BTA_PAN_API_CLOSE,               BTA_PAN_OPEN_ST},
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* CI_TX_READY */        {BTA_PAN_TX_PATH,                 BTA_PAN_OPEN_ST},
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* CI_RX_READY */        {BTA_PAN_RX_PATH,                 BTA_PAN_OPEN_ST},
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* CI_TX_FLOW */         {BTA_PAN_TX_FLOW,                 BTA_PAN_OPEN_ST},
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* CI_RX_WRITE */        {BTA_PAN_IGNORE,                  BTA_PAN_OPEN_ST},
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* CI_RX_WRITEBUF */     {BTA_PAN_WRITE_BUF,               BTA_PAN_OPEN_ST},
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* PAN_CONN_OPEN */      {BTA_PAN_IGNORE,                  BTA_PAN_OPEN_ST},
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* PAN_CONN_CLOSE */     {BTA_PAN_CONN_CLOSE,              BTA_PAN_IDLE_ST},
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* FLOW_ENABLE */        {BTA_PAN_RX_PATH,                 BTA_PAN_OPEN_ST},
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* BNEP_DATA */          {BTA_PAN_TX_PATH,                 BTA_PAN_OPEN_ST}
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* state table for closing state */
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 bta_pan_st_closing[][BTA_PAN_NUM_COLS] =
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* API_CLOSE */          {BTA_PAN_IGNORE,                   BTA_PAN_CLOSING_ST},
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* CI_TX_READY */        {BTA_PAN_TX_PATH,                  BTA_PAN_CLOSING_ST},
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* CI_RX_READY */        {BTA_PAN_RX_PATH,                  BTA_PAN_CLOSING_ST},
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* CI_TX_FLOW */         {BTA_PAN_TX_FLOW,                  BTA_PAN_CLOSING_ST},
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* CI_RX_WRITE */        {BTA_PAN_IGNORE,                   BTA_PAN_CLOSING_ST},
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* CI_RX_WRITEBUF */     {BTA_PAN_FREE_BUF,                 BTA_PAN_CLOSING_ST},
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* PAN_CONN_OPEN */      {BTA_PAN_IGNORE,                   BTA_PAN_CLOSING_ST},
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* PAN_CONN_CLOSE */     {BTA_PAN_CONN_CLOSE,               BTA_PAN_IDLE_ST},
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* FLOW_ENABLE */        {BTA_PAN_RX_PATH,                  BTA_PAN_CLOSING_ST},
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   /* BNEP_DATA */          {BTA_PAN_TX_PATH,                  BTA_PAN_CLOSING_ST}
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* type for state table */
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef const UINT8 (*tBTA_PAN_ST_TBL)[BTA_PAN_NUM_COLS];
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* state table */
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_PAN_ST_TBL bta_pan_st_tbl[] = {
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_st_idle,
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_st_open,
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_st_closing
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Global data
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* PAN control block */
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTA_DYNAMIC_MEMORY == FALSE
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_PAN_CB  bta_pan_cb;
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_scb_alloc
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Allocate a PAN server control block.
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to the scb, or NULL if none could be allocated.
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_PAN_SCB *bta_pan_scb_alloc(void)
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_SCB     *p_scb = &bta_pan_cb.scb[0];
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int             i;
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTA_PAN_NUM_CONN; i++, p_scb++)
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_scb->in_use)
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->in_use = TRUE;
175e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("bta_pan_scb_alloc %d", i);
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (i == BTA_PAN_NUM_CONN)
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* out of scbs */
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb = NULL;
184e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_WARNING("Out of scbs");
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_scb;
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** Function         bta_pan_sm_execute
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      State machine event handling function for PAN
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_pan_sm_execute(tBTA_PAN_SCB *p_scb, UINT16 event, tBTA_PAN_DATA *p_data)
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_ST_TBL      state_table;
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               action;
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int                 i;
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
205e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("PAN scb=%d event=0x%x state=%d", bta_pan_scb_to_idx(p_scb), event, p_scb->state);
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* look up the state table for the current state */
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    state_table = bta_pan_st_tbl[p_scb->state];
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    event &= 0x00FF;
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set next state */
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_scb->state = state_table[event][BTA_PAN_NEXT_STATE];
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* execute action functions */
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTA_PAN_ACTIONS; i++)
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((action = state_table[event][i]) != BTA_PAN_IGNORE)
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*bta_pan_action[action])(p_scb, p_data);
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
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**
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_api_enable
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Handle an API enable event.
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_pan_api_enable(tBTA_PAN_DATA *p_data)
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* initialize control block */
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&bta_pan_cb, 0, sizeof(bta_pan_cb));
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* store callback function */
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_cb.p_cback = p_data->api_enable.p_cback;
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_enable(p_data);
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_api_disable
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Handle an API disable event.
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_pan_api_disable(tBTA_PAN_DATA *p_data)
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2615cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
2625cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_pan_disable();
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_api_open
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Handle an API listen event.
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_pan_api_open(tBTA_PAN_DATA *p_data)
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_SCB     *p_scb;
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_OPEN data;
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* allocate an scb */
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_scb = bta_pan_scb_alloc()) != NULL)
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_pan_open(p_scb, p_data);
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(data.bd_addr, p_data->api_open.bd_addr);
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        data.status = BTA_PAN_FAIL;
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_pan_cb.p_cback(BTA_PAN_OPEN_EVT, (tBTA_PAN *)&data);
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
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** Function         bta_pan_scb_dealloc
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Deallocate a link control block.
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_pan_scb_dealloc(tBTA_PAN_SCB *p_scb)
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
307e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("bta_pan_scb_dealloc %d", bta_pan_scb_to_idx(p_scb));
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(p_scb, 0, sizeof(tBTA_PAN_SCB));
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_scb_to_idx
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Given a pointer to an scb, return its index.
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Index of scb.
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 bta_pan_scb_to_idx(tBTA_PAN_SCB *p_scb)
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ((UINT8) (p_scb - bta_pan_cb.scb)) + 1;
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_scb_by_handle
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Find scb associated with handle.
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to scb or NULL if not found.
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_PAN_SCB *bta_pan_scb_by_handle(UINT16 handle)
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_SCB     *p_scb = &bta_pan_cb.scb[0];
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i;
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTA_PAN_NUM_CONN; i++, p_scb++)
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_scb->handle == handle)
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return p_scb;;
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
353e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_WARNING("No scb for handle %d", handle);
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return NULL;
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_pan_hdl_event
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Data gateway main event handling function.
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_pan_hdl_event(BT_HDR *p_msg)
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_PAN_SCB *p_scb;
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN     freebuf = TRUE;
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_msg->event)
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* handle enable event */
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_PAN_API_ENABLE_EVT:
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_pan_api_enable((tBTA_PAN_DATA *) p_msg);
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* handle disable event */
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_PAN_API_DISABLE_EVT:
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_pan_api_disable((tBTA_PAN_DATA *) p_msg);
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* handle set role event */
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_PAN_API_SET_ROLE_EVT:
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_pan_set_role((tBTA_PAN_DATA *) p_msg);
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* handle open event */
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_PAN_API_OPEN_EVT:
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_pan_api_open((tBTA_PAN_DATA *) p_msg);
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* events that require buffer not be released */
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_PAN_CI_RX_WRITEBUF_EVT:
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            freebuf = FALSE;
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_scb = bta_pan_scb_by_handle(p_msg->layer_specific)) != NULL)
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_pan_sm_execute(p_scb, p_msg->event, (tBTA_PAN_DATA *) p_msg);
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* all other events */
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_scb = bta_pan_scb_by_handle(p_msg->layer_specific)) != NULL)
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_pan_sm_execute(p_scb, p_msg->event, (tBTA_PAN_DATA *) p_msg);
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return freebuf;
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_PAN_INCLUDED */
417