sdp_discovery.cc revision 9ca07091a1f07ea201cee0504dab6a1d7073d429
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 1999-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  this file contains SDP discovery functions
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h>
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
30258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2cdefs.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcidefs.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sdp_api.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sdpint.h"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef SDP_DEBUG_RAW
41d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#define SDP_DEBUG_RAW       false
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/
459ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson/*            L O C A L    F U N C T I O N     P R O T O T Y P E S            */
46ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/
47d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SDP_CLIENT_ENABLED == TRUE)
48d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenstatic void          process_service_search_rsp (tCONN_CB *p_ccb, uint8_t *p_reply);
49d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenstatic void          process_service_attr_rsp (tCONN_CB *p_ccb, uint8_t *p_reply);
50d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenstatic void          process_service_search_attr_rsp (tCONN_CB *p_ccb, uint8_t *p_reply);
51d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenstatic uint8_t       *save_attr_seq (tCONN_CB *p_ccb, uint8_t *p, uint8_t *p_msg_end);
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tSDP_DISC_REC *add_record (tSDP_DISCOVERY_DB *p_db, BD_ADDR p_bda);
53d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenstatic uint8_t       *add_attr (uint8_t *p, tSDP_DISCOVERY_DB *p_db, tSDP_DISC_REC *p_rec,
54d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen                                uint16_t attr_id, tSDP_DISC_ATTR *p_parent_attr, uint8_t nest_level);
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Safety check in case we go crazy */
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MAX_NEST_LEVELS     5
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovextern fixed_queue_t *btu_general_alarm_queue;
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
62ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
63ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_build_uuid_seq
64ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
65ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function builds a UUID sequence from the list of
66ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  passed UUIDs. It is also passed the address of the output
67ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  buffer.
68ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
69ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          Pointer to next byte in the output buffer.
70ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
71ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
72d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenstatic uint8_t *sdpu_build_uuid_seq (uint8_t *p_out, uint16_t num_uuids, tSDP_UUID *p_uuid_list)
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
74d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t xx;
75d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t *p_len;
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First thing is the data element header */
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM  (p_out, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Remember where the length goes. Leave space for it. */
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_len = p_out;
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_out += 1;
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Now, loop through and put in all the UUID(s) */
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < num_uuids; xx++, p_uuid_list++)
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_uuid_list->len == 2)
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM  (p_out, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES);
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT16_TO_BE_STREAM (p_out, p_uuid_list->uu.uuid16);
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_uuid_list->len == 4)
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM  (p_out, (UUID_DESC_TYPE << 3) | SIZE_FOUR_BYTES);
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT32_TO_BE_STREAM (p_out, p_uuid_list->uu.uuid32);
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM (p_out, (UUID_DESC_TYPE << 3) | SIZE_SIXTEEN_BYTES);
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_BE_STREAM (p_out, p_uuid_list->uu.uuid128, p_uuid_list->len);
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Now, put in the length */
105d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    xx = (uint16_t)(p_out - p_len - 1);
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM (p_len, xx);
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p_out);
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
112ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
113ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdp_snd_service_search_req
114ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
115ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Send a service search request to the SDP server.
116ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
117ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
118ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
119ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
120d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenstatic void sdp_snd_service_search_req(tCONN_CB *p_ccb, uint8_t cont_len, uint8_t * p_cont)
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
122d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t         *p, *p_start, *p_param_len;
123cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov    BT_HDR          *p_cmd = (BT_HDR *) osi_malloc(SDP_DATA_BUF_SIZE);
124d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t        param_len;
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
126717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov    /* Prepare the buffer for sending the packet to L2CAP */
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cmd->offset = L2CAP_MIN_OFFSET;
128d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    p = p_start = (uint8_t *)(p_cmd + 1) + L2CAP_MIN_OFFSET;
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Build a service search request packet */
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM  (p, SDP_PDU_SERVICE_SEARCH_REQ);
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p, p_ccb->transaction_id);
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->transaction_id++;
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Skip the length, we need to add it at the end */
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_param_len = p;
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p += 2;
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Build the UID sequence. */
140d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SDP_BROWSE_PLUS == TRUE)
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = sdpu_build_uuid_seq (p, 1, &p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx]);
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = sdpu_build_uuid_seq (p, p_ccb->p_db->num_uuid_filters, p_ccb->p_db->uuid_filters);
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Set max service record count */
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p, sdp_cb.max_recs_per_search);
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Set continuation state */
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM (p, cont_len);
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if this is not the first request */
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(cont_len && p_cont)
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(p, p_cont, cont_len);
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += cont_len;
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Go back and put the parameter length into the buffer */
160d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    param_len = (uint16_t)(p - p_param_len - 2);
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p_param_len, param_len);
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->disc_state = SDP_DISC_WAIT_HANDLES;
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Set the length of the SDP data in the buffer */
166d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    p_cmd->len = (uint16_t)(p - p_start);
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_DEBUG_RAW == TRUE)
169a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    SDP_TRACE_WARNING("sdp_snd_service_search_req cont_len :%d disc_state:%d",cont_len, p_ccb->disc_state);
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CA_DataWrite (p_ccb->connection_id, p_cmd);
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Start inactivity timer */
17678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    alarm_set_on_queue(p_ccb->sdp_conn_timer, SDP_INACT_TIMEOUT_MS,
17778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                       sdp_conn_timer_timeout, p_ccb, btu_general_alarm_queue);
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
181ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
182ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdp_disc_connected
183ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
184ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when an SDP discovery attempt is
185ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  connected.
186ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
187ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
188ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
189ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid sdp_disc_connected (tCONN_CB *p_ccb)
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->is_attr_search)
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->disc_state = SDP_DISC_WAIT_SEARCH_ATTR;
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
196ac4959255ecb1f6b377ee9d1173bf06ea7a3f4dcMike J. Chen        process_service_search_attr_rsp (p_ccb, NULL);
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* First step is to get a list of the handles from the server. */
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* We are not searching for a specific attribute, so we will   */
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* first search for the service, then get all attributes of it */
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->num_handles = 0;
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sdp_snd_service_search_req(p_ccb, 0, NULL);
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
211ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
212ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdp_disc_server_rsp
213ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
214ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when there is a response from
215ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  the server.
216ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
219ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid sdp_disc_server_rsp (tCONN_CB *p_ccb, BT_HDR *p_msg)
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
222d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t         *p, rsp_pdu;
223d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    bool            invalid_pdu = true;
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_DEBUG_RAW == TRUE)
226a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    SDP_TRACE_WARNING("sdp_disc_server_rsp disc_state:%d", p_ccb->disc_state);
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* stop inactivity timer when we receive a response */
23078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    alarm_cancel(p_ccb->sdp_conn_timer);
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Got a reply!! Check what we got back */
233d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    p = (uint8_t *)(p_msg + 1) + p_msg->offset;
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BE_STREAM_TO_UINT8 (rsp_pdu, p);
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_msg->len--;
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (rsp_pdu)
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SDP_PDU_SERVICE_SEARCH_RSP:
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->disc_state == SDP_DISC_WAIT_HANDLES)
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
244ac4959255ecb1f6b377ee9d1173bf06ea7a3f4dcMike J. Chen            process_service_search_rsp (p_ccb, p);
245d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen            invalid_pdu = false;
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SDP_PDU_SERVICE_ATTR_RSP:
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->disc_state == SDP_DISC_WAIT_ATTR)
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
252ac4959255ecb1f6b377ee9d1173bf06ea7a3f4dcMike J. Chen            process_service_attr_rsp (p_ccb, p);
253d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen            invalid_pdu = false;
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SDP_PDU_SERVICE_SEARCH_ATTR_RSP:
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->disc_state == SDP_DISC_WAIT_SEARCH_ATTR)
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
260ac4959255ecb1f6b377ee9d1173bf06ea7a3f4dcMike J. Chen            process_service_search_attr_rsp (p_ccb, p);
261d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen            invalid_pdu = false;
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (invalid_pdu)
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
268a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING ("SDP - Unexp. PDU: %d in state: %d", rsp_pdu, p_ccb->disc_state);
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sdp_disconnect (p_ccb, SDP_GENERIC_ERROR);
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
274ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
275ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         process_service_search_rsp
276ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
277ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when there is a search response from
278ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  the server.
279ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
280ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
281ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
282ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
283d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenstatic void process_service_search_rsp (tCONN_CB *p_ccb, uint8_t *p_reply)
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
285d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t    xx;
286d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t    total, cur_handles, orig;
287d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t     cont_len;
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Skip transaction, and param len */
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_reply += 4;
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BE_STREAM_TO_UINT16 (total, p_reply);
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BE_STREAM_TO_UINT16 (cur_handles, p_reply);
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    orig = p_ccb->num_handles;
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->num_handles += cur_handles;
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->num_handles == 0)
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
298a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING ("SDP - Rcvd ServiceSearchRsp, no matches");
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sdp_disconnect (p_ccb, SDP_NO_RECS_MATCH);
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save the handles that match. We will can only process a certain number. */
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (total > sdp_cb.max_recs_per_search)
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        total = sdp_cb.max_recs_per_search;
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->num_handles > sdp_cb.max_recs_per_search)
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->num_handles = sdp_cb.max_recs_per_search;
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = orig; xx < p_ccb->num_handles; xx++)
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT32 (p_ccb->handles[xx], p_reply);
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BE_STREAM_TO_UINT8 (cont_len, p_reply);
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(cont_len != 0)
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(cont_len > SDP_MAX_CONTINUATION_LEN)
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sdp_disconnect (p_ccb, SDP_INVALID_CONT_STATE);
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* stay in the same state */
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sdp_snd_service_search_req(p_ccb, cont_len, p_reply);
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* change state */
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->disc_state = SDP_DISC_WAIT_ATTR;
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Kick off the first attribute request */
329ac4959255ecb1f6b377ee9d1173bf06ea7a3f4dcMike J. Chen        process_service_attr_rsp (p_ccb, NULL);
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
334ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
335ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdp_copy_raw_data
336ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
337ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      copy the raw data
338ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
339ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
340ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
341ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
342ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_RAW_DATA_INCLUDED == TRUE)
344d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenstatic void sdp_copy_raw_data (tCONN_CB *p_ccb, bool    offset)
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    unsigned int    cpy_len;
347d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint32_t        list_len;
348d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t         *p;
349d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t         type;
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_DEBUG_RAW == TRUE)
352d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t num_array[SDP_MAX_LIST_BYTE_COUNT];
353d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint32_t i;
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < p_ccb->list_len; i++)
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35780d7f60680f483a71e413f2453ab20013aff5c5cGeorge Burgess IV        snprintf((char *)&num_array[i*2], sizeof(num_array) - i*2,
35880d7f60680f483a71e413f2453ab20013aff5c5cGeorge Burgess IV            "%02X",(uint8_t)(p_ccb->rsp_list[i]));
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
360a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    SDP_TRACE_WARNING("result :%s",num_array);
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_ccb->p_db->raw_data)
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cpy_len = p_ccb->p_db->raw_size - p_ccb->p_db->raw_used;
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        list_len = p_ccb->list_len;
367f1c764fab01c929f71e185b97433bf40938026d3Sharvil Nanavati        p = &p_ccb->rsp_list[0];
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(offset)
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            type = *p++;
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p = sdpu_get_len_from_type (p, type, &list_len);
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(list_len && list_len < cpy_len )
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cpy_len = list_len;
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_DEBUG_RAW == TRUE)
379a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING("list_len :%d cpy_len:%d raw_size:%d raw_used:%d",
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            list_len, cpy_len, p_ccb->p_db->raw_size, p_ccb->p_db->raw_used);
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (&p_ccb->p_db->raw_data[p_ccb->p_db->raw_used], p, cpy_len);
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->p_db->raw_used += cpy_len;
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
389ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
390ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         process_service_attr_rsp
391ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
3929ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function is called when there is a attribute response
3939ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  from the server.
394ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
395ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
396ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
397ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
398d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenstatic void process_service_attr_rsp (tCONN_CB *p_ccb, uint8_t *p_reply)
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
400d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t         *p_start, *p_param_len;
401d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t        param_len, list_byte_count;
402d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    bool            cont_request_needed = false;
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_DEBUG_RAW == TRUE)
405a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    SDP_TRACE_WARNING("process_service_attr_rsp raw inc:%d",
406ac4959255ecb1f6b377ee9d1173bf06ea7a3f4dcMike J. Chen        SDP_RAW_DATA_INCLUDED);
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If p_reply is NULL, we were called after the records handles were read */
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_reply)
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_DEBUG_RAW == TRUE)
412a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING("ID & len: 0x%02x-%02x-%02x-%02x",
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_reply[0], p_reply[1], p_reply[2], p_reply[3]);
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Skip transaction ID and length */
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_reply += 4;
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT16 (list_byte_count, p_reply);
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_DEBUG_RAW == TRUE)
420a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING("list_byte_count:%d", list_byte_count);
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Copy the response to the scratchpad. First, a safety check on the length */
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_ccb->list_len + list_byte_count) > SDP_MAX_LIST_BYTE_COUNT)
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sdp_disconnect (p_ccb, SDP_INVALID_PDU_SIZE);
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_DEBUG_RAW == TRUE)
431a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING("list_len: %d, list_byte_count: %d",
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->list_len, list_byte_count);
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->rsp_list == NULL)
435d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen            p_ccb->rsp_list = (uint8_t *)osi_malloc(SDP_MAX_LIST_BYTE_COUNT);
436717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        memcpy(&p_ccb->rsp_list[p_ccb->list_len], p_reply, list_byte_count);
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->list_len += list_byte_count;
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_reply         += list_byte_count;
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_DEBUG_RAW == TRUE)
440a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING("list_len: %d(attr_rsp)", p_ccb->list_len);
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check if we need to request a continuation */
443a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING("*p_reply:%d(%d)", *p_reply, SDP_MAX_CONTINUATION_LEN);
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (*p_reply)
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (*p_reply > SDP_MAX_CONTINUATION_LEN)
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sdp_disconnect (p_ccb, SDP_INVALID_CONT_STATE);
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
452d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen            cont_request_needed = true;
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_RAW_DATA_INCLUDED == TRUE)
458a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_WARNING("process_service_attr_rsp");
459d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen            sdp_copy_raw_data (p_ccb, false);
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Save the response in the database. Stop on any error */
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!save_attr_seq (p_ccb, &p_ccb->rsp_list[0], &p_ccb->rsp_list[p_ccb->list_len]))
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sdp_disconnect (p_ccb, SDP_DB_FULL);
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->list_len = 0;
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->cur_handle++;
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Now, ask for the next handle. Re-use the buffer we just got. */
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->cur_handle < p_ccb->num_handles)
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
476717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        BT_HDR  *p_msg = (BT_HDR *)osi_malloc(SDP_DATA_BUF_SIZE);
477d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen        uint8_t *p;
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->offset = L2CAP_MIN_OFFSET;
480d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen        p = p_start = (uint8_t *)(p_msg + 1) + L2CAP_MIN_OFFSET;
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Get all the attributes from the server */
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p, SDP_PDU_SERVICE_ATTR_REQ);
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p, p_ccb->transaction_id);
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->transaction_id++;
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Skip the length, we need to add it at the end */
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_param_len = p;
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += 2;
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT32_TO_BE_STREAM (p, p_ccb->handles[p_ccb->cur_handle]);
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Max attribute byte count */
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p, sdp_cb.max_attr_list_size);
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If no attribute filters, build a wildcard attribute sequence */
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->p_db->num_attr_filters)
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p = sdpu_build_attrib_seq (p, p_ccb->p_db->attr_filters, p_ccb->p_db->num_attr_filters);
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p = sdpu_build_attrib_seq (p, NULL, 0);
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Was this a continuation request ? */
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (cont_request_needed)
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy (p, p_reply, *p_reply + 1);
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p += *p_reply + 1;
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM (p, 0);
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Go back and put the parameter length into the buffer */
512d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen        param_len = (uint16_t)(p - p_param_len - 2);
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p_param_len, param_len);
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Set the length of the SDP data in the buffer */
516d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen        p_msg->len = (uint16_t)(p - p_start);
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_DataWrite (p_ccb->connection_id, p_msg);
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Start inactivity timer */
52278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_set_on_queue(p_ccb->sdp_conn_timer, SDP_INACT_TIMEOUT_MS,
52378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                           sdp_conn_timer_timeout, p_ccb,
52478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                           btu_general_alarm_queue);
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sdp_disconnect (p_ccb, SDP_SUCCESS);
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
535ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
536ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         process_service_search_attr_rsp
537ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
538ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when there is a search attribute
539ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  response from the server.
540ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
541ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
542ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
543ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
544d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenstatic void process_service_search_attr_rsp (tCONN_CB *p_ccb, uint8_t *p_reply)
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
546d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t         *p, *p_start, *p_end, *p_param_len;
547d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t         type;
548d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint32_t        seq_len;
549d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t        param_len, lists_byte_count = 0;
550d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    bool            cont_request_needed = false;
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_DEBUG_RAW == TRUE)
553a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    SDP_TRACE_WARNING("process_service_search_attr_rsp");
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If p_reply is NULL, we were called for the initial read */
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_reply)
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_DEBUG_RAW == TRUE)
559a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING("ID & len: 0x%02x-%02x-%02x-%02x",
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_reply[0], p_reply[1], p_reply[2], p_reply[3]);
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Skip transaction ID and length */
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_reply += 4;
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT16 (lists_byte_count, p_reply);
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_DEBUG_RAW == TRUE)
567a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING("lists_byte_count:%d", lists_byte_count);
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Copy the response to the scratchpad. First, a safety check on the length */
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_ccb->list_len + lists_byte_count) > SDP_MAX_LIST_BYTE_COUNT)
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sdp_disconnect (p_ccb, SDP_INVALID_PDU_SIZE);
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_DEBUG_RAW == TRUE)
578a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING("list_len: %d, list_byte_count: %d",
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->list_len, lists_byte_count);
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->rsp_list == NULL)
582d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen            p_ccb->rsp_list = (uint8_t *)osi_malloc(SDP_MAX_LIST_BYTE_COUNT);
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (&p_ccb->rsp_list[p_ccb->list_len], p_reply, lists_byte_count);
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->list_len += lists_byte_count;
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_reply         += lists_byte_count;
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_DEBUG_RAW == TRUE)
587a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING("list_len: %d(search_attr_rsp)", p_ccb->list_len);
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check if we need to request a continuation */
590a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING("*p_reply:%d(%d)", *p_reply, SDP_MAX_CONTINUATION_LEN);
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (*p_reply)
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (*p_reply > SDP_MAX_CONTINUATION_LEN)
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sdp_disconnect (p_ccb, SDP_INVALID_CONT_STATE);
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
600d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen            cont_request_needed = true;
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_DEBUG_RAW == TRUE)
605a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    SDP_TRACE_WARNING("cont_request_needed:%d", cont_request_needed);
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If continuation request (or first time request) */
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((cont_request_needed) || (!p_reply))
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
610717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        BT_HDR  *p_msg = (BT_HDR *)osi_malloc(SDP_DATA_BUF_SIZE);
611d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen        uint8_t *p;
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->offset = L2CAP_MIN_OFFSET;
614d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen        p = p_start = (uint8_t *)(p_msg + 1) + L2CAP_MIN_OFFSET;
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Build a service search request packet */
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p, SDP_PDU_SERVICE_SEARCH_ATTR_REQ);
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p, p_ccb->transaction_id);
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->transaction_id++;
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Skip the length, we need to add it at the end */
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_param_len = p;
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += 2;
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Build the UID sequence. */
626d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SDP_BROWSE_PLUS == TRUE)
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = sdpu_build_uuid_seq (p, 1, &p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx]);
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = sdpu_build_uuid_seq (p, p_ccb->p_db->num_uuid_filters, p_ccb->p_db->uuid_filters);
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Max attribute byte count */
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p, sdp_cb.max_attr_list_size);
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If no attribute filters, build a wildcard attribute sequence */
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->p_db->num_attr_filters)
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p = sdpu_build_attrib_seq (p, p_ccb->p_db->attr_filters, p_ccb->p_db->num_attr_filters);
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p = sdpu_build_attrib_seq (p, NULL, 0);
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* No continuation for first request */
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_reply)
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy (p, p_reply, *p_reply + 1);
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p += *p_reply + 1;
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM (p, 0);
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Go back and put the parameter length into the buffer */
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        param_len = p - p_param_len - 2;
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p_param_len, param_len);
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Set the length of the SDP data in the buffer */
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_msg->len = p - p_start;
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CA_DataWrite (p_ccb->connection_id, p_msg);
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Start inactivity timer */
66178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_set_on_queue(p_ccb->sdp_conn_timer, SDP_INACT_TIMEOUT_MS,
66278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                           sdp_conn_timer_timeout, p_ccb,
66378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                           btu_general_alarm_queue);
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*******************************************************************/
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We now have the full response, which is a sequence of sequences */
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*******************************************************************/
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_RAW_DATA_INCLUDED == TRUE)
674a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    SDP_TRACE_WARNING("process_service_search_attr_rsp");
675d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    sdp_copy_raw_data (p_ccb, true);
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = &p_ccb->rsp_list[0];
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* The contents is a sequence of attribute sequences */
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    type = *p++;
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((type >> 3) != DATA_ELE_SEQ_DESC_TYPE)
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
685a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING ("SDP - Wrong type: 0x%02x in attr_rsp", type);
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = sdpu_get_len_from_type (p, type, &seq_len);
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_end = &p_ccb->rsp_list[p_ccb->list_len];
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p + seq_len) != p_end)
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sdp_disconnect (p_ccb, SDP_INVALID_CONT_STATE);
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (p < p_end)
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = save_attr_seq (p_ccb, p, &p_ccb->rsp_list[p_ccb->list_len]);
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p)
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sdp_disconnect (p_ccb, SDP_DB_FULL);
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Since we got everything we need, disconnect the call */
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdp_disconnect (p_ccb, SDP_SUCCESS);
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
713ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
714ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         save_attr_seq
715ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
716ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when there is a response from
717ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  the server.
718ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
719ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          pointer to next byte or NULL if error
720ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
721ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
722d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenstatic uint8_t *save_attr_seq (tCONN_CB *p_ccb, uint8_t *p, uint8_t *p_msg_end)
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
724d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint32_t    seq_len, attr_len;
725d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t    attr_id;
726d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t     type, *p_seq_end;
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_DISC_REC *p_rec;
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    type = *p++;
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((type >> 3) != DATA_ELE_SEQ_DESC_TYPE)
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
733a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING ("SDP - Wrong type: 0x%02x in attr_rsp", type);
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (NULL);
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = sdpu_get_len_from_type (p, type, &seq_len);
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p + seq_len) > p_msg_end)
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
740a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING ("SDP - Bad len in attr_rsp %d", seq_len);
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (NULL);
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Create a record */
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_rec = add_record (p_ccb->p_db, p_ccb->device_address);
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_rec)
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
748a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_WARNING ("SDP - DB full add_record");
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (NULL);
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_seq_end = p + seq_len;
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (p < p_seq_end)
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* First get the attribute ID */
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        type = *p++;
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = sdpu_get_len_from_type (p, type, &attr_len);
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (((type >> 3) != UINT_DESC_TYPE) || (attr_len != 2))
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
761a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_WARNING ("SDP - Bad type: 0x%02x or len: %d in attr_rsp", type, attr_len);
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (NULL);
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT16 (attr_id, p);
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Now, add the attribute value */
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = add_attr (p, p_ccb->p_db, p_rec, attr_id, NULL, 0);
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p)
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
771a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_WARNING ("SDP - DB full add_attr");
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (NULL);
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p);
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
781ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
782ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         add_record
783ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
784ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function allocates space for a record from the DB.
785ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
786ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          pointer to next byte in data stream
787ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
788ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttSDP_DISC_REC *add_record (tSDP_DISCOVERY_DB *p_db, BD_ADDR p_bda)
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_DISC_REC   *p_rec;
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* See if there is enough space in the database */
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_db->mem_free < sizeof (tSDP_DISC_REC))
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (NULL);
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_rec = (tSDP_DISC_REC *) p_db->p_free_mem;
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_db->p_free_mem += sizeof (tSDP_DISC_REC);
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_db->mem_free   -= sizeof (tSDP_DISC_REC);
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_rec->p_first_attr = NULL;
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_rec->p_next_rec   = NULL;
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (p_rec->remote_bd_addr, p_bda, BD_ADDR_LEN);
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Add the record to the end of chain */
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_db->p_first_rec)
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_db->p_first_rec = p_rec;
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        tSDP_DISC_REC   *p_rec1 = p_db->p_first_rec;
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while (p_rec1->p_next_rec)
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_rec1 = p_rec1->p_next_rec;
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rec1->p_next_rec = p_rec;
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p_rec);
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SDP_ADDITIONAL_LIST_MASK        0x80
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
824ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
825ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         add_attr
826ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
827ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function allocates space for an attribute from the DB
828ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  and copies the data into it.
829ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
830ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          pointer to next byte in data stream
831ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
832ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
833d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenstatic uint8_t *add_attr (uint8_t *p, tSDP_DISCOVERY_DB *p_db, tSDP_DISC_REC *p_rec,
834d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen                        uint16_t attr_id, tSDP_DISC_ATTR *p_parent_attr, uint8_t nest_level)
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_DISC_ATTR  *p_attr;
837d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint32_t        attr_len;
838d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint32_t        total_len;
839d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t        attr_type;
840d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t        id;
841d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t         type;
842d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t         *p_end;
843d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t         is_additional_list = nest_level & SDP_ADDITIONAL_LIST_MASK;
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    nest_level &= ~(SDP_ADDITIONAL_LIST_MASK);
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    type = *p++;
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = sdpu_get_len_from_type (p, type, &attr_len);
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    attr_len &= SDP_DISC_ATTR_LEN_MASK;
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    attr_type = (type >> 3) & 0x0f;
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* See if there is enough space in the database */
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (attr_len > 4)
855d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen        total_len = attr_len - 4 + (uint16_t)sizeof (tSDP_DISC_ATTR);
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        total_len = sizeof (tSDP_DISC_ATTR);
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Ensure it is a multiple of 4 */
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    total_len = (total_len + 3) & ~3;
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* See if there is enough space in the database */
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_db->mem_free < total_len)
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (NULL);
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_attr                = (tSDP_DISC_ATTR *) p_db->p_free_mem;
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_attr->attr_id       = attr_id;
868d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    p_attr->attr_len_type = (uint16_t)attr_len | (attr_type << 12);
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_attr->p_next_attr = NULL;
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Store the attribute value */
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (attr_type)
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case UINT_DESC_TYPE:
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( (is_additional_list != 0) && (attr_len == 2) )
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT16 (id, p);
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(id != ATTR_ID_PROTOCOL_DESC_LIST)
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p -= 2;
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Reserve the memory for the attribute now, as we need to add sub-attributes */
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_db->p_free_mem += sizeof (tSDP_DISC_ATTR);
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_db->mem_free   -= sizeof (tSDP_DISC_ATTR);
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_end             = p + attr_len;
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                total_len         = 0;
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
888a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                /* SDP_TRACE_DEBUG ("SDP - attr nest level:%d(list)", nest_level); */
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (nest_level >= MAX_NEST_LEVELS)
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
891a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati                    SDP_TRACE_ERROR ("SDP - attr nesting too deep");
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    return (p_end);
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Now, add the list entry */
896d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen                p = add_attr (p, p_db, p_rec, ATTR_ID_PROTOCOL_DESC_LIST, p_attr, (uint8_t)(nest_level + 1));
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Case falls through */
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case TWO_COMP_INT_DESC_TYPE:
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (attr_len)
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 1:
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_attr->attr_value.v.u8 = *p++;
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 2:
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT16 (p_attr->attr_value.v.u16, p);
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 4:
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT32 (p_attr->attr_value.v.u32, p);
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
916d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen            BE_STREAM_TO_ARRAY (p, p_attr->attr_value.v.array, (int32_t)attr_len);
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case UUID_DESC_TYPE:
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (attr_len)
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 2:
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT16 (p_attr->attr_value.v.u16, p);
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 4:
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT32 (p_attr->attr_value.v.u32, p);
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_attr->attr_value.v.u32 < 0x10000)
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                attr_len = 2;
932d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen                p_attr->attr_len_type = (uint16_t)attr_len | (attr_type << 12);
933d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen                p_attr->attr_value.v.u16 = (uint16_t) p_attr->attr_value.v.u32;
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 16:
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* See if we can compress his UUID down to 16 or 32bit UUIDs */
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (sdpu_is_base_uuid (p))
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((p[0] == 0) && (p[1] == 0))
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_attr->attr_len_type = (p_attr->attr_len_type & ~SDP_DISC_ATTR_LEN_MASK) | 2;
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p += 2;
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BE_STREAM_TO_UINT16 (p_attr->attr_value.v.u16, p);
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p += MAX_UUID_SIZE - 4;
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_attr->attr_len_type = (p_attr->attr_len_type & ~SDP_DISC_ATTR_LEN_MASK) | 4;
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BE_STREAM_TO_UINT32 (p_attr->attr_value.v.u32, p);
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p += MAX_UUID_SIZE - 4;
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 /* coverity[overrun-local] */
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 /*
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    Event overrun-local: Overrun of static array "p_attr->attr_value.v.array" of size 4 at position 15 with index variable "ijk"
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    False-positive: SDP uses scratch buffer to hold the attribute value.
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    The actual size of tSDP_DISC_ATVAL does not matter.
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    If the array size in tSDP_DISC_ATVAL is increase, we would increase the system RAM usage unnecessarily
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                */
964d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen                BE_STREAM_TO_ARRAY (p, p_attr->attr_value.v.array, (int32_t)attr_len);
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
968a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_WARNING ("SDP - bad len in UUID attr: %d", attr_len);
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p + attr_len);
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case DATA_ELE_SEQ_DESC_TYPE:
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case DATA_ELE_ALT_DESC_TYPE:
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Reserve the memory for the attribute now, as we need to add sub-attributes */
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_db->p_free_mem += sizeof (tSDP_DISC_ATTR);
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_db->mem_free   -= sizeof (tSDP_DISC_ATTR);
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_end             = p + attr_len;
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        total_len         = 0;
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
981a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        /* SDP_TRACE_DEBUG ("SDP - attr nest level:%d", nest_level); */
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (nest_level >= MAX_NEST_LEVELS)
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
984a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_ERROR ("SDP - attr nesting too deep");
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p_end);
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(is_additional_list != 0 || attr_id == ATTR_ID_ADDITION_PROTO_DESC_LISTS)
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            nest_level |= SDP_ADDITIONAL_LIST_MASK;
989a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        /* SDP_TRACE_DEBUG ("SDP - attr nest level:0x%x(finish)", nest_level); */
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while (p < p_end)
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Now, add the list entry */
994d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen            p = add_attr (p, p_db, p_rec, 0, p_attr, (uint8_t)(nest_level + 1));
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!p)
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (NULL);
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case TEXT_STR_DESC_TYPE:
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case URL_DESC_TYPE:
1003d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen        BE_STREAM_TO_ARRAY (p, p_attr->attr_value.v.array, (int32_t)attr_len);
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BOOLEAN_DESC_TYPE:
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (attr_len)
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 1:
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_attr->attr_value.v.u8 = *p++;
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
1013a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            SDP_TRACE_WARNING ("SDP - bad len in boolean attr: %d", attr_len);
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p + attr_len);
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:    /* switch (attr_type) */
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_db->p_free_mem += total_len;
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_db->mem_free   -= total_len;
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Add the attribute to the end of the chain */
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_parent_attr)
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_rec->p_first_attr)
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_rec->p_first_attr = p_attr;
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tSDP_DISC_ATTR  *p_attr1 = p_rec->p_first_attr;
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            while (p_attr1->p_next_attr)
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_attr1 = p_attr1->p_next_attr;
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_attr1->p_next_attr = p_attr;
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_parent_attr->attr_value.v.p_sub_attr)
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_parent_attr->attr_value.v.p_sub_attr = p_attr;
1045a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            /* SDP_TRACE_DEBUG ("parent:0x%x(id:%d), ch:0x%x(id:%d)",
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_parent_attr, p_parent_attr->attr_id, p_attr, p_attr->attr_id); */
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tSDP_DISC_ATTR  *p_attr1 = p_parent_attr->attr_value.v.p_sub_attr;
1051a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            /* SDP_TRACE_DEBUG ("parent:0x%x(id:%d), ch1:0x%x(id:%d)",
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_parent_attr, p_parent_attr->attr_id, p_attr1, p_attr1->attr_id); */
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            while (p_attr1->p_next_attr)
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_attr1 = p_attr1->p_next_attr;
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_attr1->p_next_attr = p_attr;
1058a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati            /* SDP_TRACE_DEBUG ("new ch:0x%x(id:%d)", p_attr, p_attr->attr_id); */
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p);
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif  /* CLIENT_ENABLED == TRUE */
1066