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