1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * |
4 | * BlueZ - Bluetooth protocol stack for Linux |
5 | * |
6 | * Copyright (C) 2001-2002 Nokia Corporation |
7 | * Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com> |
8 | * Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org> |
9 | * Copyright (C) 2002-2003 Stephen Crane <steve.crane@rococosoft.com> |
10 | * |
11 | * |
12 | */ |
13 | |
14 | #ifndef __SDP_H |
15 | #define __SDP_H |
16 | |
17 | #ifdef __cplusplus |
18 | extern "C" { |
19 | #endif |
20 | |
21 | #include <stdint.h> |
22 | #include <bluetooth/bluetooth.h> |
23 | |
24 | #define SDP_UNIX_PATH "/var/run/sdp" |
25 | #define SDP_RESPONSE_TIMEOUT 20 |
26 | #define SDP_REQ_BUFFER_SIZE 2048 |
27 | #define SDP_RSP_BUFFER_SIZE 65535 |
28 | #define SDP_PDU_CHUNK_SIZE 1024 |
29 | |
30 | /* |
31 | * All definitions are based on Bluetooth Assigned Numbers |
32 | * of the Bluetooth Specification |
33 | */ |
34 | #define SDP_PSM 0x0001 |
35 | |
36 | /* |
37 | * Protocol UUIDs |
38 | */ |
39 | #define SDP_UUID 0x0001 |
40 | #define UDP_UUID 0x0002 |
41 | #define RFCOMM_UUID 0x0003 |
42 | #define TCP_UUID 0x0004 |
43 | #define TCS_BIN_UUID 0x0005 |
44 | #define TCS_AT_UUID 0x0006 |
45 | #define ATT_UUID 0x0007 |
46 | #define OBEX_UUID 0x0008 |
47 | #define IP_UUID 0x0009 |
48 | #define FTP_UUID 0x000a |
49 | #define HTTP_UUID 0x000c |
50 | #define WSP_UUID 0x000e |
51 | #define BNEP_UUID 0x000f |
52 | #define UPNP_UUID 0x0010 |
53 | #define HIDP_UUID 0x0011 |
54 | #define HCRP_CTRL_UUID 0x0012 |
55 | #define HCRP_DATA_UUID 0x0014 |
56 | #define HCRP_NOTE_UUID 0x0016 |
57 | #define AVCTP_UUID 0x0017 |
58 | #define AVDTP_UUID 0x0019 |
59 | #define CMTP_UUID 0x001b |
60 | #define UDI_UUID 0x001d |
61 | #define MCAP_CTRL_UUID 0x001e |
62 | #define MCAP_DATA_UUID 0x001f |
63 | #define L2CAP_UUID 0x0100 |
64 | |
65 | /* |
66 | * Service class identifiers of standard services and service groups |
67 | */ |
68 | #define SDP_SERVER_SVCLASS_ID 0x1000 |
69 | #define BROWSE_GRP_DESC_SVCLASS_ID 0x1001 |
70 | #define PUBLIC_BROWSE_GROUP 0x1002 |
71 | #define SERIAL_PORT_SVCLASS_ID 0x1101 |
72 | #define LAN_ACCESS_SVCLASS_ID 0x1102 |
73 | #define DIALUP_NET_SVCLASS_ID 0x1103 |
74 | #define IRMC_SYNC_SVCLASS_ID 0x1104 |
75 | #define OBEX_OBJPUSH_SVCLASS_ID 0x1105 |
76 | #define OBEX_FILETRANS_SVCLASS_ID 0x1106 |
77 | #define IRMC_SYNC_CMD_SVCLASS_ID 0x1107 |
78 | #define HEADSET_SVCLASS_ID 0x1108 |
79 | #define CORDLESS_TELEPHONY_SVCLASS_ID 0x1109 |
80 | #define AUDIO_SOURCE_SVCLASS_ID 0x110a |
81 | #define AUDIO_SINK_SVCLASS_ID 0x110b |
82 | #define AV_REMOTE_TARGET_SVCLASS_ID 0x110c |
83 | #define ADVANCED_AUDIO_SVCLASS_ID 0x110d |
84 | #define AV_REMOTE_SVCLASS_ID 0x110e |
85 | #define AV_REMOTE_CONTROLLER_SVCLASS_ID 0x110f |
86 | #define INTERCOM_SVCLASS_ID 0x1110 |
87 | #define FAX_SVCLASS_ID 0x1111 |
88 | #define HEADSET_AGW_SVCLASS_ID 0x1112 |
89 | #define WAP_SVCLASS_ID 0x1113 |
90 | #define WAP_CLIENT_SVCLASS_ID 0x1114 |
91 | #define PANU_SVCLASS_ID 0x1115 |
92 | #define NAP_SVCLASS_ID 0x1116 |
93 | #define GN_SVCLASS_ID 0x1117 |
94 | #define DIRECT_PRINTING_SVCLASS_ID 0x1118 |
95 | #define REFERENCE_PRINTING_SVCLASS_ID 0x1119 |
96 | #define IMAGING_SVCLASS_ID 0x111a |
97 | #define IMAGING_RESPONDER_SVCLASS_ID 0x111b |
98 | #define IMAGING_ARCHIVE_SVCLASS_ID 0x111c |
99 | #define IMAGING_REFOBJS_SVCLASS_ID 0x111d |
100 | #define HANDSFREE_SVCLASS_ID 0x111e |
101 | #define HANDSFREE_AGW_SVCLASS_ID 0x111f |
102 | #define DIRECT_PRT_REFOBJS_SVCLASS_ID 0x1120 |
103 | #define REFLECTED_UI_SVCLASS_ID 0x1121 |
104 | #define BASIC_PRINTING_SVCLASS_ID 0x1122 |
105 | #define PRINTING_STATUS_SVCLASS_ID 0x1123 |
106 | #define HID_SVCLASS_ID 0x1124 |
107 | #define HCR_SVCLASS_ID 0x1125 |
108 | #define HCR_PRINT_SVCLASS_ID 0x1126 |
109 | #define HCR_SCAN_SVCLASS_ID 0x1127 |
110 | #define CIP_SVCLASS_ID 0x1128 |
111 | #define VIDEO_CONF_GW_SVCLASS_ID 0x1129 |
112 | #define UDI_MT_SVCLASS_ID 0x112a |
113 | #define UDI_TA_SVCLASS_ID 0x112b |
114 | #define AV_SVCLASS_ID 0x112c |
115 | #define SAP_SVCLASS_ID 0x112d |
116 | #define PBAP_PCE_SVCLASS_ID 0x112e |
117 | #define PBAP_PSE_SVCLASS_ID 0x112f |
118 | #define PBAP_SVCLASS_ID 0x1130 |
119 | #define MAP_MSE_SVCLASS_ID 0x1132 |
120 | #define MAP_MCE_SVCLASS_ID 0x1133 |
121 | #define MAP_SVCLASS_ID 0x1134 |
122 | #define GNSS_SVCLASS_ID 0x1135 |
123 | #define GNSS_SERVER_SVCLASS_ID 0x1136 |
124 | #define MPS_SC_SVCLASS_ID 0x113A |
125 | #define MPS_SVCLASS_ID 0x113B |
126 | #define PNP_INFO_SVCLASS_ID 0x1200 |
127 | #define GENERIC_NETWORKING_SVCLASS_ID 0x1201 |
128 | #define GENERIC_FILETRANS_SVCLASS_ID 0x1202 |
129 | #define GENERIC_AUDIO_SVCLASS_ID 0x1203 |
130 | #define GENERIC_TELEPHONY_SVCLASS_ID 0x1204 |
131 | #define UPNP_SVCLASS_ID 0x1205 |
132 | #define UPNP_IP_SVCLASS_ID 0x1206 |
133 | #define UPNP_PAN_SVCLASS_ID 0x1300 |
134 | #define UPNP_LAP_SVCLASS_ID 0x1301 |
135 | #define UPNP_L2CAP_SVCLASS_ID 0x1302 |
136 | #define VIDEO_SOURCE_SVCLASS_ID 0x1303 |
137 | #define VIDEO_SINK_SVCLASS_ID 0x1304 |
138 | #define VIDEO_DISTRIBUTION_SVCLASS_ID 0x1305 |
139 | #define HDP_SVCLASS_ID 0x1400 |
140 | #define HDP_SOURCE_SVCLASS_ID 0x1401 |
141 | #define HDP_SINK_SVCLASS_ID 0x1402 |
142 | #define GENERIC_ACCESS_SVCLASS_ID 0x1800 |
143 | #define GENERIC_ATTRIB_SVCLASS_ID 0x1801 |
144 | #define APPLE_AGENT_SVCLASS_ID 0x2112 |
145 | |
146 | /* |
147 | * Standard profile descriptor identifiers; note these |
148 | * may be identical to some of the service classes defined above |
149 | */ |
150 | #define SDP_SERVER_PROFILE_ID SDP_SERVER_SVCLASS_ID |
151 | #define BROWSE_GRP_DESC_PROFILE_ID BROWSE_GRP_DESC_SVCLASS_ID |
152 | #define SERIAL_PORT_PROFILE_ID SERIAL_PORT_SVCLASS_ID |
153 | #define LAN_ACCESS_PROFILE_ID LAN_ACCESS_SVCLASS_ID |
154 | #define DIALUP_NET_PROFILE_ID DIALUP_NET_SVCLASS_ID |
155 | #define IRMC_SYNC_PROFILE_ID IRMC_SYNC_SVCLASS_ID |
156 | #define OBEX_OBJPUSH_PROFILE_ID OBEX_OBJPUSH_SVCLASS_ID |
157 | #define OBEX_FILETRANS_PROFILE_ID OBEX_FILETRANS_SVCLASS_ID |
158 | #define IRMC_SYNC_CMD_PROFILE_ID IRMC_SYNC_CMD_SVCLASS_ID |
159 | #define HEADSET_PROFILE_ID HEADSET_SVCLASS_ID |
160 | #define CORDLESS_TELEPHONY_PROFILE_ID CORDLESS_TELEPHONY_SVCLASS_ID |
161 | #define AUDIO_SOURCE_PROFILE_ID AUDIO_SOURCE_SVCLASS_ID |
162 | #define AUDIO_SINK_PROFILE_ID AUDIO_SINK_SVCLASS_ID |
163 | #define AV_REMOTE_TARGET_PROFILE_ID AV_REMOTE_TARGET_SVCLASS_ID |
164 | #define ADVANCED_AUDIO_PROFILE_ID ADVANCED_AUDIO_SVCLASS_ID |
165 | #define AV_REMOTE_PROFILE_ID AV_REMOTE_SVCLASS_ID |
166 | #define INTERCOM_PROFILE_ID INTERCOM_SVCLASS_ID |
167 | #define FAX_PROFILE_ID FAX_SVCLASS_ID |
168 | #define HEADSET_AGW_PROFILE_ID HEADSET_AGW_SVCLASS_ID |
169 | #define WAP_PROFILE_ID WAP_SVCLASS_ID |
170 | #define WAP_CLIENT_PROFILE_ID WAP_CLIENT_SVCLASS_ID |
171 | #define PANU_PROFILE_ID PANU_SVCLASS_ID |
172 | #define NAP_PROFILE_ID NAP_SVCLASS_ID |
173 | #define GN_PROFILE_ID GN_SVCLASS_ID |
174 | #define DIRECT_PRINTING_PROFILE_ID DIRECT_PRINTING_SVCLASS_ID |
175 | #define REFERENCE_PRINTING_PROFILE_ID REFERENCE_PRINTING_SVCLASS_ID |
176 | #define IMAGING_PROFILE_ID IMAGING_SVCLASS_ID |
177 | #define IMAGING_RESPONDER_PROFILE_ID IMAGING_RESPONDER_SVCLASS_ID |
178 | #define IMAGING_ARCHIVE_PROFILE_ID IMAGING_ARCHIVE_SVCLASS_ID |
179 | #define IMAGING_REFOBJS_PROFILE_ID IMAGING_REFOBJS_SVCLASS_ID |
180 | #define HANDSFREE_PROFILE_ID HANDSFREE_SVCLASS_ID |
181 | #define HANDSFREE_AGW_PROFILE_ID HANDSFREE_AGW_SVCLASS_ID |
182 | #define DIRECT_PRT_REFOBJS_PROFILE_ID DIRECT_PRT_REFOBJS_SVCLASS_ID |
183 | #define REFLECTED_UI_PROFILE_ID REFLECTED_UI_SVCLASS_ID |
184 | #define BASIC_PRINTING_PROFILE_ID BASIC_PRINTING_SVCLASS_ID |
185 | #define PRINTING_STATUS_PROFILE_ID PRINTING_STATUS_SVCLASS_ID |
186 | #define HID_PROFILE_ID HID_SVCLASS_ID |
187 | #define HCR_PROFILE_ID HCR_SCAN_SVCLASS_ID |
188 | #define HCR_PRINT_PROFILE_ID HCR_PRINT_SVCLASS_ID |
189 | #define HCR_SCAN_PROFILE_ID HCR_SCAN_SVCLASS_ID |
190 | #define CIP_PROFILE_ID CIP_SVCLASS_ID |
191 | #define VIDEO_CONF_GW_PROFILE_ID VIDEO_CONF_GW_SVCLASS_ID |
192 | #define UDI_MT_PROFILE_ID UDI_MT_SVCLASS_ID |
193 | #define UDI_TA_PROFILE_ID UDI_TA_SVCLASS_ID |
194 | #define AV_PROFILE_ID AV_SVCLASS_ID |
195 | #define SAP_PROFILE_ID SAP_SVCLASS_ID |
196 | #define PBAP_PCE_PROFILE_ID PBAP_PCE_SVCLASS_ID |
197 | #define PBAP_PSE_PROFILE_ID PBAP_PSE_SVCLASS_ID |
198 | #define PBAP_PROFILE_ID PBAP_SVCLASS_ID |
199 | #define MAP_PROFILE_ID MAP_SVCLASS_ID |
200 | #define PNP_INFO_PROFILE_ID PNP_INFO_SVCLASS_ID |
201 | #define GENERIC_NETWORKING_PROFILE_ID GENERIC_NETWORKING_SVCLASS_ID |
202 | #define GENERIC_FILETRANS_PROFILE_ID GENERIC_FILETRANS_SVCLASS_ID |
203 | #define GENERIC_AUDIO_PROFILE_ID GENERIC_AUDIO_SVCLASS_ID |
204 | #define GENERIC_TELEPHONY_PROFILE_ID GENERIC_TELEPHONY_SVCLASS_ID |
205 | #define UPNP_PROFILE_ID UPNP_SVCLASS_ID |
206 | #define UPNP_IP_PROFILE_ID UPNP_IP_SVCLASS_ID |
207 | #define UPNP_PAN_PROFILE_ID UPNP_PAN_SVCLASS_ID |
208 | #define UPNP_LAP_PROFILE_ID UPNP_LAP_SVCLASS_ID |
209 | #define UPNP_L2CAP_PROFILE_ID UPNP_L2CAP_SVCLASS_ID |
210 | #define VIDEO_SOURCE_PROFILE_ID VIDEO_SOURCE_SVCLASS_ID |
211 | #define VIDEO_SINK_PROFILE_ID VIDEO_SINK_SVCLASS_ID |
212 | #define VIDEO_DISTRIBUTION_PROFILE_ID VIDEO_DISTRIBUTION_SVCLASS_ID |
213 | #define HDP_PROFILE_ID HDP_SVCLASS_ID |
214 | #define HDP_SOURCE_PROFILE_ID HDP_SOURCE_SVCLASS_ID |
215 | #define HDP_SINK_PROFILE_ID HDP_SINK_SVCLASS_ID |
216 | #define GENERIC_ACCESS_PROFILE_ID GENERIC_ACCESS_SVCLASS_ID |
217 | #define GENERIC_ATTRIB_PROFILE_ID GENERIC_ATTRIB_SVCLASS_ID |
218 | #define APPLE_AGENT_PROFILE_ID APPLE_AGENT_SVCLASS_ID |
219 | #define MPS_PROFILE_ID MPS_SC_SVCLASS_ID |
220 | |
221 | /* |
222 | * Compatibility macros for the old MDP acronym |
223 | */ |
224 | #define MDP_SVCLASS_ID HDP_SVCLASS_ID |
225 | #define MDP_SOURCE_SVCLASS_ID HDP_SOURCE_SVCLASS_ID |
226 | #define MDP_SINK_SVCLASS_ID HDP_SINK_SVCLASS_ID |
227 | #define MDP_PROFILE_ID HDP_PROFILE_ID |
228 | #define MDP_SOURCE_PROFILE_ID HDP_SOURCE_PROFILE_ID |
229 | #define MDP_SINK_PROFILE_ID HDP_SINK_PROFILE_ID |
230 | |
231 | /* |
232 | * Attribute identifier codes |
233 | */ |
234 | #define SDP_SERVER_RECORD_HANDLE 0x0000 |
235 | |
236 | /* |
237 | * Possible values for attribute-id are listed below. |
238 | * See SDP Spec, section "Service Attribute Definitions" for more details. |
239 | */ |
240 | #define SDP_ATTR_RECORD_HANDLE 0x0000 |
241 | #define SDP_ATTR_SVCLASS_ID_LIST 0x0001 |
242 | #define SDP_ATTR_RECORD_STATE 0x0002 |
243 | #define SDP_ATTR_SERVICE_ID 0x0003 |
244 | #define SDP_ATTR_PROTO_DESC_LIST 0x0004 |
245 | #define SDP_ATTR_BROWSE_GRP_LIST 0x0005 |
246 | #define SDP_ATTR_LANG_BASE_ATTR_ID_LIST 0x0006 |
247 | #define SDP_ATTR_SVCINFO_TTL 0x0007 |
248 | #define SDP_ATTR_SERVICE_AVAILABILITY 0x0008 |
249 | #define SDP_ATTR_PFILE_DESC_LIST 0x0009 |
250 | #define SDP_ATTR_DOC_URL 0x000a |
251 | #define SDP_ATTR_CLNT_EXEC_URL 0x000b |
252 | #define SDP_ATTR_ICON_URL 0x000c |
253 | #define SDP_ATTR_ADD_PROTO_DESC_LIST 0x000d |
254 | |
255 | #define SDP_ATTR_GROUP_ID 0x0200 |
256 | #define SDP_ATTR_IP_SUBNET 0x0200 |
257 | #define SDP_ATTR_VERSION_NUM_LIST 0x0200 |
258 | #define SDP_ATTR_SUPPORTED_FEATURES_LIST 0x0200 |
259 | #define SDP_ATTR_GOEP_L2CAP_PSM 0x0200 |
260 | #define SDP_ATTR_SVCDB_STATE 0x0201 |
261 | |
262 | #define SDP_ATTR_MPSD_SCENARIOS 0x0200 |
263 | #define SDP_ATTR_MPMD_SCENARIOS 0x0201 |
264 | #define SDP_ATTR_MPS_DEPENDENCIES 0x0202 |
265 | |
266 | #define SDP_ATTR_SERVICE_VERSION 0x0300 |
267 | #define SDP_ATTR_EXTERNAL_NETWORK 0x0301 |
268 | #define SDP_ATTR_SUPPORTED_DATA_STORES_LIST 0x0301 |
269 | #define SDP_ATTR_DATA_EXCHANGE_SPEC 0x0301 |
270 | #define SDP_ATTR_NETWORK 0x0301 |
271 | #define SDP_ATTR_FAX_CLASS1_SUPPORT 0x0302 |
272 | #define SDP_ATTR_REMOTE_AUDIO_VOLUME_CONTROL 0x0302 |
273 | #define SDP_ATTR_MCAP_SUPPORTED_PROCEDURES 0x0302 |
274 | #define SDP_ATTR_FAX_CLASS20_SUPPORT 0x0303 |
275 | #define SDP_ATTR_SUPPORTED_FORMATS_LIST 0x0303 |
276 | #define SDP_ATTR_FAX_CLASS2_SUPPORT 0x0304 |
277 | #define SDP_ATTR_AUDIO_FEEDBACK_SUPPORT 0x0305 |
278 | #define SDP_ATTR_NETWORK_ADDRESS 0x0306 |
279 | #define SDP_ATTR_WAP_GATEWAY 0x0307 |
280 | #define SDP_ATTR_HOMEPAGE_URL 0x0308 |
281 | #define SDP_ATTR_WAP_STACK_TYPE 0x0309 |
282 | #define SDP_ATTR_SECURITY_DESC 0x030a |
283 | #define SDP_ATTR_NET_ACCESS_TYPE 0x030b |
284 | #define SDP_ATTR_MAX_NET_ACCESSRATE 0x030c |
285 | #define SDP_ATTR_IP4_SUBNET 0x030d |
286 | #define SDP_ATTR_IP6_SUBNET 0x030e |
287 | #define SDP_ATTR_SUPPORTED_CAPABILITIES 0x0310 |
288 | #define SDP_ATTR_SUPPORTED_FEATURES 0x0311 |
289 | #define SDP_ATTR_SUPPORTED_FUNCTIONS 0x0312 |
290 | #define SDP_ATTR_TOTAL_IMAGING_DATA_CAPACITY 0x0313 |
291 | #define SDP_ATTR_SUPPORTED_REPOSITORIES 0x0314 |
292 | #define SDP_ATTR_MAS_INSTANCE_ID 0x0315 |
293 | #define SDP_ATTR_SUPPORTED_MESSAGE_TYPES 0x0316 |
294 | #define SDP_ATTR_PBAP_SUPPORTED_FEATURES 0x0317 |
295 | #define SDP_ATTR_MAP_SUPPORTED_FEATURES 0x0317 |
296 | |
297 | #define SDP_ATTR_SPECIFICATION_ID 0x0200 |
298 | #define SDP_ATTR_VENDOR_ID 0x0201 |
299 | #define SDP_ATTR_PRODUCT_ID 0x0202 |
300 | #define SDP_ATTR_VERSION 0x0203 |
301 | #define SDP_ATTR_PRIMARY_RECORD 0x0204 |
302 | #define SDP_ATTR_VENDOR_ID_SOURCE 0x0205 |
303 | |
304 | #define SDP_ATTR_HID_DEVICE_RELEASE_NUMBER 0x0200 |
305 | #define SDP_ATTR_HID_PARSER_VERSION 0x0201 |
306 | #define SDP_ATTR_HID_DEVICE_SUBCLASS 0x0202 |
307 | #define SDP_ATTR_HID_COUNTRY_CODE 0x0203 |
308 | #define SDP_ATTR_HID_VIRTUAL_CABLE 0x0204 |
309 | #define SDP_ATTR_HID_RECONNECT_INITIATE 0x0205 |
310 | #define SDP_ATTR_HID_DESCRIPTOR_LIST 0x0206 |
311 | #define SDP_ATTR_HID_LANG_ID_BASE_LIST 0x0207 |
312 | #define SDP_ATTR_HID_SDP_DISABLE 0x0208 |
313 | #define SDP_ATTR_HID_BATTERY_POWER 0x0209 |
314 | #define SDP_ATTR_HID_REMOTE_WAKEUP 0x020a |
315 | #define SDP_ATTR_HID_PROFILE_VERSION 0x020b |
316 | #define SDP_ATTR_HID_SUPERVISION_TIMEOUT 0x020c |
317 | #define SDP_ATTR_HID_NORMALLY_CONNECTABLE 0x020d |
318 | #define SDP_ATTR_HID_BOOT_DEVICE 0x020e |
319 | |
320 | /* |
321 | * These identifiers are based on the SDP spec stating that |
322 | * "base attribute id of the primary (universal) language must be 0x0100" |
323 | * |
324 | * Other languages should have their own offset; e.g.: |
325 | * #define XXXLangBase yyyy |
326 | * #define AttrServiceName_XXX 0x0000+XXXLangBase |
327 | */ |
328 | #define SDP_PRIMARY_LANG_BASE 0x0100 |
329 | |
330 | #define SDP_ATTR_SVCNAME_PRIMARY 0x0000 + SDP_PRIMARY_LANG_BASE |
331 | #define SDP_ATTR_SVCDESC_PRIMARY 0x0001 + SDP_PRIMARY_LANG_BASE |
332 | #define SDP_ATTR_PROVNAME_PRIMARY 0x0002 + SDP_PRIMARY_LANG_BASE |
333 | |
334 | /* |
335 | * The Data representation in SDP PDUs (pps 339, 340 of BT SDP Spec) |
336 | * These are the exact data type+size descriptor values |
337 | * that go into the PDU buffer. |
338 | * |
339 | * The datatype (leading 5bits) + size descriptor (last 3 bits) |
340 | * is 8 bits. The size descriptor is critical to extract the |
341 | * right number of bytes for the data value from the PDU. |
342 | * |
343 | * For most basic types, the datatype+size descriptor is |
344 | * straightforward. However for constructed types and strings, |
345 | * the size of the data is in the next "n" bytes following the |
346 | * 8 bits (datatype+size) descriptor. Exactly what the "n" is |
347 | * specified in the 3 bits of the data size descriptor. |
348 | * |
349 | * TextString and URLString can be of size 2^{8, 16, 32} bytes |
350 | * DataSequence and DataSequenceAlternates can be of size 2^{8, 16, 32} |
351 | * The size are computed post-facto in the API and are not known apriori |
352 | */ |
353 | #define SDP_DATA_NIL 0x00 |
354 | #define SDP_UINT8 0x08 |
355 | #define SDP_UINT16 0x09 |
356 | #define SDP_UINT32 0x0A |
357 | #define SDP_UINT64 0x0B |
358 | #define SDP_UINT128 0x0C |
359 | #define SDP_INT8 0x10 |
360 | #define SDP_INT16 0x11 |
361 | #define SDP_INT32 0x12 |
362 | #define SDP_INT64 0x13 |
363 | #define SDP_INT128 0x14 |
364 | #define SDP_UUID_UNSPEC 0x18 |
365 | #define SDP_UUID16 0x19 |
366 | #define SDP_UUID32 0x1A |
367 | #define SDP_UUID128 0x1C |
368 | #define SDP_TEXT_STR_UNSPEC 0x20 |
369 | #define SDP_TEXT_STR8 0x25 |
370 | #define SDP_TEXT_STR16 0x26 |
371 | #define SDP_TEXT_STR32 0x27 |
372 | #define SDP_BOOL 0x28 |
373 | #define SDP_SEQ_UNSPEC 0x30 |
374 | #define SDP_SEQ8 0x35 |
375 | #define SDP_SEQ16 0x36 |
376 | #define SDP_SEQ32 0x37 |
377 | #define SDP_ALT_UNSPEC 0x38 |
378 | #define SDP_ALT8 0x3D |
379 | #define SDP_ALT16 0x3E |
380 | #define SDP_ALT32 0x3F |
381 | #define SDP_URL_STR_UNSPEC 0x40 |
382 | #define SDP_URL_STR8 0x45 |
383 | #define SDP_URL_STR16 0x46 |
384 | #define SDP_URL_STR32 0x47 |
385 | |
386 | /* |
387 | * The PDU identifiers of SDP packets between client and server |
388 | */ |
389 | #define SDP_ERROR_RSP 0x01 |
390 | #define SDP_SVC_SEARCH_REQ 0x02 |
391 | #define SDP_SVC_SEARCH_RSP 0x03 |
392 | #define SDP_SVC_ATTR_REQ 0x04 |
393 | #define SDP_SVC_ATTR_RSP 0x05 |
394 | #define SDP_SVC_SEARCH_ATTR_REQ 0x06 |
395 | #define SDP_SVC_SEARCH_ATTR_RSP 0x07 |
396 | |
397 | /* |
398 | * Some additions to support service registration. |
399 | * These are outside the scope of the Bluetooth specification |
400 | */ |
401 | #define SDP_SVC_REGISTER_REQ 0x75 |
402 | #define SDP_SVC_REGISTER_RSP 0x76 |
403 | #define SDP_SVC_UPDATE_REQ 0x77 |
404 | #define SDP_SVC_UPDATE_RSP 0x78 |
405 | #define SDP_SVC_REMOVE_REQ 0x79 |
406 | #define SDP_SVC_REMOVE_RSP 0x80 |
407 | |
408 | /* |
409 | * SDP Error codes |
410 | */ |
411 | #define SDP_INVALID_VERSION 0x0001 |
412 | #define SDP_INVALID_RECORD_HANDLE 0x0002 |
413 | #define SDP_INVALID_SYNTAX 0x0003 |
414 | #define SDP_INVALID_PDU_SIZE 0x0004 |
415 | #define SDP_INVALID_CSTATE 0x0005 |
416 | |
417 | /* |
418 | * SDP PDU |
419 | */ |
420 | typedef struct { |
421 | uint8_t pdu_id; |
422 | uint16_t tid; |
423 | uint16_t plen; |
424 | } __attribute__ ((packed)) sdp_pdu_hdr_t; |
425 | |
426 | /* |
427 | * Common definitions for attributes in the SDP. |
428 | * Should the type of any of these change, you need only make a change here. |
429 | */ |
430 | |
431 | typedef struct { |
432 | uint8_t type; |
433 | union { |
434 | uint16_t uuid16; |
435 | uint32_t uuid32; |
436 | uint128_t uuid128; |
437 | } value; |
438 | } uuid_t; |
439 | |
440 | #define SDP_IS_UUID(x) ((x) == SDP_UUID16 || (x) == SDP_UUID32 || \ |
441 | (x) == SDP_UUID128) |
442 | #define SDP_IS_ALT(x) ((x) == SDP_ALT8 || (x) == SDP_ALT16 || (x) == SDP_ALT32) |
443 | #define SDP_IS_SEQ(x) ((x) == SDP_SEQ8 || (x) == SDP_SEQ16 || (x) == SDP_SEQ32) |
444 | #define SDP_IS_TEXT_STR(x) ((x) == SDP_TEXT_STR8 || (x) == SDP_TEXT_STR16 || \ |
445 | (x) == SDP_TEXT_STR32) |
446 | |
447 | typedef struct _sdp_list sdp_list_t; |
448 | struct _sdp_list { |
449 | sdp_list_t *next; |
450 | void *data; |
451 | }; |
452 | |
453 | /* |
454 | * User-visible strings can be in many languages |
455 | * in addition to the universal language. |
456 | * |
457 | * Language meta-data includes language code in ISO639 |
458 | * followed by the encoding format. The third field in this |
459 | * structure is the attribute offset for the language. |
460 | * User-visible strings in the specified language can be |
461 | * obtained at this offset. |
462 | */ |
463 | typedef struct { |
464 | uint16_t code_ISO639; |
465 | uint16_t encoding; |
466 | uint16_t base_offset; |
467 | } sdp_lang_attr_t; |
468 | |
469 | /* |
470 | * Profile descriptor is the Bluetooth profile metadata. If a |
471 | * service conforms to a well-known profile, then its profile |
472 | * identifier (UUID) is an attribute of the service. In addition, |
473 | * if the profile has a version number it is specified here. |
474 | */ |
475 | typedef struct { |
476 | uuid_t uuid; |
477 | uint16_t version; |
478 | } sdp_profile_desc_t; |
479 | |
480 | typedef struct { |
481 | uint8_t major; |
482 | uint8_t minor; |
483 | } sdp_version_t; |
484 | |
485 | typedef struct { |
486 | uint8_t *data; |
487 | uint32_t data_size; |
488 | uint32_t buf_size; |
489 | } sdp_buf_t; |
490 | |
491 | typedef struct { |
492 | uint32_t handle; |
493 | |
494 | /* Search pattern: a sequence of all UUIDs seen in this record */ |
495 | sdp_list_t *pattern; |
496 | sdp_list_t *attrlist; |
497 | |
498 | /* Main service class for Extended Inquiry Response */ |
499 | uuid_t svclass; |
500 | } sdp_record_t; |
501 | |
502 | typedef struct sdp_data_struct sdp_data_t; |
503 | struct sdp_data_struct { |
504 | uint8_t dtd; |
505 | uint16_t attrId; |
506 | union { |
507 | int8_t int8; |
508 | int16_t int16; |
509 | int32_t int32; |
510 | int64_t int64; |
511 | uint128_t int128; |
512 | uint8_t uint8; |
513 | uint16_t uint16; |
514 | uint32_t uint32; |
515 | uint64_t uint64; |
516 | uint128_t uint128; |
517 | uuid_t uuid; |
518 | char *str; |
519 | sdp_data_t *dataseq; |
520 | } val; |
521 | sdp_data_t *next; |
522 | int unitSize; |
523 | }; |
524 | |
525 | #ifdef __cplusplus |
526 | } |
527 | #endif |
528 | |
529 | #endif /* __SDP_H */ |
530 | |