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
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.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
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const UINT8  sdp_base_uuid[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_find_ccb_by_cid
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function searches the CCB table for an entry with the
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  passed CID.
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          the CCB address, or NULL if not found.
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttCONN_CB *sdpu_find_ccb_by_cid (UINT16 cid)
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16       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/*******************************************************************************
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_find_ccb_by_db
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function searches the CCB table for an entry with the
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  passed discovery db.
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          the CCB address, or NULL if not found.
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttCONN_CB *sdpu_find_ccb_by_db (tSDP_DISCOVERY_DB *p_db)
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_CLIENT_ENABLED == TRUE
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16       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/*******************************************************************************
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_allocate_ccb
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function allocates a new CCB.
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          CCB address, or NULL if none available.
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttCONN_CB *sdpu_allocate_ccb (void)
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16       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        {
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset (p_ccb, 0, sizeof (tCONN_CB));
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ccb->timer_entry.param = (UINT32) p_ccb;
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p_ccb);
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, no free CCB found */
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (NULL);
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_release_ccb
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function releases a CCB.
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid sdpu_release_ccb (tCONN_CB *p_ccb)
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Ensure timer is stopped */
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_stop_timer (&p_ccb->timer_entry);
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Drop any response pointer we may be holding */
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->con_state = SDP_STATE_IDLE;
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_CLIENT_ENABLED == TRUE
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_ccb->is_attr_search = FALSE;
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Free the response buffer */
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_ccb->rsp_list)
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
159a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati       SDP_TRACE_DEBUG("releasing SDP rsp_list");
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf(p_ccb->rsp_list);
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ccb->rsp_list = NULL;
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_build_attrib_seq
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function builds an attribute sequence from the list of
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  passed attributes. It is also passed the address of the output
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  buffer.
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to next byte in the output buffer.
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *sdpu_build_attrib_seq (UINT8 *p_out, UINT16 *p_attr, UINT16 num_attrs)
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  xx;
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First thing is the data element header. See if the length fits 1 byte */
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If no attributes, assume a 4-byte wildcard */
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_attr)
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        xx = 5;
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        xx = num_attrs * 3;
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (xx > 255)
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_WORD);
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p_out, xx);
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM (p_out, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM (p_out, xx);
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there are no attributes specified, assume caller wants wildcard */
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_attr)
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p_out, (UINT_DESC_TYPE << 3) | SIZE_FOUR_BYTES);
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p_out, 0);
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_BE_STREAM (p_out, 0xFFFF);
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Loop through and put in all the attributes(s) */
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (xx = 0; xx < num_attrs; xx++, p_attr++)
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM  (p_out, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT16_TO_BE_STREAM (p_out, *p_attr);
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p_out);
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_build_attrib_entry
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function builds an attribute entry from the passed
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  attribute record. It is also passed the address of the output
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  buffer.
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to next byte in the output buffer.
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *sdpu_build_attrib_entry (UINT8 *p_out, tSDP_ATTRIBUTE *p_attr)
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* First, store the attribute ID. Goes as a UINT */
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM  (p_out, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p_out, p_attr->id);
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* the attribute is in the db record.
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * assuming the attribute len is less than SDP_MAX_ATTR_LEN */
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(p_attr->type)
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case TEXT_STR_DESC_TYPE:    /* 4 */
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case DATA_ELE_SEQ_DESC_TYPE:/* 6 */
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case DATA_ELE_ALT_DESC_TYPE:/* 7 */
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case URL_DESC_TYPE:         /* 8 */
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_MAX_ATTR_LEN > 0xFFFF)
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_attr->len > 0xFFFF)
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_IN_NEXT_LONG);
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT32_TO_BE_STREAM (p_out, p_attr->len);
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* 0xFFFF - 0xFF */
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_MAX_ATTR_LEN > 0xFF)
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_attr->len > 0xFF)
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_IN_NEXT_WORD);
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT16_TO_BE_STREAM (p_out, p_attr->len);
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* 0xFF and less*/
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_IN_NEXT_BYTE);
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM (p_out, p_attr->len);
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ARRAY_TO_BE_STREAM (p_out, p_attr->value_ptr, (int)p_attr->len);
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (p_out);
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Now, store the attribute value */
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_attr->len)
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 1:
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_ONE_BYTE);
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 2:
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p_out, (p_attr->type << 3) | SIZE_TWO_BYTES);
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 4:
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p_out, (p_attr->type << 3) | SIZE_FOUR_BYTES);
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 8:
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p_out, (p_attr->type << 3) | SIZE_EIGHT_BYTES);
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 16:
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM  (p_out, (p_attr->type << 3) | SIZE_SIXTEEN_BYTES);
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_IN_NEXT_BYTE);
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT8_TO_BE_STREAM (p_out, p_attr->len);
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ARRAY_TO_BE_STREAM (p_out, p_attr->value_ptr, (int)p_attr->len);
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p_out);
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_build_n_send_error
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function builds and sends an error packet.
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid sdpu_build_n_send_error (tCONN_CB *p_ccb, UINT16 trans_num, UINT16 error_code, char *p_error_text)
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p_rsp, *p_rsp_start, *p_rsp_param_len;
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          rsp_param_len;
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR          *p_buf;
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
320a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati    SDP_TRACE_WARNING ("SDP - sdpu_build_n_send_error  code: 0x%x  CID: 0x%x",
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        error_code, p_ccb->connection_id);
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Get a buffer to use to build and send the packet to L2CAP */
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (BT_HDR *)GKI_getpoolbuf (SDP_POOL_ID)) == NULL)
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
326a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR ("SDP - no buf for err msg");
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->offset = L2CAP_MIN_OFFSET;
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_rsp = p_rsp_start = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8_TO_BE_STREAM  (p_rsp, SDP_PDU_ERROR_RESPONSE);
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM  (p_rsp, trans_num);
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Skip the parameter length, we need to add it at the end */
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_rsp_param_len = p_rsp;
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_rsp += 2;
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM  (p_rsp, error_code);
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Unplugfest example traces do not have any error text */
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_error_text)
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ARRAY_TO_BE_STREAM (p_rsp, p_error_text, (int) strlen (p_error_text));
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Go back and put the parameter length into the buffer */
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    rsp_param_len = p_rsp - p_rsp_param_len - 2;
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_BE_STREAM (p_rsp_param_len, rsp_param_len);
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Set the length of the SDP data in the buffer */
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->len = p_rsp - p_rsp_start;
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Send the buffer through L2CAP */
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CA_DataWrite (p_ccb->connection_id, p_buf);
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_extract_uid_seq
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function extracts a UUID sequence from the passed input
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  buffer, and puts it into the passed output list.
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to next byte in the input buffer after the sequence.
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *sdpu_extract_uid_seq (UINT8 *p, UINT16 param_len, tSDP_UUID_SEQ *p_seq)
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_seq_end;
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   descr, type, size;
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  seq_len, uuid_len;
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Assume none found */
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_seq->num_uids = 0;
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* A UID sequence is composed of a bunch of UIDs. */
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BE_STREAM_TO_UINT8 (descr, p);
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    type = descr >> 3;
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    size = descr & 7;
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (type != DATA_ELE_SEQ_DESC_TYPE)
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (NULL);
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (size)
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_TWO_BYTES:
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        seq_len = 2;
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_FOUR_BYTES:
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        seq_len = 4;
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_SIXTEEN_BYTES:
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        seq_len = 16;
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_IN_NEXT_BYTE:
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT8 (seq_len, p);
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_IN_NEXT_WORD:
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT16 (seq_len, p);
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_IN_NEXT_LONG:
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT32 (seq_len, p);
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (NULL);
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (seq_len >= param_len)
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (NULL);
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_seq_end = p + seq_len;
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Loop through, extracting the UIDs */
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for ( ; p < p_seq_end ; )
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT8 (descr, p);
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        type = descr >> 3;
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        size = descr & 7;
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (type != UUID_DESC_TYPE)
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (NULL);
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (size)
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_TWO_BYTES:
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            uuid_len = 2;
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_FOUR_BYTES:
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            uuid_len = 4;
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_SIXTEEN_BYTES:
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            uuid_len = 16;
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_IN_NEXT_BYTE:
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT8 (uuid_len, p);
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_IN_NEXT_WORD:
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT16 (uuid_len, p);
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_IN_NEXT_LONG:
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT32 (uuid_len, p);
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (NULL);
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If UUID length is valid, copy it across */
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((uuid_len == 2) || (uuid_len == 4) || (uuid_len == 16))
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_seq->uuid_entry[p_seq->num_uids].len = (UINT16) uuid_len;
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_ARRAY (p, p_seq->uuid_entry[p_seq->num_uids].value, (int)uuid_len);
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_seq->num_uids++;
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (NULL);
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* We can only do so many */
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_seq->num_uids >= MAX_UUIDS_PER_SEQ)
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (NULL);
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p != p_seq_end)
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (NULL);
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p);
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_extract_attr_seq
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function extracts an attribute sequence from the passed
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  input buffer, and puts it into the passed output list.
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to next byte in the input buffer after the sequence.
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *sdpu_extract_attr_seq (UINT8 *p, UINT16 param_len, tSDP_ATTR_SEQ *p_seq)
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_end_list;
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   descr, type, size;
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  list_len, attr_len;
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Assume none found */
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_seq->num_attr = 0;
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Get attribute sequence info */
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BE_STREAM_TO_UINT8 (descr, p);
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    type = descr >> 3;
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    size = descr & 7;
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (type != DATA_ELE_SEQ_DESC_TYPE)
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (p);
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (size)
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_IN_NEXT_BYTE:
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT8 (list_len, p);
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_IN_NEXT_WORD:
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT16 (list_len, p);
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_IN_NEXT_LONG:
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT32 (list_len, p);
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (p);
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (list_len > param_len)
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (p);
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_end_list = p + list_len;
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Loop through, extracting the attribute IDs */
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for ( ; p < p_end_list ; )
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT8 (descr, p);
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        type = descr >> 3;
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        size = descr & 7;
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (type != UINT_DESC_TYPE)
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p);
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (size)
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_TWO_BYTES:
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            attr_len = 2;
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_FOUR_BYTES:
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            attr_len = 4;
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_IN_NEXT_BYTE:
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT8 (attr_len, p);
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_IN_NEXT_WORD:
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT16 (attr_len, p);
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case SIZE_IN_NEXT_LONG:
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT32 (attr_len, p);
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (NULL);
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Attribute length must be 2-bytes or 4-bytes for a paired entry. */
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (attr_len == 2)
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT16 (p_seq->attr_entry[p_seq->num_attr].start, p);
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_seq->attr_entry[p_seq->num_attr].end = p_seq->attr_entry[p_seq->num_attr].start;
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (attr_len == 4)
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT16 (p_seq->attr_entry[p_seq->num_attr].start, p);
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BE_STREAM_TO_UINT16 (p_seq->attr_entry[p_seq->num_attr].end, p);
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (NULL);
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* We can only do so many */
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (++p_seq->num_attr >= MAX_ATTR_PER_SEQ)
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (NULL);
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p);
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_get_len_from_type
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function gets the length
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *sdpu_get_len_from_type (UINT8 *p, UINT8 type, UINT32 *p_len)
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   u8;
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  u16;
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  u32;
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (type & 7)
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_ONE_BYTE:
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = 1;
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_TWO_BYTES:
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = 2;
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_FOUR_BYTES:
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = 4;
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_EIGHT_BYTES:
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = 8;
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_SIXTEEN_BYTES:
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = 16;
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_IN_NEXT_BYTE:
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT8 (u8, p);
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = u8;
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_IN_NEXT_WORD:
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT16 (u16, p);
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = u16;
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SIZE_IN_NEXT_LONG:
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BE_STREAM_TO_UINT32 (u32, p);
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = (UINT16) u32;
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p);
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_is_base_uuid
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function checks a 128-bit UUID with the base to see if
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  it matches. Only the last 12 bytes are compared.
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if matched, else FALSE
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN sdpu_is_base_uuid (UINT8 *p_uuid)
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16    xx;
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 4; xx < MAX_UUID_SIZE; xx++)
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_uuid[xx] != sdp_base_uuid[xx])
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (FALSE);
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, matched */
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (TRUE);
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_compare_uuid_arrays
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function compares 2 BE UUIDs. If needed, they are expanded
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  to 128-bit UUIDs, then compared.
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE             it is assumed that the arrays are in Big Endian format
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if matched, else FALSE
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN sdpu_compare_uuid_arrays (UINT8 *p_uuid1, UINT32 len1, UINT8 *p_uuid2, UINT16 len2)
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       nu1[MAX_UUID_SIZE];
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       nu2[MAX_UUID_SIZE];
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
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);
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
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);
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
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/*******************************************************************************
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_compare_bt_uuids
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function compares 2 BT UUID structures.
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE             it is assumed that BT UUID structures are compressed to the
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  smallest possible UUIDs (by removing the base SDP UUID)
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if matched, else FALSE
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN 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))
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (TRUE);
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_compare_uuid_with_attr
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function compares a BT UUID structure with the UUID in an
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  SDP attribute record. If needed, they are expanded to 128-bit
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  UUIDs, then compared.
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE           - it is assumed that BT UUID structures are compressed to the
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  smallest possible UUIDs (by removing the base SDP UUID).
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                - it is also assumed that the discovery atribute is compressed
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  to the smallest possible
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if matched, else FALSE
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN sdpu_compare_uuid_with_attr (tBT_UUID *p_btuuid, tSDP_DISC_ATTR *p_attr)
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      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)
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_btuuid->len == 2)
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BOOLEAN)(p_btuuid->uu.uuid16 == p_attr->attr_value.v.u16);
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_btuuid->len == 4)
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BOOLEAN)(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
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       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    */
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (!memcmp (p_btuuid->uu.uuid128, p_attr->attr_value.v.array, MAX_UUID_SIZE))
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (TRUE);
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_sort_attr_list
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      sorts a list of attributes in numeric order from lowest to
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  highest to conform to SDP specification
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid sdpu_sort_attr_list( UINT16 num_attr, tSDP_DISCOVERY_DB *p_db )
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 i;
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 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/*******************************************************************************
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_get_list_len
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      gets the total list length in the sdp database for a given
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  uid sequence and attr sequence
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 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;
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 len = 0;
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 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/*******************************************************************************
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_get_attrib_seq_len
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      gets the length of the specific attributes in a given
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sdp record
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 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;
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 len1 = 0;
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 xx;
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_range = FALSE;
887ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT16 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    {
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        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--;
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                is_range = TRUE;
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                is_range = FALSE;
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            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/*******************************************************************************
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_get_attrib_entry_len
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      gets the length of a specific attribute
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 sdpu_get_attrib_entry_len(tSDP_ATTRIBUTE *p_attr)
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 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/*******************************************************************************
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_build_partial_attrib_entry
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function fills a buffer with partial attribute. It is
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  assumed that the maximum size of any attribute is 256 bytes.
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_out: output buffer
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_attr: attribute to be copied partially into p_out
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  rem_len: num bytes to copy into p_out
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  offset: current start offset within the attr that needs to be copied
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to next byte in the output buffer.
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  offset is also updated
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *sdpu_build_partial_attrib_entry (UINT8 *p_out, tSDP_ATTRIBUTE *p_attr, UINT16 len, UINT16 *offset)
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1002ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8   *p_attr_buff;
1003ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8   *p_tmp_attr;
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    size_t  len_to_copy;
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  attr_len;
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1007ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_attr_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN )) == NULL)
1008ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
1009a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati        SDP_TRACE_ERROR("sdpu_build_partial_attrib_entry cannot get a buffer!");
1010ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return NULL;
1011ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
1012ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_tmp_attr = p_attr_buff;
1013ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sdpu_build_attrib_entry(p_tmp_attr, p_attr);
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    attr_len = sdpu_get_attrib_entry_len(p_attr);
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    len_to_copy = ((attr_len - *offset) < len) ? (attr_len - *offset): len;
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1019ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    memcpy(p_out, &p_attr_buff[*offset], len_to_copy);
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_out = &p_out[len_to_copy];
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *offset += len_to_copy;
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1024ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    GKI_freebuf(p_attr_buff);
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_out;
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         sdpu_uuid16_to_uuid128
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function converts UUID-16 to UUID-128 by including the base UUID
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  uuid16: 2-byte UUID
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_uuid128: Expanded 128-bit UUID
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid sdpu_uuid16_to_uuid128(UINT16 uuid16, UINT8* p_uuid128)
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 uuid16_bo;
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(p_uuid128, 0, 16);
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(p_uuid128, sdp_base_uuid, MAX_UUID_SIZE);
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uuid16_bo = ntohs(uuid16);
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(p_uuid128+ 2, &uuid16_bo, sizeof(uint16_t));
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1049