15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 1999-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains SDP utility functions 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h> 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <netinet/in.h> 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h> 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2cdefs.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcidefs.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sdp_api.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sdpint.h" 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const UINT8 sdp_base_uuid[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_find_ccb_by_cid 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function searches the CCB table for an entry with the 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** passed CID. 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns the CCB address, or NULL if not found. 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttCONN_CB *sdpu_find_ccb_by_cid (UINT16 cid) 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tCONN_CB *p_ccb; 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Look through each connection control block */ 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0, p_ccb = sdp_cb.ccb; xx < SDP_MAX_CONNECTIONS; xx++, p_ccb++) 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_ccb->con_state != SDP_STATE_IDLE) && (p_ccb->connection_id == cid)) 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p_ccb); 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If here, not found */ 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_find_ccb_by_db 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function searches the CCB table for an entry with the 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** passed discovery db. 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns the CCB address, or NULL if not found. 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttCONN_CB *sdpu_find_ccb_by_db (tSDP_DISCOVERY_DB *p_db) 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_CLIENT_ENABLED == TRUE 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tCONN_CB *p_ccb; 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_db) 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Look through each connection control block */ 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0, p_ccb = sdp_cb.ccb; xx < SDP_MAX_CONNECTIONS; xx++, p_ccb++) 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_ccb->con_state != SDP_STATE_IDLE) && (p_ccb->p_db == p_db)) 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p_ccb); 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If here, not found */ 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_allocate_ccb 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function allocates a new CCB. 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns CCB address, or NULL if none available. 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttCONN_CB *sdpu_allocate_ccb (void) 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tCONN_CB *p_ccb; 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Look through each connection control block for a free one */ 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0, p_ccb = sdp_cb.ccb; xx < SDP_MAX_CONNECTIONS; xx++, p_ccb++) 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb->con_state == SDP_STATE_IDLE) 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (p_ccb, 0, sizeof (tCONN_CB)); 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->timer_entry.param = (UINT32) p_ccb; 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p_ccb); 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If here, no free CCB found */ 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_release_ccb 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function releases a CCB. 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid sdpu_release_ccb (tCONN_CB *p_ccb) 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Ensure timer is stopped */ 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer (&p_ccb->timer_entry); 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Drop any response pointer we may be holding */ 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->con_state = SDP_STATE_IDLE; 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SDP_CLIENT_ENABLED == TRUE 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->is_attr_search = FALSE; 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Free the response buffer */ 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb->rsp_list) 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 159a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati SDP_TRACE_DEBUG("releasing SDP rsp_list"); 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_ccb->rsp_list); 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ccb->rsp_list = NULL; 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_build_attrib_seq 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function builds an attribute sequence from the list of 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** passed attributes. It is also passed the address of the output 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** buffer. 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to next byte in the output buffer. 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *sdpu_build_attrib_seq (UINT8 *p_out, UINT16 *p_attr, UINT16 num_attrs) 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* First thing is the data element header. See if the length fits 1 byte */ 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If no attributes, assume a 4-byte wildcard */ 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_attr) 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project xx = 5; 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project xx = num_attrs * 3; 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (xx > 255) 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p_out, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_WORD); 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p_out, xx); 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p_out, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE); 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p_out, xx); 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there are no attributes specified, assume caller wants wildcard */ 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_attr) 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p_out, (UINT_DESC_TYPE << 3) | SIZE_FOUR_BYTES); 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p_out, 0); 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p_out, 0xFFFF); 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Loop through and put in all the attributes(s) */ 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < num_attrs; xx++, p_attr++) 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p_out, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES); 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p_out, *p_attr); 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p_out); 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_build_attrib_entry 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function builds an attribute entry from the passed 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** attribute record. It is also passed the address of the output 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** buffer. 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to next byte in the output buffer. 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *sdpu_build_attrib_entry (UINT8 *p_out, tSDP_ATTRIBUTE *p_attr) 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* First, store the attribute ID. Goes as a UINT */ 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p_out, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES); 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p_out, p_attr->id); 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the attribute is in the db record. 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * assuming the attribute len is less than SDP_MAX_ATTR_LEN */ 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(p_attr->type) 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case TEXT_STR_DESC_TYPE: /* 4 */ 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case DATA_ELE_SEQ_DESC_TYPE:/* 6 */ 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case DATA_ELE_ALT_DESC_TYPE:/* 7 */ 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case URL_DESC_TYPE: /* 8 */ 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_MAX_ATTR_LEN > 0xFFFF) 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_attr->len > 0xFFFF) 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_IN_NEXT_LONG); 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_BE_STREAM (p_out, p_attr->len); 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* 0xFFFF - 0xFF */ 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_MAX_ATTR_LEN > 0xFF) 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_attr->len > 0xFF) 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_IN_NEXT_WORD); 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p_out, p_attr->len); 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* 0xFF and less*/ 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_IN_NEXT_BYTE); 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p_out, p_attr->len); 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_BE_STREAM (p_out, p_attr->value_ptr, (int)p_attr->len); 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p_out); 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Now, store the attribute value */ 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_attr->len) 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 1: 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_ONE_BYTE); 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 2: 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_TWO_BYTES); 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 4: 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_FOUR_BYTES); 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 8: 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_EIGHT_BYTES); 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 16: 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_SIXTEEN_BYTES); 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p_out, (p_attr->type << 3) | SIZE_IN_NEXT_BYTE); 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p_out, p_attr->len); 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_BE_STREAM (p_out, p_attr->value_ptr, (int)p_attr->len); 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p_out); 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_build_n_send_error 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function builds and sends an error packet. 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid sdpu_build_n_send_error (tCONN_CB *p_ccb, UINT16 trans_num, UINT16 error_code, char *p_error_text) 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_rsp, *p_rsp_start, *p_rsp_param_len; 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 rsp_param_len; 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 320a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati SDP_TRACE_WARNING ("SDP - sdpu_build_n_send_error code: 0x%x CID: 0x%x", 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project error_code, p_ccb->connection_id); 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Get a buffer to use to build and send the packet to L2CAP */ 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (BT_HDR *)GKI_getpoolbuf (SDP_POOL_ID)) == NULL) 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 326a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati SDP_TRACE_ERROR ("SDP - no buf for err msg"); 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = L2CAP_MIN_OFFSET; 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rsp = p_rsp_start = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET; 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_BE_STREAM (p_rsp, SDP_PDU_ERROR_RESPONSE); 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p_rsp, trans_num); 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Skip the parameter length, we need to add it at the end */ 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rsp_param_len = p_rsp; 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rsp += 2; 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p_rsp, error_code); 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Unplugfest example traces do not have any error text */ 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_error_text) 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_BE_STREAM (p_rsp, p_error_text, (int) strlen (p_error_text)); 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Go back and put the parameter length into the buffer */ 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rsp_param_len = p_rsp - p_rsp_param_len - 2; 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM (p_rsp_param_len, rsp_param_len); 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the length of the SDP data in the buffer */ 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = p_rsp - p_rsp_start; 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send the buffer through L2CAP */ 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_DataWrite (p_ccb->connection_id, p_buf); 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_extract_uid_seq 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function extracts a UUID sequence from the passed input 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** buffer, and puts it into the passed output list. 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to next byte in the input buffer after the sequence. 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *sdpu_extract_uid_seq (UINT8 *p, UINT16 param_len, tSDP_UUID_SEQ *p_seq) 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_seq_end; 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 descr, type, size; 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 seq_len, uuid_len; 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Assume none found */ 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_seq->num_uids = 0; 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* A UID sequence is composed of a bunch of UIDs. */ 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT8 (descr, p); 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project type = descr >> 3; 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project size = descr & 7; 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (type != DATA_ELE_SEQ_DESC_TYPE) 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (size) 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_TWO_BYTES: 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project seq_len = 2; 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_FOUR_BYTES: 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project seq_len = 4; 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_SIXTEEN_BYTES: 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project seq_len = 16; 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_BYTE: 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT8 (seq_len, p); 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_WORD: 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (seq_len, p); 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_LONG: 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT32 (seq_len, p); 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (seq_len >= param_len) 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_seq_end = p + seq_len; 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Loop through, extracting the UIDs */ 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for ( ; p < p_seq_end ; ) 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT8 (descr, p); 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project type = descr >> 3; 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project size = descr & 7; 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (type != UUID_DESC_TYPE) 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (size) 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_TWO_BYTES: 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_len = 2; 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_FOUR_BYTES: 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_len = 4; 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_SIXTEEN_BYTES: 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_len = 16; 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_BYTE: 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT8 (uuid_len, p); 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_WORD: 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (uuid_len, p); 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_LONG: 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT32 (uuid_len, p); 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If UUID length is valid, copy it across */ 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((uuid_len == 2) || (uuid_len == 4) || (uuid_len == 16)) 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_seq->uuid_entry[p_seq->num_uids].len = (UINT16) uuid_len; 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_ARRAY (p, p_seq->uuid_entry[p_seq->num_uids].value, (int)uuid_len); 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_seq->num_uids++; 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We can only do so many */ 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_seq->num_uids >= MAX_UUIDS_PER_SEQ) 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p != p_seq_end) 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p); 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_extract_attr_seq 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function extracts an attribute sequence from the passed 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** input buffer, and puts it into the passed output list. 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to next byte in the input buffer after the sequence. 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *sdpu_extract_attr_seq (UINT8 *p, UINT16 param_len, tSDP_ATTR_SEQ *p_seq) 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_end_list; 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 descr, type, size; 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 list_len, attr_len; 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Assume none found */ 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_seq->num_attr = 0; 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Get attribute sequence info */ 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT8 (descr, p); 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project type = descr >> 3; 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project size = descr & 7; 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (type != DATA_ELE_SEQ_DESC_TYPE) 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p); 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (size) 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_BYTE: 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT8 (list_len, p); 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_WORD: 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (list_len, p); 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_LONG: 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT32 (list_len, p); 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p); 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (list_len > param_len) 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p); 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_end_list = p + list_len; 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Loop through, extracting the attribute IDs */ 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for ( ; p < p_end_list ; ) 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT8 (descr, p); 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project type = descr >> 3; 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project size = descr & 7; 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (type != UINT_DESC_TYPE) 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p); 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (size) 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_TWO_BYTES: 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_len = 2; 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_FOUR_BYTES: 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_len = 4; 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_BYTE: 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT8 (attr_len, p); 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_WORD: 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (attr_len, p); 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_LONG: 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT32 (attr_len, p); 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Attribute length must be 2-bytes or 4-bytes for a paired entry. */ 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (attr_len == 2) 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (p_seq->attr_entry[p_seq->num_attr].start, p); 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_seq->attr_entry[p_seq->num_attr].end = p_seq->attr_entry[p_seq->num_attr].start; 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (attr_len == 4) 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (p_seq->attr_entry[p_seq->num_attr].start, p); 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (p_seq->attr_entry[p_seq->num_attr].end, p); 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We can only do so many */ 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (++p_seq->num_attr >= MAX_ATTR_PER_SEQ) 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (NULL); 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p); 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_get_len_from_type 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function gets the length 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *sdpu_get_len_from_type (UINT8 *p, UINT8 type, UINT32 *p_len) 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 u8; 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 u16; 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 u32; 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (type & 7) 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_ONE_BYTE: 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_len = 1; 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_TWO_BYTES: 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_len = 2; 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_FOUR_BYTES: 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_len = 4; 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_EIGHT_BYTES: 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_len = 8; 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_SIXTEEN_BYTES: 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_len = 16; 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_BYTE: 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT8 (u8, p); 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_len = u8; 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_WORD: 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT16 (u16, p); 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_len = u16; 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SIZE_IN_NEXT_LONG: 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BE_STREAM_TO_UINT32 (u32, p); 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_len = (UINT16) u32; 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p); 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_is_base_uuid 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function checks a 128-bit UUID with the base to see if 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** it matches. Only the last 12 bytes are compared. 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if matched, else FALSE 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN sdpu_is_base_uuid (UINT8 *p_uuid) 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 4; xx < MAX_UUID_SIZE; xx++) 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_uuid[xx] != sdp_base_uuid[xx]) 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (FALSE); 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If here, matched */ 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (TRUE); 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_compare_uuid_arrays 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function compares 2 BE UUIDs. If needed, they are expanded 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to 128-bit UUIDs, then compared. 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE it is assumed that the arrays are in Big Endian format 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if matched, else FALSE 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN sdpu_compare_uuid_arrays (UINT8 *p_uuid1, UINT32 len1, UINT8 *p_uuid2, UINT16 len2) 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 nu1[MAX_UUID_SIZE]; 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 nu2[MAX_UUID_SIZE]; 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If lengths match, do a straight compare */ 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len1 == len2) 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len1 == 2) 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ((p_uuid1[0] == p_uuid2[0]) && (p_uuid1[1] == p_uuid2[1])); 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len1 == 4) 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ( (p_uuid1[0] == p_uuid2[0]) && (p_uuid1[1] == p_uuid2[1]) 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_uuid1[2] == p_uuid2[2]) && (p_uuid1[3] == p_uuid2[3]) ); 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (memcmp (p_uuid1, p_uuid2, (size_t)len1) == 0); 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (len1 > len2) 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the len1 was 4-byte, (so len2 is 2-byte), compare on the fly */ 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len1 == 4) 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ( (p_uuid1[0] == 0) && (p_uuid1[1] == 0) 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_uuid1[2] == p_uuid2[0]) && (p_uuid1[3] == p_uuid2[1]) ); 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Normalize UUIDs to 16-byte form, then compare. Len1 must be 16 */ 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (nu1, p_uuid1, MAX_UUID_SIZE); 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (nu2, sdp_base_uuid, MAX_UUID_SIZE); 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len2 == 4) 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (nu2, p_uuid2, len2); 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (nu2 + 2, p_uuid2, len2); 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (memcmp (nu1, nu2, MAX_UUID_SIZE) == 0); 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* len2 is greater than len1 */ 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the len2 was 4-byte, (so len1 is 2-byte), compare on the fly */ 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len2 == 4) 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ( (p_uuid2[0] == 0) && (p_uuid2[1] == 0) 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_uuid2[2] == p_uuid1[0]) && (p_uuid2[3] == p_uuid1[1]) ); 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Normalize UUIDs to 16-byte form, then compare. Len1 must be 16 */ 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (nu2, p_uuid2, MAX_UUID_SIZE); 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (nu1, sdp_base_uuid, MAX_UUID_SIZE); 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len1 == 4) 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (nu1, p_uuid1, (size_t)len1); 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (nu1 + 2, p_uuid1, (size_t)len1); 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (memcmp (nu1, nu2, MAX_UUID_SIZE) == 0); 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_compare_bt_uuids 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function compares 2 BT UUID structures. 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE it is assumed that BT UUID structures are compressed to the 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** smallest possible UUIDs (by removing the base SDP UUID) 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if matched, else FALSE 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN sdpu_compare_bt_uuids (tBT_UUID *p_uuid1, tBT_UUID *p_uuid2) 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Lengths must match for BT UUIDs to match */ 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_uuid1->len == p_uuid2->len) 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_uuid1->len == 2) 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p_uuid1->uu.uuid16 == p_uuid2->uu.uuid16); 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_uuid1->len == 4) 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (p_uuid1->uu.uuid32 == p_uuid2->uu.uuid32); 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (!memcmp (p_uuid1->uu.uuid128, p_uuid2->uu.uuid128, 16)) 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (TRUE); 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (FALSE); 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_compare_uuid_with_attr 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function compares a BT UUID structure with the UUID in an 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** SDP attribute record. If needed, they are expanded to 128-bit 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** UUIDs, then compared. 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE - it is assumed that BT UUID structures are compressed to the 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** smallest possible UUIDs (by removing the base SDP UUID). 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** - it is also assumed that the discovery atribute is compressed 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to the smallest possible 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if matched, else FALSE 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN sdpu_compare_uuid_with_attr (tBT_UUID *p_btuuid, tSDP_DISC_ATTR *p_attr) 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 attr_len = SDP_DISC_ATTR_LEN (p_attr->attr_len_type); 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Since both UUIDs are compressed, lengths must match */ 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_btuuid->len != attr_len) 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (FALSE); 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_btuuid->len == 2) 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BOOLEAN)(p_btuuid->uu.uuid16 == p_attr->attr_value.v.u16); 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_btuuid->len == 4) 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BOOLEAN)(p_btuuid->uu.uuid32 == p_attr->attr_value.v.u32); 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* coverity[overrun-buffer-arg] */ 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Event overrun-buffer-arg: Overrun of static array "&p_attr->attr_value.v.array" of size 4 bytes by passing it to a function which indexes it with argument "16U" at byte position 15 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FALSE-POSITIVE error from Coverity test tool. Please do NOT remove following comment. 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project False-positive: SDP uses scratch buffer to hold the attribute value. 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project The actual size of tSDP_DISC_ATVAL does not matter. 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project If the array size in tSDP_DISC_ATVAL is increase, we would increase the system RAM usage unnecessarily 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (!memcmp (p_btuuid->uu.uuid128, p_attr->attr_value.v.array, MAX_UUID_SIZE)) 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (TRUE); 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (FALSE); 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_sort_attr_list 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description sorts a list of attributes in numeric order from lowest to 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** highest to conform to SDP specification 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid sdpu_sort_attr_list( UINT16 num_attr, tSDP_DISCOVERY_DB *p_db ) 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 i; 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 x; 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Done if no attributes to sort */ 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (num_attr <= 1) 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (num_attr > SDP_MAX_ATTR_FILTERS) 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_attr = SDP_MAX_ATTR_FILTERS; 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_attr--; /* for the for-loop */ 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for( i = 0; i < num_attr; ) 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( p_db->attr_filters[i] > p_db->attr_filters[i+1] ) 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* swap the attribute IDs and start from the beginning */ 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project x = p_db->attr_filters[i]; 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_db->attr_filters[i] = p_db->attr_filters[i+1]; 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_db->attr_filters[i+1] = x; 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i = 0; 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i++; 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_get_list_len 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description gets the total list length in the sdp database for a given 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** uid sequence and attr sequence 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 sdpu_get_list_len(tSDP_UUID_SEQ *uid_seq, tSDP_ATTR_SEQ *attr_seq) 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_RECORD *p_rec; 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 len = 0; 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 len1; 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (p_rec = sdp_db_service_search (NULL, uid_seq); p_rec; p_rec = sdp_db_service_search (p_rec, uid_seq)) 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += 3; 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len1 = sdpu_get_attrib_seq_len(p_rec, attr_seq ); 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len1 != 0) 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += len1; 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len -= 3; 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return len; 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_get_attrib_seq_len 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description gets the length of the specific attributes in a given 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** sdp record 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 sdpu_get_attrib_seq_len(tSDP_RECORD *p_rec, tSDP_ATTR_SEQ *attr_seq) 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_ATTRIBUTE *p_attr; 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 len1 = 0; 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 xx; 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_range = FALSE; 887ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 start_id=0, end_id=0; 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (xx = 0; xx < attr_seq->num_attr; xx++) 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_range == FALSE) 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start_id = attr_seq->attr_entry[xx].start; 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project end_id = attr_seq->attr_entry[xx].end; 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_attr = sdp_db_find_attr_in_rec (p_rec, 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start_id, 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project end_id); 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_attr) 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len1 += sdpu_get_attrib_entry_len (p_attr); 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If doing a range, stick with this one till no more attributes found */ 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (start_id != end_id) 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Update for next time through */ 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project start_id = p_attr->id + 1; 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project xx--; 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_range = TRUE; 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_range = FALSE; 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_range = FALSE; 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return len1; 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_get_attrib_entry_len 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description gets the length of a specific attribute 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 sdpu_get_attrib_entry_len(tSDP_ATTRIBUTE *p_attr) 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 len = 3; 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the attribute is in the db record. 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * assuming the attribute len is less than SDP_MAX_ATTR_LEN */ 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(p_attr->type) 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case TEXT_STR_DESC_TYPE: /* 4 */ 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case DATA_ELE_SEQ_DESC_TYPE:/* 6 */ 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case DATA_ELE_ALT_DESC_TYPE:/* 7 */ 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case URL_DESC_TYPE: /* 8 */ 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_MAX_ATTR_LEN > 0xFFFF) 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_attr->len > 0xFFFF) 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += 5; 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif/* 0xFFFF - 0xFF */ 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SDP_MAX_ATTR_LEN > 0xFF) 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_attr->len > 0xFF) 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += 3; 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* 0xFF and less*/ 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += 2; 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += p_attr->len; 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return len; 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Now, the attribute value */ 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_attr->len) 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 1: 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 2: 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 4: 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 8: 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 16: 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += 1; 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += 2; 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += p_attr->len; 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return len; 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_build_partial_attrib_entry 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function fills a buffer with partial attribute. It is 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** assumed that the maximum size of any attribute is 256 bytes. 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_out: output buffer 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_attr: attribute to be copied partially into p_out 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** rem_len: num bytes to copy into p_out 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** offset: current start offset within the attr that needs to be copied 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to next byte in the output buffer. 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** offset is also updated 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *sdpu_build_partial_attrib_entry (UINT8 *p_out, tSDP_ATTRIBUTE *p_attr, UINT16 len, UINT16 *offset) 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1002ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 *p_attr_buff; 1003ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 *p_tmp_attr; 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project size_t len_to_copy; 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 attr_len; 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1007ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_attr_buff = (UINT8 *) GKI_getbuf(sizeof(UINT8) * SDP_MAX_ATTR_LEN )) == NULL) 1008ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1009a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati SDP_TRACE_ERROR("sdpu_build_partial_attrib_entry cannot get a buffer!"); 1010ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return NULL; 1011ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1012ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_tmp_attr = p_attr_buff; 1013ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sdpu_build_attrib_entry(p_tmp_attr, p_attr); 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_len = sdpu_get_attrib_entry_len(p_attr); 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len_to_copy = ((attr_len - *offset) < len) ? (attr_len - *offset): len; 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1019ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memcpy(p_out, &p_attr_buff[*offset], len_to_copy); 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_out = &p_out[len_to_copy]; 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *offset += len_to_copy; 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1024ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_freebuf(p_attr_buff); 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_out; 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function sdpu_uuid16_to_uuid128 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function converts UUID-16 to UUID-128 by including the base UUID 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** uuid16: 2-byte UUID 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_uuid128: Expanded 128-bit UUID 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid sdpu_uuid16_to_uuid128(UINT16 uuid16, UINT8* p_uuid128) 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 uuid16_bo; 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_uuid128, 0, 16); 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_uuid128, sdp_base_uuid, MAX_UUID_SIZE); 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid16_bo = ntohs(uuid16); 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_uuid128+ 2, &uuid16_bo, sizeof(uint16_t)); 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1049