sdp.c revision 1d1154156df28660e41031df5c3f1ffe91c01aae
1542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 2764abe23a0d4ede999f1f34ee0e310c0eeaaff79Marcel Holtmann * 3764abe23a0d4ede999f1f34ee0e310c0eeaaff79Marcel Holtmann * BlueZ - Bluetooth protocol stack for Linux 4764abe23a0d4ede999f1f34ee0e310c0eeaaff79Marcel Holtmann * 5764abe23a0d4ede999f1f34ee0e310c0eeaaff79Marcel Holtmann * Copyright (C) 2001-2002 Nokia Corporation 6764abe23a0d4ede999f1f34ee0e310c0eeaaff79Marcel Holtmann * Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com> 79184e2eeb7b97371c6b83b747c8984e2340d2b47Marcel Holtmann * Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org> 8764abe23a0d4ede999f1f34ee0e310c0eeaaff79Marcel Holtmann * Copyright (C) 2002-2003 Stephen Crane <steve.crane@rococosoft.com> 9764abe23a0d4ede999f1f34ee0e310c0eeaaff79Marcel Holtmann * 10764abe23a0d4ede999f1f34ee0e310c0eeaaff79Marcel Holtmann * 11764abe23a0d4ede999f1f34ee0e310c0eeaaff79Marcel Holtmann * This program is free software; you can redistribute it and/or modify 12c0d524486a50e8366c12c5ebea1a4441e9db46aaMarcel Holtmann * it under the terms of the GNU General Public License as published by 13c0d524486a50e8366c12c5ebea1a4441e9db46aaMarcel Holtmann * the Free Software Foundation; either version 2 of the License, or 14c0d524486a50e8366c12c5ebea1a4441e9db46aaMarcel Holtmann * (at your option) any later version. 15764abe23a0d4ede999f1f34ee0e310c0eeaaff79Marcel Holtmann * 16c0d524486a50e8366c12c5ebea1a4441e9db46aaMarcel Holtmann * This program is distributed in the hope that it will be useful, 17c0d524486a50e8366c12c5ebea1a4441e9db46aaMarcel Holtmann * but WITHOUT ANY WARRANTY; without even the implied warranty of 18c0d524486a50e8366c12c5ebea1a4441e9db46aaMarcel Holtmann * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19c0d524486a50e8366c12c5ebea1a4441e9db46aaMarcel Holtmann * GNU General Public License for more details. 20764abe23a0d4ede999f1f34ee0e310c0eeaaff79Marcel Holtmann * 21c0d524486a50e8366c12c5ebea1a4441e9db46aaMarcel Holtmann * You should have received a copy of the GNU General Public License 22c0d524486a50e8366c12c5ebea1a4441e9db46aaMarcel Holtmann * along with this program; if not, write to the Free Software 23c0d524486a50e8366c12c5ebea1a4441e9db46aaMarcel Holtmann * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 24764abe23a0d4ede999f1f34ee0e310c0eeaaff79Marcel Holtmann * 25542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 26542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 27764abe23a0d4ede999f1f34ee0e310c0eeaaff79Marcel Holtmann#ifdef HAVE_CONFIG_H 28764abe23a0d4ede999f1f34ee0e310c0eeaaff79Marcel Holtmann#include <config.h> 29764abe23a0d4ede999f1f34ee0e310c0eeaaff79Marcel Holtmann#endif 30764abe23a0d4ede999f1f34ee0e310c0eeaaff79Marcel Holtmann 31542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann#include <stdio.h> 32542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann#include <errno.h> 331be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim#include <fcntl.h> 34b393cdff611943a05ec598048b5c4be8130151ddMarcel Holtmann#include <unistd.h> 35542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann#include <stdlib.h> 36b393cdff611943a05ec598048b5c4be8130151ddMarcel Holtmann#include <limits.h> 37bb45b882917f26aaa26b2b903b70d622b39cce84Marcel Holtmann#include <string.h> 38654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann#include <syslog.h> 398bd7ef87e49b68c3090448f337454a1704f5e048Marcel Holtmann#include <sys/time.h> 408bd7ef87e49b68c3090448f337454a1704f5e048Marcel Holtmann#include <sys/types.h> 41924fa35c97929ff95590a1f33cc2bd8cca7cf1f2Marcel Holtmann#include <sys/socket.h> 42924fa35c97929ff95590a1f33cc2bd8cca7cf1f2Marcel Holtmann#include <sys/un.h> 43654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann#include <netinet/in.h> 44654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann 45a5b1e3d02c8b356bb167dd7e4b6ab54edf271e7bMarcel Holtmann#include "bluetooth.h" 46a5b1e3d02c8b356bb167dd7e4b6ab54edf271e7bMarcel Holtmann#include "hci.h" 47a5b1e3d02c8b356bb167dd7e4b6ab54edf271e7bMarcel Holtmann#include "hci_lib.h" 48a5b1e3d02c8b356bb167dd7e4b6ab54edf271e7bMarcel Holtmann#include "l2cap.h" 49a5b1e3d02c8b356bb167dd7e4b6ab54edf271e7bMarcel Holtmann#include "sdp.h" 50a5b1e3d02c8b356bb167dd7e4b6ab54edf271e7bMarcel Holtmann#include "sdp_lib.h" 51a5b1e3d02c8b356bb167dd7e4b6ab54edf271e7bMarcel Holtmann 52654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann#define SDPINF(fmt, arg...) syslog(LOG_INFO, fmt "\n", ## arg) 53654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann#define SDPERR(fmt, arg...) syslog(LOG_ERR, "%s: " fmt "\n", __func__ , ## arg) 54654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann 55206da78a25ae175741a7444edd13dcf67bbdf059Luiz Augusto von Dentz#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) 56206da78a25ae175741a7444edd13dcf67bbdf059Luiz Augusto von Dentz 57654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann#ifdef SDP_DEBUG 58654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann#define SDPDBG(fmt, arg...) syslog(LOG_DEBUG, "%s: " fmt "\n", __func__ , ## arg) 59654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann#else 60654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann#define SDPDBG(fmt...) 61654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann#endif 62654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann 63654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann#if __BYTE_ORDER == __BIG_ENDIAN 64654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann#define ntoh64(x) (x) 65654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmannstatic inline void ntoh128(uint128_t *src, uint128_t *dst) 66654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann{ 67654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann int i; 68654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann for (i = 0; i < 16; i++) 69654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann dst->data[i] = src->data[i]; 70654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann} 71654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann#else 72654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmannstatic inline uint64_t ntoh64(uint64_t n) 73654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann{ 74654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann uint64_t h; 75654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann uint64_t tmp = ntohl(n & 0x00000000ffffffff); 76654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann h = ntohl(n >> 32); 77654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann h |= tmp << 32; 78654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann return h; 79654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann} 80654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmannstatic inline void ntoh128(uint128_t *src, uint128_t *dst) 81654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann{ 82654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann int i; 83654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann for (i = 0; i < 16; i++) 84654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann dst->data[15 - i] = src->data[i]; 85654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann} 86654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann#endif 87654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann 88654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann#define hton64(x) ntoh64(x) 89654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann#define hton128(x, y) ntoh128(x, y) 90542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 91542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann#define BASE_UUID "00000000-0000-1000-8000-00805F9B34FB" 92542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 933f8700636d21bb868c2dbb8d2403e550a7750cebMarcel Holtmannstatic uint128_t bluetooth_base_uuid = { 943f8700636d21bb868c2dbb8d2403e550a7750cebMarcel Holtmann .data = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 95c30706178221e3df5dfe82eb5c91f39fe118eb78Marcel Holtmann 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB } 963f8700636d21bb868c2dbb8d2403e550a7750cebMarcel Holtmann}; 97542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 98654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann#define SDP_MAX_ATTR_LEN 65535 99654f832d98530b05dc7ffaefff5950a32de76b3cMarcel Holtmann 100e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentzstatic sdp_data_t *sdp_copy_seq(sdp_data_t *data); 101eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocerastatic int sdp_attr_add_new_with_length(sdp_record_t *rec, 102eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera uint16_t attr, uint8_t dtd, const void *value, uint32_t len); 1036996a497c429be009a9f522c3a28ad777d2ba3b5Luiz Augusto von Dentzstatic int sdp_gen_buffer(sdp_buf_t *buf, sdp_data_t *d); 104e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 105542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* Message structure. */ 106542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannstruct tupla { 107542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int index; 108542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann char *str; 109542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann}; 110542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 111542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannstatic struct tupla Protocol[] = { 1126864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { SDP_UUID, "SDP" }, 1136864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { UDP_UUID, "UDP" }, 1146864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { RFCOMM_UUID, "RFCOMM" }, 1156864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { TCP_UUID, "TCP" }, 1166864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { TCS_BIN_UUID, "TCS-BIN" }, 1176864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { TCS_AT_UUID, "TCS-AT" }, 1186864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { OBEX_UUID, "OBEX" }, 1196864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { IP_UUID, "IP" }, 1206864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { FTP_UUID, "FTP" }, 1216864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { HTTP_UUID, "HTTP" }, 1226864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { WSP_UUID, "WSP" }, 1236864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { BNEP_UUID, "BNEP" }, 1246864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { UPNP_UUID, "UPNP" }, 1256864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { HIDP_UUID, "HIDP" }, 1266864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { HCRP_CTRL_UUID, "HCRP-Ctrl" }, 1276864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { HCRP_DATA_UUID, "HCRP-Data" }, 1286864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { HCRP_NOTE_UUID, "HCRP-Notify" }, 1296864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { AVCTP_UUID, "AVCTP" }, 1306864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { AVDTP_UUID, "AVDTP" }, 1316864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { CMTP_UUID, "CMTP" }, 1326864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { UDI_UUID, "UDI" }, 133f767416e71484be2463caa6482dc978e165cabaeMarcel Holtmann { MCAP_CTRL_UUID, "MCAP-Ctrl" }, 134f767416e71484be2463caa6482dc978e165cabaeMarcel Holtmann { MCAP_DATA_UUID, "MCAP-Data" }, 1356864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { L2CAP_UUID, "L2CAP" }, 136542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann { 0 } 137542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann}; 138542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 139542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannstatic struct tupla ServiceClass[] = { 1406864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { SDP_SERVER_SVCLASS_ID, "SDP Server" }, 1416864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { BROWSE_GRP_DESC_SVCLASS_ID, "Browse Group Descriptor" }, 1426864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { PUBLIC_BROWSE_GROUP, "Public Browse Group" }, 1436864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { SERIAL_PORT_SVCLASS_ID, "Serial Port" }, 1446864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { LAN_ACCESS_SVCLASS_ID, "LAN Access Using PPP" }, 1456864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { DIALUP_NET_SVCLASS_ID, "Dialup Networking" }, 1466864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { IRMC_SYNC_SVCLASS_ID, "IrMC Sync" }, 1476864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { OBEX_OBJPUSH_SVCLASS_ID, "OBEX Object Push" }, 1486864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { OBEX_FILETRANS_SVCLASS_ID, "OBEX File Transfer" }, 1496864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { IRMC_SYNC_CMD_SVCLASS_ID, "IrMC Sync Command" }, 1506864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { HEADSET_SVCLASS_ID, "Headset" }, 1516864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { CORDLESS_TELEPHONY_SVCLASS_ID, "Cordless Telephony" }, 1526864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { AUDIO_SOURCE_SVCLASS_ID, "Audio Source" }, 1536864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { AUDIO_SINK_SVCLASS_ID, "Audio Sink" }, 1546864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { AV_REMOTE_TARGET_SVCLASS_ID, "AV Remote Target" }, 1556864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { ADVANCED_AUDIO_SVCLASS_ID, "Advanced Audio" }, 1566864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { AV_REMOTE_SVCLASS_ID, "AV Remote" }, 1576864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { VIDEO_CONF_SVCLASS_ID, "Video Conferencing" }, 1586864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { INTERCOM_SVCLASS_ID, "Intercom" }, 1596864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { FAX_SVCLASS_ID, "Fax" }, 1606864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { HEADSET_AGW_SVCLASS_ID, "Headset Audio Gateway" }, 1616864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { WAP_SVCLASS_ID, "WAP" }, 1626864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { WAP_CLIENT_SVCLASS_ID, "WAP Client" }, 1636864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { PANU_SVCLASS_ID, "PAN User" }, 1646864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { NAP_SVCLASS_ID, "Network Access Point" }, 1656864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { GN_SVCLASS_ID, "PAN Group Network" }, 1666864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { DIRECT_PRINTING_SVCLASS_ID, "Direct Printing" }, 1676864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { REFERENCE_PRINTING_SVCLASS_ID, "Reference Printing" }, 1686864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { IMAGING_SVCLASS_ID, "Imaging" }, 1696864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { IMAGING_RESPONDER_SVCLASS_ID, "Imaging Responder" }, 1706864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { IMAGING_ARCHIVE_SVCLASS_ID, "Imaging Automatic Archive" }, 1716864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { IMAGING_REFOBJS_SVCLASS_ID, "Imaging Referenced Objects" }, 1726864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { HANDSFREE_SVCLASS_ID, "Handsfree" }, 173bd32ca373cd507d9c9746bde40b0e7bb4034adbeMarcel Holtmann { HANDSFREE_AGW_SVCLASS_ID, "Handsfree Audio Gateway" }, 1746864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { DIRECT_PRT_REFOBJS_SVCLASS_ID, "Direct Printing Ref. Objects" }, 1756864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { REFLECTED_UI_SVCLASS_ID, "Reflected UI" }, 1766864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { BASIC_PRINTING_SVCLASS_ID, "Basic Printing" }, 1776864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { PRINTING_STATUS_SVCLASS_ID, "Printing Status" }, 1786864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { HID_SVCLASS_ID, "Human Interface Device" }, 1796864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { HCR_SVCLASS_ID, "Hardcopy Cable Replacement" }, 1806864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { HCR_PRINT_SVCLASS_ID, "HCR Print" }, 1816864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { HCR_SCAN_SVCLASS_ID, "HCR Scan" }, 1826864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { CIP_SVCLASS_ID, "Common ISDN Access" }, 1836864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { VIDEO_CONF_GW_SVCLASS_ID, "Video Conferencing Gateway" }, 1846864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { UDI_MT_SVCLASS_ID, "UDI MT" }, 1856864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { UDI_TA_SVCLASS_ID, "UDI TA" }, 1866864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { AV_SVCLASS_ID, "Audio/Video" }, 1876864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { SAP_SVCLASS_ID, "SIM Access" }, 1888ce8108e712e40e1b9530c96f7ff6cbb32b5cb8bMarcel Holtmann { PBAP_PCE_SVCLASS_ID, "Phonebook Access - PCE" }, 1898ce8108e712e40e1b9530c96f7ff6cbb32b5cb8bMarcel Holtmann { PBAP_PSE_SVCLASS_ID, "Phonebook Access - PSE" }, 19073f2fe893f6801358ea4fb88dc8d24050c7d0ca5Marcel Holtmann { PBAP_SVCLASS_ID, "Phonebook Access" }, 1916864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { PNP_INFO_SVCLASS_ID, "PnP Information" }, 1926864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { GENERIC_NETWORKING_SVCLASS_ID, "Generic Networking" }, 1936864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { GENERIC_FILETRANS_SVCLASS_ID, "Generic File Transfer" }, 1946864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { GENERIC_AUDIO_SVCLASS_ID, "Generic Audio" }, 1956864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { GENERIC_TELEPHONY_SVCLASS_ID, "Generic Telephony" }, 1966864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { UPNP_SVCLASS_ID, "UPnP" }, 1976864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { UPNP_IP_SVCLASS_ID, "UPnP IP" }, 1986864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { UPNP_PAN_SVCLASS_ID, "UPnP PAN" }, 1996864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { UPNP_LAP_SVCLASS_ID, "UPnP LAP" }, 2006864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { UPNP_L2CAP_SVCLASS_ID, "UPnP L2CAP" }, 2016864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { VIDEO_SOURCE_SVCLASS_ID, "Video Source" }, 2026864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann { VIDEO_SINK_SVCLASS_ID, "Video Sink" }, 2032fa38208982e7c7bb55ae97acd13dbf82dd24e88Marcel Holtmann { VIDEO_DISTRIBUTION_SVCLASS_ID, "Video Distribution" }, 2041622daf2f8fa0abeb0a11be14558ed30a17fc044Marcel Holtmann { MDP_SVCLASS_ID, "MDP" }, 2051622daf2f8fa0abeb0a11be14558ed30a17fc044Marcel Holtmann { MDP_SOURCE_SVCLASS_ID, "MDP Source" }, 2061622daf2f8fa0abeb0a11be14558ed30a17fc044Marcel Holtmann { MDP_SINK_SVCLASS_ID, "MDP Sink" }, 20742e0ce5b430ac5e36c0d21bdddcaf1fe83e025f5Marcel Holtmann { APPLE_AGENT_SVCLASS_ID, "Apple Agent" }, 208542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann { 0 } 209542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann}; 210542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2116864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann#define Profile ServiceClass 212542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 213542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannstatic char *string_lookup(struct tupla *pt0, int index) 214542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 215542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann struct tupla *pt; 2166864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann 217542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (pt = pt0; pt->index; pt++) 2186864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann if (pt->index == index) 219542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return pt->str; 2206864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann 221542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return ""; 222542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 223542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2243df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmannstatic char *string_lookup_uuid(struct tupla *pt0, const uuid_t* uuid) 2253df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann{ 2263df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann uuid_t tmp_uuid; 2273df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann 2283df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann memcpy(&tmp_uuid, uuid, sizeof(tmp_uuid)); 2293df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann 2303df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann if (sdp_uuid128_to_uuid(&tmp_uuid)) { 2313df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann switch (tmp_uuid.type) { 2323df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann case SDP_UUID16: 2333df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann return string_lookup(pt0, tmp_uuid.value.uuid16); 2343df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann case SDP_UUID32: 2353df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann return string_lookup(pt0, tmp_uuid.value.uuid32); 2363df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann } 2373df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann } 2383df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann 2393df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann return ""; 2403df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann} 2413df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann 242542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 243542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Prints into a string the Protocol UUID 244542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * coping a maximum of n characters. 245542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 2468f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedbergstatic int uuid2str(struct tupla *message, const uuid_t *uuid, char *str, size_t n) 247542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 248542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann char *str2; 249542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 250542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!uuid) { 251542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann snprintf(str, n, "NULL"); 252542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -2; 253542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2546864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann 255542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (uuid->type) { 256542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID16: 257542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann str2 = string_lookup(message, uuid->value.uuid16); 258efcfad7c009502b2951a2408df3a94b83934e288Johan Hedberg snprintf(str, n, "%s", str2); 259542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 260542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID32: 2610e6eb45baedd15cc65beb454ec00cefb5fb7962dMarcel Holtmann str2 = string_lookup(message, uuid->value.uuid32); 262efcfad7c009502b2951a2408df3a94b83934e288Johan Hedberg snprintf(str, n, "%s", str2); 2630e6eb45baedd15cc65beb454ec00cefb5fb7962dMarcel Holtmann break; 264542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID128: 2653df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann str2 = string_lookup_uuid(message, uuid); 266efcfad7c009502b2951a2408df3a94b83934e288Johan Hedberg snprintf(str, n, "%s", str2); 2673df8390f8e7be37d0adfac2192c425219941d844Marcel Holtmann break; 268542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann default: 269542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann snprintf(str, n, "Type of UUID (%x) unknown.", uuid->type); 270542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 271542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2726864c723272d4790a2fec4a1c23fa5e46ac15e5fMarcel Holtmann 273542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 274542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 275542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 276542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_proto_uuid2strn(const uuid_t *uuid, char *str, size_t n) 277542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 278542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return uuid2str(Protocol, uuid, str, n); 279542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 280542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 281542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_svclass_uuid2strn(const uuid_t *uuid, char *str, size_t n) 282542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 283542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return uuid2str(ServiceClass, uuid, str, n); 284542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 285542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 286542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_profile_uuid2strn(const uuid_t *uuid, char *str, size_t n) 287542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 288542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return uuid2str(Profile, uuid, str, n); 289542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 290542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 291542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 292542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * convert the UUID to string, copying a maximum of n characters. 293542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 294542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_uuid2strn(const uuid_t *uuid, char *str, size_t n) 295542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 296542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!uuid) { 297542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann snprintf(str, n, "NULL"); 298542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -2; 299542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 300542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (uuid->type) { 301542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID16: 302542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann snprintf(str, n, "%.4x", uuid->value.uuid16); 303542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 304542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID32: 305542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann snprintf(str, n, "%.8x", uuid->value.uuid32); 306542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 307542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID128:{ 308542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann unsigned int data0; 309542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann unsigned short data1; 310542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann unsigned short data2; 311542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann unsigned short data3; 312542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann unsigned int data4; 313542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann unsigned short data5; 314542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 315542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(&data0, &uuid->value.uuid128.data[0], 4); 316542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(&data1, &uuid->value.uuid128.data[4], 2); 317542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(&data2, &uuid->value.uuid128.data[6], 2); 318542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(&data3, &uuid->value.uuid128.data[8], 2); 319542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(&data4, &uuid->value.uuid128.data[10], 4); 320542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(&data5, &uuid->value.uuid128.data[14], 2); 321542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3228f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg snprintf(str, n, "%.8x-%.4x-%.4x-%.4x-%.8x%.4x", 3238f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg ntohl(data0), ntohs(data1), 3248f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg ntohs(data2), ntohs(data3), 325542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann ntohl(data4), ntohs(data5)); 326542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 327542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 328542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann default: 329542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann snprintf(str, n, "Type of UUID (%x) unknown.", uuid->type); 3308f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg return -1; /* Enum type of UUID not set */ 331542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 332542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 333542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 334542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 335542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann#ifdef SDP_DEBUG 336542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 337542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Function prints the UUID in hex as per defined syntax - 338542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 339542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 4bytes-2bytes-2bytes-2bytes-6bytes 340542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 341542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * There is some ugly code, including hardcoding, but 342542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * that is just the way it is converting 16 and 32 bit 343542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * UUIDs to 128 bit as defined in the SDP doc 344542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 345542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannvoid sdp_uuid_print(const uuid_t *uuid) 346542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 347542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (uuid == NULL) { 348542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPERR("Null passed to print UUID\n"); 349542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return; 350542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 351542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (uuid->type == SDP_UUID16) { 352542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG(" uint16_t : 0x%.4x\n", uuid->value.uuid16); 353542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } else if (uuid->type == SDP_UUID32) { 354542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG(" uint32_t : 0x%.8x\n", uuid->value.uuid32); 355542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } else if (uuid->type == SDP_UUID128) { 356542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann unsigned int data0; 357542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann unsigned short data1; 358542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann unsigned short data2; 359542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann unsigned short data3; 360542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann unsigned int data4; 361542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann unsigned short data5; 362542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 363542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(&data0, &uuid->value.uuid128.data[0], 4); 364542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(&data1, &uuid->value.uuid128.data[4], 2); 365542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(&data2, &uuid->value.uuid128.data[6], 2); 366542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(&data3, &uuid->value.uuid128.data[8], 2); 367542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(&data4, &uuid->value.uuid128.data[10], 4); 368542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(&data5, &uuid->value.uuid128.data[14], 2); 369542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 370542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG(" uint128_t : 0x%.8x-", ntohl(data0)); 371542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("%.4x-", ntohs(data1)); 372542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("%.4x-", ntohs(data2)); 373542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("%.4x-", ntohs(data3)); 374542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("%.8x", ntohl(data4)); 375542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("%.4x\n", ntohs(data5)); 376542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } else 377542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPERR("Enum type of UUID not set\n"); 378542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 379542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann#endif 380542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3818f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedbergsdp_data_t *sdp_data_alloc_with_length(uint8_t dtd, const void *value, 3828f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg uint32_t length) 383542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 384542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *seq; 38521f2a5244f0c6195e17ff71868328bc71d77f4d9Marcel Holtmann sdp_data_t *d = malloc(sizeof(sdp_data_t)); 386542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 387542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!d) 388542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return NULL; 389542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 390542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memset(d, 0, sizeof(sdp_data_t)); 391542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->dtd = dtd; 392542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->unitSize = sizeof(uint8_t); 393542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 394542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (dtd) { 395542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_DATA_NIL: 396542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 397542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT8: 398aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann d->val.uint8 = *(uint8_t *) value; 399542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->unitSize += sizeof(uint8_t); 400542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 401542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT8: 402542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_BOOL: 403aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann d->val.int8 = *(int8_t *) value; 404542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->unitSize += sizeof(int8_t); 405542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 406542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT16: 407aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann d->val.uint16 = bt_get_unaligned((uint16_t *) value); 408542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->unitSize += sizeof(uint16_t); 409542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 410542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT16: 411aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann d->val.int16 = bt_get_unaligned((int16_t *) value); 412542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->unitSize += sizeof(int16_t); 413542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 414542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT32: 415aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann d->val.uint32 = bt_get_unaligned((uint32_t *) value); 416542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->unitSize += sizeof(uint32_t); 417542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 418542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT32: 419aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann d->val.int32 = bt_get_unaligned((int32_t *) value); 420542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->unitSize += sizeof(int32_t); 421542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 422542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT64: 423aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann d->val.int64 = bt_get_unaligned((int64_t *) value); 424542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->unitSize += sizeof(int64_t); 425542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 426542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT64: 427aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann d->val.uint64 = bt_get_unaligned((uint64_t *) value); 428542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->unitSize += sizeof(uint64_t); 429542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 430542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT128: 431542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(&d->val.uint128.data, value, sizeof(uint128_t)); 432542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->unitSize += sizeof(uint128_t); 433542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 434542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT128: 435542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(&d->val.int128.data, value, sizeof(uint128_t)); 436542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->unitSize += sizeof(uint128_t); 437542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 438542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID16: 439aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann sdp_uuid16_create(&d->val.uuid, bt_get_unaligned((uint16_t *) value)); 440542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->unitSize += sizeof(uint16_t); 441542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 442542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID32: 443aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann sdp_uuid32_create(&d->val.uuid, bt_get_unaligned((uint32_t *) value)); 444542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->unitSize += sizeof(uint32_t); 445542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 446542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID128: 447542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_uuid128_create(&d->val.uuid, value); 448542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->unitSize += sizeof(uint128_t); 449542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 450542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR8: 451542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR16: 452641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann case SDP_TEXT_STR8: 453542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR16: 454641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann if (!value) { 455641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann free(d); 456641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann return NULL; 457641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann } 458641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 459641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann d->unitSize += length; 460641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann if (length <= USHRT_MAX) { 461641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann d->val.str = malloc(length); 462641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann if (!d->val.str) { 463641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann free(d); 464641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann return NULL; 465641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann } 466542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 467641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann memcpy(d->val.str, value, length); 468542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } else { 469542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPERR("Strings of size > USHRT_MAX not supported\n"); 470641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann free(d); 471641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann d = NULL; 472542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 473542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 474542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR32: 475542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR32: 476542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPERR("Strings of size > USHRT_MAX not supported\n"); 477542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 478542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_ALT8: 479542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_ALT16: 480542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_ALT32: 481542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ8: 482542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ16: 483542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ32: 484542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (dtd == SDP_ALT8 || dtd == SDP_SEQ8) 485542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->unitSize += sizeof(uint8_t); 486542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann else if (dtd == SDP_ALT16 || dtd == SDP_SEQ16) 487542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->unitSize += sizeof(uint16_t); 488542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann else if (dtd == SDP_ALT32 || dtd == SDP_SEQ32) 489542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->unitSize += sizeof(uint32_t); 490542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann seq = (sdp_data_t *)value; 491542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->val.dataseq = seq; 492542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (; seq; seq = seq->next) 493542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->unitSize += seq->unitSize; 494542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 495542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann default: 496641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann free(d); 497641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann d = NULL; 498542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 499641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 500542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return d; 501641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann} 502641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 503641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmannsdp_data_t *sdp_data_alloc(uint8_t dtd, const void *value) 504641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann{ 505641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann uint32_t length; 506542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 507641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann switch (dtd) { 508641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann case SDP_URL_STR8: 509641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann case SDP_URL_STR16: 510641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann case SDP_TEXT_STR8: 511641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann case SDP_TEXT_STR16: 512641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann if (!value) 513641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann return NULL; 514641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 515641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann length = strlen((char *) value); 516641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann break; 517641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann default: 518641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann length = 0; 519641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann break; 520641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann } 521641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 522641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann return sdp_data_alloc_with_length(dtd, value, length); 523542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 524542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 525542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannsdp_data_t *sdp_seq_append(sdp_data_t *seq, sdp_data_t *d) 526542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 527542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (seq) { 528542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *p; 529542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (p = seq; p->next; p = p->next); 530542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p->next = d; 531542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } else 532542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann seq = d; 533542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->next = NULL; 534542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return seq; 535542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 536542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 5378f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedbergsdp_data_t *sdp_seq_alloc_with_length(void **dtds, void **values, int *length, 5388f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg int len) 539641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann{ 540641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann sdp_data_t *curr = NULL, *seq = NULL; 541641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann int i; 542641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 543641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann for (i = 0; i < len; i++) { 544641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann sdp_data_t *data; 545641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann int8_t dtd = *(uint8_t *) dtds[i]; 546641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 547641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann if (dtd >= SDP_SEQ8 && dtd <= SDP_ALT32) 548641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann data = (sdp_data_t *) values[i]; 549641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann else 550641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann data = sdp_data_alloc_with_length(dtd, values[i], length[i]); 551641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 552641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann if (!data) 553641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann return NULL; 554641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 555641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann if (curr) 556641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann curr->next = data; 557641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann else 558641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann seq = data; 559641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 560641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann curr = data; 561641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann } 562641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 563641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann return sdp_data_alloc_with_length(SDP_SEQ8, seq, length[i]); 564641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann} 565641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 566542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannsdp_data_t *sdp_seq_alloc(void **dtds, void **values, int len) 567542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 568542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *curr = NULL, *seq = NULL; 569542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int i; 570542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 571542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (i = 0; i < len; i++) { 572542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *data; 573641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann uint8_t dtd = *(uint8_t *) dtds[i]; 574641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 575542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (dtd >= SDP_SEQ8 && dtd <= SDP_ALT32) 576641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann data = (sdp_data_t *) values[i]; 577542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann else 578542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann data = sdp_data_alloc(dtd, values[i]); 579641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 580542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!data) 581542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return NULL; 582641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 583542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (curr) 584542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann curr->next = data; 585542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann else 586542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann seq = data; 587641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 588542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann curr = data; 589542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 590641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 591542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return sdp_data_alloc(SDP_SEQ8, seq); 592542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 593542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 5944c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmannstatic void extract_svclass_uuid(sdp_data_t *data, uuid_t *uuid) 5954c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann{ 5964c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann sdp_data_t *d; 5974c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann 5984c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann if (!data || data->dtd < SDP_SEQ8 || data->dtd > SDP_SEQ32) 5994c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann return; 6004c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann 6014c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann d = data->val.dataseq; 6024c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann if (!d) 6034c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann return; 6044c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann 6054c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann if (d->dtd < SDP_UUID16 || d->dtd > SDP_UUID128) 6064c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann return; 6074c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann 6084c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann *uuid = d->val.uuid; 6094c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann} 6104c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann 611542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_attr_add(sdp_record_t *rec, uint16_t attr, sdp_data_t *d) 612542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 613542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *p = sdp_data_get(rec, attr); 614542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 615542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (p) 616542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 6174c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann 618542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->attrId = attr; 619542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann rec->attrlist = sdp_list_insert_sorted(rec->attrlist, d, sdp_attrid_comp_func); 6204c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann 6214c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann if (attr == SDP_ATTR_SVCLASS_ID_LIST) 6224c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann extract_svclass_uuid(d, &rec->svclass); 6234c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann 624542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 625542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 626542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 627542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannvoid sdp_attr_remove(sdp_record_t *rec, uint16_t attr) 628542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 629542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *d = sdp_data_get(rec, attr); 6304c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann 631542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (d) 632542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann rec->attrlist = sdp_list_remove(rec->attrlist, d); 6334c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann 6344c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann if (attr == SDP_ATTR_SVCLASS_ID_LIST) 6354c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann memset(&rec->svclass, 0, sizeof(rec->svclass)); 636542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 637542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 638cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmannvoid sdp_set_seq_len(uint8_t *ptr, uint32_t length) 639542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 640d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann uint8_t dtd = *ptr++; 641542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 642542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (dtd) { 643542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ8: 644542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_ALT8: 645542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR8: 646542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR8: 647d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann *ptr = (uint8_t) length; 648542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 649542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ16: 650542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_ALT16: 651542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR16: 652542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR16: 653aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann bt_put_unaligned(htons(length), (uint16_t *) ptr); 654542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 655542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ32: 656542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_ALT32: 657542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR32: 658542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR32: 659aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann bt_put_unaligned(htonl(length), (uint32_t *) ptr); 660542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 661542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 662542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 663542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 6642db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentzstatic int sdp_get_data_type(sdp_buf_t *buf, uint8_t dtd) 665542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 6662db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz int data_type = 0; 667542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 6682db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_type += sizeof(uint8_t); 669641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 670542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (dtd) { 671542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ8: 672542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR8: 673542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR8: 674542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_ALT8: 6752db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_type += sizeof(uint8_t); 676542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 677542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ16: 678542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR16: 679542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR16: 680542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_ALT16: 6812db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_type += sizeof(uint16_t); 682542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 683542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ32: 684542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR32: 685542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR32: 686542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_ALT32: 6872db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_type += sizeof(uint32_t); 688542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 689542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 690641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 6912db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz if (!buf->data) 6922db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz buf->buf_size += data_type; 6932db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 6942db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz return data_type; 6952db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz} 6962db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 6972db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentzstatic int sdp_set_data_type(sdp_buf_t *buf, uint8_t dtd) 6982db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz{ 6992db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz int data_type = 0; 7002db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz uint8_t *p = buf->data + buf->data_size; 7012db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 7022db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz *p++ = dtd; 7032db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_type = sdp_get_data_type(buf, dtd); 7042db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz buf->data_size += data_type; 7052db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 7062db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz return data_type; 707542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 708542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 709542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannvoid sdp_set_attrid(sdp_buf_t *buf, uint16_t attr) 710542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 711542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint8_t *p = buf->data; 712542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 7138f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg /* data type for attr */ 714542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *p++ = SDP_UINT16; 715542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann buf->data_size = sizeof(uint8_t); 716aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann bt_put_unaligned(htons(attr), (uint16_t *) p); 717542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p += sizeof(uint16_t); 718542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann buf->data_size += sizeof(uint16_t); 719542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 720542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 721542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannstatic int get_data_size(sdp_buf_t *buf, sdp_data_t *sdpdata) 722542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 723542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *d; 724542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int n = 0; 725542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 7262db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz for (d = sdpdata->val.dataseq; d; d = d->next) { 7272db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz if (buf->data) 7282db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz n += sdp_gen_pdu(buf, d); 7292db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz else 7302db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz n += sdp_gen_buffer(buf, d); 7312db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz } 732641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 733542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return n; 734542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 735542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 7362db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentzstatic int sdp_get_data_size(sdp_buf_t *buf, sdp_data_t *d) 7372db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz{ 7382db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz uint32_t data_size = 0; 7392db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz uint8_t dtd = d->dtd; 7402db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 7412db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz switch (dtd) { 7422db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_DATA_NIL: 7432db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz break; 7442db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_UINT8: 7452db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_size = sizeof(uint8_t); 7462db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz break; 7472db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_UINT16: 7482db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_size = sizeof(uint16_t); 7492db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz break; 7502db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_UINT32: 7512db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_size = sizeof(uint32_t); 7522db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz break; 7532db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_UINT64: 7542db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_size = sizeof(uint64_t); 7552db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz break; 7562db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_UINT128: 7572db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_size = sizeof(uint128_t); 7582db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz break; 7592db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_INT8: 7602db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_BOOL: 7612db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_size = sizeof(int8_t); 7622db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz break; 7632db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_INT16: 7642db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_size = sizeof(int16_t); 7652db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz break; 7662db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_INT32: 7672db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_size = sizeof(int32_t); 7682db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz break; 7692db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_INT64: 7702db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_size = sizeof(int64_t); 7712db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz break; 7722db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_INT128: 7732db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_size = sizeof(uint128_t); 7742db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz break; 7752db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_TEXT_STR8: 7762db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_TEXT_STR16: 7772db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_TEXT_STR32: 7782db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_URL_STR8: 7792db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_URL_STR16: 7802db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_URL_STR32: 7812db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_size = d->unitSize - sizeof(uint8_t); 7822db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz break; 7832db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_SEQ8: 7842db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_SEQ16: 7852db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_SEQ32: 7862db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_size = get_data_size(buf, d); 7872db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz break; 7882db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_ALT8: 7892db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_ALT16: 7902db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_ALT32: 7912db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_size = get_data_size(buf, d); 7922db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz break; 7932db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_UUID16: 7942db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_size = sizeof(uint16_t); 7952db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz break; 7962db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_UUID32: 7972db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_size = sizeof(uint32_t); 7982db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz break; 7992db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz case SDP_UUID128: 8002db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_size = sizeof(uint128_t); 8012db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz break; 8022db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz default: 8032db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz break; 8042db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz } 8052db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 8062db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz if (!buf->data) 8072db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz buf->buf_size += data_size; 8082db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 8092db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz return data_size; 8102db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz} 8112db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 8126996a497c429be009a9f522c3a28ad777d2ba3b5Luiz Augusto von Dentzstatic int sdp_gen_buffer(sdp_buf_t *buf, sdp_data_t *d) 8132db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz{ 8142db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz int orig = buf->buf_size; 8152db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 8162db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz if (buf->buf_size == 0 && d->dtd == 0) { 8172db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz /* create initial sequence */ 8182db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz buf->buf_size += sizeof(uint8_t); 8192db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 8202db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz /* reserve space for sequence size */ 8212db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz buf->buf_size += sizeof(uint8_t); 8222db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz } 8232db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 8242db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz /* attribute length */ 8252db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz buf->buf_size += sizeof(uint8_t) + sizeof(uint16_t); 8262db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 8272db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz sdp_get_data_type(buf, d->dtd); 8282db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz sdp_get_data_size(buf, d); 8292db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 8302db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz if (buf->buf_size > UCHAR_MAX && d->dtd == SDP_SEQ8) 8312db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz buf->buf_size += sizeof(uint8_t); 8322db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 8332db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz return buf->buf_size - orig; 8342db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz} 8352db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 836542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_gen_pdu(sdp_buf_t *buf, sdp_data_t *d) 837542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 838cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint32_t pdu_size = 0, data_size = 0; 839542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann unsigned char *src = NULL, is_seq = 0, is_alt = 0; 840542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint8_t dtd = d->dtd; 841542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint16_t u16; 842542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint32_t u32; 843542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint64_t u64; 844542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint128_t u128; 845cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint8_t *seqp = buf->data + buf->data_size; 846542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 847542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdu_size = sdp_set_data_type(buf, dtd); 8482db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz data_size = sdp_get_data_size(buf, d); 849641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 850542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (dtd) { 851542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_DATA_NIL: 852542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 853542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT8: 854542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann src = &d->val.uint8; 855542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 856542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT16: 857542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann u16 = htons(d->val.uint16); 858cb08fcdb50544c554e1275ede85605e4542b5b1bMarcel Holtmann src = (unsigned char *) &u16; 859542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 860542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT32: 861542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann u32 = htonl(d->val.uint32); 862cb08fcdb50544c554e1275ede85605e4542b5b1bMarcel Holtmann src = (unsigned char *) &u32; 863542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 864542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT64: 865542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann u64 = hton64(d->val.uint64); 866cb08fcdb50544c554e1275ede85605e4542b5b1bMarcel Holtmann src = (unsigned char *) &u64; 867542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 868542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT128: 869542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann hton128(&d->val.uint128, &u128); 870cb08fcdb50544c554e1275ede85605e4542b5b1bMarcel Holtmann src = (unsigned char *) &u128; 871542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 872542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT8: 873542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_BOOL: 874cb08fcdb50544c554e1275ede85605e4542b5b1bMarcel Holtmann src = (unsigned char *) &d->val.int8; 875542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 876542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT16: 877542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann u16 = htons(d->val.int16); 878cb08fcdb50544c554e1275ede85605e4542b5b1bMarcel Holtmann src = (unsigned char *) &u16; 879542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 880542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT32: 881542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann u32 = htonl(d->val.int32); 882cb08fcdb50544c554e1275ede85605e4542b5b1bMarcel Holtmann src = (unsigned char *) &u32; 883542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 884542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT64: 885542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann u64 = hton64(d->val.int64); 886cb08fcdb50544c554e1275ede85605e4542b5b1bMarcel Holtmann src = (unsigned char *) &u64; 887542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 888542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT128: 889542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann hton128(&d->val.int128, &u128); 890cb08fcdb50544c554e1275ede85605e4542b5b1bMarcel Holtmann src = (unsigned char *) &u128; 891542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 892542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR8: 893542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR16: 894542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR32: 895641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann case SDP_URL_STR8: 896542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR16: 897542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR32: 898cb08fcdb50544c554e1275ede85605e4542b5b1bMarcel Holtmann src = (unsigned char *) d->val.str; 899542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_set_seq_len(seqp, data_size); 900542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 901542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ8: 902542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ16: 903542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ32: 904542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann is_seq = 1; 905542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_set_seq_len(seqp, data_size); 906542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 907542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_ALT8: 908542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_ALT16: 909542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_ALT32: 910542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann is_alt = 1; 911542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_set_seq_len(seqp, data_size); 912542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 913542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID16: 914542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann u16 = htons(d->val.uuid.value.uuid16); 915cb08fcdb50544c554e1275ede85605e4542b5b1bMarcel Holtmann src = (unsigned char *) &u16; 916542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 917542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID32: 918542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann u32 = htonl(d->val.uuid.value.uuid32); 919cb08fcdb50544c554e1275ede85605e4542b5b1bMarcel Holtmann src = (unsigned char *) &u32; 920542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 921542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID128: 922cb08fcdb50544c554e1275ede85605e4542b5b1bMarcel Holtmann src = (unsigned char *) &d->val.uuid.value.uuid128; 923542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 924542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann default: 925542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 926542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 927641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 928542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!is_seq && !is_alt) { 9290477cf9b6c61ab1f329206f8b40bcf8e8bfbaad5Vinicius Costa Gomes if (src && buf && buf->buf_size >= buf->data_size + data_size) { 930542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(buf->data + buf->data_size, src, data_size); 931542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann buf->data_size += data_size; 93266dcd1342d3f9bf08dfc476df121c7355c84427aMarcel Holtmann } else if (dtd != SDP_DATA_NIL) { 9330477cf9b6c61ab1f329206f8b40bcf8e8bfbaad5Vinicius Costa Gomes SDPDBG("Gen PDU : Can't copy from invalid source or dest\n"); 93466dcd1342d3f9bf08dfc476df121c7355c84427aMarcel Holtmann } 935542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 936641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 937542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdu_size += data_size; 938641d636fb24fb0dea567388a4f0d0f135d4ea48cMarcel Holtmann 939542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return pdu_size; 940542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 941542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 942542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannstatic void sdp_attr_pdu(void *value, void *udata) 943542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 944542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_append_to_pdu((sdp_buf_t *)udata, (sdp_data_t *)value); 945542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 946542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 9472db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentzstatic void sdp_attr_size(void *value, void *udata) 9482db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz{ 9492db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz sdp_gen_buffer((sdp_buf_t *)udata, (sdp_data_t *)value); 9502db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz} 9512db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 952542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_gen_record_pdu(const sdp_record_t *rec, sdp_buf_t *buf) 953542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 9542db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz memset(buf, 0, sizeof(sdp_buf_t)); 9552db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz sdp_list_foreach(rec->attrlist, sdp_attr_size, buf); 9562db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 9572db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz buf->data = malloc(buf->buf_size); 958997f54c70b25706839544018ad15a718911eb45fMarcel Holtmann if (!buf->data) 959997f54c70b25706839544018ad15a718911eb45fMarcel Holtmann return -ENOMEM; 960997f54c70b25706839544018ad15a718911eb45fMarcel Holtmann buf->data_size = 0; 961997f54c70b25706839544018ad15a718911eb45fMarcel Holtmann memset(buf->data, 0, buf->buf_size); 9622db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 963997f54c70b25706839544018ad15a718911eb45fMarcel Holtmann sdp_list_foreach(rec->attrlist, sdp_attr_pdu, buf); 964997f54c70b25706839544018ad15a718911eb45fMarcel Holtmann 965997f54c70b25706839544018ad15a718911eb45fMarcel Holtmann return 0; 966542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 967542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 968542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannvoid sdp_attr_replace(sdp_record_t *rec, uint16_t attr, sdp_data_t *d) 969542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 970542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *p = sdp_data_get(rec, attr); 971542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 972542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (p) { 973542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann rec->attrlist = sdp_list_remove(rec->attrlist, p); 974542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_free(p); 975542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 9764c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann 977542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->attrId = attr; 9784c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann rec->attrlist = sdp_list_insert_sorted(rec->attrlist, d, sdp_attrid_comp_func); 9794c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann 9804c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann if (attr == SDP_ATTR_SVCLASS_ID_LIST) 9814c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann extract_svclass_uuid(d, &rec->svclass); 982542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 983542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 984542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_attrid_comp_func(const void *key1, const void *key2) 985542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 986542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann const sdp_data_t *d1 = (const sdp_data_t *)key1; 987542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann const sdp_data_t *d2 = (const sdp_data_t *)key2; 988542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 989542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (d1 && d2) 990542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return d1->attrId - d2->attrId; 991542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 992542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 993542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 994542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannstatic void data_seq_free(sdp_data_t *seq) 995542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 996542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *d = seq->val.dataseq; 997542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 998542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann while (d) { 999542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *next = d->next; 1000542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_free(d); 1001542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d = next; 1002542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1003542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1004542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1005542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannvoid sdp_data_free(sdp_data_t *d) 1006542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1007542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (d->dtd) { 1008542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ8: 1009542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ16: 1010542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ32: 1011542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann data_seq_free(d); 1012542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1013542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR8: 1014542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR16: 1015542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR32: 1016542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR8: 1017542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR16: 1018542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR32: 1019542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(d->val.str); 1020542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1021542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1022542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(d); 1023542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1024542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1025d39e08cc5483dc924f3b764b87042fb6aebb722dMarcel Holtmannint sdp_uuid_extract(const uint8_t *p, int bufsize, uuid_t *uuid, int *scanned) 1026542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1027a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann uint8_t type; 1028a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann 1029cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint8_t)) { 1030a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Unexpected end of packet"); 1031a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return -1; 1032a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1033a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann 1034a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann type = *(const uint8_t *) p; 1035a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann 1036a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann if (!SDP_IS_UUID(type)) { 1037a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Unknown data type : %d expecting a svc UUID\n", type); 1038a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return -1; 1039a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1040a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann p += sizeof(uint8_t); 1041a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann *scanned += sizeof(uint8_t); 1042a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann bufsize -= sizeof(uint8_t); 1043a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann if (type == SDP_UUID16) { 1044cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint16_t)) { 1045a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Not enough room for 16-bit UUID"); 1046a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return -1; 1047a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1048a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann sdp_uuid16_create(uuid, ntohs(bt_get_unaligned((uint16_t *) p))); 1049a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann *scanned += sizeof(uint16_t); 1050a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann p += sizeof(uint16_t); 1051a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } else if (type == SDP_UUID32) { 1052cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint32_t)) { 1053a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Not enough room for 32-bit UUID"); 1054a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return -1; 1055a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1056a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann sdp_uuid32_create(uuid, ntohl(bt_get_unaligned((uint32_t *) p))); 1057a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann *scanned += sizeof(uint32_t); 1058a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann p += sizeof(uint32_t); 1059a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } else { 1060cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint128_t)) { 1061a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Not enough room for 128-bit UUID"); 1062a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return -1; 1063a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1064a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann sdp_uuid128_create(uuid, p); 1065a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann *scanned += sizeof(uint128_t); 1066a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann p += sizeof(uint128_t); 1067a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1068a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return 0; 1069a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann} 1070a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann 1071a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmannstatic sdp_data_t *extract_int(const void *p, int bufsize, int *len) 1072a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann{ 1073a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann sdp_data_t *d; 1074a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann 1075cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint8_t)) { 1076a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Unexpected end of packet"); 1077a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return NULL; 1078a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1079a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann 1080a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann d = malloc(sizeof(sdp_data_t)); 1081114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio if (!d) 1082114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio return NULL; 1083542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1084542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Extracting integer\n"); 1085542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memset(d, 0, sizeof(sdp_data_t)); 1086aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann d->dtd = *(uint8_t *) p; 1087542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p += sizeof(uint8_t); 1088542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *len += sizeof(uint8_t); 1089a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann bufsize -= sizeof(uint8_t); 1090542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1091542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (d->dtd) { 1092542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_DATA_NIL: 1093542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1094542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_BOOL: 1095542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT8: 1096542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT8: 1097cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint8_t)) { 1098a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Unexpected end of packet"); 1099a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann free(d); 1100a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return NULL; 1101a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1102542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *len += sizeof(uint8_t); 1103aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann d->val.uint8 = *(uint8_t *) p; 1104542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1105542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT16: 1106542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT16: 1107cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint16_t)) { 1108a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Unexpected end of packet"); 1109a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann free(d); 1110a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return NULL; 1111a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1112542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *len += sizeof(uint16_t); 1113aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann d->val.uint16 = ntohs(bt_get_unaligned((uint16_t *) p)); 1114542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1115542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT32: 1116542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT32: 1117cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint32_t)) { 1118a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Unexpected end of packet"); 1119a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann free(d); 1120a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return NULL; 1121a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1122542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *len += sizeof(uint32_t); 1123aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann d->val.uint32 = ntohl(bt_get_unaligned((uint32_t *) p)); 1124542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1125542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT64: 1126542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT64: 1127cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint64_t)) { 1128a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Unexpected end of packet"); 1129a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann free(d); 1130a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return NULL; 1131a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1132542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *len += sizeof(uint64_t); 1133aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann d->val.uint64 = ntoh64(bt_get_unaligned((uint64_t *) p)); 1134542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1135542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT128: 1136542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT128: 1137cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint128_t)) { 1138a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Unexpected end of packet"); 1139a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann free(d); 1140a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return NULL; 1141a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1142542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *len += sizeof(uint128_t); 1143aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann ntoh128((uint128_t *) p, &d->val.uint128); 1144542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1145542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann default: 1146542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(d); 1147542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d = NULL; 1148542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1149542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return d; 1150542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1151542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 11528f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedbergstatic sdp_data_t *extract_uuid(const uint8_t *p, int bufsize, int *len, 11538f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg sdp_record_t *rec) 1154542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 115521f2a5244f0c6195e17ff71868328bc71d77f4d9Marcel Holtmann sdp_data_t *d = malloc(sizeof(sdp_data_t)); 1156542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1157114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio if (!d) 1158114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio return NULL; 1159114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio 1160542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Extracting UUID"); 1161542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memset(d, 0, sizeof(sdp_data_t)); 1162d39e08cc5483dc924f3b764b87042fb6aebb722dMarcel Holtmann if (sdp_uuid_extract(p, bufsize, &d->val.uuid, len) < 0) { 1163542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(d); 1164542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return NULL; 1165542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1166d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann d->dtd = *p; 11679d9a7646b189cc2471b925cc448862e14c10c0c4Marcel Holtmann if (rec) 11689d9a7646b189cc2471b925cc448862e14c10c0c4Marcel Holtmann sdp_pattern_add_uuid(rec, &d->val.uuid); 1169542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return d; 1170542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1171542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1172542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 11738f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg * Extract strings from the PDU (could be service description and similar info) 1174542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 1175a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmannstatic sdp_data_t *extract_str(const void *p, int bufsize, int *len) 1176542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1177542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann char *s; 1178542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int n; 1179a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann sdp_data_t *d; 1180a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann 1181cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint8_t)) { 1182a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Unexpected end of packet"); 1183a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return NULL; 1184a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1185a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann 1186a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann d = malloc(sizeof(sdp_data_t)); 1187114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio if (!d) 1188114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio return NULL; 1189542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1190542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memset(d, 0, sizeof(sdp_data_t)); 1191aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann d->dtd = *(uint8_t *) p; 1192542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p += sizeof(uint8_t); 1193542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *len += sizeof(uint8_t); 1194a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann bufsize -= sizeof(uint8_t); 1195542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1196542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (d->dtd) { 1197542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR8: 1198542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR8: 1199cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint8_t)) { 1200a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Unexpected end of packet"); 1201a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann free(d); 1202a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return NULL; 1203a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1204aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann n = *(uint8_t *) p; 1205542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p += sizeof(uint8_t); 1206a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann *len += sizeof(uint8_t); 1207a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann bufsize -= sizeof(uint8_t); 1208542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1209542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR16: 1210542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR16: 1211cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint16_t)) { 1212a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Unexpected end of packet"); 1213a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann free(d); 1214a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return NULL; 1215a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1216aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann n = ntohs(bt_get_unaligned((uint16_t *) p)); 1217542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p += sizeof(uint16_t); 1218542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *len += sizeof(uint16_t) + n; 1219a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann bufsize -= sizeof(uint16_t); 1220542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1221542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann default: 1222542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPERR("Sizeof text string > UINT16_MAX\n"); 1223542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(d); 1224f58df2db7a606fcd13a36824bdb4fc3440d9a71eSantiago Carot-Nemesio return NULL; 1225542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1226542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1227a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann if (bufsize < n) { 1228a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("String too long to fit in packet"); 1229a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann free(d); 1230a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return NULL; 1231a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1232a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann 1233ff3922238b4258eb2f9f9458589d3cecd177f7bcMarcel Holtmann s = malloc(n + 1); 1234a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann if (!s) { 1235a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Not enough memory for incoming string"); 1236a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann free(d); 1237a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return NULL; 1238a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1239542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memset(s, 0, n + 1); 1240ff3922238b4258eb2f9f9458589d3cecd177f7bcMarcel Holtmann memcpy(s, p, n); 1241542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1242a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann *len += n; 1243a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann 1244542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Len : %d\n", n); 1245542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Str : %s\n", s); 1246542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1247542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->val.str = s; 12480ed4f8572e1b32b4dd57304db14351f0e0c59119Marcel Holtmann d->unitSize = n + sizeof(uint8_t); 1249542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return d; 1250542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1251542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1252a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann/* 1253a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann * Extract the sequence type and its length, and return offset into buf 1254a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann * or 0 on failure. 1255a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann */ 1256d39e08cc5483dc924f3b764b87042fb6aebb722dMarcel Holtmannint sdp_extract_seqtype(const uint8_t *buf, int bufsize, uint8_t *dtdp, int *size) 1257a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann{ 1258a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann uint8_t dtd; 1259a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann int scanned = sizeof(uint8_t); 1260a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann 1261cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint8_t)) { 1262a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Unexpected end of packet"); 1263a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return 0; 1264a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1265a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann 1266a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann dtd = *(uint8_t *) buf; 1267a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann buf += sizeof(uint8_t); 1268a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann bufsize -= sizeof(uint8_t); 1269a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann *dtdp = dtd; 1270a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann switch (dtd) { 1271a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann case SDP_SEQ8: 1272a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann case SDP_ALT8: 1273cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint8_t)) { 1274a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Unexpected end of packet"); 1275a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return 0; 1276a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1277a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann *size = *(uint8_t *) buf; 1278a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann scanned += sizeof(uint8_t); 1279a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann break; 1280a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann case SDP_SEQ16: 1281a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann case SDP_ALT16: 1282cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint16_t)) { 1283a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Unexpected end of packet"); 1284a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return 0; 1285a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1286a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann *size = ntohs(bt_get_unaligned((uint16_t *) buf)); 1287a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann scanned += sizeof(uint16_t); 1288a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann break; 1289a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann case SDP_SEQ32: 1290a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann case SDP_ALT32: 1291cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint32_t)) { 1292a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Unexpected end of packet"); 1293a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return 0; 1294a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1295a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann *size = ntohl(bt_get_unaligned((uint32_t *) buf)); 1296a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann scanned += sizeof(uint32_t); 1297a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann break; 1298a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann default: 1299a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Unknown sequence type, aborting\n"); 1300a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return 0; 1301a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1302a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return scanned; 1303a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann} 1304a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann 13058f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedbergstatic sdp_data_t *extract_seq(const void *p, int bufsize, int *len, 13068f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg sdp_record_t *rec) 1307542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1308542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int seqlen, n = 0; 1309542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *curr, *prev; 131021f2a5244f0c6195e17ff71868328bc71d77f4d9Marcel Holtmann sdp_data_t *d = malloc(sizeof(sdp_data_t)); 1311542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1312114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio if (!d) 1313114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio return NULL; 1314114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio 1315542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Extracting SEQ"); 1316542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memset(d, 0, sizeof(sdp_data_t)); 1317d39e08cc5483dc924f3b764b87042fb6aebb722dMarcel Holtmann *len = sdp_extract_seqtype(p, bufsize, &d->dtd, &seqlen); 1318542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Sequence Type : 0x%x length : 0x%x\n", d->dtd, seqlen); 1319542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1320542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (*len == 0) 1321542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return d; 1322542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1323a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann if (*len > bufsize) { 1324a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Packet not big enough to hold sequence."); 1325a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann free(d); 1326a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return NULL; 1327a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1328a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann 1329542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p += *len; 1330a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann bufsize -= *len; 133158a7ff1f9e789b7354bb1feb02f9b7ca5198ec65Luiz Augusto von Dentz prev = NULL; 1332542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann while (n < seqlen) { 1333542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int attrlen = 0; 1334d39e08cc5483dc924f3b764b87042fb6aebb722dMarcel Holtmann curr = sdp_extract_attr(p, bufsize, &attrlen, rec); 1335542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (curr == NULL) 1336542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1337542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1338542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (prev) 1339542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann prev->next = curr; 1340542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann else 1341542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d->val.dataseq = curr; 1342542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann prev = curr; 1343542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p += attrlen; 1344542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann n += attrlen; 1345a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann bufsize -= attrlen; 1346542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1347542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Extracted: %d SequenceLength: %d", n, seqlen); 1348542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1349542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1350542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *len += n; 1351542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return d; 1352542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1353542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 13548f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedbergsdp_data_t *sdp_extract_attr(const uint8_t *p, int bufsize, int *size, 13558f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg sdp_record_t *rec) 1356542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1357542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *elem; 1358542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int n = 0; 1359a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann uint8_t dtd; 1360a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann 1361cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint8_t)) { 1362a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann SDPERR("Unexpected end of packet"); 1363a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann return NULL; 1364a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann } 1365a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann 1366a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann dtd = *(const uint8_t *)p; 1367542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1368542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("extract_attr: dtd=0x%x", dtd); 1369542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (dtd) { 1370542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_DATA_NIL: 1371542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_BOOL: 1372542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT8: 1373542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT16: 1374542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT32: 1375542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT64: 1376542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT128: 1377542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT8: 1378542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT16: 1379542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT32: 1380542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT64: 1381542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT128: 1382a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann elem = extract_int(p, bufsize, &n); 1383542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1384542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID16: 1385542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID32: 1386542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID128: 1387a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann elem = extract_uuid(p, bufsize, &n, rec); 1388542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1389542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR8: 1390542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR16: 1391542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR32: 1392542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR8: 1393542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR16: 1394542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR32: 1395a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann elem = extract_str(p, bufsize, &n); 1396542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1397542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ8: 1398542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ16: 1399542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ32: 1400542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_ALT8: 1401542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_ALT16: 1402542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_ALT32: 1403a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann elem = extract_seq(p, bufsize, &n, rec); 1404542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1405542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann default: 1406542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPERR("Unknown data descriptor : 0x%x terminating\n", dtd); 1407542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return NULL; 1408542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1409542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *size += n; 1410542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return elem; 1411542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1412542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1413542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann#ifdef SDP_DEBUG 1414542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannstatic void attr_print_func(void *value, void *userData) 1415542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1416542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *d = (sdp_data_t *)value; 1417542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1418542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("=====================================\n"); 1419542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("ATTRIBUTE IDENTIFIER : 0x%x\n", d->attrId); 1420542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("ATTRIBUTE VALUE PTR : 0x%x\n", (uint32_t)value); 1421542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (d) 1422542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_print(d); 1423542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann else 1424542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("NULL value\n"); 1425542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("=====================================\n"); 1426542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1427542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1428542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannvoid sdp_print_service_attr(sdp_list_t *svcAttrList) 1429542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 14308bd7ef87e49b68c3090448f337454a1704f5e048Marcel Holtmann SDPDBG("Printing service attr list %p\n", svcAttrList); 1431542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_list_foreach(svcAttrList, attr_print_func, NULL); 14328bd7ef87e49b68c3090448f337454a1704f5e048Marcel Holtmann SDPDBG("Printed service attr list %p\n", svcAttrList); 1433542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1434542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann#endif 1435542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1436d39e08cc5483dc924f3b764b87042fb6aebb722dMarcel Holtmannsdp_record_t *sdp_extract_pdu(const uint8_t *buf, int bufsize, int *scanned) 1437542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1438542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int extracted = 0, seqlen = 0; 1439542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint8_t dtd; 1440542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint16_t attr; 1441542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_record_t *rec = sdp_record_alloc(); 1442cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann const uint8_t *p = buf; 1443542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1444d39e08cc5483dc924f3b764b87042fb6aebb722dMarcel Holtmann *scanned = sdp_extract_seqtype(buf, bufsize, &dtd, &seqlen); 1445542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p += *scanned; 14460e1789b3f1897512eb30d63c8e9803f1461446c1Marcel Holtmann bufsize -= *scanned; 1447542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann rec->attrlist = NULL; 14480e1789b3f1897512eb30d63c8e9803f1461446c1Marcel Holtmann 14490e1789b3f1897512eb30d63c8e9803f1461446c1Marcel Holtmann while (extracted < seqlen && bufsize > 0) { 1450542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int n = sizeof(uint8_t), attrlen = 0; 1451542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *data = NULL; 1452542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 14530e1789b3f1897512eb30d63c8e9803f1461446c1Marcel Holtmann SDPDBG("Extract PDU, sequenceLength: %d localExtractedLength: %d", 14540e1789b3f1897512eb30d63c8e9803f1461446c1Marcel Holtmann seqlen, extracted); 14550e1789b3f1897512eb30d63c8e9803f1461446c1Marcel Holtmann 1456cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < n + (int) sizeof(uint16_t)) { 14570e1789b3f1897512eb30d63c8e9803f1461446c1Marcel Holtmann SDPERR("Unexpected end of packet"); 14580e1789b3f1897512eb30d63c8e9803f1461446c1Marcel Holtmann break; 14590e1789b3f1897512eb30d63c8e9803f1461446c1Marcel Holtmann } 14600e1789b3f1897512eb30d63c8e9803f1461446c1Marcel Holtmann 1461aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann dtd = *(uint8_t *) p; 1462aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann attr = ntohs(bt_get_unaligned((uint16_t *) (p + n))); 1463542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann n += sizeof(uint16_t); 1464542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1465542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("DTD of attrId : %d Attr id : 0x%x \n", dtd, attr); 1466542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1467d39e08cc5483dc924f3b764b87042fb6aebb722dMarcel Holtmann data = sdp_extract_attr(p + n, bufsize - n, &attrlen, rec); 1468542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1469542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Attr id : 0x%x attrValueLength : %d\n", attr, attrlen); 1470542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1471542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann n += attrlen; 1472542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (data == NULL) { 1473542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Terminating extraction of attributes"); 1474542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1475542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 14764c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann 1477542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (attr == SDP_ATTR_RECORD_HANDLE) 1478542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann rec->handle = data->val.uint32; 14794c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann 14804c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann if (attr == SDP_ATTR_SVCLASS_ID_LIST) 14814c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann extract_svclass_uuid(data, &rec->svclass); 14824c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann 1483542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann extracted += n; 1484542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p += n; 14850e1789b3f1897512eb30d63c8e9803f1461446c1Marcel Holtmann bufsize -= n; 1486542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_attr_replace(rec, attr, data); 14870e1789b3f1897512eb30d63c8e9803f1461446c1Marcel Holtmann 1488542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Extract PDU, seqLength: %d localExtractedLength: %d", 14890e1789b3f1897512eb30d63c8e9803f1461446c1Marcel Holtmann seqlen, extracted); 1490542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1491542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann#ifdef SDP_DEBUG 1492542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Successful extracting of Svc Rec attributes\n"); 1493542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_print_service_attr(rec->attrlist); 1494542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann#endif 1495542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *scanned += seqlen; 1496542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return rec; 1497542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1498542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1499e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentzstatic void sdp_copy_pattern(void *value, void *udata) 1500e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz{ 1501e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz uuid_t *uuid = value; 1502e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz sdp_record_t *rec = udata; 1503e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1504e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz sdp_pattern_add_uuid(rec, uuid); 1505e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz} 1506e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1507eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocerastatic void *sdp_data_value(sdp_data_t *data, uint32_t *len) 1508e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz{ 1509e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz void *val = NULL; 1510e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1511e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz switch (data->dtd) { 1512e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_DATA_NIL: 1513e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz break; 1514e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_UINT8: 1515e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz val = &data->val.uint8; 1516e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz break; 1517e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_INT8: 1518e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_BOOL: 1519e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz val = &data->val.int8; 1520e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz break; 1521e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_UINT16: 1522e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz val = &data->val.uint16; 1523e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz break; 1524e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_INT16: 1525e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz val = &data->val.int16; 1526e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz break; 1527e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_UINT32: 1528e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz val = &data->val.uint32; 1529e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz break; 1530e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_INT32: 1531e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz val = &data->val.int32; 1532e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz break; 1533e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_INT64: 1534e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz val = &data->val.int64; 1535e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz break; 1536e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_UINT64: 1537e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz val = &data->val.uint64; 1538e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz break; 1539e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_UINT128: 1540e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz val = &data->val.uint128; 1541e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz break; 1542e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_INT128: 1543e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz val = &data->val.int128; 1544e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz break; 1545e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_UUID16: 15460472c96f4702fadcb684ff0f4b42ce044c235024Luiz Augusto von Dentz val = &data->val.uuid.value.uuid16; 15470472c96f4702fadcb684ff0f4b42ce044c235024Luiz Augusto von Dentz break; 1548e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_UUID32: 15490472c96f4702fadcb684ff0f4b42ce044c235024Luiz Augusto von Dentz val = &data->val.uuid.value.uuid32; 15500472c96f4702fadcb684ff0f4b42ce044c235024Luiz Augusto von Dentz break; 1551e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_UUID128: 15520472c96f4702fadcb684ff0f4b42ce044c235024Luiz Augusto von Dentz val = &data->val.uuid.value.uuid128; 1553e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz break; 1554e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_URL_STR8: 1555e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_URL_STR16: 1556e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_TEXT_STR8: 1557e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_TEXT_STR16: 1558e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_URL_STR32: 1559e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_TEXT_STR32: 1560e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz val = data->val.str; 1561eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera if (len) 1562eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera *len = data->unitSize - 1; 1563e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz break; 1564e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_ALT8: 1565e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_ALT16: 1566e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_ALT32: 1567e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_SEQ8: 1568e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_SEQ16: 1569e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz case SDP_SEQ32: 1570e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz val = sdp_copy_seq(data->val.dataseq); 1571e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz break; 1572e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz } 1573e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1574e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz return val; 1575e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz} 1576e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1577e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentzstatic sdp_data_t *sdp_copy_seq(sdp_data_t *data) 1578e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz{ 1579e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz sdp_data_t *tmp, *seq = NULL, *cur = NULL; 1580e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1581e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz for (tmp = data; tmp; tmp = tmp->next) { 1582e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz sdp_data_t *datatmp; 1583e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz void *value; 1584e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1585eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera value = sdp_data_value(tmp, NULL); 1586e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz datatmp = sdp_data_alloc_with_length(tmp->dtd, value, 1587d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann tmp->unitSize); 1588e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1589e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz if (cur) 1590e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz cur->next = datatmp; 1591e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz else 1592e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz seq = datatmp; 1593e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1594e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz cur = datatmp; 1595e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz } 1596e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1597e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz return seq; 1598e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz} 1599e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1600e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentzstatic void sdp_copy_attrlist(void *value, void *udata) 1601e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz{ 1602e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz sdp_data_t *data = value; 1603e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz sdp_record_t *rec = udata; 1604e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz void *val; 1605eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera uint32_t len = 0; 1606e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1607eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera val = sdp_data_value(data, &len); 1608e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1609eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera if (!len) 1610eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera sdp_attr_add_new(rec, data->attrId, data->dtd, val); 1611eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera else 1612eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera sdp_attr_add_new_with_length(rec, data->attrId, 1613d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann data->dtd, val, len); 1614e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz} 1615e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1616e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentzsdp_record_t *sdp_copy_record(sdp_record_t *rec) 1617e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz{ 1618e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz sdp_record_t *cpy; 1619e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1620e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz cpy = sdp_record_alloc(); 1621e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1622e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz cpy->handle = rec->handle; 1623e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1624e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz sdp_list_foreach(rec->pattern, sdp_copy_pattern, cpy); 1625e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz sdp_list_foreach(rec->attrlist, sdp_copy_attrlist, cpy); 1626e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1627e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz cpy->svclass = rec->svclass; 1628e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1629e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz return cpy; 1630e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz} 1631e464fdc01d72be442e8386d9004452a1e29a9eb9Luiz Augusto von Dentz 1632542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann#ifdef SDP_DEBUG 1633542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannstatic void print_dataseq(sdp_data_t *p) 1634542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1635542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *d; 1636542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1637542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (d = p; d; d = d->next) 1638542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_print(d); 1639542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1640542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann#endif 1641542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1642542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannvoid sdp_record_print(const sdp_record_t *rec) 1643542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1644542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *d = sdp_data_get(rec, SDP_ATTR_SVCNAME_PRIMARY); 1645542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (d) 16466d83e9274971235c05b40349dbbaf3f826853ff5Marcel Holtmann printf("Service Name: %.*s\n", d->unitSize, d->val.str); 1647542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d = sdp_data_get(rec, SDP_ATTR_SVCDESC_PRIMARY); 1648542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (d) 16496d83e9274971235c05b40349dbbaf3f826853ff5Marcel Holtmann printf("Service Description: %.*s\n", d->unitSize, d->val.str); 1650542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d = sdp_data_get(rec, SDP_ATTR_PROVNAME_PRIMARY); 1651542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (d) 16526d83e9274971235c05b40349dbbaf3f826853ff5Marcel Holtmann printf("Service Provider: %.*s\n", d->unitSize, d->val.str); 1653542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1654542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1655542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann#ifdef SDP_DEBUG 1656542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannvoid sdp_data_print(sdp_data_t *d) 1657542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1658542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (d->dtd) { 1659542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_DATA_NIL: 1660542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("NIL\n"); 1661542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1662542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_BOOL: 1663542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT8: 1664542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT16: 1665542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT32: 1666542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT64: 1667542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT128: 1668542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT8: 1669542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT16: 1670542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT32: 1671542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT64: 1672542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_INT128: 1673542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Integer : 0x%x\n", d->val.uint32); 1674542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1675542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID16: 1676542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID32: 1677542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID128: 1678542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("UUID\n"); 1679542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_uuid_print(&d->val.uuid); 1680542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1681542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR8: 1682542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR16: 1683542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_TEXT_STR32: 1684542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Text : %s\n", d->val.str); 1685542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1686542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR8: 1687542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR16: 1688542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_URL_STR32: 1689542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("URL : %s\n", d->val.str); 1690542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1691542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ8: 1692542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ16: 1693542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ32: 1694542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann print_dataseq(d->val.dataseq); 1695542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1696542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_ALT8: 1697542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_ALT16: 1698542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_ALT32: 1699542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Data Sequence Alternates\n"); 1700542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann print_dataseq(d->val.dataseq); 1701542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1702542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1703542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1704542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann#endif 1705542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1706542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannsdp_data_t *sdp_data_get(const sdp_record_t *rec, uint16_t attrId) 1707542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1708542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (rec->attrlist) { 1709542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t sdpTemplate; 1710542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_list_t *p; 1711542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1712542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdpTemplate.attrId = attrId; 1713542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p = sdp_list_find(rec->attrlist, &sdpTemplate, sdp_attrid_comp_func); 1714542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (p) 1715d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann return p->data; 1716542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 17174c6bbf0a08426efd008c1b9e439c693a826ee708Marcel Holtmann return NULL; 1718542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1719542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1720be2ffca847c7537f01b90c7933a2b288306b1f0bMarcel Holtmannstatic int sdp_send_req(sdp_session_t *session, uint8_t *buf, uint32_t size) 1721542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1722cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint32_t sent = 0; 1723542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1724542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann while (sent < size) { 1725542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int n = send(session->sock, buf + sent, size - sent, 0); 1726542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (n < 0) 1727542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 1728542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sent += n; 1729542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1730542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 1731542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1732542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1733be2ffca847c7537f01b90c7933a2b288306b1f0bMarcel Holtmannstatic int sdp_read_rsp(sdp_session_t *session, uint8_t *buf, uint32_t size) 1734542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1735542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann fd_set readFds; 1736542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann struct timeval timeout = { SDP_RESPONSE_TIMEOUT, 0 }; 1737542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 173873fa16fccbb85592973068a25949d4c331f7f475Marcel Holtmann FD_ZERO(&readFds); 1739542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann FD_SET(session->sock, &readFds); 1740542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Waiting for response\n"); 174173fa16fccbb85592973068a25949d4c331f7f475Marcel Holtmann if (select(session->sock + 1, &readFds, NULL, NULL, &timeout) == 0) { 1742542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPERR("Client timed out\n"); 1743542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = ETIMEDOUT; 1744542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 1745542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1746542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return recv(session->sock, buf, size, 0); 1747542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1748542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1749542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 1750542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * generic send request, wait for response method. 1751542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 17528f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedbergint sdp_send_req_w4_rsp(sdp_session_t *session, uint8_t *reqbuf, 17538f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg uint8_t *rspbuf, uint32_t reqsize, uint32_t *rspsize) 1754542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1755542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int n; 1756d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann sdp_pdu_hdr_t *reqhdr = (sdp_pdu_hdr_t *) reqbuf; 1757d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann sdp_pdu_hdr_t *rsphdr = (sdp_pdu_hdr_t *) rspbuf; 1758542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1759542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG(""); 1760542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (0 > sdp_send_req(session, reqbuf, reqsize)) { 1761542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPERR("Error sending data:%s", strerror(errno)); 1762542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 1763542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1764542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann n = sdp_read_rsp(session, rspbuf, SDP_RSP_BUFFER_SIZE); 1765542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (0 > n) 1766542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 1767542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Read : %d\n", n); 1768542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (n == 0 || reqhdr->tid != rsphdr->tid) { 1769542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = EPROTO; 1770542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 1771542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1772542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *rspsize = n; 1773542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 1774542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1775542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1776542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 1777542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * singly-linked lists (after openobex implementation) 1778542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 1779542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannsdp_list_t *sdp_list_append(sdp_list_t *p, void *d) 1780542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 178121f2a5244f0c6195e17ff71868328bc71d77f4d9Marcel Holtmann sdp_list_t *q, *n = malloc(sizeof(sdp_list_t)); 1782542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1783542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!n) 1784f58df2db7a606fcd13a36824bdb4fc3440d9a71eSantiago Carot-Nemesio return NULL; 1785542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1786542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann n->data = d; 1787542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann n->next = 0; 1788542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1789542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!p) 1790542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return n; 1791542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1792542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (q = p; q->next; q = q->next); 1793542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann q->next = n; 1794542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1795542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return p; 1796542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1797542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1798542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannsdp_list_t *sdp_list_remove(sdp_list_t *list, void *d) 1799542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1800542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_list_t *p, *q; 1801542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1802542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (q = 0, p = list; p; q = p, p = p->next) 1803542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (p->data == d) { 1804542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (q) 1805542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann q->next = p->next; 1806542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann else 1807542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann list = p->next; 1808542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(p); 1809542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 1810542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1811542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1812542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return list; 1813542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1814542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 18158f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedbergsdp_list_t *sdp_list_insert_sorted(sdp_list_t *list, void *d, 18168f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg sdp_comp_func_t f) 1817542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1818542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_list_t *q, *p, *n; 1819542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 182021f2a5244f0c6195e17ff71868328bc71d77f4d9Marcel Holtmann n = malloc(sizeof(sdp_list_t)); 1821542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!n) 1822f58df2db7a606fcd13a36824bdb4fc3440d9a71eSantiago Carot-Nemesio return NULL; 1823542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann n->data = d; 1824542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (q = 0, p = list; p; q = p, p = p->next) 1825542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (f(p->data, d) >= 0) 18268f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg break; 1827542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann // insert between q and p; if !q insert at head 1828542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (q) 1829542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann q->next = n; 1830542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann else 1831542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann list = n; 1832542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann n->next = p; 1833542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return list; 1834542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1835542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1836542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 18378f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg * Every element of the list points to things which need 1838542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * to be free()'d. This method frees the list's contents 1839542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 1840542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannvoid sdp_list_free(sdp_list_t *list, sdp_free_func_t f) 1841542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1842542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_list_t *next; 1843542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann while (list) { 1844542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann next = list->next; 1845542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (f) 1846542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann f(list->data); 1847542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(list); 1848542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann list = next; 1849542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1850542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1851542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1852542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannstatic inline int __find_port(sdp_data_t *seq, int proto) 1853542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1854542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!seq || !seq->next) 1855542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 1856542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1857542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (SDP_IS_UUID(seq->dtd) && sdp_uuid_to_proto(&seq->val.uuid) == proto) { 1858542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann seq = seq->next; 1859542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (seq->dtd) { 1860542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT8: 1861542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return seq->val.uint8; 1862542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT16: 1863542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return seq->val.uint16; 1864542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1865542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1866542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 1867542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1868542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1869542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_get_proto_port(const sdp_list_t *list, int proto) 1870542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1871542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (proto != L2CAP_UUID && proto != RFCOMM_UUID) { 1872542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = EINVAL; 1873542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 1874542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1875542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1876542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (; list; list = list->next) { 1877542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_list_t *p; 1878542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (p = list->data; p; p = p->next) { 1879d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann sdp_data_t *seq = p->data; 1880542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int port = __find_port(seq, proto); 1881542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (port) 1882542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return port; 1883542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1884542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1885542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 1886542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1887542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1888542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannsdp_data_t *sdp_get_proto_desc(sdp_list_t *list, int proto) 1889542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1890542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (; list; list = list->next) { 1891542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_list_t *p; 1892542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (p = list->data; p; p = p->next) { 1893d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann sdp_data_t *seq = p->data; 18948f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg if (SDP_IS_UUID(seq->dtd) && 1895542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_uuid_to_proto(&seq->val.uuid) == proto) 1896542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return seq->next; 1897542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1898542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1899542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return NULL; 1900542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1901542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1902542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_get_access_protos(const sdp_record_t *rec, sdp_list_t **pap) 1903542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1904542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *pdlist, *curr; 1905542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_list_t *ap = 0; 1906542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1907542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdlist = sdp_data_get(rec, SDP_ATTR_PROTO_DESC_LIST); 1908542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (pdlist == NULL) { 1909542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = ENODATA; 1910542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 1911542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1912542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("AP type : 0%x\n", pdlist->dtd); 1913542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1914542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (; pdlist; pdlist = pdlist->next) { 1915542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_list_t *pds = 0; 1916542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (curr = pdlist->val.dataseq; curr; curr = curr->next) 1917542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pds = sdp_list_append(pds, curr->val.dataseq); 1918542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann ap = sdp_list_append(ap, pds); 1919542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1920542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *pap = ap; 1921542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 1922542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1923542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1924233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmannint sdp_get_add_access_protos(const sdp_record_t *rec, sdp_list_t **pap) 1925233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann{ 1926233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann sdp_data_t *pdlist, *curr; 1927233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann sdp_list_t *ap = 0; 1928233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann 1929233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann pdlist = sdp_data_get(rec, SDP_ATTR_ADD_PROTO_DESC_LIST); 1930233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann if (pdlist == NULL) { 1931233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann errno = ENODATA; 1932233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann return -1; 1933233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann } 1934233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann SDPDBG("AP type : 0%x\n", pdlist->dtd); 1935233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann 1936233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann pdlist = pdlist->val.dataseq; 1937233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann 1938233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann for (; pdlist; pdlist = pdlist->next) { 1939233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann sdp_list_t *pds = 0; 1940233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann for (curr = pdlist->val.dataseq; curr; curr = curr->next) 1941233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann pds = sdp_list_append(pds, curr->val.dataseq); 1942233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann ap = sdp_list_append(ap, pds); 1943233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann } 1944233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann *pap = ap; 1945233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann return 0; 1946233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann} 1947233bd39dee08afc5176b203e6348184da56d7bffMarcel Holtmann 19488f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedbergint sdp_get_uuidseq_attr(const sdp_record_t *rec, uint16_t attr, 19498f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg sdp_list_t **seqp) 1950542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1951542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *sdpdata = sdp_data_get(rec, attr); 1952542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1953542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *seqp = NULL; 1954542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (sdpdata && sdpdata->dtd >= SDP_SEQ8 && sdpdata->dtd <= SDP_SEQ32) { 1955542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *d; 1956542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (d = sdpdata->val.dataseq; d; d = d->next) { 19571f9ec47e02cc789ab45c85e855c4f9e377df7e3cClaudio Takahasi uuid_t *u; 1958114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio if (d->dtd < SDP_UUID16 || d->dtd > SDP_UUID128) { 1959114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio errno = EINVAL; 1960542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto fail; 1961114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio } 19621f9ec47e02cc789ab45c85e855c4f9e377df7e3cClaudio Takahasi 19631f9ec47e02cc789ab45c85e855c4f9e377df7e3cClaudio Takahasi u = malloc(sizeof(uuid_t)); 1964114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio if (!u) 1965114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio goto fail; 1966114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio 19671f9ec47e02cc789ab45c85e855c4f9e377df7e3cClaudio Takahasi memset(u, 0, sizeof(uuid_t)); 19681f9ec47e02cc789ab45c85e855c4f9e377df7e3cClaudio Takahasi *u = d->val.uuid; 19691f9ec47e02cc789ab45c85e855c4f9e377df7e3cClaudio Takahasi *seqp = sdp_list_append(*seqp, u); 1970542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1971542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 1972542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 1973542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannfail: 1974542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_list_free(*seqp, free); 1975114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio *seqp = NULL; 1976542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 1977542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 1978542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1979542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_set_uuidseq_attr(sdp_record_t *rec, uint16_t aid, sdp_list_t *seq) 1980542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 1981542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int status = 0, i, len; 1982542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann void **dtds, **values; 1983542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint8_t uuid16 = SDP_UUID16; 1984542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint8_t uuid32 = SDP_UUID32; 1985542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint8_t uuid128 = SDP_UUID128; 1986542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_list_t *p; 1987542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 1988542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann len = sdp_list_len(seq); 1989542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!seq || len == 0) 1990542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 1991114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio dtds = malloc(len * sizeof(void *)); 1992114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio if (!dtds) 1993114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio return -1; 1994114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio 1995114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio values = malloc(len * sizeof(void *)); 1996114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio if (!values) { 1997114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio free(dtds); 1998114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio return -1; 1999114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio } 2000114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio 2001542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (p = seq, i = 0; i < len; i++, p = p->next) { 2002d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann uuid_t *uuid = p->data; 2003542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (uuid) 2004542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (uuid->type) { 2005542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID16: 2006542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann dtds[i] = &uuid16; 2007542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann values[i] = &uuid->value.uuid16; 2008542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2009542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID32: 2010542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann dtds[i] = &uuid32; 2011542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann values[i] = &uuid->value.uuid32; 2012542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2013542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID128: 2014542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann dtds[i] = &uuid128; 2015542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann values[i] = &uuid->value.uuid128; 2016542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2017542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann default: 2018542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = -1; 2019542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2020542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2021542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann else { 2022542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = -1; 2023542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2024542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2025542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2026542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (status == 0) { 2027542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *data = sdp_seq_alloc(dtds, values, len); 2028542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_attr_replace(rec, aid, data); 2029542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_pattern_add_uuidseq(rec, seq); 2030542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2031542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(dtds); 2032542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(values); 2033542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return status; 2034542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2035542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2036542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_get_lang_attr(const sdp_record_t *rec, sdp_list_t **langSeq) 2037542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2038542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_lang_attr_t *lang; 2039542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *sdpdata, *curr_data; 2040542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2041542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *langSeq = NULL; 2042542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdpdata = sdp_data_get(rec, SDP_ATTR_LANG_BASE_ATTR_ID_LIST); 2043542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (sdpdata == NULL) { 2044542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = ENODATA; 2045542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 2046542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2047542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann curr_data = sdpdata->val.dataseq; 2048542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann while (curr_data) { 2049542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *pCode = curr_data; 2050542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *pEncoding = pCode->next; 2051542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *pOffset = pEncoding->next; 2052ec43fff7e72686e1a7d0e473d62bd4a2793babb7Johan Hedberg if (pEncoding && pOffset) { 205321f2a5244f0c6195e17ff71868328bc71d77f4d9Marcel Holtmann lang = malloc(sizeof(sdp_lang_attr_t)); 2054114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio if (!lang) { 2055114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio sdp_list_free(*langSeq, free); 2056114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio *langSeq = NULL; 2057114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio return -1; 2058114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio } 2059542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann lang->code_ISO639 = pCode->val.uint16; 2060542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann lang->encoding = pEncoding->val.uint16; 2061542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann lang->base_offset = pOffset->val.uint16; 2062542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("code_ISO639 : 0x%02x\n", lang->code_ISO639); 2063542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("encoding : 0x%02x\n", lang->encoding); 2064542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("base_offfset : 0x%02x\n", lang->base_offset); 2065542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *langSeq = sdp_list_append(*langSeq, lang); 2066542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2067542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann curr_data = pOffset->next; 2068542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2069542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 2070542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2071542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2072542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_get_profile_descs(const sdp_record_t *rec, sdp_list_t **profDescSeq) 2073542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2074542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_profile_desc_t *profDesc; 2075542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *sdpdata, *seq; 2076542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2077542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *profDescSeq = NULL; 2078542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdpdata = sdp_data_get(rec, SDP_ATTR_PFILE_DESC_LIST); 2079542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!sdpdata || !sdpdata->val.dataseq) { 2080542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = ENODATA; 2081542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 2082542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2083542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (seq = sdpdata->val.dataseq; seq && seq->val.dataseq; seq = seq->next) { 20840f5a5a9580084a3c4e0644ef5cd75689aeb5ff40Marcel Holtmann uuid_t *uuid = NULL; 20850f5a5a9580084a3c4e0644ef5cd75689aeb5ff40Marcel Holtmann uint16_t version = 0x100; 20860f5a5a9580084a3c4e0644ef5cd75689aeb5ff40Marcel Holtmann 20870f5a5a9580084a3c4e0644ef5cd75689aeb5ff40Marcel Holtmann if (SDP_IS_UUID(seq->dtd)) { 20880f5a5a9580084a3c4e0644ef5cd75689aeb5ff40Marcel Holtmann uuid = &seq->val.uuid; 20890f5a5a9580084a3c4e0644ef5cd75689aeb5ff40Marcel Holtmann } else { 20900f5a5a9580084a3c4e0644ef5cd75689aeb5ff40Marcel Holtmann sdp_data_t *puuid = seq->val.dataseq; 20910f5a5a9580084a3c4e0644ef5cd75689aeb5ff40Marcel Holtmann sdp_data_t *pVnum = seq->val.dataseq->next; 20920f5a5a9580084a3c4e0644ef5cd75689aeb5ff40Marcel Holtmann if (puuid && pVnum) { 20930f5a5a9580084a3c4e0644ef5cd75689aeb5ff40Marcel Holtmann uuid = &puuid->val.uuid; 20940f5a5a9580084a3c4e0644ef5cd75689aeb5ff40Marcel Holtmann version = pVnum->val.uint16; 20950f5a5a9580084a3c4e0644ef5cd75689aeb5ff40Marcel Holtmann } 20960f5a5a9580084a3c4e0644ef5cd75689aeb5ff40Marcel Holtmann } 20970f5a5a9580084a3c4e0644ef5cd75689aeb5ff40Marcel Holtmann 20980f5a5a9580084a3c4e0644ef5cd75689aeb5ff40Marcel Holtmann if (uuid != NULL) { 209921f2a5244f0c6195e17ff71868328bc71d77f4d9Marcel Holtmann profDesc = malloc(sizeof(sdp_profile_desc_t)); 2100114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio if (!profDesc) { 2101114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio sdp_list_free(*profDescSeq, free); 2102114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio *profDescSeq = NULL; 2103114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio return -1; 2104114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio } 21050f5a5a9580084a3c4e0644ef5cd75689aeb5ff40Marcel Holtmann profDesc->uuid = *uuid; 21060f5a5a9580084a3c4e0644ef5cd75689aeb5ff40Marcel Holtmann profDesc->version = version; 2107542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann#ifdef SDP_DEBUG 2108542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_uuid_print(&profDesc->uuid); 2109542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Vnum : 0x%04x\n", profDesc->version); 2110542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann#endif 2111542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *profDescSeq = sdp_list_append(*profDescSeq, profDesc); 2112542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2113542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2114542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 2115542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2116542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2117542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_get_server_ver(const sdp_record_t *rec, sdp_list_t **u16) 2118542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2119542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *d, *curr; 2120542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2121542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *u16 = NULL; 2122542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann d = sdp_data_get(rec, SDP_ATTR_VERSION_NUM_LIST); 2123542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (d == NULL) { 2124542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = ENODATA; 2125542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 2126542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2127542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (curr = d->val.dataseq; curr; curr = curr->next) 2128542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *u16 = sdp_list_append(*u16, &curr->val.uint16); 2129542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 2130542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2131542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2132542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* flexible extraction of basic attributes - Jean II */ 2133542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* How do we expect caller to extract predefined data sequences? */ 2134542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_get_int_attr(const sdp_record_t *rec, uint16_t attrid, int *value) 2135542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2136542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *sdpdata = sdp_data_get(rec, attrid); 2137542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2138542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (sdpdata) 2139542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann /* Verify that it is what the caller expects */ 2140542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (sdpdata->dtd == SDP_BOOL || sdpdata->dtd == SDP_UINT8 || 2141542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdpdata->dtd == SDP_UINT16 || sdpdata->dtd == SDP_UINT32 || 2142542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdpdata->dtd == SDP_INT8 || sdpdata->dtd == SDP_INT16 || 2143542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdpdata->dtd == SDP_INT32) { 2144542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *value = sdpdata->val.uint32; 2145542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 2146542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2147542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = EINVAL; 2148542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 2149542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2150542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 21518f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedbergint sdp_get_string_attr(const sdp_record_t *rec, uint16_t attrid, char *value, 21528f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg int valuelen) 2153542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2154542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *sdpdata = sdp_data_get(rec, attrid); 2155542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (sdpdata) 2156542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann /* Verify that it is what the caller expects */ 21578f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg if (sdpdata->dtd == SDP_TEXT_STR8 || 21588f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg sdpdata->dtd == SDP_TEXT_STR16 || 21598f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg sdpdata->dtd == SDP_TEXT_STR32) 2160cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if ((int) strlen(sdpdata->val.str) < valuelen) { 2161542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann strcpy(value, sdpdata->val.str); 2162542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 2163542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2164542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = EINVAL; 2165542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 2166542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2167542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2168542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann#define get_basic_attr(attrID, pAttrValue, fieldName) \ 2169542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *data = sdp_data_get(rec, attrID); \ 2170542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (data) { \ 2171542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *pAttrValue = data->val.fieldName; \ 2172542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; \ 2173542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } \ 2174542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = EINVAL; \ 2175542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 2176542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2177542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_get_service_id(const sdp_record_t *rec, uuid_t *uuid) 2178542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2179542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann get_basic_attr(SDP_ATTR_SERVICE_ID, uuid, uuid); 2180542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2181542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2182542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_get_group_id(const sdp_record_t *rec, uuid_t *uuid) 2183542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2184542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann get_basic_attr(SDP_ATTR_GROUP_ID, uuid, uuid); 2185542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2186542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2187542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_get_record_state(const sdp_record_t *rec, uint32_t *svcRecState) 2188542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2189542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann get_basic_attr(SDP_ATTR_RECORD_STATE, svcRecState, uint32); 2190542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2191542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2192542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_get_service_avail(const sdp_record_t *rec, uint8_t *svcAvail) 2193542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2194542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann get_basic_attr(SDP_ATTR_SERVICE_AVAILABILITY, svcAvail, uint8); 2195542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2196542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2197542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_get_service_ttl(const sdp_record_t *rec, uint32_t *svcTTLInfo) 2198542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2199542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann get_basic_attr(SDP_ATTR_SVCINFO_TTL, svcTTLInfo, uint32); 2200542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2201542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2202542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_get_database_state(const sdp_record_t *rec, uint32_t *svcDBState) 2203542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2204542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann get_basic_attr(SDP_ATTR_SVCDB_STATE, svcDBState, uint32); 2205542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2206542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2207542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 2208542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * NOTE that none of the setXXX() functions below will 2209542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * actually update the SDP server, unless the 2210542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * {register, update}sdp_record_t() function is invoked. 2211542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 2212542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 22138f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedbergint sdp_attr_add_new(sdp_record_t *rec, uint16_t attr, uint8_t dtd, 22148f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg const void *value) 2215542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2216542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *d = sdp_data_alloc(dtd, value); 2217542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (d) { 2218542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_attr_replace(rec, attr, d); 2219542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 2220542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2221542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 2222542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2223542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2224eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocerastatic int sdp_attr_add_new_with_length(sdp_record_t *rec, 2225eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera uint16_t attr, uint8_t dtd, const void *value, uint32_t len) 2226eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera{ 2227eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera sdp_data_t *d; 2228eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera 2229eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera d = sdp_data_alloc_with_length(dtd, value, len); 2230eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera if (!d) 2231eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera return -1; 2232eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera 2233eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera sdp_attr_replace(rec, attr, d); 2234eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera 2235eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera return 0; 2236eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera} 2237eb101261ee8d43dd3a1bfaa982a3336cd8dfa020Bastien Nocera 2238542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 2239542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Set the information attributes of the service 2240542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * pointed to by rec. The attributes are 2241542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * service name, description and provider name 2242542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 22438f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedbergvoid sdp_set_info_attr(sdp_record_t *rec, const char *name, const char *prov, 22448f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg const char *desc) 2245542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2246542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (name) 2247d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann sdp_attr_add_new(rec, SDP_ATTR_SVCNAME_PRIMARY, 2248d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann SDP_TEXT_STR8, name); 2249542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (prov) 2250d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann sdp_attr_add_new(rec, SDP_ATTR_PROVNAME_PRIMARY, 2251d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann SDP_TEXT_STR8, prov); 2252542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (desc) 2253d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann sdp_attr_add_new(rec, SDP_ATTR_SVCDESC_PRIMARY, 2254d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann SDP_TEXT_STR8, desc); 2255542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2256542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2257542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannstatic sdp_data_t *access_proto_to_dataseq(sdp_record_t *rec, sdp_list_t *proto) 2258542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2259542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *seq = NULL; 2260542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann void *dtds[10], *values[10]; 2261542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann void **seqDTDs, **seqs; 2262542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int i, seqlen; 2263542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_list_t *p; 2264542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2265542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann seqlen = sdp_list_len(proto); 2266114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio seqDTDs = malloc(seqlen * sizeof(void *)); 2267114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio if (!seqDTDs) 2268114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio return NULL; 2269114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio 2270114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio seqs = malloc(seqlen * sizeof(void *)); 2271114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio if (!seqs) { 2272114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio free(seqDTDs); 2273114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio return NULL; 2274114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio } 2275114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio 2276542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (i = 0, p = proto; p; p = p->next, i++) { 2277d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann sdp_list_t *elt = p->data; 2278542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *s; 22794e50b413d5237e3fcfa44780ab2207a871686bd2Marcel Holtmann uuid_t *uuid = NULL; 2280cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann unsigned int pslen = 0; 2281206da78a25ae175741a7444edd13dcf67bbdf059Luiz Augusto von Dentz for (; elt && pslen < ARRAY_SIZE(dtds); elt = elt->next, pslen++) { 2282d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann sdp_data_t *d = elt->data; 2283542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann dtds[pslen] = &d->dtd; 2284542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (d->dtd) { 2285542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID16: 22864e50b413d5237e3fcfa44780ab2207a871686bd2Marcel Holtmann uuid = (uuid_t *) d; 22874e50b413d5237e3fcfa44780ab2207a871686bd2Marcel Holtmann values[pslen] = &uuid->value.uuid16; 2288542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2289542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID32: 22904e50b413d5237e3fcfa44780ab2207a871686bd2Marcel Holtmann uuid = (uuid_t *) d; 22914e50b413d5237e3fcfa44780ab2207a871686bd2Marcel Holtmann values[pslen] = &uuid->value.uuid32; 2292542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2293542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID128: 22944e50b413d5237e3fcfa44780ab2207a871686bd2Marcel Holtmann uuid = (uuid_t *) d; 22954e50b413d5237e3fcfa44780ab2207a871686bd2Marcel Holtmann values[pslen] = &uuid->value.uuid128; 2296542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2297542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT8: 2298542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann values[pslen] = &d->val.uint8; 2299542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2300542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UINT16: 2301542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann values[pslen] = &d->val.uint16; 2302542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2303542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ8: 2304542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ16: 2305542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ32: 2306542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann values[pslen] = d; 2307542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 23088f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg /* FIXME: more */ 2309542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2310542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2311542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann s = sdp_seq_alloc(dtds, values, pslen); 2312542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (s) { 2313542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann seqDTDs[i] = &s->dtd; 2314542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann seqs[i] = s; 23154e50b413d5237e3fcfa44780ab2207a871686bd2Marcel Holtmann if (uuid) 23164e50b413d5237e3fcfa44780ab2207a871686bd2Marcel Holtmann sdp_pattern_add_uuid(rec, uuid); 2317542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2318542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2319542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann seq = sdp_seq_alloc(seqDTDs, seqs, seqlen); 2320542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(seqDTDs); 2321542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(seqs); 2322542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return seq; 2323542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2324542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2325542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 2326542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * sets the access protocols of the service specified 2327542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * to the value specified in "access_proto" 2328542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 23298f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg * Note that if there are alternate mechanisms by 23308f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg * which the service is accessed, then they should 23318f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg * be specified as sequences 2332542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 2333542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Using a value of NULL for accessProtocols has 2334542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * effect of removing this attribute (if previously set) 23358f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg * 2336542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * This function replaces the existing sdp_access_proto_t 2337542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * structure (if any) with the new one specified. 2338542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 2339542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * returns 0 if successful or -1 if there is a failure. 2340542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 2341542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_set_access_protos(sdp_record_t *rec, const sdp_list_t *ap) 2342542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2343542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann const sdp_list_t *p; 2344aa8d087a052ab9c54dde1b0ddaf3a47494ef899aMarcel Holtmann sdp_data_t *protos = NULL; 2345542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2346542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (p = ap; p; p = p->next) { 2347d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann sdp_data_t *seq = access_proto_to_dataseq(rec, p->data); 2348542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann protos = sdp_seq_append(protos, seq); 2349542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2350aa8d087a052ab9c54dde1b0ddaf3a47494ef899aMarcel Holtmann 2351542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_attr_add(rec, SDP_ATTR_PROTO_DESC_LIST, protos); 2352aa8d087a052ab9c54dde1b0ddaf3a47494ef899aMarcel Holtmann 2353aa8d087a052ab9c54dde1b0ddaf3a47494ef899aMarcel Holtmann return 0; 2354aa8d087a052ab9c54dde1b0ddaf3a47494ef899aMarcel Holtmann} 2355aa8d087a052ab9c54dde1b0ddaf3a47494ef899aMarcel Holtmann 2356aa8d087a052ab9c54dde1b0ddaf3a47494ef899aMarcel Holtmannint sdp_set_add_access_protos(sdp_record_t *rec, const sdp_list_t *ap) 2357aa8d087a052ab9c54dde1b0ddaf3a47494ef899aMarcel Holtmann{ 2358aa8d087a052ab9c54dde1b0ddaf3a47494ef899aMarcel Holtmann const sdp_list_t *p; 2359aa8d087a052ab9c54dde1b0ddaf3a47494ef899aMarcel Holtmann sdp_data_t *protos = NULL; 2360aa8d087a052ab9c54dde1b0ddaf3a47494ef899aMarcel Holtmann 2361aa8d087a052ab9c54dde1b0ddaf3a47494ef899aMarcel Holtmann for (p = ap; p; p = p->next) { 2362d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann sdp_data_t *seq = access_proto_to_dataseq(rec, p->data); 2363aa8d087a052ab9c54dde1b0ddaf3a47494ef899aMarcel Holtmann protos = sdp_seq_append(protos, seq); 2364aa8d087a052ab9c54dde1b0ddaf3a47494ef899aMarcel Holtmann } 2365aa8d087a052ab9c54dde1b0ddaf3a47494ef899aMarcel Holtmann 2366aa8d087a052ab9c54dde1b0ddaf3a47494ef899aMarcel Holtmann sdp_attr_add(rec, SDP_ATTR_ADD_PROTO_DESC_LIST, 2367aa8d087a052ab9c54dde1b0ddaf3a47494ef899aMarcel Holtmann protos ? sdp_data_alloc(SDP_SEQ8, protos) : NULL); 2368aa8d087a052ab9c54dde1b0ddaf3a47494ef899aMarcel Holtmann 2369542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 2370542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2371542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2372542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 2373542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * set the "LanguageBase" attributes of the service record 2374542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * record to the value specified in "langAttrList". 2375542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 2376542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * "langAttrList" is a linked list of "sdp_lang_attr_t" 2377542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * objects, one for each language in which user visible 2378542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * attributes are present in the service record. 2379542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 2380542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Using a value of NULL for langAttrList has 2381542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * effect of removing this attribute (if previously set) 23828f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg * 2383542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * This function replaces the exisiting sdp_lang_attr_t 2384542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * structure (if any) with the new one specified. 2385542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 2386542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * returns 0 if successful or -1 if there is a failure. 2387542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 2388542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_set_lang_attr(sdp_record_t *rec, const sdp_list_t *seq) 2389542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2390542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint8_t uint16 = SDP_UINT16; 2391542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int status = 0, i = 0, seqlen = sdp_list_len(seq); 2392114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio void **dtds, **values; 2393542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann const sdp_list_t *p; 2394542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2395114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio dtds = malloc(3 * seqlen * sizeof(void *)); 2396114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio if (!dtds) 2397114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio return -1; 2398114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio 2399114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio values = malloc(3 * seqlen * sizeof(void *)); 2400114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio if (!values) { 2401114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio free(dtds); 2402114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio return -1; 2403114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio } 2404114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio 2405542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (p = seq; p; p = p->next) { 2406d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann sdp_lang_attr_t *lang = p->data; 2407542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!lang) { 2408542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = -1; 2409542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2410542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2411542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann dtds[i] = &uint16; 2412542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann values[i] = &lang->code_ISO639; 2413542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann i++; 2414542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann dtds[i] = &uint16; 2415542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann values[i] = &lang->encoding; 2416542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann i++; 2417542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann dtds[i] = &uint16; 2418542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann values[i] = &lang->base_offset; 2419542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann i++; 2420542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2421542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (status == 0) { 2422542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *seq = sdp_seq_alloc(dtds, values, 3 * seqlen); 2423542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_attr_add(rec, SDP_ATTR_LANG_BASE_ATTR_ID_LIST, seq); 2424542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2425542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(dtds); 2426542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(values); 2427542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return status; 2428542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2429542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2430542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 24318f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg * set the "ServiceID" attribute of the service. 24328f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg * 24338f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg * This is the UUID of the service. 24348f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg * 2435542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * returns 0 if successful or -1 if there is a failure. 2436542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 2437542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannvoid sdp_set_service_id(sdp_record_t *rec, uuid_t uuid) 2438542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2439542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (uuid.type) { 2440542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID16: 24418f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg sdp_attr_add_new(rec, SDP_ATTR_SERVICE_ID, SDP_UUID16, 24428f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg &uuid.value.uuid16); 2443542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2444542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID32: 24458f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg sdp_attr_add_new(rec, SDP_ATTR_SERVICE_ID, SDP_UUID32, 24468f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg &uuid.value.uuid32); 2447542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2448542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID128: 24498f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg sdp_attr_add_new(rec, SDP_ATTR_SERVICE_ID, SDP_UUID128, 24508f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg &uuid.value.uuid128); 2451542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2452542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2453542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_pattern_add_uuid(rec, &uuid); 2454542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2455542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2456542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 24578f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg * set the GroupID attribute of the service record defining a group. 24588f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg * 24598f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg * This is the UUID of the group. 24608f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg * 2461542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * returns 0 if successful or -1 if there is a failure. 2462542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 2463542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannvoid sdp_set_group_id(sdp_record_t *rec, uuid_t uuid) 2464542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2465542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (uuid.type) { 2466542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID16: 24678f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg sdp_attr_add_new(rec, SDP_ATTR_GROUP_ID, SDP_UUID16, 24688f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg &uuid.value.uuid16); 2469542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2470542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID32: 24718f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg sdp_attr_add_new(rec, SDP_ATTR_GROUP_ID, SDP_UUID32, 24728f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg &uuid.value.uuid32); 2473542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2474542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID128: 24758f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg sdp_attr_add_new(rec, SDP_ATTR_GROUP_ID, SDP_UUID128, 24768f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg &uuid.value.uuid128); 2477542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2478542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2479542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_pattern_add_uuid(rec, &uuid); 2480542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2481542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2482542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 2483542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * set the ProfileDescriptorList attribute of the service record 2484542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * pointed to by record to the value specified in "profileDesc". 2485542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 2486542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Each element in the list is an object of type 2487542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * sdp_profile_desc_t which is a definition of the 2488542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Bluetooth profile that this service conforms to. 2489542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 2490542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Using a value of NULL for profileDesc has 2491542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * effect of removing this attribute (if previously set) 24928f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg * 2493542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * This function replaces the exisiting ProfileDescriptorList 2494542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * structure (if any) with the new one specified. 2495542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 2496542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * returns 0 if successful or -1 if there is a failure. 2497542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 2498542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_set_profile_descs(sdp_record_t *rec, const sdp_list_t *profiles) 2499542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2500542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int status = 0; 2501542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint8_t uuid16 = SDP_UUID16; 2502542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint8_t uuid32 = SDP_UUID32; 2503542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint8_t uuid128 = SDP_UUID128; 2504542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint8_t uint16 = SDP_UINT16; 2505542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int i = 0, seqlen = sdp_list_len(profiles); 2506114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio void **seqDTDs, **seqs; 2507542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann const sdp_list_t *p; 2508542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2509114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio seqDTDs = malloc(seqlen * sizeof(void *)); 2510114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio if (!seqDTDs) 2511114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio return -1; 2512114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio 2513114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio seqs = malloc(seqlen * sizeof(void *)); 2514114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio if (!seqs) { 2515114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio free(seqDTDs); 2516114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio return -1; 2517114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio } 2518114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio 2519542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (p = profiles; p; p = p->next) { 2520542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *seq; 2521542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann void *dtds[2], *values[2]; 2522d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann sdp_profile_desc_t *profile = p->data; 2523542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!profile) { 2524542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = -1; 2525542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2526542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2527542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (profile->uuid.type) { 2528542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID16: 2529542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann dtds[0] = &uuid16; 2530542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann values[0] = &profile->uuid.value.uuid16; 2531542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2532542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID32: 2533542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann dtds[0] = &uuid32; 2534542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann values[0] = &profile->uuid.value.uuid32; 2535542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2536542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID128: 2537542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann dtds[0] = &uuid128; 2538542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann values[0] = &profile->uuid.value.uuid128; 2539542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2540542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann default: 2541542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = -1; 2542542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2543542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2544542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann dtds[1] = &uint16; 2545542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann values[1] = &profile->version; 2546542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann seq = sdp_seq_alloc(dtds, values, 2); 2547542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (seq) { 2548542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann seqDTDs[i] = &seq->dtd; 2549542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann seqs[i] = seq; 2550542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_pattern_add_uuid(rec, &profile->uuid); 2551542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2552542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann i++; 2553542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2554542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (status == 0) { 2555542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *pAPSeq = sdp_seq_alloc(seqDTDs, seqs, seqlen); 2556542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_attr_add(rec, SDP_ATTR_PFILE_DESC_LIST, pAPSeq); 2557542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2558542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(seqDTDs); 2559542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(seqs); 2560542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return status; 2561542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2562542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2563542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 2564542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * sets various URL attributes of the service 2565542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * pointed to by record. The URL include 2566542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 2567542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * client: a URL to the client's 2568542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * platform specific (WinCE, PalmOS) executable 2569542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * code that can be used to access this service. 2570542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 2571542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * doc: a URL pointing to service documentation 2572542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 2573542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * icon: a URL to an icon that can be used to represent 2574542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * this service. 2575542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 2576542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Note that you need to pass NULL for any URLs 2577542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * that you don't want to set or remove 2578542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 25798f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedbergvoid sdp_set_url_attr(sdp_record_t *rec, const char *client, const char *doc, 25808f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg const char *icon) 2581542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2582542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_attr_add_new(rec, SDP_ATTR_CLNT_EXEC_URL, SDP_URL_STR8, client); 2583542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_attr_add_new(rec, SDP_ATTR_DOC_URL, SDP_URL_STR8, doc); 2584542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_attr_add_new(rec, SDP_ATTR_ICON_URL, SDP_URL_STR8, icon); 2585542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2586542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2587542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannuuid_t *sdp_uuid16_create(uuid_t *u, uint16_t val) 2588542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2589542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memset(u, 0, sizeof(uuid_t)); 2590542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann u->type = SDP_UUID16; 2591542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann u->value.uuid16 = val; 2592542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return u; 2593542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2594542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2595542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannuuid_t *sdp_uuid32_create(uuid_t *u, uint32_t val) 2596542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2597542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memset(u, 0, sizeof(uuid_t)); 2598542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann u->type = SDP_UUID32; 2599542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann u->value.uuid32 = val; 2600542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return u; 2601542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2602542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2603542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannuuid_t *sdp_uuid128_create(uuid_t *u, const void *val) 26048f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg{ 2605542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memset(u, 0, sizeof(uuid_t)); 2606542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann u->type = SDP_UUID128; 2607542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(&u->value.uuid128, val, sizeof(uint128_t)); 2608542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return u; 2609542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2610542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2611542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 2612542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * UUID comparison function 2613542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * returns 0 if uuidValue1 == uuidValue2 else -1 2614542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 261568a3563bf41199b4949f77251788faf62b697babLuiz Augusto von Dentzint sdp_uuid_cmp(const void *p1, const void *p2) 261668a3563bf41199b4949f77251788faf62b697babLuiz Augusto von Dentz{ 2617bd3ebad37bedd9082f4123751c304ed97a7866fdMarcel Holtmann uuid_t *u1 = sdp_uuid_to_uuid128(p1); 2618bd3ebad37bedd9082f4123751c304ed97a7866fdMarcel Holtmann uuid_t *u2 = sdp_uuid_to_uuid128(p2); 261968a3563bf41199b4949f77251788faf62b697babLuiz Augusto von Dentz int ret; 262068a3563bf41199b4949f77251788faf62b697babLuiz Augusto von Dentz 262168a3563bf41199b4949f77251788faf62b697babLuiz Augusto von Dentz ret = sdp_uuid128_cmp(u1, u2); 262268a3563bf41199b4949f77251788faf62b697babLuiz Augusto von Dentz 262368a3563bf41199b4949f77251788faf62b697babLuiz Augusto von Dentz bt_free(u1); 262468a3563bf41199b4949f77251788faf62b697babLuiz Augusto von Dentz bt_free(u2); 262568a3563bf41199b4949f77251788faf62b697babLuiz Augusto von Dentz 262668a3563bf41199b4949f77251788faf62b697babLuiz Augusto von Dentz return ret; 262768a3563bf41199b4949f77251788faf62b697babLuiz Augusto von Dentz} 262868a3563bf41199b4949f77251788faf62b697babLuiz Augusto von Dentz 262968a3563bf41199b4949f77251788faf62b697babLuiz Augusto von Dentz/* 263068a3563bf41199b4949f77251788faf62b697babLuiz Augusto von Dentz * UUID comparison function 263168a3563bf41199b4949f77251788faf62b697babLuiz Augusto von Dentz * returns 0 if uuidValue1 == uuidValue2 else -1 263268a3563bf41199b4949f77251788faf62b697babLuiz Augusto von Dentz */ 2633542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_uuid16_cmp(const void *p1, const void *p2) 2634542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2635d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann const uuid_t *u1 = p1; 2636d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann const uuid_t *u2 = p2; 2637542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return memcmp(&u1->value.uuid16, &u2->value.uuid16, sizeof(uint16_t)); 2638542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2639542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2640542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 2641542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * UUID comparison function 2642542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * returns 0 if uuidValue1 == uuidValue2 else -1 2643542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 2644542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_uuid128_cmp(const void *p1, const void *p2) 2645542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2646d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann const uuid_t *u1 = p1; 2647d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann const uuid_t *u2 = p2; 2648542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return memcmp(&u1->value.uuid128, &u2->value.uuid128, sizeof(uint128_t)); 2649542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2650542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2651542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 2652542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 128 to 16 bit and 32 to 16 bit UUID conversion functions 2653542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * yet to be implemented. Note that the input is in NBO in 2654542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * both 32 and 128 bit UUIDs and conversion is needed 2655542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 2656bd3ebad37bedd9082f4123751c304ed97a7866fdMarcel Holtmannvoid sdp_uuid16_to_uuid128(uuid_t *uuid128, const uuid_t *uuid16) 2657542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2658542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann /* 2659542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * We have a 16 bit value, which needs to be added to 2660542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * bytes 3 and 4 (at indices 2 and 3) of the Bluetooth base 2661542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 2662542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann unsigned short data1; 2663542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 26648f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg /* allocate a 128bit UUID and init to the Bluetooth base UUID */ 26653f8700636d21bb868c2dbb8d2403e550a7750cebMarcel Holtmann uuid128->value.uuid128 = bluetooth_base_uuid; 2666542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uuid128->type = SDP_UUID128; 2667542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 26688f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg /* extract bytes 2 and 3 of 128bit BT base UUID */ 26693f8700636d21bb868c2dbb8d2403e550a7750cebMarcel Holtmann memcpy(&data1, &bluetooth_base_uuid.data[2], 2); 2670542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 26718f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg /* add the given UUID (16 bits) */ 2672542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann data1 += htons(uuid16->value.uuid16); 2673542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 26748f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg /* set bytes 2 and 3 of the 128 bit value */ 2675542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(&uuid128->value.uuid128.data[2], &data1, 2); 2676542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2677542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2678bd3ebad37bedd9082f4123751c304ed97a7866fdMarcel Holtmannvoid sdp_uuid32_to_uuid128(uuid_t *uuid128, const uuid_t *uuid32) 2679542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2680542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann /* 2681542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * We have a 32 bit value, which needs to be added to 2682542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * bytes 1->4 (at indices 0 thru 3) of the Bluetooth base 2683542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 2684542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann unsigned int data0; 2685542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 26868f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg /* allocate a 128bit UUID and init to the Bluetooth base UUID */ 26873f8700636d21bb868c2dbb8d2403e550a7750cebMarcel Holtmann uuid128->value.uuid128 = bluetooth_base_uuid; 2688542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uuid128->type = SDP_UUID128; 2689542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 26908f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg /* extract first 4 bytes */ 26913f8700636d21bb868c2dbb8d2403e550a7750cebMarcel Holtmann memcpy(&data0, &bluetooth_base_uuid.data[0], 4); 2692542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 26938f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg /* add the given UUID (32bits) */ 2694542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann data0 += htonl(uuid32->value.uuid32); 2695542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 26968f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg /* set the 4 bytes of the 128 bit value */ 2697542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(&uuid128->value.uuid128.data[0], &data0, 4); 2698542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2699542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2700bd3ebad37bedd9082f4123751c304ed97a7866fdMarcel Holtmannuuid_t *sdp_uuid_to_uuid128(const uuid_t *uuid) 2701542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 270221f2a5244f0c6195e17ff71868328bc71d77f4d9Marcel Holtmann uuid_t *uuid128 = bt_malloc(sizeof(uuid_t)); 2703114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio 2704114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio if (!uuid128) 2705114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio return NULL; 2706114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio 2707542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memset(uuid128, 0, sizeof(uuid_t)); 2708542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (uuid->type) { 2709542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID128: 2710542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *uuid128 = *uuid; 2711542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2712542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID32: 2713542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_uuid32_to_uuid128(uuid128, uuid); 2714542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2715542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_UUID16: 2716542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_uuid16_to_uuid128(uuid128, uuid); 2717542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2718542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2719542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return uuid128; 2720542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2721542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 27228f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg/* 2723542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * converts a 128-bit uuid to a 16/32-bit one if possible 2724542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * returns true if uuid contains a 16/32-bit UUID at exit 2725542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 2726542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_uuid128_to_uuid(uuid_t *uuid) 2727542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 27283f8700636d21bb868c2dbb8d2403e550a7750cebMarcel Holtmann uint128_t *b = &bluetooth_base_uuid; 2729542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint128_t *u = &uuid->value.uuid128; 2730542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint32_t data; 2731cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann unsigned int i; 2732a8efcfa5ca81ef29e4d56dac70761d9b9ffc9708Marcel Holtmann 2733542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (uuid->type != SDP_UUID128) 2734542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 1; 2735a8efcfa5ca81ef29e4d56dac70761d9b9ffc9708Marcel Holtmann 2736542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (i = 4; i < sizeof(b->data); i++) 2737542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (b->data[i] != u->data[i]) 2738542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 2739a8efcfa5ca81ef29e4d56dac70761d9b9ffc9708Marcel Holtmann 2740542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(&data, u->data, 4); 2741542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann data = htonl(data); 2742542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (data <= 0xffff) { 2743542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uuid->type = SDP_UUID16; 27443f8700636d21bb868c2dbb8d2403e550a7750cebMarcel Holtmann uuid->value.uuid16 = (uint16_t) data; 2745542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } else { 2746542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uuid->type = SDP_UUID32; 2747542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uuid->value.uuid32 = data; 2748542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2749542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 1; 2750542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2751542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2752542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 2753542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * convert a UUID to the 16-bit short-form 2754542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 2755542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_uuid_to_proto(uuid_t *uuid) 2756542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2757542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uuid_t u = *uuid; 2758a8efcfa5ca81ef29e4d56dac70761d9b9ffc9708Marcel Holtmann if (sdp_uuid128_to_uuid(&u)) { 2759a8efcfa5ca81ef29e4d56dac70761d9b9ffc9708Marcel Holtmann switch (u.type) { 2760a8efcfa5ca81ef29e4d56dac70761d9b9ffc9708Marcel Holtmann case SDP_UUID16: 2761a8efcfa5ca81ef29e4d56dac70761d9b9ffc9708Marcel Holtmann return u.value.uuid16; 2762a8efcfa5ca81ef29e4d56dac70761d9b9ffc9708Marcel Holtmann case SDP_UUID32: 2763a8efcfa5ca81ef29e4d56dac70761d9b9ffc9708Marcel Holtmann return u.value.uuid32; 2764a8efcfa5ca81ef29e4d56dac70761d9b9ffc9708Marcel Holtmann } 2765a8efcfa5ca81ef29e4d56dac70761d9b9ffc9708Marcel Holtmann } 2766542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 2767542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2768542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2769542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 27708f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg * This function appends data to the PDU buffer "dst" from source "src". 2771542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * The data length is also computed and set. 2772542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Should the PDU length exceed 2^8, then sequence type is 2773542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * set accordingly and the data is memmove()'d. 2774542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 2775cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmannvoid sdp_append_to_buf(sdp_buf_t *dst, uint8_t *data, uint32_t len) 2776542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2777cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint8_t *p = dst->data; 2778d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann uint8_t dtd = *p; 2779542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2780542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Append src size: %d\n", len); 2781542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Append dst size: %d\n", dst->data_size); 2782542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Dst buffer size: %d\n", dst->buf_size); 2783542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (dst->data_size == 0 && dtd == 0) { 27848f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg /* create initial sequence */ 2785d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann *p = SDP_SEQ8; 2786542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p += sizeof(uint8_t); 2787542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann dst->data_size += sizeof(uint8_t); 27888f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg /* reserve space for sequence size */ 2789542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p += sizeof(uint8_t); 2790542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann dst->data_size += sizeof(uint8_t); 2791542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2792542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2793542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(dst->data + dst->data_size, data, len); 2794542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann dst->data_size += len; 2795542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2796d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann dtd = *(uint8_t *) dst->data; 2797542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (dst->data_size > UCHAR_MAX && dtd == SDP_SEQ8) { 2798542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann short offset = sizeof(uint8_t) + sizeof(uint8_t); 27998f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg memmove(dst->data + offset + 1, dst->data + offset, 28008f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg dst->data_size - offset); 2801542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p = dst->data; 2802d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann *p = SDP_SEQ16; 2803542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p += sizeof(uint8_t); 2804542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann dst->data_size += 1; 2805542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2806542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p = dst->data; 2807aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann dtd = *(uint8_t *) p; 2808542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p += sizeof(uint8_t); 2809542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann switch (dtd) { 2810542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ8: 2811aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann *(uint8_t *) p = dst->data_size - sizeof(uint8_t) - sizeof(uint8_t); 2812542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2813542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ16: 2814aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann bt_put_unaligned(htons(dst->data_size - sizeof(uint8_t) - sizeof(uint16_t)), (uint16_t *) p); 2815542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2816542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann case SDP_SEQ32: 2817aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann bt_put_unaligned(htonl(dst->data_size - sizeof(uint8_t) - sizeof(uint32_t)), (uint32_t *) p); 2818542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann break; 2819542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2820542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2821542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2822542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannvoid sdp_append_to_pdu(sdp_buf_t *pdu, sdp_data_t *d) 2823542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2824542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_buf_t append; 2825542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2826997f54c70b25706839544018ad15a718911eb45fMarcel Holtmann memset(&append, 0, sizeof(sdp_buf_t)); 28272db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz sdp_gen_buffer(&append, d); 28282db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz append.data = malloc(append.buf_size); 28292db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz if (!append.data) 28302db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz return; 2831997f54c70b25706839544018ad15a718911eb45fMarcel Holtmann 2832542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_set_attrid(&append, d->attrId); 2833542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_gen_pdu(&append, d); 2834542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_append_to_buf(pdu, append.data, append.data_size); 28352db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz free(append.data); 2836542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2837542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2838542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 2839542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Registers an sdp record. 2840542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 2841542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * It is incorrect to call this method on a record that 2842542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * has been already registered with the server. 2843542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 28448b11908eac4e0b4e14534ec2d44ae62806fdfd2fStephen Crane * Returns zero on success, otherwise -1 (and sets errno). 2845542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 284682817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmannint sdp_device_record_register_binary(sdp_session_t *session, bdaddr_t *device, uint8_t *data, uint32_t size, uint8_t flags, uint32_t *handle) 2847542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2848cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint8_t *req, *rsp, *p; 2849cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint32_t reqsize, rspsize; 2850542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_pdu_hdr_t *reqhdr, *rsphdr; 285182817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann int status; 2852542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2853542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG(""); 2854542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2855542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!session->local) { 2856542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = EREMOTE; 2857542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 2858542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2859cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann req = malloc(SDP_REQ_BUFFER_SIZE); 2860cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann rsp = malloc(SDP_RSP_BUFFER_SIZE); 2861542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (req == NULL || rsp == NULL) { 2862542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = -1; 2863542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = ENOMEM; 2864542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto end; 2865542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 286682817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 2867542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr = (sdp_pdu_hdr_t *)req; 2868542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr->pdu_id = SDP_SVC_REGISTER_REQ; 2869542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr->tid = htons(sdp_gen_tid(session)); 2870542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqsize = sizeof(sdp_pdu_hdr_t) + 1; 2871542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p = req + sizeof(sdp_pdu_hdr_t); 287282817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 2873fb1557c4111ca9993e4927af6f65bdbf9c2fa8ecMarcel Holtmann if (bacmp(device, BDADDR_ANY)) { 2874fb1557c4111ca9993e4927af6f65bdbf9c2fa8ecMarcel Holtmann *p++ = flags | SDP_DEVICE_RECORD; 2875fb1557c4111ca9993e4927af6f65bdbf9c2fa8ecMarcel Holtmann bacpy((bdaddr_t *) p, device); 2876fb1557c4111ca9993e4927af6f65bdbf9c2fa8ecMarcel Holtmann p += sizeof(bdaddr_t); 28776db62cfa3a8de69270cc5e5689b633f43c02e041Marcel Holtmann reqsize += sizeof(bdaddr_t); 2878fb1557c4111ca9993e4927af6f65bdbf9c2fa8ecMarcel Holtmann } else 2879fb1557c4111ca9993e4927af6f65bdbf9c2fa8ecMarcel Holtmann *p++ = flags; 288082817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 288182817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann memcpy(p, data, size); 288282817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann reqsize += size; 2883542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr->plen = htons(reqsize - sizeof(sdp_pdu_hdr_t)); 2884542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2885542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = sdp_send_req_w4_rsp(session, req, rsp, reqsize, &rspsize); 2886542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (status < 0) 2887542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto end; 288882817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 2889ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann if (rspsize < sizeof(sdp_pdu_hdr_t)) { 2890ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann SDPERR("Unexpected end of packet"); 2891ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann errno = EPROTO; 2892ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann status = -1; 2893ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann goto end; 2894ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann } 2895ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann 2896aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann rsphdr = (sdp_pdu_hdr_t *) rsp; 2897542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p = rsp + sizeof(sdp_pdu_hdr_t); 289882817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 2899a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi if (rsphdr->pdu_id == SDP_ERROR_RSP) { 2900a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi /* Invalid service record */ 2901a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi errno = EINVAL; 2902a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi status = -1; 2903a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi } else if (rsphdr->pdu_id != SDP_SVC_REGISTER_RSP) { 2904a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi errno = EPROTO; 2905a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi status = -1; 2906a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi } else { 2907ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann if (rspsize < sizeof(sdp_pdu_hdr_t) + sizeof(uint32_t)) { 2908ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann SDPERR("Unexpected end of packet"); 2909ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann errno = EPROTO; 2910ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann status = -1; 2911ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann goto end; 2912ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann } 291382817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann if (handle) 291482817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann *handle = ntohl(bt_get_unaligned((uint32_t *) p)); 2915542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 291682817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 2917542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannend: 2918542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (req) 2919542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(req); 292082817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 2921542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (rsp) 2922542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(rsp); 292382817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 2924542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return status; 2925542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 2926542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 292782817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmannint sdp_device_record_register(sdp_session_t *session, bdaddr_t *device, sdp_record_t *rec, uint8_t flags) 292882817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann{ 292982817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann sdp_buf_t pdu; 293082817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann uint32_t handle; 293182817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann int err; 293282817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 293382817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann SDPDBG(""); 293482817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 293582817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann if (rec->handle && rec->handle != 0xffffffff) { 293682817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann uint32_t handle = rec->handle; 293782817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann sdp_data_t *data = sdp_data_alloc(SDP_UINT32, &handle); 293882817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann sdp_attr_replace(rec, SDP_ATTR_RECORD_HANDLE, data); 293982817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann } 294082817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 294182817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann if (sdp_gen_record_pdu(rec, &pdu) < 0) { 294282817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann errno = ENOMEM; 294382817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann return -1; 294482817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann } 294582817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 294682817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann err = sdp_device_record_register_binary(session, device, 294782817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann pdu.data, pdu.data_size, flags, &handle); 294882817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 294982817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann free(pdu.data); 295082817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 295182817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann if (err == 0) { 295282817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann sdp_data_t *data = sdp_data_alloc(SDP_UINT32, &handle); 295382817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann rec->handle = handle; 295482817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann sdp_attr_replace(rec, SDP_ATTR_RECORD_HANDLE, data); 295582817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann } 295682817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 295782817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann return err; 295882817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann} 295982817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 2960a1454c0f12421da1849ca347f8a30d084778d679Marcel Holtmannint sdp_record_register(sdp_session_t *session, sdp_record_t *rec, uint8_t flags) 2961a1454c0f12421da1849ca347f8a30d084778d679Marcel Holtmann{ 2962a1454c0f12421da1849ca347f8a30d084778d679Marcel Holtmann return sdp_device_record_register(session, BDADDR_ANY, rec, flags); 2963a1454c0f12421da1849ca347f8a30d084778d679Marcel Holtmann} 2964a1454c0f12421da1849ca347f8a30d084778d679Marcel Holtmann 2965542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 2966542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * unregister a service record 2967542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 296882817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmannint sdp_device_record_unregister_binary(sdp_session_t *session, bdaddr_t *device, uint32_t handle) 2969542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 2970cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint8_t *reqbuf, *rspbuf, *p; 2971cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint32_t reqsize = 0, rspsize = 0; 2972542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_pdu_hdr_t *reqhdr, *rsphdr; 297382817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann int status; 2974542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2975542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG(""); 2976542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2977542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (handle == SDP_SERVER_RECORD_HANDLE) { 2978542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = EINVAL; 2979542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 2980542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 298182817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 2982542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!session->local) { 2983542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = EREMOTE; 2984542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 2985542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 298682817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 2987cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann reqbuf = malloc(SDP_REQ_BUFFER_SIZE); 2988cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann rspbuf = malloc(SDP_RSP_BUFFER_SIZE); 2989542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!reqbuf || !rspbuf) { 2990542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = ENOMEM; 2991542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = -1; 2992542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto end; 2993542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 2994aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann reqhdr = (sdp_pdu_hdr_t *) reqbuf; 2995542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr->pdu_id = SDP_SVC_REMOVE_REQ; 2996542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr->tid = htons(sdp_gen_tid(session)); 2997542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 2998542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p = reqbuf + sizeof(sdp_pdu_hdr_t); 2999542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqsize = sizeof(sdp_pdu_hdr_t); 3000aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann bt_put_unaligned(htonl(handle), (uint32_t *) p); 3001542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqsize += sizeof(uint32_t); 3002542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3003542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr->plen = htons(reqsize - sizeof(sdp_pdu_hdr_t)); 3004542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = sdp_send_req_w4_rsp(session, reqbuf, rspbuf, reqsize, &rspsize); 3005a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi if (status < 0) 3006a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi goto end; 3007a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi 3008ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann if (rspsize < sizeof(sdp_pdu_hdr_t) + sizeof(uint16_t)) { 3009ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann SDPERR("Unexpected end of packet"); 3010ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann errno = EPROTO; 3011ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann status = -1; 3012ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann goto end; 3013ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann } 3014ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann 3015a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi rsphdr = (sdp_pdu_hdr_t *) rspbuf; 3016a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi p = rspbuf + sizeof(sdp_pdu_hdr_t); 3017a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi status = bt_get_unaligned((uint16_t *) p); 301882817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 3019a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi if (rsphdr->pdu_id == SDP_ERROR_RSP) { 3020a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi /* For this case the status always is invalid record handle */ 3021a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi errno = EINVAL; 3022a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi status = -1; 3023a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi } else if (rsphdr->pdu_id != SDP_SVC_REMOVE_RSP) { 3024a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi errno = EPROTO; 3025a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi status = -1; 3026a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi } 3027542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannend: 3028542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (reqbuf) 3029542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(reqbuf); 303082817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 3031542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (rspbuf) 3032542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(rspbuf); 303382817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 3034542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return status; 3035542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 3036542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 303782817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmannint sdp_device_record_unregister(sdp_session_t *session, bdaddr_t *device, sdp_record_t *rec) 303882817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann{ 303982817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann int err; 304082817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 304182817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann err = sdp_device_record_unregister_binary(session, device, rec->handle); 304282817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann if (err == 0) 304382817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann sdp_record_free(rec); 304482817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 304582817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann return err; 304682817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann} 304782817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 3048a1454c0f12421da1849ca347f8a30d084778d679Marcel Holtmannint sdp_record_unregister(sdp_session_t *session, sdp_record_t *rec) 3049a1454c0f12421da1849ca347f8a30d084778d679Marcel Holtmann{ 3050a1454c0f12421da1849ca347f8a30d084778d679Marcel Holtmann return sdp_device_record_unregister(session, BDADDR_ANY, rec); 3051a1454c0f12421da1849ca347f8a30d084778d679Marcel Holtmann} 3052a1454c0f12421da1849ca347f8a30d084778d679Marcel Holtmann 3053542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 3054542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * modify an existing service record 3055542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 305682817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmannint sdp_device_record_update_binary(sdp_session_t *session, bdaddr_t *device, uint32_t handle, uint8_t *data, uint32_t size) 305782817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann{ 305882817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann return -1; 305982817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann} 306082817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 3061a1454c0f12421da1849ca347f8a30d084778d679Marcel Holtmannint sdp_device_record_update(sdp_session_t *session, bdaddr_t *device, const sdp_record_t *rec) 3062542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 3063cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint8_t *reqbuf, *rspbuf, *p; 3064cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint32_t reqsize, rspsize; 3065542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_pdu_hdr_t *reqhdr, *rsphdr; 3066542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint32_t handle; 3067542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_buf_t pdu; 306882817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann int status; 3069542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3070542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG(""); 307182817924a25fb0eaaeb9824372106870c45c9db9Marcel Holtmann 3072542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann handle = rec->handle; 3073542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3074542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (handle == SDP_SERVER_RECORD_HANDLE) { 3075542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = EINVAL; 3076542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 3077542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3078542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!session->local) { 3079542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = EREMOTE; 3080542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 3081542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3082cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann reqbuf = malloc(SDP_REQ_BUFFER_SIZE); 3083cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann rspbuf = malloc(SDP_RSP_BUFFER_SIZE); 3084542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!reqbuf || !rspbuf) { 3085542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = ENOMEM; 3086542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = -1; 3087542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto end; 3088542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3089aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann reqhdr = (sdp_pdu_hdr_t *) reqbuf; 3090542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr->pdu_id = SDP_SVC_UPDATE_REQ; 3091542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr->tid = htons(sdp_gen_tid(session)); 3092542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3093cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann p = reqbuf + sizeof(sdp_pdu_hdr_t); 3094542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqsize = sizeof(sdp_pdu_hdr_t); 3095542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3096aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann bt_put_unaligned(htonl(handle), (uint32_t *) p); 3097542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqsize += sizeof(uint32_t); 3098542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann p += sizeof(uint32_t); 3099542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3100c5621bfbf9071ed359d904bdd91308f6599dc5e5Claudio Takahasi if (sdp_gen_record_pdu(rec, &pdu) < 0) { 3101542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = ENOMEM; 3102542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = -1; 3103542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto end; 3104542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3105542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(p, pdu.data, pdu.data_size); 3106542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqsize += pdu.data_size; 3107c5621bfbf9071ed359d904bdd91308f6599dc5e5Claudio Takahasi free(pdu.data); 3108542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3109542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr->plen = htons(reqsize - sizeof(sdp_pdu_hdr_t)); 3110542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = sdp_send_req_w4_rsp(session, reqbuf, rspbuf, reqsize, &rspsize); 3111a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi if (status < 0) 3112a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi goto end; 3113542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3114ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann if (rspsize < sizeof(sdp_pdu_hdr_t) + sizeof(uint16_t)) { 3115ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann SDPERR("Unexpected end of packet"); 3116ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann errno = EPROTO; 3117ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann status = -1; 3118ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann goto end; 3119ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann } 3120ca0d3dc0bb5a573b44496847919cc02c9da2016fMarcel Holtmann 3121542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Send req status : %d\n", status); 3122542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3123a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi rsphdr = (sdp_pdu_hdr_t *) rspbuf; 3124a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi p = rspbuf + sizeof(sdp_pdu_hdr_t); 3125a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi status = bt_get_unaligned((uint16_t *) p); 3126a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi 3127a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi if (rsphdr->pdu_id == SDP_ERROR_RSP) { 3128a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi /* The status can be invalid sintax or invalid record handle */ 3129a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi errno = EINVAL; 3130a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi status = -1; 3131a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi } else if (rsphdr->pdu_id != SDP_SVC_UPDATE_RSP) { 3132a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi errno = EPROTO; 3133a7c82c586998da5b64e680a9027a6f5aeba915f5Claudio Takahasi status = -1; 3134542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3135542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannend: 3136542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (reqbuf) 3137542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(reqbuf); 3138542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (rspbuf) 3139542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(rspbuf); 3140542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return status; 3141542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 3142542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3143a1454c0f12421da1849ca347f8a30d084778d679Marcel Holtmannint sdp_record_update(sdp_session_t *session, const sdp_record_t *rec) 3144a1454c0f12421da1849ca347f8a30d084778d679Marcel Holtmann{ 3145a1454c0f12421da1849ca347f8a30d084778d679Marcel Holtmann return sdp_device_record_update(session, BDADDR_ANY, rec); 3146a1454c0f12421da1849ca347f8a30d084778d679Marcel Holtmann} 3147a1454c0f12421da1849ca347f8a30d084778d679Marcel Holtmann 3148542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannsdp_record_t *sdp_record_alloc() 3149542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 315021f2a5244f0c6195e17ff71868328bc71d77f4d9Marcel Holtmann sdp_record_t *rec = malloc(sizeof(sdp_record_t)); 3151114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio 3152114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio if (!rec) 3153114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio return NULL; 3154114cb3f810dcc9361a31443a6c7361771a1d8481Santiago Carot-Nemesio 3155d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann memset(rec, 0, sizeof(sdp_record_t)); 3156542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann rec->handle = 0xffffffff; 3157542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return rec; 3158542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 3159542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3160542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 3161542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Free the contents of a service record 3162542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 3163542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannvoid sdp_record_free(sdp_record_t *rec) 3164542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 3165d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann sdp_list_free(rec->attrlist, (sdp_free_func_t) sdp_data_free); 3166542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_list_free(rec->pattern, free); 3167542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(rec); 3168542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 3169542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3170542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannvoid sdp_pattern_add_uuid(sdp_record_t *rec, uuid_t *uuid) 3171542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 3172542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uuid_t *uuid128 = sdp_uuid_to_uuid128(uuid); 3173542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3174542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Elements in target pattern : %d\n", sdp_list_len(rec->pattern)); 3175d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann SDPDBG("Trying to add : 0x%lx\n", (unsigned long) uuid128); 3176542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3177542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (sdp_list_find(rec->pattern, uuid128, sdp_uuid128_cmp) == NULL) 3178542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann rec->pattern = sdp_list_insert_sorted(rec->pattern, uuid128, sdp_uuid128_cmp); 3179542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann else 318021f2a5244f0c6195e17ff71868328bc71d77f4d9Marcel Holtmann bt_free(uuid128); 3181542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3182542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Elements in target pattern : %d\n", sdp_list_len(rec->pattern)); 3183542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 3184542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3185542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannvoid sdp_pattern_add_uuidseq(sdp_record_t *rec, sdp_list_t *seq) 3186542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 3187542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (; seq; seq = seq->next) { 3188542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uuid_t *uuid = (uuid_t *)seq->data; 3189542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_pattern_add_uuid(rec, uuid); 3190542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3191542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 3192542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3193542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 3194542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Extract a sequence of service record handles from a PDU buffer 3195542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * and add the entries to a sdp_list_t. Note that the service record 3196542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * handles are not in "data element sequence" form, but just like 3197542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * an array of service handles 3198542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 3199cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmannstatic void extract_record_handle_seq(uint8_t *pdu, int bufsize, sdp_list_t **seq, int count, unsigned int *scanned) 3200542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 3201542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_list_t *pSeq = *seq; 3202cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint8_t *pdata = pdu; 3203542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int n; 3204542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3205542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (n = 0; n < count; n++) { 320628cfb82c67c413cddff779a875cc7a40931b46a5Marcel Holtmann uint32_t *pSvcRec; 3207cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if (bufsize < (int) sizeof(uint32_t)) { 3208121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann SDPERR("Unexpected end of packet"); 3209121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann break; 3210121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann } 321128cfb82c67c413cddff779a875cc7a40931b46a5Marcel Holtmann pSvcRec = malloc(sizeof(uint32_t)); 321228cfb82c67c413cddff779a875cc7a40931b46a5Marcel Holtmann if (!pSvcRec) 321328cfb82c67c413cddff779a875cc7a40931b46a5Marcel Holtmann break; 3214aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann *pSvcRec = ntohl(bt_get_unaligned((uint32_t *) pdata)); 3215542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pSeq = sdp_list_append(pSeq, pSvcRec); 3216542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata += sizeof(uint32_t); 3217542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *scanned += sizeof(uint32_t); 3218121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann bufsize -= sizeof(uint32_t); 3219542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3220542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *seq = pSeq; 3221542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 3222542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 3223542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Generate the attribute sequence pdu form 3224542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * from sdp_list_t elements. Return length of attr seq 3225542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 3226cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmannstatic int gen_dataseq_pdu(uint8_t *dst, const sdp_list_t *seq, uint8_t dtd) 3227542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 3228542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_t *dataseq; 3229542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann void **types, **values; 3230542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_buf_t buf; 3231542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int i, seqlen = sdp_list_len(seq); 3232542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3233542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann // Fill up the value and the dtd arrays 3234542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG(""); 3235a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmann 3236542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Seq length : %d\n", seqlen); 3237542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3238542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann types = malloc(seqlen * sizeof(void *)); 3239135e87fb2fc2f8f9966e296e9fb8b921638c7453Luiz Augusto von Dentz if (!types) 3240135e87fb2fc2f8f9966e296e9fb8b921638c7453Luiz Augusto von Dentz return -ENOMEM; 3241135e87fb2fc2f8f9966e296e9fb8b921638c7453Luiz Augusto von Dentz 3242542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann values = malloc(seqlen * sizeof(void *)); 3243f0081032066a6b246df58659aae38048a5952effLuiz Augusto von Dentz if (!values) { 3244f0081032066a6b246df58659aae38048a5952effLuiz Augusto von Dentz free(types); 3245135e87fb2fc2f8f9966e296e9fb8b921638c7453Luiz Augusto von Dentz return -ENOMEM; 3246f0081032066a6b246df58659aae38048a5952effLuiz Augusto von Dentz } 3247135e87fb2fc2f8f9966e296e9fb8b921638c7453Luiz Augusto von Dentz 3248542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann for (i = 0; i < seqlen; i++) { 3249542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann void *data = seq->data; 3250542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann types[i] = &dtd; 3251542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (SDP_IS_UUID(dtd)) 3252542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann data = &((uuid_t *)data)->value; 3253542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann values[i] = data; 3254542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann seq = seq->next; 3255542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3256542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3257542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann dataseq = sdp_seq_alloc(types, values, seqlen); 3258135e87fb2fc2f8f9966e296e9fb8b921638c7453Luiz Augusto von Dentz if (!dataseq) { 3259135e87fb2fc2f8f9966e296e9fb8b921638c7453Luiz Augusto von Dentz free(types); 3260135e87fb2fc2f8f9966e296e9fb8b921638c7453Luiz Augusto von Dentz free(values); 3261135e87fb2fc2f8f9966e296e9fb8b921638c7453Luiz Augusto von Dentz return -ENOMEM; 3262135e87fb2fc2f8f9966e296e9fb8b921638c7453Luiz Augusto von Dentz } 3263135e87fb2fc2f8f9966e296e9fb8b921638c7453Luiz Augusto von Dentz 32642db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz memset(&buf, 0, sizeof(sdp_buf_t)); 32652db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz sdp_gen_buffer(&buf, dataseq); 32662db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz buf.data = malloc(buf.buf_size); 32672db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 3268135e87fb2fc2f8f9966e296e9fb8b921638c7453Luiz Augusto von Dentz if (!buf.data) { 3269135e87fb2fc2f8f9966e296e9fb8b921638c7453Luiz Augusto von Dentz sdp_data_free(dataseq); 3270135e87fb2fc2f8f9966e296e9fb8b921638c7453Luiz Augusto von Dentz free(types); 3271135e87fb2fc2f8f9966e296e9fb8b921638c7453Luiz Augusto von Dentz free(values); 32722db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz return -ENOMEM; 3273135e87fb2fc2f8f9966e296e9fb8b921638c7453Luiz Augusto von Dentz } 32742db52b2d09096c81be0ea0b1f72e3939382e5febLuiz Augusto von Dentz 3275542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Data Seq : 0x%p\n", seq); 3276542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann seqlen = sdp_gen_pdu(&buf, dataseq); 3277542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Copying : %d\n", buf.data_size); 3278542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(dst, buf.data, buf.data_size); 3279542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3280542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_data_free(dataseq); 3281542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3282542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(types); 3283542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(values); 3284542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(buf.data); 3285542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return seqlen; 3286542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 3287542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3288cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmannstatic int gen_searchseq_pdu(uint8_t *dst, const sdp_list_t *seq) 3289542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 3290d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann uuid_t *uuid = seq->data; 3291542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return gen_dataseq_pdu(dst, seq, uuid->type); 3292542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 3293542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3294cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmannstatic int gen_attridseq_pdu(uint8_t *dst, const sdp_list_t *seq, uint8_t dataType) 3295542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 3296542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return gen_dataseq_pdu(dst, seq, dataType); 3297542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 3298542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3299113a53acaec2519108f0cab944687b7abc537e74Marcel Holtmanntypedef struct { 3300113a53acaec2519108f0cab944687b7abc537e74Marcel Holtmann uint8_t length; 3301113a53acaec2519108f0cab944687b7abc537e74Marcel Holtmann unsigned char data[16]; 3302113a53acaec2519108f0cab944687b7abc537e74Marcel Holtmann} __attribute__ ((packed)) sdp_cstate_t; 3303113a53acaec2519108f0cab944687b7abc537e74Marcel Holtmann 33040a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmannstatic int copy_cstate(uint8_t *pdata, int pdata_len, const sdp_cstate_t *cstate) 3305542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 3306542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (cstate) { 33070a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann uint8_t len = cstate->length; 33080a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann if (len >= pdata_len) { 33090a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann SDPERR("Continuation state size exceeds internal buffer"); 33100a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann len = pdata_len - 1; 33110a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann } 33120a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann *pdata++ = len; 33130a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann memcpy(pdata, cstate->data, len); 33140a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann return len + 1; 3315542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3316542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *pdata = 0; 3317542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 1; 3318542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 3319542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3320542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 3321400772d67b5861e8dbc8aaeb0aa697e5facb97d7Santiago Carot-Nemesio * This is a service search request. 3322542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 3323542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * INPUT : 3324542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 332541064d605ba2f88f967c8388c9b20b92a7868a87Ulisses Furquim * sdp_list_t *search 3326542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Singly linked list containing elements of the search 3327542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * pattern. Each entry in the list is a UUID (DataTypeSDP_UUID16) 3328542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * of the service to be searched 3329542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 3330542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * uint16_t max_rec_num 3331542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * A 16 bit integer which tells the service, the maximum 3332542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * entries that the client can handle in the response. The 3333542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * server is obliged not to return > max_rec_num entries 3334542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 3335542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * OUTPUT : 3336542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 3337542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * int return value 3338542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 0: 3339542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * The request completed successfully. This does not 3340542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * mean the requested services were found 3341542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * -1: 3342542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * On any failure and sets errno 3343542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 3344542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * sdp_list_t **rsp_list 3345542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * This variable is set on a successful return if there are 3346542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * non-zero service handles. It is a singly linked list of 334728b4f0aea5b15ed7c0acd17ab79705a38ffe7c2fStephen Crane * service record handles (uint16_t) 3348542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 3349542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_service_search_req(sdp_session_t *session, const sdp_list_t *search, 3350542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint16_t max_rec_num, sdp_list_t **rsp) 3351542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 3352542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int status = 0; 3353cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint32_t reqsize = 0, _reqsize; 3354cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint32_t rspsize = 0, rsplen; 3355542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int seqlen = 0; 3356cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann int total_rec_count, rec_count; 3357cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann unsigned scanned, pdata_len; 3358cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint8_t *pdata, *_pdata; 3359cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint8_t *reqbuf, *rspbuf; 3360542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_pdu_hdr_t *reqhdr, *rsphdr; 3361542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_cstate_t *cstate = NULL; 3362542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3363542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqbuf = malloc(SDP_REQ_BUFFER_SIZE); 3364542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann rspbuf = malloc(SDP_RSP_BUFFER_SIZE); 3365542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!reqbuf || !rspbuf) { 3366542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = ENOMEM; 3367542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = -1; 3368542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto end; 3369542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3370aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann reqhdr = (sdp_pdu_hdr_t *) reqbuf; 3371542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr->pdu_id = SDP_SVC_SEARCH_REQ; 3372542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata = reqbuf + sizeof(sdp_pdu_hdr_t); 3373542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqsize = sizeof(sdp_pdu_hdr_t); 3374542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3375542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann // add service class IDs for search 3376542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann seqlen = gen_searchseq_pdu(pdata, search); 3377542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3378542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Data seq added : %d\n", seqlen); 3379542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3380542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann // set the length and increment the pointer 3381542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqsize += seqlen; 3382542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata += seqlen; 3383542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3384542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann // specify the maximum svc rec count that client expects 3385aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann bt_put_unaligned(htons(max_rec_num), (uint16_t *) pdata); 3386542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqsize += sizeof(uint16_t); 3387542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata += sizeof(uint16_t); 3388542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3389542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann _reqsize = reqsize; 3390542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann _pdata = pdata; 3391542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *rsp = NULL; 3392542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3393542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann do { 3394542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann // Add continuation state or NULL (first time) 33950a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann reqsize = _reqsize + copy_cstate(_pdata, 33960a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann SDP_REQ_BUFFER_SIZE - _reqsize, cstate); 3397542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3398542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann // Set the request header's param length 3399542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr->plen = htons(reqsize - sizeof(sdp_pdu_hdr_t)); 3400542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3401542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr->tid = htons(sdp_gen_tid(session)); 3402542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann /* 3403542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Send the request, wait for response and if 3404542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * no error, set the appropriate values and return 3405542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 3406542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = sdp_send_req_w4_rsp(session, reqbuf, rspbuf, reqsize, &rspsize); 3407542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (status < 0) 3408542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto end; 3409542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3410121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann if (rspsize < sizeof(sdp_pdu_hdr_t)) { 3411121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann SDPERR("Unexpected end of packet"); 3412121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann status = -1; 3413121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann goto end; 3414121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann } 3415121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann 3416aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann rsphdr = (sdp_pdu_hdr_t *) rspbuf; 3417542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann rsplen = ntohs(rsphdr->plen); 3418542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3419542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (rsphdr->pdu_id == SDP_ERROR_RSP) { 3420542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Status : 0x%x\n", rsphdr->pdu_id); 3421542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = -1; 3422542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto end; 3423542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3424542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann scanned = 0; 3425542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata = rspbuf + sizeof(sdp_pdu_hdr_t); 3426121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann pdata_len = rspsize - sizeof(sdp_pdu_hdr_t); 3427121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann 3428121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann if (pdata_len < sizeof(uint16_t) + sizeof(uint16_t)) { 3429121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann SDPERR("Unexpected end of packet"); 3430121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann status = -1; 3431121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann goto end; 3432121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann } 3433542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3434542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann // net service record match count 3435aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann total_rec_count = ntohs(bt_get_unaligned((uint16_t *) pdata)); 3436542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata += sizeof(uint16_t); 3437542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann scanned += sizeof(uint16_t); 3438121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann pdata_len -= sizeof(uint16_t); 3439aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann rec_count = ntohs(bt_get_unaligned((uint16_t *) pdata)); 3440542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata += sizeof(uint16_t); 3441542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann scanned += sizeof(uint16_t); 3442121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann pdata_len -= sizeof(uint16_t); 3443542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3444542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Total svc count: %d\n", total_rec_count); 3445542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Current svc count: %d\n", rec_count); 3446542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("ResponseLength: %d\n", rsplen); 3447542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3448542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!rec_count) { 3449542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = -1; 3450542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto end; 3451542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3452121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann extract_record_handle_seq(pdata, pdata_len, rsp, rec_count, &scanned); 3453542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("BytesScanned : %d\n", scanned); 3454542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3455542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (rsplen > scanned) { 3456542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint8_t cstate_len; 3457542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3458121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann if (rspsize < sizeof(sdp_pdu_hdr_t) + scanned + sizeof(uint8_t)) { 3459121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann SDPERR("Unexpected end of packet: continuation state data missing"); 3460121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann status = -1; 3461121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann goto end; 3462121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann } 3463121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann 3464542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata = rspbuf + sizeof(sdp_pdu_hdr_t) + scanned; 3465aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann cstate_len = *(uint8_t *) pdata; 3466542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (cstate_len > 0) { 3467542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann cstate = (sdp_cstate_t *)pdata; 3468542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Cont state length: %d\n", cstate_len); 3469542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } else 3470542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann cstate = NULL; 3471542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3472542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } while (cstate); 3473542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3474a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmannend: 3475542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (reqbuf) 3476542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(reqbuf); 3477542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (rspbuf) 3478542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(rspbuf); 3479542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3480542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return status; 3481542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 3482542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3483542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 3484400772d67b5861e8dbc8aaeb0aa697e5facb97d7Santiago Carot-Nemesio * This is a service attribute request. 3485542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 3486542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * INPUT : 3487542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 3488542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * uint32_t handle 3489542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * The handle of the service for which the attribute(s) are 3490542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * requested 3491542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 3492542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * sdp_attrreq_type_t reqtype 3493542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Attribute identifiers are 16 bit unsigned integers specified 3494542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * in one of 2 ways described below : 3495542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * SDP_ATTR_REQ_INDIVIDUAL - 16bit individual identifiers 3496542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * They are the actual attribute identifiers in ascending order 3497542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 3498542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * SDP_ATTR_REQ_RANGE - 32bit identifier range 3499542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * The high-order 16bits is the start of range 3500542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * the low-order 16bits are the end of range 3501542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 0x0000 to 0xFFFF gets all attributes 3502542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 3503542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * sdp_list_t *attrid 3504542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Singly linked list containing attribute identifiers desired. 3505400772d67b5861e8dbc8aaeb0aa697e5facb97d7Santiago Carot-Nemesio * Every element is either a uint16_t(attrSpec = SDP_ATTR_REQ_INDIVIDUAL) 3506542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * or a uint32_t(attrSpec=SDP_ATTR_REQ_RANGE) 3507542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 3508542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * OUTPUT : 3509542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * return sdp_record_t * 3510542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 0: 3511542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * On any error and sets errno 3512542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * !0: 3513542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * The service record 3514542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 3515400772d67b5861e8dbc8aaeb0aa697e5facb97d7Santiago Carot-Nemesiosdp_record_t *sdp_service_attr_req(sdp_session_t *session, uint32_t handle, 3516542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_attrreq_type_t reqtype, const sdp_list_t *attrids) 3517542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 3518cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint32_t reqsize = 0, _reqsize; 3519cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint32_t rspsize = 0, rsp_count; 3520542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int attr_list_len = 0; 3521cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann int seqlen = 0; 3522cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann unsigned int pdata_len; 3523cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint8_t *pdata, *_pdata; 3524cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint8_t *reqbuf, *rspbuf; 3525542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_pdu_hdr_t *reqhdr, *rsphdr; 3526542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_cstate_t *cstate = NULL; 3527542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint8_t cstate_len = 0; 3528542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_buf_t rsp_concat_buf; 3529542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_record_t *rec = 0; 3530542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3531542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (reqtype != SDP_ATTR_REQ_INDIVIDUAL && reqtype != SDP_ATTR_REQ_RANGE) { 3532542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = EINVAL; 3533f58df2db7a606fcd13a36824bdb4fc3440d9a71eSantiago Carot-Nemesio return NULL; 3534542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3535542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 35368232558057813074ce6bdb3317a9fb4888f7b8e3Johan Hedberg memset(&rsp_concat_buf, 0, sizeof(sdp_buf_t)); 35378232558057813074ce6bdb3317a9fb4888f7b8e3Johan Hedberg 3538cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann reqbuf = malloc(SDP_REQ_BUFFER_SIZE); 3539cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann rspbuf = malloc(SDP_RSP_BUFFER_SIZE); 3540542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!reqbuf || !rspbuf) { 3541542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = ENOMEM; 3542542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto end; 3543542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3544aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann reqhdr = (sdp_pdu_hdr_t *) reqbuf; 3545542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr->pdu_id = SDP_SVC_ATTR_REQ; 3546542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3547542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata = reqbuf + sizeof(sdp_pdu_hdr_t); 3548542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqsize = sizeof(sdp_pdu_hdr_t); 3549542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3550542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann // add the service record handle 3551aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann bt_put_unaligned(htonl(handle), (uint32_t *) pdata); 3552542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqsize += sizeof(uint32_t); 3553542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata += sizeof(uint32_t); 3554542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3555542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann // specify the response limit 3556aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann bt_put_unaligned(htons(65535), (uint16_t *) pdata); 3557542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqsize += sizeof(uint16_t); 3558542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata += sizeof(uint16_t); 3559542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3560542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann // get attr seq PDU form 3561400772d67b5861e8dbc8aaeb0aa697e5facb97d7Santiago Carot-Nemesio seqlen = gen_attridseq_pdu(pdata, attrids, 3562542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqtype == SDP_ATTR_REQ_INDIVIDUAL? SDP_UINT16 : SDP_UINT32); 3563542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (seqlen == -1) { 3564542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = EINVAL; 3565542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto end; 3566542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3567542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata += seqlen; 3568542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqsize += seqlen; 3569542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Attr list length : %d\n", seqlen); 3570542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3571542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann // save before Continuation State 3572542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann _pdata = pdata; 3573542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann _reqsize = reqsize; 3574542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3575542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann do { 35765e1f7cb4d8abc2c352d7ee055795cca837523b53Luiz Augusto von Dentz int status; 35775e1f7cb4d8abc2c352d7ee055795cca837523b53Luiz Augusto von Dentz 3578542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann // add NULL continuation state 35790a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann reqsize = _reqsize + copy_cstate(_pdata, 35800a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann SDP_REQ_BUFFER_SIZE - _reqsize, cstate); 3581542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3582542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann // set the request header's param length 3583542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr->tid = htons(sdp_gen_tid(session)); 3584542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr->plen = htons(reqsize - sizeof(sdp_pdu_hdr_t)); 3585542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3586542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = sdp_send_req_w4_rsp(session, reqbuf, rspbuf, reqsize, &rspsize); 3587542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (status < 0) 3588542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto end; 3589121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann 3590121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann if (rspsize < sizeof(sdp_pdu_hdr_t)) { 3591121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann SDPERR("Unexpected end of packet"); 3592121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann goto end; 3593121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann } 3594121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann 3595aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann rsphdr = (sdp_pdu_hdr_t *) rspbuf; 3596542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (rsphdr->pdu_id == SDP_ERROR_RSP) { 3597542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("PDU ID : 0x%x\n", rsphdr->pdu_id); 3598542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto end; 3599542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3600542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata = rspbuf + sizeof(sdp_pdu_hdr_t); 3601121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann pdata_len = rspsize - sizeof(sdp_pdu_hdr_t); 3602121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann 3603121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann if (pdata_len < sizeof(uint16_t)) { 3604121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann SDPERR("Unexpected end of packet"); 3605121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann goto end; 3606121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann } 3607121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann 3608aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann rsp_count = ntohs(bt_get_unaligned((uint16_t *) pdata)); 3609542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann attr_list_len += rsp_count; 3610542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata += sizeof(uint16_t); 3611121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann pdata_len -= sizeof(uint16_t); 3612542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3613542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann // if continuation state set need to re-issue request before parsing 3614121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann if (pdata_len < rsp_count + sizeof(uint8_t)) { 3615121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann SDPERR("Unexpected end of packet: continuation state data missing"); 3616121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann goto end; 3617121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann } 3618aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann cstate_len = *(uint8_t *) (pdata + rsp_count); 3619542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3620542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Response id : %d\n", rsphdr->pdu_id); 3621542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Attrlist byte count : %d\n", rsp_count); 3622542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("sdp_cstate_t length : %d\n", cstate_len); 3623542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3624542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann /* 3625400772d67b5861e8dbc8aaeb0aa697e5facb97d7Santiago Carot-Nemesio * a split response: concatenate intermediate responses 3626542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * and the last one (which has cstate_len == 0) 3627542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 3628542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (cstate_len > 0 || rsp_concat_buf.data_size != 0) { 3629cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint8_t *targetPtr = NULL; 3630542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3631aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann cstate = cstate_len > 0 ? (sdp_cstate_t *) (pdata + rsp_count) : 0; 3632542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3633542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann // build concatenated response buffer 3634cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann rsp_concat_buf.data = realloc(rsp_concat_buf.data, rsp_concat_buf.data_size + rsp_count); 3635542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann rsp_concat_buf.buf_size = rsp_concat_buf.data_size + rsp_count; 3636542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann targetPtr = rsp_concat_buf.data + rsp_concat_buf.data_size; 3637542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(targetPtr, pdata, rsp_count); 3638542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann rsp_concat_buf.data_size += rsp_count; 3639542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3640542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } while (cstate); 3641542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3642542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (attr_list_len > 0) { 3643542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int scanned = 0; 3644121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann if (rsp_concat_buf.data_size != 0) { 3645542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata = rsp_concat_buf.data; 3646121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann pdata_len = rsp_concat_buf.data_size; 3647121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann } 3648d39e08cc5483dc924f3b764b87042fb6aebb722dMarcel Holtmann rec = sdp_extract_pdu(pdata, pdata_len, &scanned); 3649542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 3650400772d67b5861e8dbc8aaeb0aa697e5facb97d7Santiago Carot-Nemesio 3651a3648e0df0ff53fef74e5437ff089aef96209db2Marcel Holtmannend: 3652542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (reqbuf) 3653542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(reqbuf); 3654542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (rsp_concat_buf.data) 3655542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(rsp_concat_buf.data); 3656542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (rspbuf) 3657542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(rspbuf); 3658542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return rec; 3659542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 3660542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 3661542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 36628be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi * SDP transaction structure for asynchronous search 36638be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi */ 36648be090b298a02108146d3bf48271f8408ac31917Claudio Takahasistruct sdp_transaction { 3665c01b6039f44d9e78acc26cd8482b5e0c7b23fe14Marcel Holtmann sdp_callback_t *cb; /* called when the transaction finishes */ 3666c01b6039f44d9e78acc26cd8482b5e0c7b23fe14Marcel Holtmann void *udata; /* client user data */ 3667c01b6039f44d9e78acc26cd8482b5e0c7b23fe14Marcel Holtmann uint8_t *reqbuf; /* pointer to request PDU */ 36688be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi sdp_buf_t rsp_concat_buf; 3669c01b6039f44d9e78acc26cd8482b5e0c7b23fe14Marcel Holtmann uint32_t reqsize; /* without cstate */ 36705ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi int err; /* ZERO if success or the errno if failed */ 36718be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi}; 36728be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi 36738be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi/* 36748be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi * Creates a new sdp session for asynchronous search 36758be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi * INPUT: 36768be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi * int sk 36771be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim * non-blocking L2CAP socket 36781be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim * 36798be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi * RETURN: 36808be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi * sdp_session_t * 36818be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi * NULL - On memory allocation failure 36828be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi */ 36838be090b298a02108146d3bf48271f8408ac31917Claudio Takahasisdp_session_t *sdp_create(int sk, uint32_t flags) 36848be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi{ 3685a76dc65489dd8959547a97a391e405b2025bbd79Marcel Holtmann sdp_session_t *session; 36868be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi struct sdp_transaction *t; 3687a76dc65489dd8959547a97a391e405b2025bbd79Marcel Holtmann 3688a76dc65489dd8959547a97a391e405b2025bbd79Marcel Holtmann session = malloc(sizeof(sdp_session_t)); 36898be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi if (!session) { 36908be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi errno = ENOMEM; 36918be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi return NULL; 36928be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi } 36938be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi memset(session, 0, sizeof(*session)); 36948be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi 36958be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi session->flags = flags; 36968be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi session->sock = sk; 36978be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi 36988be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi t = malloc(sizeof(struct sdp_transaction)); 36998be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi if (!t) { 37008be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi errno = ENOMEM; 37018be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi free(session); 37028be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi return NULL; 37038be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi } 37048be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi memset(t, 0, sizeof(*t)); 37058be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi 37068be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi session->priv = t; 37078be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi 37088be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi return session; 37098be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi} 37108be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi 37118be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi/* 3712adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * Sets the callback function/user data used to notify the application 3713adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * that the asynchronous transaction finished. This function must be 3714adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * called before request an asynchronous search. 3715dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann * 3716dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann * INPUT: 3717dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann * sdp_session_t *session 3718dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann * Current sdp session to be handled 3719dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann * sdp_callback_t *cb 3720dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann * callback to be called when the transaction finishes 3721dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann * void *udata 3722dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann * user data passed to callback 3723dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann * RETURN: 3724adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * 0 - Success 3725dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann * -1 - Failure 3726dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann */ 3727dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmannint sdp_set_notify(sdp_session_t *session, sdp_callback_t *func, void *udata) 3728dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann{ 3729dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann struct sdp_transaction *t; 3730dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann 3731dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann if (!session || !session->priv) 3732dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann return -1; 3733dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann 3734dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann t = session->priv; 3735dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann t->cb = func; 3736dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann t->udata = udata; 3737dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann 3738dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann return 0; 3739dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann} 3740dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann 3741adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi/* 3742adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * This function starts an asynchronous service search request. 3743400772d67b5861e8dbc8aaeb0aa697e5facb97d7Santiago Carot-Nemesio * The incomming and outgoing data are stored in the transaction structure 3744adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * buffers. When there is incomming data the sdp_process function must be 3745adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * called to get the data and handle the continuation state. 3746adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * 3747adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * INPUT : 3748adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * sdp_session_t *session 3749adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * Current sdp session to be handled 3750adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * 375141064d605ba2f88f967c8388c9b20b92a7868a87Ulisses Furquim * sdp_list_t *search 3752adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * Singly linked list containing elements of the search 3753adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * pattern. Each entry in the list is a UUID (DataTypeSDP_UUID16) 3754adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * of the service to be searched 3755adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * 3756adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * uint16_t max_rec_num 3757adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * A 16 bit integer which tells the service, the maximum 3758adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * entries that the client can handle in the response. The 3759adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * server is obliged not to return > max_rec_num entries 3760adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * 3761adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * OUTPUT : 3762adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * 3763adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * int return value 3764adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * 0 - if the request has been sent properly 3765adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * -1 - On any failure and sets errno 3766adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi */ 3767adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi 376841064d605ba2f88f967c8388c9b20b92a7868a87Ulisses Furquimint sdp_service_search_async(sdp_session_t *session, const sdp_list_t *search, uint16_t max_rec_num) 3769453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann{ 3770e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi struct sdp_transaction *t; 3771e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi sdp_pdu_hdr_t *reqhdr; 3772e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi uint8_t *pdata; 3773c01b6039f44d9e78acc26cd8482b5e0c7b23fe14Marcel Holtmann int cstate_len, seqlen = 0; 3774e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi 377512f41aa6ff9529a80a182754d0855dccb11978acClaudio Takahasi if (!session || !session->priv) 3776e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi return -1; 3777e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi 3778e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi t = session->priv; 377918a82a6fce76be0883a431380495510010515fffClaudio Takahasi 378018a82a6fce76be0883a431380495510010515fffClaudio Takahasi /* check if the buffer is already allocated */ 378118a82a6fce76be0883a431380495510010515fffClaudio Takahasi if (t->rsp_concat_buf.data) 378218a82a6fce76be0883a431380495510010515fffClaudio Takahasi free(t->rsp_concat_buf.data); 378318a82a6fce76be0883a431380495510010515fffClaudio Takahasi memset(&t->rsp_concat_buf, 0, sizeof(sdp_buf_t)); 378418a82a6fce76be0883a431380495510010515fffClaudio Takahasi 3785e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi if (!t->reqbuf) { 378618a82a6fce76be0883a431380495510010515fffClaudio Takahasi t->reqbuf = malloc(SDP_REQ_BUFFER_SIZE); 378718a82a6fce76be0883a431380495510010515fffClaudio Takahasi if (!t->reqbuf) { 378818a82a6fce76be0883a431380495510010515fffClaudio Takahasi t->err = ENOMEM; 378918a82a6fce76be0883a431380495510010515fffClaudio Takahasi goto end; 379018a82a6fce76be0883a431380495510010515fffClaudio Takahasi } 3791e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi } 3792e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi memset(t->reqbuf, 0, SDP_REQ_BUFFER_SIZE); 3793e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi 3794e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi reqhdr = (sdp_pdu_hdr_t *) t->reqbuf; 3795e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi reqhdr->tid = htons(sdp_gen_tid(session)); 3796e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi reqhdr->pdu_id = SDP_SVC_SEARCH_REQ; 3797e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi 3798e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi // generate PDU 3799e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi pdata = t->reqbuf + sizeof(sdp_pdu_hdr_t); 3800e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi t->reqsize = sizeof(sdp_pdu_hdr_t); 3801e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi 3802e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi // add service class IDs for search 380341064d605ba2f88f967c8388c9b20b92a7868a87Ulisses Furquim seqlen = gen_searchseq_pdu(pdata, search); 3804e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi 3805e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi SDPDBG("Data seq added : %d\n", seqlen); 3806e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi 3807e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi // now set the length and increment the pointer 3808e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi t->reqsize += seqlen; 3809e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi pdata += seqlen; 3810e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi 3811e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi bt_put_unaligned(htons(max_rec_num), (uint16_t *) pdata); 3812e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi t->reqsize += sizeof(uint16_t); 3813e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi pdata += sizeof(uint16_t); 3814e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi 3815e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi // set the request header's param length 38160a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann cstate_len = copy_cstate(pdata, SDP_REQ_BUFFER_SIZE - t->reqsize, NULL); 3817c01b6039f44d9e78acc26cd8482b5e0c7b23fe14Marcel Holtmann reqhdr->plen = htons((t->reqsize + cstate_len) - sizeof(sdp_pdu_hdr_t)); 3818e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi 3819c01b6039f44d9e78acc26cd8482b5e0c7b23fe14Marcel Holtmann if (sdp_send_req(session, t->reqbuf, t->reqsize + cstate_len) < 0) { 3820e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi SDPERR("Error sendind data:%s", strerror(errno)); 382112f41aa6ff9529a80a182754d0855dccb11978acClaudio Takahasi t->err = errno; 3822e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi goto end; 3823e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi } 3824e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi 3825453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann return 0; 3826e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasiend: 3827e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi 3828f207a4f0f6d5d38a3e357f62d4976bedaed2cf4fClaudio Takahasi if (t->reqbuf) { 3829f207a4f0f6d5d38a3e357f62d4976bedaed2cf4fClaudio Takahasi free(t->reqbuf); 3830f207a4f0f6d5d38a3e357f62d4976bedaed2cf4fClaudio Takahasi t->reqbuf = NULL; 3831e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi } 3832e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi 3833e9527af7533e35a59580cda37ff58152cb356103Claudio Takahasi return -1; 3834453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann} 3835453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann 3836adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi/* 3837adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * This function starts an asynchronous service attribute request. 3838400772d67b5861e8dbc8aaeb0aa697e5facb97d7Santiago Carot-Nemesio * The incomming and outgoing data are stored in the transaction structure 3839adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * buffers. When there is incomming data the sdp_process function must be 3840adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * called to get the data and handle the continuation state. 3841adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * 3842adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * INPUT : 3843adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * sdp_session_t *session 3844adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * Current sdp session to be handled 3845adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * 3846adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * uint32_t handle 3847adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * The handle of the service for which the attribute(s) are 3848adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * requested 3849adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * 3850adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * sdp_attrreq_type_t reqtype 3851adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * Attribute identifiers are 16 bit unsigned integers specified 3852adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * in one of 2 ways described below : 3853adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * SDP_ATTR_REQ_INDIVIDUAL - 16bit individual identifiers 3854adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * They are the actual attribute identifiers in ascending order 3855adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * 3856adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * SDP_ATTR_REQ_RANGE - 32bit identifier range 3857adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * The high-order 16bits is the start of range 3858adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * the low-order 16bits are the end of range 3859adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * 0x0000 to 0xFFFF gets all attributes 3860adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * 3861adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * sdp_list_t *attrid_list 3862adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * Singly linked list containing attribute identifiers desired. 3863400772d67b5861e8dbc8aaeb0aa697e5facb97d7Santiago Carot-Nemesio * Every element is either a uint16_t(attrSpec = SDP_ATTR_REQ_INDIVIDUAL) 3864adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * or a uint32_t(attrSpec=SDP_ATTR_REQ_RANGE) 3865adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * 3866adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * OUTPUT : 3867adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * int return value 3868adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * 0 - if the request has been sent properly 3869adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * -1 - On any failure and sets errno 3870adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi */ 3871adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi 3872453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmannint sdp_service_attr_async(sdp_session_t *session, uint32_t handle, sdp_attrreq_type_t reqtype, const sdp_list_t *attrid_list) 3873453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann{ 3874ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi struct sdp_transaction *t; 3875ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi sdp_pdu_hdr_t *reqhdr; 3876ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi uint8_t *pdata; 3877c01b6039f44d9e78acc26cd8482b5e0c7b23fe14Marcel Holtmann int cstate_len, seqlen = 0; 3878ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi 387912f41aa6ff9529a80a182754d0855dccb11978acClaudio Takahasi if (!session || !session->priv) 3880ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi return -1; 3881ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi 3882ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi t = session->priv; 388318a82a6fce76be0883a431380495510010515fffClaudio Takahasi 388418a82a6fce76be0883a431380495510010515fffClaudio Takahasi /* check if the buffer is already allocated */ 388518a82a6fce76be0883a431380495510010515fffClaudio Takahasi if (t->rsp_concat_buf.data) 388618a82a6fce76be0883a431380495510010515fffClaudio Takahasi free(t->rsp_concat_buf.data); 388718a82a6fce76be0883a431380495510010515fffClaudio Takahasi memset(&t->rsp_concat_buf, 0, sizeof(sdp_buf_t)); 388818a82a6fce76be0883a431380495510010515fffClaudio Takahasi 3889ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi if (!t->reqbuf) { 389018a82a6fce76be0883a431380495510010515fffClaudio Takahasi t->reqbuf = malloc(SDP_REQ_BUFFER_SIZE); 389118a82a6fce76be0883a431380495510010515fffClaudio Takahasi if (!t->reqbuf) { 389218a82a6fce76be0883a431380495510010515fffClaudio Takahasi t->err = ENOMEM; 389318a82a6fce76be0883a431380495510010515fffClaudio Takahasi goto end; 389418a82a6fce76be0883a431380495510010515fffClaudio Takahasi } 3895ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi } 3896ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi memset(t->reqbuf, 0, SDP_REQ_BUFFER_SIZE); 3897ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi 3898ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi reqhdr = (sdp_pdu_hdr_t *) t->reqbuf; 3899ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi reqhdr->tid = htons(sdp_gen_tid(session)); 3900ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi reqhdr->pdu_id = SDP_SVC_ATTR_REQ; 3901ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi 3902ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi // generate PDU 3903ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi pdata = t->reqbuf + sizeof(sdp_pdu_hdr_t); 3904ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi t->reqsize = sizeof(sdp_pdu_hdr_t); 3905ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi 3906ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi // add the service record handle 3907ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi bt_put_unaligned(htonl(handle), (uint32_t *) pdata); 3908ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi t->reqsize += sizeof(uint32_t); 3909ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi pdata += sizeof(uint32_t); 3910ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi 3911ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi // specify the response limit 3912ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi bt_put_unaligned(htons(65535), (uint16_t *) pdata); 3913ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi t->reqsize += sizeof(uint16_t); 3914ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi pdata += sizeof(uint16_t); 3915ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi 3916ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi // get attr seq PDU form 3917ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi seqlen = gen_attridseq_pdu(pdata, attrid_list, 3918ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi reqtype == SDP_ATTR_REQ_INDIVIDUAL? SDP_UINT16 : SDP_UINT32); 3919ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi if (seqlen == -1) { 392012f41aa6ff9529a80a182754d0855dccb11978acClaudio Takahasi t->err = EINVAL; 3921ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi goto end; 3922ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi } 3923ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi 3924ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi // now set the length and increment the pointer 3925ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi t->reqsize += seqlen; 3926ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi pdata += seqlen; 3927ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi SDPDBG("Attr list length : %d\n", seqlen); 3928ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi 3929ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi // set the request header's param length 39300a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann cstate_len = copy_cstate(pdata, SDP_REQ_BUFFER_SIZE - t->reqsize, NULL); 3931c01b6039f44d9e78acc26cd8482b5e0c7b23fe14Marcel Holtmann reqhdr->plen = htons((t->reqsize + cstate_len) - sizeof(sdp_pdu_hdr_t)); 3932ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi 3933c01b6039f44d9e78acc26cd8482b5e0c7b23fe14Marcel Holtmann if (sdp_send_req(session, t->reqbuf, t->reqsize + cstate_len) < 0) { 3934ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi SDPERR("Error sendind data:%s", strerror(errno)); 393512f41aa6ff9529a80a182754d0855dccb11978acClaudio Takahasi t->err = errno; 3936ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi goto end; 3937ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi } 3938ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi 3939453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann return 0; 3940ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasiend: 3941ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi 3942f207a4f0f6d5d38a3e357f62d4976bedaed2cf4fClaudio Takahasi if (t->reqbuf) { 3943f207a4f0f6d5d38a3e357f62d4976bedaed2cf4fClaudio Takahasi free(t->reqbuf); 3944f207a4f0f6d5d38a3e357f62d4976bedaed2cf4fClaudio Takahasi t->reqbuf = NULL; 3945ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi } 3946ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi 3947ef1fe5feaa0dde16562723bcb36343c7bc4c31beClaudio Takahasi return -1; 3948453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann} 3949453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann 3950dd610a12694a42aeb67417c95d87384f2eef8e70Marcel Holtmann/* 3951adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * This function starts an asynchronous service search attributes. 3952adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * It is a service search request combined with attribute request. The incomming 3953adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * and outgoing data are stored in the transaction structure buffers. When there 3954adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * is incomming data the sdp_process function must be called to get the data 3955adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * and handle the continuation state. 3956f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi * 3957f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi * INPUT: 3958f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi * sdp_session_t *session 3959f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi * Current sdp session to be handled 3960453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * 3961453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * sdp_list_t *search 3962453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * Singly linked list containing elements of the search 3963453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * pattern. Each entry in the list is a UUID(DataTypeSDP_UUID16) 3964453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * of the service to be searched 3965453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * 3966453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * AttributeSpecification attrSpec 3967453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * Attribute identifiers are 16 bit unsigned integers specified 3968453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * in one of 2 ways described below : 3969453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * SDP_ATTR_REQ_INDIVIDUAL - 16bit individual identifiers 3970453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * They are the actual attribute identifiers in ascending order 3971453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * 3972453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * SDP_ATTR_REQ_RANGE - 32bit identifier range 3973453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * The high-order 16bits is the start of range 3974453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * the low-order 16bits are the end of range 3975453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * 0x0000 to 0xFFFF gets all attributes 3976453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * 3977adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * sdp_list_t *attrid_list 3978453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * Singly linked list containing attribute identifiers desired. 3979400772d67b5861e8dbc8aaeb0aa697e5facb97d7Santiago Carot-Nemesio * Every element is either a uint16_t(attrSpec = SDP_ATTR_REQ_INDIVIDUAL) 3980453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * or a uint32_t(attrSpec=SDP_ATTR_REQ_RANGE) 3981453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann * 3982453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann 3983f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi * RETURN: 3984adff4cad15e4e13bb9847a0ff62b355caddf89e3Claudio Takahasi * 0 - if the request has been sent properly 3985f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi * -1 - On any failure 3986f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi */ 398741064d605ba2f88f967c8388c9b20b92a7868a87Ulisses Furquimint sdp_service_search_attr_async(sdp_session_t *session, const sdp_list_t *search, sdp_attrreq_type_t reqtype, const sdp_list_t *attrid_list) 3988f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi{ 3989f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi struct sdp_transaction *t; 3990f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi sdp_pdu_hdr_t *reqhdr; 3991f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi uint8_t *pdata; 3992c01b6039f44d9e78acc26cd8482b5e0c7b23fe14Marcel Holtmann int cstate_len, seqlen = 0; 3993f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 399412f41aa6ff9529a80a182754d0855dccb11978acClaudio Takahasi if (!session || !session->priv) 3995f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi return -1; 3996f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 3997f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi t = session->priv; 399818a82a6fce76be0883a431380495510010515fffClaudio Takahasi 399918a82a6fce76be0883a431380495510010515fffClaudio Takahasi /* check if the buffer is already allocated */ 400018a82a6fce76be0883a431380495510010515fffClaudio Takahasi if (t->rsp_concat_buf.data) 400118a82a6fce76be0883a431380495510010515fffClaudio Takahasi free(t->rsp_concat_buf.data); 400218a82a6fce76be0883a431380495510010515fffClaudio Takahasi memset(&t->rsp_concat_buf, 0, sizeof(sdp_buf_t)); 400318a82a6fce76be0883a431380495510010515fffClaudio Takahasi 4004f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi if (!t->reqbuf) { 400518a82a6fce76be0883a431380495510010515fffClaudio Takahasi t->reqbuf = malloc(SDP_REQ_BUFFER_SIZE); 400618a82a6fce76be0883a431380495510010515fffClaudio Takahasi if (!t->reqbuf) { 400718a82a6fce76be0883a431380495510010515fffClaudio Takahasi t->err = ENOMEM; 400818a82a6fce76be0883a431380495510010515fffClaudio Takahasi goto end; 400918a82a6fce76be0883a431380495510010515fffClaudio Takahasi } 4010f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi } 4011f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi memset(t->reqbuf, 0, SDP_REQ_BUFFER_SIZE); 4012f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4013f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi reqhdr = (sdp_pdu_hdr_t *) t->reqbuf; 4014f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi reqhdr->tid = htons(sdp_gen_tid(session)); 4015f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi reqhdr->pdu_id = SDP_SVC_SEARCH_ATTR_REQ; 4016f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4017f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi // generate PDU 4018f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi pdata = t->reqbuf + sizeof(sdp_pdu_hdr_t); 4019f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi t->reqsize = sizeof(sdp_pdu_hdr_t); 4020f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4021f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi // add service class IDs for search 402241064d605ba2f88f967c8388c9b20b92a7868a87Ulisses Furquim seqlen = gen_searchseq_pdu(pdata, search); 4023f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4024f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi SDPDBG("Data seq added : %d\n", seqlen); 4025f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4026f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi // now set the length and increment the pointer 4027f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi t->reqsize += seqlen; 4028f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi pdata += seqlen; 4029f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4030f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi bt_put_unaligned(htons(SDP_MAX_ATTR_LEN), (uint16_t *) pdata); 4031f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi t->reqsize += sizeof(uint16_t); 4032f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi pdata += sizeof(uint16_t); 4033f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4034f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi SDPDBG("Max attr byte count : %d\n", SDP_MAX_ATTR_LEN); 4035f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4036f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi // get attr seq PDU form 4037453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann seqlen = gen_attridseq_pdu(pdata, attrid_list, 4038453a0cedb6c909047553ffc7145bcef26a3ae94cMarcel Holtmann reqtype == SDP_ATTR_REQ_INDIVIDUAL ? SDP_UINT16 : SDP_UINT32); 4039f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi if (seqlen == -1) { 404012f41aa6ff9529a80a182754d0855dccb11978acClaudio Takahasi t->err = EINVAL; 4041f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi goto end; 4042f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi } 4043f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4044f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi pdata += seqlen; 4045f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi SDPDBG("Attr list length : %d\n", seqlen); 4046f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi t->reqsize += seqlen; 4047f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4048f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi // set the request header's param length 40490a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann cstate_len = copy_cstate(pdata, SDP_REQ_BUFFER_SIZE - t->reqsize, NULL); 4050c01b6039f44d9e78acc26cd8482b5e0c7b23fe14Marcel Holtmann reqhdr->plen = htons((t->reqsize + cstate_len) - sizeof(sdp_pdu_hdr_t)); 4051f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4052c01b6039f44d9e78acc26cd8482b5e0c7b23fe14Marcel Holtmann if (sdp_send_req(session, t->reqbuf, t->reqsize + cstate_len) < 0) { 4053f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi SDPERR("Error sendind data:%s", strerror(errno)); 405412f41aa6ff9529a80a182754d0855dccb11978acClaudio Takahasi t->err = errno; 4055f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi goto end; 4056f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi } 4057f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4058f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi return 0; 4059f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasiend: 4060f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4061f207a4f0f6d5d38a3e357f62d4976bedaed2cf4fClaudio Takahasi if (t->reqbuf) { 4062f207a4f0f6d5d38a3e357f62d4976bedaed2cf4fClaudio Takahasi free(t->reqbuf); 4063f207a4f0f6d5d38a3e357f62d4976bedaed2cf4fClaudio Takahasi t->reqbuf = NULL; 4064f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi } 4065f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4066f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi return -1; 4067f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi} 4068f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4069f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi/* 40705ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi * Function used to get the error reason after sdp_callback_t function has been called 407112f41aa6ff9529a80a182754d0855dccb11978acClaudio Takahasi * and the status is 0xffff or if sdp_service_{search, attr, search_attr}_async returns -1. 407212f41aa6ff9529a80a182754d0855dccb11978acClaudio Takahasi * It indicates that an error NOT related to SDP_ErrorResponse happened. Get errno directly 407312f41aa6ff9529a80a182754d0855dccb11978acClaudio Takahasi * is not safe because multiple transactions can be triggered. 40745ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi * This function must be used with asynchronous sdp functions only. 40755ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi * 40765ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi * INPUT: 40775ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi * sdp_session_t *session 40785ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi * Current sdp session to be handled 40795ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi * RETURN: 40805ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi * 0 = No error in the current transaction 40815ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi * -1 - if the session is invalid 40825ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi * positive value - the errno value 40835ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi * 40845ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi */ 40855ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasiint sdp_get_error(sdp_session_t *session) 40865ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi{ 40875ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi struct sdp_transaction *t; 40885ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi 40895ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi if (!session || !session->priv) { 40905ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi SDPERR("Invalid session"); 40915ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi return -1; 40925ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi } 40935ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi 40945ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi t = session->priv; 40955ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi 40965ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi return t->err; 40975ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi} 40985ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi 40995ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi/* 4100f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi * Receive the incomming SDP PDU. This function must be called when there is data 4101f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi * available to be read. On continuation state, the original request (with a new 4102f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi * transaction ID) and the continuation state data will be appended in the initial PDU. 4103f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi * If an error happens or the transaction finishes the callback function will be called. 4104f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi * 4105f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi * INPUT: 4106f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi * sdp_session_t *session 4107f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi * Current sdp session to be handled 4108f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi * RETURN: 4109f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi * 0 - if the transaction is on continuation state 4110f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi * -1 - On any failure or the transaction finished 4111f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi */ 4112f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasiint sdp_process(sdp_session_t *session) 4113f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi{ 41145ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi struct sdp_transaction *t; 41155ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi sdp_pdu_hdr_t *reqhdr, *rsphdr; 41165ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi sdp_cstate_t *pcstate; 41175ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi uint8_t *pdata, *rspbuf, *targetPtr; 41185ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi int rsp_count, err = -1; 4119c01b6039f44d9e78acc26cd8482b5e0c7b23fe14Marcel Holtmann size_t size = 0; 41209203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi int n, plen; 41215ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi uint16_t status = 0xffff; 41225ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi uint8_t pdu_id = 0x00; 4123f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4124f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi if (!session || !session->priv) { 4125c8e5a1464ff8edb068e7361a257ef4ae34674cf8Claudio Takahasi SDPERR("Invalid session"); 4126c8e5a1464ff8edb068e7361a257ef4ae34674cf8Claudio Takahasi return -1; 4127f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi } 4128f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4129f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi rspbuf = malloc(SDP_RSP_BUFFER_SIZE); 41305ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi if (!rspbuf) { 41315ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi SDPERR("Response buffer alloc failure:%s (%d)", 41325ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi strerror(errno), errno); 4133c8e5a1464ff8edb068e7361a257ef4ae34674cf8Claudio Takahasi return -1; 41345ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi } 4135c8e5a1464ff8edb068e7361a257ef4ae34674cf8Claudio Takahasi 4136c8e5a1464ff8edb068e7361a257ef4ae34674cf8Claudio Takahasi memset(rspbuf, 0, SDP_RSP_BUFFER_SIZE); 4137f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4138f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi t = session->priv; 4139f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi reqhdr = (sdp_pdu_hdr_t *)t->reqbuf; 4140f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi rsphdr = (sdp_pdu_hdr_t *)rspbuf; 4141f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 41425ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi pdata = rspbuf + sizeof(sdp_pdu_hdr_t); 4143f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 41449203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi n = sdp_read_rsp(session, rspbuf, SDP_RSP_BUFFER_SIZE); 41459203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi if (n < 0) { 41465ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi SDPERR("Read response:%s (%d)", strerror(errno), errno); 41475ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi t->err = errno; 4148f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi goto end; 41495ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi } 4150f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 41519203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi if (n == 0 || reqhdr->tid != rsphdr->tid || 4152cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann (n != (ntohs(rsphdr->plen) + (int) sizeof(sdp_pdu_hdr_t)))) { 41535ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi t->err = EPROTO; 41549203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi SDPERR("Protocol error."); 4155343f72ba28deaf9ddc68043567baad76e0325e5dClaudio Takahasi goto end; 4156343f72ba28deaf9ddc68043567baad76e0325e5dClaudio Takahasi } 4157343f72ba28deaf9ddc68043567baad76e0325e5dClaudio Takahasi 41585ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi pdu_id = rsphdr->pdu_id; 415958eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi switch (rsphdr->pdu_id) { 416058eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi uint8_t *ssr_pdata; 416158eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi uint16_t tsrc, csrc; 416258eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi case SDP_SVC_SEARCH_RSP: 416358eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi /* 41649203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi * TSRC: Total Service Record Count (2 bytes) 41659203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi * CSRC: Current Service Record Count (2 bytes) 416658eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi */ 416758eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi ssr_pdata = pdata; 416858eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi tsrc = ntohs(bt_get_unaligned((uint16_t *) ssr_pdata)); 41699203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi ssr_pdata += sizeof(uint16_t); 417058eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi csrc = ntohs(bt_get_unaligned((uint16_t *) ssr_pdata)); 417158eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi 41729203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi /* csrc should never be larger than tsrc */ 41739203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi if (csrc > tsrc) { 41749203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi t->err = EPROTO; 41759203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi SDPERR("Protocol error: wrong current service record count value."); 41769203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi goto end; 41779203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi } 41789203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi 41799203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi SDPDBG("Total svc count: %d\n", tsrc); 41809203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi SDPDBG("Current svc count: %d\n", csrc); 41819203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi 41829203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi /* parameter length without continuation state */ 41839203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi plen = sizeof(tsrc) + sizeof(csrc) + csrc * 4; 41849203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi 4185c01b6039f44d9e78acc26cd8482b5e0c7b23fe14Marcel Holtmann if (t->rsp_concat_buf.data_size == 0) { 418658eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi /* first fragment */ 418758eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi rsp_count = sizeof(tsrc) + sizeof(csrc) + csrc * 4; 418858eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi } else { 4189e3dbc939bd096c8604d1480e0994f73f65a39f16Claudio Takahasi /* point to the first csrc */ 4190e3dbc939bd096c8604d1480e0994f73f65a39f16Claudio Takahasi uint16_t *pcsrc = (uint16_t *) (t->rsp_concat_buf.data + 2); 4191e3dbc939bd096c8604d1480e0994f73f65a39f16Claudio Takahasi 4192e3dbc939bd096c8604d1480e0994f73f65a39f16Claudio Takahasi /* FIXME: update the interface later. csrc doesn't need be passed to clients */ 4193e3dbc939bd096c8604d1480e0994f73f65a39f16Claudio Takahasi 4194e3dbc939bd096c8604d1480e0994f73f65a39f16Claudio Takahasi pdata += sizeof(uint16_t); /* point to csrc */ 4195e3dbc939bd096c8604d1480e0994f73f65a39f16Claudio Takahasi 4196e3dbc939bd096c8604d1480e0994f73f65a39f16Claudio Takahasi /* the first csrc contains the sum of partial csrc responses */ 4197400772d67b5861e8dbc8aaeb0aa697e5facb97d7Santiago Carot-Nemesio *pcsrc += bt_get_unaligned((uint16_t *) pdata); 4198e3dbc939bd096c8604d1480e0994f73f65a39f16Claudio Takahasi 4199e3dbc939bd096c8604d1480e0994f73f65a39f16Claudio Takahasi pdata += sizeof(uint16_t); /* point to the first handle */ 420058eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi rsp_count = csrc * 4; 420158eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi } 42025ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi status = 0x0000; 420358eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi break; 420458eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi case SDP_SVC_ATTR_RSP: 420558eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi case SDP_SVC_SEARCH_ATTR_RSP: 420658eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi rsp_count = ntohs(bt_get_unaligned((uint16_t *) pdata)); 420758eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi SDPDBG("Attrlist byte count : %d\n", rsp_count); 4208400772d67b5861e8dbc8aaeb0aa697e5facb97d7Santiago Carot-Nemesio 4209400772d67b5861e8dbc8aaeb0aa697e5facb97d7Santiago Carot-Nemesio /* 42109203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi * Number of bytes in the AttributeLists parameter(without 42119203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi * continuation state) + AttributeListsByteCount field size. 42129203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi */ 42139203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi plen = sizeof(uint16_t) + rsp_count; 4214f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 421558eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi pdata += sizeof(uint16_t); // points to attribute list 42165ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi status = 0x0000; 421758eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi break; 42185ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi case SDP_ERROR_RSP: 42195ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi status = ntohs(bt_get_unaligned((uint16_t *) pdata)); 42209203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi size = ntohs(rsphdr->plen); 42219203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi 42229203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi /* error code + error info */ 42239203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi plen = size; 42245ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi goto end; 422558eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi default: 42265ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi t->err = EPROTO; 42275ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi SDPERR("Illegal PDU ID: 0x%x", rsphdr->pdu_id); 422858eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi goto end; 422958eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi } 4230f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 423158eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi pcstate = (sdp_cstate_t *) (pdata + rsp_count); 423258eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi 423358eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi SDPDBG("Cstate length : %d\n", pcstate->length); 42349203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi 4235400772d67b5861e8dbc8aaeb0aa697e5facb97d7Santiago Carot-Nemesio /* 42369203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi * Check out of bound. Continuation state must have at least 42379203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi * 1 byte: ZERO to indicate that it is not a partial response. 42389203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi */ 4239cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann if ((n - (int) sizeof(sdp_pdu_hdr_t)) != (plen + pcstate->length + 1)) { 42409203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi t->err = EPROTO; 42419203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi SDPERR("Protocol error: wrong PDU size."); 42429203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi status = 0xffff; 42439203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi goto end; 42449203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi } 42459203084c0b92805006c133f82fbc0cbd6b203904Claudio Takahasi 4246f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi /* 4247f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi * This is a split response, need to concatenate intermediate 42485ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi * responses and the last one which will have cstate length == 0 4249f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi */ 425058eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi t->rsp_concat_buf.data = realloc(t->rsp_concat_buf.data, t->rsp_concat_buf.data_size + rsp_count); 425158eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi targetPtr = t->rsp_concat_buf.data + t->rsp_concat_buf.data_size; 425258eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi t->rsp_concat_buf.buf_size = t->rsp_concat_buf.data_size + rsp_count; 425358eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi memcpy(targetPtr, pdata, rsp_count); 425458eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi t->rsp_concat_buf.data_size += rsp_count; 425558eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi 425658eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi if (pcstate->length > 0) { 425758eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi int reqsize, cstate_len; 4258f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4259f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi reqhdr->tid = htons(sdp_gen_tid(session)); 4260f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 42615ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi // add continuation state 42620a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann cstate_len = copy_cstate(t->reqbuf + t->reqsize, 42630a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann SDP_REQ_BUFFER_SIZE - t->reqsize, pcstate); 4264f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 426558eb769e7620e03c8b0bf2d2bcf38c06ab58065fClaudio Takahasi reqsize = t->reqsize + cstate_len; 4266f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4267f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi // set the request header's param length 4268f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi reqhdr->plen = htons(reqsize - sizeof(sdp_pdu_hdr_t)); 4269400772d67b5861e8dbc8aaeb0aa697e5facb97d7Santiago Carot-Nemesio 4270f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi if (sdp_send_req(session, t->reqbuf, reqsize) < 0) { 42715ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi SDPERR("Error sendind data:%s(%d)", strerror(errno), errno); 42725ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi status = 0xffff; 42735ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi t->err = errno; 4274f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi goto end; 4275f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi } 4276c8e5a1464ff8edb068e7361a257ef4ae34674cf8Claudio Takahasi err = 0; 4277f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi } 4278f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4279f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasiend: 4280c8e5a1464ff8edb068e7361a257ef4ae34674cf8Claudio Takahasi if (err) { 4281c01b6039f44d9e78acc26cd8482b5e0c7b23fe14Marcel Holtmann if (t->rsp_concat_buf.data_size != 0) { 4282f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi pdata = t->rsp_concat_buf.data; 4283c01b6039f44d9e78acc26cd8482b5e0c7b23fe14Marcel Holtmann size = t->rsp_concat_buf.data_size; 4284c01b6039f44d9e78acc26cd8482b5e0c7b23fe14Marcel Holtmann } 4285f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi if (t->cb) 42865ec20cab698055029198b10afb4db20bee06ce72Claudio Takahasi t->cb(pdu_id, status, pdata, size, t->udata); 4287f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi } 4288f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4289f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi if (rspbuf) 4290f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi free(rspbuf); 4291f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4292c8e5a1464ff8edb068e7361a257ef4ae34674cf8Claudio Takahasi return err; 4293f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi} 4294f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi 4295f9264e21a9e0c97e6a4d970c0b31cf01fc18781dClaudio Takahasi/* 4296542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * This is a service search request combined with the service 4297542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * attribute request. First a service class match is done and 4298542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * for matching service, requested attributes are extracted 4299542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 4300542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * INPUT : 4301542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 4302542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * sdp_list_t *search 4303542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Singly linked list containing elements of the search 4304542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * pattern. Each entry in the list is a UUID(DataTypeSDP_UUID16) 4305542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * of the service to be searched 4306542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 4307542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * AttributeSpecification attrSpec 4308542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Attribute identifiers are 16 bit unsigned integers specified 4309542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * in one of 2 ways described below : 4310542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * SDP_ATTR_REQ_INDIVIDUAL - 16bit individual identifiers 4311542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * They are the actual attribute identifiers in ascending order 4312542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 4313542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * SDP_ATTR_REQ_RANGE - 32bit identifier range 4314542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * The high-order 16bits is the start of range 4315542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * the low-order 16bits are the end of range 4316542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 0x0000 to 0xFFFF gets all attributes 4317542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 4318542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * sdp_list_t *attrids 4319542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Singly linked list containing attribute identifiers desired. 4320400772d67b5861e8dbc8aaeb0aa697e5facb97d7Santiago Carot-Nemesio * Every element is either a uint16_t(attrSpec = SDP_ATTR_REQ_INDIVIDUAL) 4321542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * or a uint32_t(attrSpec=SDP_ATTR_REQ_RANGE) 4322542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 4323542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * OUTPUT : 4324542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * int return value 4325542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 0: 4326542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * The request completed successfully. This does not 4327542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * mean the requested services were found 4328542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * -1: 4329542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * On any error and sets errno 4330542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * 4331542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * sdp_list_t **rsp 4332542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * This variable is set on a successful return to point to 4333542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * service(s) found. Each element of this list is of type 4334542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * sdp_record_t* (of the services which matched the search list) 4335542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 4336542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_service_search_attr_req(sdp_session_t *session, const sdp_list_t *search, sdp_attrreq_type_t reqtype, const sdp_list_t *attrids, sdp_list_t **rsp) 4337542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 4338542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int status = 0; 4339cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint32_t reqsize = 0, _reqsize; 4340cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint32_t rspsize = 0; 4341542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int seqlen = 0, attr_list_len = 0; 4342cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann int rsp_count = 0, cstate_len = 0; 4343cb0b4b761c43394bd9c4e735455d5a5e479198f9Marcel Holtmann unsigned int pdata_len; 4344cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint8_t *pdata, *_pdata; 4345cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint8_t *reqbuf, *rspbuf; 4346542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_pdu_hdr_t *reqhdr, *rsphdr; 4347542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann uint8_t dataType; 4348542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_list_t *rec_list = NULL; 4349542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_buf_t rsp_concat_buf; 4350542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann sdp_cstate_t *cstate = NULL; 4351542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4352542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (reqtype != SDP_ATTR_REQ_INDIVIDUAL && reqtype != SDP_ATTR_REQ_RANGE) { 4353542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = EINVAL; 4354542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 4355542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 43568232558057813074ce6bdb3317a9fb4888f7b8e3Johan Hedberg 43578232558057813074ce6bdb3317a9fb4888f7b8e3Johan Hedberg memset(&rsp_concat_buf, 0, sizeof(sdp_buf_t)); 43588232558057813074ce6bdb3317a9fb4888f7b8e3Johan Hedberg 4359cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann reqbuf = malloc(SDP_REQ_BUFFER_SIZE); 4360cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann rspbuf = malloc(SDP_RSP_BUFFER_SIZE); 4361542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (!reqbuf || !rspbuf) { 4362542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann errno = ENOMEM; 4363542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = -1; 4364542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto end; 4365542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 4366542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4367aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann reqhdr = (sdp_pdu_hdr_t *) reqbuf; 4368542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr->pdu_id = SDP_SVC_SEARCH_ATTR_REQ; 4369542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4370542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann // generate PDU 4371542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata = reqbuf + sizeof(sdp_pdu_hdr_t); 4372542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqsize = sizeof(sdp_pdu_hdr_t); 4373542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4374542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann // add service class IDs for search 4375542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann seqlen = gen_searchseq_pdu(pdata, search); 4376542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4377542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Data seq added : %d\n", seqlen); 4378542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 43798f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg /* now set the length and increment the pointer */ 4380542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqsize += seqlen; 4381542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata += seqlen; 4382542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4383aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann bt_put_unaligned(htons(SDP_MAX_ATTR_LEN), (uint16_t *) pdata); 4384542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqsize += sizeof(uint16_t); 4385542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata += sizeof(uint16_t); 4386542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4387542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Max attr byte count : %d\n", SDP_MAX_ATTR_LEN); 4388542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 43898f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg /* get attr seq PDU form */ 4390542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann seqlen = gen_attridseq_pdu(pdata, attrids, 4391aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann reqtype == SDP_ATTR_REQ_INDIVIDUAL ? SDP_UINT16 : SDP_UINT32); 4392542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (seqlen == -1) { 4393542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = EINVAL; 4394542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto end; 4395542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 4396542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata += seqlen; 4397542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Attr list length : %d\n", seqlen); 4398542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqsize += seqlen; 4399542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *rsp = 0; 4400542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 44018f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg /* save before Continuation State */ 4402542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann _pdata = pdata; 4403542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann _reqsize = reqsize; 4404542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4405542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann do { 4406542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr->tid = htons(sdp_gen_tid(session)); 4407542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 44088f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg /* add continuation state (can be null) */ 44090a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann reqsize = _reqsize + copy_cstate(_pdata, 44100a8f7c9206e17ab118966bf7da8a053ef34dce84Marcel Holtmann SDP_REQ_BUFFER_SIZE - _reqsize, cstate); 4411542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 44128f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg /* set the request header's param length */ 4413542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann reqhdr->plen = htons(reqsize - sizeof(sdp_pdu_hdr_t)); 4414aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann rsphdr = (sdp_pdu_hdr_t *) rspbuf; 4415542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = sdp_send_req_w4_rsp(session, reqbuf, rspbuf, reqsize, &rspsize); 4416121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann if (rspsize < sizeof(sdp_pdu_hdr_t)) { 4417121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann SDPERR("Unexpected end of packet"); 4418121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann status = -1; 4419121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann goto end; 4420121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann } 4421121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann 4422542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (status < 0) { 4423542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Status : 0x%x\n", rsphdr->pdu_id); 4424542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto end; 4425542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 44268f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg 4427542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (rsphdr->pdu_id == SDP_ERROR_RSP) { 4428542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = -1; 4429542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto end; 4430542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 44318f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg 4432542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata = rspbuf + sizeof(sdp_pdu_hdr_t); 4433121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann pdata_len = rspsize - sizeof(sdp_pdu_hdr_t); 4434121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann 4435121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann if (pdata_len < sizeof(uint16_t)) { 4436121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann SDPERR("Unexpected end of packet"); 4437121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann status = -1; 4438121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann goto end; 4439121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann } 4440121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann 4441aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann rsp_count = ntohs(bt_get_unaligned((uint16_t *) pdata)); 4442542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann attr_list_len += rsp_count; 4443542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata += sizeof(uint16_t); // pdata points to attribute list 4444121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann pdata_len -= sizeof(uint16_t); 4445121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann 4446121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann if (pdata_len < rsp_count + sizeof(uint8_t)) { 4447121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann SDPERR("Unexpected end of packet: continuation state data missing"); 4448121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann status = -1; 4449121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann goto end; 4450121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann } 4451121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann 4452aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann cstate_len = *(uint8_t *) (pdata + rsp_count); 4453542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4454542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Attrlist byte count : %d\n", attr_list_len); 4455542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Response byte count : %d\n", rsp_count); 4456542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Cstate length : %d\n", cstate_len); 4457542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann /* 4458542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * This is a split response, need to concatenate intermediate 4459542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * responses and the last one which will have cstate_len == 0 4460542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 4461542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (cstate_len > 0 || rsp_concat_buf.data_size != 0) { 4462cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann uint8_t *targetPtr = NULL; 4463542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4464aae7cfb9807fd7452e6662fc9f6c3ebe0e64dbf5Marcel Holtmann cstate = cstate_len > 0 ? (sdp_cstate_t *) (pdata + rsp_count) : 0; 4465542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 44668f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg /* build concatenated response buffer */ 4467cfa3a02e2593bd72ce4a83f521e1e89a5874ea7dMarcel Holtmann rsp_concat_buf.data = realloc(rsp_concat_buf.data, rsp_concat_buf.data_size + rsp_count); 4468542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann targetPtr = rsp_concat_buf.data + rsp_concat_buf.data_size; 4469542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann rsp_concat_buf.buf_size = rsp_concat_buf.data_size + rsp_count; 4470542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann memcpy(targetPtr, pdata, rsp_count); 4471542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann rsp_concat_buf.data_size += rsp_count; 4472542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 4473542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } while (cstate); 4474542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4475542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (attr_list_len > 0) { 4476542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int scanned = 0; 4477542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4478121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann if (rsp_concat_buf.data_size != 0) { 4479542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata = rsp_concat_buf.data; 4480121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann pdata_len = rsp_concat_buf.data_size; 4481121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann } 4482542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4483542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann /* 4484542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Response is a sequence of sequence(s) for one or 4485542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * more data element sequence(s) representing services 4486542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * for which attributes are returned 4487542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 4488d39e08cc5483dc924f3b764b87042fb6aebb722dMarcel Holtmann scanned = sdp_extract_seqtype(pdata, pdata_len, &dataType, &seqlen); 4489542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4490542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Bytes scanned : %d\n", scanned); 4491542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Seq length : %d\n", seqlen); 4492542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4493542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (scanned && seqlen) { 4494542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata += scanned; 4495121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann pdata_len -= scanned; 4496542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann do { 4497542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int recsize = 0; 4498d39e08cc5483dc924f3b764b87042fb6aebb722dMarcel Holtmann sdp_record_t *rec = sdp_extract_pdu(pdata, pdata_len, &recsize); 4499542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (rec == NULL) { 4500542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPERR("SVC REC is null\n"); 4501542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann status = -1; 4502542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann goto end; 4503542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 45048db4e616c0107df21e3cacd981d073a64414de77Marcel Holtmann if (!recsize) { 45058db4e616c0107df21e3cacd981d073a64414de77Marcel Holtmann sdp_record_free(rec); 45068db4e616c0107df21e3cacd981d073a64414de77Marcel Holtmann break; 45078db4e616c0107df21e3cacd981d073a64414de77Marcel Holtmann } 4508542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann scanned += recsize; 4509542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann pdata += recsize; 4510121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann pdata_len -= recsize; 4511542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4512542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Loc seq length : %d\n", recsize); 4513542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Svc Rec Handle : 0x%x\n", rec->handle); 4514542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Bytes scanned : %d\n", scanned); 4515542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Attrlist byte count : %d\n", attr_list_len); 4516542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann rec_list = sdp_list_append(rec_list, rec); 4517121c632f01e3f49a69a9d637e0da4d25c2ee090dMarcel Holtmann } while (scanned < attr_list_len && pdata_len > 0); 4518542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4519542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPDBG("Successful scan of service attr lists\n"); 4520542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *rsp = rec_list; 4521542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 4522542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 45238f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedbergend: 4524542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (rsp_concat_buf.data) 4525542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(rsp_concat_buf.data); 4526542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (reqbuf) 4527542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(reqbuf); 4528542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (rspbuf) 4529542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(rspbuf); 4530542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return status; 4531542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 4532542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4533542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann/* 4534542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann * Find devices in the piconet. 4535542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann */ 4536542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_general_inquiry(inquiry_info *ii, int num_dev, int duration, uint8_t *found) 4537542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 4538542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann int n = hci_inquiry(-1, 10, num_dev, NULL, &ii, 0); 4539542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (n < 0) { 4540542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann SDPERR("Inquiry failed:%s", strerror(errno)); 4541542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return -1; 4542542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 4543542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann *found = n; 4544542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return 0; 4545542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 4546542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4547542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannint sdp_close(sdp_session_t *session) 4548542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 45498be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi struct sdp_transaction *t; 45508be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi int ret; 45518f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg 45528be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi if (!session) 45538be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi return -1; 45548be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi 45558be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi ret = close(session->sock); 45568be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi 45578be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi t = session->priv; 45588be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi 45598be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi if (t) { 45608be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi if (t->reqbuf) 45618be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi free(t->reqbuf); 45628be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi 45638be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi if (t->rsp_concat_buf.data) 45648be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi free(t->rsp_concat_buf.data); 45658be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi 45668be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi free(t); 45678be090b298a02108146d3bf48271f8408ac31917Claudio Takahasi } 4568542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(session); 4569542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return ret; 4570542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 4571542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 4572542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannstatic inline int sdp_is_local(const bdaddr_t *device) 4573542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 4574542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann return memcmp(device, BDADDR_LOCAL, sizeof(bdaddr_t)) == 0; 4575542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 4576542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann 45771be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquimstatic int sdp_connect_local(sdp_session_t *session) 4578542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann{ 45791be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim struct sockaddr_un sa; 4580a76dc65489dd8959547a97a391e405b2025bbd79Marcel Holtmann 45811be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim session->sock = socket(PF_UNIX, SOCK_STREAM, 0); 45821be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim if (session->sock < 0) 45831be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim return -1; 45841be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim session->local = 1; 4585a76dc65489dd8959547a97a391e405b2025bbd79Marcel Holtmann 45861be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim sa.sun_family = AF_UNIX; 45871be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim strcpy(sa.sun_path, SDP_UNIX_PATH); 4588a76dc65489dd8959547a97a391e405b2025bbd79Marcel Holtmann 4589d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann return connect(session->sock, (struct sockaddr *) &sa, sizeof(sa)); 45901be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim} 45911be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim 45921be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquimstatic int sdp_connect_l2cap(const bdaddr_t *src, 45938f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg const bdaddr_t *dst, sdp_session_t *session) 45941be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim{ 45951be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim uint32_t flags = session->flags; 45961be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim struct sockaddr_l2 sa; 45971be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim int sk; 45981be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim 45991be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim session->sock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); 46001be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim if (session->sock < 0) 46011be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim return -1; 46021be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim session->local = 0; 46031be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim 46041be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim sk = session->sock; 46051be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim 46061be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim if (flags & SDP_NON_BLOCKING) { 46071be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim long arg = fcntl(sk, F_GETFL, 0); 46081be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim fcntl(sk, F_SETFL, arg | O_NONBLOCK); 4609a76dc65489dd8959547a97a391e405b2025bbd79Marcel Holtmann } 4610a76dc65489dd8959547a97a391e405b2025bbd79Marcel Holtmann 4611b5e64e37e108d782ad9496873fcdc579e5a4dc60Johan Hedberg memset(&sa, 0, sizeof(sa)); 4612b5e64e37e108d782ad9496873fcdc579e5a4dc60Johan Hedberg 46131be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim sa.l2_family = AF_BLUETOOTH; 46141be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim sa.l2_psm = 0; 4615a76dc65489dd8959547a97a391e405b2025bbd79Marcel Holtmann 46161be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim if (bacmp(src, BDADDR_ANY)) { 46171be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim sa.l2_bdaddr = *src; 46181be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim if (bind(sk, (struct sockaddr *) &sa, sizeof(sa)) < 0) 46191be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim return -1; 46201be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim } 4621a76dc65489dd8959547a97a391e405b2025bbd79Marcel Holtmann 46221be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim if (flags & SDP_WAIT_ON_CLOSE) { 46231be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim struct linger l = { .l_onoff = 1, .l_linger = 1 }; 46241be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim setsockopt(sk, SOL_SOCKET, SO_LINGER, &l, sizeof(l)); 46251be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim } 46261be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim 46271be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim sa.l2_psm = htobs(SDP_PSM); 46281be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim sa.l2_bdaddr = *dst; 46291be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim 46301be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim do { 46311be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim int ret = connect(sk, (struct sockaddr *) &sa, sizeof(sa)); 4632aa7577018bb1faac4b67b52dc8b003663cdd03adUlisses Furquim if (!ret) 46331be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim return 0; 46341be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim if (ret < 0 && (flags & SDP_NON_BLOCKING) && 46358f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg (errno == EAGAIN || errno == EINPROGRESS)) 46361be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim return 0; 46371be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim } while (errno == EBUSY && (flags & SDP_RETRY_IF_BUSY)); 46381be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim 46391be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim return -1; 46401be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim} 46411be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim 46421be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquimsdp_session_t *sdp_connect(const bdaddr_t *src, 46438f159d4498f549b0f9ecad9ef4147847f0583ebbJohan Hedberg const bdaddr_t *dst, uint32_t flags) 46441be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim{ 46451be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim sdp_session_t *session; 46461be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim int err; 46471be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim 46481be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim if ((flags & SDP_RETRY_IF_BUSY) && (flags & SDP_NON_BLOCKING)) { 46491be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim errno = EINVAL; 46501be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim return NULL; 46511be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim } 46521be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim 46531be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim session = sdp_create(-1, flags); 46541be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim if (!session) 46551be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim return NULL; 46561be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim 46571be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim if (sdp_is_local(dst)) { 46581be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim if (sdp_connect_local(session) < 0) 46591be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim goto fail; 4660542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } else { 46611be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim if (sdp_connect_l2cap(src, dst, session) < 0) 46621be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim goto fail; 4663542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann } 4664a76dc65489dd8959547a97a391e405b2025bbd79Marcel Holtmann 46651be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim return session; 46661be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim 4667542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmannfail: 466812862715c961bf6dabce2ed4e58da58e5dfe8c6bMarcel Holtmann err = errno; 4669542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann if (session->sock >= 0) 4670542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann close(session->sock); 4671a76dc65489dd8959547a97a391e405b2025bbd79Marcel Holtmann if (session->priv) 4672a76dc65489dd8959547a97a391e405b2025bbd79Marcel Holtmann free(session->priv); 4673542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann free(session); 467412862715c961bf6dabce2ed4e58da58e5dfe8c6bMarcel Holtmann errno = err; 46751be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim 46761be1f79648ba7aafde6349cfe51f9c929e20d018Ulisses Furquim return NULL; 4677542fc57346fbb329934152f446f58cc61a5d5d00Marcel Holtmann} 46788f6ea7c3d24dc21f120b6d29fc975936b4d4f3b7Marcel Holtmann 46798f6ea7c3d24dc21f120b6d29fc975936b4d4f3b7Marcel Holtmannint sdp_get_socket(const sdp_session_t *session) 46808f6ea7c3d24dc21f120b6d29fc975936b4d4f3b7Marcel Holtmann{ 46818f6ea7c3d24dc21f120b6d29fc975936b4d4f3b7Marcel Holtmann return session->sock; 46828f6ea7c3d24dc21f120b6d29fc975936b4d4f3b7Marcel Holtmann} 46838f6ea7c3d24dc21f120b6d29fc975936b4d4f3b7Marcel Holtmann 46848f6ea7c3d24dc21f120b6d29fc975936b4d4f3b7Marcel Holtmannuint16_t sdp_gen_tid(sdp_session_t *session) 46858f6ea7c3d24dc21f120b6d29fc975936b4d4f3b7Marcel Holtmann{ 46868f6ea7c3d24dc21f120b6d29fc975936b4d4f3b7Marcel Holtmann return session->tid++; 46878f6ea7c3d24dc21f120b6d29fc975936b4d4f3b7Marcel Holtmann} 46883faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas 46893faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas/* 46903faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas * Set the supported features 46913faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas */ 46923faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenasint sdp_set_supp_feat(sdp_record_t *rec, const sdp_list_t *sf) 46933faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas{ 46943faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas const sdp_list_t *p, *r; 46953faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas sdp_data_t *feat, *seq_feat; 46963faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas int seqlen, i; 46973faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas void **seqDTDs, **seqVals; 46983faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas 46993faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas seqlen = sdp_list_len(sf); 47003faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas seqDTDs = malloc(seqlen * sizeof(void *)); 47013faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas if (!seqDTDs) 47023faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas return -1; 47033faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas seqVals = malloc(seqlen * sizeof(void *)); 47043faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas if (!seqVals) { 47053faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas free(seqDTDs); 47063faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas return -1; 47073faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas } 47083faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas 47093faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas for (p = sf, i = 0; p; p = p->next, i++) { 47103faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas int plen, j; 47113faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas void **dtds, **vals; 47121d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas int *lengths; 47133faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas 47143faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas plen = sdp_list_len(p->data); 47153faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas dtds = malloc(plen * sizeof(void *)); 47163faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas if (!dtds) 47173faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas goto fail; 47183faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas vals = malloc(plen * sizeof(void *)); 47193faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas if (!vals) { 47203faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas free(dtds); 47213faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas goto fail; 47223faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas } 47231d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas lengths = malloc(plen * sizeof(int *)); 47241d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas if (!lengths) { 47251d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas free(dtds); 47261d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas free(vals); 47271d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas goto fail; 47281d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas } 47293faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas for (r = p->data, j = 0; r; r = r->next, j++) { 47303faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas sdp_data_t *data = (sdp_data_t*)r->data; 47313faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas dtds[j] = &data->dtd; 47321d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas switch (data->dtd) { 47331d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas case SDP_URL_STR8: 47341d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas case SDP_URL_STR16: 47351d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas case SDP_TEXT_STR8: 47361d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas case SDP_TEXT_STR16: 47371d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas vals[j] = data->val.str; 47381d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas lengths[j] = data->unitSize - sizeof(uint8_t); 47391d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas break; 47401d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas case SDP_ALT8: 47411d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas case SDP_ALT16: 47421d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas case SDP_ALT32: 47431d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas case SDP_SEQ8: 47441d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas case SDP_SEQ16: 47451d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas case SDP_SEQ32: 47461d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas vals[j] = data->val.dataseq; 47471d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas lengths[j] = 0; 47481d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas break; 47491d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas default: 47501d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas vals[j] = &data->val; 47511d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas lengths[j] = 0; 47521d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas break; 47531d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas } 47543faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas } 47551d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas feat = sdp_seq_alloc_with_length(dtds, vals, lengths, plen); 47563faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas free(dtds); 47573faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas free(vals); 47581d1154156df28660e41031df5c3f1ffe91c01aaeJosé Antonio Santos Cadenas free(lengths); 47593faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas if (!feat) 47603faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas goto fail; 47613faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas seqDTDs[i] = &feat->dtd; 47623faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas seqVals[i] = feat; 47633faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas } 47643faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas seq_feat = sdp_seq_alloc(seqDTDs, seqVals, seqlen); 47653faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas if (!seq_feat) 47663faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas goto fail; 47673faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas sdp_attr_replace(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST, seq_feat); 47683faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas 47693faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas free(seqVals); 47703faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas free(seqDTDs); 47713faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas return 0; 47723faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas 47733faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenasfail: 47743faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas free(seqVals); 47753faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas free(seqDTDs); 47763faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas return -1; 47773faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas} 47783faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas 47793faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas/* 47803faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas * Get the supported features 47813faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas * If an error occurred -1 is returned and errno is set 47823faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas */ 47833faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenasint sdp_get_supp_feat(const sdp_record_t *rec, sdp_list_t **seqp) 47843faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas{ 47853faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas sdp_data_t *sdpdata, *d; 47863faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas sdp_list_t *tseq; 47873faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas tseq = NULL; 47883faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas 47893faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas sdpdata = sdp_data_get(rec, SDP_ATTR_SUPPORTED_FEATURES_LIST); 47903faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas 47913faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas if (!sdpdata || sdpdata->dtd < SDP_SEQ8 || sdpdata->dtd > SDP_SEQ32) 47923faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas return sdp_get_uuidseq_attr(rec, 4793d108edd5cd7115ced6fc3c1a9bc2b975abdfc4e2Marcel Holtmann SDP_ATTR_SUPPORTED_FEATURES_LIST, seqp); 47943faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas 47953faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas for (d = sdpdata->val.dataseq; d; d = d->next) { 47963faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas sdp_data_t *dd; 47973faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas sdp_list_t *subseq; 47983faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas 47993faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas if (d->dtd < SDP_SEQ8 || d->dtd > SDP_SEQ32) 48003faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas goto fail; 48013faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas subseq = NULL; 48023faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas for (dd = d->val.dataseq; dd; dd = dd->next) { 48033faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas sdp_data_t *data; 48043faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas if (dd->dtd != SDP_UINT8 && dd->dtd != SDP_UINT16 && 48053faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas dd->dtd != SDP_TEXT_STR8) 48063faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas goto fail; 48073faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas data = sdp_data_alloc(dd->dtd, &dd->val); 48083faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas if (data) 48093faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas subseq = sdp_list_append(subseq, data); 48103faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas } 48113faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas tseq = sdp_list_append(tseq, subseq); 48123faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas } 48133faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas *seqp = tseq; 48143faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas return 0; 48153faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas 48163faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenasfail: 48173faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas while (tseq) { 48183faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas sdp_list_t * next; 48193faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas 48203faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas next = tseq->next; 48213faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas sdp_list_free(tseq, free); 48223faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas tseq = next; 48233faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas } 48243faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas errno = EINVAL; 48253faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas return -1; 48263faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas} 48273faf12fdb7f9d7a043ad526e8e8d1788d4956a4bJosé Antonio Santos Cadenas 4828