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