15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 1999-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 main functions to support PAN profile
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  commands and events.
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h"
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h"
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bnep_api.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "pan_api.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "pan_int.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sdp_api.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sdpdefs.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcidefs.h"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if PAN_DYNAMIC_MEMORY == FALSE
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttPAN_CB  pan_cb;
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define UUID_CONSTANT_PART  12
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 constant_pan_uuid[UUID_CONSTANT_PART] = {0, 0, 0x10, 0, 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb};
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         pan_register_with_bnep
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function registers PAN profile with BNEP
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      none
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid pan_register_with_bnep (void)
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBNEP_REGISTER      reg_info;
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (&reg_info, 0, sizeof (tBNEP_REGISTER));
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_info.p_conn_ind_cb      = pan_conn_ind_cb;
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_info.p_conn_state_cb    = pan_connect_state_cb;
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_info.p_data_buf_cb      = pan_data_buf_ind_cb;
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_info.p_data_ind_cb      = NULL;
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_info.p_tx_data_flow_cb  = pan_tx_data_flow_cb;
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_info.p_filter_ind_cb    = pan_proto_filt_ind_cb;
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    reg_info.p_mfilter_ind_cb   = pan_mcast_filt_ind_cb;
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BNEP_Register (&reg_info);
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         pan_conn_ind_cb
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is registered with BNEP as connection indication
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  callback. BNEP will call this when there is connection
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  request from the peer. PAN should call BNEP_ConnectResp to
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  indicate whether to accept the connection or reject
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      handle          - handle for the connection
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_bda           - BD Addr of the peer requesting the connection
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  remote_uuid     - UUID of the source role (peer device role)
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  local_uuid      - UUID of the destination role (local device role)
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is_role_change  - Flag to indicate that it is a role change
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid pan_conn_ind_cb (UINT16 handle,
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      BD_ADDR p_bda,
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      tBT_UUID *remote_uuid,
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      tBT_UUID *local_uuid,
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      BOOLEAN is_role_change)
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tPAN_CONN       *pcb;
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           req_role;
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         wrong_uuid;
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** If we are in GN or NAP role and have one or more
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** active connections and the received connection is
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** for user role reject it.
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** If we are in user role with one connection active
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** reject the connection.
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** Allocate PCB and store the parameters
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** Make bridge request to the host system if connection
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** is for NAP
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    wrong_uuid = FALSE;
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (BNEP_SUPPORTS_ALL_UUID_LENGTHS) && BNEP_SUPPORTS_ALL_UUID_LENGTHS == TRUE)
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (remote_uuid->len == 16)
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /*
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ** If the UUID is 16 bytes forst two bytes should be zeros
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ** and last 12 bytes should match the spec defined constant value
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        */
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (memcmp (constant_pan_uuid, remote_uuid->uu.uuid128 + 4, UUID_CONSTANT_PART))
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            wrong_uuid = TRUE;
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (remote_uuid->uu.uuid128[0] || remote_uuid->uu.uuid128[1])
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            wrong_uuid = TRUE;
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Extract the 16 bit equivalent of the UUID */
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        remote_uuid->uu.uuid16 = (UINT16)((remote_uuid->uu.uuid128[2] << 8) | remote_uuid->uu.uuid128[3]);
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        remote_uuid->len = 2;
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (remote_uuid->len == 4)
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* First two bytes should be zeros */
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (remote_uuid->uu.uuid32 & 0xFFFF0000)
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            wrong_uuid = TRUE;
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        remote_uuid->uu.uuid16 = (UINT16)remote_uuid->uu.uuid32;
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        remote_uuid->len = 2;
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (wrong_uuid)
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PAN_TRACE_ERROR0 ("PAN Connection failed because of wrong remote UUID ");
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BNEP_ConnectResp (handle, BNEP_CONN_FAILED_SRC_UUID);
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    wrong_uuid = FALSE;
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (local_uuid->len == 16)
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /*
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ** If the UUID is 16 bytes forst two bytes should be zeros
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ** and last 12 bytes should match the spec defined constant value
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        */
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (memcmp (constant_pan_uuid, local_uuid->uu.uuid128 + 4, UUID_CONSTANT_PART))
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            wrong_uuid = TRUE;
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (local_uuid->uu.uuid128[0] || local_uuid->uu.uuid128[1])
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            wrong_uuid = TRUE;
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Extract the 16 bit equivalent of the UUID */
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        local_uuid->uu.uuid16 = (UINT16)((local_uuid->uu.uuid128[2] << 8) | local_uuid->uu.uuid128[3]);
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        local_uuid->len = 2;
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (local_uuid->len == 4)
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* First two bytes should be zeros */
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (local_uuid->uu.uuid32 & 0xFFFF0000)
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            wrong_uuid = TRUE;
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        local_uuid->uu.uuid16 = (UINT16)local_uuid->uu.uuid32;
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        local_uuid->len = 2;
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (wrong_uuid)
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PAN_TRACE_ERROR0 ("PAN Connection failed because of wrong local UUID ");
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BNEP_ConnectResp (handle, BNEP_CONN_FAILED_DST_UUID);
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    PAN_TRACE_EVENT5 ("pan_conn_ind_cb - for handle %d, current role %d, dst uuid 0x%x, src uuid 0x%x, role change %s",
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        handle, pan_cb.role, local_uuid->uu.uuid16, remote_uuid->uu.uuid16, is_role_change?"YES":"NO");
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* The acceptable UUID size is only 2 */
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (remote_uuid->len != 2)
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PAN_TRACE_ERROR1 ("PAN Connection failed because of wrong UUID size %d", remote_uuid->len);
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BNEP_ConnectResp (handle, BNEP_CONN_FAILED_UUID_SIZE);
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if the source UUID is a valid one */
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (remote_uuid->uu.uuid16 != UUID_SERVCLASS_PANU &&
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        remote_uuid->uu.uuid16 != UUID_SERVCLASS_NAP &&
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        remote_uuid->uu.uuid16 != UUID_SERVCLASS_GN)
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PAN_TRACE_ERROR1 ("Src UUID 0x%x is not valid", remote_uuid->uu.uuid16);
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BNEP_ConnectResp (handle, BNEP_CONN_FAILED_SRC_UUID);
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if the destination UUID is a valid one */
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (local_uuid->uu.uuid16 != UUID_SERVCLASS_PANU &&
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        local_uuid->uu.uuid16 != UUID_SERVCLASS_NAP &&
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        local_uuid->uu.uuid16 != UUID_SERVCLASS_GN)
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PAN_TRACE_ERROR1 ("Dst UUID 0x%x is not valid", remote_uuid->uu.uuid16);
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BNEP_ConnectResp (handle, BNEP_CONN_FAILED_DST_UUID);
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if currently we support the destination role requested */
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((!(pan_cb.role & UUID_SERVCLASS_PANU))
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && local_uuid->uu.uuid16 == UUID_SERVCLASS_PANU) ||
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ((!(pan_cb.role & UUID_SERVCLASS_GN))
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && local_uuid->uu.uuid16 == UUID_SERVCLASS_GN) ||
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ((!(pan_cb.role & UUID_SERVCLASS_NAP))
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && local_uuid->uu.uuid16 == UUID_SERVCLASS_NAP))
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PAN_TRACE_ERROR1 ("PAN Connection failed because of unsupported destination UUID 0x%x", local_uuid->uu.uuid16);
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BNEP_ConnectResp (handle, BNEP_CONN_FAILED_DST_UUID);
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Requested destination role is */
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (local_uuid->uu.uuid16 == UUID_SERVCLASS_PANU)
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        req_role = PAN_ROLE_CLIENT;
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (local_uuid->uu.uuid16 == UUID_SERVCLASS_GN)
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        req_role = PAN_ROLE_GN_SERVER;
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        req_role = PAN_ROLE_NAP_SERVER;
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If the connection indication is for the existing connection
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** Check if the new destination role is acceptable
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pcb = pan_get_pcb_by_handle (handle);
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (pcb)
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (pan_cb.num_conns > 1 && local_uuid->uu.uuid16 == UUID_SERVCLASS_PANU)
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* There are connections other than this one
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** so we cann't accept PANU role. Reject
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            PAN_TRACE_ERROR0 ("Dst UUID should be either GN or NAP only because there are other connections");
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BNEP_ConnectResp (handle, BNEP_CONN_FAILED_DST_UUID);
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If it is already in connected state check for bridging status */
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (pcb->con_state == PAN_STATE_CONNECTED)
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            PAN_TRACE_EVENT2 ("PAN Role changing New Src 0x%x Dst 0x%x",
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                remote_uuid->uu.uuid16, local_uuid->uu.uuid16);
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pcb->prv_src_uuid = pcb->src_uuid;
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pcb->prv_dst_uuid = pcb->dst_uuid;
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (pcb->src_uuid == UUID_SERVCLASS_NAP &&
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                local_uuid->uu.uuid16 != UUID_SERVCLASS_NAP)
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Remove bridging */
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (pan_cb.pan_bridge_req_cb)
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*pan_cb.pan_bridge_req_cb) (pcb->rem_bda, FALSE);
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Set the latest active PAN role */
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pan_cb.active_role = req_role;
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pcb->src_uuid = local_uuid->uu.uuid16;
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pcb->dst_uuid = remote_uuid->uu.uuid16;
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BNEP_ConnectResp (handle, BNEP_SUCCESS);
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If this a new connection and destination is PANU role and
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ** we already have a connection then reject the request.
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ** If we have a connection in PANU role then reject it
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        */
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (pan_cb.num_conns &&
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (local_uuid->uu.uuid16 == UUID_SERVCLASS_PANU ||
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pan_cb.active_role == PAN_ROLE_CLIENT))
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            PAN_TRACE_ERROR0 ("PAN already have a connection and can't be user");
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BNEP_ConnectResp (handle, BNEP_CONN_FAILED_DST_UUID);
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* This is a new connection */
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    PAN_TRACE_DEBUG1 ("New connection indication for handle %d", handle);
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pcb = pan_allocate_pcb (p_bda, handle);
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!pcb)
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PAN_TRACE_ERROR0 ("PAN no control block for new connection");
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BNEP_ConnectResp (handle, BNEP_CONN_FAILED);
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    PAN_TRACE_EVENT1 ("PAN connection destination UUID is 0x%x", local_uuid->uu.uuid16);
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Set the latest active PAN role */
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pan_cb.active_role = req_role;
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pcb->src_uuid = local_uuid->uu.uuid16;
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pcb->dst_uuid = remote_uuid->uu.uuid16;
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pcb->con_state = PAN_STATE_CONN_START;
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pan_cb.num_conns++;
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BNEP_ConnectResp (handle, BNEP_SUCCESS);
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         pan_connect_state_cb
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is registered with BNEP as connection state
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  change callback. BNEP will call this when the connection
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is established successfully or terminated
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      handle      - handle for the connection given in the connection
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                      indication callback
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  rem_bda     - remote device bd addr
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  result      - indicates whether the connection is up or down
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                      BNEP_SUCCESS if the connection is up
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                      all other values indicates appropriate errors
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is_role_change - flag to indicate that it is a role change
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid pan_connect_state_cb (UINT16 handle, BD_ADDR rem_bda, tBNEP_RESULT result, BOOLEAN is_role_change)
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tPAN_CONN       *pcb;
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            peer_role;
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    PAN_TRACE_EVENT2 ("pan_connect_state_cb - for handle %d, result %d", handle, result);
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pcb = pan_get_pcb_by_handle (handle);
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!pcb)
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PAN_TRACE_ERROR1 ("PAN State change indication for wrong handle %d", handle);
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If the connection is getting terminated remove bridging */
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (result != BNEP_SUCCESS)
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Inform the application that connection is down */
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (pan_cb.pan_conn_state_cb)
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*pan_cb.pan_conn_state_cb) (pcb->handle, pcb->rem_bda, result, is_role_change, PAN_ROLE_INACTIVE, PAN_ROLE_INACTIVE);
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check if this failure is for role change only */
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (pcb->con_state != PAN_STATE_CONNECTED &&
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (pcb->con_flags & PAN_FLAGS_CONN_COMPLETED))
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* restore the original values */
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            PAN_TRACE_EVENT0 ("restoring the connection state to active");
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pcb->con_state = PAN_STATE_CONNECTED;
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pcb->con_flags &= (~PAN_FLAGS_CONN_COMPLETED);
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pcb->src_uuid = pcb->prv_src_uuid;
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pcb->dst_uuid = pcb->prv_dst_uuid;
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pan_cb.active_role = pan_cb.prv_active_role;
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((pcb->src_uuid == UUID_SERVCLASS_NAP) && pan_cb.pan_bridge_req_cb)
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*pan_cb.pan_bridge_req_cb) (pcb->rem_bda, TRUE);
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (pcb->con_state == PAN_STATE_CONNECTED)
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If the connections destination role is NAP remove bridging */
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((pcb->src_uuid == UUID_SERVCLASS_NAP) && pan_cb.pan_bridge_req_cb)
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*pan_cb.pan_bridge_req_cb) (pcb->rem_bda, FALSE);
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pan_cb.num_conns--;
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pan_release_pcb (pcb);
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Requested destination role is */
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (pcb->src_uuid == UUID_SERVCLASS_PANU)
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pan_cb.active_role = PAN_ROLE_CLIENT;
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (pcb->src_uuid == UUID_SERVCLASS_GN)
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pan_cb.active_role = PAN_ROLE_GN_SERVER;
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pan_cb.active_role = PAN_ROLE_NAP_SERVER;
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (pcb->dst_uuid == UUID_SERVCLASS_PANU)
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        peer_role = PAN_ROLE_CLIENT;
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (pcb->dst_uuid == UUID_SERVCLASS_GN)
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        peer_role = PAN_ROLE_GN_SERVER;
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        peer_role = PAN_ROLE_NAP_SERVER;
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pcb->con_state = PAN_STATE_CONNECTED;
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Inform the application that connection is down */
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (pan_cb.pan_conn_state_cb)
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*pan_cb.pan_conn_state_cb) (pcb->handle, pcb->rem_bda, PAN_SUCCESS, is_role_change, pan_cb.active_role, peer_role);
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Create bridge if the destination role is NAP */
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (pan_cb.pan_bridge_req_cb && pcb->src_uuid == UUID_SERVCLASS_NAP)
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PAN_TRACE_EVENT0 ("PAN requesting for bridge");
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*pan_cb.pan_bridge_req_cb) (pcb->rem_bda, TRUE);
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         pan_data_ind_cb
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is registered with BNEP as data indication
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  callback. BNEP will call this when the peer sends any data
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  on this connection
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      handle      - handle for the connection
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  src         - source BD Addr
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  dst         - destination BD Addr
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  protocol    - Network protocol of the Eth packet
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_data      - pointer to the data
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  len         - length of the data
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  fw_ext_present - to indicate whether the data contains any
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                         extension headers before the payload
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid pan_data_ind_cb (UINT16 handle,
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      UINT8 *src,
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      UINT8 *dst,
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      UINT16 protocol,
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      UINT8 *p_data,
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      UINT16 len,
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      BOOLEAN ext)
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tPAN_CONN       *pcb;
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          i;
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         forward;
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** Check the connection status
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** If the destination address is MAC broadcast send on all links
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** except on the one received
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** If the destination uuid is for NAP send to host system also
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** If the destination address is one of the devices connected
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** send the packet to over that link
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** If the destination address is unknown and destination uuid is NAP
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** send it to the host system
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    PAN_TRACE_EVENT1 ("pan_data_ind_cb - for handle %d", handle);
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pcb = pan_get_pcb_by_handle (handle);
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!pcb)
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PAN_TRACE_ERROR1 ("PAN Data indication for wrong handle %d", handle);
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (pcb->con_state != PAN_STATE_CONNECTED)
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PAN_TRACE_ERROR2 ("PAN Data indication in wrong state %d for handle %d",
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pcb->con_state, handle);
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if it is broadcast packet */
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (dst[0] & 0x01)
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PAN_TRACE_DEBUG2 ("PAN received broadcast packet on handle %d, src uuid 0x%x",
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle, pcb->src_uuid);
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i=0; i<MAX_PAN_CONNS; i++)
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (pan_cb.pcb[i].con_state == PAN_STATE_CONNECTED &&
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                pan_cb.pcb[i].handle != handle &&
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                pcb->src_uuid == pan_cb.pcb[i].src_uuid)
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BNEP_Write (pan_cb.pcb[i].handle, dst, p_data, len, protocol, src, ext);
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (pan_cb.pan_data_ind_cb)
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*pan_cb.pan_data_ind_cb) (pcb->handle, src, dst, protocol, p_data, len, ext, TRUE);
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if it is for any other PAN connection */
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i=0; i<MAX_PAN_CONNS; i++)
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (pan_cb.pcb[i].con_state == PAN_STATE_CONNECTED &&
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pcb->src_uuid == pan_cb.pcb[i].src_uuid)
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (memcmp (pan_cb.pcb[i].rem_bda, dst, BD_ADDR_LEN) == 0)
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BNEP_Write (pan_cb.pcb[i].handle, dst, p_data, len, protocol, src, ext);
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   if (pcb->src_uuid == UUID_SERVCLASS_NAP)
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       forward = TRUE;
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   else
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       forward = FALSE;
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Send it over the LAN or give it to host software */
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (pan_cb.pan_data_ind_cb)
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*pan_cb.pan_data_ind_cb) (pcb->handle, src, dst, protocol, p_data, len, ext, forward);
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         pan_data_buf_ind_cb
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is registered with BNEP as data buffer indication
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  callback. BNEP will call this when the peer sends any data
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  on this connection. PAN is responsible to release the buffer
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      handle      - handle for the connection
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  src         - source BD Addr
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  dst         - destination BD Addr
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  protocol    - Network protocol of the Eth packet
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_buf       - pointer to the data buffer
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  ext         - to indicate whether the data contains any
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                         extension headers before the payload
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid pan_data_buf_ind_cb (UINT16 handle,
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          UINT8 *src,
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          UINT8 *dst,
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          UINT16 protocol,
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          BT_HDR *p_buf,
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          BOOLEAN ext)
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tPAN_CONN       *pcb, *dst_pcb;
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBNEP_RESULT    result;
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          i, len;
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p_data;
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         forward = FALSE;
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if the connection is in right state */
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pcb = pan_get_pcb_by_handle (handle);
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!pcb)
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PAN_TRACE_ERROR1 ("PAN Data buffer indication for wrong handle %d", handle);
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_buf);
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (pcb->con_state != PAN_STATE_CONNECTED)
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        PAN_TRACE_ERROR2 ("PAN Data indication in wrong state %d for handle %d",
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pcb->con_state, handle);
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_buf);
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_data = (UINT8 *)(p_buf + 1) + p_buf->offset;
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    len    = p_buf->len;
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    PAN_TRACE_EVENT4 ("pan_data_buf_ind_cb - for handle %d, protocol 0x%x, length %d, ext %d",
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        handle, protocol, len, ext);
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   if (pcb->src_uuid == UUID_SERVCLASS_NAP)
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       forward = TRUE;
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project   else
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       forward = FALSE;
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if it is broadcast or multicast packet */
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (pcb->src_uuid != UUID_SERVCLASS_PANU)
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (dst[0] & 0x01)
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            PAN_TRACE_DEBUG2 ("PAN received broadcast packet on handle %d, src uuid 0x%x",
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                handle, pcb->src_uuid);
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (i=0; i<MAX_PAN_CONNS; i++)
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (pan_cb.pcb[i].con_state == PAN_STATE_CONNECTED &&
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pan_cb.pcb[i].handle != handle &&
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pcb->src_uuid == pan_cb.pcb[i].src_uuid)
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BNEP_Write (pan_cb.pcb[i].handle, dst, p_data, len, protocol, src, ext);
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (pan_cb.pan_data_buf_ind_cb)
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*pan_cb.pan_data_buf_ind_cb) (pcb->handle, src, dst, protocol, p_buf, ext, forward);
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (pan_cb.pan_data_ind_cb)
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*pan_cb.pan_data_ind_cb) (pcb->handle, src, dst, protocol, p_data, len, ext, forward);
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                GKI_freebuf (p_buf);
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check if it is for any other PAN connection */
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        dst_pcb = pan_get_pcb_by_addr (dst);
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (dst_pcb)
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            PAN_TRACE_EVENT0 ("pan_data_buf_ind_cb - destination PANU found and sending the data");
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            result = BNEP_WriteBuf (dst_pcb->handle, dst, p_buf, protocol, src, ext);
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (result != BNEP_SUCCESS && result != BNEP_IGNORE_CMD)
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                PAN_TRACE_ERROR1 ("Failed to write data for PAN connection handle %d", dst_pcb->handle);
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Send it over the LAN or give it to host software */
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (pan_cb.pan_data_buf_ind_cb)
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*pan_cb.pan_data_buf_ind_cb) (pcb->handle, src, dst, protocol, p_buf, ext, forward);
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (pan_cb.pan_data_ind_cb)
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*pan_cb.pan_data_ind_cb) (pcb->handle, src, dst, protocol, p_data, len, ext, forward);
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_buf);
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (p_buf);
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         pan_proto_filt_ind_cb
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is registered with BNEP to receive tx data
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**					flow status
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      handle      - handle for the connection
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**					event       - flow status
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid pan_tx_data_flow_cb (UINT16 handle,
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            tBNEP_RESULT  event)
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (pan_cb.pan_tx_data_flow_cb)
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*pan_cb.pan_tx_data_flow_cb) (handle, event);
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         pan_proto_filt_ind_cb
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is registered with BNEP as proto filter indication
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  callback. BNEP will call this when the peer sends any protocol
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  filter set for the connection or to indicate the result of the
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  protocol filter set by the local device
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      handle      - handle for the connection
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  indication  - TRUE if this is indication
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                FALSE if it is called to give the result of local
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                      device protocol filter set
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  result      - This gives the result of the filter set operation
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  num_filters - number of filters set by the peer device
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_filters   - pointer to the filters set by the peer device
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid pan_proto_filt_ind_cb (UINT16 handle,
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            BOOLEAN indication,
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            tBNEP_RESULT result,
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            UINT16 num_filters,
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            UINT8 *p_filters)
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (BNEP_SUPPORTS_PROT_FILTERS) && BNEP_SUPPORTS_PROT_FILTERS == TRUE)
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    PAN_TRACE_EVENT4 ("pan_proto_filt_ind_cb - called for handle %d with ind %d, result %d, num %d",
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            handle, indication, result, num_filters);
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (pan_cb.pan_pfilt_ind_cb)
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*pan_cb.pan_pfilt_ind_cb) (handle, indication, result, num_filters, p_filters);
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         pan_mcast_filt_ind_cb
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is registered with BNEP as mcast filter indication
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  callback. BNEP will call this when the peer sends any multicast
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  filter set for the connection or to indicate the result of the
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  multicast filter set by the local device
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      handle      - handle for the connection
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  indication  - TRUE if this is indication
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                FALSE if it is called to give the result of local
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                      device multicast filter set
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  result      - This gives the result of the filter set operation
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  num_filters - number of filters set by the peer device
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_filters   - pointer to the filters set by the peer device
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          none
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid pan_mcast_filt_ind_cb (UINT16 handle,
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            BOOLEAN indication,
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            tBNEP_RESULT result,
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            UINT16 num_filters,
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            UINT8 *p_filters)
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (BNEP_SUPPORTS_MULTI_FILTERS) && BNEP_SUPPORTS_MULTI_FILTERS == TRUE)
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    PAN_TRACE_EVENT4 ("pan_mcast_filt_ind_cb - called for handle %d with ind %d, result %d, num %d",
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            handle, indication, result, num_filters);
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (pan_cb.pan_mfilt_ind_cb)
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*pan_cb.pan_mfilt_ind_cb) (handle, indication, result, num_filters, p_filters);
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
731