16ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 26ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 36ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Copyright (C) 1999-2012 Broadcom Corporation 46ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 56ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Licensed under the Apache License, Version 2.0 (the "License"); 66ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * you may not use this file except in compliance with the License. 76ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * You may obtain a copy of the License at: 86ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 96ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * http://www.apache.org/licenses/LICENSE-2.0 106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Unless required by applicable law or agreed to in writing, software 126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * distributed under the License is distributed on an "AS IS" BASIS, 136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * See the License for the specific language governing permissions and 156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * limitations under the License. 166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/***************************************************************************** 206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * This file contains main functions to support PAN profile 226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * commands and events. 236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 246ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *****************************************************************************/ 25e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <string.h> 27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <stdio.h> 28e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "gki.h" 29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bnep_api.h" 30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "pan_api.h" 31e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "pan_int.h" 32e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "sdp_api.h" 33e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "sdpdefs.h" 34e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "l2c_api.h" 35e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "hcidefs.h" 36e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btm_api.h" 37e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic const UINT8 pan_proto_elem_data[] = { 40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 0x35, 0x18, /* data element sequence of length 0x18 bytes */ 41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 0x35, 0x06, /* data element sequence for L2CAP descriptor */ 42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 0x19, 0x01, 0x00, /* UUID for L2CAP - 0x0100 */ 43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 0x09, 0x00, 0x0F, /* PSM for BNEP - 0x000F */ 44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 0x35, 0x0E, /* data element seqence for BNEP descriptor */ 45e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 0x19, 0x00, 0x0F, /* UUID for BNEP - 0x000F */ 46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 0x09, 0x01, 0x00, /* BNEP specific parameter 0 -- Version of BNEP = version 1 = 0x0001 */ 47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 0x35, 0x06, /* BNEP specific parameter 1 -- Supported network packet type list */ 48e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 0x09, 0x08, 0x00, /* network packet type IPv4 = 0x0800 */ 49e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 0x09, 0x08, 0x06 /* network packet type ARP = 0x0806 */ 50e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}; 51e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 53e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function pan_register_with_sdp 55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 566ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description 57e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 586ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns 59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 60e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 61e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT32 pan_register_with_sdp (UINT16 uuid, UINT8 sec_mask, char *p_name, char *p_desc) 62e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 63e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT32 sdp_handle; 64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 browse_list = UUID_SERVCLASS_PUBLIC_BROWSE_GROUP; 65e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 security = 0; 66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 availability; 67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT32 proto_len = (UINT32)pan_proto_elem_data[1]; 68e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 69e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Create a record */ 70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sdp_handle = SDP_CreateRecord (); 71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 72e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (sdp_handle == 0) 73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach PAN_TRACE_ERROR0 ("PAN_SetRole - could not create SDP record"); 75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return 0; 76e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Service Class ID List */ 79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SDP_AddServiceClassIdList (sdp_handle, 1, &uuid); 80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 81e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Add protocol element sequence from the constant string */ 82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SDP_AddAttribute (sdp_handle, ATTR_ID_PROTOCOL_DESC_LIST, DATA_ELE_SEQ_DESC_TYPE, 83e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach proto_len, (UINT8 *)(pan_proto_elem_data+2)); 84e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 85e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach// btla-specific ++ 86e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if 0 87e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach availability = 0xFF; 88e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SDP_AddAttribute (sdp_handle, ATTR_ID_SERVICE_AVAILABILITY, UINT_DESC_TYPE, 1, &availability); 896ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach#endif 90e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach// btla-specific -- 91e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 92e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Language base */ 93e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SDP_AddLanguageBaseAttrIDList (sdp_handle, LANG_ID_CODE_ENGLISH, LANG_ID_CHAR_ENCODE_UTF8, LANGUAGE_BASE_ID); 94e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Profile descriptor list */ 96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SDP_AddProfileDescriptorList (sdp_handle, uuid, PAN_PROFILE_VERSION); 97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 98e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Service Name */ 99e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SDP_AddAttribute (sdp_handle, ATTR_ID_SERVICE_NAME, TEXT_STR_DESC_TYPE, 100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (UINT8) (strlen(p_name) + 1), (UINT8 *)p_name); 101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Service description */ 103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SDP_AddAttribute (sdp_handle, ATTR_ID_SERVICE_DESCRIPTION, TEXT_STR_DESC_TYPE, 104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (UINT8) (strlen(p_desc) + 1), (UINT8 *)p_desc); 105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Security description */ 1076ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if (sec_mask) 108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16_TO_BE_FIELD(&security, 0x0001); 110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SDP_AddAttribute (sdp_handle, ATTR_ID_SECURITY_DESCRIPTION, UINT_DESC_TYPE, 2, (UINT8 *)&security); 112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined (PAN_SUPPORTS_ROLE_NAP) && PAN_SUPPORTS_ROLE_NAP == TRUE) 114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (uuid == UUID_SERVCLASS_NAP) 115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 NetAccessType = 0x0005; /* Ethernet */ 117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT32 NetAccessRate = 0x0001312D0; /* 10Mb/sec */ 118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 array[10], *p; 119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Net access type. */ 121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p = array; 122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16_TO_BE_STREAM (p, NetAccessType); 123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SDP_AddAttribute (sdp_handle, ATTR_ID_NET_ACCESS_TYPE, UINT_DESC_TYPE, 2, array); 124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Net access rate. */ 126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p = array; 127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT32_TO_BE_STREAM (p, NetAccessRate); 128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SDP_AddAttribute (sdp_handle, ATTR_ID_MAX_NET_ACCESS_RATE, UINT_DESC_TYPE, 4, array); 129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Register with Security Manager for the specific security level */ 1316ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if ((!BTM_SetSecurityLevel (TRUE, p_name, BTM_SEC_SERVICE_BNEP_NAP, 132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_mask, BT_PSM_BNEP, BTM_SEC_PROTO_BNEP, UUID_SERVCLASS_NAP)) 1336ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach || (!BTM_SetSecurityLevel (FALSE, p_name, BTM_SEC_SERVICE_BNEP_NAP, 134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_mask, BT_PSM_BNEP, BTM_SEC_PROTO_BNEP, UUID_SERVCLASS_NAP))) 135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach PAN_TRACE_ERROR0 ("PAN Security Registration failed for PANU"); 137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined (PAN_SUPPORTS_ROLE_GN) && PAN_SUPPORTS_ROLE_GN == TRUE) 141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (uuid == UUID_SERVCLASS_GN) 142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1436ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if ((!BTM_SetSecurityLevel (TRUE, p_name, BTM_SEC_SERVICE_BNEP_GN, 144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_mask, BT_PSM_BNEP, BTM_SEC_PROTO_BNEP, UUID_SERVCLASS_GN)) 1456ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach || (!BTM_SetSecurityLevel (FALSE, p_name, BTM_SEC_SERVICE_BNEP_GN, 146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_mask, BT_PSM_BNEP, BTM_SEC_PROTO_BNEP, UUID_SERVCLASS_GN))) 147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach PAN_TRACE_ERROR0 ("PAN Security Registration failed for GN"); 149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined (PAN_SUPPORTS_ROLE_PANU) && PAN_SUPPORTS_ROLE_PANU == TRUE) 153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (uuid == UUID_SERVCLASS_PANU) 154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 1556ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if ((!BTM_SetSecurityLevel (TRUE, p_name, BTM_SEC_SERVICE_BNEP_PANU, 156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_mask, BT_PSM_BNEP, BTM_SEC_PROTO_BNEP, UUID_SERVCLASS_PANU)) 1576ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach || (!BTM_SetSecurityLevel (FALSE, p_name, BTM_SEC_SERVICE_BNEP_PANU, 158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sec_mask, BT_PSM_BNEP, BTM_SEC_PROTO_BNEP, UUID_SERVCLASS_PANU))) 159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach PAN_TRACE_ERROR0 ("PAN Security Registration failed for PANU"); 161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Make the service browsable */ 166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SDP_AddUuidSequence (sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, &browse_list); 167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return sdp_handle; 170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function pan_allocate_pcb 177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1786ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description 179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1806ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns 181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 183e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtPAN_CONN *pan_allocate_pcb (BD_ADDR p_bda, UINT16 handle) 184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 i; 186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i=0; i<MAX_PAN_CONNS; i++) 188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (pan_cb.pcb[i].con_state != PAN_STATE_IDLE && 190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach pan_cb.pcb[i].handle == handle) 191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return NULL; 192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i=0; i<MAX_PAN_CONNS; i++) 195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (pan_cb.pcb[i].con_state != PAN_STATE_IDLE && 197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcmp (pan_cb.pcb[i].rem_bda, p_bda, BD_ADDR_LEN) == 0) 198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return NULL; 199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i=0; i<MAX_PAN_CONNS; i++) 202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (pan_cb.pcb[i].con_state == PAN_STATE_IDLE) 204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset (&(pan_cb.pcb[i]), 0, sizeof (tPAN_CONN)); 206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy (pan_cb.pcb[i].rem_bda, p_bda, BD_ADDR_LEN); 207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach pan_cb.pcb[i].handle = handle; 208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return &(pan_cb.pcb[i]); 209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return NULL; 212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function pan_get_pcb_by_handle 218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description 220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns 222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 224e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtPAN_CONN *pan_get_pcb_by_handle (UINT16 handle) 225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 i; 227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i=0; i<MAX_PAN_CONNS; i++) 229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (pan_cb.pcb[i].con_state != PAN_STATE_IDLE && 231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach pan_cb.pcb[i].handle == handle) 232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return &(pan_cb.pcb[i]); 233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return NULL; 236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function pan_get_pcb_by_addr 242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2436ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description 244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2456ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns 246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 248e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtPAN_CONN *pan_get_pcb_by_addr (BD_ADDR p_bda) 249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 i; 251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i=0; i<MAX_PAN_CONNS; i++) 253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (pan_cb.pcb[i].con_state == PAN_STATE_IDLE) 255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach continue; 256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (memcmp (pan_cb.pcb[i].rem_bda, p_bda, BD_ADDR_LEN) == 0) 258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return &(pan_cb.pcb[i]); 259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* 261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (pan_cb.pcb[i].mfilter_present && 262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (memcmp (p_bda, pan_cb.pcb[i].multi_cast_bridge, BD_ADDR_LEN) == 0)) 263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return &(pan_cb.pcb[i]); 264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach */ 265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return NULL; 268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function pan_close_all_connections 276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2776ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description 278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid pan_close_all_connections (void) 283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 i; 285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i=0; i<MAX_PAN_CONNS; i++) 287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (pan_cb.pcb[i].con_state != PAN_STATE_IDLE) 289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BNEP_Disconnect (pan_cb.pcb[i].handle); 291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach pan_cb.pcb[i].con_state = PAN_STATE_IDLE; 292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach pan_cb.active_role = PAN_ROLE_INACTIVE; 296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach pan_cb.num_conns = 0; 297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function pan_release_pcb 304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function releases a PCB. 306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid pan_release_pcb (tPAN_CONN *p_pcb) 311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* Drop any response pointer we may be holding */ 313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset (p_pcb, 0, sizeof (tPAN_CONN)); 314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_pcb->con_state = PAN_STATE_IDLE; 315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function pan_dump_status 321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function dumps the pan control block and connection 323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** blocks information 324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns none 326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid pan_dump_status (void) 329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined (PAN_SUPPORTS_DEBUG_DUMP) && PAN_SUPPORTS_DEBUG_DUMP == TRUE) 331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 i; 332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach char buff[200]; 333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tPAN_CONN *p_pcb; 334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach PAN_TRACE_DEBUG3 ("PAN role %x, active role %d, num_conns %d", 336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach pan_cb.role, pan_cb.active_role, pan_cb.num_conns); 337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i = 0, p_pcb = pan_cb.pcb; i < MAX_PAN_CONNS; i++, p_pcb++) 339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach sprintf (buff, "%d state %d, handle %d, src 0x%x, dst 0x%x, BD %x.%x.%x.%x.%x.%x", 341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach i, p_pcb->con_state, p_pcb->handle, p_pcb->src_uuid, p_pcb->dst_uuid, 342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_pcb->rem_bda[0], p_pcb->rem_bda[1], p_pcb->rem_bda[2], 343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_pcb->rem_bda[3], p_pcb->rem_bda[4], p_pcb->rem_bda[5]); 344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach PAN_TRACE_DEBUG0 (buff); 346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 352