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 26911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "pan_api.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 28911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "bnep_api.h" 29258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 31911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "bta_sys.h" 32911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "btm_api.h" 33911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "hcidefs.h" 34911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "l2c_api.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "pan_int.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sdp_api.h" 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sdpdefs.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 40ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 41ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function PAN_Register 42ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 43ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the application to register 44ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * its callbacks with PAN profile. The application then 45ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * should set the PAN role explicitly. 46ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 47ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: p_register - contains all callback function pointers 48ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 49ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 50ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns none 51ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 52ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 53911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid PAN_Register(tPAN_REGISTER* p_register) { 54911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetDiscoverability(BTM_GENERAL_DISCOVERABLE, 0, 0); 55911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetConnectability(BTM_CONNECTABLE, 0, 0); 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_register_with_bnep(); 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_register) return; 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 61911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_conn_state_cb = p_register->pan_conn_state_cb; 62911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_bridge_req_cb = p_register->pan_bridge_req_cb; 63911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_data_buf_ind_cb = p_register->pan_data_buf_ind_cb; 64911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_data_ind_cb = p_register->pan_data_ind_cb; 65911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_pfilt_ind_cb = p_register->pan_pfilt_ind_cb; 66911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_mfilt_ind_cb = p_register->pan_mfilt_ind_cb; 67911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_tx_data_flow_cb = p_register->pan_tx_data_flow_cb; 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 69911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 73ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 74ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function PAN_Deregister 75ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 76ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the application to de-register 77ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * its callbacks with PAN profile. This will make the PAN to 78ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * become inactive. This will deregister PAN services from SDP 79ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * and close all active connections 80ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 81ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: none 82ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 83ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 84ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns none 85ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 86ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 87911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid PAN_Deregister(void) { 88911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_bridge_req_cb = NULL; 89911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_data_buf_ind_cb = NULL; 90911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_data_ind_cb = NULL; 91911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_conn_state_cb = NULL; 92911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_pfilt_ind_cb = NULL; 93911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_mfilt_ind_cb = NULL; 94911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 95911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_SetRole(PAN_ROLE_INACTIVE, NULL, NULL, NULL, NULL); 96911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BNEP_Deregister(); 97911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 98911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 102ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 103ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function PAN_SetRole 104ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 105ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the application to set the PAN 106ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * profile role. This should be called after PAN_Register. 107ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * This can be called any time to change the PAN role 108ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 109ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: role - is bit map of roles to be active 110ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * PAN_ROLE_CLIENT is for PANU role 111ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * PAN_ROLE_GN_SERVER is for GN role 112ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * PAN_ROLE_NAP_SERVER is for NAP role 113ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * sec_mask - Security mask for different roles 1149ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * It is array of uint8_t. The bytes 1159ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * represent the security for roles PANU, 1169ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * GN and NAP in order 117ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_user_name - Service name for PANU role 118ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_gn_name - Service name for GN role 119ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_nap_name - Service name for NAP role 1209ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Can be NULL if user wants the default 121ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 122ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns PAN_SUCCESS - if the role is set successfully 123ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * PAN_FAILURE - if the role is not valid 124ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 125ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 126911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontPAN_RESULT PAN_SetRole(uint8_t role, uint8_t* sec_mask, 127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const char* p_user_name, const char* p_gn_name, 128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const char* p_nap_name) { 129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const char* p_desc; 130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t security[3] = {PAN_PANU_SECURITY_LEVEL, PAN_GN_SECURITY_LEVEL, 131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_NAP_SECURITY_LEVEL}; 132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_sec; 133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the role is not a valid combination reject it */ 135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((!(role & 136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (PAN_ROLE_CLIENT | PAN_ROLE_GN_SERVER | PAN_ROLE_NAP_SERVER))) && 137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson role != PAN_ROLE_INACTIVE) { 138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR("PAN role %d is invalid", role); 139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_FAILURE; 140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the current active role is same as the role being set do nothing */ 143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pan_cb.role == role) { 144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_EVENT("PAN role already was set to: %d", role); 145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_SUCCESS; 146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!sec_mask) 149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sec = security; 150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_sec = sec_mask; 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Register all the roles with SDP */ 154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_API("PAN_SetRole() called with role 0x%x", role); 155d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (PAN_SUPPORTS_ROLE_NAP == TRUE) 156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (role & PAN_ROLE_NAP_SERVER) { 157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check the service name */ 158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_nap_name == NULL) || (*p_nap_name == 0)) 159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_nap_name = PAN_NAP_DEFAULT_SERVICE_NAME; 160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Registering for NAP service with SDP */ 162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_desc = PAN_NAP_DEFAULT_DESCRIPTION; 163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pan_cb.pan_nap_sdp_handle != 0) 165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_DeleteRecord(pan_cb.pan_nap_sdp_handle); 166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_nap_sdp_handle = 168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_register_with_sdp(UUID_SERVCLASS_NAP, p_sec[2], p_nap_name, p_desc); 169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bta_sys_add_uuid(UUID_SERVCLASS_NAP); 170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the NAP role is already active and now being cleared delete the record 172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (pan_cb.role & PAN_ROLE_NAP_SERVER) { 174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pan_cb.pan_nap_sdp_handle != 0) { 175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_DeleteRecord(pan_cb.pan_nap_sdp_handle); 176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_nap_sdp_handle = 0; 177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bta_sys_remove_uuid(UUID_SERVCLASS_NAP); 178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 182d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (PAN_SUPPORTS_ROLE_GN == TRUE) 183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (role & PAN_ROLE_GN_SERVER) { 184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check the service name */ 185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_gn_name == NULL) || (*p_gn_name == 0)) 186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_gn_name = PAN_GN_DEFAULT_SERVICE_NAME; 187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Registering for GN service with SDP */ 189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_desc = PAN_GN_DEFAULT_DESCRIPTION; 190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pan_cb.pan_gn_sdp_handle != 0) 192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_DeleteRecord(pan_cb.pan_gn_sdp_handle); 193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_gn_sdp_handle = 195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_register_with_sdp(UUID_SERVCLASS_GN, p_sec[1], p_gn_name, p_desc); 196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bta_sys_add_uuid(UUID_SERVCLASS_GN); 197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the GN role is already active and now being cleared delete the record */ 199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (pan_cb.role & PAN_ROLE_GN_SERVER) { 200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pan_cb.pan_gn_sdp_handle != 0) { 201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_DeleteRecord(pan_cb.pan_gn_sdp_handle); 202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_gn_sdp_handle = 0; 203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bta_sys_remove_uuid(UUID_SERVCLASS_GN); 204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 208d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (PAN_SUPPORTS_ROLE_PANU == TRUE) 209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (role & PAN_ROLE_CLIENT) { 210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check the service name */ 211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_user_name == NULL) || (*p_user_name == 0)) 212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_user_name = PAN_PANU_DEFAULT_SERVICE_NAME; 213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 214911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Registering for PANU service with SDP */ 215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_desc = PAN_PANU_DEFAULT_DESCRIPTION; 216911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pan_cb.pan_user_sdp_handle != 0) 217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_DeleteRecord(pan_cb.pan_user_sdp_handle); 218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_user_sdp_handle = pan_register_with_sdp( 220911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_PANU, p_sec[0], p_user_name, p_desc); 221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bta_sys_add_uuid(UUID_SERVCLASS_PANU); 222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the PANU role is already active and now being cleared delete the record 224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (pan_cb.role & PAN_ROLE_CLIENT) { 226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pan_cb.pan_user_sdp_handle != 0) { 227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_DeleteRecord(pan_cb.pan_user_sdp_handle); 228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pan_user_sdp_handle = 0; 229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bta_sys_remove_uuid(UUID_SERVCLASS_PANU); 230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check if it is a shutdown request */ 235911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (role == PAN_ROLE_INACTIVE) pan_close_all_connections(); 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.role = role; 238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_EVENT("PAN role set to: %d", role); 239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_SUCCESS; 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 243ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 244ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function PAN_Connect 245ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 246ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called by the application to initiate a 247ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * connection to the remote device 248ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 249ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: rem_bda - BD Addr of the remote device 250ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * src_role - Role of the local device for the connection 251ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * dst_role - Role of the remote device for the connection 252ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * PAN_ROLE_CLIENT is for PANU role 253ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * PAN_ROLE_GN_SERVER is for GN role 254ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * PAN_ROLE_NAP_SERVER is for NAP role 255ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * *handle - Pointer for returning Handle to the connection 256ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2579ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Returns PAN_SUCCESS - if the connection is initiated 2589ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * successfully 259ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * PAN_NO_RESOURCES - resources are not sufficent 260ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * PAN_FAILURE - if the connection cannot be initiated 2619ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * this can be because of the combination of 2629ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * src and dst roles may not be valid or 2639ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * allowed at that point of time 264ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 265ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 266911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontPAN_RESULT PAN_Connect(BD_ADDR rem_bda, uint8_t src_role, uint8_t dst_role, 267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t* handle) { 268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tPAN_CONN* pcb; 269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBNEP_RESULT result; 270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBT_UUID src_uuid, dst_uuid; 271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t mx_chan_id; 272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* 274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** Initialize the handle so that in case of failure return values 275911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** the profile will not get confused 276911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *handle = BNEP_INVALID_HANDLE; 278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check if PAN is active or not */ 280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(pan_cb.role & src_role)) { 281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR("PAN is not active for the role %d", src_role); 282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_FAILURE; 283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Validate the parameters before proceeding */ 286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((src_role != PAN_ROLE_CLIENT && src_role != PAN_ROLE_GN_SERVER && 287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson src_role != PAN_ROLE_NAP_SERVER) || 288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (dst_role != PAN_ROLE_CLIENT && dst_role != PAN_ROLE_GN_SERVER && 289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson dst_role != PAN_ROLE_NAP_SERVER)) { 290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR("Either source %d or destination role %d is invalid", 291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson src_role, dst_role); 292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_FAILURE; 293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check if connection exists for this remote device */ 296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pcb = pan_get_pcb_by_addr(rem_bda); 297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If we are PANU for this role validate destination role */ 299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (src_role == PAN_ROLE_CLIENT) { 300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((pan_cb.num_conns > 1) || (pan_cb.num_conns && (!pcb))) { 301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* 302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** If the request is not for existing connection reject it 303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** because if there is already a connection we cannot accept 304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** another connection in PANU role 305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR( 307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Cannot make PANU connections when there are more than one " 308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "connection"); 309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_INVALID_SRC_ROLE; 310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson src_uuid.uu.uuid16 = UUID_SERVCLASS_PANU; 313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (dst_role == PAN_ROLE_CLIENT) { 314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson dst_uuid.uu.uuid16 = UUID_SERVCLASS_PANU; 315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (dst_role == PAN_ROLE_GN_SERVER) { 316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson dst_uuid.uu.uuid16 = UUID_SERVCLASS_GN; 317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson dst_uuid.uu.uuid16 = UUID_SERVCLASS_NAP; 319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson mx_chan_id = dst_uuid.uu.uuid16; 321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If destination is PANU role validate source role */ 323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (dst_role == PAN_ROLE_CLIENT) { 324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pan_cb.num_conns && pan_cb.active_role == PAN_ROLE_CLIENT && !pcb) { 325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR("Device already have a connection in PANU role"); 326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_INVALID_SRC_ROLE; 327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson dst_uuid.uu.uuid16 = UUID_SERVCLASS_PANU; 330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (src_role == PAN_ROLE_GN_SERVER) { 331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson src_uuid.uu.uuid16 = UUID_SERVCLASS_GN; 332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson src_uuid.uu.uuid16 = UUID_SERVCLASS_NAP; 334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 335911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson mx_chan_id = src_uuid.uu.uuid16; 336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* The role combination is not valid */ 338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR( 340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "Source %d and Destination roles %d are not valid combination", 341911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson src_role, dst_role); 342911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_FAILURE; 343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 344911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 345911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Allocate control block and initiate connection */ 346911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!pcb) pcb = pan_allocate_pcb(rem_bda, BNEP_INVALID_HANDLE); 347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!pcb) { 348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR("PAN Connection failed because of no resources"); 349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_NO_RESOURCES; 350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetOutService(rem_bda, BTM_SEC_SERVICE_BNEP_PANU, mx_chan_id); 352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_API("PAN_Connect() for BD Addr %x.%x.%x.%x.%x.%x", rem_bda[0], 354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rem_bda[1], rem_bda[2], rem_bda[3], rem_bda[4], rem_bda[5]); 355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pcb->con_state == PAN_STATE_IDLE) { 356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.num_conns++; 357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (pcb->con_state == PAN_STATE_CONNECTED) { 358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pcb->con_flags |= PAN_FLAGS_CONN_COMPLETED; 359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* PAN connection is still in progress */ 361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_WRONG_STATE; 362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pcb->con_state = PAN_STATE_CONN_START; 364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pcb->prv_src_uuid = pcb->src_uuid; 365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pcb->prv_dst_uuid = pcb->dst_uuid; 366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pcb->src_uuid = src_uuid.uu.uuid16; 368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pcb->dst_uuid = dst_uuid.uu.uuid16; 369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson src_uuid.len = 2; 371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson dst_uuid.len = 2; 372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = BNEP_Connect(rem_bda, &src_uuid, &dst_uuid, &(pcb->handle)); 374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (result != BNEP_SUCCESS) { 375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_release_pcb(pcb); 376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_DEBUG("PAN_Connect() current active role set to %d", src_role); 380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.prv_active_role = pan_cb.active_role; 381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.active_role = src_role; 382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *handle = pcb->handle; 383911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_SUCCESS; 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 387ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 388ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function PAN_Disconnect 389ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 390ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This is used to disconnect the connection 391ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 392ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: handle - handle for the connection 393ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 394ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns PAN_SUCCESS - if the connection is closed successfully 395ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * PAN_FAILURE - if the connection is not found or 396ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * there is an error in disconnecting 397ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 398ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 399911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontPAN_RESULT PAN_Disconnect(uint16_t handle) { 400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tPAN_CONN* pcb; 401911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBNEP_RESULT result; 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check if the connection exists */ 404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pcb = pan_get_pcb_by_handle(handle); 405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!pcb) { 406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR("PAN connection not found for the handle %d", handle); 407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_FAILURE; 408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = BNEP_Disconnect(pcb->handle); 411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pcb->con_state != PAN_STATE_IDLE) pan_cb.num_conns--; 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pan_cb.pan_bridge_req_cb && pcb->src_uuid == UUID_SERVCLASS_NAP) 414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*pan_cb.pan_bridge_req_cb)(pcb->rem_bda, false); 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_release_pcb(pcb); 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (result != BNEP_SUCCESS) { 419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_EVENT("Error in closing PAN connection"); 420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_FAILURE; 421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_EVENT("PAN connection closed"); 424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_SUCCESS; 425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 428ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 429ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function PAN_Write 430ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 431ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This sends data over the PAN connections. If this is called 432ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * on GN or NAP side and the packet is multicast or broadcast 433ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * it will be sent on all the links. Otherwise the correct link 4349ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * is found based on the destination address and forwarded on 4359ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * it. 436ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 437ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: handle - handle for the connection 438ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * dst - MAC or BD Addr of the destination device 439ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * src - MAC or BD Addr of the source who sent this packet 440ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * protocol - protocol of the ethernet packet like IP or ARP 441ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_data - pointer to the data 442ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * len - length of the data 443ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * ext - to indicate that extension headers present 444ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 445ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns PAN_SUCCESS - if the data is sent successfully 446ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * PAN_FAILURE - if the connection is not found or 447ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * there is an error in sending data 448ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 449ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 450911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontPAN_RESULT PAN_Write(uint16_t handle, BD_ADDR dst, BD_ADDR src, 451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t protocol, uint8_t* p_data, uint16_t len, 452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool ext) { 453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pan_cb.role == PAN_ROLE_INACTIVE || !pan_cb.num_conns) { 454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR("%s PAN is not active, data write failed.", __func__); 455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_FAILURE; 456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // If the packet is broadcast or multicast, we're going to have to create 459911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // a copy of the packet for each connection. We can save one extra copy 460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // by fast-pathing here and calling BNEP_Write instead of placing the packet 461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson // in a BT_HDR buffer, calling BNEP_Write, and then freeing the buffer. 462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (dst[0] & 0x01) { 463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < MAX_PAN_CONNS; ++i) { 465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pan_cb.pcb[i].con_state == PAN_STATE_CONNECTED) 466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BNEP_Write(pan_cb.pcb[i].handle, dst, p_data, len, protocol, src, ext); 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_SUCCESS; 469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_HDR* buffer = (BT_HDR*)osi_malloc(PAN_BUF_SIZE); 472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson buffer->len = len; 473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson buffer->offset = PAN_MINIMUM_OFFSET; 474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy((uint8_t*)buffer + sizeof(BT_HDR) + buffer->offset, p_data, 475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson buffer->len); 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_WriteBuf(handle, dst, src, protocol, buffer, ext); 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 481ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 482ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function PAN_WriteBuf 483ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 484ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This sends data over the PAN connections. If this is called 485ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * on GN or NAP side and the packet is multicast or broadcast 486ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * it will be sent on all the links. Otherwise the correct link 4879ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * is found based on the destination address and forwarded on 4889ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * it. If the return value is not PAN_SUCCESS, the application 4899ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * should take care of releasing the message buffer. 490ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 491ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: handle - handle for the connection 492ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * dst - MAC or BD Addr of the destination device 493ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * src - MAC or BD Addr of the source who sent this packet 494ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * protocol - protocol of the ethernet packet like IP or ARP 495ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_buf - pointer to the data buffer 496ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * ext - to indicate that extension headers present 497ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 498ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns PAN_SUCCESS - if the data is sent successfully 499ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * PAN_FAILURE - if the connection is not found or 500ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * there is an error in sending data 501ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 502ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 503911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontPAN_RESULT PAN_WriteBuf(uint16_t handle, BD_ADDR dst, BD_ADDR src, 504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t protocol, BT_HDR* p_buf, bool ext) { 505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tPAN_CONN* pcb; 506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t i; 507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBNEP_RESULT result; 508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pan_cb.role == PAN_ROLE_INACTIVE || (!(pan_cb.num_conns))) { 510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR("PAN is not active Data write failed"); 511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buf); 512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_FAILURE; 513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check if it is broadcast or multicast packet */ 516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (dst[0] & 0x01) { 517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* data = (uint8_t*)p_buf + sizeof(BT_HDR) + p_buf->offset; 518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < MAX_PAN_CONNS; ++i) { 519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pan_cb.pcb[i].con_state == PAN_STATE_CONNECTED) 520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BNEP_Write(pan_cb.pcb[i].handle, dst, data, p_buf->len, protocol, src, 521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ext); 522911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buf); 524911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_SUCCESS; 525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check if the data write is on PANU side */ 528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pan_cb.active_role == PAN_ROLE_CLIENT) { 529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Data write is on PANU connection */ 530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < MAX_PAN_CONNS; i++) { 531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pan_cb.pcb[i].con_state == PAN_STATE_CONNECTED && 532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.pcb[i].src_uuid == UUID_SERVCLASS_PANU) 533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (i == MAX_PAN_CONNS) { 537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR("PAN Don't have any user connections"); 538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buf); 539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_FAILURE; 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = 543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BNEP_WriteBuf(pan_cb.pcb[i].handle, dst, p_buf, protocol, src, ext); 544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (result == BNEP_IGNORE_CMD) { 545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_DEBUG("PAN ignored data write for PANU connection"); 546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (result != BNEP_SUCCESS) { 548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR("PAN failed to write data for the PANU connection"); 549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_DEBUG("PAN successfully wrote data for the PANU connection"); 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return PAN_SUCCESS; 554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* findout to which connection the data is meant for */ 557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pcb = pan_get_pcb_by_handle(handle); 558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!pcb) { 559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR("PAN Buf write for wrong handle"); 560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buf); 561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_FAILURE; 562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (pcb->con_state != PAN_STATE_CONNECTED) { 565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR("PAN Buf write when conn is not active"); 566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buf); 567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_FAILURE; 568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = BNEP_WriteBuf(pcb->handle, dst, p_buf, protocol, src, ext); 571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (result == BNEP_IGNORE_CMD) { 572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_DEBUG("PAN ignored data buf write to PANU"); 573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (result != BNEP_SUCCESS) { 575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR("PAN failed to send data buf to the PANU"); 576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_DEBUG("PAN successfully sent data buf to the PANU"); 580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_SUCCESS; 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 584ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 585ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function PAN_SetProtocolFilters 586ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 587ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is used to set protocol filters on the peer 588ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 589ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: handle - handle for the connection 590ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * num_filters - number of protocol filter ranges 591ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * start - array of starting protocol numbers 592ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * end - array of ending protocol numbers 593ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 594ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 5959ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Returns PAN_SUCCESS if protocol filters are set successfully 5969ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * PAN_FAILURE if connection not found or error in setting 597ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 598ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 599911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontPAN_RESULT PAN_SetProtocolFilters(uint16_t handle, uint16_t num_filters, 600911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t* p_start_array, 601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t* p_end_array) { 602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tPAN_CONN* pcb; 603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tPAN_RESULT result; 604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check if the connection exists */ 606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pcb = pan_get_pcb_by_handle(handle); 607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!pcb) { 608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR("PAN connection not found for the handle %d", handle); 609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_FAILURE; 610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = BNEP_SetProtocolFilters(pcb->handle, num_filters, p_start_array, 613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_end_array); 614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (result != BNEP_SUCCESS) { 615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR("PAN failed to set protocol filters for handle %d", handle); 616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_API("PAN successfully sent protocol filters for handle %d", handle); 620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_SUCCESS; 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 624ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 625ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function PAN_SetMulticastFilters 626ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 627ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is used to set multicast filters on the peer 628ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 629ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: handle - handle for the connection 630ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * num_filters - number of multicast filter ranges 631ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * start - array of starting multicast filter addresses 632ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * end - array of ending multicast filter addresses 633ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 634ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6359ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Returns PAN_SUCCESS if multicast filters are set successfully 6369ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * PAN_FAILURE if connection not found or error in setting 637ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 638ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 639911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBNEP_RESULT PAN_SetMulticastFilters(uint16_t handle, 640911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t num_mcast_filters, 641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_start_array, 642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_end_array) { 643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tPAN_CONN* pcb; 644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tPAN_RESULT result; 645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check if the connection exists */ 647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pcb = pan_get_pcb_by_handle(handle); 648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!pcb) { 649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR("PAN connection not found for the handle %d", handle); 650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_FAILURE; 651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = BNEP_SetMulticastFilters(pcb->handle, num_mcast_filters, 654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_start_array, p_end_array); 655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (result != BNEP_SUCCESS) { 656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_ERROR("PAN failed to set multicast filters for handle %d", 657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson handle); 658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 659911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 661911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson PAN_TRACE_API("PAN successfully sent multicast filters for handle %d", 662911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson handle); 663911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return PAN_SUCCESS; 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 667ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 668ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function PAN_SetTraceLevel 669ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 670ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function sets the trace level for PAN. If called with 671ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * a value of 0xFF, it simply reads the current trace level. 672ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 673ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns the new (current) trace level 674ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 675ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t PAN_SetTraceLevel(uint8_t new_level) { 677911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (new_level != 0xFF) 678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.trace_level = new_level; 679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_dump_status(); 681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (pan_cb.trace_level); 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 686ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 687ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function PAN_Init 688ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 689ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function initializes the PAN module variables 690ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 691ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: none 692ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 693ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns none 694ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 695ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid PAN_Init(void) { 697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(&pan_cb, 0, sizeof(tPAN_CB)); 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(PAN_INITIAL_TRACE_LEVEL) 700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.trace_level = PAN_INITIAL_TRACE_LEVEL; 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pan_cb.trace_level = BT_TRACE_LEVEL_NONE; /* No traces */ 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 705