xref: /freebsd-src/lib/libsdp/sdp.h (revision 42b388439bd3795e09258c57a74ce9eec3651c7b)
15e53a4f9SPedro F. Giffuni /*-
20986ab12SMaksim Yevmenkin  * sdp.h
30986ab12SMaksim Yevmenkin  *
4*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
55e53a4f9SPedro F. Giffuni  *
60986ab12SMaksim Yevmenkin  * Copyright (c) 2001-2003 Maksim Yevmenkin <m_evmenkin@yahoo.com>
70986ab12SMaksim Yevmenkin  * All rights reserved.
80986ab12SMaksim Yevmenkin  *
90986ab12SMaksim Yevmenkin  * Redistribution and use in source and binary forms, with or without
100986ab12SMaksim Yevmenkin  * modification, are permitted provided that the following conditions
110986ab12SMaksim Yevmenkin  * are met:
120986ab12SMaksim Yevmenkin  * 1. Redistributions of source code must retain the above copyright
130986ab12SMaksim Yevmenkin  *    notice, this list of conditions and the following disclaimer.
140986ab12SMaksim Yevmenkin  * 2. Redistributions in binary form must reproduce the above copyright
150986ab12SMaksim Yevmenkin  *    notice, this list of conditions and the following disclaimer in the
160986ab12SMaksim Yevmenkin  *    documentation and/or other materials provided with the distribution.
170986ab12SMaksim Yevmenkin  *
180986ab12SMaksim Yevmenkin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
190986ab12SMaksim Yevmenkin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
200986ab12SMaksim Yevmenkin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
210986ab12SMaksim Yevmenkin  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
220986ab12SMaksim Yevmenkin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
230986ab12SMaksim Yevmenkin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
240986ab12SMaksim Yevmenkin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
250986ab12SMaksim Yevmenkin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
260986ab12SMaksim Yevmenkin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
270986ab12SMaksim Yevmenkin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
280986ab12SMaksim Yevmenkin  * SUCH DAMAGE.
290986ab12SMaksim Yevmenkin  *
300986ab12SMaksim Yevmenkin  * $Id: sdp.h,v 1.3 2003/09/05 00:33:59 max Exp $
310986ab12SMaksim Yevmenkin  */
320986ab12SMaksim Yevmenkin 
330986ab12SMaksim Yevmenkin #ifndef _SDP_H_
340986ab12SMaksim Yevmenkin #define _SDP_H_
350986ab12SMaksim Yevmenkin 
360986ab12SMaksim Yevmenkin __BEGIN_DECLS
370986ab12SMaksim Yevmenkin 
380986ab12SMaksim Yevmenkin /*
390986ab12SMaksim Yevmenkin  * Data representation (page 349)
400986ab12SMaksim Yevmenkin  */
410986ab12SMaksim Yevmenkin 
420986ab12SMaksim Yevmenkin /* Nil, the null type */
430986ab12SMaksim Yevmenkin #define SDP_DATA_NIL					0x00
440986ab12SMaksim Yevmenkin 
450986ab12SMaksim Yevmenkin /* Unsigned integer */
460986ab12SMaksim Yevmenkin #define SDP_DATA_UINT8					0x08
470986ab12SMaksim Yevmenkin #define SDP_DATA_UINT16					0x09
480986ab12SMaksim Yevmenkin #define SDP_DATA_UINT32					0x0A
490986ab12SMaksim Yevmenkin #define SDP_DATA_UINT64					0x0B
500986ab12SMaksim Yevmenkin #define SDP_DATA_UINT128				0x0C
510986ab12SMaksim Yevmenkin 
520986ab12SMaksim Yevmenkin /* Signed two's-complement integer */
530986ab12SMaksim Yevmenkin #define SDP_DATA_INT8					0x10
540986ab12SMaksim Yevmenkin #define SDP_DATA_INT16					0x11
550986ab12SMaksim Yevmenkin #define SDP_DATA_INT32					0x12
560986ab12SMaksim Yevmenkin #define SDP_DATA_INT64					0x13
570986ab12SMaksim Yevmenkin #define SDP_DATA_INT128					0x14
580986ab12SMaksim Yevmenkin 
590986ab12SMaksim Yevmenkin /* UUID, a universally unique identifier */
600986ab12SMaksim Yevmenkin #define SDP_DATA_UUID16					0x19
610986ab12SMaksim Yevmenkin #define SDP_DATA_UUID32					0x1A
620986ab12SMaksim Yevmenkin #define SDP_DATA_UUID128				0x1C
630986ab12SMaksim Yevmenkin 
640986ab12SMaksim Yevmenkin /* Text string */
650986ab12SMaksim Yevmenkin #define SDP_DATA_STR8					0x25
660986ab12SMaksim Yevmenkin #define SDP_DATA_STR16					0x26
670986ab12SMaksim Yevmenkin #define SDP_DATA_STR32					0x27
680986ab12SMaksim Yevmenkin 
690986ab12SMaksim Yevmenkin /* Boolean */
700986ab12SMaksim Yevmenkin #define SDP_DATA_BOOL					0x28
710986ab12SMaksim Yevmenkin 
720986ab12SMaksim Yevmenkin /*
730986ab12SMaksim Yevmenkin  * Data element sequence.
740986ab12SMaksim Yevmenkin  * A data element whose data field is a sequence of data elements
750986ab12SMaksim Yevmenkin  */
760986ab12SMaksim Yevmenkin #define SDP_DATA_SEQ8					0x35
770986ab12SMaksim Yevmenkin #define SDP_DATA_SEQ16					0x36
780986ab12SMaksim Yevmenkin #define SDP_DATA_SEQ32					0x37
790986ab12SMaksim Yevmenkin 
800986ab12SMaksim Yevmenkin /*
810986ab12SMaksim Yevmenkin  * Data element alternative.
820986ab12SMaksim Yevmenkin  * A data element whose data field is a sequence of data elements from
830986ab12SMaksim Yevmenkin  * which one data element is to be selected.
840986ab12SMaksim Yevmenkin  */
850986ab12SMaksim Yevmenkin #define SDP_DATA_ALT8					0x3D
860986ab12SMaksim Yevmenkin #define SDP_DATA_ALT16					0x3E
870986ab12SMaksim Yevmenkin #define SDP_DATA_ALT32					0x3F
880986ab12SMaksim Yevmenkin 
890986ab12SMaksim Yevmenkin /* URL, a uniform resource locator */
900986ab12SMaksim Yevmenkin #define SDP_DATA_URL8					0x45
910986ab12SMaksim Yevmenkin #define SDP_DATA_URL16					0x46
920986ab12SMaksim Yevmenkin #define SDP_DATA_URL32					0x47
930986ab12SMaksim Yevmenkin 
940986ab12SMaksim Yevmenkin /*
955b22d1e6SMarkus Brueffer  * Protocols UUID (short) https://www.bluetooth.org/assigned-numbers/service_discovery.php
960986ab12SMaksim Yevmenkin  * BASE UUID 00000000-0000-1000-8000-00805F9B34FB
970986ab12SMaksim Yevmenkin  */
980986ab12SMaksim Yevmenkin 
990986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_SDP				0x0001
1000986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_UDP				0x0002
1010986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_RFCOMM			0x0003
1020986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_TCP				0x0004
1030986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_TCS_BIN			0x0005
1040986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_TCS_AT			0x0006
1050986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_OBEX				0x0008
1060986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_IP				0x0009
1070986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_FTP				0x000A
1080986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_HTTP				0x000C
1090986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_WSP				0x000E
1100986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_BNEP				0x000F
1110986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_UPNP				0x0010
1120986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_HIDP				0x0011
1130986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_HARDCOPY_CONTROL_CHANNEL	0x0012
1140986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_HARDCOPY_DATA_CHANNEL		0x0014
1150986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_HARDCOPY_NOTIFICATION		0x0016
1160986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_AVCTP				0x0017
1170986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_AVDTP				0x0019
1180986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_CMPT				0x001B
1190986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_UDI_C_PLANE			0x001D
1200986ab12SMaksim Yevmenkin #define SDP_UUID_PROTOCOL_L2CAP				0x0100
1210986ab12SMaksim Yevmenkin 
1220986ab12SMaksim Yevmenkin /*
1235b22d1e6SMarkus Brueffer  * Service class IDs https://www.bluetooth.org/assigned-numbers/service_discovery.php
1240986ab12SMaksim Yevmenkin  */
1250986ab12SMaksim Yevmenkin 
1260986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_SERVICE_DISCOVERY_SERVER	0x1000
1270986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_BROWSE_GROUP_DESCRIPTOR	0x1001
1280986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_PUBLIC_BROWSE_GROUP		0x1002
1290986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_SERIAL_PORT			0x1101
1300986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_LAN_ACCESS_USING_PPP		0x1102
1310986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_DIALUP_NETWORKING		0x1103
1320986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_IR_MC_SYNC			0x1104
1330986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_OBEX_OBJECT_PUSH		0x1105
1340986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_OBEX_FILE_TRANSFER		0x1106
1350986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_IR_MC_SYNC_COMMAND		0x1107
1360986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_HEADSET			0x1108
1370986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_CORDLESS_TELEPHONY		0x1109
1380986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_AUDIO_SOURCE			0x110A
1390986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_AUDIO_SINK			0x110B
1400986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_AV_REMOTE_CONTROL_TARGET	0x110C
1410986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_ADVANCED_AUDIO_DISTRIBUTION	0x110D
1420986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_AV_REMOTE_CONTROL		0x110E
1430986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_VIDEO_CONFERENCING		0x110F
1440986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_INTERCOM			0x1110
1450986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_FAX				0x1111
1460986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_HEADSET_AUDIO_GATEWAY		0x1112
1470986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_WAP				0x1113
1480986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_WAP_CLIENT			0x1114
1490986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_PANU				0x1115
1500986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_NAP				0x1116
1510986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_GN				0x1117
1520986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_DIRECT_PRINTING		0x1118
1530986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_REFERENCE_PRINTING		0x1119
1540986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_IMAGING			0x111A
1550986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_IMAGING_RESPONDER		0x111B
1560986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_IMAGING_AUTOMATIC_ARCHIVE	0x111C
1570986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_IMAGING_REFERENCED_OBJECTS	0x111D
1580986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_HANDSFREE			0x111E
1590986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_HANDSFREE_AUDIO_GATEWAY	0x111F
1600986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_DIRECT_PRINTING_REFERENCE_OBJECTS	0x1120
1610986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_REFLECTED_UI			0x1121
1620986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_BASIC_PRINTING		0x1122
1630986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_PRINTING_STATUS		0x1123
1640986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_HUMAN_INTERFACE_DEVICE	0x1124
1650986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_HARDCOPY_CABLE_REPLACEMENT	0x1125
1660986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_HCR_PRINT			0x1126
1670986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_HCR_SCAN			0x1127
1680986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_COMMON_ISDN_ACCESS		0x1128
1690986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_VIDEO_CONFERENCING_GW		0x1129
1700986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_UDI_MT			0x112A
1710986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_UDI_TA			0x112B
1720986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_AUDIO_VIDEO			0x112C
1730986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_SIM_ACCESS			0x112D
1745b22d1e6SMarkus Brueffer #define SDP_SERVICE_CLASS_PHONEBOOK_ACCESS_PCE		0x112E
1755b22d1e6SMarkus Brueffer #define SDP_SERVICE_CLASS_PHONEBOOK_ACCESS_PSE		0x112F
1765b22d1e6SMarkus Brueffer #define SDP_SERVICE_CLASS_PHONEBOOK_ACCESS		0x1130
1770986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_PNP_INFORMATION		0x1200
1780986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_GENERIC_NETWORKING		0x1201
1790986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_GENERIC_FILE_TRANSFER		0x1202
1800986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_GENERIC_AUDIO			0x1203
1810986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_GENERIC_TELEPHONY		0x1204
1820986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_UPNP				0x1205
1830986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_UPNP_IP			0x1206
1840986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_ESDP_UPNP_IP_PAN		0x1300
1850986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_ESDP_UPNP_IP_LAP		0x1301
1860986ab12SMaksim Yevmenkin #define SDP_SERVICE_CLASS_ESDP_UPNP_L2CAP		0x1302
1875b22d1e6SMarkus Brueffer #define SDP_SERVICE_CLASS_VIDEO_SOURCE			0x1303
1885b22d1e6SMarkus Brueffer #define SDP_SERVICE_CLASS_VIDEO_SINK			0x1304
1895b22d1e6SMarkus Brueffer #define SDP_SERVICE_CLASS_VIDEO_DISTRIBUTION		0x1305
1900986ab12SMaksim Yevmenkin 
1910986ab12SMaksim Yevmenkin /*
1920986ab12SMaksim Yevmenkin  * Universal attribute definitions (page 366) and
1935b22d1e6SMarkus Brueffer  * https://www.bluetooth.org/assigned-numbers/service_discovery.php
1940986ab12SMaksim Yevmenkin  */
1950986ab12SMaksim Yevmenkin 
1960986ab12SMaksim Yevmenkin #define SDP_ATTR_RANGE(lo, hi) \
1976aae6f7eSMaksim Yevmenkin 	(uint32_t)(((uint16_t)(lo) << 16) | ((uint16_t)(hi)))
1980986ab12SMaksim Yevmenkin 
1990986ab12SMaksim Yevmenkin #define SDP_ATTR_SERVICE_RECORD_HANDLE			0x0000
2000986ab12SMaksim Yevmenkin #define SDP_ATTR_SERVICE_CLASS_ID_LIST			0x0001
2010986ab12SMaksim Yevmenkin #define SDP_ATTR_SERVICE_RECORD_STATE			0x0002
2020986ab12SMaksim Yevmenkin #define SDP_ATTR_SERVICE_ID				0x0003
2030986ab12SMaksim Yevmenkin #define SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST		0x0004
2040986ab12SMaksim Yevmenkin #define SDP_ATTR_BROWSE_GROUP_LIST			0x0005
2050986ab12SMaksim Yevmenkin #define SDP_ATTR_LANGUAGE_BASE_ATTRIBUTE_ID_LIST	0x0006
2060986ab12SMaksim Yevmenkin #define SDP_ATTR_SERVICE_INFO_TIME_TO_LIVE		0x0007
2070986ab12SMaksim Yevmenkin #define SDP_ATTR_SERVICE_AVAILABILITY			0x0008
2080986ab12SMaksim Yevmenkin #define SDP_ATTR_BLUETOOTH_PROFILE_DESCRIPTOR_LIST	0x0009
2090986ab12SMaksim Yevmenkin #define SDP_ATTR_DOCUMENTATION_URL			0x000A
2100986ab12SMaksim Yevmenkin #define SDP_ATTR_CLIENT_EXECUTABLE_URL			0x000B
2110986ab12SMaksim Yevmenkin #define SDP_ATTR_ICON_URL				0x000C
2120986ab12SMaksim Yevmenkin #define SDP_ATTR_ADDITIONAL_PROTOCOL_DESCRIPTOR_LISTS	0x000D
2130986ab12SMaksim Yevmenkin #define SDP_ATTR_GROUP_ID				0x0200
2140986ab12SMaksim Yevmenkin #define SDP_ATTR_IP_SUBNET				0x0200
2150986ab12SMaksim Yevmenkin #define SDP_ATTR_VERSION_NUMBER_LIST			0x0200
2160986ab12SMaksim Yevmenkin #define SDP_ATTR_SERVICE_DATABASE_STATE			0x0201
2170986ab12SMaksim Yevmenkin #define SDP_ATTR_SERVICE_VERSION			0x0300
2180986ab12SMaksim Yevmenkin #define SDP_ATTR_EXTERNAL_NETWORK			0x0301
2190986ab12SMaksim Yevmenkin #define SDP_ATTR_NETWORK				0x0301
2200986ab12SMaksim Yevmenkin #define SDP_ATTR_SUPPORTED_DATA_STORES_LIST		0x0301
2210986ab12SMaksim Yevmenkin #define SDP_ATTR_FAX_CLASS1_SUPPORT			0x0302
2220986ab12SMaksim Yevmenkin #define SDP_ATTR_REMOTE_AUDIO_VOLUME_CONTROL		0x0302
2230986ab12SMaksim Yevmenkin #define SDP_ATTR_FAX_CLASS20_SUPPORT			0x0303
2240986ab12SMaksim Yevmenkin #define SDP_ATTR_SUPPORTED_FORMATS_LIST			0x0303
2250986ab12SMaksim Yevmenkin #define SDP_ATTR_FAX_CLASS2_SUPPORT			0x0304
2260986ab12SMaksim Yevmenkin #define SDP_ATTR_AUDIO_FEEDBACK_SUPPORT			0x0305
2270986ab12SMaksim Yevmenkin #define SDP_ATTR_NETWORK_ADDRESS			0x0306
2280986ab12SMaksim Yevmenkin #define SDP_ATTR_WAP_GATEWAY				0x0307
2290986ab12SMaksim Yevmenkin #define SDP_ATTR_HOME_PAGE_URL				0x0308
2300986ab12SMaksim Yevmenkin #define SDP_ATTR_WAP_STACK_TYPE				0x0309
2310986ab12SMaksim Yevmenkin #define SDP_ATTR_SECURITY_DESCRIPTION			0x030A
2320986ab12SMaksim Yevmenkin #define SDP_ATTR_NET_ACCESS_TYPE			0x030B
2330986ab12SMaksim Yevmenkin #define SDP_ATTR_MAX_NET_ACCESS_RATE			0x030C
2340986ab12SMaksim Yevmenkin #define SDP_ATTR_IPV4_SUBNET				0x030D
2350986ab12SMaksim Yevmenkin #define SDP_ATTR_IPV6_SUBNET				0x030E
2360986ab12SMaksim Yevmenkin #define SDP_ATTR_SUPPORTED_CAPABALITIES			0x0310
2370986ab12SMaksim Yevmenkin #define SDP_ATTR_SUPPORTED_FEATURES			0x0311
2380986ab12SMaksim Yevmenkin #define SDP_ATTR_SUPPORTED_FUNCTIONS			0x0312
2390986ab12SMaksim Yevmenkin #define SDP_ATTR_TOTAL_IMAGING_DATA_CAPACITY		0x0313
2405b22d1e6SMarkus Brueffer #define SDP_ATTR_SUPPORTED_REPOSITORIES			0x0314
2410986ab12SMaksim Yevmenkin 
2420986ab12SMaksim Yevmenkin /*
2430986ab12SMaksim Yevmenkin  * The offset must be added to the attribute ID base (contained in the
2440986ab12SMaksim Yevmenkin  * LANGUAGE_BASE_ATTRIBUTE_ID_LIST attribute) in order to compute the
2450986ab12SMaksim Yevmenkin  * attribute ID for these attributes.
2460986ab12SMaksim Yevmenkin  */
2470986ab12SMaksim Yevmenkin 
2486aae6f7eSMaksim Yevmenkin #define SDP_ATTR_PRIMARY_LANGUAGE_BASE_ID		0x0100
2490986ab12SMaksim Yevmenkin #define SDP_ATTR_SERVICE_NAME_OFFSET			0x0000
2500986ab12SMaksim Yevmenkin #define SDP_ATTR_SERVICE_DESCRIPTION_OFFSET		0x0001
2510986ab12SMaksim Yevmenkin #define SDP_ATTR_PROVIDER_NAME_OFFSET			0x0002
2520986ab12SMaksim Yevmenkin 
2530986ab12SMaksim Yevmenkin /*
2540986ab12SMaksim Yevmenkin  * Protocol data unit (PDU) format (page 352)
2550986ab12SMaksim Yevmenkin  */
2560986ab12SMaksim Yevmenkin 
2570986ab12SMaksim Yevmenkin #define SDP_PDU_ERROR_RESPONSE				0x01
2580986ab12SMaksim Yevmenkin #define SDP_PDU_SERVICE_SEARCH_REQUEST			0x02
2590986ab12SMaksim Yevmenkin #define SDP_PDU_SERVICE_SEARCH_RESPONSE			0x03
2600986ab12SMaksim Yevmenkin #define SDP_PDU_SERVICE_ATTRIBUTE_REQUEST		0x04
2610986ab12SMaksim Yevmenkin #define SDP_PDU_SERVICE_ATTRIBUTE_RESPONSE		0x05
2620986ab12SMaksim Yevmenkin #define SDP_PDU_SERVICE_SEARCH_ATTRIBUTE_REQUEST	0x06
2630986ab12SMaksim Yevmenkin #define SDP_PDU_SERVICE_SEARCH_ATTRIBUTE_RESPONSE	0x07
2640986ab12SMaksim Yevmenkin 
2650986ab12SMaksim Yevmenkin struct sdp_pdu {
2666aae6f7eSMaksim Yevmenkin 	uint8_t		pid;	/* PDU ID - SDP_PDU_xxx */
2676aae6f7eSMaksim Yevmenkin 	uint16_t	tid;	/* transaction ID */
2686aae6f7eSMaksim Yevmenkin 	uint16_t	len;	/* parameters length (in bytes) */
2690986ab12SMaksim Yevmenkin } __attribute__ ((packed));
2700986ab12SMaksim Yevmenkin typedef struct sdp_pdu		sdp_pdu_t;
2710986ab12SMaksim Yevmenkin typedef struct sdp_pdu *	sdp_pdu_p;
2720986ab12SMaksim Yevmenkin 
2730986ab12SMaksim Yevmenkin /*
2746aae6f7eSMaksim Yevmenkin  * Error codes for SDP_PDU_ERROR_RESPONSE
2756aae6f7eSMaksim Yevmenkin  */
2766aae6f7eSMaksim Yevmenkin 
2776aae6f7eSMaksim Yevmenkin #define SDP_ERROR_CODE_INVALID_SDP_VERSION		0x0001
2786aae6f7eSMaksim Yevmenkin #define SDP_ERROR_CODE_INVALID_SERVICE_RECORD_HANDLE	0x0002
2796aae6f7eSMaksim Yevmenkin #define SDP_ERROR_CODE_INVALID_REQUEST_SYNTAX		0x0003
2806aae6f7eSMaksim Yevmenkin #define SDP_ERROR_CODE_INVALID_PDU_SIZE			0x0004
2816aae6f7eSMaksim Yevmenkin #define SDP_ERROR_CODE_INVALID_CONTINUATION_STATE	0x0005
2826aae6f7eSMaksim Yevmenkin #define SDP_ERROR_CODE_INSUFFICIENT_RESOURCES		0x0006
2836aae6f7eSMaksim Yevmenkin 
2846aae6f7eSMaksim Yevmenkin /*
2850986ab12SMaksim Yevmenkin  * SDP int128/uint128 parameter
2860986ab12SMaksim Yevmenkin  */
2870986ab12SMaksim Yevmenkin 
2880986ab12SMaksim Yevmenkin struct int128 {
2890986ab12SMaksim Yevmenkin 	int8_t	b[16];
2900986ab12SMaksim Yevmenkin };
2910986ab12SMaksim Yevmenkin typedef struct int128	int128_t;
2926aae6f7eSMaksim Yevmenkin typedef struct int128	uint128_t;
2930986ab12SMaksim Yevmenkin 
2940986ab12SMaksim Yevmenkin /*
2950986ab12SMaksim Yevmenkin  * SDP attribute
2960986ab12SMaksim Yevmenkin  */
2970986ab12SMaksim Yevmenkin 
2980986ab12SMaksim Yevmenkin struct sdp_attr {
2996aae6f7eSMaksim Yevmenkin 	uint16_t	 flags;
3000986ab12SMaksim Yevmenkin #define SDP_ATTR_OK		(0 << 0)
3010986ab12SMaksim Yevmenkin #define SDP_ATTR_INVALID	(1 << 0)
3020986ab12SMaksim Yevmenkin #define SDP_ATTR_TRUNCATED	(1 << 1)
3036aae6f7eSMaksim Yevmenkin 	uint16_t	 attr;  /* SDP_ATTR_xxx */
3046aae6f7eSMaksim Yevmenkin 	uint32_t	 vlen;	/* length of the value[] in bytes */
3056aae6f7eSMaksim Yevmenkin 	uint8_t		*value;	/* base pointer */
3060986ab12SMaksim Yevmenkin };
3070986ab12SMaksim Yevmenkin typedef struct sdp_attr		sdp_attr_t;
3080986ab12SMaksim Yevmenkin typedef struct sdp_attr *	sdp_attr_p;
3090986ab12SMaksim Yevmenkin 
3100986ab12SMaksim Yevmenkin /******************************************************************************
3110986ab12SMaksim Yevmenkin  * User interface
3120986ab12SMaksim Yevmenkin  *****************************************************************************/
3130986ab12SMaksim Yevmenkin 
3140986ab12SMaksim Yevmenkin /* Inline versions of get/put byte/short/long. Pointer is advanced */
3150986ab12SMaksim Yevmenkin #define SDP_GET8(b, cp) { \
3161e47e0caSEd Schouten 	const uint8_t *t_cp = (const uint8_t *)(cp); \
3170986ab12SMaksim Yevmenkin 	(b) = *t_cp; \
3180986ab12SMaksim Yevmenkin 	(cp) ++; \
3190986ab12SMaksim Yevmenkin }
3200986ab12SMaksim Yevmenkin 
3210986ab12SMaksim Yevmenkin #define SDP_GET16(s, cp) { \
3221e47e0caSEd Schouten 	const uint8_t *t_cp = (const uint8_t *)(cp); \
3236aae6f7eSMaksim Yevmenkin 	(s) = ((uint16_t)t_cp[0] << 8) \
3246aae6f7eSMaksim Yevmenkin 	    | ((uint16_t)t_cp[1]) \
3250986ab12SMaksim Yevmenkin 	    ; \
3260986ab12SMaksim Yevmenkin 	(cp) += 2; \
3270986ab12SMaksim Yevmenkin }
3280986ab12SMaksim Yevmenkin 
3290986ab12SMaksim Yevmenkin #define SDP_GET32(l, cp) { \
3301e47e0caSEd Schouten 	const uint8_t *t_cp = (const uint8_t *)(cp); \
3316aae6f7eSMaksim Yevmenkin 	(l) = ((uint32_t)t_cp[0] << 24) \
3326aae6f7eSMaksim Yevmenkin 	    | ((uint32_t)t_cp[1] << 16) \
3336aae6f7eSMaksim Yevmenkin 	    | ((uint32_t)t_cp[2] << 8) \
3346aae6f7eSMaksim Yevmenkin 	    | ((uint32_t)t_cp[3]) \
3350986ab12SMaksim Yevmenkin 	    ; \
3360986ab12SMaksim Yevmenkin 	(cp) += 4; \
3370986ab12SMaksim Yevmenkin }
3380986ab12SMaksim Yevmenkin 
3390986ab12SMaksim Yevmenkin #define SDP_GET64(l, cp) { \
3406aae6f7eSMaksim Yevmenkin 	register uint8_t *t_cp = (uint8_t *)(cp); \
3416aae6f7eSMaksim Yevmenkin 	(l) = ((uint64_t)t_cp[0] << 56) \
3426aae6f7eSMaksim Yevmenkin 	    | ((uint64_t)t_cp[1] << 48) \
3436aae6f7eSMaksim Yevmenkin 	    | ((uint64_t)t_cp[2] << 40) \
3446aae6f7eSMaksim Yevmenkin 	    | ((uint64_t)t_cp[3] << 32) \
3456aae6f7eSMaksim Yevmenkin 	    | ((uint64_t)t_cp[4] << 24) \
3466aae6f7eSMaksim Yevmenkin 	    | ((uint64_t)t_cp[5] << 16) \
3476aae6f7eSMaksim Yevmenkin 	    | ((uint64_t)t_cp[6] << 8) \
3486aae6f7eSMaksim Yevmenkin 	    | ((uint64_t)t_cp[7]) \
3490986ab12SMaksim Yevmenkin 	    ; \
3500986ab12SMaksim Yevmenkin 	(cp) += 8; \
3510986ab12SMaksim Yevmenkin }
3520986ab12SMaksim Yevmenkin 
3530986ab12SMaksim Yevmenkin #if BYTE_ORDER == LITTLE_ENDIAN
3540986ab12SMaksim Yevmenkin #define SDP_GET128(l, cp) { \
3556aae6f7eSMaksim Yevmenkin 	register uint8_t *t_cp = (uint8_t *)(cp); \
3560986ab12SMaksim Yevmenkin 	(l)->b[15] = *t_cp++; \
3570986ab12SMaksim Yevmenkin 	(l)->b[14] = *t_cp++; \
3580986ab12SMaksim Yevmenkin 	(l)->b[13] = *t_cp++; \
3590986ab12SMaksim Yevmenkin 	(l)->b[12] = *t_cp++; \
3600986ab12SMaksim Yevmenkin 	(l)->b[11] = *t_cp++; \
3610986ab12SMaksim Yevmenkin 	(l)->b[10] = *t_cp++; \
3620986ab12SMaksim Yevmenkin 	(l)->b[9]  = *t_cp++; \
3630986ab12SMaksim Yevmenkin 	(l)->b[8]  = *t_cp++; \
3640986ab12SMaksim Yevmenkin 	(l)->b[7]  = *t_cp++; \
3650986ab12SMaksim Yevmenkin 	(l)->b[6]  = *t_cp++; \
3660986ab12SMaksim Yevmenkin 	(l)->b[5]  = *t_cp++; \
3670986ab12SMaksim Yevmenkin 	(l)->b[4]  = *t_cp++; \
3680986ab12SMaksim Yevmenkin 	(l)->b[3]  = *t_cp++; \
3690986ab12SMaksim Yevmenkin 	(l)->b[2]  = *t_cp++; \
3700986ab12SMaksim Yevmenkin 	(l)->b[1]  = *t_cp++; \
37143d33de9SMaksim Yevmenkin 	(l)->b[0]  = *t_cp++; \
3720986ab12SMaksim Yevmenkin 	(cp) += 16; \
3730986ab12SMaksim Yevmenkin }
37443d33de9SMaksim Yevmenkin 
37543d33de9SMaksim Yevmenkin #define SDP_GET_UUID128(l, cp) { \
37643d33de9SMaksim Yevmenkin 	register uint8_t *t_cp = (uint8_t *)(cp); \
37743d33de9SMaksim Yevmenkin 	(l)->b[0]  = *t_cp++; \
37843d33de9SMaksim Yevmenkin 	(l)->b[1]  = *t_cp++; \
37943d33de9SMaksim Yevmenkin 	(l)->b[2]  = *t_cp++; \
38043d33de9SMaksim Yevmenkin 	(l)->b[3]  = *t_cp++; \
38143d33de9SMaksim Yevmenkin 	(l)->b[4]  = *t_cp++; \
38243d33de9SMaksim Yevmenkin 	(l)->b[5]  = *t_cp++; \
38343d33de9SMaksim Yevmenkin 	(l)->b[6]  = *t_cp++; \
38443d33de9SMaksim Yevmenkin 	(l)->b[7]  = *t_cp++; \
38543d33de9SMaksim Yevmenkin 	(l)->b[8]  = *t_cp++; \
38643d33de9SMaksim Yevmenkin 	(l)->b[9]  = *t_cp++; \
38743d33de9SMaksim Yevmenkin 	(l)->b[10] = *t_cp++; \
38843d33de9SMaksim Yevmenkin 	(l)->b[11] = *t_cp++; \
38943d33de9SMaksim Yevmenkin 	(l)->b[12] = *t_cp++; \
39043d33de9SMaksim Yevmenkin 	(l)->b[13] = *t_cp++; \
39143d33de9SMaksim Yevmenkin 	(l)->b[14] = *t_cp++; \
39243d33de9SMaksim Yevmenkin 	(l)->b[15] = *t_cp++; \
39343d33de9SMaksim Yevmenkin 	(cp) += 16; \
39443d33de9SMaksim Yevmenkin }
39543d33de9SMaksim Yevmenkin #elif BYTE_ORDER == BIG_ENDIAN
3960986ab12SMaksim Yevmenkin #define SDP_GET128(l, cp) { \
3976aae6f7eSMaksim Yevmenkin 	register uint8_t *t_cp = (uint8_t *)(cp); \
3980986ab12SMaksim Yevmenkin 	(l)->b[0]  = *t_cp++; \
3990986ab12SMaksim Yevmenkin 	(l)->b[1]  = *t_cp++; \
4000986ab12SMaksim Yevmenkin 	(l)->b[2]  = *t_cp++; \
4010986ab12SMaksim Yevmenkin 	(l)->b[3]  = *t_cp++; \
4020986ab12SMaksim Yevmenkin 	(l)->b[4]  = *t_cp++; \
4030986ab12SMaksim Yevmenkin 	(l)->b[5]  = *t_cp++; \
4040986ab12SMaksim Yevmenkin 	(l)->b[6]  = *t_cp++; \
4050986ab12SMaksim Yevmenkin 	(l)->b[7]  = *t_cp++; \
4060986ab12SMaksim Yevmenkin 	(l)->b[8]  = *t_cp++; \
4070986ab12SMaksim Yevmenkin 	(l)->b[9]  = *t_cp++; \
4080986ab12SMaksim Yevmenkin 	(l)->b[10] = *t_cp++; \
4090986ab12SMaksim Yevmenkin 	(l)->b[11] = *t_cp++; \
4100986ab12SMaksim Yevmenkin 	(l)->b[12] = *t_cp++; \
4110986ab12SMaksim Yevmenkin 	(l)->b[13] = *t_cp++; \
4120986ab12SMaksim Yevmenkin 	(l)->b[14] = *t_cp++; \
4130986ab12SMaksim Yevmenkin 	(l)->b[15] = *t_cp++; \
4140986ab12SMaksim Yevmenkin 	(cp) += 16; \
4150986ab12SMaksim Yevmenkin }
41643d33de9SMaksim Yevmenkin 
41743d33de9SMaksim Yevmenkin #define	SDP_GET_UUID128(l, cp)	SDP_GET128(l, cp)
41843d33de9SMaksim Yevmenkin #else
41943d33de9SMaksim Yevmenkin #error	"Unsupported BYTE_ORDER"
4200986ab12SMaksim Yevmenkin #endif /* BYTE_ORDER */
4210986ab12SMaksim Yevmenkin 
4220986ab12SMaksim Yevmenkin #define SDP_PUT8(b, cp) { \
4236aae6f7eSMaksim Yevmenkin 	register uint8_t t_b = (uint8_t)(b); \
4246aae6f7eSMaksim Yevmenkin 	register uint8_t *t_cp = (uint8_t *)(cp); \
4250986ab12SMaksim Yevmenkin 	*t_cp = t_b; \
4260986ab12SMaksim Yevmenkin 	(cp) ++; \
4270986ab12SMaksim Yevmenkin }
4280986ab12SMaksim Yevmenkin 
4290986ab12SMaksim Yevmenkin #define SDP_PUT16(s, cp) { \
4306aae6f7eSMaksim Yevmenkin 	register uint16_t t_s = (uint16_t)(s); \
4316aae6f7eSMaksim Yevmenkin 	register uint8_t *t_cp = (uint8_t *)(cp); \
4320986ab12SMaksim Yevmenkin 	*t_cp++ = t_s >> 8; \
4330986ab12SMaksim Yevmenkin 	*t_cp   = t_s; \
4340986ab12SMaksim Yevmenkin 	(cp) += 2; \
4350986ab12SMaksim Yevmenkin }
4360986ab12SMaksim Yevmenkin 
4370986ab12SMaksim Yevmenkin #define SDP_PUT32(l, cp) { \
4386aae6f7eSMaksim Yevmenkin 	register uint32_t t_l = (uint32_t)(l); \
4396aae6f7eSMaksim Yevmenkin 	register uint8_t *t_cp = (uint8_t *)(cp); \
4400986ab12SMaksim Yevmenkin 	*t_cp++ = t_l >> 24; \
4410986ab12SMaksim Yevmenkin 	*t_cp++ = t_l >> 16; \
4420986ab12SMaksim Yevmenkin 	*t_cp++ = t_l >> 8; \
4430986ab12SMaksim Yevmenkin 	*t_cp   = t_l; \
4440986ab12SMaksim Yevmenkin 	(cp) += 4; \
4450986ab12SMaksim Yevmenkin }
4460986ab12SMaksim Yevmenkin 
4470986ab12SMaksim Yevmenkin #define SDP_PUT64(l, cp) { \
4486aae6f7eSMaksim Yevmenkin 	register uint64_t t_l = (uint64_t)(l); \
4496aae6f7eSMaksim Yevmenkin 	register uint8_t *t_cp = (uint8_t *)(cp); \
4500986ab12SMaksim Yevmenkin 	*t_cp++ = t_l >> 56; \
4510986ab12SMaksim Yevmenkin 	*t_cp++ = t_l >> 48; \
4520986ab12SMaksim Yevmenkin 	*t_cp++ = t_l >> 40; \
4530986ab12SMaksim Yevmenkin 	*t_cp++ = t_l >> 32; \
4540986ab12SMaksim Yevmenkin 	*t_cp++ = t_l >> 24; \
4550986ab12SMaksim Yevmenkin 	*t_cp++ = t_l >> 16; \
4560986ab12SMaksim Yevmenkin 	*t_cp++ = t_l >> 8; \
4570986ab12SMaksim Yevmenkin 	*t_cp   = t_l; \
4580986ab12SMaksim Yevmenkin 	(cp) += 8; \
4590986ab12SMaksim Yevmenkin }
4600986ab12SMaksim Yevmenkin 
4610986ab12SMaksim Yevmenkin #if BYTE_ORDER == LITTLE_ENDIAN
4620986ab12SMaksim Yevmenkin #define SDP_PUT128(l, cp) { \
4636aae6f7eSMaksim Yevmenkin 	register uint8_t *t_cp = (uint8_t *)(cp); \
4640986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[15]; \
4650986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[14]; \
4660986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[13]; \
4670986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[12]; \
4680986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[11]; \
4690986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[10]; \
4700986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[9];  \
4710986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[8];  \
4720986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[7];  \
4730986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[6];  \
4740986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[5];  \
4750986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[4];  \
4760986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[3];  \
4770986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[2];  \
4780986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[1];  \
4790986ab12SMaksim Yevmenkin 	*t_cp   = (l)->b[0];  \
4800986ab12SMaksim Yevmenkin 	(cp) += 16; \
4810986ab12SMaksim Yevmenkin }
48243d33de9SMaksim Yevmenkin 
48343d33de9SMaksim Yevmenkin #define SDP_PUT_UUID128(l, cp) { \
48443d33de9SMaksim Yevmenkin 	register uint8_t *t_cp = (uint8_t *)(cp); \
48543d33de9SMaksim Yevmenkin 	*t_cp++ = (l)->b[0];  \
48643d33de9SMaksim Yevmenkin 	*t_cp++ = (l)->b[1];  \
48743d33de9SMaksim Yevmenkin 	*t_cp++ = (l)->b[2];  \
48843d33de9SMaksim Yevmenkin 	*t_cp++ = (l)->b[3];  \
48943d33de9SMaksim Yevmenkin 	*t_cp++ = (l)->b[4];  \
49043d33de9SMaksim Yevmenkin 	*t_cp++ = (l)->b[5];  \
49143d33de9SMaksim Yevmenkin 	*t_cp++ = (l)->b[6];  \
49243d33de9SMaksim Yevmenkin 	*t_cp++ = (l)->b[7];  \
49343d33de9SMaksim Yevmenkin 	*t_cp++ = (l)->b[8];  \
49443d33de9SMaksim Yevmenkin 	*t_cp++ = (l)->b[9];  \
49543d33de9SMaksim Yevmenkin 	*t_cp++ = (l)->b[10]; \
49643d33de9SMaksim Yevmenkin 	*t_cp++ = (l)->b[11]; \
49743d33de9SMaksim Yevmenkin 	*t_cp++ = (l)->b[12]; \
49843d33de9SMaksim Yevmenkin 	*t_cp++ = (l)->b[13]; \
49943d33de9SMaksim Yevmenkin 	*t_cp++ = (l)->b[14]; \
50043d33de9SMaksim Yevmenkin 	*t_cp   = (l)->b[15]; \
50143d33de9SMaksim Yevmenkin 	(cp) += 16; \
50243d33de9SMaksim Yevmenkin }
50343d33de9SMaksim Yevmenkin #elif BYTE_ORDER == BIG_ENDIAN
5040986ab12SMaksim Yevmenkin #define SDP_PUT128(l, cp) { \
5056aae6f7eSMaksim Yevmenkin 	register uint8_t *t_cp = (uint8_t *)(cp); \
5060986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[0];  \
5070986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[1];  \
5080986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[2];  \
5090986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[3];  \
5100986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[4];  \
5110986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[5];  \
5120986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[6];  \
5130986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[7];  \
5140986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[8];  \
5150986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[9];  \
5160986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[10]; \
5170986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[11]; \
5180986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[12]; \
5190986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[13]; \
5200986ab12SMaksim Yevmenkin 	*t_cp++ = (l)->b[14]; \
5210986ab12SMaksim Yevmenkin 	*t_cp   = (l)->b[15]; \
5220986ab12SMaksim Yevmenkin 	(cp) += 16; \
5230986ab12SMaksim Yevmenkin }
52443d33de9SMaksim Yevmenkin 
52543d33de9SMaksim Yevmenkin #define SDP_PUT_UUID128(l, cp)	SDP_PUT128(l, cp)
52643d33de9SMaksim Yevmenkin #else
52743d33de9SMaksim Yevmenkin #error	"Unsupported BYTE_ORDER"
5280986ab12SMaksim Yevmenkin #endif /* BYTE_ORDER */
5290986ab12SMaksim Yevmenkin 
5300986ab12SMaksim Yevmenkin void *             sdp_open       (bdaddr_t const *l, bdaddr_t const *r);
531a4b187faSMaksim Yevmenkin void *             sdp_open_local (char const *control);
5320986ab12SMaksim Yevmenkin int32_t            sdp_close      (void *xs);
5330986ab12SMaksim Yevmenkin int32_t            sdp_error      (void *xs);
534515bb54cSVladimir Kondratyev int32_t            sdp_get_lcaddr (void *xs, bdaddr_t *l);
5350986ab12SMaksim Yevmenkin 
5360986ab12SMaksim Yevmenkin int32_t            sdp_search     (void *xs,
5376aae6f7eSMaksim Yevmenkin                                    uint32_t plen, uint16_t const *pp,
5386aae6f7eSMaksim Yevmenkin                                    uint32_t alen, uint32_t const *ap,
5396aae6f7eSMaksim Yevmenkin                                    uint32_t vlen, sdp_attr_t *vp);
5400986ab12SMaksim Yevmenkin 
54184ab9306SMaksim Yevmenkin char const *	   sdp_attr2desc  (uint16_t attr);
54284ab9306SMaksim Yevmenkin char const *	   sdp_uuid2desc  (uint16_t uuid);
5436aae6f7eSMaksim Yevmenkin void               sdp_print      (uint32_t level, uint8_t const *start,
5446aae6f7eSMaksim Yevmenkin                                    uint8_t const *end);
5456aae6f7eSMaksim Yevmenkin 
5466aae6f7eSMaksim Yevmenkin /******************************************************************************
5476aae6f7eSMaksim Yevmenkin  * sdpd interface and Bluetooth profiles data
5486aae6f7eSMaksim Yevmenkin  *****************************************************************************/
5496aae6f7eSMaksim Yevmenkin 
5506aae6f7eSMaksim Yevmenkin #define SDP_LOCAL_PATH	"/var/run/sdp"
5516aae6f7eSMaksim Yevmenkin #define SDP_LOCAL_MTU	4096
5526aae6f7eSMaksim Yevmenkin 
55307be7a6cSMaksim Yevmenkin /*
55407be7a6cSMaksim Yevmenkin  * These are NOT defined in spec and only accepted on control sockets.
55507be7a6cSMaksim Yevmenkin  * The response to these request always will be SDP_PDU_ERROR_RESPONSE.
55607be7a6cSMaksim Yevmenkin  * The first 2 bytes (after PDU header) is an error code (in network
55707be7a6cSMaksim Yevmenkin  * byte order). The rest of the data (pdu->len - 2) is a response data
55807be7a6cSMaksim Yevmenkin  * and depend on the request.
55907be7a6cSMaksim Yevmenkin  *
56007be7a6cSMaksim Yevmenkin  * SDP_PDU_SERVICE_REGISTER_REQUEST
56107be7a6cSMaksim Yevmenkin  * 	pdu_header_t	hdr;
56207be7a6cSMaksim Yevmenkin  *	u_int16_t	uuid;	service class UUID (network byte order)
56307be7a6cSMaksim Yevmenkin  *	bdaddr_t	bdaddr;	local BD_ADDR (or ANY)
56407be7a6cSMaksim Yevmenkin  *	profile data[pdu->len - sizeof(uuid) - sizeof(bdaddr)]
56507be7a6cSMaksim Yevmenkin  *
56675f46cf6SPedro F. Giffuni  * in successful response additional data will contain 4 bytes record handle
56707be7a6cSMaksim Yevmenkin  *
56807be7a6cSMaksim Yevmenkin  *
56907be7a6cSMaksim Yevmenkin  * SDP_PDU_SERVICE_UNREGISTER_REQUEST
57007be7a6cSMaksim Yevmenkin  *	pdu_header_t	hdr;
57107be7a6cSMaksim Yevmenkin  *	u_int32_t	record_handle;	(network byte order)
57207be7a6cSMaksim Yevmenkin  *
57307be7a6cSMaksim Yevmenkin  * no additional data in response.
57407be7a6cSMaksim Yevmenkin  *
57507be7a6cSMaksim Yevmenkin  *
57607be7a6cSMaksim Yevmenkin  * SDP_PDU_SERVICE_CHANGE_REQUEST
57707be7a6cSMaksim Yevmenkin  * 	pdu_header_t	hdr;
57807be7a6cSMaksim Yevmenkin  *	u_int32_t	record_handle;	(network byte order)
57907be7a6cSMaksim Yevmenkin  *	profile data[pdu->len - sizeof(record_handle)]
58007be7a6cSMaksim Yevmenkin  *
58107be7a6cSMaksim Yevmenkin  * no additional data in response.
58207be7a6cSMaksim Yevmenkin  */
58307be7a6cSMaksim Yevmenkin 
58407be7a6cSMaksim Yevmenkin #define SDP_PDU_SERVICE_REGISTER_REQUEST	0x81
58507be7a6cSMaksim Yevmenkin #define SDP_PDU_SERVICE_UNREGISTER_REQUEST	0x82
58607be7a6cSMaksim Yevmenkin #define SDP_PDU_SERVICE_CHANGE_REQUEST		0x83
58707be7a6cSMaksim Yevmenkin 
58821be80aeSHans Petter Selasky struct sdp_audio_sink_profile
58921be80aeSHans Petter Selasky {
59021be80aeSHans Petter Selasky 	uint16_t psm;
59121be80aeSHans Petter Selasky 	uint16_t protover;
59221be80aeSHans Petter Selasky 	uint16_t features;
59321be80aeSHans Petter Selasky };
59421be80aeSHans Petter Selasky typedef struct sdp_audio_sink_profile	sdp_audio_sink_profile_t;
59521be80aeSHans Petter Selasky typedef struct sdp_audio_sink_profile	*sdp_audio_sink_profile_p;
59621be80aeSHans Petter Selasky 
59721be80aeSHans Petter Selasky struct sdp_audio_source_profile
59821be80aeSHans Petter Selasky {
59921be80aeSHans Petter Selasky 	uint16_t psm;
60021be80aeSHans Petter Selasky 	uint16_t protover;
60121be80aeSHans Petter Selasky 	uint16_t features;
60221be80aeSHans Petter Selasky };
60321be80aeSHans Petter Selasky typedef struct sdp_audio_source_profile	sdp_audio_source_profile_t;
60421be80aeSHans Petter Selasky typedef struct sdp_audio_source_profile *sdp_audio_source_profile_p;
60521be80aeSHans Petter Selasky 
6066aae6f7eSMaksim Yevmenkin struct sdp_dun_profile
6076aae6f7eSMaksim Yevmenkin {
6086aae6f7eSMaksim Yevmenkin 	uint8_t	server_channel;
6096aae6f7eSMaksim Yevmenkin 	uint8_t	audio_feedback_support;
6106aae6f7eSMaksim Yevmenkin 	uint8_t	reserved[2];
6116aae6f7eSMaksim Yevmenkin };
6126aae6f7eSMaksim Yevmenkin typedef struct sdp_dun_profile		sdp_dun_profile_t;
6136aae6f7eSMaksim Yevmenkin typedef struct sdp_dun_profile *	sdp_dun_profile_p;
6146aae6f7eSMaksim Yevmenkin 
6156aae6f7eSMaksim Yevmenkin struct sdp_ftrn_profile
6166aae6f7eSMaksim Yevmenkin {
6176aae6f7eSMaksim Yevmenkin 	uint8_t	server_channel;
6186aae6f7eSMaksim Yevmenkin 	uint8_t	reserved[3];
6196aae6f7eSMaksim Yevmenkin };
6206aae6f7eSMaksim Yevmenkin typedef struct sdp_ftrn_profile		sdp_ftrn_profile_t;
6216aae6f7eSMaksim Yevmenkin typedef struct sdp_ftrn_profile *	sdp_ftrn_profile_p;
6226aae6f7eSMaksim Yevmenkin 
62307be7a6cSMaksim Yevmenkin /* Keep this in sync with sdp_opush_profile */
6246aae6f7eSMaksim Yevmenkin struct sdp_irmc_profile
6256aae6f7eSMaksim Yevmenkin {
6266aae6f7eSMaksim Yevmenkin 	uint8_t	server_channel;
6276aae6f7eSMaksim Yevmenkin 	uint8_t	supported_formats_size;
6286aae6f7eSMaksim Yevmenkin 	uint8_t	supported_formats[30];
6296aae6f7eSMaksim Yevmenkin };
6306aae6f7eSMaksim Yevmenkin typedef struct sdp_irmc_profile		sdp_irmc_profile_t;
6316aae6f7eSMaksim Yevmenkin typedef struct sdp_irmc_profile *	sdp_irmc_profile_p;
6326aae6f7eSMaksim Yevmenkin 
6336aae6f7eSMaksim Yevmenkin struct sdp_irmc_command_profile
6346aae6f7eSMaksim Yevmenkin {
6356aae6f7eSMaksim Yevmenkin 	uint8_t	server_channel;
6366aae6f7eSMaksim Yevmenkin 	uint8_t	reserved[3];
6376aae6f7eSMaksim Yevmenkin };
6386aae6f7eSMaksim Yevmenkin typedef struct sdp_irmc_command_profile		sdp_irmc_command_profile_t;
6396aae6f7eSMaksim Yevmenkin typedef struct sdp_irmc_command_profile *	sdp_irmc_command_profile_p;
6406aae6f7eSMaksim Yevmenkin 
6416aae6f7eSMaksim Yevmenkin struct sdp_lan_profile
6426aae6f7eSMaksim Yevmenkin {
6436aae6f7eSMaksim Yevmenkin 	uint8_t		server_channel;
6446aae6f7eSMaksim Yevmenkin 	uint8_t		load_factor;
6456aae6f7eSMaksim Yevmenkin 	uint8_t		reserved;
6466aae6f7eSMaksim Yevmenkin 	uint8_t		ip_subnet_radius;
6476aae6f7eSMaksim Yevmenkin 	uint32_t	ip_subnet;
6486aae6f7eSMaksim Yevmenkin };
6496aae6f7eSMaksim Yevmenkin typedef struct sdp_lan_profile		sdp_lan_profile_t;
6506aae6f7eSMaksim Yevmenkin typedef struct sdp_lan_profile *	sdp_lan_profile_p;
6516aae6f7eSMaksim Yevmenkin 
65207be7a6cSMaksim Yevmenkin /* Keep this in sync with sdp_irmc_profile */
6536aae6f7eSMaksim Yevmenkin struct sdp_opush_profile
6546aae6f7eSMaksim Yevmenkin {
6556aae6f7eSMaksim Yevmenkin 	uint8_t	server_channel;
6566aae6f7eSMaksim Yevmenkin 	uint8_t	supported_formats_size;
6576aae6f7eSMaksim Yevmenkin 	uint8_t	supported_formats[30];
6586aae6f7eSMaksim Yevmenkin };
6596aae6f7eSMaksim Yevmenkin typedef struct sdp_opush_profile	sdp_opush_profile_t;
6606aae6f7eSMaksim Yevmenkin typedef struct sdp_opush_profile *	sdp_opush_profile_p;
6616aae6f7eSMaksim Yevmenkin 
6626aae6f7eSMaksim Yevmenkin struct sdp_sp_profile
6636aae6f7eSMaksim Yevmenkin {
6646aae6f7eSMaksim Yevmenkin 	uint8_t	server_channel;
6656aae6f7eSMaksim Yevmenkin 	uint8_t	reserved[3];
6666aae6f7eSMaksim Yevmenkin };
6676aae6f7eSMaksim Yevmenkin typedef struct sdp_sp_profile	sdp_sp_profile_t;
6686aae6f7eSMaksim Yevmenkin typedef struct sdp_sp_profile *	sdp_sp_profile_p;
6690986ab12SMaksim Yevmenkin 
670e096d1e4SMaksim Yevmenkin struct sdp_nap_profile
671e096d1e4SMaksim Yevmenkin {
67213040bc9SMaksim Yevmenkin 	uint8_t		reserved;
67313040bc9SMaksim Yevmenkin 	uint8_t		load_factor;
67413040bc9SMaksim Yevmenkin 	uint16_t	psm;			/* HBO */
67513040bc9SMaksim Yevmenkin 	uint16_t	security_description;	/* HBO */
67613040bc9SMaksim Yevmenkin 	uint16_t	net_access_type;	/* HBO */
67713040bc9SMaksim Yevmenkin 	uint32_t	max_net_access_rate;	/* HBO */
678e096d1e4SMaksim Yevmenkin };
679e096d1e4SMaksim Yevmenkin typedef struct sdp_nap_profile		sdp_nap_profile_t;
680e096d1e4SMaksim Yevmenkin typedef struct sdp_nap_profile *	sdp_nap_profile_p;
681e096d1e4SMaksim Yevmenkin 
68213040bc9SMaksim Yevmenkin struct sdp_gn_profile
68313040bc9SMaksim Yevmenkin {
68413040bc9SMaksim Yevmenkin 	uint8_t		reserved;
68513040bc9SMaksim Yevmenkin 	uint8_t		load_factor;
68613040bc9SMaksim Yevmenkin 	uint16_t	psm;			/* HBO */
68713040bc9SMaksim Yevmenkin 	uint16_t	security_description;	/* HBO */
68813040bc9SMaksim Yevmenkin 	uint16_t	reserved2;
68913040bc9SMaksim Yevmenkin };
69013040bc9SMaksim Yevmenkin typedef struct sdp_gn_profile		sdp_gn_profile_t;
69113040bc9SMaksim Yevmenkin typedef struct sdp_gn_profile *		sdp_gn_profile_p;
692e096d1e4SMaksim Yevmenkin 
69313040bc9SMaksim Yevmenkin struct sdp_panu_profile
69413040bc9SMaksim Yevmenkin {
69513040bc9SMaksim Yevmenkin 	uint8_t		reserved;
69613040bc9SMaksim Yevmenkin 	uint8_t		load_factor;
69713040bc9SMaksim Yevmenkin 	uint16_t	psm;			/* HBO */
69807f8cd18SMaksim Yevmenkin 	uint16_t	security_description;	/* HBO */
69907f8cd18SMaksim Yevmenkin 	uint16_t	reserved2;
70013040bc9SMaksim Yevmenkin };
70113040bc9SMaksim Yevmenkin typedef struct sdp_panu_profile		sdp_panu_profile_t;
70213040bc9SMaksim Yevmenkin typedef struct sdp_panu_profile *	sdp_panu_profile_p;
703e096d1e4SMaksim Yevmenkin 
70407be7a6cSMaksim Yevmenkin int32_t	sdp_register_service	(void *xss, uint16_t uuid,
70507be7a6cSMaksim Yevmenkin 				 bdaddr_p const bdaddr, uint8_t const *data,
70607be7a6cSMaksim Yevmenkin 				 uint32_t datalen, uint32_t *handle);
70707be7a6cSMaksim Yevmenkin int32_t	sdp_unregister_service	(void *xss, uint32_t handle);
70807be7a6cSMaksim Yevmenkin int32_t	sdp_change_service	(void *xss, uint32_t handle,
70907be7a6cSMaksim Yevmenkin 				 uint8_t const *data, uint32_t datalen);
71007be7a6cSMaksim Yevmenkin 
7110986ab12SMaksim Yevmenkin __END_DECLS
7120986ab12SMaksim Yevmenkin 
7130986ab12SMaksim Yevmenkin #endif /* ndef _SDP_H_ */
7140986ab12SMaksim Yevmenkin 
715