/******************************************************************************
 *
 *  Copyright (C) 2004-2012 Broadcom Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  This file contains the pan action functions for the state machine.
 *
 ******************************************************************************/

#include "bt_target.h"

#if (PAN_INCLUDED == TRUE)

#include <string.h>

#include <cutils/log.h>

#include "bt_common.h"
#include "bta_api.h"
#include "bta_pan_api.h"
#include "bta_pan_co.h"
#include "bta_pan_int.h"
#include "bta_sys.h"
#include "osi/include/osi.h"
#include "pan_api.h"
#include "utl.h"

/* RX and TX data flow mask */
#define BTA_PAN_RX_MASK 0x0F
#define BTA_PAN_TX_MASK 0xF0

/*******************************************************************************
 *
 * Function    bta_pan_pm_conn_busy
 *
 * Description set pan pm connection busy state
 *
 * Params      p_scb: state machine control block of pan connection
 *
 * Returns     void
 *
 ******************************************************************************/
static void bta_pan_pm_conn_busy(tBTA_PAN_SCB* p_scb) {
  if ((p_scb != NULL) && (p_scb->state != BTA_PAN_IDLE_ST))
    bta_sys_busy(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr);
}

/*******************************************************************************
 *
 * Function    bta_pan_pm_conn_idle
 *
 * Description set pan pm connection idle state
 *
 * Params      p_scb: state machine control block of pan connection
 *
 * Returns     void
 *
 ******************************************************************************/
static void bta_pan_pm_conn_idle(tBTA_PAN_SCB* p_scb) {
  if ((p_scb != NULL) && (p_scb->state != BTA_PAN_IDLE_ST))
    bta_sys_idle(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr);
}

/*******************************************************************************
 *
 * Function         bta_pan_conn_state_cback
 *
 * Description      Connection state callback from Pan profile
 *
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_pan_conn_state_cback(uint16_t handle, const RawAddress& bd_addr,
                                     tPAN_RESULT state, bool is_role_change,
                                     uint8_t src_role, uint8_t dst_role) {
  tBTA_PAN_SCB* p_scb;
  tBTA_PAN_CONN* p_buf = (tBTA_PAN_CONN*)osi_malloc(sizeof(tBTA_PAN_CONN));

  if ((state == PAN_SUCCESS) && !is_role_change) {
    p_buf->hdr.event = BTA_PAN_CONN_OPEN_EVT;
    p_scb = bta_pan_scb_by_handle(handle);
    if (p_scb == NULL) {
      /* allocate an scb */
      p_scb = bta_pan_scb_alloc();
    }
    /* we have exceeded maximum number of connections */
    if (!p_scb) {
      PAN_Disconnect(handle);
      return;
    }

    p_scb->handle = handle;
    p_scb->local_role = src_role;
    p_scb->peer_role = dst_role;
    p_scb->pan_flow_enable = true;
    p_scb->bd_addr = bd_addr;
    p_scb->data_queue = fixed_queue_new(SIZE_MAX);

    if (src_role == PAN_ROLE_CLIENT)
      p_scb->app_id = bta_pan_cb.app_id[0];
    else if (src_role == PAN_ROLE_GN_SERVER)
      p_scb->app_id = bta_pan_cb.app_id[1];
    else if (src_role == PAN_ROLE_NAP_SERVER)
      p_scb->app_id = bta_pan_cb.app_id[2];
  } else if ((state != PAN_SUCCESS) && !is_role_change) {
    p_buf->hdr.event = BTA_PAN_CONN_CLOSE_EVT;
  } else {
    return;
  }

  p_buf->result = state;
  p_buf->hdr.layer_specific = handle;

  bta_sys_sendmsg(p_buf);
}

/*******************************************************************************
 *
 * Function         bta_pan_data_flow_cb
 *
 * Description      Data flow status callback from PAN
 *
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_pan_data_flow_cb(uint16_t handle, tPAN_RESULT result) {
  tBTA_PAN_SCB* p_scb;

  p_scb = bta_pan_scb_by_handle(handle);
  if (p_scb == NULL) return;

  if (result == PAN_TX_FLOW_ON) {
    BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
    p_buf->layer_specific = handle;
    p_buf->event = BTA_PAN_BNEP_FLOW_ENABLE_EVT;
    bta_sys_sendmsg(p_buf);
    bta_pan_co_rx_flow(handle, p_scb->app_id, true);
  } else if (result == PAN_TX_FLOW_OFF) {
    p_scb->pan_flow_enable = false;
    bta_pan_co_rx_flow(handle, p_scb->app_id, false);
  }
}

/*******************************************************************************
 *
 * Function         bta_pan_data_buf_ind_cback
 *
 * Description      data indication callback from pan profile
 *
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_pan_data_buf_ind_cback(uint16_t handle, const RawAddress& src,
                                       const RawAddress& dst, uint16_t protocol,
                                       BT_HDR* p_buf, bool ext, bool forward) {
  tBTA_PAN_SCB* p_scb;
  BT_HDR* p_new_buf;

  p_scb = bta_pan_scb_by_handle(handle);
  if (p_scb == NULL) {
    return;
  }

  if (sizeof(tBTA_PAN_DATA_PARAMS) > p_buf->offset) {
    /* offset smaller than data structure in front of actual data */
    if (sizeof(BT_HDR) + sizeof(tBTA_PAN_DATA_PARAMS) + p_buf->len >
        PAN_BUF_SIZE) {
      android_errorWriteLog(0x534e4554, "63146237");
      APPL_TRACE_ERROR("%s: received buffer length too large: %d", __func__,
                       p_buf->len);
      return;
    }
    p_new_buf = (BT_HDR*)osi_malloc(PAN_BUF_SIZE);
    memcpy((uint8_t*)(p_new_buf + 1) + sizeof(tBTA_PAN_DATA_PARAMS),
           (uint8_t*)(p_buf + 1) + p_buf->offset, p_buf->len);
    p_new_buf->len = p_buf->len;
    p_new_buf->offset = sizeof(tBTA_PAN_DATA_PARAMS);
  } else {
    p_new_buf = p_buf;
  }
  /* copy params into the space before the data */
  ((tBTA_PAN_DATA_PARAMS*)p_new_buf)->src = src;
  ((tBTA_PAN_DATA_PARAMS*)p_new_buf)->dst = dst;
  ((tBTA_PAN_DATA_PARAMS*)p_new_buf)->protocol = protocol;
  ((tBTA_PAN_DATA_PARAMS*)p_new_buf)->ext = ext;
  ((tBTA_PAN_DATA_PARAMS*)p_new_buf)->forward = forward;

  fixed_queue_enqueue(p_scb->data_queue, p_new_buf);
  BT_HDR* p_event = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
  p_event->layer_specific = handle;
  p_event->event = BTA_PAN_RX_FROM_BNEP_READY_EVT;
  bta_sys_sendmsg(p_event);
}

/*******************************************************************************
 *
 * Function         bta_pan_pfilt_ind_cback
 *
 * Description
 *
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_pan_pfilt_ind_cback(uint16_t handle, bool indication,
                                    tBNEP_RESULT result, uint16_t num_filters,
                                    uint8_t* p_filters) {
  bta_pan_co_pfilt_ind(
      handle, indication,
      (tBTA_PAN_STATUS)((result == BNEP_SUCCESS) ? BTA_PAN_SUCCESS
                                                 : BTA_PAN_FAIL),
      num_filters, p_filters);
}

/*******************************************************************************
 *
 * Function         bta_pan_mfilt_ind_cback
 *
 * Description
 *
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_pan_mfilt_ind_cback(uint16_t handle, bool indication,
                                    tBNEP_RESULT result, uint16_t num_mfilters,
                                    uint8_t* p_mfilters) {
  bta_pan_co_mfilt_ind(
      handle, indication,
      (tBTA_PAN_STATUS)((result == BNEP_SUCCESS) ? BTA_PAN_SUCCESS
                                                 : BTA_PAN_FAIL),
      num_mfilters, p_mfilters);
}

/*******************************************************************************
 *
 * Function         bta_pan_has_multiple_connections
 *
 * Description      Check whether there are multiple GN/NAP connections to
 *                  different devices
 *
 *
 * Returns          bool
 *
 ******************************************************************************/
static bool bta_pan_has_multiple_connections(uint8_t app_id) {
  tBTA_PAN_SCB* p_scb = NULL;
  bool found = false;
  RawAddress bd_addr;

  for (uint8_t index = 0; index < BTA_PAN_NUM_CONN; index++) {
    p_scb = &bta_pan_cb.scb[index];
    if (p_scb->in_use == true && app_id == p_scb->app_id) {
      /* save temp bd_addr */
      bd_addr = p_scb->bd_addr;
      found = true;
      break;
    }
  }

  /* If cannot find a match then there is no connection at all */
  if (found == false) return false;

  /* Find whether there is another connection with different device other than
     PANU.
      Could be same service or different service */
  for (uint8_t index = 0; index < BTA_PAN_NUM_CONN; index++) {
    p_scb = &bta_pan_cb.scb[index];
    if (p_scb->in_use == true && p_scb->app_id != bta_pan_cb.app_id[0] &&
        bd_addr != p_scb->bd_addr) {
      return true;
    }
  }
  return false;
}

/*******************************************************************************
 *
 * Function         bta_pan_enable
 *
 * Description
 *
 *
 *
 * Returns          void
 *
 ******************************************************************************/
void bta_pan_enable(tBTA_PAN_DATA* p_data) {
  tPAN_REGISTER reg_data;
  uint16_t initial_discoverability;
  uint16_t initial_connectability;
  uint16_t d_window;
  uint16_t d_interval;
  uint16_t c_window;
  uint16_t c_interval;

  bta_pan_cb.p_cback = p_data->api_enable.p_cback;

  reg_data.pan_conn_state_cb = bta_pan_conn_state_cback;
  reg_data.pan_bridge_req_cb = NULL;
  reg_data.pan_data_buf_ind_cb = bta_pan_data_buf_ind_cback;
  reg_data.pan_data_ind_cb = NULL;
  reg_data.pan_pfilt_ind_cb = bta_pan_pfilt_ind_cback;
  reg_data.pan_mfilt_ind_cb = bta_pan_mfilt_ind_cback;
  reg_data.pan_tx_data_flow_cb = bta_pan_data_flow_cb;

  /* read connectability and discoverability settings.
  Pan profile changes the settings. We have to change it back to
  be consistent with other bta subsystems */
  initial_connectability = BTM_ReadConnectability(&c_window, &c_interval);
  initial_discoverability = BTM_ReadDiscoverability(&d_window, &d_interval);

  PAN_Register(&reg_data);

  /* set it back to original value */
  BTM_SetDiscoverability(initial_discoverability, d_window, d_interval);
  BTM_SetConnectability(initial_connectability, c_window, c_interval);

  bta_pan_cb.flow_mask = bta_pan_co_init(&bta_pan_cb.q_level);
  bta_pan_cb.p_cback(BTA_PAN_ENABLE_EVT, NULL);
}

/*******************************************************************************
 *
 * Function         bta_pan_set_role
 *
 * Description
 *
 * Returns          void
 *
 ******************************************************************************/
void bta_pan_set_role(tBTA_PAN_DATA* p_data) {
  tPAN_RESULT status;
  tBTA_PAN bta_pan;
  uint8_t sec[3];

  bta_pan_cb.app_id[0] = p_data->api_set_role.user_app_id;
  bta_pan_cb.app_id[1] = p_data->api_set_role.gn_app_id;
  bta_pan_cb.app_id[2] = p_data->api_set_role.nap_app_id;

  sec[0] = p_data->api_set_role.user_sec_mask;
  sec[1] = p_data->api_set_role.gn_sec_mask;
  sec[2] = p_data->api_set_role.nap_sec_mask;

  /* set security correctly in api and here */
  status = PAN_SetRole(
      p_data->api_set_role.role, sec, p_data->api_set_role.user_name,
      p_data->api_set_role.gn_name, p_data->api_set_role.nap_name);

  bta_pan.set_role.role = p_data->api_set_role.role;
  if (status == PAN_SUCCESS) {
    if (p_data->api_set_role.role & PAN_ROLE_NAP_SERVER)
      bta_sys_add_uuid(UUID_SERVCLASS_NAP);
    else
      bta_sys_remove_uuid(UUID_SERVCLASS_NAP);

    if (p_data->api_set_role.role & PAN_ROLE_GN_SERVER)
      bta_sys_add_uuid(UUID_SERVCLASS_GN);
    else
      bta_sys_remove_uuid(UUID_SERVCLASS_GN);

    if (p_data->api_set_role.role & PAN_ROLE_CLIENT)
      bta_sys_add_uuid(UUID_SERVCLASS_PANU);
    else
      bta_sys_remove_uuid(UUID_SERVCLASS_PANU);

    bta_pan.set_role.status = BTA_PAN_SUCCESS;
  }
  /* if status is not success clear everything */
  else {
    PAN_SetRole(0, 0, NULL, NULL, NULL);
    bta_sys_remove_uuid(UUID_SERVCLASS_NAP);
    bta_sys_remove_uuid(UUID_SERVCLASS_GN);
    bta_sys_remove_uuid(UUID_SERVCLASS_PANU);
    bta_pan.set_role.status = BTA_PAN_FAIL;
  }
  bta_pan_cb.p_cback(BTA_PAN_SET_ROLE_EVT, &bta_pan);
}

/*******************************************************************************
 *
 * Function         bta_pan_disable
 *
 * Description
 *
 *
 *
 * Returns          void
 *
 ******************************************************************************/
void bta_pan_disable(void) {
  BT_HDR* p_buf;
  tBTA_PAN_SCB* p_scb = &bta_pan_cb.scb[0];
  uint8_t i;

  /* close all connections */
  PAN_SetRole(0, NULL, NULL, NULL, NULL);

#if (BTA_EIR_CANNED_UUID_LIST != TRUE)
  bta_sys_remove_uuid(UUID_SERVCLASS_NAP);
  bta_sys_remove_uuid(UUID_SERVCLASS_GN);
  bta_sys_remove_uuid(UUID_SERVCLASS_PANU);
#endif  // BTA_EIR_CANNED_UUID_LIST
  /* free all queued up data buffers */
  for (i = 0; i < BTA_PAN_NUM_CONN; i++, p_scb++) {
    if (p_scb->in_use) {
      while ((p_buf = (BT_HDR*)fixed_queue_try_dequeue(p_scb->data_queue)) !=
             NULL)
        osi_free(p_buf);

      bta_pan_co_close(p_scb->handle, p_scb->app_id);
    }
  }

  PAN_Deregister();
}

/*******************************************************************************
 *
 * Function         bta_pan_open
 *
 * Description
 *
 * Returns          void
 *
 ******************************************************************************/
void bta_pan_open(tBTA_PAN_SCB* p_scb, tBTA_PAN_DATA* p_data) {
  tPAN_RESULT status;
  tBTA_PAN bta_pan;

  status = PAN_Connect(p_data->api_open.bd_addr, p_data->api_open.local_role,
                       p_data->api_open.peer_role, &p_scb->handle);
  APPL_TRACE_DEBUG("%s pan connect status: %d", __func__, status);

  if (status == PAN_SUCCESS) {
    p_scb->bd_addr = p_data->api_open.bd_addr;
    p_scb->local_role = p_data->api_open.local_role;
    p_scb->peer_role = p_data->api_open.peer_role;
    bta_pan.opening.bd_addr = p_data->api_open.bd_addr;
    bta_pan.opening.handle = p_scb->handle;
    bta_pan_cb.p_cback(BTA_PAN_OPENING_EVT, &bta_pan);

  } else {
    bta_pan_scb_dealloc(p_scb);
    bta_pan.open.bd_addr = p_data->api_open.bd_addr;
    bta_pan.open.status = BTA_PAN_FAIL;
    bta_pan.open.local_role = p_data->api_open.local_role;
    bta_pan.open.peer_role = p_data->api_open.peer_role;
    bta_pan_cb.p_cback(BTA_PAN_OPEN_EVT, &bta_pan);
  }
}

/*******************************************************************************
 *
 * Function         bta_pan_close
 *
 * Description
 *
 *
 *
 * Returns          void
 *
 ******************************************************************************/
void bta_pan_api_close(tBTA_PAN_SCB* p_scb, UNUSED_ATTR tBTA_PAN_DATA* p_data) {
  tBTA_PAN_CONN* p_buf = (tBTA_PAN_CONN*)osi_malloc(sizeof(tBTA_PAN_CONN));

  PAN_Disconnect(p_scb->handle);

  /*
   * Send an event to BTA so that application will get the connection
   * close event.
   */
  p_buf->hdr.event = BTA_PAN_CONN_CLOSE_EVT;
  p_buf->hdr.layer_specific = p_scb->handle;

  bta_sys_sendmsg(p_buf);
}

/*******************************************************************************
 *
 * Function         bta_pan_conn_open
 *
 * Description      process connection open event
 *
 * Returns          void
 *
 ******************************************************************************/
void bta_pan_conn_open(tBTA_PAN_SCB* p_scb, tBTA_PAN_DATA* p_data) {
  tBTA_PAN bta_pan;

  APPL_TRACE_DEBUG("%s pan connection result: %d", __func__,
                   p_data->conn.result);

  bta_pan.open.bd_addr = p_scb->bd_addr;
  bta_pan.open.handle = p_scb->handle;
  bta_pan.open.local_role = p_scb->local_role;
  bta_pan.open.peer_role = p_scb->peer_role;

  if (p_data->conn.result == PAN_SUCCESS) {
    bta_pan.open.status = BTA_PAN_SUCCESS;
    p_scb->pan_flow_enable = true;
    p_scb->app_flow_enable = true;
    bta_sys_conn_open(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr);
  } else {
    bta_pan_scb_dealloc(p_scb);
    bta_pan.open.status = BTA_PAN_FAIL;
  }

  p_scb->pan_flow_enable = true;
  p_scb->app_flow_enable = true;

  /* If app_id is NAP/GN, check whether there are multiple connections.
     If there are, provide a special app_id to dm to enforce master role only.
     */
  if ((p_scb->app_id == bta_pan_cb.app_id[1] ||
       p_scb->app_id == bta_pan_cb.app_id[2]) &&
      bta_pan_has_multiple_connections(p_scb->app_id)) {
    p_scb->app_id = BTA_APP_ID_PAN_MULTI;
  }

  bta_sys_conn_open(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr);
  bta_pan_cb.p_cback(BTA_PAN_OPEN_EVT, &bta_pan);
}

/*******************************************************************************
 *
 * Function         bta_pan_conn_close
 *
 * Description      process connection close event
 *
 *
 *
 * Returns          void
 *
 ******************************************************************************/
void bta_pan_conn_close(tBTA_PAN_SCB* p_scb, tBTA_PAN_DATA* p_data) {
  tBTA_PAN bta_pan;
  BT_HDR* p_buf;

  bta_pan.close.handle = p_data->hdr.layer_specific;

  bta_sys_conn_close(BTA_ID_PAN, p_scb->app_id, p_scb->bd_addr);

  /* free all queued up data buffers */
  while ((p_buf = (BT_HDR*)fixed_queue_try_dequeue(p_scb->data_queue)) != NULL)
    osi_free(p_buf);

  bta_pan_scb_dealloc(p_scb);

  bta_pan_cb.p_cback(BTA_PAN_CLOSE_EVT, &bta_pan);
}

/*******************************************************************************
 *
 * Function         bta_pan_rx_path
 *
 * Description      Handle data on the RX path (data sent from the phone to
 *                  BTA).
 *
 *
 * Returns          void
 *
 ******************************************************************************/
void bta_pan_rx_path(tBTA_PAN_SCB* p_scb, UNUSED_ATTR tBTA_PAN_DATA* p_data) {
  /* if data path configured for rx pull */
  if ((bta_pan_cb.flow_mask & BTA_PAN_RX_MASK) == BTA_PAN_RX_PULL) {
    /* if we can accept data */
    if (p_scb->pan_flow_enable == true) {
      /* call application callout function for rx path */
      bta_pan_co_rx_path(p_scb->handle, p_scb->app_id);
    }
  }
  /* else data path configured for rx push */
  else {
  }
}

/*******************************************************************************
 *
 * Function         bta_pan_tx_path
 *
 * Description      Handle the TX data path (data sent from BTA to the phone).
 *
 *
 * Returns          void
 *
 ******************************************************************************/
void bta_pan_tx_path(tBTA_PAN_SCB* p_scb, UNUSED_ATTR tBTA_PAN_DATA* p_data) {
  /* if data path configured for tx pull */
  if ((bta_pan_cb.flow_mask & BTA_PAN_TX_MASK) == BTA_PAN_TX_PULL) {
    bta_pan_pm_conn_busy(p_scb);
    /* call application callout function for tx path */
    bta_pan_co_tx_path(p_scb->handle, p_scb->app_id);

    /* free data that exceeds queue level */
    while (fixed_queue_length(p_scb->data_queue) > bta_pan_cb.q_level)
      osi_free(fixed_queue_try_dequeue(p_scb->data_queue));
    bta_pan_pm_conn_idle(p_scb);
  }
  /* if configured for zero copy push */
  else if ((bta_pan_cb.flow_mask & BTA_PAN_TX_MASK) == BTA_PAN_TX_PUSH_BUF) {
    /* if app can accept data */
    if (p_scb->app_flow_enable == true) {
      BT_HDR* p_buf;

      /* read data from the queue */
      p_buf = (BT_HDR*)fixed_queue_try_dequeue(p_scb->data_queue);
      if (p_buf != NULL) {
        /* send data to application */
        bta_pan_co_tx_writebuf(p_scb->handle, p_scb->app_id,
                               ((tBTA_PAN_DATA_PARAMS*)p_buf)->src,
                               ((tBTA_PAN_DATA_PARAMS*)p_buf)->dst,
                               ((tBTA_PAN_DATA_PARAMS*)p_buf)->protocol, p_buf,
                               ((tBTA_PAN_DATA_PARAMS*)p_buf)->ext,
                               ((tBTA_PAN_DATA_PARAMS*)p_buf)->forward);
      }
      /* free data that exceeds queue level  */
      while (fixed_queue_length(p_scb->data_queue) > bta_pan_cb.q_level)
        osi_free(fixed_queue_try_dequeue(p_scb->data_queue));

      /* if there is more data to be passed to
      upper layer */
      if (!fixed_queue_is_empty(p_scb->data_queue)) {
        p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
        p_buf->layer_specific = p_scb->handle;
        p_buf->event = BTA_PAN_RX_FROM_BNEP_READY_EVT;
        bta_sys_sendmsg(p_buf);
      }
    }
  }
}

/*******************************************************************************
 *
 * Function         bta_pan_tx_flow
 *
 * Description      Set the application flow control state.
 *
 *
 * Returns          void
 *
 ******************************************************************************/
void bta_pan_tx_flow(tBTA_PAN_SCB* p_scb, tBTA_PAN_DATA* p_data) {
  p_scb->app_flow_enable = p_data->ci_tx_flow.enable;
}

/*******************************************************************************
 *
 * Function         bta_pan_write_buf
 *
 * Description      Handle a bta_pan_ci_rx_writebuf() and send data to PAN.
 *
 *
 * Returns          void
 *
 ******************************************************************************/
void bta_pan_write_buf(tBTA_PAN_SCB* p_scb, tBTA_PAN_DATA* p_data) {
  if ((bta_pan_cb.flow_mask & BTA_PAN_RX_MASK) == BTA_PAN_RX_PUSH_BUF) {
    bta_pan_pm_conn_busy(p_scb);

    PAN_WriteBuf(p_scb->handle, ((tBTA_PAN_DATA_PARAMS*)p_data)->dst,
                 ((tBTA_PAN_DATA_PARAMS*)p_data)->src,
                 ((tBTA_PAN_DATA_PARAMS*)p_data)->protocol, (BT_HDR*)p_data,
                 ((tBTA_PAN_DATA_PARAMS*)p_data)->ext);
    bta_pan_pm_conn_idle(p_scb);
  }
}

/*******************************************************************************
 *
 * Function         bta_pan_free_buf
 *
 * Description      Frees the data buffer during closing state
 *
 *
 * Returns          void
 *
 ******************************************************************************/
void bta_pan_free_buf(UNUSED_ATTR tBTA_PAN_SCB* p_scb, tBTA_PAN_DATA* p_data) {
  osi_free(p_data);
}

#endif /* PAN_INCLUDED */
