1 /** @file
2  *  @brief Service Discovery Protocol handling.
3  */
4 
5 /*
6  * Copyright (c) 2016 Intel Corporation
7  *
8  * SPDX-License-Identifier: Apache-2.0
9  */
10 #ifndef ZEPHYR_INCLUDE_BLUETOOTH_SDP_H_
11 #define ZEPHYR_INCLUDE_BLUETOOTH_SDP_H_
12 
13 /**
14  * @file
15  * @brief Service Discovery Protocol (SDP)
16  * @defgroup bt_sdp Service Discovery Protocol (SDP)
17  * @ingroup bluetooth
18  * @{
19  */
20 
21 #include <zephyr/bluetooth/uuid.h>
22 #include <zephyr/bluetooth/conn.h>
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 /*
29  * All definitions are based on Bluetooth Assigned Numbers
30  * of the Bluetooth Specification
31  */
32 
33 /**
34  * @name Service class identifiers of standard services and service groups
35  * @{
36  */
37 #define BT_SDP_SDP_SERVER_SVCLASS           0x1000 /**< Service Discovery Server */
38 #define BT_SDP_BROWSE_GRP_DESC_SVCLASS      0x1001 /**< Browse Group Descriptor */
39 #define BT_SDP_PUBLIC_BROWSE_GROUP          0x1002 /**< Public Browse Group */
40 #define BT_SDP_SERIAL_PORT_SVCLASS          0x1101 /**< Serial Port */
41 #define BT_SDP_LAN_ACCESS_SVCLASS           0x1102 /**< LAN Access Using PPP */
42 #define BT_SDP_DIALUP_NET_SVCLASS           0x1103 /**< Dialup Networking */
43 #define BT_SDP_IRMC_SYNC_SVCLASS            0x1104 /**< IrMC Sync */
44 #define BT_SDP_OBEX_OBJPUSH_SVCLASS         0x1105 /**< OBEX Object Push */
45 #define BT_SDP_OBEX_FILETRANS_SVCLASS       0x1106 /**< OBEX File Transfer */
46 #define BT_SDP_IRMC_SYNC_CMD_SVCLASS        0x1107 /**< IrMC Sync Command */
47 #define BT_SDP_HEADSET_SVCLASS              0x1108 /**< Headset */
48 #define BT_SDP_CORDLESS_TELEPHONY_SVCLASS   0x1109 /**< Cordless Telephony */
49 #define BT_SDP_AUDIO_SOURCE_SVCLASS         0x110a /**< Audio Source */
50 #define BT_SDP_AUDIO_SINK_SVCLASS           0x110b /**< Audio Sink */
51 #define BT_SDP_AV_REMOTE_TARGET_SVCLASS     0x110c /**< A/V Remote Control Target */
52 #define BT_SDP_ADVANCED_AUDIO_SVCLASS       0x110d /**< Advanced Audio Distribution */
53 #define BT_SDP_AV_REMOTE_SVCLASS            0x110e /**< A/V Remote Control */
54 #define BT_SDP_AV_REMOTE_CONTROLLER_SVCLASS 0x110f /**< A/V Remote Control Controller */
55 #define BT_SDP_INTERCOM_SVCLASS             0x1110 /**< Intercom */
56 #define BT_SDP_FAX_SVCLASS                  0x1111 /**< Fax */
57 #define BT_SDP_HEADSET_AGW_SVCLASS          0x1112 /**< Headset AG */
58 #define BT_SDP_WAP_SVCLASS                  0x1113 /**< WAP */
59 #define BT_SDP_WAP_CLIENT_SVCLASS           0x1114 /**< WAP Client */
60 #define BT_SDP_PANU_SVCLASS                 0x1115 /**< Personal Area Networking User */
61 #define BT_SDP_NAP_SVCLASS                  0x1116 /**< Network Access Point */
62 #define BT_SDP_GN_SVCLASS                   0x1117 /**< Group Network */
63 #define BT_SDP_DIRECT_PRINTING_SVCLASS      0x1118 /**< Direct Printing */
64 #define BT_SDP_REFERENCE_PRINTING_SVCLASS   0x1119 /**< Reference Printing */
65 #define BT_SDP_IMAGING_SVCLASS              0x111a /**< Basic Imaging Profile */
66 #define BT_SDP_IMAGING_RESPONDER_SVCLASS    0x111b /**< Imaging Responder */
67 #define BT_SDP_IMAGING_ARCHIVE_SVCLASS      0x111c /**< Imaging Automatic Archive */
68 #define BT_SDP_IMAGING_REFOBJS_SVCLASS      0x111d /**< Imaging Referenced Objects */
69 #define BT_SDP_HANDSFREE_SVCLASS            0x111e /**< Handsfree */
70 #define BT_SDP_HANDSFREE_AGW_SVCLASS        0x111f /**< Handsfree Audio Gateway */
71 #define BT_SDP_DIRECT_PRT_REFOBJS_SVCLASS   0x1120 /**< Direct Printing Reference Objects Service */
72 #define BT_SDP_REFLECTED_UI_SVCLASS         0x1121 /**< Reflected UI */
73 #define BT_SDP_BASIC_PRINTING_SVCLASS       0x1122 /**< Basic Printing */
74 #define BT_SDP_PRINTING_STATUS_SVCLASS      0x1123 /**< Printing Status */
75 #define BT_SDP_HID_SVCLASS                  0x1124 /**< Human Interface Device Service */
76 #define BT_SDP_HCR_SVCLASS                  0x1125 /**< Hardcopy Cable Replacement */
77 #define BT_SDP_HCR_PRINT_SVCLASS            0x1126 /**< HCR Print */
78 #define BT_SDP_HCR_SCAN_SVCLASS             0x1127 /**< HCR Scan */
79 #define BT_SDP_CIP_SVCLASS                  0x1128 /**< Common ISDN Access */
80 #define BT_SDP_VIDEO_CONF_GW_SVCLASS        0x1129 /**< Video Conferencing Gateway */
81 #define BT_SDP_UDI_MT_SVCLASS               0x112a /**< UDI MT */
82 #define BT_SDP_UDI_TA_SVCLASS               0x112b /**< UDI TA */
83 #define BT_SDP_AV_SVCLASS                   0x112c /**< Audio/Video */
84 #define BT_SDP_SAP_SVCLASS                  0x112d /**< SIM Access */
85 #define BT_SDP_PBAP_PCE_SVCLASS             0x112e /**< Phonebook Access Client */
86 #define BT_SDP_PBAP_PSE_SVCLASS             0x112f /**< Phonebook Access Server */
87 #define BT_SDP_PBAP_SVCLASS                 0x1130 /**< Phonebook Access */
88 #define BT_SDP_MAP_MSE_SVCLASS              0x1132 /**< Message Access Server */
89 #define BT_SDP_MAP_MCE_SVCLASS              0x1133 /**< Message Notification Server */
90 #define BT_SDP_MAP_SVCLASS                  0x1134 /**< Message Access Profile */
91 #define BT_SDP_GNSS_SVCLASS                 0x1135 /**< GNSS */
92 #define BT_SDP_GNSS_SERVER_SVCLASS          0x1136 /**< GNSS Server */
93 #define BT_SDP_MPS_SC_SVCLASS               0x113a /**< MPS SC */
94 #define BT_SDP_MPS_SVCLASS                  0x113b /**< MPS */
95 #define BT_SDP_PNP_INFO_SVCLASS             0x1200 /**< PnP Information */
96 #define BT_SDP_GENERIC_NETWORKING_SVCLASS   0x1201 /**< Generic Networking */
97 #define BT_SDP_GENERIC_FILETRANS_SVCLASS    0x1202 /**< Generic File Transfer */
98 #define BT_SDP_GENERIC_AUDIO_SVCLASS        0x1203 /**< Generic Audio */
99 #define BT_SDP_GENERIC_TELEPHONY_SVCLASS    0x1204 /**< Generic Telephony */
100 #define BT_SDP_UPNP_SVCLASS                 0x1205 /**< UPnP Service */
101 #define BT_SDP_UPNP_IP_SVCLASS              0x1206 /**< UPnP IP Service */
102 #define BT_SDP_UPNP_PAN_SVCLASS             0x1300 /**< UPnP IP PAN */
103 #define BT_SDP_UPNP_LAP_SVCLASS             0x1301 /**< UPnP IP LAP */
104 #define BT_SDP_UPNP_L2CAP_SVCLASS           0x1302 /**< UPnP IP L2CAP */
105 #define BT_SDP_VIDEO_SOURCE_SVCLASS         0x1303 /**< Video Source */
106 #define BT_SDP_VIDEO_SINK_SVCLASS           0x1304 /**< Video Sink */
107 #define BT_SDP_VIDEO_DISTRIBUTION_SVCLASS   0x1305 /**< Video Distribution */
108 #define BT_SDP_HDP_SVCLASS                  0x1400 /**< HDP */
109 #define BT_SDP_HDP_SOURCE_SVCLASS           0x1401 /**< HDP Source */
110 #define BT_SDP_HDP_SINK_SVCLASS             0x1402 /**< HDP Sink */
111 #define BT_SDP_GENERIC_ACCESS_SVCLASS       0x1800 /**< Generic Access Profile */
112 #define BT_SDP_GENERIC_ATTRIB_SVCLASS       0x1801 /**< Generic Attribute Profile */
113 #define BT_SDP_APPLE_AGENT_SVCLASS          0x2112 /**< Apple Agent */
114 /**
115  * @}
116  */
117 
118 #define BT_SDP_SERVER_RECORD_HANDLE 0x0000
119 
120 /**
121  * @name Attribute identifier codes
122  *
123  * Possible values for attribute-id are listed below.
124  * See SDP Spec, section "Service Attribute Definitions" for more details.
125  *
126  * @{
127  */
128 #define BT_SDP_ATTR_RECORD_HANDLE               0x0000 /**< Service Record Handle */
129 #define BT_SDP_ATTR_SVCLASS_ID_LIST             0x0001 /**< Service Class ID List */
130 #define BT_SDP_ATTR_RECORD_STATE                0x0002 /**< Service Record State */
131 #define BT_SDP_ATTR_SERVICE_ID                  0x0003 /**< Service ID */
132 #define BT_SDP_ATTR_PROTO_DESC_LIST             0x0004 /**< Protocol Descriptor List */
133 #define BT_SDP_ATTR_BROWSE_GRP_LIST             0x0005 /**< Browse Group List */
134 #define BT_SDP_ATTR_LANG_BASE_ATTR_ID_LIST      0x0006 /**< Language Base Attribute ID List */
135 #define BT_SDP_ATTR_SVCINFO_TTL                 0x0007 /**< Service Info Time to Live */
136 #define BT_SDP_ATTR_SERVICE_AVAILABILITY        0x0008 /**< Service Availability */
137 #define BT_SDP_ATTR_PROFILE_DESC_LIST           0x0009 /**< Bluetooth Profile Descriptor List */
138 #define BT_SDP_ATTR_DOC_URL                     0x000a /**< Documentation URL */
139 #define BT_SDP_ATTR_CLNT_EXEC_URL               0x000b /**< Client Executable URL */
140 #define BT_SDP_ATTR_ICON_URL                    0x000c /**< Icon URL */
141 #define BT_SDP_ATTR_ADD_PROTO_DESC_LIST         0x000d /**< Additional Protocol Descriptor List */
142 
143 #define BT_SDP_ATTR_GROUP_ID                    0x0200 /**< Group ID */
144 #define BT_SDP_ATTR_IP_SUBNET                   0x0200 /**< IP Subnet */
145 #define BT_SDP_ATTR_VERSION_NUM_LIST            0x0200 /**< Version Number List */
146 #define BT_SDP_ATTR_SUPPORTED_FEATURES_LIST     0x0200 /**< Supported Features List */
147 #define BT_SDP_ATTR_GOEP_L2CAP_PSM              0x0200 /**< GOEP L2CAP PSM */
148 #define BT_SDP_ATTR_SVCDB_STATE                 0x0201 /**< Service Database State */
149 
150 #define BT_SDP_ATTR_MPSD_SCENARIOS              0x0200 /**< MPSD Scenarios */
151 #define BT_SDP_ATTR_MPMD_SCENARIOS              0x0201 /**< MPMD Scenarios */
152 #define BT_SDP_ATTR_MPS_DEPENDENCIES            0x0202 /**< Supported Profiles & Protocols */
153 
154 #define BT_SDP_ATTR_SERVICE_VERSION             0x0300 /**< Service Version */
155 #define BT_SDP_ATTR_EXTERNAL_NETWORK            0x0301 /**< External Network */
156 #define BT_SDP_ATTR_SUPPORTED_DATA_STORES_LIST  0x0301 /**< Supported Data Stores List */
157 #define BT_SDP_ATTR_DATA_EXCHANGE_SPEC          0x0301 /**< Data Exchange Specification */
158 #define BT_SDP_ATTR_NETWORK                     0x0301 /**< Network */
159 #define BT_SDP_ATTR_FAX_CLASS1_SUPPORT          0x0302 /**< Fax Class 1 Support */
160 #define BT_SDP_ATTR_REMOTE_AUDIO_VOLUME_CONTROL 0x0302 /**< Remote Audio Volume Control */
161 #define BT_SDP_ATTR_MCAP_SUPPORTED_PROCEDURES   0x0302 /**< MCAP Supported Procedures */
162 #define BT_SDP_ATTR_FAX_CLASS20_SUPPORT         0x0303 /**< Fax Class 2.0 Support */
163 #define BT_SDP_ATTR_SUPPORTED_FORMATS_LIST      0x0303 /**< Supported Formats List */
164 #define BT_SDP_ATTR_FAX_CLASS2_SUPPORT          0x0304 /**< Fax Class 2 Support (vendor-specific)*/
165 #define BT_SDP_ATTR_AUDIO_FEEDBACK_SUPPORT      0x0305 /**< Audio Feedback Support */
166 #define BT_SDP_ATTR_NETWORK_ADDRESS             0x0306 /**< Network Address */
167 #define BT_SDP_ATTR_WAP_GATEWAY                 0x0307 /**< WAP Gateway */
168 #define BT_SDP_ATTR_HOMEPAGE_URL                0x0308 /**< Homepage URL */
169 #define BT_SDP_ATTR_WAP_STACK_TYPE              0x0309 /**< WAP Stack Type */
170 #define BT_SDP_ATTR_SECURITY_DESC               0x030a /**< Security Description */
171 #define BT_SDP_ATTR_NET_ACCESS_TYPE             0x030b /**< Net Access Type */
172 #define BT_SDP_ATTR_MAX_NET_ACCESSRATE          0x030c /**< Max Net Access Rate */
173 #define BT_SDP_ATTR_IP4_SUBNET                  0x030d /**< IPv4 Subnet */
174 #define BT_SDP_ATTR_IP6_SUBNET                  0x030e /**< IPv6 Subnet */
175 #define BT_SDP_ATTR_SUPPORTED_CAPABILITIES      0x0310 /**< BIP Supported Capabilities */
176 #define BT_SDP_ATTR_SUPPORTED_FEATURES          0x0311 /**< BIP Supported Features */
177 #define BT_SDP_ATTR_SUPPORTED_FUNCTIONS         0x0312 /**< BIP Supported Functions */
178 #define BT_SDP_ATTR_TOTAL_IMAGING_DATA_CAPACITY 0x0313 /**< BIP Total Imaging Data Capacity */
179 #define BT_SDP_ATTR_SUPPORTED_REPOSITORIES      0x0314 /**< Supported Repositories */
180 #define BT_SDP_ATTR_MAS_INSTANCE_ID             0x0315 /**< MAS Instance ID */
181 #define BT_SDP_ATTR_SUPPORTED_MESSAGE_TYPES     0x0316 /**< Supported Message Types */
182 #define BT_SDP_ATTR_PBAP_SUPPORTED_FEATURES     0x0317 /**< PBAP Supported Features */
183 #define BT_SDP_ATTR_MAP_SUPPORTED_FEATURES      0x0317 /**< MAP Supported Features */
184 
185 #define BT_SDP_ATTR_SPECIFICATION_ID            0x0200 /**< Specification ID */
186 #define BT_SDP_ATTR_VENDOR_ID                   0x0201 /**< Vendor ID */
187 #define BT_SDP_ATTR_PRODUCT_ID                  0x0202 /**< Product ID */
188 #define BT_SDP_ATTR_VERSION                     0x0203 /**< Version */
189 #define BT_SDP_ATTR_PRIMARY_RECORD              0x0204 /**< Primary Record */
190 #define BT_SDP_ATTR_VENDOR_ID_SOURCE            0x0205 /**< Vendor ID Source */
191 
192 #define BT_SDP_ATTR_HID_DEVICE_RELEASE_NUMBER   0x0200 /**< HID Device Release Number */
193 #define BT_SDP_ATTR_HID_PARSER_VERSION          0x0201 /**< HID Parser Version */
194 #define BT_SDP_ATTR_HID_DEVICE_SUBCLASS         0x0202 /**< HID Device Subclass */
195 #define BT_SDP_ATTR_HID_COUNTRY_CODE            0x0203 /**< HID Country Code */
196 #define BT_SDP_ATTR_HID_VIRTUAL_CABLE           0x0204 /**< HID Virtual Cable */
197 #define BT_SDP_ATTR_HID_RECONNECT_INITIATE      0x0205 /**< HID Reconnect Initiate */
198 #define BT_SDP_ATTR_HID_DESCRIPTOR_LIST         0x0206 /**< HID Descriptor List */
199 #define BT_SDP_ATTR_HID_LANG_ID_BASE_LIST       0x0207 /**< HID Language ID Base List */
200 #define BT_SDP_ATTR_HID_SDP_DISABLE             0x0208 /**< HID SDP Disable */
201 #define BT_SDP_ATTR_HID_BATTERY_POWER           0x0209 /**< HID Battery Power */
202 #define BT_SDP_ATTR_HID_REMOTE_WAKEUP           0x020a /**< HID Remote Wakeup */
203 #define BT_SDP_ATTR_HID_PROFILE_VERSION         0x020b /**< HID Profile Version */
204 #define BT_SDP_ATTR_HID_SUPERVISION_TIMEOUT     0x020c /**< HID Supervision Timeout */
205 #define BT_SDP_ATTR_HID_NORMALLY_CONNECTABLE    0x020d /**< HID Normally Connectable */
206 #define BT_SDP_ATTR_HID_BOOT_DEVICE             0x020e /**< HID Boot Device */
207 /**
208  * @}
209  */
210 
211 /*
212  * These identifiers are based on the SDP spec stating that
213  * "base attribute id of the primary (universal) language must be 0x0100"
214  *
215  * Other languages should have their own offset; e.g.:
216  * #define XXXLangBase yyyy
217  * #define AttrServiceName_XXX 0x0000+XXXLangBase
218  */
219 #define BT_SDP_PRIMARY_LANG_BASE  0x0100
220 
221 #define BT_SDP_ATTR_SVCNAME_PRIMARY (0x0000 + BT_SDP_PRIMARY_LANG_BASE)
222 #define BT_SDP_ATTR_SVCDESC_PRIMARY (0x0001 + BT_SDP_PRIMARY_LANG_BASE)
223 #define BT_SDP_ATTR_PROVNAME_PRIMARY (0x0002 + BT_SDP_PRIMARY_LANG_BASE)
224 
225 /**
226  * @name The Data representation in SDP PDUs (pps 339, 340 of BT SDP Spec)
227  *
228  * These are the exact data type+size descriptor values
229  * that go into the PDU buffer.
230  *
231  * The datatype (leading 5bits) + size descriptor (last 3 bits)
232  * is 8 bits. The size descriptor is critical to extract the
233  * right number of bytes for the data value from the PDU.
234  *
235  * For most basic types, the datatype+size descriptor is
236  * straightforward. However for constructed types and strings,
237  * the size of the data is in the next "n" bytes following the
238  * 8 bits (datatype+size) descriptor. Exactly what the "n" is
239  * specified in the 3 bits of the data size descriptor.
240  *
241  * TextString and URLString can be of size 2^{8, 16, 32} bytes
242  * DataSequence and DataSequenceAlternates can be of size 2^{8, 16, 32}
243  * The size are computed post-facto in the API and are not known apriori.
244  * @{
245  */
246 #define BT_SDP_DATA_NIL        0x00	/**< Nil, the null type */
247 #define BT_SDP_UINT8           0x08	/**< Unsigned 8-bit integer */
248 #define BT_SDP_UINT16          0x09	/**< Unsigned 16-bit integer */
249 #define BT_SDP_UINT32          0x0a	/**< Unsigned 32-bit integer */
250 #define BT_SDP_UINT64          0x0b	/**< Unsigned 64-bit integer */
251 #define BT_SDP_UINT128         0x0c	/**< Unsigned 128-bit integer */
252 #define BT_SDP_INT8            0x10	/**< Signed 8-bit integer */
253 #define BT_SDP_INT16           0x11	/**< Signed 16-bit integer */
254 #define BT_SDP_INT32           0x12	/**< Signed 32-bit integer */
255 #define BT_SDP_INT64           0x13	/**< Signed 64-bit integer */
256 #define BT_SDP_INT128          0x14	/**< Signed 128-bit integer */
257 #define BT_SDP_UUID_UNSPEC     0x18	/**< UUID, unspecified size */
258 #define BT_SDP_UUID16          0x19	/**< UUID, 16-bit */
259 #define BT_SDP_UUID32          0x1a	/**< UUID, 32-bit */
260 #define BT_SDP_UUID128         0x1c	/**< UUID, 128-bit */
261 #define BT_SDP_TEXT_STR_UNSPEC 0x20	/**< Text string, unspecified size */
262 #define BT_SDP_TEXT_STR8       0x25	/**< Text string, 8-bit length */
263 #define BT_SDP_TEXT_STR16      0x26	/**< Text string, 16-bit length */
264 #define BT_SDP_TEXT_STR32      0x27	/**< Text string, 32-bit length */
265 #define BT_SDP_BOOL            0x28	/**< Boolean */
266 #define BT_SDP_SEQ_UNSPEC      0x30	/**< Data element sequence, unspecified size */
267 #define BT_SDP_SEQ8            0x35	/**< Data element sequence, 8-bit length */
268 #define BT_SDP_SEQ16           0x36	/**< Data element sequence, 16-bit length */
269 #define BT_SDP_SEQ32           0x37	/**< Data element sequence, 32-bit length */
270 #define BT_SDP_ALT_UNSPEC      0x38	/**< Data element alternative, unspecified size */
271 #define BT_SDP_ALT8            0x3d	/**< Data element alternative, 8-bit length */
272 #define BT_SDP_ALT16           0x3e	/**< Data element alternative, 16-bit length */
273 #define BT_SDP_ALT32           0x3f	/**< Data element alternative, 32-bit length */
274 #define BT_SDP_URL_STR_UNSPEC  0x40	/**< URL string, unspecified size */
275 #define BT_SDP_URL_STR8        0x45	/**< URL string, 8-bit length */
276 #define BT_SDP_URL_STR16       0x46	/**< URL string, 16-bit length */
277 #define BT_SDP_URL_STR32       0x47	/**< URL string, 32-bit length */
278 /**
279  * @}
280  */
281 
282 #define BT_SDP_TYPE_DESC_MASK 0xf8
283 #define BT_SDP_SIZE_DESC_MASK 0x07
284 #define BT_SDP_SIZE_INDEX_OFFSET 5
285 
286 /** @brief SDP Generic Data Element Value. */
287 struct bt_sdp_data_elem {
288 	uint8_t        type;		/**< Type of the data element */
289 	uint32_t       data_size;	/**< Size of the data element */
290 	uint32_t       total_size;	/**< Total size of the data element */
291 	const void *data;
292 };
293 
294 /** @brief SDP Attribute Value. */
295 struct bt_sdp_attribute {
296 	uint16_t                id;  /**< Attribute ID */
297 	struct bt_sdp_data_elem val; /**< Attribute data */
298 };
299 
300 /** @brief SDP Service Record Value. */
301 struct bt_sdp_record {
302 	uint32_t                    handle;       /**< Redundant, for quick ref */
303 	struct bt_sdp_attribute     *attrs;       /**< Base addr of attr array */
304 	size_t                      attr_count;   /**< Number of attributes */
305 	uint8_t                     index;        /**< Index of the record in LL */
306 	struct bt_sdp_record        *next;        /**< Next service record */
307 };
308 
309 /*
310  * ---------------------------------------------------    ------------------
311  * | Service Hdl | Attr list ptr | Attr count | Next | -> | Service Hdl | ...
312  * ---------------------------------------------------    ------------------
313  */
314 
315 /**
316  *  @brief Declare an array of 8-bit elements in an attribute.
317  */
318 #define BT_SDP_ARRAY_8(...) ((uint8_t[]) {__VA_ARGS__})
319 
320 /**
321  *  @brief Declare an array of 16-bit elements in an attribute.
322  */
323 #define BT_SDP_ARRAY_16(...) ((uint16_t[]) {__VA_ARGS__})
324 
325 /**
326  *  @brief Declare an array of 32-bit elements in an attribute.
327  */
328 #define BT_SDP_ARRAY_32(...) ((uint32_t[]) {__VA_ARGS__})
329 
330 /**
331  *  @brief Declare a fixed-size data element header.
332  *
333  *  @param _type Data element header containing type and size descriptors.
334  */
335 #define BT_SDP_TYPE_SIZE(_type) .type = _type, \
336 			.data_size = BIT(_type & BT_SDP_SIZE_DESC_MASK), \
337 			.total_size = BIT(_type & BT_SDP_SIZE_DESC_MASK) + 1
338 
339 /**
340  *  @brief Declare a variable-size data element header.
341  *
342  *  @param _type Data element header containing type and size descriptors.
343  *  @param _size The actual size of the data.
344  */
345 #define BT_SDP_TYPE_SIZE_VAR(_type, _size) .type = _type, \
346 			.data_size = _size, \
347 			.total_size = BIT((_type & BT_SDP_SIZE_DESC_MASK) - \
348 					  BT_SDP_SIZE_INDEX_OFFSET) + _size + 1
349 
350 /**
351  *  @brief Declare a list of data elements.
352  */
353 #define BT_SDP_DATA_ELEM_LIST(...) ((struct bt_sdp_data_elem[]) {__VA_ARGS__})
354 
355 
356 /**
357  *  @brief SDP New Service Record Declaration Macro.
358  *
359  *  Helper macro to declare a new service record.
360  *  Default attributes: Record Handle, Record State,
361  *  Language Base, Root Browse Group
362  *
363  */
364 #define BT_SDP_NEW_SERVICE \
365 { \
366 	BT_SDP_ATTR_RECORD_HANDLE, \
367 	{ BT_SDP_TYPE_SIZE(BT_SDP_UINT32), BT_SDP_ARRAY_32(0) } \
368 }, \
369 { \
370 	BT_SDP_ATTR_RECORD_STATE, \
371 	{ BT_SDP_TYPE_SIZE(BT_SDP_UINT32), BT_SDP_ARRAY_32(0) } \
372 }, \
373 { \
374 	BT_SDP_ATTR_LANG_BASE_ATTR_ID_LIST, \
375 	{ BT_SDP_TYPE_SIZE_VAR(BT_SDP_SEQ8, 9), \
376 	  BT_SDP_DATA_ELEM_LIST( \
377 		{ BT_SDP_TYPE_SIZE(BT_SDP_UINT16), BT_SDP_ARRAY_8('n', 'e') }, \
378 		{ BT_SDP_TYPE_SIZE(BT_SDP_UINT16), BT_SDP_ARRAY_16(106) }, \
379 		{ BT_SDP_TYPE_SIZE(BT_SDP_UINT16), \
380 			BT_SDP_ARRAY_16(BT_SDP_PRIMARY_LANG_BASE) } \
381 	  ), \
382 	} \
383 }, \
384 { \
385 	BT_SDP_ATTR_BROWSE_GRP_LIST, \
386 	{ BT_SDP_TYPE_SIZE_VAR(BT_SDP_SEQ8, 3), \
387 	  BT_SDP_DATA_ELEM_LIST( \
388 		{ BT_SDP_TYPE_SIZE(BT_SDP_UUID16), \
389 			BT_SDP_ARRAY_16(BT_SDP_PUBLIC_BROWSE_GROUP) }, \
390 	  ), \
391 	} \
392 }
393 
394 
395 /**
396  *  @brief Generic SDP List Attribute Declaration Macro.
397  *
398  *  Helper macro to declare a list attribute.
399  *
400  *  @param _att_id List Attribute ID.
401  *  @param _data_elem_seq Data element sequence for the list.
402  *  @param _type_size SDP type and size descriptor.
403  */
404 #define BT_SDP_LIST(_att_id, _type_size, _data_elem_seq) \
405 { \
406 	_att_id, { _type_size, _data_elem_seq } \
407 }
408 
409 /**
410  *  @brief SDP Service ID Attribute Declaration Macro.
411  *
412  *  Helper macro to declare a service ID attribute.
413  *
414  *  @param _uuid Service ID 16bit UUID.
415  */
416 #define BT_SDP_SERVICE_ID(_uuid) \
417 { \
418 	BT_SDP_ATTR_SERVICE_ID, \
419 	{ BT_SDP_TYPE_SIZE(BT_SDP_UUID16), &((struct bt_uuid_16) _uuid) } \
420 }
421 
422 /**
423  *  @brief SDP Name Attribute Declaration Macro.
424  *
425  *  Helper macro to declare a service name attribute.
426  *
427  *  @param _name Service name as a string (up to 256 chars).
428  */
429 #define BT_SDP_SERVICE_NAME(_name) \
430 { \
431 	BT_SDP_ATTR_SVCNAME_PRIMARY, \
432 	{ BT_SDP_TYPE_SIZE_VAR(BT_SDP_TEXT_STR8, (sizeof(_name)-1)), _name } \
433 }
434 
435 /**
436  *  @brief SDP Supported Features Attribute Declaration Macro.
437  *
438  *  Helper macro to declare supported features of a profile/protocol.
439  *
440  *  @param _features Feature mask as 16bit unsigned integer.
441  */
442 #define BT_SDP_SUPPORTED_FEATURES(_features) \
443 { \
444 	BT_SDP_ATTR_SUPPORTED_FEATURES, \
445 	{ BT_SDP_TYPE_SIZE(BT_SDP_UINT16), BT_SDP_ARRAY_16(_features) } \
446 }
447 
448 /**
449  *  @brief SDP Service Declaration Macro.
450  *
451  *  Helper macro to declare a service.
452  *
453  *  @param _attrs List of attributes for the service record.
454  */
455 #define BT_SDP_RECORD(_attrs) \
456 { \
457 	.attrs = _attrs, \
458 	.attr_count = ARRAY_SIZE((_attrs)), \
459 }
460 
461 /* Server API */
462 
463 /** @brief Register a Service Record.
464  *
465  *  Register a Service Record. Applications can make use of
466  *  macros such as BT_SDP_DECLARE_SERVICE, BT_SDP_LIST,
467  *  BT_SDP_SERVICE_ID, BT_SDP_SERVICE_NAME, etc.
468  *  A service declaration must start with BT_SDP_NEW_SERVICE.
469  *
470  *  @param service Service record declared using BT_SDP_DECLARE_SERVICE.
471  *
472  * @return 0 in case of success or negative value in case of error.
473  */
474 int bt_sdp_register_service(struct bt_sdp_record *service);
475 
476 /* Client API */
477 
478 /** @brief Generic SDP Client Query Result data holder */
479 struct bt_sdp_client_result {
480 	/** buffer containing unparsed SDP record result for given UUID */
481 	struct net_buf        *resp_buf;
482 	/** flag pointing that there are more result chunks for given UUID */
483 	bool                   next_record_hint;
484 	/** Reference to UUID object on behalf one discovery was started */
485 	const struct bt_uuid  *uuid;
486 };
487 
488 /** @brief Helper enum to be used as return value of bt_sdp_discover_func_t.
489  *  The value informs the caller to perform further pending actions or stop them.
490  */
491 enum {
492 	BT_SDP_DISCOVER_UUID_STOP = 0,
493 	BT_SDP_DISCOVER_UUID_CONTINUE,
494 };
495 
496 /** @typedef bt_sdp_discover_func_t
497  *
498  *  @brief Callback type reporting to user that there is a resolved result
499  *  on remote for given UUID and the result record buffer can be used by user
500  *  for further inspection.
501  *
502  *  A function of this type is given by the user to the bt_sdp_discover_params
503  *  object. It'll be called on each valid record discovery completion for given
504  *  UUID. When UUID resolution gives back no records then NULL is passed
505  *  to the user. Otherwise user can get valid record(s) and then the internal
506  *  hint 'next record' is set to false saying the UUID resolution is complete or
507  *  the hint can be set by caller to true meaning that next record is available
508  *  for given UUID.
509  *  The returned function value allows the user to control retrieving follow-up
510  *  resolved records if any. If the user doesn't want to read more resolved
511  *  records for given UUID since current record data fulfills its requirements
512  *  then should return BT_SDP_DISCOVER_UUID_STOP. Otherwise returned value means
513  *  more subcall iterations are allowable.
514  *
515  *  @param conn Connection object identifying connection to queried remote.
516  *  @param result Object pointing to logical unparsed SDP record collected on
517  *  base of response driven by given UUID.
518  *
519  *  @return BT_SDP_DISCOVER_UUID_STOP in case of no more need to read next
520  *  record data and continue discovery for given UUID. By returning
521  *  BT_SDP_DISCOVER_UUID_CONTINUE user allows this discovery continuation.
522  */
523 typedef uint8_t (*bt_sdp_discover_func_t)
524 		(struct bt_conn *conn, struct bt_sdp_client_result *result);
525 
526 /** @brief Main user structure used in SDP discovery of remote. */
527 struct bt_sdp_discover_params {
528 	sys_snode_t		_node;
529 	/** UUID (service) to be discovered on remote SDP entity */
530 	const struct bt_uuid   *uuid;
531 	/** Discover callback to be called on resolved SDP record */
532 	bt_sdp_discover_func_t  func;
533 	/** Memory buffer enabled by user for SDP query results  */
534 	struct net_buf_pool    *pool;
535 };
536 
537 /** @brief Allows user to start SDP discovery session.
538  *
539  *  The function performs SDP service discovery on remote server driven by user
540  *  delivered discovery parameters. Discovery session is made as soon as
541  *  no SDP transaction is ongoing between peers and if any then this one
542  *  is queued to be processed at discovery completion of previous one.
543  *  On the service discovery completion the callback function will be
544  *  called to get feedback to user about findings.
545  *
546  * @param conn Object identifying connection to remote.
547  * @param params SDP discovery parameters.
548  *
549  * @return 0 in case of success or negative value in case of error.
550  */
551 
552 int bt_sdp_discover(struct bt_conn *conn,
553 		    const struct bt_sdp_discover_params *params);
554 
555 /** @brief Release waiting SDP discovery request.
556  *
557  *  It can cancel valid waiting SDP client request identified by SDP discovery
558  *  parameters object.
559  *
560  * @param conn Object identifying connection to remote.
561  * @param params SDP discovery parameters.
562  *
563  * @return 0 in case of success or negative value in case of error.
564  */
565 int bt_sdp_discover_cancel(struct bt_conn *conn,
566 			   const struct bt_sdp_discover_params *params);
567 
568 
569 /* Helper types & functions for SDP client to get essential data from server */
570 
571 /** @brief Protocols to be asked about specific parameters */
572 enum bt_sdp_proto {
573 	BT_SDP_PROTO_RFCOMM = 0x0003,
574 	BT_SDP_PROTO_L2CAP  = 0x0100,
575 };
576 
577 /** @brief Give to user parameter value related to given stacked protocol UUID.
578  *
579  *  API extracts specific parameter associated with given protocol UUID
580  *  available in Protocol Descriptor List attribute.
581  *
582  *  @param buf Original buffered raw record data.
583  *  @param proto Known protocol to be checked like RFCOMM or L2CAP.
584  *  @param param On success populated by found parameter value.
585  *
586  *  @return 0 on success when specific parameter associated with given protocol
587  *  value is found, or negative if error occurred during processing.
588  */
589 int bt_sdp_get_proto_param(const struct net_buf *buf, enum bt_sdp_proto proto,
590 			   uint16_t *param);
591 
592 /** @brief Get additional parameter value related to given stacked protocol UUID.
593  *
594  *  API extracts specific parameter associated with given protocol UUID
595  *  available in Additional Protocol Descriptor List attribute.
596  *
597  *  @param buf Original buffered raw record data.
598  *  @param proto Known protocol to be checked like RFCOMM or L2CAP.
599  *  @param param_index There may be more than one parameter related to the
600  *  given protocol UUID. This function returns the result that is
601  *  indexed by this parameter. It's value is from 0, 0 means the
602  *  first matched result, 1 means the second matched result.
603  *  @param[out] param On success populated by found parameter value.
604  *
605  *  @return 0 on success when a specific parameter associated with a given protocol
606  *  value is found, or negative if error occurred during processing.
607  */
608 int bt_sdp_get_addl_proto_param(const struct net_buf *buf, enum bt_sdp_proto proto,
609 			uint8_t param_index, uint16_t *param);
610 
611 /** @brief Get profile version.
612  *
613  *  Helper API extracting remote profile version number. To get it proper
614  *  generic profile parameter needs to be selected usually listed in SDP
615  *  Interoperability Requirements section for given profile specification.
616  *
617  *  @param buf Original buffered raw record data.
618  *  @param profile Profile family identifier the profile belongs.
619  *  @param version On success populated by found version number.
620  *
621  *  @return 0 on success, negative value if error occurred during processing.
622  */
623 int bt_sdp_get_profile_version(const struct net_buf *buf, uint16_t profile,
624 			       uint16_t *version);
625 
626 /** @brief Get SupportedFeatures attribute value
627  *
628  *  Allows if exposed by remote retrieve SupportedFeature attribute.
629  *
630  *  @param buf Buffer holding original raw record data from remote.
631  *  @param features On success object to be populated with SupportedFeature
632  *  mask.
633  *
634  *  @return 0 on success if feature found and valid, negative in case any error
635  */
636 int bt_sdp_get_features(const struct net_buf *buf, uint16_t *features);
637 
638 #ifdef __cplusplus
639 }
640 #endif
641 
642 /**
643  * @}
644  */
645 
646 #endif /* ZEPHYR_INCLUDE_BLUETOOTH_SDP_H_ */
647