example: use sdp_create_service_record_handle() for sdp record and assert sdp record buffer is large enough, fixes #489

This commit is contained in:
Matthias Ringwald 2023-06-20 09:48:33 +02:00
parent 08840d74f4
commit 762141afa5
17 changed files with 55 additions and 37 deletions

View File

@ -296,6 +296,7 @@ static int setup_demo(void){
memset(sdp_avdtp_sink_service_buffer, 0, sizeof(sdp_avdtp_sink_service_buffer));
a2dp_sink_create_sdp_record(sdp_avdtp_sink_service_buffer, sdp_create_service_record_handle(),
AVDTP_SINK_FEATURE_MASK_HEADPHONE, NULL, NULL);
btstack_assert(de_get_len( sdp_avdtp_sink_service_buffer) <= sizeof(sdp_avdtp_sink_service_buffer));
sdp_register_service(sdp_avdtp_sink_service_buffer);
// - Create AVRCP Controller service record and register it with SDP. We send Category 1 commands to the media player, e.g. play/pause
@ -309,6 +310,7 @@ static int setup_demo(void){
#endif
avrcp_controller_create_sdp_record(sdp_avrcp_controller_service_buffer, sdp_create_service_record_handle(),
controller_supported_features, NULL, NULL);
btstack_assert(de_get_len( sdp_avrcp_controller_service_buffer) <= sizeof(sdp_avrcp_controller_service_buffer));
sdp_register_service(sdp_avrcp_controller_service_buffer);
// - Create and register A2DP Sink service record
@ -317,12 +319,14 @@ static int setup_demo(void){
uint16_t target_supported_features = 1 << AVRCP_TARGET_SUPPORTED_FEATURE_CATEGORY_MONITOR_OR_AMPLIFIER;
avrcp_target_create_sdp_record(sdp_avrcp_target_service_buffer,
sdp_create_service_record_handle(), target_supported_features, NULL, NULL);
btstack_assert(de_get_len( sdp_avrcp_target_service_buffer) <= sizeof(sdp_avrcp_target_service_buffer));
sdp_register_service(sdp_avrcp_target_service_buffer);
// - Create and register Device ID (PnP) service record
memset(device_id_sdp_service_buffer, 0, sizeof(device_id_sdp_service_buffer));
device_id_create_sdp_record(device_id_sdp_service_buffer,
sdp_create_service_record_handle(), DEVICE_ID_VENDOR_ID_SOURCE_BLUETOOTH, BLUETOOTH_COMPANY_ID_BLUEKITCHEN_GMBH, 1, 1);
btstack_assert(de_get_len( device_id_sdp_service_buffer) <= sizeof(device_id_sdp_service_buffer));
sdp_register_service(device_id_sdp_service_buffer);

View File

@ -286,7 +286,8 @@ static int a2dp_source_and_avrcp_services_init(void){
// Create A2DP Source service record and register it with SDP
memset(sdp_a2dp_source_service_buffer, 0, sizeof(sdp_a2dp_source_service_buffer));
a2dp_source_create_sdp_record(sdp_a2dp_source_service_buffer, 0x10001, AVDTP_SOURCE_FEATURE_MASK_PLAYER, NULL, NULL);
a2dp_source_create_sdp_record(sdp_a2dp_source_service_buffer, sdp_create_service_record_handle(), AVDTP_SOURCE_FEATURE_MASK_PLAYER, NULL, NULL);
btstack_assert(de_get_len( sdp_a2dp_source_service_buffer) <= sizeof(sdp_a2dp_source_service_buffer));
sdp_register_service(sdp_a2dp_source_service_buffer);
// Create AVRCP Target service record and register it with SDP. We receive Category 1 commands from the headphone, e.g. play/pause
@ -295,18 +296,21 @@ static int a2dp_source_and_avrcp_services_init(void){
#ifdef AVRCP_BROWSING_ENABLED
supported_features |= AVRCP_FEATURE_MASK_BROWSING;
#endif
avrcp_target_create_sdp_record(sdp_avrcp_target_service_buffer, 0x10002, supported_features, NULL, NULL);
avrcp_target_create_sdp_record(sdp_avrcp_target_service_buffer, sdp_create_service_record_handle(), supported_features, NULL, NULL);
btstack_assert(de_get_len( sdp_avrcp_target_service_buffer) <= sizeof(sdp_avrcp_target_service_buffer));
sdp_register_service(sdp_avrcp_target_service_buffer);
// Create AVRCP Controller service record and register it with SDP. We send Category 2 commands to the headphone, e.g. volume up/down
memset(sdp_avrcp_controller_service_buffer, 0, sizeof(sdp_avrcp_controller_service_buffer));
uint16_t controller_supported_features = AVRCP_FEATURE_MASK_CATEGORY_MONITOR_OR_AMPLIFIER;
avrcp_controller_create_sdp_record(sdp_avrcp_controller_service_buffer, 0x10003, controller_supported_features, NULL, NULL);
avrcp_controller_create_sdp_record(sdp_avrcp_controller_service_buffer, sdp_create_service_record_handle(), controller_supported_features, NULL, NULL);
btstack_assert(de_get_len( sdp_avrcp_controller_service_buffer) <= sizeof(sdp_avrcp_controller_service_buffer));
sdp_register_service(sdp_avrcp_controller_service_buffer);
// Register Device ID (PnP) service SDP record
memset(device_id_sdp_service_buffer, 0, sizeof(device_id_sdp_service_buffer));
device_id_create_sdp_record(device_id_sdp_service_buffer, 0x10004, DEVICE_ID_VENDOR_ID_SOURCE_BLUETOOTH, BLUETOOTH_COMPANY_ID_BLUEKITCHEN_GMBH, 1, 1);
device_id_create_sdp_record(device_id_sdp_service_buffer, sdp_create_service_record_handle(), DEVICE_ID_VENDOR_ID_SOURCE_BLUETOOTH, BLUETOOTH_COMPANY_ID_BLUEKITCHEN_GMBH, 1, 1);
btstack_assert(de_get_len( device_id_sdp_service_buffer) <= sizeof(device_id_sdp_service_buffer));
sdp_register_service(device_id_sdp_service_buffer);
// Set local name with a template Bluetooth address, that will be automatically

View File

@ -291,7 +291,8 @@ int btstack_main(int argc, const char * argv[]){
sdp_init();
// setup AVDTP sink
memset(sdp_avdtp_sink_service_buffer, 0, sizeof(sdp_avdtp_sink_service_buffer));
a2dp_sink_create_sdp_record(sdp_avdtp_sink_service_buffer, 0x10001, AVDTP_SINK_FEATURE_MASK_HEADPHONE, NULL, NULL);
a2dp_sink_create_sdp_record(sdp_avdtp_sink_service_buffer, sdp_create_service_record_handle(), AVDTP_SINK_FEATURE_MASK_HEADPHONE, NULL, NULL);
btstack_assert(de_get_len( sdp_avdtp_sink_service_buffer) <= sizeof(sdp_avdtp_sink_service_buffer));
sdp_register_service(sdp_avdtp_sink_service_buffer);
// Create AVRCP service record and register it with SDP.
@ -301,7 +302,8 @@ int btstack_main(int argc, const char * argv[]){
#ifdef AVRCP_BROWSING_ENABLED
supported_features |= AVRCP_FEATURE_MASK_BROWSING;
#endif
avrcp_controller_create_sdp_record(sdp_avrcp_browsing_controller_service_buffer, 0x10002, supported_features, NULL, NULL);
avrcp_controller_create_sdp_record(sdp_avrcp_browsing_controller_service_buffer, sdp_create_service_record_handle(), supported_features, NULL, NULL);
btstack_assert(de_get_len( sdp_avrcp_browsing_controller_service_buffer) <= sizeof(sdp_avrcp_browsing_controller_service_buffer));
sdp_register_service(sdp_avrcp_browsing_controller_service_buffer);
// Set local name with a template Bluetooth address, that will be automatically

View File

@ -115,9 +115,9 @@ static void le_counter_setup(void){
// init SDP, create record for GATT and register with SDP
sdp_init();
memset(gatt_service_buffer, 0, sizeof(gatt_service_buffer));
gatt_create_sdp_record(gatt_service_buffer, 0x10001, ATT_SERVICE_GATT_SERVICE_START_HANDLE, ATT_SERVICE_GATT_SERVICE_END_HANDLE);
gatt_create_sdp_record(gatt_service_buffer, sdp_create_service_record_handle(), ATT_SERVICE_GATT_SERVICE_START_HANDLE, ATT_SERVICE_GATT_SERVICE_END_HANDLE);
btstack_assert(de_get_len( gatt_service_buffer) <= sizeof(gatt_service_buffer));
sdp_register_service(gatt_service_buffer);
printf("SDP service record size: %u\n", de_get_len(gatt_service_buffer));
// configure Classic GAP
gap_set_local_name("GATT Counter BR/EDR 00:00:00:00:00:00");

View File

@ -756,8 +756,8 @@ int btstack_main(int argc, const char * argv[]){
// SDP Server
sdp_init();
memset(hfp_service_buffer, 0, sizeof(hfp_service_buffer));
hfp_ag_create_sdp_record( hfp_service_buffer, 0x10001, rfcomm_channel_nr, hfp_ag_service_name, 0, supported_features, wide_band_speech);
printf("SDP service record size: %u\n", de_get_len( hfp_service_buffer));
hfp_ag_create_sdp_record( hfp_service_buffer, sdp_create_service_record_handle(), rfcomm_channel_nr, hfp_ag_service_name, 0, supported_features, wide_band_speech);
btstack_assert(de_get_len( hfp_service_buffer) <= sizeof(hfp_service_buffer));
sdp_register_service(hfp_service_buffer);
// register for HCI events and SCO packets

View File

@ -759,7 +759,7 @@ int btstack_main(int argc, const char * argv[]){
memset(hfp_service_buffer, 0, sizeof(hfp_service_buffer));
hfp_hf_create_sdp_record(hfp_service_buffer, sdp_create_service_record_handle(),
rfcomm_channel_nr, hfp_hf_service_name, hf_supported_features, wide_band_speech);
printf("SDP service record size: %u\n", de_get_len(hfp_service_buffer));
btstack_assert(de_get_len( hfp_service_buffer) <= sizeof(hfp_service_buffer));
sdp_register_service(hfp_service_buffer);
// Configure GAP - discovery / connection

View File

@ -453,15 +453,14 @@ int btstack_main(int argc, const char * argv[]){
hid_device_name
};
hid_create_sdp_record(hid_service_buffer, 0x10001, &hid_params);
printf("HID service record size: %u\n", de_get_len( hid_service_buffer));
hid_create_sdp_record(hid_service_buffer, sdp_create_service_record_handle(), &hid_params);
btstack_assert(de_get_len( hid_service_buffer) <= sizeof(hid_service_buffer));
sdp_register_service(hid_service_buffer);
// See https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers if you don't have a USB Vendor ID and need a Bluetooth Vendor ID
// device info: BlueKitchen GmbH, product 1, version 1
device_id_create_sdp_record(device_id_sdp_service_buffer, 0x10003, DEVICE_ID_VENDOR_ID_SOURCE_BLUETOOTH, BLUETOOTH_COMPANY_ID_BLUEKITCHEN_GMBH, 1, 1);
printf("Device ID SDP service record size: %u\n", de_get_len((uint8_t*)device_id_sdp_service_buffer));
device_id_create_sdp_record(device_id_sdp_service_buffer, sdp_create_service_record_handle(), DEVICE_ID_VENDOR_ID_SOURCE_BLUETOOTH, BLUETOOTH_COMPANY_ID_BLUEKITCHEN_GMBH, 1, 1);
btstack_assert(de_get_len( device_id_sdp_service_buffer) <= sizeof(device_id_sdp_service_buffer));
sdp_register_service(device_id_sdp_service_buffer);
// HID Device

View File

@ -62,7 +62,8 @@
// to enable demo text on POSIX systems
// #undef HAVE_BTSTACK_STDIN
static uint8_t hid_service_buffer[250];
static uint8_t hid_service_buffer[270];
static uint8_t device_id_sdp_service_buffer[100];
static const char hid_device_name[] = "BTstack HID Mouse";
static btstack_packet_callback_registration_t hci_event_callback_registration;
static uint16_t hid_cid;
@ -304,7 +305,6 @@ int btstack_main(int argc, const char * argv[]){
// SDP Server
sdp_init();
memset(hid_service_buffer, 0, sizeof(hid_service_buffer));
uint8_t hid_virtual_cable = 0;
uint8_t hid_remote_wake = 1;
@ -323,11 +323,17 @@ int btstack_main(int argc, const char * argv[]){
hid_device_name
};
hid_create_sdp_record(hid_service_buffer, 0x10001, &hid_params);
printf("SDP service record size: %u\n", de_get_len( hid_service_buffer));
memset(hid_service_buffer, 0, sizeof(hid_service_buffer));
hid_create_sdp_record(hid_service_buffer, sdp_create_service_record_handle(), &hid_params);
btstack_assert(de_get_len( hid_service_buffer) <= sizeof(hid_service_buffer));
sdp_register_service(hid_service_buffer);
// See https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers if you don't have a USB Vendor ID and need a Bluetooth Vendor ID
// device info: BlueKitchen GmbH, product 2, version 1
device_id_create_sdp_record(device_id_sdp_service_buffer, sdp_create_service_record_handle(), DEVICE_ID_VENDOR_ID_SOURCE_BLUETOOTH, BLUETOOTH_COMPANY_ID_BLUEKITCHEN_GMBH, 2, 1);
btstack_assert(de_get_len( device_id_sdp_service_buffer) <= sizeof(device_id_sdp_service_buffer));
sdp_register_service(device_id_sdp_service_buffer);
// HID Device
hid_device_init(hid_boot_device, sizeof(hid_descriptor_mouse_boot_mode), hid_descriptor_mouse_boot_mode);
// register for HCI events

View File

@ -303,8 +303,8 @@ int btstack_main(int argc, const char * argv[]){
sdp_init();
memset((uint8_t *)hsp_service_buffer, 0, sizeof(hsp_service_buffer));
hsp_ag_create_sdp_record(hsp_service_buffer, 0x10001, rfcomm_channel_nr, hsp_ag_service_name);
printf("SDP service record size: %u\n", de_get_len(hsp_service_buffer));
hsp_ag_create_sdp_record(hsp_service_buffer, sdp_create_service_record_handle(), rfcomm_channel_nr, hsp_ag_service_name);
btstack_assert(de_get_len( hsp_service_buffer) <= sizeof(hsp_service_buffer));
sdp_register_service(hsp_service_buffer);
rfcomm_init();

View File

@ -284,7 +284,8 @@ int btstack_main(int argc, const char * argv[]){
sdp_init();
memset(hsp_service_buffer, 0, sizeof(hsp_service_buffer));
hsp_hs_create_sdp_record(hsp_service_buffer, 0x10001, rfcomm_channel_nr, hsp_hs_service_name, 0);
hsp_hs_create_sdp_record(hsp_service_buffer, sdp_create_service_record_handle(), rfcomm_channel_nr, hsp_hs_service_name, 0);
btstack_assert(de_get_len( hsp_service_buffer) <= sizeof(hsp_service_buffer));
sdp_register_service(hsp_service_buffer);
rfcomm_init();

View File

@ -190,8 +190,8 @@ static void pan_bnep_setup(void){
// NAP Network Access Type: Other, 1 MB/s
pan_create_nap_sdp_record(pan_sdp_record, sdp_create_service_record_handle(), network_packet_types, NULL, NULL, BNEP_SECURITY_NONE, PAN_NET_ACCESS_TYPE_OTHER, 1000000, NULL, NULL);
btstack_assert(de_get_len( pan_sdp_record) <= sizeof(pan_sdp_record));
sdp_register_service(pan_sdp_record);
printf("SDP service record size: %u\n", de_get_len((uint8_t*) pan_sdp_record));
// Init BNEP lwIP Adapter
bnep_lwip_init();

View File

@ -137,8 +137,8 @@ static void panu_setup(void){
// NAP Network Access Type: Other, 1 MB/s
pan_create_nap_sdp_record(panu_sdp_record, sdp_create_service_record_handle(), network_packet_types, NULL, NULL, BNEP_SECURITY_NONE, PAN_NET_ACCESS_TYPE_OTHER, 1000000, NULL, NULL);
#endif
btstack_assert(de_get_len( panu_sdp_record) <= sizeof(panu_sdp_record));
sdp_register_service(panu_sdp_record);
printf("SDP service record size: %u\n", de_get_len((uint8_t*) panu_sdp_record));
// Initialize network interface
btstack_network_init(&network_send_packet_callback);

View File

@ -269,9 +269,9 @@ int btstack_main(void)
// init SDP, create record for SPP and register with SDP
sdp_init();
memset(spp_service_buffer, 0, sizeof(spp_service_buffer));
spp_create_sdp_record(spp_service_buffer, 0x10001, RFCOMM_SERVER_CHANNEL, "SPP Counter");
spp_create_sdp_record(spp_service_buffer, sdp_create_service_record_handle(), RFCOMM_SERVER_CHANNEL, "SPP Counter");
btstack_assert(de_get_len( spp_service_buffer) <= sizeof(spp_service_buffer));
sdp_register_service(spp_service_buffer);
printf("SDP service record size: %u\n", de_get_len(spp_service_buffer));
#ifdef ENABLE_GATT_OVER_CLASSIC
// init SDP, create record for GATT and register with SDP

View File

@ -450,13 +450,15 @@ int btstack_main(int argc, const char * argv[])
// init SDP, create record for SPP and register with SDP
sdp_init();
memset(spp_service_buffer, 0, sizeof(spp_service_buffer));
spp_create_sdp_record(spp_service_buffer, 0x10001, RFCOMM_SERVER_CHANNEL, "SPP Streamer");
spp_create_sdp_record(spp_service_buffer, sdp_create_service_record_handle(), RFCOMM_SERVER_CHANNEL, "SPP Streamer");
btstack_assert(de_get_len( spp_service_buffer) <= sizeof(spp_service_buffer));
sdp_register_service(spp_service_buffer);
#ifdef ENABLE_GATT_OVER_CLASSIC
// init SDP, create record for GATT and register with SDP
memset(gatt_service_buffer, 0, sizeof(gatt_service_buffer));
gatt_create_sdp_record(gatt_service_buffer, 0x10001, ATT_SERVICE_GATT_SERVICE_START_HANDLE, ATT_SERVICE_GATT_SERVICE_END_HANDLE);
gatt_create_sdp_record(gatt_service_buffer, sdp_create_service_record_handle(), ATT_SERVICE_GATT_SERVICE_START_HANDLE, ATT_SERVICE_GATT_SERVICE_END_HANDLE);
btstack_assert(de_get_len( gatt_service_buffer) <= sizeof(gatt_service_buffer));
sdp_register_service(gatt_service_buffer);
#endif

View File

@ -101,9 +101,9 @@ static void spp_service_setup(void){
// init SDP, create record for SPP and register with SDP
sdp_init();
memset(spp_service_buffer, 0, sizeof(spp_service_buffer));
spp_create_sdp_record(spp_service_buffer, 0x10001, RFCOMM_SERVER_CHANNEL, "SPP Counter");
spp_create_sdp_record(spp_service_buffer, sdp_create_service_record_handle(), RFCOMM_SERVER_CHANNEL, "SPP Counter");
btstack_assert(de_get_len( spp_service_buffer) <= sizeof(spp_service_buffer));
sdp_register_service(spp_service_buffer);
printf("SDP service record size: %u\n", de_get_len(spp_service_buffer));
}
/* LISTING_END */

View File

@ -91,9 +91,9 @@ static void spp_service_setup(void){
// init SDP, create record for SPP and register with SDP
sdp_init();
memset(spp_service_buffer, 0, sizeof(spp_service_buffer));
spp_create_sdp_record(spp_service_buffer, 0x10001, 1, "SPP Counter");
spp_create_sdp_record(spp_service_buffer, sdp_create_service_record_handle(), 1, "SPP Counter");
btstack_assert(de_get_len( spp_service_buffer) <= sizeof(spp_service_buffer));
sdp_register_service(spp_service_buffer);
printf("SDP service buffer size: %u\n\r", (uint16_t) de_get_len(spp_service_buffer));
}
/* LISTING_END */

View File

@ -299,9 +299,9 @@ int btstack_main(int argc, const char * argv[])
// init SDP, create record for SPP and register with SDP
sdp_init();
memset(spp_service_buffer, 0, sizeof(spp_service_buffer));
spp_create_sdp_record(spp_service_buffer, 0x10001, RFCOMM_SERVER_CHANNEL, "SPP Streamer");
spp_create_sdp_record(spp_service_buffer, sdp_create_service_record_handle(), RFCOMM_SERVER_CHANNEL, "SPP Streamer");
btstack_assert(de_get_len( spp_service_buffer) <= sizeof(spp_service_buffer));
sdp_register_service(spp_service_buffer);
// printf("SDP service record size: %u\n", de_get_len(spp_service_buffer));
// register for HCI events
hci_event_callback_registration.callback = &packet_handler;