sdp.h revision 226426
11558Srgrimes/*
293492Sphk * sdp.h
393492Sphk *
493492Sphk * Copyright (c) 2001-2003 Maksim Yevmenkin <m_evmenkin@yahoo.com>
51558Srgrimes * All rights reserved.
693492Sphk *
793492Sphk * Redistribution and use in source and binary forms, with or without
893492Sphk * modification, are permitted provided that the following conditions
993492Sphk * are met:
1093492Sphk * 1. Redistributions of source code must retain the above copyright
111558Srgrimes *    notice, this list of conditions and the following disclaimer.
121558Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
131558Srgrimes *    notice, this list of conditions and the following disclaimer in the
141558Srgrimes *    documentation and/or other materials provided with the distribution.
151558Srgrimes *
161558Srgrimes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
171558Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
181558Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1993492Sphk * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2093492Sphk * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2193492Sphk * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
221558Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2393492Sphk * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
241558Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
251558Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2693492Sphk * SUCH DAMAGE.
271558Srgrimes *
281558Srgrimes * $Id: sdp.h,v 1.3 2003/09/05 00:33:59 max Exp $
291558Srgrimes * $FreeBSD: head/lib/libsdp/sdp.h 226426 2011-10-16 08:45:16Z ed $
301558Srgrimes */
311558Srgrimes
321558Srgrimes#ifndef _SDP_H_
331558Srgrimes#define _SDP_H_
3496049Sfenner
3596049Sfenner__BEGIN_DECLS
3696049Sfenner
3796049Sfenner/*
3896049Sfenner * Data representation (page 349)
3996049Sfenner */
4096049Sfenner
4196049Sfenner/* Nil, the null type */
4296049Sfenner#define SDP_DATA_NIL					0x00
4396049Sfenner
4496049Sfenner/* Unsigned integer */
4596049Sfenner#define SDP_DATA_UINT8					0x08
4696049Sfenner#define SDP_DATA_UINT16					0x09
4796049Sfenner#define SDP_DATA_UINT32					0x0A
4896049Sfenner#define SDP_DATA_UINT64					0x0B
4996049Sfenner#define SDP_DATA_UINT128				0x0C
5096049Sfenner
5196049Sfenner/* Signed two's-complement integer */
5296049Sfenner#define SDP_DATA_INT8					0x10
5396049Sfenner#define SDP_DATA_INT16					0x11
5496049Sfenner#define SDP_DATA_INT32					0x12
5596049Sfenner#define SDP_DATA_INT64					0x13
5696049Sfenner#define SDP_DATA_INT128					0x14
5796049Sfenner
5896049Sfenner/* UUID, a universally unique identifier */
5996049Sfenner#define SDP_DATA_UUID16					0x19
6096049Sfenner#define SDP_DATA_UUID32					0x1A
6196049Sfenner#define SDP_DATA_UUID128				0x1C
6296049Sfenner
6396049Sfenner/* Text string */
6496049Sfenner#define SDP_DATA_STR8					0x25
651558Srgrimes#define SDP_DATA_STR16					0x26
661558Srgrimes#define SDP_DATA_STR32					0x27
6795183Scharnier
6895183Scharnier/* Boolean */
6995183Scharnier#define SDP_DATA_BOOL					0x28
7096049Sfenner
7194580Smarcel/*
7294580Smarcel * Data element sequence.
7396025Smux * A data element whose data field is a sequence of data elements
7496025Smux */
7594580Smarcel#define SDP_DATA_SEQ8					0x35
7694580Smarcel#define SDP_DATA_SEQ16					0x36
7793492Sphk#define SDP_DATA_SEQ32					0x37
7893492Sphk
7996025Smux/*
8096049Sfenner * Data element alternative.
8194580Smarcel * A data element whose data field is a sequence of data elements from
8294580Smarcel * which one data element is to be selected.
8394580Smarcel */
8496049Sfenner#define SDP_DATA_ALT8					0x3D
8593492Sphk#define SDP_DATA_ALT16					0x3E
8693492Sphk#define SDP_DATA_ALT32					0x3F
871558Srgrimes
8897746Smarcel/* URL, a uniform resource locator */
8997746Smarcel#define SDP_DATA_URL8					0x45
9097746Smarcel#define SDP_DATA_URL16					0x46
91142359Sobrien#define SDP_DATA_URL32					0x47
92142359Sobrien
93142359Sobrien/*
94142359Sobrien * Protocols UUID (short) https://www.bluetooth.org/assigned-numbers/service_discovery.php
95133814Sru * BASE UUID 00000000-0000-1000-8000-00805F9B34FB
96133814Sru */
9794580Smarcel
9896049Sfenner#define SDP_UUID_PROTOCOL_SDP				0x0001
9996049Sfenner#define SDP_UUID_PROTOCOL_UDP				0x0002
10093492Sphk#define SDP_UUID_PROTOCOL_RFCOMM			0x0003
10194580Smarcel#define SDP_UUID_PROTOCOL_TCP				0x0004
102142359Sobrien#define SDP_UUID_PROTOCOL_TCS_BIN			0x0005
1031558Srgrimes#define SDP_UUID_PROTOCOL_TCS_AT			0x0006
10493717Smarcel#define SDP_UUID_PROTOCOL_OBEX				0x0008
10593492Sphk#define SDP_UUID_PROTOCOL_IP				0x0009
106142359Sobrien#define SDP_UUID_PROTOCOL_FTP				0x000A
1071558Srgrimes#define SDP_UUID_PROTOCOL_HTTP				0x000C
108142359Sobrien#define SDP_UUID_PROTOCOL_WSP				0x000E
10993492Sphk#define SDP_UUID_PROTOCOL_BNEP				0x000F
110142359Sobrien#define SDP_UUID_PROTOCOL_UPNP				0x0010
11193717Smarcel#define SDP_UUID_PROTOCOL_HIDP				0x0011
112142359Sobrien#define SDP_UUID_PROTOCOL_HARDCOPY_CONTROL_CHANNEL	0x0012
11393717Smarcel#define SDP_UUID_PROTOCOL_HARDCOPY_DATA_CHANNEL		0x0014
11493717Smarcel#define SDP_UUID_PROTOCOL_HARDCOPY_NOTIFICATION		0x0016
11593717Smarcel#define SDP_UUID_PROTOCOL_AVCTP				0x0017
11693492Sphk#define SDP_UUID_PROTOCOL_AVDTP				0x0019
11793492Sphk#define SDP_UUID_PROTOCOL_CMPT				0x001B
118142359Sobrien#define SDP_UUID_PROTOCOL_UDI_C_PLANE			0x001D
119142359Sobrien#define SDP_UUID_PROTOCOL_L2CAP				0x0100
120142359Sobrien
121142359Sobrien/*
12296049Sfenner * Service class IDs https://www.bluetooth.org/assigned-numbers/service_discovery.php
123142359Sobrien */
124142359Sobrien
125142359Sobrien#define SDP_SERVICE_CLASS_SERVICE_DISCOVERY_SERVER	0x1000
126142359Sobrien#define SDP_SERVICE_CLASS_BROWSE_GROUP_DESCRIPTOR	0x1001
127142359Sobrien#define SDP_SERVICE_CLASS_PUBLIC_BROWSE_GROUP		0x1002
128142359Sobrien#define SDP_SERVICE_CLASS_SERIAL_PORT			0x1101
129142359Sobrien#define SDP_SERVICE_CLASS_LAN_ACCESS_USING_PPP		0x1102
130142359Sobrien#define SDP_SERVICE_CLASS_DIALUP_NETWORKING		0x1103
131142359Sobrien#define SDP_SERVICE_CLASS_IR_MC_SYNC			0x1104
132142359Sobrien#define SDP_SERVICE_CLASS_OBEX_OBJECT_PUSH		0x1105
133142359Sobrien#define SDP_SERVICE_CLASS_OBEX_FILE_TRANSFER		0x1106
134142359Sobrien#define SDP_SERVICE_CLASS_IR_MC_SYNC_COMMAND		0x1107
13595039Sphk#define SDP_SERVICE_CLASS_HEADSET			0x1108
1361558Srgrimes#define SDP_SERVICE_CLASS_CORDLESS_TELEPHONY		0x1109
1371558Srgrimes#define SDP_SERVICE_CLASS_AUDIO_SOURCE			0x110A
13896049Sfenner#define SDP_SERVICE_CLASS_AUDIO_SINK			0x110B
13996049Sfenner#define SDP_SERVICE_CLASS_AV_REMOTE_CONTROL_TARGET	0x110C
14096049Sfenner#define SDP_SERVICE_CLASS_ADVANCED_AUDIO_DISTRIBUTION	0x110D
14196049Sfenner#define SDP_SERVICE_CLASS_AV_REMOTE_CONTROL		0x110E
14296049Sfenner#define SDP_SERVICE_CLASS_VIDEO_CONFERENCING		0x110F
14396049Sfenner#define SDP_SERVICE_CLASS_INTERCOM			0x1110
14496049Sfenner#define SDP_SERVICE_CLASS_FAX				0x1111
14596049Sfenner#define SDP_SERVICE_CLASS_HEADSET_AUDIO_GATEWAY		0x1112
14696049Sfenner#define SDP_SERVICE_CLASS_WAP				0x1113
14796049Sfenner#define SDP_SERVICE_CLASS_WAP_CLIENT			0x1114
14896049Sfenner#define SDP_SERVICE_CLASS_PANU				0x1115
14996049Sfenner#define SDP_SERVICE_CLASS_NAP				0x1116
15096049Sfenner#define SDP_SERVICE_CLASS_GN				0x1117
15196049Sfenner#define SDP_SERVICE_CLASS_DIRECT_PRINTING		0x1118
15296049Sfenner#define SDP_SERVICE_CLASS_REFERENCE_PRINTING		0x1119
15396049Sfenner#define SDP_SERVICE_CLASS_IMAGING			0x111A
15496049Sfenner#define SDP_SERVICE_CLASS_IMAGING_RESPONDER		0x111B
15596049Sfenner#define SDP_SERVICE_CLASS_IMAGING_AUTOMATIC_ARCHIVE	0x111C
15696049Sfenner#define SDP_SERVICE_CLASS_IMAGING_REFERENCED_OBJECTS	0x111D
15796049Sfenner#define SDP_SERVICE_CLASS_HANDSFREE			0x111E
15896049Sfenner#define SDP_SERVICE_CLASS_HANDSFREE_AUDIO_GATEWAY	0x111F
15996049Sfenner#define SDP_SERVICE_CLASS_DIRECT_PRINTING_REFERENCE_OBJECTS	0x1120
16096049Sfenner#define SDP_SERVICE_CLASS_REFLECTED_UI			0x1121
16196049Sfenner#define SDP_SERVICE_CLASS_BASIC_PRINTING		0x1122
16296049Sfenner#define SDP_SERVICE_CLASS_PRINTING_STATUS		0x1123
16396049Sfenner#define SDP_SERVICE_CLASS_HUMAN_INTERFACE_DEVICE	0x1124
16496049Sfenner#define SDP_SERVICE_CLASS_HARDCOPY_CABLE_REPLACEMENT	0x1125
16596049Sfenner#define SDP_SERVICE_CLASS_HCR_PRINT			0x1126
16696049Sfenner#define SDP_SERVICE_CLASS_HCR_SCAN			0x1127
16796049Sfenner#define SDP_SERVICE_CLASS_COMMON_ISDN_ACCESS		0x1128
16896049Sfenner#define SDP_SERVICE_CLASS_VIDEO_CONFERENCING_GW		0x1129
16996049Sfenner#define SDP_SERVICE_CLASS_UDI_MT			0x112A
17096049Sfenner#define SDP_SERVICE_CLASS_UDI_TA			0x112B
17196049Sfenner#define SDP_SERVICE_CLASS_AUDIO_VIDEO			0x112C
17296049Sfenner#define SDP_SERVICE_CLASS_SIM_ACCESS			0x112D
17396049Sfenner#define SDP_SERVICE_CLASS_PHONEBOOK_ACCESS_PCE		0x112E
17496049Sfenner#define SDP_SERVICE_CLASS_PHONEBOOK_ACCESS_PSE		0x112F
17596049Sfenner#define SDP_SERVICE_CLASS_PHONEBOOK_ACCESS		0x1130
17696049Sfenner#define SDP_SERVICE_CLASS_PNP_INFORMATION		0x1200
17796049Sfenner#define SDP_SERVICE_CLASS_GENERIC_NETWORKING		0x1201
17896049Sfenner#define SDP_SERVICE_CLASS_GENERIC_FILE_TRANSFER		0x1202
17996025Smux#define SDP_SERVICE_CLASS_GENERIC_AUDIO			0x1203
18096025Smux#define SDP_SERVICE_CLASS_GENERIC_TELEPHONY		0x1204
18196025Smux#define SDP_SERVICE_CLASS_UPNP				0x1205
18296025Smux#define SDP_SERVICE_CLASS_UPNP_IP			0x1206
18396025Smux#define SDP_SERVICE_CLASS_ESDP_UPNP_IP_PAN		0x1300
18496025Smux#define SDP_SERVICE_CLASS_ESDP_UPNP_IP_LAP		0x1301
18596025Smux#define SDP_SERVICE_CLASS_ESDP_UPNP_L2CAP		0x1302
18696025Smux#define SDP_SERVICE_CLASS_VIDEO_SOURCE			0x1303
18796049Sfenner#define SDP_SERVICE_CLASS_VIDEO_SINK			0x1304
18896025Smux#define SDP_SERVICE_CLASS_VIDEO_DISTRIBUTION		0x1305
18996025Smux
19093717Smarcel/*
19196049Sfenner * Universal attribute definitions (page 366) and
19296049Sfenner * https://www.bluetooth.org/assigned-numbers/service_discovery.php
19396049Sfenner */
19496049Sfenner
19596025Smux#define SDP_ATTR_RANGE(lo, hi) \
19696025Smux	(uint32_t)(((uint16_t)(lo) << 16) | ((uint16_t)(hi)))
19796025Smux
19896025Smux#define SDP_ATTR_SERVICE_RECORD_HANDLE			0x0000
19996025Smux#define SDP_ATTR_SERVICE_CLASS_ID_LIST			0x0001
20096025Smux#define SDP_ATTR_SERVICE_RECORD_STATE			0x0002
20196025Smux#define SDP_ATTR_SERVICE_ID				0x0003
20296025Smux#define SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST		0x0004
20396025Smux#define SDP_ATTR_BROWSE_GROUP_LIST			0x0005
20496025Smux#define SDP_ATTR_LANGUAGE_BASE_ATTRIBUTE_ID_LIST	0x0006
20596025Smux#define SDP_ATTR_SERVICE_INFO_TIME_TO_LIVE		0x0007
20696025Smux#define SDP_ATTR_SERVICE_AVAILABILITY			0x0008
20796025Smux#define SDP_ATTR_BLUETOOTH_PROFILE_DESCRIPTOR_LIST	0x0009
20896025Smux#define SDP_ATTR_DOCUMENTATION_URL			0x000A
20996049Sfenner#define SDP_ATTR_CLIENT_EXECUTABLE_URL			0x000B
21096025Smux#define SDP_ATTR_ICON_URL				0x000C
21196049Sfenner#define SDP_ATTR_ADDITIONAL_PROTOCOL_DESCRIPTOR_LISTS	0x000D
21296049Sfenner#define SDP_ATTR_GROUP_ID				0x0200
21396025Smux#define SDP_ATTR_IP_SUBNET				0x0200
21496025Smux#define SDP_ATTR_VERSION_NUMBER_LIST			0x0200
21596025Smux#define SDP_ATTR_SERVICE_DATABASE_STATE			0x0201
21696025Smux#define SDP_ATTR_SERVICE_VERSION			0x0300
21796025Smux#define SDP_ATTR_EXTERNAL_NETWORK			0x0301
21896049Sfenner#define SDP_ATTR_NETWORK				0x0301
21996049Sfenner#define SDP_ATTR_SUPPORTED_DATA_STORES_LIST		0x0301
22096025Smux#define SDP_ATTR_FAX_CLASS1_SUPPORT			0x0302
22196025Smux#define SDP_ATTR_REMOTE_AUDIO_VOLUME_CONTROL		0x0302
22296025Smux#define SDP_ATTR_FAX_CLASS20_SUPPORT			0x0303
22396049Sfenner#define SDP_ATTR_SUPPORTED_FORMATS_LIST			0x0303
22496049Sfenner#define SDP_ATTR_FAX_CLASS2_SUPPORT			0x0304
22596025Smux#define SDP_ATTR_AUDIO_FEEDBACK_SUPPORT			0x0305
22693492Sphk#define SDP_ATTR_NETWORK_ADDRESS			0x0306
22796025Smux#define SDP_ATTR_WAP_GATEWAY				0x0307
2281558Srgrimes#define SDP_ATTR_HOME_PAGE_URL				0x0308
22997340Smarcel#define SDP_ATTR_WAP_STACK_TYPE				0x0309
23094580Smarcel#define SDP_ATTR_SECURITY_DESCRIPTION			0x030A
23196049Sfenner#define SDP_ATTR_NET_ACCESS_TYPE			0x030B
23296049Sfenner#define SDP_ATTR_MAX_NET_ACCESS_RATE			0x030C
23396049Sfenner#define SDP_ATTR_IPV4_SUBNET				0x030D
234139975Sdelphij#define SDP_ATTR_IPV6_SUBNET				0x030E
235142359Sobrien#define SDP_ATTR_SUPPORTED_CAPABALITIES			0x0310
23694580Smarcel#define SDP_ATTR_SUPPORTED_FEATURES			0x0311
23796049Sfenner#define SDP_ATTR_SUPPORTED_FUNCTIONS			0x0312
2388871Srgrimes#define SDP_ATTR_TOTAL_IMAGING_DATA_CAPACITY		0x0313
239142359Sobrien#define SDP_ATTR_SUPPORTED_REPOSITORIES			0x0314
24096049Sfenner
24196049Sfenner/*
242142359Sobrien * The offset must be added to the attribute ID base (contained in the
24396049Sfenner * LANGUAGE_BASE_ATTRIBUTE_ID_LIST attribute) in order to compute the
24497340Smarcel * attribute ID for these attributes.
24597746Smarcel */
24697340Smarcel
24797340Smarcel#define SDP_ATTR_PRIMARY_LANGUAGE_BASE_ID		0x0100
24897340Smarcel#define SDP_ATTR_SERVICE_NAME_OFFSET			0x0000
24997340Smarcel#define SDP_ATTR_SERVICE_DESCRIPTION_OFFSET		0x0001
25097340Smarcel#define SDP_ATTR_PROVIDER_NAME_OFFSET			0x0002
25197340Smarcel
25294580Smarcel/*
25396049Sfenner * Protocol data unit (PDU) format (page 352)
25494580Smarcel */
25594580Smarcel
25693492Sphk#define SDP_PDU_ERROR_RESPONSE				0x01
25796049Sfenner#define SDP_PDU_SERVICE_SEARCH_REQUEST			0x02
25893492Sphk#define SDP_PDU_SERVICE_SEARCH_RESPONSE			0x03
25947095Sluoqi#define SDP_PDU_SERVICE_ATTRIBUTE_REQUEST		0x04
26097340Smarcel#define SDP_PDU_SERVICE_ATTRIBUTE_RESPONSE		0x05
26193492Sphk#define SDP_PDU_SERVICE_SEARCH_ATTRIBUTE_REQUEST	0x06
26293492Sphk#define SDP_PDU_SERVICE_SEARCH_ATTRIBUTE_RESPONSE	0x07
26393492Sphk
26493492Sphkstruct sdp_pdu {
26596049Sfenner	uint8_t		pid;	/* PDU ID - SDP_PDU_xxx */
26696049Sfenner	uint16_t	tid;	/* transaction ID */
26794580Smarcel	uint16_t	len;	/* parameters length (in bytes) */
2681558Srgrimes} __attribute__ ((packed));
26994580Smarceltypedef struct sdp_pdu		sdp_pdu_t;
27094580Smarceltypedef struct sdp_pdu *	sdp_pdu_p;
27196049Sfenner
27296049Sfenner/*
27394580Smarcel * Error codes for SDP_PDU_ERROR_RESPONSE
27494580Smarcel */
27593492Sphk
27693492Sphk#define SDP_ERROR_CODE_INVALID_SDP_VERSION		0x0001
27793492Sphk#define SDP_ERROR_CODE_INVALID_SERVICE_RECORD_HANDLE	0x0002
27893492Sphk#define SDP_ERROR_CODE_INVALID_REQUEST_SYNTAX		0x0003
27996049Sfenner#define SDP_ERROR_CODE_INVALID_PDU_SIZE			0x0004
28096049Sfenner#define SDP_ERROR_CODE_INVALID_CONTINUATION_STATE	0x0005
28194580Smarcel#define SDP_ERROR_CODE_INSUFFICIENT_RESOURCES		0x0006
28294580Smarcel
2831558Srgrimes/*
28493492Sphk * SDP int128/uint128 parameter
28594580Smarcel */
28696049Sfenner
28794580Smarcelstruct int128 {
28896049Sfenner	int8_t	b[16];
289142359Sobrien};
29096049Sfennertypedef struct int128	int128_t;
29196049Sfennertypedef struct int128	uint128_t;
29296049Sfenner
29396049Sfenner/*
29496049Sfenner * SDP attribute
29596049Sfenner */
29696049Sfenner
29796049Sfennerstruct sdp_attr {
29896049Sfenner	uint16_t	 flags;
29996049Sfenner#define SDP_ATTR_OK		(0 << 0)
30096049Sfenner#define SDP_ATTR_INVALID	(1 << 0)
30196049Sfenner#define SDP_ATTR_TRUNCATED	(1 << 1)
30296049Sfenner	uint16_t	 attr;  /* SDP_ATTR_xxx */
3031558Srgrimes	uint32_t	 vlen;	/* length of the value[] in bytes */
30493717Smarcel	uint8_t		*value;	/* base pointer */
30596049Sfenner};
30696049Sfennertypedef struct sdp_attr		sdp_attr_t;
30794580Smarceltypedef struct sdp_attr *	sdp_attr_p;
308142359Sobrien
309142359Sobrien/******************************************************************************
310142359Sobrien * User interface
311142359Sobrien *****************************************************************************/
31266429Sdes
31394580Smarcel/* Inline versions of get/put byte/short/long. Pointer is advanced */
31494580Smarcel#define SDP_GET8(b, cp) { \
31594580Smarcel	const uint8_t *t_cp = (const uint8_t *)(cp); \
31694580Smarcel	(b) = *t_cp; \
31794580Smarcel	(cp) ++; \
31894580Smarcel}
31996049Sfenner
32096049Sfenner#define SDP_GET16(s, cp) { \
32196025Smux	const uint8_t *t_cp = (const uint8_t *)(cp); \
322142359Sobrien	(s) = ((uint16_t)t_cp[0] << 8) \
323142359Sobrien	    | ((uint16_t)t_cp[1]) \
324142359Sobrien	    ; \
32594580Smarcel	(cp) += 2; \
32693717Smarcel}
32793717Smarcel
32893492Sphk#define SDP_GET32(l, cp) { \
32993492Sphk	const uint8_t *t_cp = (const uint8_t *)(cp); \
33093492Sphk	(l) = ((uint32_t)t_cp[0] << 24) \
33196049Sfenner	    | ((uint32_t)t_cp[1] << 16) \
33296049Sfenner	    | ((uint32_t)t_cp[2] << 8) \
33394580Smarcel	    | ((uint32_t)t_cp[3]) \
33496025Smux	    ; \
33594580Smarcel	(cp) += 4; \
3361558Srgrimes}
337142359Sobrien
338142359Sobrien#define SDP_GET64(l, cp) { \
339142359Sobrien	register uint8_t *t_cp = (uint8_t *)(cp); \
340142359Sobrien	(l) = ((uint64_t)t_cp[0] << 56) \
341142359Sobrien	    | ((uint64_t)t_cp[1] << 48) \
342142359Sobrien	    | ((uint64_t)t_cp[2] << 40) \
343142359Sobrien	    | ((uint64_t)t_cp[3] << 32) \
344142359Sobrien	    | ((uint64_t)t_cp[4] << 24) \
345142359Sobrien	    | ((uint64_t)t_cp[5] << 16) \
346142359Sobrien	    | ((uint64_t)t_cp[6] << 8) \
34793492Sphk	    | ((uint64_t)t_cp[7]) \
34896049Sfenner	    ; \
34996049Sfenner	(cp) += 8; \
35096025Smux}
351142359Sobrien
352142359Sobrien#if BYTE_ORDER == LITTLE_ENDIAN
353142359Sobrien#define SDP_GET128(l, cp) { \
354142359Sobrien	register uint8_t *t_cp = (uint8_t *)(cp); \
355142359Sobrien	(l)->b[15] = *t_cp++; \
35666429Sdes	(l)->b[14] = *t_cp++; \
35794580Smarcel	(l)->b[13] = *t_cp++; \
358119734Sdougb	(l)->b[12] = *t_cp++; \
359119734Sdougb	(l)->b[11] = *t_cp++; \
360119734Sdougb	(l)->b[10] = *t_cp++; \
361119734Sdougb	(l)->b[9]  = *t_cp++; \
362119734Sdougb	(l)->b[8]  = *t_cp++; \
363119734Sdougb	(l)->b[7]  = *t_cp++; \
36496049Sfenner	(l)->b[6]  = *t_cp++; \
36596049Sfenner	(l)->b[5]  = *t_cp++; \
36696049Sfenner	(l)->b[4]  = *t_cp++; \
36796049Sfenner	(l)->b[3]  = *t_cp++; \
36894580Smarcel	(l)->b[2]  = *t_cp++; \
36996049Sfenner	(l)->b[1]  = *t_cp++; \
37096049Sfenner	(l)->b[0]  = *t_cp++; \
37196025Smux	(cp) += 16; \
37296025Smux}
37396025Smux
37496025Smux#define SDP_GET_UUID128(l, cp) { \
37596049Sfenner	register uint8_t *t_cp = (uint8_t *)(cp); \
37696049Sfenner	(l)->b[0]  = *t_cp++; \
37796049Sfenner	(l)->b[1]  = *t_cp++; \
37894580Smarcel	(l)->b[2]  = *t_cp++; \
379142359Sobrien	(l)->b[3]  = *t_cp++; \
38094580Smarcel	(l)->b[4]  = *t_cp++; \
38194580Smarcel	(l)->b[5]  = *t_cp++; \
38293492Sphk	(l)->b[6]  = *t_cp++; \
38396049Sfenner	(l)->b[7]  = *t_cp++; \
38496025Smux	(l)->b[8]  = *t_cp++; \
38594580Smarcel	(l)->b[9]  = *t_cp++; \
3861558Srgrimes	(l)->b[10] = *t_cp++; \
38796049Sfenner	(l)->b[11] = *t_cp++; \
38896049Sfenner	(l)->b[12] = *t_cp++; \
38996049Sfenner	(l)->b[13] = *t_cp++; \
39096049Sfenner	(l)->b[14] = *t_cp++; \
39196049Sfenner	(l)->b[15] = *t_cp++; \
39296049Sfenner	(cp) += 16; \
39396049Sfenner}
39496049Sfenner#elif BYTE_ORDER == BIG_ENDIAN
39596049Sfenner#define SDP_GET128(l, cp) { \
39696049Sfenner	register uint8_t *t_cp = (uint8_t *)(cp); \
39794580Smarcel	(l)->b[0]  = *t_cp++; \
39896025Smux	(l)->b[1]  = *t_cp++; \
39994580Smarcel	(l)->b[2]  = *t_cp++; \
40093492Sphk	(l)->b[3]  = *t_cp++; \
40196049Sfenner	(l)->b[4]  = *t_cp++; \
40296049Sfenner	(l)->b[5]  = *t_cp++; \
40393492Sphk	(l)->b[6]  = *t_cp++; \
40494580Smarcel	(l)->b[7]  = *t_cp++; \
40594580Smarcel	(l)->b[8]  = *t_cp++; \
406142359Sobrien	(l)->b[9]  = *t_cp++; \
40794580Smarcel	(l)->b[10] = *t_cp++; \
408142359Sobrien	(l)->b[11] = *t_cp++; \
40996049Sfenner	(l)->b[12] = *t_cp++; \
41094580Smarcel	(l)->b[13] = *t_cp++; \
41196049Sfenner	(l)->b[14] = *t_cp++; \
41296049Sfenner	(l)->b[15] = *t_cp++; \
41394580Smarcel	(cp) += 16; \
41493492Sphk}
41597746Smarcel
41693492Sphk#define	SDP_GET_UUID128(l, cp)	SDP_GET128(l, cp)
41793492Sphk#else
41896049Sfenner#error	"Unsupported BYTE_ORDER"
41996049Sfenner#endif /* BYTE_ORDER */
42096049Sfenner
42196049Sfenner#define SDP_PUT8(b, cp) { \
42296049Sfenner	register uint8_t t_b = (uint8_t)(b); \
42396049Sfenner	register uint8_t *t_cp = (uint8_t *)(cp); \
42496049Sfenner	*t_cp = t_b; \
42596025Smux	(cp) ++; \
42694580Smarcel}
42767264Sdes
42896049Sfenner#define SDP_PUT16(s, cp) { \
42996049Sfenner	register uint16_t t_s = (uint16_t)(s); \
43096049Sfenner	register uint8_t *t_cp = (uint8_t *)(cp); \
43196049Sfenner	*t_cp++ = t_s >> 8; \
43296049Sfenner	*t_cp   = t_s; \
43396049Sfenner	(cp) += 2; \
43496049Sfenner}
43596049Sfenner
43696049Sfenner#define SDP_PUT32(l, cp) { \
43796049Sfenner	register uint32_t t_l = (uint32_t)(l); \
43896049Sfenner	register uint8_t *t_cp = (uint8_t *)(cp); \
43996049Sfenner	*t_cp++ = t_l >> 24; \
44096049Sfenner	*t_cp++ = t_l >> 16; \
44196049Sfenner	*t_cp++ = t_l >> 8; \
44296049Sfenner	*t_cp   = t_l; \
44396049Sfenner	(cp) += 4; \
44496049Sfenner}
44596049Sfenner
44696049Sfenner#define SDP_PUT64(l, cp) { \
44796049Sfenner	register uint64_t t_l = (uint64_t)(l); \
44896049Sfenner	register uint8_t *t_cp = (uint8_t *)(cp); \
44996049Sfenner	*t_cp++ = t_l >> 56; \
45096049Sfenner	*t_cp++ = t_l >> 48; \
45196049Sfenner	*t_cp++ = t_l >> 40; \
45296049Sfenner	*t_cp++ = t_l >> 32; \
45396049Sfenner	*t_cp++ = t_l >> 24; \
45496049Sfenner	*t_cp++ = t_l >> 16; \
45596049Sfenner	*t_cp++ = t_l >> 8; \
45696049Sfenner	*t_cp   = t_l; \
45796049Sfenner	(cp) += 8; \
45896049Sfenner}
45996049Sfenner
46096049Sfenner#if BYTE_ORDER == LITTLE_ENDIAN
46196049Sfenner#define SDP_PUT128(l, cp) { \
46296049Sfenner	register uint8_t *t_cp = (uint8_t *)(cp); \
463126042Stjr	*t_cp++ = (l)->b[15]; \
46496049Sfenner	*t_cp++ = (l)->b[14]; \
46596049Sfenner	*t_cp++ = (l)->b[13]; \
46696049Sfenner	*t_cp++ = (l)->b[12]; \
46796049Sfenner	*t_cp++ = (l)->b[11]; \
46896049Sfenner	*t_cp++ = (l)->b[10]; \
46996049Sfenner	*t_cp++ = (l)->b[9];  \
47096049Sfenner	*t_cp++ = (l)->b[8];  \
47196049Sfenner	*t_cp++ = (l)->b[7];  \
47296025Smux	*t_cp++ = (l)->b[6];  \
47394580Smarcel	*t_cp++ = (l)->b[5];  \
47493492Sphk	*t_cp++ = (l)->b[4];  \
47596049Sfenner	*t_cp++ = (l)->b[3];  \
47696049Sfenner	*t_cp++ = (l)->b[2];  \
47796103Smarcel	*t_cp++ = (l)->b[1];  \
47896049Sfenner	*t_cp   = (l)->b[0];  \
47996049Sfenner	(cp) += 16; \
48093492Sphk}
48167264Sdes
48296049Sfenner#define SDP_PUT_UUID128(l, cp) { \
48396049Sfenner	register uint8_t *t_cp = (uint8_t *)(cp); \
48496049Sfenner	*t_cp++ = (l)->b[0];  \
48596049Sfenner	*t_cp++ = (l)->b[1];  \
48696049Sfenner	*t_cp++ = (l)->b[2];  \
48796049Sfenner	*t_cp++ = (l)->b[3];  \
48896049Sfenner	*t_cp++ = (l)->b[4];  \
48996049Sfenner	*t_cp++ = (l)->b[5];  \
49096025Smux	*t_cp++ = (l)->b[6];  \
49194580Smarcel	*t_cp++ = (l)->b[7];  \
49294580Smarcel	*t_cp++ = (l)->b[8];  \
49396049Sfenner	*t_cp++ = (l)->b[9];  \
49494580Smarcel	*t_cp++ = (l)->b[10]; \
49596049Sfenner	*t_cp++ = (l)->b[11]; \
49694580Smarcel	*t_cp++ = (l)->b[12]; \
49794580Smarcel	*t_cp++ = (l)->b[13]; \
49896049Sfenner	*t_cp++ = (l)->b[14]; \
49996049Sfenner	*t_cp   = (l)->b[15]; \
50094580Smarcel	(cp) += 16; \
50194580Smarcel}
50294580Smarcel#elif BYTE_ORDER == BIG_ENDIAN
50396049Sfenner#define SDP_PUT128(l, cp) { \
50496049Sfenner	register uint8_t *t_cp = (uint8_t *)(cp); \
50594580Smarcel	*t_cp++ = (l)->b[0];  \
50694580Smarcel	*t_cp++ = (l)->b[1];  \
50794580Smarcel	*t_cp++ = (l)->b[2];  \
50894580Smarcel	*t_cp++ = (l)->b[3];  \
50996049Sfenner	*t_cp++ = (l)->b[4];  \
51096049Sfenner	*t_cp++ = (l)->b[5];  \
51194580Smarcel	*t_cp++ = (l)->b[6];  \
51296049Sfenner	*t_cp++ = (l)->b[7];  \
51394580Smarcel	*t_cp++ = (l)->b[8];  \
5141558Srgrimes	*t_cp++ = (l)->b[9];  \
5151558Srgrimes	*t_cp++ = (l)->b[10]; \
51693492Sphk	*t_cp++ = (l)->b[11]; \
51793492Sphk	*t_cp++ = (l)->b[12]; \
5181558Srgrimes	*t_cp++ = (l)->b[13]; \
519141611Sru	*t_cp++ = (l)->b[14]; \
520141611Sru	*t_cp   = (l)->b[15]; \
521141611Sru	(cp) += 16; \
522141611Sru}
52393492Sphk
5241558Srgrimes#define SDP_PUT_UUID128(l, cp)	SDP_PUT128(l, cp)
5251558Srgrimes#else
52618914Sfenner#error	"Unsupported BYTE_ORDER"
52793492Sphk#endif /* BYTE_ORDER */
5281558Srgrimes
52993492Sphkvoid *             sdp_open       (bdaddr_t const *l, bdaddr_t const *r);
53093492Sphkvoid *             sdp_open_local (char const *control);
53196025Smuxint32_t            sdp_close      (void *xs);
5321558Srgrimesint32_t            sdp_error      (void *xs);
533142359Sobrien
534142359Sobrienint32_t            sdp_search     (void *xs,
535142359Sobrien                                   uint32_t plen, uint16_t const *pp,
53696049Sfenner                                   uint32_t alen, uint32_t const *ap,
53796049Sfenner                                   uint32_t vlen, sdp_attr_t *vp);
53896025Smux
53996049Sfennerchar const *	   sdp_attr2desc  (uint16_t attr);
54096049Sfennerchar const *	   sdp_uuid2desc  (uint16_t uuid);
54196049Sfennervoid               sdp_print      (uint32_t level, uint8_t const *start,
54296049Sfenner                                   uint8_t const *end);
543126347Smaxim
54493492Sphk/******************************************************************************
545119734Sdougb * sdpd interface and Bluetooth profiles data
546119734Sdougb *****************************************************************************/
547119734Sdougb
54893492Sphk#define SDP_LOCAL_PATH	"/var/run/sdp"
54994580Smarcel#define SDP_LOCAL_MTU	4096
55094580Smarcel
55194580Smarcel/*
55294580Smarcel * These are NOT defined in spec and only accepted on control sockets.
55394580Smarcel * The response to these request always will be SDP_PDU_ERROR_RESPONSE.
55493492Sphk * The first 2 bytes (after PDU header) is an error code (in network
555142359Sobrien * byte order). The rest of the data (pdu->len - 2) is a response data
55694580Smarcel * and depend on the request.
55793492Sphk *
55894580Smarcel * SDP_PDU_SERVICE_REGISTER_REQUEST
55994580Smarcel * 	pdu_header_t	hdr;
56096049Sfenner *	u_int16_t	uuid;	service class UUID (network byte order)
56196049Sfenner *	bdaddr_t	bdaddr;	local BD_ADDR (or ANY)
56296049Sfenner *	profile data[pdu->len - sizeof(uuid) - sizeof(bdaddr)]
56393492Sphk *
56493492Sphk * in successful reponse additional data will contain 4 bytes record handle
56593492Sphk *
56693492Sphk *
567119734Sdougb * SDP_PDU_SERVICE_UNREGISTER_REQUEST
568119734Sdougb *	pdu_header_t	hdr;
56993492Sphk *	u_int32_t	record_handle;	(network byte order)
57093492Sphk *
57193492Sphk * no additional data in response.
57293492Sphk *
57396049Sfenner *
57496049Sfenner * SDP_PDU_SERVICE_CHANGE_REQUEST
57596049Sfenner * 	pdu_header_t	hdr;
57696049Sfenner *	u_int32_t	record_handle;	(network byte order)
57796025Smux *	profile data[pdu->len - sizeof(record_handle)]
57893492Sphk *
57993492Sphk * no additional data in response.
5801558Srgrimes */
58193492Sphk
58293492Sphk#define SDP_PDU_SERVICE_REGISTER_REQUEST	0x81
58393492Sphk#define SDP_PDU_SERVICE_UNREGISTER_REQUEST	0x82
58493492Sphk#define SDP_PDU_SERVICE_CHANGE_REQUEST		0x83
58593492Sphk
58693492Sphkstruct sdp_dun_profile
58793492Sphk{
58893492Sphk	uint8_t	server_channel;
58996025Smux	uint8_t	audio_feedback_support;
59093492Sphk	uint8_t	reserved[2];
59193492Sphk};
59293492Sphktypedef struct sdp_dun_profile		sdp_dun_profile_t;
59396025Smuxtypedef struct sdp_dun_profile *	sdp_dun_profile_p;
5941558Srgrimes
59594580Smarcelstruct sdp_ftrn_profile
59694580Smarcel{
597119734Sdougb	uint8_t	server_channel;
598119734Sdougb	uint8_t	reserved[3];
599119734Sdougb};
600119734Sdougbtypedef struct sdp_ftrn_profile		sdp_ftrn_profile_t;
601119734Sdougbtypedef struct sdp_ftrn_profile *	sdp_ftrn_profile_p;
60296049Sfenner
603119734Sdougb/* Keep this in sync with sdp_opush_profile */
60496025Smuxstruct sdp_irmc_profile
60596025Smux{
60696049Sfenner	uint8_t	server_channel;
60796025Smux	uint8_t	supported_formats_size;
60896049Sfenner	uint8_t	supported_formats[30];
60996025Smux};
61094580Smarceltypedef struct sdp_irmc_profile		sdp_irmc_profile_t;
61193492Sphktypedef struct sdp_irmc_profile *	sdp_irmc_profile_p;
6121558Srgrimes
613struct sdp_irmc_command_profile
614{
615	uint8_t	server_channel;
616	uint8_t	reserved[3];
617};
618typedef struct sdp_irmc_command_profile		sdp_irmc_command_profile_t;
619typedef struct sdp_irmc_command_profile *	sdp_irmc_command_profile_p;
620
621struct sdp_lan_profile
622{
623	uint8_t		server_channel;
624	uint8_t		load_factor;
625	uint8_t		reserved;
626	uint8_t		ip_subnet_radius;
627	uint32_t	ip_subnet;
628};
629typedef struct sdp_lan_profile		sdp_lan_profile_t;
630typedef struct sdp_lan_profile *	sdp_lan_profile_p;
631
632/* Keep this in sync with sdp_irmc_profile */
633struct sdp_opush_profile
634{
635	uint8_t	server_channel;
636	uint8_t	supported_formats_size;
637	uint8_t	supported_formats[30];
638};
639typedef struct sdp_opush_profile	sdp_opush_profile_t;
640typedef struct sdp_opush_profile *	sdp_opush_profile_p;
641
642struct sdp_sp_profile
643{
644	uint8_t	server_channel;
645	uint8_t	reserved[3];
646};
647typedef struct sdp_sp_profile	sdp_sp_profile_t;
648typedef struct sdp_sp_profile *	sdp_sp_profile_p;
649
650struct sdp_nap_profile
651{
652	uint8_t		reserved;
653	uint8_t		load_factor;
654	uint16_t	psm;			/* HBO */
655	uint16_t	security_description;	/* HBO */
656	uint16_t	net_access_type;	/* HBO */
657	uint32_t	max_net_access_rate;	/* HBO */
658};
659typedef struct sdp_nap_profile		sdp_nap_profile_t;
660typedef struct sdp_nap_profile *	sdp_nap_profile_p;
661
662struct sdp_gn_profile
663{
664	uint8_t		reserved;
665	uint8_t		load_factor;
666	uint16_t	psm;			/* HBO */
667	uint16_t	security_description;	/* HBO */
668	uint16_t	reserved2;
669};
670typedef struct sdp_gn_profile		sdp_gn_profile_t;
671typedef struct sdp_gn_profile *		sdp_gn_profile_p;
672
673struct sdp_panu_profile
674{
675	uint8_t		reserved;
676	uint8_t		load_factor;
677	uint16_t	psm;			/* HBO */
678	uint16_t	security_description;	/* HBO */
679	uint16_t	reserved2;
680};
681typedef struct sdp_panu_profile		sdp_panu_profile_t;
682typedef struct sdp_panu_profile *	sdp_panu_profile_p;
683
684int32_t	sdp_register_service	(void *xss, uint16_t uuid,
685				 bdaddr_p const bdaddr, uint8_t const *data,
686				 uint32_t datalen, uint32_t *handle);
687int32_t	sdp_unregister_service	(void *xss, uint32_t handle);
688int32_t	sdp_change_service	(void *xss, uint32_t handle,
689				 uint8_t const *data, uint32_t datalen);
690
691__END_DECLS
692
693#endif /* ndef _SDP_H_ */
694
695