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 <netinet/in.h> 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h> 27911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include <stdlib.h> 28911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include <string.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 "hcidefs.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h" 35911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "l2cdefs.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 42911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic const uint8_t sdp_base_uuid[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 43911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 44911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 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 ******************************************************************************/ 56911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontCONN_CB* sdpu_find_ccb_by_cid(uint16_t cid) { 57911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 58911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tCONN_CB* p_ccb; 59911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 60911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Look through each connection control block */ 61911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0, p_ccb = sdp_cb.ccb; xx < SDP_MAX_CONNECTIONS; xx++, p_ccb++) { 62911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_ccb->con_state != SDP_STATE_IDLE) && (p_ccb->connection_id == cid)) 63911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_ccb); 64911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 65911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 66911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, not found */ 67911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (NULL); 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 71ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 72ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_find_ccb_by_db 73ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 74ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function searches the CCB table for an entry with the 75ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * passed discovery db. 76ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 77ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns the CCB address, or NULL if not found. 78ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 79ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 80911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontCONN_CB* sdpu_find_ccb_by_db(tSDP_DISCOVERY_DB* p_db) { 81911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 82911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tCONN_CB* p_ccb; 83911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 84911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_db) { 85911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Look through each connection control block */ 86911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0, p_ccb = sdp_cb.ccb; xx < SDP_MAX_CONNECTIONS; xx++, p_ccb++) { 87911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_ccb->con_state != SDP_STATE_IDLE) && (p_ccb->p_db == p_db)) 88911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_ccb); 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 90911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 91911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, not found */ 92911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (NULL); 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 96ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 97ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_allocate_ccb 98ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 99ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function allocates a new CCB. 100ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 101ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns CCB address, or NULL if none available. 102ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 103ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 104911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontCONN_CB* sdpu_allocate_ccb(void) { 105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tCONN_CB* p_ccb; 107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Look through each connection control block for a free one */ 109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0, p_ccb = sdp_cb.ccb; xx < SDP_MAX_CONNECTIONS; xx++, p_ccb++) { 110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb->con_state == SDP_STATE_IDLE) { 111ec16f7d8c7e359a68ffe6b76e88add2210bf2cbdPavlin Radoslavov alarm_t* alarm = p_ccb->sdp_conn_timer; 112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(p_ccb, 0, sizeof(tCONN_CB)); 113ec16f7d8c7e359a68ffe6b76e88add2210bf2cbdPavlin Radoslavov p_ccb->sdp_conn_timer = alarm; 114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_ccb); 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, no free CCB found */ 119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (NULL); 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 123ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 124ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_release_ccb 125ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 126ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function releases a CCB. 127ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 128ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 129ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 130ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid sdpu_release_ccb(tCONN_CB* p_ccb) { 132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Ensure timer is stopped */ 133ec16f7d8c7e359a68ffe6b76e88add2210bf2cbdPavlin Radoslavov alarm_cancel(p_ccb->sdp_conn_timer); 134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Drop any response pointer we may be holding */ 136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->con_state = SDP_STATE_IDLE; 137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->is_attr_search = false; 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Free the response buffer */ 140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb->rsp_list) SDP_TRACE_DEBUG("releasing SDP rsp_list"); 141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free_and_reset((void**)&p_ccb->rsp_list); 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 145ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 146ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_build_attrib_seq 147ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 148ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function builds an attribute sequence from the list of 1499ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * passed attributes. It is also passed the address of the 1509ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * output buffer. 151ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 152ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to next byte in the output buffer. 153ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 154ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t* sdpu_build_attrib_seq(uint8_t* p_out, uint16_t* p_attr, 156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t num_attrs) { 157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* First thing is the data element header. See if the length fits 1 byte */ 160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If no attributes, assume a 4-byte wildcard */ 161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_attr) 162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson xx = 5; 163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson xx = num_attrs * 3; 165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (xx > 255) { 167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p_out, 168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_WORD); 169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(p_out, xx); 170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p_out, 172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE); 173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p_out, xx); 174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If there are no attributes specified, assume caller wants wildcard */ 177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_attr) { 178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p_out, (UINT_DESC_TYPE << 3) | SIZE_FOUR_BYTES); 179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(p_out, 0); 180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(p_out, 0xFFFF); 181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Loop through and put in all the attributes(s) */ 183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < num_attrs; xx++, p_attr++) { 184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p_out, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES); 185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(p_out, *p_attr); 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_out); 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 193ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 194ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_build_attrib_entry 195ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 196ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function builds an attribute entry from the passed 1979ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * attribute record. It is also passed the address of the 1989ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * output buffer. 199ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 200ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to next byte in the output buffer. 201ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 202ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t* sdpu_build_attrib_entry(uint8_t* p_out, tSDP_ATTRIBUTE* p_attr) { 204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* First, store the attribute ID. Goes as a UINT */ 205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p_out, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES); 206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(p_out, p_attr->id); 207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the attribute is in the db record. 209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * assuming the attribute len is less than SDP_MAX_ATTR_LEN */ 210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (p_attr->type) { 211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case TEXT_STR_DESC_TYPE: /* 4 */ 212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case DATA_ELE_SEQ_DESC_TYPE: /* 6 */ 213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case DATA_ELE_ALT_DESC_TYPE: /* 7 */ 214911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case URL_DESC_TYPE: /* 8 */ 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_MAX_ATTR_LEN > 0xFFFF) 216911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_attr->len > 0xFFFF) { 217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p_out, (p_attr->type << 3) | SIZE_IN_NEXT_LONG); 218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT32_TO_BE_STREAM(p_out, p_attr->len); 219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* 0xFFFF - 0xFF */ 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_MAX_ATTR_LEN > 0xFF) 222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_attr->len > 0xFF) { 223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p_out, (p_attr->type << 3) | SIZE_IN_NEXT_WORD); 224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(p_out, p_attr->len); 225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* 0xFF and less*/ 227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p_out, (p_attr->type << 3) | SIZE_IN_NEXT_BYTE); 229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p_out, p_attr->len); 230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_attr->value_ptr != NULL) { 233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ARRAY_TO_BE_STREAM(p_out, p_attr->value_ptr, (int)p_attr->len); 234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_out); 237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Now, store the attribute value */ 240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (p_attr->len) { 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 1: 242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p_out, (p_attr->type << 3) | SIZE_ONE_BYTE); 243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 2: 245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p_out, (p_attr->type << 3) | SIZE_TWO_BYTES); 246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 4: 248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p_out, (p_attr->type << 3) | SIZE_FOUR_BYTES); 249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 8: 251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p_out, (p_attr->type << 3) | SIZE_EIGHT_BYTES); 252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 16: 254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p_out, (p_attr->type << 3) | SIZE_SIXTEEN_BYTES); 255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p_out, (p_attr->type << 3) | SIZE_IN_NEXT_BYTE); 258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p_out, p_attr->len); 259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_attr->value_ptr != NULL) { 263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ARRAY_TO_BE_STREAM(p_out, p_attr->value_ptr, (int)p_attr->len); 264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_out); 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 270ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 271ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_build_n_send_error 272ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 273ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function builds and sends an error packet. 274ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 275ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 276ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 277ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid sdpu_build_n_send_error(tCONN_CB* p_ccb, uint16_t trans_num, 279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t error_code, char* p_error_text) { 280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t *p_rsp, *p_rsp_start, *p_rsp_param_len; 281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t rsp_param_len; 282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_HDR* p_buf = (BT_HDR*)osi_malloc(SDP_DATA_BUF_SIZE); 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_TRACE_WARNING("SDP - sdpu_build_n_send_error code: 0x%x CID: 0x%x", 285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson error_code, p_ccb->connection_id); 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Send the packet to L2CAP */ 288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_buf->offset = L2CAP_MIN_OFFSET; 289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rsp = p_rsp_start = (uint8_t*)(p_buf + 1) + L2CAP_MIN_OFFSET; 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT8_TO_BE_STREAM(p_rsp, SDP_PDU_ERROR_RESPONSE); 292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(p_rsp, trans_num); 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Skip the parameter length, we need to add it at the end */ 295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rsp_param_len = p_rsp; 296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rsp += 2; 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(p_rsp, error_code); 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Unplugfest example traces do not have any error text */ 301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_error_text) 302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ARRAY_TO_BE_STREAM(p_rsp, p_error_text, (int)strlen(p_error_text)); 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Go back and put the parameter length into the buffer */ 305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rsp_param_len = p_rsp - p_rsp_param_len - 2; 306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(p_rsp_param_len, rsp_param_len); 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Set the length of the SDP data in the buffer */ 309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_buf->len = p_rsp - p_rsp_start; 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Send the buffer through L2CAP */ 312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson L2CA_DataWrite(p_ccb->connection_id, p_buf); 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 316ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 317ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_extract_uid_seq 318ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 319ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function extracts a UUID sequence from the passed input 320ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * buffer, and puts it into the passed output list. 321ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 322ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to next byte in the input buffer after the sequence. 323ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 324ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t* sdpu_extract_uid_seq(uint8_t* p, uint16_t param_len, 326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_UUID_SEQ* p_seq) { 327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_seq_end; 328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t descr, type, size; 329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t seq_len, uuid_len; 330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Assume none found */ 332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_seq->num_uids = 0; 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* A UID sequence is composed of a bunch of UIDs. */ 33572b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (sizeof(descr) > param_len) return (NULL); 33672b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson param_len -= sizeof(descr); 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT8(descr, p); 339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson type = descr >> 3; 340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson size = descr & 7; 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 342911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (type != DATA_ELE_SEQ_DESC_TYPE) return (NULL); 343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 344911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (size) { 345911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SIZE_TWO_BYTES: 346911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson seq_len = 2; 347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SIZE_FOUR_BYTES: 349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson seq_len = 4; 350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SIZE_SIXTEEN_BYTES: 352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson seq_len = 16; 353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SIZE_IN_NEXT_BYTE: 35572b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (sizeof(uint8_t) > param_len) return (NULL); 35672b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson param_len -= sizeof(uint8_t); 357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT8(seq_len, p); 358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SIZE_IN_NEXT_WORD: 36072b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (sizeof(uint16_t) > param_len) return (NULL); 36172b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson param_len -= sizeof(uint16_t); 362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT16(seq_len, p); 363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SIZE_IN_NEXT_LONG: 36572b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (sizeof(uint32_t) > param_len) return (NULL); 36672b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson param_len -= sizeof(uint32_t); 367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT32(seq_len, p); 368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (NULL); 371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 37372b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (seq_len > param_len) return (NULL); 374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_seq_end = p + seq_len; 376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Loop through, extracting the UIDs */ 378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (; p < p_seq_end;) { 379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT8(descr, p); 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project type = descr >> 3; 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project size = descr & 7; 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 383911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (type != UUID_DESC_TYPE) return (NULL); 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (size) { 386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SIZE_TWO_BYTES: 387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uuid_len = 2; 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 389911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SIZE_FOUR_BYTES: 390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uuid_len = 4; 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SIZE_SIXTEEN_BYTES: 393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uuid_len = 16; 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SIZE_IN_NEXT_BYTE: 39672b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (p + sizeof(uint8_t) > p_seq_end) return NULL; 397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT8(uuid_len, p); 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SIZE_IN_NEXT_WORD: 40072b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (p + sizeof(uint16_t) > p_seq_end) return NULL; 401911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT16(uuid_len, p); 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SIZE_IN_NEXT_LONG: 40472b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (p + sizeof(uint32_t) > p_seq_end) return NULL; 405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT32(uuid_len, p); 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If UUID length is valid, copy it across */ 41272b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (((uuid_len == 2) || (uuid_len == 4) || (uuid_len == 16)) && 41372b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson (p + uuid_len <= p_seq_end)) { 414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_seq->uuid_entry[p_seq->num_uids].len = (uint16_t)uuid_len; 415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_ARRAY(p, p_seq->uuid_entry[p_seq->num_uids].value, 416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (int)uuid_len); 417911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_seq->num_uids++; 418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (NULL); 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* We can only do so many */ 422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_seq->num_uids >= MAX_UUIDS_PER_SEQ) return (NULL); 423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p != p_seq_end) return (NULL); 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p); 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 431ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 432ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_extract_attr_seq 433ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 434ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function extracts an attribute sequence from the passed 435ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * input buffer, and puts it into the passed output list. 436ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 437ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to next byte in the input buffer after the sequence. 438ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 439ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t* sdpu_extract_attr_seq(uint8_t* p, uint16_t param_len, 441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_ATTR_SEQ* p_seq) { 442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_end_list; 443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t descr, type, size; 444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t list_len, attr_len; 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Assume none found */ 447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_seq->num_attr = 0; 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Get attribute sequence info */ 45072b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (param_len < sizeof(descr)) return NULL; 45172b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson param_len -= sizeof(descr); 452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT8(descr, p); 453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson type = descr >> 3; 454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson size = descr & 7; 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45672b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (type != DATA_ELE_SEQ_DESC_TYPE) return NULL; 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (size) { 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_BYTE: 46072b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (param_len < sizeof(uint8_t)) return NULL; 46172b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson param_len -= sizeof(uint8_t); 462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT8(list_len, p); 463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_WORD: 46672b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (param_len < sizeof(uint16_t)) return NULL; 46772b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson param_len -= sizeof(uint16_t); 468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT16(list_len, p); 469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_LONG: 47272b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (param_len < sizeof(uint32_t)) return NULL; 47372b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson param_len -= sizeof(uint32_t); 474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT32(list_len, p); 475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 47872b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson return NULL; 479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 48172b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (list_len > param_len) return NULL; 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_end_list = p + list_len; 484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Loop through, extracting the attribute IDs */ 486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (; p < p_end_list;) { 487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT8(descr, p); 488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson type = descr >> 3; 489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson size = descr & 7; 490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 49172b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (type != UINT_DESC_TYPE) return NULL; 492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (size) { 494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SIZE_TWO_BYTES: 495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson attr_len = 2; 496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SIZE_FOUR_BYTES: 498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson attr_len = 4; 499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SIZE_IN_NEXT_BYTE: 50172b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (p + sizeof(uint8_t) > p_end_list) return NULL; 502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT8(attr_len, p); 503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SIZE_IN_NEXT_WORD: 50572b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (p + sizeof(uint16_t) > p_end_list) return NULL; 506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT16(attr_len, p); 507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case SIZE_IN_NEXT_LONG: 50972b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (p + sizeof(uint32_t) > p_end_list) return NULL; 510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT32(attr_len, p); 511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 51372b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson return NULL; 514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Attribute length must be 2-bytes or 4-bytes for a paired entry. */ 51872b1cebaa9cc7ace841d887f0d4a4bf6daccde6eMyles Watson if (p + attr_len > p_end_list) return NULL; 519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (attr_len == 2) { 520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT16(p_seq->attr_entry[p_seq->num_attr].start, p); 521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_seq->attr_entry[p_seq->num_attr].end = 522911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_seq->attr_entry[p_seq->num_attr].start; 523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (attr_len == 4) { 524911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT16(p_seq->attr_entry[p_seq->num_attr].start, p); 525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT16(p_seq->attr_entry[p_seq->num_attr].end, p); 526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (NULL); 528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* We can only do so many */ 530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (++p_seq->num_attr >= MAX_ATTR_PER_SEQ) return (NULL); 531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p); 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 537ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 538ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_get_len_from_type 539ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 540ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function gets the length 541ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 542ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 543ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 544ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t* sdpu_get_len_from_type(uint8_t* p, uint8_t type, uint32_t* p_len) { 546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t u8; 547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t u16; 548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t u32; 549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (type & 7) { 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_ONE_BYTE: 552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_len = 1; 553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_TWO_BYTES: 555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_len = 2; 556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_FOUR_BYTES: 558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_len = 4; 559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_EIGHT_BYTES: 561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_len = 8; 562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_SIXTEEN_BYTES: 564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_len = 16; 565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_BYTE: 567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT8(u8, p); 568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_len = u8; 569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_WORD: 571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT16(u16, p); 572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_len = u16; 573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_LONG: 575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BE_STREAM_TO_UINT32(u32, p); 576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_len = (uint16_t)u32; 577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p); 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 584ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 585ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_is_base_uuid 586ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 587ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function checks a 128-bit UUID with the base to see if 588ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * it matches. Only the last 12 bytes are compared. 589ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 590ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if matched, else false 591ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 592ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool sdpu_is_base_uuid(uint8_t* p_uuid) { 594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 4; xx < MAX_UUID_SIZE; xx++) 597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_uuid[xx] != sdp_base_uuid[xx]) return (false); 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, matched */ 600911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 604ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 605ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_compare_uuid_arrays 606ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6079ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function compares 2 BE UUIDs. If needed, they are 6089ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * expanded to 128-bit UUIDs, then compared. 609ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 610ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * NOTE it is assumed that the arrays are in Big Endian format 611ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 612ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if matched, else false 613ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 614ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool sdpu_compare_uuid_arrays(uint8_t* p_uuid1, uint32_t len1, uint8_t* p_uuid2, 616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t len2) { 617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t nu1[MAX_UUID_SIZE]; 618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t nu2[MAX_UUID_SIZE]; 619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((len1 != 2) && (len1 != 4) && (len1 != 16)) || 621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((len2 != 2) && (len2 != 4) && (len2 != 16))) { 622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_TRACE_ERROR("%s: invalid length", __func__); 623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return false; 624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If lengths match, do a straight compare */ 627911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (len1 == len2) { 628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (len1 == 2) 629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ((p_uuid1[0] == p_uuid2[0]) && (p_uuid1[1] == p_uuid2[1])); 630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (len1 == 4) 631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ((p_uuid1[0] == p_uuid2[0]) && (p_uuid1[1] == p_uuid2[1]) && 632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_uuid1[2] == p_uuid2[2]) && (p_uuid1[3] == p_uuid2[3])); 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (memcmp(p_uuid1, p_uuid2, (size_t)len1) == 0); 635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (len1 > len2) { 636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the len1 was 4-byte, (so len2 is 2-byte), compare on the fly */ 637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (len1 == 4) { 638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ((p_uuid1[0] == 0) && (p_uuid1[1] == 0) && 639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_uuid1[2] == p_uuid2[0]) && (p_uuid1[3] == p_uuid2[1])); 640911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Normalize UUIDs to 16-byte form, then compare. Len1 must be 16 */ 642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(nu1, p_uuid1, MAX_UUID_SIZE); 643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(nu2, sdp_base_uuid, MAX_UUID_SIZE); 644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (len2 == 4) 646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(nu2, p_uuid2, len2); 647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (len2 == 2) 648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(nu2 + 2, p_uuid2, len2); 649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (memcmp(nu1, nu2, MAX_UUID_SIZE) == 0); 651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* len2 is greater than len1 */ 654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the len2 was 4-byte, (so len1 is 2-byte), compare on the fly */ 655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (len2 == 4) { 656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ((p_uuid2[0] == 0) && (p_uuid2[1] == 0) && 657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_uuid2[2] == p_uuid1[0]) && (p_uuid2[3] == p_uuid1[1])); 658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 659911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Normalize UUIDs to 16-byte form, then compare. Len1 must be 16 */ 660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(nu2, p_uuid2, MAX_UUID_SIZE); 661911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(nu1, sdp_base_uuid, MAX_UUID_SIZE); 662911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 663911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (len1 == 4) 664911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(nu1, p_uuid1, (size_t)len1); 665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (len1 == 2) 666911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(nu1 + 2, p_uuid1, (size_t)len1); 667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (memcmp(nu1, nu2, MAX_UUID_SIZE) == 0); 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 674ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 675ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_compare_bt_uuids 676ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 677ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function compares 2 BT UUID structures. 678ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 679ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * NOTE it is assumed that BT UUID structures are compressed to the 680ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * smallest possible UUIDs (by removing the base SDP UUID) 681ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 682ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if matched, else false 683ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 684ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool sdpu_compare_bt_uuids(tBT_UUID* p_uuid1, tBT_UUID* p_uuid2) { 686911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Lengths must match for BT UUIDs to match */ 687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_uuid1->len == p_uuid2->len) { 688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_uuid1->len == 2) 689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_uuid1->uu.uuid16 == p_uuid2->uu.uuid16); 690911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (p_uuid1->len == 4) 691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_uuid1->uu.uuid32 == p_uuid2->uu.uuid32); 692911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (!memcmp(p_uuid1->uu.uuid128, p_uuid2->uu.uuid128, 16)) 693911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 694911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 695911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 700ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 701ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_compare_uuid_with_attr 702ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 7039ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function compares a BT UUID structure with the UUID in 7049ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * an SDP attribute record. If needed, they are expanded to 7059ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * 128-bit UUIDs, then compared. 706ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 707ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * NOTE - it is assumed that BT UUID structures are compressed to the 708ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * smallest possible UUIDs (by removing the base SDP UUID). 709ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * - it is also assumed that the discovery atribute is compressed 710ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * to the smallest possible 711ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 712ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if matched, else false 713ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 714ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 715911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool sdpu_compare_uuid_with_attr(tBT_UUID* p_btuuid, tSDP_DISC_ATTR* p_attr) { 716911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t attr_len = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); 717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Since both UUIDs are compressed, lengths must match */ 719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_btuuid->len != attr_len) return (false); 720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_btuuid->len == 2) 722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (bool)(p_btuuid->uu.uuid16 == p_attr->attr_value.v.u16); 723911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (p_btuuid->len == 4) 724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (bool)(p_btuuid->uu.uuid32 == p_attr->attr_value.v.u32); 725911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (!memcmp(p_btuuid->uu.uuid128, (void*)p_attr->attr_value.v.array, 726911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson MAX_UUID_SIZE)) 727911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 728911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 729911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 733ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 734ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_sort_attr_list 735ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 736ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description sorts a list of attributes in numeric order from lowest to 737ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * highest to conform to SDP specification 738ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 739ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 740ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 741ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 742911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid sdpu_sort_attr_list(uint16_t num_attr, tSDP_DISCOVERY_DB* p_db) { 743911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t i; 744911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t x; 745911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 746911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Done if no attributes to sort */ 747911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (num_attr <= 1) { 748911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 749911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (num_attr > SDP_MAX_ATTR_FILTERS) { 750911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson num_attr = SDP_MAX_ATTR_FILTERS; 751911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson num_attr--; /* for the for-loop */ 754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < num_attr;) { 755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_db->attr_filters[i] > p_db->attr_filters[i + 1]) { 756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* swap the attribute IDs and start from the beginning */ 757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x = p_db->attr_filters[i]; 758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_db->attr_filters[i] = p_db->attr_filters[i + 1]; 759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_db->attr_filters[i + 1] = x; 760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson i = 0; 762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 763911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson i++; 764911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 768ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 769ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_get_list_len 770ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 771ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description gets the total list length in the sdp database for a given 772ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * uid sequence and attr sequence 773ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 774ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 775ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 776ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t sdpu_get_list_len(tSDP_UUID_SEQ* uid_seq, tSDP_ATTR_SEQ* attr_seq) { 778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_RECORD* p_rec; 779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t len = 0; 780911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t len1; 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (p_rec = sdp_db_service_search(NULL, uid_seq); p_rec; 783911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_rec = sdp_db_service_search(p_rec, uid_seq)) { 784911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len += 3; 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 786911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len1 = sdpu_get_attrib_seq_len(p_rec, attr_seq); 787911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 788911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (len1 != 0) 789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len += len1; 790911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len -= 3; 792911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 793911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return len; 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 797ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 798ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_get_attrib_seq_len 799ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 800ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description gets the length of the specific attributes in a given 801ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * sdp record 802ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 803ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 804ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 805ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t sdpu_get_attrib_seq_len(tSDP_RECORD* p_rec, tSDP_ATTR_SEQ* attr_seq) { 807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tSDP_ATTRIBUTE* p_attr; 808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t len1 = 0; 809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_range = false; 811911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t start_id = 0, end_id = 0; 812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < attr_seq->num_attr; xx++) { 814911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_range == false) { 815911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson start_id = attr_seq->attr_entry[xx].start; 816911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson end_id = attr_seq->attr_entry[xx].end; 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_attr = sdp_db_find_attr_in_rec(p_rec, start_id, end_id); 819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_attr) { 820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len1 += sdpu_get_attrib_entry_len(p_attr); 821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If doing a range, stick with this one till no more attributes found */ 823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (start_id != end_id) { 824911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Update for next time through */ 825911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson start_id = p_attr->id + 1; 826911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson xx--; 827911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_range = true; 828911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 829911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_range = false; 830911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 831911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_range = false; 832911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 833911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return len1; 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 837ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 838ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_get_attrib_entry_len 839ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 840ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description gets the length of a specific attribute 841ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 842ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 843ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 844ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 845911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t sdpu_get_attrib_entry_len(tSDP_ATTRIBUTE* p_attr) { 846911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t len = 3; 847911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 848911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* the attribute is in the db record. 849911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * assuming the attribute len is less than SDP_MAX_ATTR_LEN */ 850911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (p_attr->type) { 851911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case TEXT_STR_DESC_TYPE: /* 4 */ 852911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case DATA_ELE_SEQ_DESC_TYPE: /* 6 */ 853911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case DATA_ELE_ALT_DESC_TYPE: /* 7 */ 854911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case URL_DESC_TYPE: /* 8 */ 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_MAX_ATTR_LEN > 0xFFFF) 856911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_attr->len > 0xFFFF) { 857911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len += 5; 858911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 859911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#endif /* 0xFFFF - 0xFF */ 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_MAX_ATTR_LEN > 0xFF) 861911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_attr->len > 0xFF) { 862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len += 3; 863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* 0xFF and less*/ 865911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 866911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len += 2; 867911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len += p_attr->len; 869911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return len; 870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 871911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 872911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Now, the attribute value */ 873911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (p_attr->len) { 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 1: 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 2: 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 4: 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 8: 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 16: 879911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len += 1; 880911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 882911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len += 2; 883911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 884911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 886911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len += p_attr->len; 887911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return len; 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 891ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 892ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_build_partial_attrib_entry 893ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 894ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function fills a buffer with partial attribute. It is 895ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * assumed that the maximum size of any attribute is 256 bytes. 896ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 897ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_out: output buffer 898ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_attr: attribute to be copied partially into p_out 899ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * rem_len: num bytes to copy into p_out 9009ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * offset: current start offset within the attr that needs to 9019ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * be copied 902ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 903ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns Pointer to next byte in the output buffer. 904ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * offset is also updated 905ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 906ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 907911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t* sdpu_build_partial_attrib_entry(uint8_t* p_out, tSDP_ATTRIBUTE* p_attr, 908911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t len, uint16_t* offset) { 909911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_attr_buff = 910911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint8_t*)osi_malloc(sizeof(uint8_t) * SDP_MAX_ATTR_LEN); 911911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sdpu_build_attrib_entry(p_attr_buff, p_attr); 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 913911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t attr_len = sdpu_get_attrib_entry_len(p_attr); 914ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 915911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (len > SDP_MAX_ATTR_LEN) { 916911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SDP_TRACE_ERROR("%s len %d exceeds SDP_MAX_ATTR_LEN", __func__, len); 917911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len = SDP_MAX_ATTR_LEN; 918911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 920911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson size_t len_to_copy = 921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((attr_len - *offset) < len) ? (attr_len - *offset) : len; 922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_out, &p_attr_buff[*offset], len_to_copy); 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 924911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_out = &p_out[len_to_copy]; 925911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *offset += len_to_copy; 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 927911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_attr_buff); 928911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return p_out; 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 932ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 933ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function sdpu_uuid16_to_uuid128 934ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 9359ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function converts UUID-16 to UUID-128 by including the 9369ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * base UUID 937ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 938ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * uuid16: 2-byte UUID 939ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_uuid128: Expanded 128-bit UUID 940ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 941ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns None 942ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 943ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 944911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid sdpu_uuid16_to_uuid128(uint16_t uuid16, uint8_t* p_uuid128) { 945911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t uuid16_bo; 946911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(p_uuid128, 0, 16); 947911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 948911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_uuid128, sdp_base_uuid, MAX_UUID_SIZE); 949911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uuid16_bo = ntohs(uuid16); 950911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_uuid128 + 2, &uuid16_bo, sizeof(uint16_t)); 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 952