LCOV - code coverage report
Current view: top level - zephyr/bluetooth/classic - sdp.h Hit Total Coverage
Test: new.info Lines: 227 239 95.0 %
Date: 2024-12-22 00:14:23

          Line data    Source code
       1           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           1 : #define BT_SDP_SDP_SERVER_SVCLASS           0x1000 /**< Service Discovery Server */
      38           1 : #define BT_SDP_BROWSE_GRP_DESC_SVCLASS      0x1001 /**< Browse Group Descriptor */
      39           1 : #define BT_SDP_PUBLIC_BROWSE_GROUP          0x1002 /**< Public Browse Group */
      40           1 : #define BT_SDP_SERIAL_PORT_SVCLASS          0x1101 /**< Serial Port */
      41           1 : #define BT_SDP_LAN_ACCESS_SVCLASS           0x1102 /**< LAN Access Using PPP */
      42           1 : #define BT_SDP_DIALUP_NET_SVCLASS           0x1103 /**< Dialup Networking */
      43           1 : #define BT_SDP_IRMC_SYNC_SVCLASS            0x1104 /**< IrMC Sync */
      44           1 : #define BT_SDP_OBEX_OBJPUSH_SVCLASS         0x1105 /**< OBEX Object Push */
      45           1 : #define BT_SDP_OBEX_FILETRANS_SVCLASS       0x1106 /**< OBEX File Transfer */
      46           1 : #define BT_SDP_IRMC_SYNC_CMD_SVCLASS        0x1107 /**< IrMC Sync Command */
      47           1 : #define BT_SDP_HEADSET_SVCLASS              0x1108 /**< Headset */
      48           1 : #define BT_SDP_CORDLESS_TELEPHONY_SVCLASS   0x1109 /**< Cordless Telephony */
      49           1 : #define BT_SDP_AUDIO_SOURCE_SVCLASS         0x110a /**< Audio Source */
      50           1 : #define BT_SDP_AUDIO_SINK_SVCLASS           0x110b /**< Audio Sink */
      51           1 : #define BT_SDP_AV_REMOTE_TARGET_SVCLASS     0x110c /**< A/V Remote Control Target */
      52           1 : #define BT_SDP_ADVANCED_AUDIO_SVCLASS       0x110d /**< Advanced Audio Distribution */
      53           1 : #define BT_SDP_AV_REMOTE_SVCLASS            0x110e /**< A/V Remote Control */
      54           1 : #define BT_SDP_AV_REMOTE_CONTROLLER_SVCLASS 0x110f /**< A/V Remote Control Controller */
      55           1 : #define BT_SDP_INTERCOM_SVCLASS             0x1110 /**< Intercom */
      56           1 : #define BT_SDP_FAX_SVCLASS                  0x1111 /**< Fax */
      57           1 : #define BT_SDP_HEADSET_AGW_SVCLASS          0x1112 /**< Headset AG */
      58           1 : #define BT_SDP_WAP_SVCLASS                  0x1113 /**< WAP */
      59           1 : #define BT_SDP_WAP_CLIENT_SVCLASS           0x1114 /**< WAP Client */
      60           1 : #define BT_SDP_PANU_SVCLASS                 0x1115 /**< Personal Area Networking User */
      61           1 : #define BT_SDP_NAP_SVCLASS                  0x1116 /**< Network Access Point */
      62           1 : #define BT_SDP_GN_SVCLASS                   0x1117 /**< Group Network */
      63           1 : #define BT_SDP_DIRECT_PRINTING_SVCLASS      0x1118 /**< Direct Printing */
      64           1 : #define BT_SDP_REFERENCE_PRINTING_SVCLASS   0x1119 /**< Reference Printing */
      65           1 : #define BT_SDP_IMAGING_SVCLASS              0x111a /**< Basic Imaging Profile */
      66           1 : #define BT_SDP_IMAGING_RESPONDER_SVCLASS    0x111b /**< Imaging Responder */
      67           1 : #define BT_SDP_IMAGING_ARCHIVE_SVCLASS      0x111c /**< Imaging Automatic Archive */
      68           1 : #define BT_SDP_IMAGING_REFOBJS_SVCLASS      0x111d /**< Imaging Referenced Objects */
      69           1 : #define BT_SDP_HANDSFREE_SVCLASS            0x111e /**< Handsfree */
      70           1 : #define BT_SDP_HANDSFREE_AGW_SVCLASS        0x111f /**< Handsfree Audio Gateway */
      71           1 : #define BT_SDP_DIRECT_PRT_REFOBJS_SVCLASS   0x1120 /**< Direct Printing Reference Objects Service */
      72           1 : #define BT_SDP_REFLECTED_UI_SVCLASS         0x1121 /**< Reflected UI */
      73           1 : #define BT_SDP_BASIC_PRINTING_SVCLASS       0x1122 /**< Basic Printing */
      74           1 : #define BT_SDP_PRINTING_STATUS_SVCLASS      0x1123 /**< Printing Status */
      75           1 : #define BT_SDP_HID_SVCLASS                  0x1124 /**< Human Interface Device Service */
      76           1 : #define BT_SDP_HCR_SVCLASS                  0x1125 /**< Hardcopy Cable Replacement */
      77           1 : #define BT_SDP_HCR_PRINT_SVCLASS            0x1126 /**< HCR Print */
      78           1 : #define BT_SDP_HCR_SCAN_SVCLASS             0x1127 /**< HCR Scan */
      79           1 : #define BT_SDP_CIP_SVCLASS                  0x1128 /**< Common ISDN Access */
      80           1 : #define BT_SDP_VIDEO_CONF_GW_SVCLASS        0x1129 /**< Video Conferencing Gateway */
      81           1 : #define BT_SDP_UDI_MT_SVCLASS               0x112a /**< UDI MT */
      82           1 : #define BT_SDP_UDI_TA_SVCLASS               0x112b /**< UDI TA */
      83           1 : #define BT_SDP_AV_SVCLASS                   0x112c /**< Audio/Video */
      84           1 : #define BT_SDP_SAP_SVCLASS                  0x112d /**< SIM Access */
      85           1 : #define BT_SDP_PBAP_PCE_SVCLASS             0x112e /**< Phonebook Access Client */
      86           1 : #define BT_SDP_PBAP_PSE_SVCLASS             0x112f /**< Phonebook Access Server */
      87           1 : #define BT_SDP_PBAP_SVCLASS                 0x1130 /**< Phonebook Access */
      88           1 : #define BT_SDP_MAP_MSE_SVCLASS              0x1132 /**< Message Access Server */
      89           1 : #define BT_SDP_MAP_MCE_SVCLASS              0x1133 /**< Message Notification Server */
      90           1 : #define BT_SDP_MAP_SVCLASS                  0x1134 /**< Message Access Profile */
      91           1 : #define BT_SDP_GNSS_SVCLASS                 0x1135 /**< GNSS */
      92           1 : #define BT_SDP_GNSS_SERVER_SVCLASS          0x1136 /**< GNSS Server */
      93           1 : #define BT_SDP_MPS_SC_SVCLASS               0x113a /**< MPS SC */
      94           1 : #define BT_SDP_MPS_SVCLASS                  0x113b /**< MPS */
      95           1 : #define BT_SDP_PNP_INFO_SVCLASS             0x1200 /**< PnP Information */
      96           1 : #define BT_SDP_GENERIC_NETWORKING_SVCLASS   0x1201 /**< Generic Networking */
      97           1 : #define BT_SDP_GENERIC_FILETRANS_SVCLASS    0x1202 /**< Generic File Transfer */
      98           1 : #define BT_SDP_GENERIC_AUDIO_SVCLASS        0x1203 /**< Generic Audio */
      99           1 : #define BT_SDP_GENERIC_TELEPHONY_SVCLASS    0x1204 /**< Generic Telephony */
     100           1 : #define BT_SDP_UPNP_SVCLASS                 0x1205 /**< UPnP Service */
     101           1 : #define BT_SDP_UPNP_IP_SVCLASS              0x1206 /**< UPnP IP Service */
     102           1 : #define BT_SDP_UPNP_PAN_SVCLASS             0x1300 /**< UPnP IP PAN */
     103           1 : #define BT_SDP_UPNP_LAP_SVCLASS             0x1301 /**< UPnP IP LAP */
     104           1 : #define BT_SDP_UPNP_L2CAP_SVCLASS           0x1302 /**< UPnP IP L2CAP */
     105           1 : #define BT_SDP_VIDEO_SOURCE_SVCLASS         0x1303 /**< Video Source */
     106           1 : #define BT_SDP_VIDEO_SINK_SVCLASS           0x1304 /**< Video Sink */
     107           1 : #define BT_SDP_VIDEO_DISTRIBUTION_SVCLASS   0x1305 /**< Video Distribution */
     108           1 : #define BT_SDP_HDP_SVCLASS                  0x1400 /**< HDP */
     109           1 : #define BT_SDP_HDP_SOURCE_SVCLASS           0x1401 /**< HDP Source */
     110           1 : #define BT_SDP_HDP_SINK_SVCLASS             0x1402 /**< HDP Sink */
     111           1 : #define BT_SDP_GENERIC_ACCESS_SVCLASS       0x1800 /**< Generic Access Profile */
     112           1 : #define BT_SDP_GENERIC_ATTRIB_SVCLASS       0x1801 /**< Generic Attribute Profile */
     113           1 : #define BT_SDP_APPLE_AGENT_SVCLASS          0x2112 /**< Apple Agent */
     114             : /**
     115             :  * @}
     116             :  */
     117             : 
     118           0 : #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           1 : #define BT_SDP_ATTR_RECORD_HANDLE               0x0000 /**< Service Record Handle */
     129           1 : #define BT_SDP_ATTR_SVCLASS_ID_LIST             0x0001 /**< Service Class ID List */
     130           1 : #define BT_SDP_ATTR_RECORD_STATE                0x0002 /**< Service Record State */
     131           1 : #define BT_SDP_ATTR_SERVICE_ID                  0x0003 /**< Service ID */
     132           1 : #define BT_SDP_ATTR_PROTO_DESC_LIST             0x0004 /**< Protocol Descriptor List */
     133           1 : #define BT_SDP_ATTR_BROWSE_GRP_LIST             0x0005 /**< Browse Group List */
     134           1 : #define BT_SDP_ATTR_LANG_BASE_ATTR_ID_LIST      0x0006 /**< Language Base Attribute ID List */
     135           1 : #define BT_SDP_ATTR_SVCINFO_TTL                 0x0007 /**< Service Info Time to Live */
     136           1 : #define BT_SDP_ATTR_SERVICE_AVAILABILITY        0x0008 /**< Service Availability */
     137           1 : #define BT_SDP_ATTR_PROFILE_DESC_LIST           0x0009 /**< Bluetooth Profile Descriptor List */
     138           1 : #define BT_SDP_ATTR_DOC_URL                     0x000a /**< Documentation URL */
     139           1 : #define BT_SDP_ATTR_CLNT_EXEC_URL               0x000b /**< Client Executable URL */
     140           1 : #define BT_SDP_ATTR_ICON_URL                    0x000c /**< Icon URL */
     141           1 : #define BT_SDP_ATTR_ADD_PROTO_DESC_LIST         0x000d /**< Additional Protocol Descriptor List */
     142             : 
     143           1 : #define BT_SDP_ATTR_GROUP_ID                    0x0200 /**< Group ID */
     144           1 : #define BT_SDP_ATTR_IP_SUBNET                   0x0200 /**< IP Subnet */
     145           1 : #define BT_SDP_ATTR_VERSION_NUM_LIST            0x0200 /**< Version Number List */
     146           1 : #define BT_SDP_ATTR_SUPPORTED_FEATURES_LIST     0x0200 /**< Supported Features List */
     147           1 : #define BT_SDP_ATTR_GOEP_L2CAP_PSM              0x0200 /**< GOEP L2CAP PSM */
     148           1 : #define BT_SDP_ATTR_SVCDB_STATE                 0x0201 /**< Service Database State */
     149             : 
     150           1 : #define BT_SDP_ATTR_MPSD_SCENARIOS              0x0200 /**< MPSD Scenarios */
     151           1 : #define BT_SDP_ATTR_MPMD_SCENARIOS              0x0201 /**< MPMD Scenarios */
     152           1 : #define BT_SDP_ATTR_MPS_DEPENDENCIES            0x0202 /**< Supported Profiles & Protocols */
     153             : 
     154           1 : #define BT_SDP_ATTR_SERVICE_VERSION             0x0300 /**< Service Version */
     155           1 : #define BT_SDP_ATTR_EXTERNAL_NETWORK            0x0301 /**< External Network */
     156           1 : #define BT_SDP_ATTR_SUPPORTED_DATA_STORES_LIST  0x0301 /**< Supported Data Stores List */
     157           1 : #define BT_SDP_ATTR_DATA_EXCHANGE_SPEC          0x0301 /**< Data Exchange Specification */
     158           1 : #define BT_SDP_ATTR_NETWORK                     0x0301 /**< Network */
     159           1 : #define BT_SDP_ATTR_FAX_CLASS1_SUPPORT          0x0302 /**< Fax Class 1 Support */
     160           1 : #define BT_SDP_ATTR_REMOTE_AUDIO_VOLUME_CONTROL 0x0302 /**< Remote Audio Volume Control */
     161           1 : #define BT_SDP_ATTR_MCAP_SUPPORTED_PROCEDURES   0x0302 /**< MCAP Supported Procedures */
     162           1 : #define BT_SDP_ATTR_FAX_CLASS20_SUPPORT         0x0303 /**< Fax Class 2.0 Support */
     163           1 : #define BT_SDP_ATTR_SUPPORTED_FORMATS_LIST      0x0303 /**< Supported Formats List */
     164           1 : #define BT_SDP_ATTR_FAX_CLASS2_SUPPORT          0x0304 /**< Fax Class 2 Support (vendor-specific)*/
     165           1 : #define BT_SDP_ATTR_AUDIO_FEEDBACK_SUPPORT      0x0305 /**< Audio Feedback Support */
     166           1 : #define BT_SDP_ATTR_NETWORK_ADDRESS             0x0306 /**< Network Address */
     167           1 : #define BT_SDP_ATTR_WAP_GATEWAY                 0x0307 /**< WAP Gateway */
     168           1 : #define BT_SDP_ATTR_HOMEPAGE_URL                0x0308 /**< Homepage URL */
     169           1 : #define BT_SDP_ATTR_WAP_STACK_TYPE              0x0309 /**< WAP Stack Type */
     170           1 : #define BT_SDP_ATTR_SECURITY_DESC               0x030a /**< Security Description */
     171           1 : #define BT_SDP_ATTR_NET_ACCESS_TYPE             0x030b /**< Net Access Type */
     172           1 : #define BT_SDP_ATTR_MAX_NET_ACCESSRATE          0x030c /**< Max Net Access Rate */
     173           1 : #define BT_SDP_ATTR_IP4_SUBNET                  0x030d /**< IPv4 Subnet */
     174           1 : #define BT_SDP_ATTR_IP6_SUBNET                  0x030e /**< IPv6 Subnet */
     175           1 : #define BT_SDP_ATTR_SUPPORTED_CAPABILITIES      0x0310 /**< BIP Supported Capabilities */
     176           1 : #define BT_SDP_ATTR_SUPPORTED_FEATURES          0x0311 /**< BIP Supported Features */
     177           1 : #define BT_SDP_ATTR_SUPPORTED_FUNCTIONS         0x0312 /**< BIP Supported Functions */
     178           1 : #define BT_SDP_ATTR_TOTAL_IMAGING_DATA_CAPACITY 0x0313 /**< BIP Total Imaging Data Capacity */
     179           1 : #define BT_SDP_ATTR_SUPPORTED_REPOSITORIES      0x0314 /**< Supported Repositories */
     180           1 : #define BT_SDP_ATTR_MAS_INSTANCE_ID             0x0315 /**< MAS Instance ID */
     181           1 : #define BT_SDP_ATTR_SUPPORTED_MESSAGE_TYPES     0x0316 /**< Supported Message Types */
     182           1 : #define BT_SDP_ATTR_PBAP_SUPPORTED_FEATURES     0x0317 /**< PBAP Supported Features */
     183           1 : #define BT_SDP_ATTR_MAP_SUPPORTED_FEATURES      0x0317 /**< MAP Supported Features */
     184             : 
     185           1 : #define BT_SDP_ATTR_SPECIFICATION_ID            0x0200 /**< Specification ID */
     186           1 : #define BT_SDP_ATTR_VENDOR_ID                   0x0201 /**< Vendor ID */
     187           1 : #define BT_SDP_ATTR_PRODUCT_ID                  0x0202 /**< Product ID */
     188           1 : #define BT_SDP_ATTR_VERSION                     0x0203 /**< Version */
     189           1 : #define BT_SDP_ATTR_PRIMARY_RECORD              0x0204 /**< Primary Record */
     190           1 : #define BT_SDP_ATTR_VENDOR_ID_SOURCE            0x0205 /**< Vendor ID Source */
     191             : 
     192           1 : #define BT_SDP_ATTR_HID_DEVICE_RELEASE_NUMBER   0x0200 /**< HID Device Release Number */
     193           1 : #define BT_SDP_ATTR_HID_PARSER_VERSION          0x0201 /**< HID Parser Version */
     194           1 : #define BT_SDP_ATTR_HID_DEVICE_SUBCLASS         0x0202 /**< HID Device Subclass */
     195           1 : #define BT_SDP_ATTR_HID_COUNTRY_CODE            0x0203 /**< HID Country Code */
     196           1 : #define BT_SDP_ATTR_HID_VIRTUAL_CABLE           0x0204 /**< HID Virtual Cable */
     197           1 : #define BT_SDP_ATTR_HID_RECONNECT_INITIATE      0x0205 /**< HID Reconnect Initiate */
     198           1 : #define BT_SDP_ATTR_HID_DESCRIPTOR_LIST         0x0206 /**< HID Descriptor List */
     199           1 : #define BT_SDP_ATTR_HID_LANG_ID_BASE_LIST       0x0207 /**< HID Language ID Base List */
     200           1 : #define BT_SDP_ATTR_HID_SDP_DISABLE             0x0208 /**< HID SDP Disable */
     201           1 : #define BT_SDP_ATTR_HID_BATTERY_POWER           0x0209 /**< HID Battery Power */
     202           1 : #define BT_SDP_ATTR_HID_REMOTE_WAKEUP           0x020a /**< HID Remote Wakeup */
     203           1 : #define BT_SDP_ATTR_HID_PROFILE_VERSION         0x020b /**< HID Profile Version */
     204           1 : #define BT_SDP_ATTR_HID_SUPERVISION_TIMEOUT     0x020c /**< HID Supervision Timeout */
     205           1 : #define BT_SDP_ATTR_HID_NORMALLY_CONNECTABLE    0x020d /**< HID Normally Connectable */
     206           1 : #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           0 : #define BT_SDP_PRIMARY_LANG_BASE  0x0100
     220             : 
     221           0 : #define BT_SDP_ATTR_SVCNAME_PRIMARY (0x0000 + BT_SDP_PRIMARY_LANG_BASE)
     222           0 : #define BT_SDP_ATTR_SVCDESC_PRIMARY (0x0001 + BT_SDP_PRIMARY_LANG_BASE)
     223           0 : #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           1 : #define BT_SDP_DATA_NIL        0x00     /**< Nil, the null type */
     247           1 : #define BT_SDP_UINT8           0x08     /**< Unsigned 8-bit integer */
     248           1 : #define BT_SDP_UINT16          0x09     /**< Unsigned 16-bit integer */
     249           1 : #define BT_SDP_UINT32          0x0a     /**< Unsigned 32-bit integer */
     250           1 : #define BT_SDP_UINT64          0x0b     /**< Unsigned 64-bit integer */
     251           1 : #define BT_SDP_UINT128         0x0c     /**< Unsigned 128-bit integer */
     252           1 : #define BT_SDP_INT8            0x10     /**< Signed 8-bit integer */
     253           1 : #define BT_SDP_INT16           0x11     /**< Signed 16-bit integer */
     254           1 : #define BT_SDP_INT32           0x12     /**< Signed 32-bit integer */
     255           1 : #define BT_SDP_INT64           0x13     /**< Signed 64-bit integer */
     256           1 : #define BT_SDP_INT128          0x14     /**< Signed 128-bit integer */
     257           1 : #define BT_SDP_UUID_UNSPEC     0x18     /**< UUID, unspecified size */
     258           1 : #define BT_SDP_UUID16          0x19     /**< UUID, 16-bit */
     259           1 : #define BT_SDP_UUID32          0x1a     /**< UUID, 32-bit */
     260           1 : #define BT_SDP_UUID128         0x1c     /**< UUID, 128-bit */
     261           1 : #define BT_SDP_TEXT_STR_UNSPEC 0x20     /**< Text string, unspecified size */
     262           1 : #define BT_SDP_TEXT_STR8       0x25     /**< Text string, 8-bit length */
     263           1 : #define BT_SDP_TEXT_STR16      0x26     /**< Text string, 16-bit length */
     264           1 : #define BT_SDP_TEXT_STR32      0x27     /**< Text string, 32-bit length */
     265           1 : #define BT_SDP_BOOL            0x28     /**< Boolean */
     266           1 : #define BT_SDP_SEQ_UNSPEC      0x30     /**< Data element sequence, unspecified size */
     267           1 : #define BT_SDP_SEQ8            0x35     /**< Data element sequence, 8-bit length */
     268           1 : #define BT_SDP_SEQ16           0x36     /**< Data element sequence, 16-bit length */
     269           1 : #define BT_SDP_SEQ32           0x37     /**< Data element sequence, 32-bit length */
     270           1 : #define BT_SDP_ALT_UNSPEC      0x38     /**< Data element alternative, unspecified size */
     271           1 : #define BT_SDP_ALT8            0x3d     /**< Data element alternative, 8-bit length */
     272           1 : #define BT_SDP_ALT16           0x3e     /**< Data element alternative, 16-bit length */
     273           1 : #define BT_SDP_ALT32           0x3f     /**< Data element alternative, 32-bit length */
     274           1 : #define BT_SDP_URL_STR_UNSPEC  0x40     /**< URL string, unspecified size */
     275           1 : #define BT_SDP_URL_STR8        0x45     /**< URL string, 8-bit length */
     276           1 : #define BT_SDP_URL_STR16       0x46     /**< URL string, 16-bit length */
     277           1 : #define BT_SDP_URL_STR32       0x47     /**< URL string, 32-bit length */
     278             : /**
     279             :  * @}
     280             :  */
     281             : 
     282           0 : #define BT_SDP_TYPE_DESC_MASK 0xf8
     283           0 : #define BT_SDP_SIZE_DESC_MASK 0x07
     284           0 : #define BT_SDP_SIZE_INDEX_OFFSET 5
     285             : 
     286             : /** @brief SDP Generic Data Element Value. */
     287           1 : struct bt_sdp_data_elem {
     288           1 :         uint8_t        type;            /**< Type of the data element */
     289           1 :         uint32_t       data_size;       /**< Size of the data element */
     290           1 :         uint32_t       total_size;      /**< Total size of the data element */
     291           0 :         const void *data;
     292             : };
     293             : 
     294             : /** @brief SDP Attribute Value. */
     295           1 : struct bt_sdp_attribute {
     296           1 :         uint16_t                id;  /**< Attribute ID */
     297           1 :         struct bt_sdp_data_elem val; /**< Attribute data */
     298             : };
     299             : 
     300             : /** @brief SDP Service Record Value. */
     301           1 : struct bt_sdp_record {
     302           1 :         uint32_t                    handle;       /**< Redundant, for quick ref */
     303           1 :         struct bt_sdp_attribute     *attrs;       /**< Base addr of attr array */
     304           1 :         size_t                      attr_count;   /**< Number of attributes */
     305           1 :         uint8_t                     index;        /**< Index of the record in LL */
     306           1 :         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           1 : #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           1 : #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           1 : #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           1 : #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           1 : #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           1 : #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           1 : #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           1 : #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           1 : #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           1 : #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           1 : #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           1 : #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           1 : 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           1 : struct bt_sdp_client_result {
     480             :         /** buffer containing unparsed SDP record result for given UUID */
     481           1 :         struct net_buf        *resp_buf;
     482             :         /** flag pointing that there are more result chunks for given UUID */
     483           1 :         bool                   next_record_hint;
     484             : };
     485             : 
     486             : /** @brief Helper enum to be used as return value of bt_sdp_discover_func_t.
     487             :  *  The value informs the caller to perform further pending actions or stop them.
     488             :  */
     489           0 : enum {
     490             :         BT_SDP_DISCOVER_UUID_STOP = 0,
     491             :         BT_SDP_DISCOVER_UUID_CONTINUE,
     492             : };
     493             : 
     494             : struct bt_sdp_discover_params;
     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 discover params.
     518             :  *  @param params Discover parameters.
     519             :  *
     520             :  *  @return BT_SDP_DISCOVER_UUID_STOP in case of no more need to read next
     521             :  *  record data and continue discovery for given UUID. By returning
     522             :  *  @return BT_SDP_DISCOVER_UUID_CONTINUE user allows this discovery continuation.
     523             :  */
     524           1 : typedef uint8_t (*bt_sdp_discover_func_t)(struct bt_conn *conn, struct bt_sdp_client_result *result,
     525             :                                           const struct bt_sdp_discover_params *params);
     526             : 
     527             : /** SDP Discover types */
     528           1 : enum {
     529             :         /** Discover Service Search. */
     530             :         BT_SDP_DISCOVER_SERVICE_SEARCH,
     531             :         /** Discover Service Attribute. */
     532             :         BT_SDP_DISCOVER_SERVICE_ATTR,
     533             :         /** Discover Service Search Attribute. */
     534             :         BT_SDP_DISCOVER_SERVICE_SEARCH_ATTR,
     535             : };
     536             : 
     537             : /** @brief Main user structure used in SDP discovery of remote. */
     538           1 : struct bt_sdp_discover_params {
     539             :         sys_snode_t _node;
     540             :         union {
     541             :                 /** UUID (service) to be discovered on remote SDP entity */
     542           1 :                 const struct bt_uuid *uuid;
     543             :                 /** Service record handle */
     544           1 :                 uint32_t handle;
     545           0 :         };
     546             :         /** Discover callback to be called on resolved SDP record */
     547           1 :         bt_sdp_discover_func_t func;
     548             :         /** Memory buffer enabled by user for SDP query results  */
     549           1 :         struct net_buf_pool *pool;
     550             :         /** Discover type */
     551           1 :         uint8_t type;
     552             : };
     553             : 
     554             : /** @brief Allows user to start SDP discovery session.
     555             :  *
     556             :  *  The function performs SDP service discovery on remote server driven by user
     557             :  *  delivered discovery parameters. Discovery session is made as soon as
     558             :  *  no SDP transaction is ongoing between peers and if any then this one
     559             :  *  is queued to be processed at discovery completion of previous one.
     560             :  *  On the service discovery completion the callback function will be
     561             :  *  called to get feedback to user about findings.
     562             :  *
     563             :  *  Service Search:                The SDP Client generates an
     564             :  *                                 SDP_SERVICE_SEARCH_REQ to locate service
     565             :  *                                 records that match the service search
     566             :  *                                 pattern (`params->uuid`) given as the first
     567             :  *                                 parameter of the PDU.
     568             :  *  Service Attribute:             The SDP Client generates an
     569             :  *                                 SDP_SERVICE_ATTR_REQ to retrieve specified
     570             :  *                                 attribute values from a specific service
     571             :  *                                 record (`params->handle`).
     572             :  *  Service Search Attribute:      The SDP Client generates an
     573             :  *                                 SDP_SERVICE_SEARCH_ATTR_REQ to retrieve
     574             :  *                                 specified attribute values that match the
     575             :  *                                 service search pattern (`params->uuid`)
     576             :  *                                 given as the first parameter of the PDU.
     577             :  *
     578             :  * @param conn Object identifying connection to remote.
     579             :  * @param params SDP discovery parameters.
     580             :  *
     581             :  * @return 0 in case of success or negative value in case of error.
     582             :  */
     583             : 
     584           1 : int bt_sdp_discover(struct bt_conn *conn,
     585             :                     const struct bt_sdp_discover_params *params);
     586             : 
     587             : /** @brief Release waiting SDP discovery request.
     588             :  *
     589             :  *  It can cancel valid waiting SDP client request identified by SDP discovery
     590             :  *  parameters object.
     591             :  *
     592             :  * @param conn Object identifying connection to remote.
     593             :  * @param params SDP discovery parameters.
     594             :  *
     595             :  * @return 0 in case of success or negative value in case of error.
     596             :  */
     597           1 : int bt_sdp_discover_cancel(struct bt_conn *conn,
     598             :                            const struct bt_sdp_discover_params *params);
     599             : 
     600             : 
     601             : /* Helper types & functions for SDP client to get essential data from server */
     602             : 
     603             : /** @brief Protocols to be asked about specific parameters */
     604           0 : enum bt_sdp_proto {
     605             :         BT_SDP_PROTO_RFCOMM = 0x0003,
     606             :         BT_SDP_PROTO_L2CAP  = 0x0100,
     607             : };
     608             : 
     609             : /** @brief Give to user parameter value related to given stacked protocol UUID.
     610             :  *
     611             :  *  API extracts specific parameter associated with given protocol UUID
     612             :  *  available in Protocol Descriptor List attribute.
     613             :  *
     614             :  *  @param buf Original buffered raw record data.
     615             :  *  @param proto Known protocol to be checked like RFCOMM or L2CAP.
     616             :  *  @param param On success populated by found parameter value.
     617             :  *
     618             :  *  @return 0 on success when specific parameter associated with given protocol
     619             :  *  value is found, or negative if error occurred during processing.
     620             :  */
     621           1 : int bt_sdp_get_proto_param(const struct net_buf *buf, enum bt_sdp_proto proto,
     622             :                            uint16_t *param);
     623             : 
     624             : /** @brief Get additional parameter value related to given stacked protocol UUID.
     625             :  *
     626             :  *  API extracts specific parameter associated with given protocol UUID
     627             :  *  available in Additional Protocol Descriptor List attribute.
     628             :  *
     629             :  *  @param buf Original buffered raw record data.
     630             :  *  @param proto Known protocol to be checked like RFCOMM or L2CAP.
     631             :  *  @param param_index There may be more than one parameter related to the
     632             :  *  given protocol UUID. This function returns the result that is
     633             :  *  indexed by this parameter. It's value is from 0, 0 means the
     634             :  *  first matched result, 1 means the second matched result.
     635             :  *  @param[out] param On success populated by found parameter value.
     636             :  *
     637             :  *  @return 0 on success when a specific parameter associated with a given protocol
     638             :  *  value is found, or negative if error occurred during processing.
     639             :  */
     640           1 : int bt_sdp_get_addl_proto_param(const struct net_buf *buf, enum bt_sdp_proto proto,
     641             :                         uint8_t param_index, uint16_t *param);
     642             : 
     643             : /** @brief Get profile version.
     644             :  *
     645             :  *  Helper API extracting remote profile version number. To get it proper
     646             :  *  generic profile parameter needs to be selected usually listed in SDP
     647             :  *  Interoperability Requirements section for given profile specification.
     648             :  *
     649             :  *  @param buf Original buffered raw record data.
     650             :  *  @param profile Profile family identifier the profile belongs.
     651             :  *  @param version On success populated by found version number.
     652             :  *
     653             :  *  @return 0 on success, negative value if error occurred during processing.
     654             :  */
     655           1 : int bt_sdp_get_profile_version(const struct net_buf *buf, uint16_t profile,
     656             :                                uint16_t *version);
     657             : 
     658             : /** @brief Get SupportedFeatures attribute value
     659             :  *
     660             :  *  Allows if exposed by remote retrieve SupportedFeature attribute.
     661             :  *
     662             :  *  @param buf Buffer holding original raw record data from remote.
     663             :  *  @param features On success object to be populated with SupportedFeature
     664             :  *  mask.
     665             :  *
     666             :  *  @return 0 on success if feature found and valid, negative in case any error
     667             :  */
     668           1 : int bt_sdp_get_features(const struct net_buf *buf, uint16_t *features);
     669             : 
     670             : #ifdef __cplusplus
     671             : }
     672             : #endif
     673             : 
     674             : /**
     675             :  * @}
     676             :  */
     677             : 
     678             : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_SDP_H_ */

Generated by: LCOV version 1.14