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