1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu *  Copyright (C) 2010-2014 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  This file contains the LLCP Service Discovery
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h"
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_target.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "bt_types.h"
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llcp_api.h"
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llcp_int.h"
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llcp_defs.h"
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_sdp_proc_data
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Do nothing
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid llcp_sdp_proc_data (tLLCP_SAP_CBACK_DATA *p_data)
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /*
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** Do nothing
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ** llcp_sdp_proc_SNL () is called by link layer
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    */
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_sdp_check_send_snl
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Enqueue Service Name Lookup PDU into sig_xmit_q for transmitting
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid llcp_sdp_check_send_snl (void)
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 *p;
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.sdp_cb.p_snl)
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_DEBUG0 ("SDP: llcp_sdp_check_send_snl ()");
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.sdp_cb.p_snl->len     += LLCP_PDU_HEADER_SIZE;
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.sdp_cb.p_snl->offset  -= LLCP_PDU_HEADER_SIZE;
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p = (UINT8 *) (llcp_cb.sdp_cb.p_snl + 1) + llcp_cb.sdp_cb.p_snl->offset;
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_BE_STREAM (p, LLCP_GET_PDU_HEADER (LLCP_SAP_SDP, LLCP_PDU_SNL_TYPE, LLCP_SAP_SDP ));
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_enqueue (&llcp_cb.lcb.sig_xmit_q, llcp_cb.sdp_cb.p_snl);
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.sdp_cb.p_snl = NULL;
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_sdp_add_sdreq
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Add Service Discovery Request into SNL PDU
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_sdp_add_sdreq (UINT8 tid, char *p_name)
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8  *p;
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16 name_len = (UINT16) strlen (p_name);
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = (UINT8 *) (llcp_cb.sdp_cb.p_snl + 1) + llcp_cb.sdp_cb.p_snl->offset + llcp_cb.sdp_cb.p_snl->len;
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_SDREQ_TYPE);
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, (1 + name_len));
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, tid);
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ARRAY_TO_BE_STREAM (p, p_name, name_len);
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.sdp_cb.p_snl->len += LLCP_SDREQ_MIN_LEN + name_len;
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_sdp_send_sdreq
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Service Discovery Request
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttLLCP_STATUS llcp_sdp_send_sdreq (UINT8 tid, char *p_name)
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_STATUS status;
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16       name_len;
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16       available_bytes;
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_DEBUG2 ("llcp_sdp_send_sdreq (): tid=0x%x, ServiceName=%s", tid, p_name);
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if there is no pending SNL */
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!llcp_cb.sdp_cb.p_snl)
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.sdp_cb.p_snl = (BT_HDR*) GKI_getpoolbuf (LLCP_POOL_ID);
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (llcp_cb.sdp_cb.p_snl)
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.sdp_cb.p_snl->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE + LLCP_PDU_HEADER_SIZE;
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.sdp_cb.p_snl->len    = 0;
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.sdp_cb.p_snl)
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        available_bytes = GKI_get_buf_size (llcp_cb.sdp_cb.p_snl)
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          - BT_HDR_SIZE - llcp_cb.sdp_cb.p_snl->offset
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          - llcp_cb.sdp_cb.p_snl->len;
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        name_len = (UINT16) strlen (p_name);
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if SDREQ parameter can be added in SNL */
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (available_bytes >= LLCP_SDREQ_MIN_LEN + name_len)
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(llcp_cb.sdp_cb.p_snl->len + LLCP_SDREQ_MIN_LEN + name_len <= llcp_cb.lcb.effective_miu)  )
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_sdp_add_sdreq (tid, p_name);
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status = LLCP_STATUS_SUCCESS;
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* send pending SNL PDU to LM */
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_sdp_check_send_snl ();
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.sdp_cb.p_snl = (BT_HDR*) GKI_getpoolbuf (LLCP_POOL_ID);
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (llcp_cb.sdp_cb.p_snl)
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_cb.sdp_cb.p_snl->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE + LLCP_PDU_HEADER_SIZE;
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_cb.sdp_cb.p_snl->len    = 0;
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_sdp_add_sdreq (tid, p_name);
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                status = LLCP_STATUS_SUCCESS;
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                status = LLCP_STATUS_FAIL;
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = LLCP_STATUS_FAIL;
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if LM is waiting for PDUs from upper layer */
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (status == LLCP_STATUS_SUCCESS)
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(llcp_cb.lcb.symm_state == LLCP_LINK_SYMM_LOCAL_XMIT_NEXT)  )
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_link_check_send_data ();
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_sdp_add_sdres
191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Add Service Discovery Response into SNL PDU
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_sdp_add_sdres (UINT8 tid, UINT8 sap)
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8  *p;
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p = (UINT8 *) (llcp_cb.sdp_cb.p_snl + 1) + llcp_cb.sdp_cb.p_snl->offset + llcp_cb.sdp_cb.p_snl->len;
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_SDRES_TYPE);
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_SDRES_LEN);
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, tid);
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, sap);
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.sdp_cb.p_snl->len += 2 + LLCP_SDRES_LEN;   /* type and length */
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_sdp_send_sdres
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send Service Discovery Response
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic tLLCP_STATUS llcp_sdp_send_sdres (UINT8 tid, UINT8 sap)
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_STATUS status;
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16       available_bytes;
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_DEBUG2 ("llcp_sdp_send_sdres (): tid=0x%x, SAP=0x%x", tid, sap);
228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if there is no pending SNL */
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!llcp_cb.sdp_cb.p_snl)
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.sdp_cb.p_snl = (BT_HDR*) GKI_getpoolbuf (LLCP_POOL_ID);
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (llcp_cb.sdp_cb.p_snl)
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.sdp_cb.p_snl->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE + LLCP_PDU_HEADER_SIZE;
237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.sdp_cb.p_snl->len    = 0;
238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.sdp_cb.p_snl)
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        available_bytes = GKI_get_buf_size (llcp_cb.sdp_cb.p_snl)
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          - BT_HDR_SIZE - llcp_cb.sdp_cb.p_snl->offset
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          - llcp_cb.sdp_cb.p_snl->len;
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if SDRES parameter can be added in SNL */
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (available_bytes >= 2 + LLCP_SDRES_LEN)
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(llcp_cb.sdp_cb.p_snl->len + 2 + LLCP_SDRES_LEN <= llcp_cb.lcb.effective_miu)  )
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_sdp_add_sdres (tid, sap);
252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status = LLCP_STATUS_SUCCESS;
253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* send pending SNL PDU to LM */
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_sdp_check_send_snl ();
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.sdp_cb.p_snl = (BT_HDR*) GKI_getpoolbuf (LLCP_POOL_ID);
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (llcp_cb.sdp_cb.p_snl)
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_cb.sdp_cb.p_snl->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE + LLCP_PDU_HEADER_SIZE;
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_cb.sdp_cb.p_snl->len    = 0;
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_sdp_add_sdres (tid, sap);
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                status = LLCP_STATUS_SUCCESS;
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                status = LLCP_STATUS_FAIL;
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = LLCP_STATUS_FAIL;
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if LM is waiting for PDUs from upper layer */
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (status == LLCP_STATUS_SUCCESS)
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(llcp_cb.lcb.symm_state == LLCP_LINK_SYMM_LOCAL_XMIT_NEXT)  )
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_link_check_send_data ();
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_sdp_get_sap_by_name
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Search SAP by service name
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          SAP if success
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 llcp_sdp_get_sap_by_name (char *p_name, UINT8 length)
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8        sap;
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_APP_CB *p_app_cb;
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (sap = LLCP_SAP_SDP; sap <= LLCP_UPPER_BOUND_SDP_SAP; sap++)
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_app_cb = llcp_util_get_app_cb (sap);
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (p_app_cb)
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(p_app_cb->p_app_cback)
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(strlen((char*)p_app_cb->p_service_name) == length)
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(!strncmp((char*)p_app_cb->p_service_name, p_name, length))  )
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return (sap);
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return 0;
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_sdp_return_sap
324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Report TID and SAP to requester
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_sdp_return_sap (UINT8 tid, UINT8 sap)
332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 i;
334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_DEBUG2 ("llcp_sdp_return_sap (): tid=0x%x, SAP=0x%x", tid, sap);
336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (i = 0; i < LLCP_MAX_SDP_TRANSAC; i++)
338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (llcp_cb.sdp_cb.transac[i].p_cback)
340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(llcp_cb.sdp_cb.transac[i].tid == tid)  )
341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*llcp_cb.sdp_cb.transac[i].p_cback) (tid, sap);
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.sdp_cb.transac[i].p_cback = NULL;
345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_sdp_proc_deactivation
352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Report SDP failure for any pending request because of deactivation
354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid llcp_sdp_proc_deactivation (void)
360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 i;
362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_DEBUG0 ("llcp_sdp_proc_deactivation ()");
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (i = 0; i < LLCP_MAX_SDP_TRANSAC; i++)
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (llcp_cb.sdp_cb.transac[i].p_cback)
368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*llcp_cb.sdp_cb.transac[i].p_cback) (llcp_cb.sdp_cb.transac[i].tid, 0x00);
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.sdp_cb.transac[i].p_cback = NULL;
372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* free any pending SNL PDU */
376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.sdp_cb.p_snl)
377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (llcp_cb.sdp_cb.p_snl);
379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.sdp_cb.p_snl = NULL;
380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.sdp_cb.next_tid = 0;
383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         llcp_sdp_proc_snl
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process SDREQ and SDRES in SNL
390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttLLCP_STATUS llcp_sdp_proc_snl (UINT16 sdu_length, UINT8 *p)
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8  type, length, tid, sap, *p_value;
398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_DEBUG0 ("llcp_sdp_proc_snl ()");
400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((llcp_cb.lcb.agreed_major_version < LLCP_MIN_SNL_MAJOR_VERSION)||
402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project       ((llcp_cb.lcb.agreed_major_version == LLCP_MIN_SNL_MAJOR_VERSION)&&(llcp_cb.lcb.agreed_minor_version < LLCP_MIN_SNL_MINOR_VERSION)))
403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_DEBUG0 ("llcp_sdp_proc_snl(): version number less than 1.1, SNL not supported.");
405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_FAIL;
406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (sdu_length >= 2) /* at least type and length */
408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        BE_STREAM_TO_UINT8 (type, p);
410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        BE_STREAM_TO_UINT8 (length, p);
411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        switch (type)
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case LLCP_SDREQ_TYPE:
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (  (length > 1)                /* TID and sevice name */
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                &&(sdu_length >= 2 + length)  ) /* type, length, TID and service name */
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_value = p;
419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                BE_STREAM_TO_UINT8 (tid, p_value);
420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                sap = llcp_sdp_get_sap_by_name ((char*) p_value, (UINT8) (length - 1));
421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_sdp_send_sdres (tid, sap);
422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                LLCP_TRACE_ERROR1 ("llcp_sdp_proc_snl (): bad length (%d) in LLCP_SDREQ_TYPE", length);
426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        case LLCP_SDRES_TYPE:
430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (  (length == LLCP_SDRES_LEN)  /* TID and SAP */
431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                &&(sdu_length >= 2 + length)  ) /* type, length, TID and SAP */
432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_value = p;
434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                BE_STREAM_TO_UINT8 (tid, p_value);
435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                BE_STREAM_TO_UINT8 (sap, p_value);
436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_sdp_return_sap (tid, sap);
437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                LLCP_TRACE_ERROR1 ("llcp_sdp_proc_snl (): bad length (%d) in LLCP_SDRES_TYPE", length);
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        default:
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            LLCP_TRACE_WARNING1 ("llcp_sdp_proc_snl (): Unknown type (0x%x) is ignored", type);
446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (sdu_length >= 2 + length)   /* type, length, value */
450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            sdu_length -= 2 + length;
452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p += length;
453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (sdu_length)
461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("llcp_sdp_proc_snl (): Bad format of SNL");
463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_FAIL;
464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_SUCCESS;
468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
470