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#include "btm_api.h" 37e5febfe6fdcf3d55a42e7c197b58aded4d4b2230Mike J. Chen#include "bta_sys.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PAN_Register 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the application to register 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** its callbacks with PAN profile. The application then 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** should set the PAN role explicitly. 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: p_register - contains all callback function pointers 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid PAN_Register (tPAN_REGISTER *p_register) 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetDiscoverability (BTM_GENERAL_DISCOVERABLE, 0, 0); 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetConnectability (BTM_CONNECTABLE, 0, 0); 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_register_with_bnep (); 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_register) 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_conn_state_cb = p_register->pan_conn_state_cb; 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_bridge_req_cb = p_register->pan_bridge_req_cb; 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_data_buf_ind_cb = p_register->pan_data_buf_ind_cb; 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_data_ind_cb = p_register->pan_data_ind_cb; 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_pfilt_ind_cb = p_register->pan_pfilt_ind_cb; 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_mfilt_ind_cb = p_register->pan_mfilt_ind_cb; 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_tx_data_flow_cb = p_register->pan_tx_data_flow_cb; 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 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** 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PAN_Deregister 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the application to de-register 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** its callbacks with PAN profile. This will make the PAN to 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** become inactive. This will deregister PAN services from SDP 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** and close all active connections 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: none 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid PAN_Deregister (void) 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_bridge_req_cb = NULL; 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_data_buf_ind_cb = NULL; 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_data_ind_cb = NULL; 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_conn_state_cb = NULL; 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_pfilt_ind_cb = NULL; 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_mfilt_ind_cb = NULL; 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project PAN_SetRole (PAN_ROLE_INACTIVE, NULL, NULL, NULL, NULL); 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BNEP_Deregister (); 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PAN_SetRole 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the application to set the PAN 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** profile role. This should be called after PAN_Register. 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This can be called any time to change the PAN role 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: role - is bit map of roles to be active 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PAN_ROLE_CLIENT is for PANU role 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PAN_ROLE_GN_SERVER is for GN role 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PAN_ROLE_NAP_SERVER is for NAP role 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** sec_mask - Security mask for different roles 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** It is array of UINT8. The byte represent the 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** security for roles PANU, GN and NAP in order 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_user_name - Service name for PANU role 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_gn_name - Service name for GN role 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_nap_name - Service name for NAP role 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Can be NULL if user wants it to be default 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns PAN_SUCCESS - if the role is set successfully 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PAN_FAILURE - if the role is not valid 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttPAN_RESULT PAN_SetRole (UINT8 role, 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *sec_mask, 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p_user_name, 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p_gn_name, 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p_nap_name) 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p_desc; 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 security[3] = {PAN_PANU_SECURITY_LEVEL, 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project PAN_GN_SECURITY_LEVEL, 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project PAN_NAP_SECURITY_LEVEL}; 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_sec; 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the role is not a valid combination reject it */ 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!(role & (PAN_ROLE_CLIENT | PAN_ROLE_GN_SERVER | PAN_ROLE_NAP_SERVER))) && 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project role != PAN_ROLE_INACTIVE) 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 150d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR ("PAN role %d is invalid", role); 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_FAILURE; 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the current active role is same as the role being set do nothing */ 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pan_cb.role == role) 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 157d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_EVENT ("PAN role already was set to: %d", role); 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_SUCCESS; 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!sec_mask) 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sec = security; 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sec = sec_mask; 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Register all the roles with SDP */ 167d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_API ("PAN_SetRole() called with role 0x%x", role); 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (PAN_SUPPORTS_ROLE_NAP) && PAN_SUPPORTS_ROLE_NAP == TRUE) 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check the service name */ 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_nap_name == NULL) || (*p_nap_name == 0)) 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_nap_name = PAN_NAP_DEFAULT_SERVICE_NAME; 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (role & PAN_ROLE_NAP_SERVER) 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Registering for NAP service with SDP */ 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_desc = PAN_NAP_DEFAULT_DESCRIPTION; 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pan_cb.pan_nap_sdp_handle != 0) 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SDP_DeleteRecord (pan_cb.pan_nap_sdp_handle); 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_nap_sdp_handle = pan_register_with_sdp (UUID_SERVCLASS_NAP, p_sec[2], p_nap_name, p_desc); 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++ 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_add_uuid(UUID_SERVCLASS_NAP); 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific -- 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the NAP role is already active and now being cleared delete the record */ 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (pan_cb.role & PAN_ROLE_NAP_SERVER) 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pan_cb.pan_nap_sdp_handle != 0) 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SDP_DeleteRecord (pan_cb.pan_nap_sdp_handle); 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_nap_sdp_handle = 0; 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++ 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_remove_uuid(UUID_SERVCLASS_NAP); 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific -- 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (PAN_SUPPORTS_ROLE_GN) && PAN_SUPPORTS_ROLE_GN == TRUE) 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check the service name */ 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_gn_name == NULL) || (*p_gn_name == 0)) 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_gn_name = PAN_GN_DEFAULT_SERVICE_NAME; 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (role & PAN_ROLE_GN_SERVER) 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Registering for GN service with SDP */ 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_desc = PAN_GN_DEFAULT_DESCRIPTION; 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pan_cb.pan_gn_sdp_handle != 0) 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SDP_DeleteRecord (pan_cb.pan_gn_sdp_handle); 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_gn_sdp_handle = pan_register_with_sdp (UUID_SERVCLASS_GN, p_sec[1], p_gn_name, p_desc); 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++ 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_add_uuid(UUID_SERVCLASS_GN); 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific -- 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the GN role is already active and now being cleared delete the record */ 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (pan_cb.role & PAN_ROLE_GN_SERVER) 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pan_cb.pan_gn_sdp_handle != 0) 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SDP_DeleteRecord (pan_cb.pan_gn_sdp_handle); 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_gn_sdp_handle = 0; 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++ 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_remove_uuid(UUID_SERVCLASS_GN); 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific -- 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined (PAN_SUPPORTS_ROLE_PANU) && PAN_SUPPORTS_ROLE_PANU == TRUE) 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check the service name */ 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_user_name == NULL) || (*p_user_name == 0)) 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_user_name = PAN_PANU_DEFAULT_SERVICE_NAME; 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (role & PAN_ROLE_CLIENT) 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Registering for PANU service with SDP */ 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_desc = PAN_PANU_DEFAULT_DESCRIPTION; 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pan_cb.pan_user_sdp_handle != 0) 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SDP_DeleteRecord (pan_cb.pan_user_sdp_handle); 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_user_sdp_handle = pan_register_with_sdp (UUID_SERVCLASS_PANU, p_sec[0], p_user_name, p_desc); 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++ 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_add_uuid(UUID_SERVCLASS_PANU); 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific -- 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the PANU role is already active and now being cleared delete the record */ 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (pan_cb.role & PAN_ROLE_CLIENT) 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pan_cb.pan_user_sdp_handle != 0) 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SDP_DeleteRecord (pan_cb.pan_user_sdp_handle); 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pan_user_sdp_handle = 0; 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific ++ 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_remove_uuid(UUID_SERVCLASS_PANU); 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btla-specific -- 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if it is a shutdown request */ 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (role == PAN_ROLE_INACTIVE) 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_close_all_connections (); 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.role = role; 268d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_EVENT ("PAN role set to: %d", role); 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_SUCCESS; 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PAN_Connect 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the application to initiate a 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection to the remote device 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: rem_bda - BD Addr of the remote device 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** src_role - Role of the local device for the connection 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** dst_role - Role of the remote device for the connection 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PAN_ROLE_CLIENT is for PANU role 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PAN_ROLE_GN_SERVER is for GN role 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PAN_ROLE_NAP_SERVER is for NAP role 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** *handle - Pointer for returning Handle to the connection 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns PAN_SUCCESS - if the connection is initiated successfully 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PAN_NO_RESOURCES - resources are not sufficent 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PAN_FAILURE - if the connection cannot be initiated 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this can be because of the combination of 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** src and dst roles may not be valid or 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** allowed at that point of time 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttPAN_RESULT PAN_Connect (BD_ADDR rem_bda, UINT8 src_role, UINT8 dst_role, UINT16 *handle) 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPAN_CONN *pcb; 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_RESULT result; 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBT_UUID src_uuid, dst_uuid; 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id; 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Initialize the handle so that in case of failure return values 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** the profile will not get confused 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *handle = BNEP_INVALID_HANDLE; 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if PAN is active or not */ 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(pan_cb.role & src_role)) 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 313d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR ("PAN is not active for the role %d", src_role); 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_FAILURE; 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Validate the parameters before proceeding */ 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((src_role != PAN_ROLE_CLIENT && src_role != PAN_ROLE_GN_SERVER && src_role != PAN_ROLE_NAP_SERVER) || 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (dst_role != PAN_ROLE_CLIENT && dst_role != PAN_ROLE_GN_SERVER && dst_role != PAN_ROLE_NAP_SERVER)) 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 321d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR ("Either source %d or destination role %d is invalid", src_role, dst_role); 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_FAILURE; 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if connection exists for this remote device */ 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcb = pan_get_pcb_by_addr (rem_bda); 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we are PANU for this role validate destination role */ 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (src_role == PAN_ROLE_CLIENT) 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((pan_cb.num_conns > 1) || (pan_cb.num_conns && (!pcb))) 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** If the request is not for existing connection reject it 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** because if there is already a connection we cannot accept 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** another connection in PANU role 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 338d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR ("Cannot make PANU connections when there are more than one connection"); 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_INVALID_SRC_ROLE; 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project src_uuid.uu.uuid16 = UUID_SERVCLASS_PANU; 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (dst_role == PAN_ROLE_CLIENT) 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dst_uuid.uu.uuid16 = UUID_SERVCLASS_PANU; 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (dst_role == PAN_ROLE_GN_SERVER) 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dst_uuid.uu.uuid16 = UUID_SERVCLASS_GN; 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dst_uuid.uu.uuid16 = UUID_SERVCLASS_NAP; 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mx_chan_id = dst_uuid.uu.uuid16; 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If destination is PANU role validate source role */ 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (dst_role == PAN_ROLE_CLIENT) 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pan_cb.num_conns && pan_cb.active_role == PAN_ROLE_CLIENT && !pcb) 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 362d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR ("Device already have a connection in PANU role"); 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_INVALID_SRC_ROLE; 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dst_uuid.uu.uuid16 = UUID_SERVCLASS_PANU; 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (src_role == PAN_ROLE_GN_SERVER) 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project src_uuid.uu.uuid16 = UUID_SERVCLASS_GN; 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project src_uuid.uu.uuid16 = UUID_SERVCLASS_NAP; 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mx_chan_id = src_uuid.uu.uuid16; 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The role combination is not valid */ 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 380d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR ("Source %d and Destination roles %d are not valid combination", 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project src_role, dst_role); 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_FAILURE; 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allocate control block and initiate connection */ 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!pcb) 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcb = pan_allocate_pcb (rem_bda, BNEP_INVALID_HANDLE); 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!pcb) 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 390d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR ("PAN Connection failed because of no resources"); 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_NO_RESOURCES; 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetOutService(rem_bda, BTM_SEC_SERVICE_BNEP_PANU, mx_chan_id); 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_API ("PAN_Connect() for BD Addr %x.%x.%x.%x.%x.%x", 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rem_bda[0], rem_bda[1], rem_bda[2], rem_bda[3], rem_bda[4], rem_bda[5]); 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pcb->con_state == PAN_STATE_IDLE) 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.num_conns++; 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (pcb->con_state == PAN_STATE_CONNECTED) 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcb->con_flags |= PAN_FLAGS_CONN_COMPLETED; 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* PAN connection is still in progress */ 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_WRONG_STATE; 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcb->con_state = PAN_STATE_CONN_START; 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcb->prv_src_uuid = pcb->src_uuid; 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcb->prv_dst_uuid = pcb->dst_uuid; 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcb->src_uuid = src_uuid.uu.uuid16; 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcb->dst_uuid = dst_uuid.uu.uuid16; 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project src_uuid.len = 2; 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dst_uuid.len = 2; 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = BNEP_Connect (rem_bda, &src_uuid, &dst_uuid, &(pcb->handle)); 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result != BNEP_SUCCESS) 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_release_pcb (pcb); 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 426d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_DEBUG ("PAN_Connect() current active role set to %d", src_role); 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.prv_active_role = pan_cb.active_role; 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.active_role = src_role; 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *handle = pcb->handle; 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_SUCCESS; 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PAN_Disconnect 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is used to disconnect the connection 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: handle - handle for the connection 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns PAN_SUCCESS - if the connection is closed successfully 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PAN_FAILURE - if the connection is not found or 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** there is an error in disconnecting 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttPAN_RESULT PAN_Disconnect (UINT16 handle) 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPAN_CONN *pcb; 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_RESULT result; 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if the connection exists */ 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcb = pan_get_pcb_by_handle (handle); 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!pcb) 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 458d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR ("PAN connection not found for the handle %d", handle); 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_FAILURE; 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = BNEP_Disconnect (pcb->handle); 463045235e5ffc829829b1bdfb455f925aefd35f14aSharvil Nanavati if (pcb->con_state != PAN_STATE_IDLE) 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.num_conns--; 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pan_cb.pan_bridge_req_cb && pcb->src_uuid == UUID_SERVCLASS_NAP) 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*pan_cb.pan_bridge_req_cb) (pcb->rem_bda, FALSE); 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_release_pcb (pcb); 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result != BNEP_SUCCESS) 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 473d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_EVENT ("Error in closing PAN connection"); 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_FAILURE; 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 477d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_EVENT ("PAN connection closed"); 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_SUCCESS; 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PAN_Write 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This sends data over the PAN connections. If this is called 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** on GN or NAP side and the packet is multicast or broadcast 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** it will be sent on all the links. Otherwise the correct link 4892d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati** is found based on the destination address and forwarded on it. 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: handle - handle for the connection 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** dst - MAC or BD Addr of the destination device 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** src - MAC or BD Addr of the source who sent this packet 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** protocol - protocol of the ethernet packet like IP or ARP 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_data - pointer to the data 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** len - length of the data 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** ext - to indicate that extension headers present 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns PAN_SUCCESS - if the data is sent successfully 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PAN_FAILURE - if the connection is not found or 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** there is an error in sending data 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5042d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil NanavatitPAN_RESULT PAN_Write(UINT16 handle, BD_ADDR dst, BD_ADDR src, UINT16 protocol, UINT8 *p_data, UINT16 len, BOOLEAN ext) 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5062d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati BT_HDR *buffer; 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5082d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati if (pan_cb.role == PAN_ROLE_INACTIVE || !pan_cb.num_conns) { 509d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR("%s PAN is not active, data write failed.", __func__); 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_FAILURE; 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5132d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati // If the packet is broadcast or multicast, we're going to have to create 5142d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati // a copy of the packet for each connection. We can save one extra copy 5152d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati // by fast-pathing here and calling BNEP_Write instead of placing the packet 5162d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati // in a BT_HDR buffer, calling BNEP_Write, and then freeing the buffer. 5172d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati if (dst[0] & 0x01) { 5182d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati int i; 5192d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati for (i = 0; i < MAX_PAN_CONNS; ++i) { 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pan_cb.pcb[i].con_state == PAN_STATE_CONNECTED) 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BNEP_Write (pan_cb.pcb[i].handle, dst, p_data, len, protocol, src, ext); 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_SUCCESS; 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5262d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati buffer = (BT_HDR *)GKI_getpoolbuf(PAN_POOL_ID); 5272d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati if (!buffer) { 528d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR("%s unable to acquire buffer from pool.", __func__); 5292d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati return PAN_NO_RESOURCES; 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5322d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati buffer->len = len; 5332d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati buffer->offset = PAN_MINIMUM_OFFSET; 5342d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati memcpy((UINT8 *)buffer + sizeof(BT_HDR) + buffer->offset, p_data, buffer->len); 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5362d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati return PAN_WriteBuf(handle, dst, src, protocol, buffer, ext); 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PAN_WriteBuf 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This sends data over the PAN connections. If this is called 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** on GN or NAP side and the packet is multicast or broadcast 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** it will be sent on all the links. Otherwise the correct link 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is found based on the destination address and forwarded on it 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If the return value is not PAN_SUCCESS the application should 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** take care of releasing the message buffer 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: handle - handle for the connection 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** dst - MAC or BD Addr of the destination device 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** src - MAC or BD Addr of the source who sent this packet 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** protocol - protocol of the ethernet packet like IP or ARP 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_buf - pointer to the data buffer 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** ext - to indicate that extension headers present 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns PAN_SUCCESS - if the data is sent successfully 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PAN_FAILURE - if the connection is not found or 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** there is an error in sending data 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttPAN_RESULT PAN_WriteBuf (UINT16 handle, BD_ADDR dst, BD_ADDR src, UINT16 protocol, BT_HDR *p_buf, BOOLEAN ext) 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPAN_CONN *pcb; 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 i; 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBNEP_RESULT result; 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pan_cb.role == PAN_ROLE_INACTIVE || (!(pan_cb.num_conns))) 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 571d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR ("PAN is not active Data write failed"); 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_FAILURE; 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5762d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati /* Check if it is broadcast or multicast packet */ 5772d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati if (dst[0] & 0x01) 5782d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati { 5792d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati UINT8 *data = (UINT8 *)p_buf + sizeof(BT_HDR) + p_buf->offset; 5802d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati for (i = 0; i < MAX_PAN_CONNS; ++i) { 5812d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati if (pan_cb.pcb[i].con_state == PAN_STATE_CONNECTED) 5822d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati BNEP_Write(pan_cb.pcb[i].handle, dst, data, p_buf->len, protocol, src, ext); 5832d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati } 5842d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati GKI_freebuf(p_buf); 5852d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati return PAN_SUCCESS; 5862d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati } 5872d5d56ead7d9dd811cf9c5ef26b16c4a0b149adeSharvil Nanavati 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if the data write is on PANU side */ 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pan_cb.active_role == PAN_ROLE_CLIENT) 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Data write is on PANU connection */ 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i=0; i<MAX_PAN_CONNS; i++) 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pan_cb.pcb[i].con_state == PAN_STATE_CONNECTED && 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.pcb[i].src_uuid == UUID_SERVCLASS_PANU) 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (i == MAX_PAN_CONNS) 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 601d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR ("PAN Don't have any user connections"); 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_FAILURE; 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = BNEP_WriteBuf (pan_cb.pcb[i].handle, dst, p_buf, protocol, src, ext); 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == BNEP_IGNORE_CMD) 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 609d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_DEBUG ("PAN ignored data write for PANU connection"); 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (result != BNEP_SUCCESS) 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 614d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR ("PAN failed to write data for the PANU connection"); 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 618d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_DEBUG ("PAN successfully wrote data for the PANU connection"); 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_SUCCESS; 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* findout to which connection the data is meant for */ 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcb = pan_get_pcb_by_handle (handle); 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!pcb) 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 626d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR ("PAN Buf write for wrong handle"); 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_FAILURE; 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pcb->con_state != PAN_STATE_CONNECTED) 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 633d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR ("PAN Buf write when conn is not active"); 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_buf); 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_FAILURE; 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = BNEP_WriteBuf (pcb->handle, dst, p_buf, protocol, src, ext); 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == BNEP_IGNORE_CMD) 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 641d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_DEBUG ("PAN ignored data buf write to PANU"); 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (result != BNEP_SUCCESS) 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 646d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR ("PAN failed to send data buf to the PANU"); 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 650d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_DEBUG ("PAN successfully sent data buf to the PANU"); 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_SUCCESS; 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PAN_SetProtocolFilters 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is used to set protocol filters on the peer 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: handle - handle for the connection 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** num_filters - number of protocol filter ranges 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** start - array of starting protocol numbers 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** end - array of ending protocol numbers 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns PAN_SUCCESS if protocol filters are set successfully 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PAN_FAILURE if connection not found or error in setting 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttPAN_RESULT PAN_SetProtocolFilters (UINT16 handle, 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 num_filters, 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 *p_start_array, 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 *p_end_array) 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPAN_CONN *pcb; 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPAN_RESULT result; 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if the connection exists */ 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcb = pan_get_pcb_by_handle (handle); 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!pcb) 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 683d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR ("PAN connection not found for the handle %d", handle); 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_FAILURE; 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = BNEP_SetProtocolFilters (pcb->handle, num_filters, p_start_array, p_end_array); 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result != BNEP_SUCCESS) 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 690d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR ("PAN failed to set protocol filters for handle %d", handle); 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 694d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_API ("PAN successfully sent protocol filters for handle %d", handle); 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_SUCCESS; 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PAN_SetMulticastFilters 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is used to set multicast filters on the peer 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: handle - handle for the connection 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** num_filters - number of multicast filter ranges 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** start - array of starting multicast filter addresses 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** end - array of ending multicast filter addresses 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns PAN_SUCCESS if multicast filters are set successfully 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PAN_FAILURE if connection not found or error in setting 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBNEP_RESULT PAN_SetMulticastFilters (UINT16 handle, 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 num_mcast_filters, 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_start_array, 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_end_array) 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPAN_CONN *pcb; 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tPAN_RESULT result; 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if the connection exists */ 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcb = pan_get_pcb_by_handle (handle); 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!pcb) 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 728d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR ("PAN connection not found for the handle %d", handle); 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_FAILURE; 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = BNEP_SetMulticastFilters (pcb->handle, 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_mcast_filters, p_start_array, p_end_array); 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result != BNEP_SUCCESS) 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 736d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_ERROR ("PAN failed to set multicast filters for handle %d", handle); 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 740d6e1b1ee17959461a80936f7308d8129615315d2Sharvil Nanavati PAN_TRACE_API ("PAN successfully sent multicast filters for handle %d", handle); 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_SUCCESS; 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PAN_SetTraceLevel 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sets the trace level for PAN. If called with 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** a value of 0xFF, it simply reads the current trace level. 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns the new (current) trace level 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 PAN_SetTraceLevel (UINT8 new_level) 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_level != 0xFF) 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.trace_level = new_level; 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_dump_status (); 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (pan_cb.trace_level); 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function PAN_Init 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function initializes the PAN module variables 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: none 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns none 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid PAN_Init (void) 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (&pan_cb, 0, sizeof (tPAN_CB)); 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(PAN_INITIAL_TRACE_LEVEL) 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.trace_level = PAN_INITIAL_TRACE_LEVEL; 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pan_cb.trace_level = BT_TRACE_LEVEL_NONE; /* No traces */ 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 788