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