sdp_utils.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 utility 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 <netinet/in.h>
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2cdefs.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcidefs.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sdp_api.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sdpint.h"
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenstatic const uint8_t sdp_base_uuid[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
44d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen                                        0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
47ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
48ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_find_ccb_by_cid
49ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
50ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function searches the CCB table for an entry with the
51ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  passed CID.
52ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
53ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          the CCB address, or NULL if not found.
54ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
55ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
56d19e0785e662e640191a075eda07acce61c2aedaMarie JanssentCONN_CB *sdpu_find_ccb_by_cid (uint16_t cid)
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
58d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t     xx;
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tCONN_CB     *p_ccb;
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Look through each connection control block */
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0, p_ccb = sdp_cb.ccb; xx < SDP_MAX_CONNECTIONS; xx++, p_ccb++)
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_ccb->con_state != SDP_STATE_IDLE) && (p_ccb->connection_id == cid))
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p_ccb);
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, not found */
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (NULL);
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
74ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
75ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_find_ccb_by_db
76ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
77ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function searches the CCB table for an entry with the
78ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  passed discovery db.
79ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
80ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          the CCB address, or NULL if not found.
81ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
82ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttCONN_CB *sdpu_find_ccb_by_db (tSDP_DISCOVERY_DB *p_db)
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
85d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SDP_CLIENT_ENABLED == TRUE)
86d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t     xx;
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tCONN_CB     *p_ccb;
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_db)
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Look through each connection control block */
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (xx = 0, p_ccb = sdp_cb.ccb; xx < SDP_MAX_CONNECTIONS; xx++, p_ccb++)
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_ccb->con_state != SDP_STATE_IDLE) && (p_ccb->p_db == p_db))
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (p_ccb);
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, not found */
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (NULL);
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
105ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
106ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_allocate_ccb
107ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
108ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function allocates a new CCB.
109ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
110ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          CCB address, or NULL if none available.
111ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
112ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttCONN_CB *sdpu_allocate_ccb (void)
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
115d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t     xx;
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tCONN_CB     *p_ccb;
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Look through each connection control block for a free one */
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0, p_ccb = sdp_cb.ccb; xx < SDP_MAX_CONNECTIONS; xx++, p_ccb++)
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ccb->con_state == SDP_STATE_IDLE)
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            memset(p_ccb, 0, sizeof(tCONN_CB));
12478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            p_ccb->sdp_conn_timer = alarm_new("sdp.sdp_conn_timer");
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p_ccb);
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, no free CCB found */
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (NULL);
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
135ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
136ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_release_ccb
137ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
138ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function releases a CCB.
139ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
140ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
141ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
142ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid sdpu_release_ccb (tCONN_CB *p_ccb)
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Ensure timer is stopped */
14678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    alarm_free(p_ccb->sdp_conn_timer);
14778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    p_ccb->sdp_conn_timer = NULL;
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Drop any response pointer we may be holding */
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->con_state = SDP_STATE_IDLE;
151d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SDP_CLIENT_ENABLED == TRUE)
152d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    p_ccb->is_attr_search = false;
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Free the response buffer */
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->rsp_list)
15720524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov        SDP_TRACE_DEBUG("releasing SDP rsp_list");
158cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov    osi_free_and_reset((void **)&p_ccb->rsp_list);
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
163ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
164ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_build_attrib_seq
165ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
166ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function builds an attribute sequence from the list of
1679ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  passed attributes. It is also passed the address of the
1689ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  output buffer.
169ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
170ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          Pointer to next byte in the output buffer.
171ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
172ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
173d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint8_t *sdpu_build_attrib_seq (uint8_t *p_out, uint16_t *p_attr, uint16_t num_attrs)
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
175d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t xx;
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First thing is the data element header. See if the length fits 1 byte */
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If no attributes, assume a 4-byte wildcard */
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_attr)
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        xx = 5;
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        xx = num_attrs * 3;
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (xx > 255)
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p_out, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_WORD);
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p_out, xx);
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM (p_out, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM (p_out, xx);
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there are no attributes specified, assume caller wants wildcard */
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_attr)
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p_out, (UINT_DESC_TYPE << 3) | SIZE_FOUR_BYTES);
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p_out, 0);
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p_out, 0xFFFF);
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Loop through and put in all the attributes(s) */
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (xx = 0; xx < num_attrs; xx++, p_attr++)
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM  (p_out, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT16_TO_BE_STREAM (p_out, *p_attr);
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p_out);
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_build_attrib_entry
219ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
220ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function builds an attribute entry from the passed
2219ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  attribute record. It is also passed the address of the
2229ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  output buffer.
223ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
224ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          Pointer to next byte in the output buffer.
225ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
226ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
227d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint8_t *sdpu_build_attrib_entry (uint8_t *p_out, tSDP_ATTRIBUTE *p_attr)
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, store the attribute ID. Goes as a UINT */
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM  (p_out, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p_out, p_attr->id);
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* the attribute is in the db record.
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * assuming the attribute len is less than SDP_MAX_ATTR_LEN */
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(p_attr->type)
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case TEXT_STR_DESC_TYPE:    /* 4 */
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case DATA_ELE_SEQ_DESC_TYPE:/* 6 */
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case DATA_ELE_ALT_DESC_TYPE:/* 7 */
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case URL_DESC_TYPE:         /* 8 */
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_MAX_ATTR_LEN > 0xFFFF)
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_attr->len > 0xFFFF)
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_IN_NEXT_LONG);
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT32_TO_BE_STREAM (p_out, p_attr->len);
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* 0xFFFF - 0xFF */
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_MAX_ATTR_LEN > 0xFF)
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_attr->len > 0xFF)
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_IN_NEXT_WORD);
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT16_TO_BE_STREAM (p_out, p_attr->len);
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* 0xFF and less*/
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_IN_NEXT_BYTE);
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM (p_out, p_attr->len);
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
264a3dbe938e519dfbdbfd121b8d7a8473cccfd3e70Srinu Jella        if (p_attr->value_ptr != NULL) {
265a3dbe938e519dfbdbfd121b8d7a8473cccfd3e70Srinu Jella            ARRAY_TO_BE_STREAM (p_out, p_attr->value_ptr, (int)p_attr->len);
266a3dbe938e519dfbdbfd121b8d7a8473cccfd3e70Srinu Jella        }
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (p_out);
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Now, store the attribute value */
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_attr->len)
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 1:
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_ONE_BYTE);
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 2:
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p_out, (p_attr->type << 3) | SIZE_TWO_BYTES);
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 4:
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p_out, (p_attr->type << 3) | SIZE_FOUR_BYTES);
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 8:
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p_out, (p_attr->type << 3) | SIZE_EIGHT_BYTES);
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 16:
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p_out, (p_attr->type << 3) | SIZE_SIXTEEN_BYTES);
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_IN_NEXT_BYTE);
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM (p_out, p_attr->len);
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
295a3dbe938e519dfbdbfd121b8d7a8473cccfd3e70Srinu Jella    if (p_attr->value_ptr != NULL) {
296a3dbe938e519dfbdbfd121b8d7a8473cccfd3e70Srinu Jella        ARRAY_TO_BE_STREAM (p_out, p_attr->value_ptr, (int)p_attr->len);
297a3dbe938e519dfbdbfd121b8d7a8473cccfd3e70Srinu Jella    }
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p_out);
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
304ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
305ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_build_n_send_error
306ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
307ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function builds and sends an error packet.
308ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
309ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
310ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
311ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
312d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenvoid sdpu_build_n_send_error (tCONN_CB *p_ccb, uint16_t trans_num, uint16_t error_code, char *p_error_text)
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
314d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t         *p_rsp, *p_rsp_start, *p_rsp_param_len;
315d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t        rsp_param_len;
316cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov    BT_HDR          *p_buf = (BT_HDR *)osi_malloc(SDP_DATA_BUF_SIZE);
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
319a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    SDP_TRACE_WARNING ("SDP - sdpu_build_n_send_error  code: 0x%x  CID: 0x%x",
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        error_code, p_ccb->connection_id);
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
322717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov    /* Send the packet to L2CAP */
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->offset = L2CAP_MIN_OFFSET;
324d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    p_rsp = p_rsp_start = (uint8_t *)(p_buf + 1) + L2CAP_MIN_OFFSET;
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
326717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov    UINT8_TO_BE_STREAM(p_rsp, SDP_PDU_ERROR_RESPONSE);
327717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov    UINT16_TO_BE_STREAM(p_rsp, trans_num);
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Skip the parameter length, we need to add it at the end */
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_rsp_param_len = p_rsp;
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_rsp += 2;
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM  (p_rsp, error_code);
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Unplugfest example traces do not have any error text */
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_error_text)
337717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov        ARRAY_TO_BE_STREAM(p_rsp, p_error_text, (int)strlen(p_error_text));
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Go back and put the parameter length into the buffer */
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    rsp_param_len = p_rsp - p_rsp_param_len - 2;
341717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov    UINT16_TO_BE_STREAM(p_rsp_param_len, rsp_param_len);
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Set the length of the SDP data in the buffer */
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->len = p_rsp - p_rsp_start;
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Send the buffer through L2CAP */
347717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov    L2CA_DataWrite(p_ccb->connection_id, p_buf);
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
353ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
354ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_extract_uid_seq
355ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
356ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function extracts a UUID sequence from the passed input
357ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  buffer, and puts it into the passed output list.
358ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
359ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          Pointer to next byte in the input buffer after the sequence.
360ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
361ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
362d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint8_t *sdpu_extract_uid_seq (uint8_t *p, uint16_t param_len, tSDP_UUID_SEQ *p_seq)
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
364d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t *p_seq_end;
365d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t descr, type, size;
366d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint32_t seq_len, uuid_len;
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Assume none found */
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_seq->num_uids = 0;
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* A UID sequence is composed of a bunch of UIDs. */
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BE_STREAM_TO_UINT8 (descr, p);
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    type = descr >> 3;
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    size = descr & 7;
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (type != DATA_ELE_SEQ_DESC_TYPE)
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (NULL);
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (size)
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_TWO_BYTES:
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        seq_len = 2;
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_FOUR_BYTES:
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        seq_len = 4;
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_SIXTEEN_BYTES:
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        seq_len = 16;
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_IN_NEXT_BYTE:
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT8 (seq_len, p);
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_IN_NEXT_WORD:
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT16 (seq_len, p);
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_IN_NEXT_LONG:
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT32 (seq_len, p);
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (NULL);
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (seq_len >= param_len)
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (NULL);
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_seq_end = p + seq_len;
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Loop through, extracting the UIDs */
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for ( ; p < p_seq_end ; )
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT8 (descr, p);
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        type = descr >> 3;
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        size = descr & 7;
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (type != UUID_DESC_TYPE)
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (NULL);
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (size)
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_TWO_BYTES:
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            uuid_len = 2;
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_FOUR_BYTES:
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            uuid_len = 4;
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_SIXTEEN_BYTES:
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            uuid_len = 16;
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_IN_NEXT_BYTE:
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT8 (uuid_len, p);
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_IN_NEXT_WORD:
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT16 (uuid_len, p);
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_IN_NEXT_LONG:
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT32 (uuid_len, p);
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (NULL);
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If UUID length is valid, copy it across */
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((uuid_len == 2) || (uuid_len == 4) || (uuid_len == 16))
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
446d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen            p_seq->uuid_entry[p_seq->num_uids].len = (uint16_t) uuid_len;
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_ARRAY (p, p_seq->uuid_entry[p_seq->num_uids].value, (int)uuid_len);
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_seq->num_uids++;
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (NULL);
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* We can only do so many */
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_seq->num_uids >= MAX_UUIDS_PER_SEQ)
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (NULL);
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p != p_seq_end)
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (NULL);
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p);
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
467ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
468ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_extract_attr_seq
469ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
470ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function extracts an attribute sequence from the passed
471ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  input buffer, and puts it into the passed output list.
472ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
473ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          Pointer to next byte in the input buffer after the sequence.
474ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
475ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
476d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint8_t *sdpu_extract_attr_seq (uint8_t *p, uint16_t param_len, tSDP_ATTR_SEQ *p_seq)
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
478d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t *p_end_list;
479d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t descr, type, size;
480d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint32_t list_len, attr_len;
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Assume none found */
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_seq->num_attr = 0;
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Get attribute sequence info */
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BE_STREAM_TO_UINT8 (descr, p);
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    type = descr >> 3;
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    size = descr & 7;
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (type != DATA_ELE_SEQ_DESC_TYPE)
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (p);
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (size)
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_IN_NEXT_BYTE:
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT8 (list_len, p);
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_IN_NEXT_WORD:
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT16 (list_len, p);
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_IN_NEXT_LONG:
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT32 (list_len, p);
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (p);
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (list_len > param_len)
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (p);
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_end_list = p + list_len;
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Loop through, extracting the attribute IDs */
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for ( ; p < p_end_list ; )
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT8 (descr, p);
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        type = descr >> 3;
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        size = descr & 7;
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (type != UINT_DESC_TYPE)
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p);
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (size)
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_TWO_BYTES:
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            attr_len = 2;
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_FOUR_BYTES:
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            attr_len = 4;
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_IN_NEXT_BYTE:
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT8 (attr_len, p);
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_IN_NEXT_WORD:
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT16 (attr_len, p);
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_IN_NEXT_LONG:
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT32 (attr_len, p);
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (NULL);
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Attribute length must be 2-bytes or 4-bytes for a paired entry. */
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (attr_len == 2)
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT16 (p_seq->attr_entry[p_seq->num_attr].start, p);
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_seq->attr_entry[p_seq->num_attr].end = p_seq->attr_entry[p_seq->num_attr].start;
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (attr_len == 4)
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT16 (p_seq->attr_entry[p_seq->num_attr].start, p);
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT16 (p_seq->attr_entry[p_seq->num_attr].end, p);
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (NULL);
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* We can only do so many */
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (++p_seq->num_attr >= MAX_ATTR_PER_SEQ)
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (NULL);
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p);
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
572ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
573ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_get_len_from_type
574ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
575ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function gets the length
576ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
577ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
578ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
579ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
580d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint8_t *sdpu_get_len_from_type (uint8_t *p, uint8_t type, uint32_t *p_len)
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
582d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t u8;
583d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t u16;
584d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint32_t u32;
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (type & 7)
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_ONE_BYTE:
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = 1;
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_TWO_BYTES:
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = 2;
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_FOUR_BYTES:
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = 4;
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_EIGHT_BYTES:
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = 8;
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_SIXTEEN_BYTES:
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = 16;
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_IN_NEXT_BYTE:
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT8 (u8, p);
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = u8;
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_IN_NEXT_WORD:
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT16 (u16, p);
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = u16;
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_IN_NEXT_LONG:
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT32 (u32, p);
613d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen        *p_len = (uint16_t) u32;
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p);
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
622ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
623ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_is_base_uuid
624ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
625ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function checks a 128-bit UUID with the base to see if
626ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  it matches. Only the last 12 bytes are compared.
627ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
628ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          true if matched, else false
629ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
630ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
631d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenbool    sdpu_is_base_uuid (uint8_t *p_uuid)
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
633d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t  xx;
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 4; xx < MAX_UUID_SIZE; xx++)
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_uuid[xx] != sdp_base_uuid[xx])
637d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen            return (false);
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, matched */
640d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    return (true);
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
645ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
646ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_compare_uuid_arrays
647ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
6489ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function compares 2 BE UUIDs. If needed, they are
6499ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  expanded to 128-bit UUIDs, then compared.
650ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
651ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * NOTE             it is assumed that the arrays are in Big Endian format
652ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
653ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          true if matched, else false
654ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
655ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
656d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenbool    sdpu_compare_uuid_arrays (uint8_t *p_uuid1, uint32_t len1, uint8_t *p_uuid2, uint16_t len2)
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
658d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t     nu1[MAX_UUID_SIZE];
659d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t     nu2[MAX_UUID_SIZE];
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
66142f37840a891eddfee0943fbdf84c2e4f0d765c5Srinu Jella    if( ((len1 != 2) && (len1 != 4) && (len1 != 16)) ||
66242f37840a891eddfee0943fbdf84c2e4f0d765c5Srinu Jella        ((len2 != 2) && (len2 != 4) && (len2 != 16)) )
66342f37840a891eddfee0943fbdf84c2e4f0d765c5Srinu Jella    {
66442f37840a891eddfee0943fbdf84c2e4f0d765c5Srinu Jella        SDP_TRACE_ERROR("%s: invalid length", __func__);
665d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen        return false;
66642f37840a891eddfee0943fbdf84c2e4f0d765c5Srinu Jella    }
66742f37840a891eddfee0943fbdf84c2e4f0d765c5Srinu Jella
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If lengths match, do a straight compare */
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (len1 == len2)
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (len1 == 2)
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return ((p_uuid1[0] == p_uuid2[0]) && (p_uuid1[1] == p_uuid2[1]));
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (len1 == 4)
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (  (p_uuid1[0] == p_uuid2[0]) && (p_uuid1[1] == p_uuid2[1])
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   && (p_uuid1[2] == p_uuid2[2]) && (p_uuid1[3] == p_uuid2[3]) );
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (memcmp (p_uuid1, p_uuid2, (size_t)len1) == 0);
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (len1 > len2)
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If the len1 was 4-byte, (so len2 is 2-byte), compare on the fly */
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (len1 == 4)
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return ( (p_uuid1[0] == 0) && (p_uuid1[1] == 0)
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                  && (p_uuid1[2] == p_uuid2[0]) && (p_uuid1[3] == p_uuid2[1]) );
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Normalize UUIDs to 16-byte form, then compare. Len1 must be 16 */
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy (nu1, p_uuid1,       MAX_UUID_SIZE);
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy (nu2, sdp_base_uuid, MAX_UUID_SIZE);
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (len2 == 4)
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy (nu2, p_uuid2, len2);
69542f37840a891eddfee0943fbdf84c2e4f0d765c5Srinu Jella            else if (len2 == 2)
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy (nu2 + 2, p_uuid2, len2);
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (memcmp (nu1, nu2, MAX_UUID_SIZE) == 0);
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* len2 is greater than len1 */
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If the len2 was 4-byte, (so len1 is 2-byte), compare on the fly */
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (len2 == 4)
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return ( (p_uuid2[0] == 0) && (p_uuid2[1] == 0)
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                  && (p_uuid2[2] == p_uuid1[0]) && (p_uuid2[3] == p_uuid1[1]) );
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Normalize UUIDs to 16-byte form, then compare. Len1 must be 16 */
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy (nu2, p_uuid2,       MAX_UUID_SIZE);
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy (nu1, sdp_base_uuid, MAX_UUID_SIZE);
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (len1 == 4)
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy (nu1, p_uuid1, (size_t)len1);
71842f37840a891eddfee0943fbdf84c2e4f0d765c5Srinu Jella            else if (len1 == 2)
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy (nu1 + 2, p_uuid1, (size_t)len1);
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (memcmp (nu1, nu2, MAX_UUID_SIZE) == 0);
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
728ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
729ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_compare_bt_uuids
730ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
731ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function compares 2 BT UUID structures.
732ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
733ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * NOTE             it is assumed that BT UUID structures are compressed to the
734ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  smallest possible UUIDs (by removing the base SDP UUID)
735ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
736ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          true if matched, else false
737ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
738ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
739d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenbool    sdpu_compare_bt_uuids (tBT_UUID *p_uuid1, tBT_UUID *p_uuid2)
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Lengths must match for BT UUIDs to match */
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_uuid1->len == p_uuid2->len)
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_uuid1->len == 2)
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p_uuid1->uu.uuid16 == p_uuid2->uu.uuid16);
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_uuid1->len == 4)
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p_uuid1->uu.uuid32 == p_uuid2->uu.uuid32);
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (!memcmp (p_uuid1->uu.uuid128, p_uuid2->uu.uuid128, 16))
749d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen            return (true);
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
752d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    return (false);
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
757ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
758ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_compare_uuid_with_attr
759ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
7609ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function compares a BT UUID structure with the UUID in
7619ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  an SDP attribute record. If needed, they are expanded to
7629ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  128-bit UUIDs, then compared.
763ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
764ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * NOTE           - it is assumed that BT UUID structures are compressed to the
765ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  smallest possible UUIDs (by removing the base SDP UUID).
766ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                - it is also assumed that the discovery atribute is compressed
767ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  to the smallest possible
768ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
769ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          true if matched, else false
770ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
771ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
772d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenbool    sdpu_compare_uuid_with_attr (tBT_UUID *p_btuuid, tSDP_DISC_ATTR *p_attr)
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
774d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t    attr_len = SDP_DISC_ATTR_LEN (p_attr->attr_len_type);
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Since both UUIDs are compressed, lengths must match  */
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_btuuid->len != attr_len)
778d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen        return (false);
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_btuuid->len == 2)
781d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen        return (bool   )(p_btuuid->uu.uuid16 == p_attr->attr_value.v.u16);
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_btuuid->len == 4)
783d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen        return (bool   )(p_btuuid->uu.uuid32 == p_attr->attr_value.v.u32);
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* coverity[overrun-buffer-arg] */
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       Event overrun-buffer-arg: Overrun of static array "&p_attr->attr_value.v.array" of size 4 bytes by passing it to a function which indexes it with argument "16U" at byte position 15
787d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen       false-POSITIVE error from Coverity test tool. Please do NOT remove following comment.
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       False-positive: SDP uses scratch buffer to hold the attribute value.
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       The actual size of tSDP_DISC_ATVAL does not matter.
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       If the array size in tSDP_DISC_ATVAL is increase, we would increase the system RAM usage unnecessarily
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
7924540f59bc447dc2b7b31a3e974b74a60b2417e7dVenkatRaghavan VijayaRaghavan    else if (!memcmp (p_btuuid->uu.uuid128,(void*) p_attr->attr_value.v.array, MAX_UUID_SIZE))
793d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen        return (true);
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
795d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    return (false);
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
799ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
800ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_sort_attr_list
801ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
802ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      sorts a list of attributes in numeric order from lowest to
803ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  highest to conform to SDP specification
804ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
805ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
806ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
807ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
808d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenvoid sdpu_sort_attr_list( uint16_t num_attr, tSDP_DISCOVERY_DB *p_db )
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
810d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t i;
811d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t x;
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Done if no attributes to sort */
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (num_attr <= 1)
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (num_attr > SDP_MAX_ATTR_FILTERS)
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        num_attr = SDP_MAX_ATTR_FILTERS;
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    num_attr--; /* for the for-loop */
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for( i = 0; i < num_attr; )
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( p_db->attr_filters[i] > p_db->attr_filters[i+1] )
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* swap the attribute IDs and start from the beginning */
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            x = p_db->attr_filters[i];
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_db->attr_filters[i] = p_db->attr_filters[i+1];
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_db->attr_filters[i+1] = x;
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            i = 0;
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            i++;
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
842ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
843ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_get_list_len
844ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
845ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      gets the total list length in the sdp database for a given
846ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  uid sequence and attr sequence
847ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
848ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
849ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
850ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
851d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t sdpu_get_list_len(tSDP_UUID_SEQ *uid_seq, tSDP_ATTR_SEQ *attr_seq)
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_RECORD    *p_rec;
854d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t len = 0;
855d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t len1;
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (p_rec = sdp_db_service_search (NULL, uid_seq); p_rec; p_rec = sdp_db_service_search (p_rec, uid_seq))
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len += 3;
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len1 = sdpu_get_attrib_seq_len(p_rec, attr_seq );
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (len1 != 0)
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len += len1;
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len -= 3;
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return len;
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
872ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
873ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_get_attrib_seq_len
874ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
875ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      gets the length of the specific attributes in a given
876ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  sdp record
877ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
878ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
879ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
880ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
881d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t sdpu_get_attrib_seq_len(tSDP_RECORD *p_rec, tSDP_ATTR_SEQ *attr_seq)
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_ATTRIBUTE *p_attr;
884d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t len1 = 0;
885d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t xx;
886d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    bool    is_range = false;
887d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t start_id=0, end_id=0;
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < attr_seq->num_attr; xx++)
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
891d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen        if (is_range == false)
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            start_id = attr_seq->attr_entry[xx].start;
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            end_id = attr_seq->attr_entry[xx].end;
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_attr = sdp_db_find_attr_in_rec (p_rec,
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          start_id,
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          end_id);
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_attr)
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len1 += sdpu_get_attrib_entry_len (p_attr);
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If doing a range, stick with this one till no more attributes found */
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (start_id != end_id)
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Update for next time through */
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                start_id = p_attr->id + 1;
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                xx--;
909d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen                is_range = true;
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
912d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen                is_range = false;
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
915d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen            is_range = false;
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return len1;
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
921ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
922ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_get_attrib_entry_len
923ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
924ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      gets the length of a specific attribute
925ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
926ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
927ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
928ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
929d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t sdpu_get_attrib_entry_len(tSDP_ATTRIBUTE *p_attr)
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
931d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t len = 3;
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* the attribute is in the db record.
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * assuming the attribute len is less than SDP_MAX_ATTR_LEN */
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(p_attr->type)
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case TEXT_STR_DESC_TYPE:    /* 4 */
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case DATA_ELE_SEQ_DESC_TYPE:/* 6 */
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case DATA_ELE_ALT_DESC_TYPE:/* 7 */
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case URL_DESC_TYPE:         /* 8 */
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_MAX_ATTR_LEN > 0xFFFF)
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_attr->len > 0xFFFF)
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len += 5;
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif/* 0xFFFF - 0xFF */
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_MAX_ATTR_LEN > 0xFF)
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_attr->len > 0xFF)
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len += 3;
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* 0xFF and less*/
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len += 2;
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len += p_attr->len;
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return len;
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	}
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Now, the attribute value */
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_attr->len)
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 1:
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 2:
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 4:
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 8:
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 16:
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len += 1;
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len += 2;
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    len += p_attr->len;
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return len;
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
985ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
986ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_build_partial_attrib_entry
987ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
988ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function fills a buffer with partial attribute. It is
989ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  assumed that the maximum size of any attribute is 256 bytes.
990ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
991ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  p_out: output buffer
992ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  p_attr: attribute to be copied partially into p_out
993ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  rem_len: num bytes to copy into p_out
9949ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  offset: current start offset within the attr that needs to
9959ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                          be copied
996ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
997ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          Pointer to next byte in the output buffer.
998ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  offset is also updated
999ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1000ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1001d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint8_t *sdpu_build_partial_attrib_entry (uint8_t *p_out, tSDP_ATTRIBUTE *p_attr, uint16_t len, uint16_t *offset)
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1003d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint8_t *p_attr_buff = (uint8_t *)osi_malloc(sizeof(uint8_t) * SDP_MAX_ATTR_LEN);
100415b8ab4b338eed3fa35d8f4751eeab2a6cdcd3efvenkata Jagadeesh    sdpu_build_attrib_entry(p_attr_buff, p_attr);
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1006d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t attr_len = sdpu_get_attrib_entry_len(p_attr);
1007ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
100815b8ab4b338eed3fa35d8f4751eeab2a6cdcd3efvenkata Jagadeesh    if (len > SDP_MAX_ATTR_LEN)
100915b8ab4b338eed3fa35d8f4751eeab2a6cdcd3efvenkata Jagadeesh    {
101015b8ab4b338eed3fa35d8f4751eeab2a6cdcd3efvenkata Jagadeesh        SDP_TRACE_ERROR("%s len %d exceeds SDP_MAX_ATTR_LEN", __func__, len);
101115b8ab4b338eed3fa35d8f4751eeab2a6cdcd3efvenkata Jagadeesh        len = SDP_MAX_ATTR_LEN;
101215b8ab4b338eed3fa35d8f4751eeab2a6cdcd3efvenkata Jagadeesh    }
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
101415b8ab4b338eed3fa35d8f4751eeab2a6cdcd3efvenkata Jagadeesh    size_t len_to_copy = ((attr_len - *offset) < len) ? (attr_len - *offset) : len;
1015ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    memcpy(p_out, &p_attr_buff[*offset], len_to_copy);
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_out = &p_out[len_to_copy];
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *offset += len_to_copy;
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1020cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov    osi_free(p_attr_buff);
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_out;
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1025ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1026ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         sdpu_uuid16_to_uuid128
1027ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
10289ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function converts UUID-16 to UUID-128 by including the
10299ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  base UUID
1030ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1031ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  uuid16: 2-byte UUID
1032ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  p_uuid128: Expanded 128-bit UUID
1033ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1034ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          None
1035ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1036ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1037d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenvoid sdpu_uuid16_to_uuid128(uint16_t uuid16, uint8_t* p_uuid128)
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1039d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen    uint16_t uuid16_bo;
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(p_uuid128, 0, 16);
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(p_uuid128, sdp_base_uuid, MAX_UUID_SIZE);
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uuid16_bo = ntohs(uuid16);
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(p_uuid128+ 2, &uuid16_bo, sizeof(uint16_t));
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1046