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