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