summaryrefslogtreecommitdiff
path: root/epan/dissectors/packet-btsdp.c
diff options
context:
space:
mode:
authorEvan Huus <eapache@gmail.com>2013-03-30 15:53:04 +0000
committerEvan Huus <eapache@gmail.com>2013-03-30 15:53:04 +0000
commit02dff207836a9e33301936455fe32580729db4ca (patch)
treedd71d070f758ef1bee36dd61689569a78f62391b /epan/dissectors/packet-btsdp.c
parent2fba8c0f9d923d568dfa9b22ee2c30dbbfa71ab1 (diff)
downloadwireshark-02dff207836a9e33301936455fe32580729db4ca.tar.gz
From Michal Labedzki via https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=8509
Round 2 of Bluetooth SDP updates: - replace a lot of proto_tree_add_text with named fields - dissect more of the protocol - misc fixes svn path=/trunk/; revision=48655
Diffstat (limited to 'epan/dissectors/packet-btsdp.c')
-rw-r--r--epan/dissectors/packet-btsdp.c2954
1 files changed, 2931 insertions, 23 deletions
diff --git a/epan/dissectors/packet-btsdp.c b/epan/dissectors/packet-btsdp.c
index f854047411..875ea2dbd1 100644
--- a/epan/dissectors/packet-btsdp.c
+++ b/epan/dissectors/packet-btsdp.c
@@ -62,8 +62,228 @@ static gint hf_data_element_size = -1;
static gint hf_data_element_type = -1;
static gint hf_data_element_var_size = -1;
static gint hf_data_element_value = -1;
-static gint hf_sdp_service_record_handle = -1;
static gint hf_service_attribute_id_generic = -1;
+static gint hf_service_attribute_id_a2dp = -1;
+static gint hf_service_attribute_id_avrcp = -1;
+static gint hf_service_attribute_id_ctp = -1;
+static gint hf_service_attribute_id_bip_imaging_responder = -1;
+static gint hf_service_attribute_id_bip_imaging_other = -1;
+static gint hf_service_attribute_id_bpp = -1;
+static gint hf_service_attribute_id_bpp_rui = -1;
+static gint hf_service_attribute_id_did = -1;
+static gint hf_service_attribute_id_dun = -1;
+static gint hf_service_attribute_id_fax = -1;
+static gint hf_service_attribute_id_ftp = -1;
+static gint hf_service_attribute_id_gnss = -1;
+static gint hf_service_attribute_id_hfp_hf = -1;
+static gint hf_service_attribute_id_hfp_ag = -1;
+static gint hf_service_attribute_id_hcrp = -1;
+static gint hf_service_attribute_id_hsp = -1;
+static gint hf_service_attribute_id_hdp = -1;
+static gint hf_service_attribute_id_hid = -1;
+static gint hf_service_attribute_id_wap = -1;
+static gint hf_service_attribute_id_map_mas = -1;
+static gint hf_service_attribute_id_opp = -1;
+static gint hf_service_attribute_id_pan_nap = -1;
+static gint hf_service_attribute_id_pan_gn = -1;
+static gint hf_service_attribute_id_pan_panu = -1;
+static gint hf_service_attribute_id_pbap = -1;
+static gint hf_service_attribute_id_synch = -1;
+static gint hf_did_specification_id = -1;
+static gint hf_did_vendor_id = -1;
+static gint hf_did_vendor_id_bluetooth_sig = -1;
+static gint hf_did_vendor_id_usb_forum = -1;
+static gint hf_did_product_id = -1;
+static gint hf_did_primary_record = -1;
+static gint hf_did_version = -1;
+static gint hf_did_vendor_id_source = -1;
+static gint hf_a2dp_sink_supported_features_reserved = -1;
+static gint hf_a2dp_sink_supported_features_amplifier = -1;
+static gint hf_a2dp_sink_supported_features_recorder = -1;
+static gint hf_a2dp_sink_supported_features_speaker = -1;
+static gint hf_a2dp_sink_supported_features_headphone = -1;
+static gint hf_a2dp_source_supported_features_reserved = -1;
+static gint hf_a2dp_source_supported_features_mixer = -1;
+static gint hf_a2dp_source_supported_features_tuner = -1;
+static gint hf_a2dp_source_supported_features_microphone = -1;
+static gint hf_a2dp_source_supported_features_player = -1;
+static gint hf_synch_supported_data_store = -1;
+static gint hf_ctp_external_network = -1;
+static gint hf_avrcp_ct_supported_features_reserved_7_15 = -1;
+static gint hf_avrcp_ct_supported_features_browsing = -1;
+static gint hf_avrcp_ct_supported_features_reserved_4_5 = -1;
+static gint hf_avrcp_ct_supported_features_category_4 = -1;
+static gint hf_avrcp_ct_supported_features_category_3 = -1;
+static gint hf_avrcp_ct_supported_features_category_2 = -1;
+static gint hf_avrcp_ct_supported_features_category_1 = -1;
+static gint hf_avrcp_tg_supported_features_reserved_8_15 = -1;
+static gint hf_avrcp_tg_supported_features_multiple_player = -1;
+static gint hf_avrcp_tg_supported_features_browsing = -1;
+static gint hf_avrcp_tg_supported_features_group_navigation = -1;
+static gint hf_avrcp_tg_supported_features_settings = -1;
+static gint hf_avrcp_tg_supported_features_category_4 = -1;
+static gint hf_avrcp_tg_supported_features_category_3 = -1;
+static gint hf_avrcp_tg_supported_features_category_2 = -1;
+static gint hf_avrcp_tg_supported_features_category_1 = -1;
+static gint hf_hsp_remote_audio_volume_control = -1;
+static gint hf_gnss_supported_features = -1;
+static gint hf_pbap_pse_supported_repositories_reserved = -1;
+static gint hf_pbap_pse_supported_repositories_sim_card = -1;
+static gint hf_pbap_pse_supported_repositories_local_phonebook = -1;
+static gint hf_fax_support_class_1 = -1;
+static gint hf_fax_support_class_2 = -1;
+static gint hf_fax_support_class_2_vendor = -1;
+static gint hf_fax_support_audio_feedback = -1;
+static gint hf_ftp_goep_l2cap_psm = -1;
+static gint hf_map_mas_instance_id = -1;
+static gint hf_map_mas_supported_message_types_reserved = -1;
+static gint hf_map_mas_supported_message_types_mms = -1;
+static gint hf_map_mas_supported_message_types_sms_cdma = -1;
+static gint hf_map_mas_supported_message_types_sms_gsm = -1;
+static gint hf_map_mas_supported_message_types_email = -1;
+static gint hf_hcrp_1284_id = -1;
+static gint hf_hcrp_device_location = -1;
+static gint hf_hcrp_device_name = -1;
+static gint hf_hcrp_friendly_name = -1;
+static gint hf_wap_network_address = -1;
+static gint hf_wap_gateway = -1;
+static gint hf_wap_homepage_url = -1;
+static gint hf_wap_stack_type = -1;
+static gint hf_hdp_data_exchange = -1;
+static gint hf_hdp_support_procedure_reserved_5_7 = -1;
+static gint hf_hdp_support_procedure_sync_master_role = -1;
+static gint hf_hdp_support_procedure_clock_synchronization_protocol = -1;
+static gint hf_hdp_support_procedure_reconnect_acceptance = -1;
+static gint hf_hdp_support_procedure_reconnect_initiation = -1;
+static gint hf_hdp_support_procedure_reserved = -1;
+static gint hf_hdp_supported_features_mdep_id = -1;
+static gint hf_hdp_supported_features_mdep_data_type = -1;
+static gint hf_hdp_supported_features_mdep_role = -1;
+static gint hf_hdp_supported_features_mdep_description = -1;
+static gint hf_pan_sercurity_description = -1;
+static gint hf_pan_ipv4_subnet = -1;
+static gint hf_pan_ipv6_subnet = -1;
+static gint hf_pan_max_net_access_rate = -1;
+static gint hf_pan_net_access_type = -1;
+static gint hf_opp_goep_l2cap_psm = -1;
+static gint hf_opp_supported_format = -1;
+static gint hf_dun_escape_sequence = -1;
+static gint hf_dun_support_audio_feedback = -1;
+static gint hf_hfp_hf_supported_features_reserved = -1;
+static gint hf_hfp_hf_supported_features_wide_band_speech = -1;
+static gint hf_hfp_hf_supported_features_remote_volume_control = -1;
+static gint hf_hfp_hf_supported_features_voice_recognition_activation = -1;
+static gint hf_hfp_hf_supported_features_cli_presentation_capability = -1;
+static gint hf_hfp_hf_supported_features_call_waiting_or_three_way_calling = -1;
+static gint hf_hfp_hf_supported_features_ec_and_or_nr_function = -1;
+static gint hf_hfp_gw_network = -1;
+static gint hf_hfp_gw_supported_features_reserved = -1;
+static gint hf_hfp_gw_supported_features_wide_band_speech = -1;
+static gint hf_hfp_gw_supported_features_attach_phone_number_to_voice_tag = -1;
+static gint hf_hfp_gw_supported_features_inband_ring_tone_capability = -1;
+static gint hf_hfp_gw_supported_features_voice_recognition_function = -1;
+static gint hf_hfp_gw_supported_features_ec_and_or_nr_function = -1;
+static gint hf_hfp_gw_supported_features_three_way_calling = -1;
+static gint hf_sdp_service_uuid = -1;
+static gint hf_sdp_service_long_uuid = -1;
+static gint hf_sdp_protocol_psm = -1;
+static gint hf_sdp_protocol_channel = -1;
+static gint hf_sdp_protocol_gatt_handle_start = -1;
+static gint hf_sdp_protocol_gatt_handle_end = -1;
+static gint hf_sdp_protocol_version = -1;
+static gint hf_sdp_protocol_bnep_type = -1;
+static gint hf_sdp_service_record_handle = -1;
+static gint hf_sdp_service_record_state = -1;
+static gint hf_sdp_service_info_time_to_live = -1;
+static gint hf_sdp_service_availability = -1;
+static gint hf_sdp_service_documentation_url = -1;
+static gint hf_sdp_service_client_executable_url = -1;
+static gint hf_sdp_service_icon_url = -1;
+static gint hf_sdp_service_name = -1;
+static gint hf_sdp_service_description = -1;
+static gint hf_sdp_service_provider_name = -1;
+static gint hf_sdp_lang_id = -1;
+static gint hf_sdp_lang_code = -1;
+static gint hf_sdp_lang_encoding = -1;
+static gint hf_sdp_lang_attribute_base = -1;
+static gint hf_hid_device_release_number = -1;
+static gint hf_hid_parser_version = -1;
+static gint hf_hid_device_subclass_type = -1;
+static gint hf_hid_device_subclass_subtype = -1;
+static gint hf_hid_device_subclass_reserved = -1;
+static gint hf_hid_country_code = -1;
+static gint hf_hid_virtual_cable = -1;
+static gint hf_hid_reconnect_initiate = -1;
+static gint hf_hid_sdp_disable = -1;
+static gint hf_hid_battery_power = -1;
+static gint hf_hid_remote_wake = -1;
+static gint hf_hid_profile_version = -1;
+static gint hf_hid_supervision_timeout = -1;
+static gint hf_hid_normally_connectable = -1;
+static gint hf_hid_boot_device = -1;
+static gint hf_hid_ssr_host_max_latency = -1;
+static gint hf_hid_ssr_host_min_timeout = -1;
+static gint hf_hid_descriptor_list_type = -1;
+static gint hf_hid_descriptor_list_descriptor = -1;
+static gint hf_bip_goep_l2cap_psm = -1;
+static gint hf_bip_supported_capabilities_reserved_4_7 = -1;
+static gint hf_bip_supported_capabilities_displaying = -1;
+static gint hf_bip_supported_capabilities_printing = -1;
+static gint hf_bip_supported_capabilities_capturing = -1;
+static gint hf_bip_supported_capabilities_genering_imaging = -1;
+static gint hf_bip_supported_features_reserved_9_15 = -1;
+static gint hf_bip_supported_features_remote_display = -1;
+static gint hf_bip_supported_features_remote_camera = -1;
+static gint hf_bip_supported_features_automatic_archive = -1;
+static gint hf_bip_supported_features_advanced_image_printing = -1;
+static gint hf_bip_supported_features_image_pull = -1;
+static gint hf_bip_supported_features_image_push_display = -1;
+static gint hf_bip_supported_features_image_push_print = -1;
+static gint hf_bip_supported_features_image_push_store = -1;
+static gint hf_bip_supported_features_image_push = -1;
+static gint hf_bip_supported_functions_reserved_17_31 = -1;
+static gint hf_bip_supported_functions_get_status = -1;
+static gint hf_bip_supported_functions_reserved_15 = -1;
+static gint hf_bip_supported_functions_get_monitoring_image = -1;
+static gint hf_bip_supported_functions_start_archive = -1;
+static gint hf_bip_supported_functions_reserved_12 = -1;
+static gint hf_bip_supported_functions_start_print = -1;
+static gint hf_bip_supported_functions_delete_image = -1;
+static gint hf_bip_supported_functions_get_linked_attachment = -1;
+static gint hf_bip_supported_functions_get_linked_thumbnail = -1;
+static gint hf_bip_supported_functions_get_image = -1;
+static gint hf_bip_supported_functions_get_image_property = -1;
+static gint hf_bip_supported_functions_get_images_list = -1;
+static gint hf_bip_supported_functions_remote_display = -1;
+static gint hf_bip_supported_functions_put_linked_thumbnail = -1;
+static gint hf_bip_supported_functions_put_linked_attachment = -1;
+static gint hf_bip_supported_functions_put_image = -1;
+static gint hf_bip_supported_functions_get_capabilities = -1;
+static gint hf_bip_supported_functions_reserved_13_31 = -1;
+static gint hf_bip_supported_functions_get_partial_image = -1;
+static gint hf_bip_supported_functions_reserved_1_11 = -1;
+static gint hf_bip_supported_functions_reserved_1_4 = -1;
+static gint hf_bip_supported_functions_reserved_11_31 = -1;
+static gint hf_bip_total_imaging_data_capacity = -1;
+static gint hf_bpp_document_formats_supported = -1;
+static gint hf_bpp_character_repertoires_support = -1;
+static gint hf_bpp_xhtml_print_image_formats_supported = -1;
+static gint hf_bpp_color_supported = -1;
+static gint hf_bpp_1284_id = -1;
+static gint hf_bpp_printer_name = -1;
+static gint hf_bpp_printer_location = -1;
+static gint hf_bpp_duplex_supported = -1;
+static gint hf_bpp_media_types_supported = -1;
+static gint hf_bpp_max_media_width = -1;
+static gint hf_bpp_max_media_length = -1;
+static gint hf_bpp_enhanced_layout_supported = -1;
+static gint hf_bpp_rui_formats_supported = -1;
+static gint hf_bpp_reference_printing_rui_supported = -1;
+static gint hf_bpp_direct_printing_rui_supported = -1;
+static gint hf_bpp_reference_printing_top_url = -1;
+static gint hf_bpp_direct_printing_top_url = -1;
+static gint hf_bpp_device_name = -1;
+static gint hf_bpp_printer_admin_rui_top_url = -1;
static gint ett_btsdp = -1;
static gint ett_btsdp_ssr = -1;
@@ -77,12 +297,17 @@ static gint ett_btsdp_continuation_state = -1;
static gint ett_btsdp_data_element = -1;
static gint ett_btsdp_data_element_value = -1;
static gint ett_btsdp_reassembled = -1;
+static gint ett_btsdp_supported_features = -1;
+static gint ett_btsdp_supported_features_mdep_id = -1;
+static gint ett_btsdp_supported_features_mdep_data_type = -1;
+static gint ett_btsdp_supported_features_mdep_role = -1;
+static gint ett_btsdp_supported_features_mdep_description = -1;
+static gint ett_btsdp_protocol = -1;
static gint btsdp_tap = -1;
static emem_tree_t *tid_requests = NULL;
static emem_tree_t *continuation_states = NULL;
-static emem_tree_t *service_infos = NULL;
static sdp_package_t sdp_package;
@@ -663,6 +888,10 @@ static const value_string vs_data_element_type[] = {
{ 0, NULL }
};
+extern value_string_ext ext_psm_vals;
+extern value_string_ext wap_mib_enum_vals_character_sets_ext;
+extern value_string_ext usb_langid_vals_ext;
+
void proto_register_btsdp(void);
void proto_reg_handoff_btsdp(void);
@@ -992,7 +1221,6 @@ reassemble_continuation_state(tvbuff_t *tvb, packet_info *pinfo,
if (new_tvb) *new_tvb = next_tvb;
if (tid_request->continuation_state_length) *is_first = FALSE;
}
-
}
} else {
guint8 *continuation_state;
@@ -1326,11 +1554,156 @@ dissect_sdp_error_response(proto_tree *tree, tvbuff_t *tvb, gint offset)
}
static gint
+dissect_protocol_descriptor_list(proto_tree *next_tree, tvbuff_t *tvb,
+ packet_info *pinfo, gint offset, gint size, gchar *str,
+ gint start_strpos, gint *protocol_order)
+{
+ proto_tree *feature_tree;
+ proto_item *feature_item;
+ proto_tree *entry_tree;
+ proto_item *entry_item;
+ proto_tree *sub_tree;
+ proto_tree *last_tree;
+ gint strpos = start_strpos;
+ gint new_offset;
+ gint list_offset;
+ gint entry_offset;
+ gint entry_length;
+ guint32 value;
+ gint length;
+ guint32 i_protocol;
+ guint16 uuid;
+
+ list_offset = offset;
+ i_protocol = 1;
+ while (list_offset - offset < size) {
+ feature_item = proto_tree_add_text(next_tree, tvb, list_offset, 0, "Protocol #%u", i_protocol);
+ feature_tree = proto_item_add_subtree(feature_item, ett_btsdp_protocol);
+ entry_offset = get_type_length(tvb, list_offset, &entry_length);
+ proto_item_set_len(feature_item, entry_length + (entry_offset - list_offset));
+
+ dissect_data_element(feature_tree, &sub_tree, pinfo, tvb, list_offset);
+
+ entry_item = proto_tree_add_text(sub_tree, tvb, entry_offset, 0, "Protocol Entry");
+ entry_tree = proto_item_add_subtree(entry_item, ett_btsdp_supported_features_mdep_id);
+ dissect_data_element(entry_tree, &sub_tree, pinfo, tvb, entry_offset);
+ new_offset = get_type_length(tvb, entry_offset, &length);
+ proto_item_set_len(entry_item, (new_offset - entry_offset) + length);
+ entry_offset = new_offset;
+
+ if (length == 2) {
+ proto_tree_add_item(sub_tree, hf_sdp_service_uuid, tvb, entry_offset, 2, ENC_BIG_ENDIAN);
+ uuid = tvb_get_ntohs(tvb, entry_offset);
+ } else {
+ proto_tree_add_item(sub_tree, hf_sdp_service_long_uuid, tvb, entry_offset, length, ENC_BIG_ENDIAN);
+ uuid = 0;
+ }
+
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "%s", val_to_str_const(uuid, vs_service_classes, "Unknown"));
+ proto_item_append_text(feature_item, ": %s", val_to_str_const(uuid, vs_service_classes, "Unknown"));
+ proto_item_append_text(entry_item, ": %s", val_to_str_const(uuid, vs_service_classes, "Unknown"));
+
+ entry_offset += length;
+
+ if (entry_offset - list_offset <= entry_length) {
+ dissect_data_element(entry_tree, &sub_tree, pinfo, tvb, entry_offset);
+ new_offset = get_type_length(tvb, entry_offset, &length);
+ proto_item_set_len(entry_item, (new_offset - entry_offset) + length);
+ entry_offset = new_offset;
+ value = get_int_by_size(tvb, entry_offset, length / 2);
+
+ if (uuid == BTSDP_L2CAP_PROTOCOL_UUID) {
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, ":%u", value);
+ proto_item_append_text(feature_item, ", PSM: %u", value);
+ proto_item_append_text(entry_item, ", PSM: %u", value);
+ proto_tree_add_item(sub_tree, hf_sdp_protocol_psm, tvb, entry_offset, 2, ENC_BIG_ENDIAN);
+ *protocol_order += 1;
+ } else if (uuid == BTSDP_RFCOMM_PROTOCOL_UUID) {
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, ":%u", value);
+ proto_item_append_text(feature_item, ", RFCOMM Channel: %u", value);
+ proto_item_append_text(entry_item, ", RFCOMM Channel: %u", value);
+ proto_tree_add_item(sub_tree, hf_sdp_protocol_channel, tvb, entry_offset, 1, ENC_BIG_ENDIAN);
+ *protocol_order += 1;
+ } else if (uuid == BTSDP_ATT_PROTOCOL_UUID) {
+ proto_item_append_text(feature_item, ", GATT Handle Start: 0x%04x", value);
+ proto_item_append_text(entry_item, ", GATT Handle Start: 0x%04x", value);
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, ":0x%04x.", value);
+ proto_tree_add_item(sub_tree, hf_sdp_protocol_gatt_handle_start, tvb, entry_offset, 2, ENC_BIG_ENDIAN);
+
+ if ((entry_offset - list_offset) + length <= entry_length) {
+ entry_offset += length;
+ dissect_data_element(entry_tree, &sub_tree, pinfo, tvb, entry_offset);
+ new_offset = get_type_length(tvb, entry_offset, &length);
+ proto_item_set_len(entry_item, (new_offset - entry_offset) + length);
+ entry_offset = new_offset;
+ value = get_int_by_size(tvb, entry_offset, length / 2);
+
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, ".0x%04x", value);
+ proto_item_append_text(feature_item, ", GATT Handle End: 0x%04x", value);
+ proto_item_append_text(entry_item, ", GATT Handle End: 0x%04x", value);
+ proto_tree_add_item(sub_tree, hf_sdp_protocol_gatt_handle_end, tvb, entry_offset, 2, ENC_BIG_ENDIAN);
+ }
+ } else {
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, " (%x.%x)", value >> 8, value & 0xFF);
+ proto_item_append_text(feature_item, ", Version %x.%x", value >> 8, value & 0xFF);
+ proto_item_append_text(entry_item, ", Version 0x%03x", value);
+ proto_tree_add_item(sub_tree, hf_sdp_protocol_version, tvb, entry_offset, 2, ENC_BIG_ENDIAN);
+ }
+
+ entry_offset += length;
+ }
+
+ while (entry_offset - list_offset <= entry_length) {
+ gint value_offset;
+ gint len;
+
+ dissect_data_element(entry_tree, &sub_tree, pinfo, tvb, entry_offset);
+ new_offset = get_type_length(tvb, entry_offset, &length);
+
+ if (uuid == BTSDP_BNEP_PROTOCOL_UUID) {
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, " (");
+ value_offset = new_offset;
+ while (value_offset - new_offset < length) {
+ gint next_offset;
+ dissect_data_element(sub_tree, &last_tree, pinfo, tvb, value_offset);
+ next_offset = get_type_length(tvb, value_offset, &len);
+ value = get_int_by_size(tvb, next_offset, len / 2);
+
+ proto_tree_add_item(last_tree, hf_sdp_protocol_bnep_type, tvb, next_offset, 2, ENC_BIG_ENDIAN);
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "%s", val_to_str_const(value, etype_vals, "Unknown"));
+ value_offset = next_offset + len;
+
+ if (value_offset - new_offset < length)
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, " ");
+ }
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, ")");
+ }
+
+ entry_offset = new_offset + length;
+ }
+
+ i_protocol += 1;
+ list_offset = entry_offset;
+
+ if (list_offset - offset < size)
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, " -> ");
+ }
+
+ return strpos;
+}
+
+static gint
dissect_sdp_type(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb,
gint offset, gint attribute, guint16 service_uuid, gint service_data,
service_info_t *service_info, gchar **attr_val)
{
+ proto_tree *feature_tree;
+ proto_item *feature_item;
+ proto_tree *entry_tree;
+ proto_item *entry_item;
proto_tree *next_tree;
+ proto_tree *sub_tree;
+ proto_tree *last_tree;
gint strpos = 0;
gint size;
gchar *str;
@@ -1339,6 +1712,28 @@ dissect_sdp_type(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb,
guint8 size_index;
gint start_offset;
gint new_offset;
+ gint list_offset;
+ gint list_length;
+ gint entry_offset;
+ gint entry_length;
+ gboolean found;
+ guint16 specification_id;
+ guint16 vendor_id;
+ guint16 product_id;
+ guint16 version;
+ guint8 primary_record;
+ guint8 mdep_id;
+ guint16 vendor_id_source;
+ const guint8 *str_val;
+ guint16 supported_features;
+ guint i_feature;
+ guint i_protocol;
+ guint16 psm;
+ guint8 *new_str;
+ guint32 value;
+ guint64 value_64;
+ gint length;
+ gint protocol_order;
str = (char *) wmem_alloc(wmem_packet_scope(), MAX_SDP_LEN + 1);
*attr_val = str;
@@ -1353,11 +1748,1228 @@ dissect_sdp_type(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb,
offset = get_type_length(tvb, offset, &size);
- switch (type) {
+ found = TRUE;
+ switch(service_uuid) {
+ case BTSDP_DID_SERVICE_UUID:
+ switch (attribute) {
+ case 0x200:
+ proto_tree_add_item(next_tree, hf_did_specification_id, tvb, offset, 2, ENC_BIG_ENDIAN);
+ specification_id = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%x.%02x (0x%04x)", specification_id >> 8, specification_id & 0xFF, specification_id);
+ break;
+ case 0x201:
+ vendor_id = tvb_get_ntohs(tvb, offset);
+ if (service_data == 1) {
+ proto_tree_add_item(next_tree, hf_did_vendor_id_bluetooth_sig, tvb, offset, 2, ENC_BIG_ENDIAN);
+ str_val = val_to_str_ext_const(vendor_id, &bthci_evt_comp_id_ext, "Unknown");
+ } else if (service_data == 2) {
+ proto_tree_add_item(next_tree, hf_did_vendor_id_usb_forum, tvb, offset, 2, ENC_BIG_ENDIAN);
+ str_val = val_to_str_ext_const(vendor_id, &ext_usb_vendors_vals, "Unknown");
+ } else {
+ proto_tree_add_item(next_tree, hf_did_vendor_id, tvb, offset, 2, ENC_BIG_ENDIAN);
+ str_val = "Unknown";
+ }
+ g_snprintf(str, MAX_SDP_LEN, "%s (0x%04x)", str_val, vendor_id);
+ break;
+ case 0x202:
+ proto_tree_add_item(next_tree, hf_did_product_id, tvb, offset, 2, ENC_BIG_ENDIAN);
+ product_id = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "0x%04x", product_id);
+ break;
+ case 0x203:
+ proto_tree_add_item(next_tree, hf_did_version, tvb, offset, 2, ENC_BIG_ENDIAN);
+ version = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%x.%x.%x (0x%04x)", version >> 8, (version >> 4) & 0xF, version & 0xF, version);
+ break;
+ case 0x204:
+ proto_tree_add_item(next_tree, hf_did_primary_record, tvb, offset, 2, ENC_BIG_ENDIAN);
+ primary_record = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", primary_record ? "true" : "false");
+ break;
+ case 0x205:
+ proto_tree_add_item(next_tree, hf_did_vendor_id_source, tvb, offset, 2, ENC_BIG_ENDIAN);
+ vendor_id_source = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s (0x%04x)",
+ val_to_str_const(vendor_id_source, did_vendor_id_source_vals, "Unknown"),
+ vendor_id_source);
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_A2DP_SINK_SERVICE_UUID:
+ switch (attribute) {
+ case 0x311:
+ proto_tree_add_item(next_tree, hf_a2dp_sink_supported_features_reserved, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_a2dp_sink_supported_features_amplifier, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_a2dp_sink_supported_features_recorder, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_a2dp_sink_supported_features_speaker, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_a2dp_sink_supported_features_headphone, tvb, offset, 2, ENC_BIG_ENDIAN);
+
+ supported_features = tvb_get_ntohs(tvb, offset);
+
+ g_snprintf(str, MAX_SDP_LEN, "%s%s%s%s",
+ (supported_features & 0x01) ? "Headphone " : "",
+ (supported_features & 0x02) ? "Speaker " : "",
+ (supported_features & 0x04) ? "Recorder " : "",
+ (supported_features & 0x08) ? "Amplifier " : "");
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_A2DP_SOURCE_SERVICE_UUID:
+ switch (attribute) {
+ case 0x311:
+ proto_tree_add_item(next_tree, hf_a2dp_source_supported_features_reserved, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_a2dp_source_supported_features_mixer, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_a2dp_source_supported_features_tuner, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_a2dp_source_supported_features_microphone, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_a2dp_source_supported_features_player, tvb, offset, 2, ENC_BIG_ENDIAN);
+
+ supported_features = tvb_get_ntohs(tvb, offset);
+
+ g_snprintf(str, MAX_SDP_LEN, "%s%s%s%s",
+ (supported_features & 0x01) ? "Player " : "",
+ (supported_features & 0x02) ? "Microphone " : "",
+ (supported_features & 0x04) ? "Tuner " : "",
+ (supported_features & 0x08) ? "Mixer " : "");
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_SYNC_SERVICE_UUID:
+ switch (attribute) {
+ case 0x301:
+ list_offset = offset;
+ while (list_offset - offset < size) {
+ dissect_data_element(next_tree, &entry_tree, pinfo, tvb, list_offset);
+ list_offset = get_type_length(tvb, list_offset, &list_length);
+ proto_tree_add_item(entry_tree, hf_synch_supported_data_store, tvb, list_offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, list_offset);
+
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "%s ", val_to_str_const(value, synch_supported_data_store_vals, "Unknown"));
+ list_offset += list_length;
+ }
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_CTP_SERVICE_UUID:
+ switch (attribute) {
+ case 0x311:
+ proto_tree_add_item(next_tree, hf_ctp_external_network, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+
+ g_snprintf(str, MAX_SDP_LEN, "%s", val_to_str_const(value, ctp_external_network_vals, "Unknown"));
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_AVRCP_SERVICE_UUID:
+ case BTSDP_AVRCP_CT_SERVICE_UUID:
+ switch (attribute) {
+ case 0x311:
+ proto_tree_add_item(next_tree, hf_avrcp_ct_supported_features_reserved_7_15, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_avrcp_ct_supported_features_browsing, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_avrcp_ct_supported_features_reserved_4_5, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_avrcp_ct_supported_features_category_4, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_avrcp_ct_supported_features_category_3, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_avrcp_ct_supported_features_category_2, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_avrcp_ct_supported_features_category_1, tvb, offset, 2, ENC_BIG_ENDIAN);
+
+ supported_features = tvb_get_ntohs(tvb, offset);
+
+ g_snprintf(str, MAX_SDP_LEN, "%s%s%s%s%s",
+ (supported_features & 0x01) ? "Category1(Player/Recorder) " : "",
+ (supported_features & 0x02) ? "Category2(Monitor/Amplifier) " : "",
+ (supported_features & 0x04) ? "Category3(Tuner) " : "",
+ (supported_features & 0x08) ? "Category4(Menu) " : "",
+ (supported_features & 0x40) ? "Browsing " : "");
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_AVRCP_TG_SERVICE_UUID:
+ switch (attribute) {
+ case 0x311:
+ proto_tree_add_item(next_tree, hf_avrcp_tg_supported_features_reserved_8_15, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_avrcp_tg_supported_features_multiple_player, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_avrcp_tg_supported_features_browsing, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_avrcp_tg_supported_features_group_navigation, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_avrcp_tg_supported_features_settings, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_avrcp_tg_supported_features_category_4, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_avrcp_tg_supported_features_category_3, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_avrcp_tg_supported_features_category_2, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_avrcp_tg_supported_features_category_1, tvb, offset, 2, ENC_BIG_ENDIAN);
+
+ supported_features = tvb_get_ntohs(tvb, offset);
+
+ g_snprintf(str, MAX_SDP_LEN, "%s%s%s%s%s%s%s%s",
+ (supported_features & 0x01) ? "Category1(Player/Recorder) " : "",
+ (supported_features & 0x02) ? "Category2(Monitor/Amplifier) " : "",
+ (supported_features & 0x04) ? "Category3(Tuner) " : "",
+ (supported_features & 0x08) ? "Category4(Menu) " : "",
+ (supported_features & 0x10) ? "PlayerApplicationSettings " : "",
+ (supported_features & 0x20) ? "GroupNavigation " : "",
+ (supported_features & 0x40) ? "Browsing " : "",
+ (supported_features & 0x80) ? "MultiplePlayers " : "");
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_HSP_SERVICE_UUID:
+ case BTSDP_HSP_HS_SERVICE_UUID:
+ switch (attribute) {
+ case 0x302:
+ proto_tree_add_item(next_tree, hf_hsp_remote_audio_volume_control, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", value ? "true" : "false");
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_GNSS_UUID:
+ case BTSDP_GNSS_SERVER_UUID:
+ switch (attribute) {
+ case 0x200:
+ proto_tree_add_item(next_tree, hf_gnss_supported_features, tvb, offset, 2, ENC_BIG_ENDIAN);
+ supported_features = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "reserved (0x%04x)", supported_features);
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_PBAP_PSE_SERVICE_UUID:
+ switch (attribute) {
+ case 0x314:
+ proto_tree_add_item(next_tree, hf_pbap_pse_supported_repositories_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_pbap_pse_supported_repositories_sim_card, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_pbap_pse_supported_repositories_local_phonebook, tvb, offset, 1, ENC_BIG_ENDIAN);
+
+ supported_features = tvb_get_guint8(tvb, offset);
+
+ g_snprintf(str, MAX_SDP_LEN, "%s%s",
+ (supported_features & 0x01) ? "SIM " : "",
+ (supported_features & 0x02) ? "LocalPhonebook " : "");
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_FAX_SERVICE_UUID:
+ switch (attribute) {
+ case 0x302:
+ proto_tree_add_item(next_tree, hf_fax_support_class_1, tvb, offset, 1, ENC_BIG_ENDIAN);
+ supported_features = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", supported_features ? "true" : "false");
+ break;
+ case 0x303:
+ proto_tree_add_item(next_tree, hf_fax_support_class_2, tvb, offset, 1, ENC_BIG_ENDIAN);
+ supported_features = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", supported_features ? "true" : "false");
+ break;
+ case 0x304:
+ proto_tree_add_item(next_tree, hf_fax_support_class_2_vendor, tvb, offset, 1, ENC_BIG_ENDIAN);
+ supported_features = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", supported_features ? "true" : "false");
+ break;
+ case 0x305:
+ proto_tree_add_item(next_tree, hf_fax_support_audio_feedback, tvb, offset, 1, ENC_BIG_ENDIAN);
+ supported_features = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", supported_features ? "true" : "false");
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_FTP_SERVICE_UUID:
+ switch (attribute) {
+ case 0x200:
+ proto_tree_add_item(next_tree, hf_ftp_goep_l2cap_psm, tvb, offset, 2, ENC_BIG_ENDIAN);
+ psm = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%u (0x%02x)", psm, psm);
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_MAP_SERVICE_UUID:
+ case BTSDP_MAP_ACCESS_SRV_SERVICE_UUID:
+ switch (attribute) {
+ case 0x315:
+ proto_tree_add_item(next_tree, hf_map_mas_instance_id, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%u (0x%02x)", value, value);
+ break;
+ case 0x316:
+ proto_tree_add_item(next_tree, hf_map_mas_supported_message_types_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_map_mas_supported_message_types_mms, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_map_mas_supported_message_types_sms_cdma, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_map_mas_supported_message_types_sms_gsm, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_map_mas_supported_message_types_email, tvb, offset, 1, ENC_BIG_ENDIAN);
+
+ supported_features = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s%s%s%s",
+ (supported_features & 0x01) ? "Email " : "",
+ (supported_features & 0x02) ? "SMS_GSM " : "",
+ (supported_features & 0x04) ? "SMS_CDMA " : "",
+ (supported_features & 0x08) ? "MMS " : "");
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_HCRP_SERVICE_UUID:
+ case BTSDP_HCRP_PRINT_SERVICE_UUID:
+ case BTSDP_HCRP_SCAN_SERVICE_UUID:
+ switch (attribute) {
+ case 0x300:
+ proto_tree_add_item(next_tree, hf_hcrp_1284_id, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x302:
+ proto_tree_add_item(next_tree, hf_hcrp_device_name, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x304:
+ proto_tree_add_item(next_tree, hf_hcrp_friendly_name, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x306:
+ proto_tree_add_item(next_tree, hf_hcrp_device_location, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_WAP_SERVICE_UUID:
+ case BTSDP_WAP_CLIENT_SERVICE_UUID:
+ switch (attribute) {
+ case 0x306:
+ proto_tree_add_item(next_tree, hf_wap_network_address, tvb, offset, 4, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohl(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", ip_to_str((guint8 *)&value));
+ break;
+ case 0x307:
+ proto_tree_add_item(next_tree, hf_wap_gateway, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", val_to_str_const(value, wap_gateway_vals, "Unknown"));
+ break;
+ case 0x308:
+ proto_tree_add_item(next_tree, hf_wap_homepage_url, tvb, offset, size, ENC_BIG_ENDIAN);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x309:
+ proto_tree_add_item(next_tree, hf_wap_stack_type, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", val_to_str_const(value, wap_stack_type_vals, "Unknown"));
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_HDP_SERVICE_UUID:
+ case BTSDP_HDP_SOURCE_SERVICE_UUID:
+ case BTSDP_HDP_SINK_SERVICE_UUID:
+ switch (attribute) {
+ case 0x200:
+ i_feature = 1;
+ list_offset = offset;
+ while (list_offset - offset < size) {
+ entry_offset = get_type_length(tvb, list_offset, &entry_length);
+ feature_item = proto_tree_add_text(next_tree, tvb, entry_offset, entry_length, "Supported Feature #%u", i_feature);
+ feature_tree = proto_item_add_subtree(feature_item, ett_btsdp_supported_features);
+
+ dissect_data_element(feature_tree, &sub_tree, pinfo, tvb, list_offset);
+
+ entry_item = proto_tree_add_text(sub_tree, tvb, entry_offset, 0, "MDEP ID");
+ entry_tree = proto_item_add_subtree(entry_item, ett_btsdp_supported_features_mdep_id);
+ dissect_data_element(entry_tree, &next_tree, pinfo, tvb, entry_offset);
+ new_offset = get_type_length(tvb, entry_offset, &length);
+ proto_item_set_len(entry_item, (new_offset - entry_offset) + length);
+ entry_offset = new_offset;
+
+ proto_tree_add_item(next_tree, hf_hdp_supported_features_mdep_id, tvb, entry_offset, 1, ENC_BIG_ENDIAN);
+ mdep_id = tvb_get_guint8(tvb, entry_offset);
+ proto_item_append_text(entry_item, ": %u (0x%02x)", mdep_id, mdep_id);
+ entry_offset += length;
+
+ entry_item = proto_tree_add_text(sub_tree, tvb, entry_offset, 0, "MDEP Data Type");
+ entry_tree = proto_item_add_subtree(entry_item, ett_btsdp_supported_features_mdep_data_type);
+
+ dissect_data_element(entry_tree, &next_tree, pinfo, tvb, entry_offset);
+ new_offset = get_type_length(tvb, entry_offset, &length);
+ proto_item_set_len(entry_item, (new_offset - entry_offset) + length);
+ entry_offset = new_offset;
+ proto_tree_add_item(next_tree, hf_hdp_supported_features_mdep_data_type, tvb, entry_offset, 2, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohs(tvb, entry_offset);
+ proto_item_append_text(entry_item, ": %u (0x%04x)", value, value);
+ entry_offset += length;
+
+ entry_item = proto_tree_add_text(sub_tree, tvb, entry_offset, 0, "MDEP Role");
+ entry_tree = proto_item_add_subtree(entry_item, ett_btsdp_supported_features_mdep_role);
+
+ dissect_data_element(entry_tree, &next_tree, pinfo, tvb, entry_offset);
+ new_offset = get_type_length(tvb, entry_offset, &length);
+ proto_item_set_len(entry_item, (new_offset - entry_offset) + length);
+ entry_offset = new_offset;
+ proto_tree_add_item(next_tree, hf_hdp_supported_features_mdep_role, tvb, entry_offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, entry_offset);
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "MDEP ID: %u (Role: %s) ", mdep_id, val_to_str_const(value, hdp_mdep_role_vals ,"Unknown"));
+ proto_item_append_text(entry_item, ": %s", val_to_str_const(value, hdp_mdep_role_vals ,"Unknown"));
+ entry_offset += length;
+
+ if (entry_length - (entry_offset - list_offset) > 0) {
+ entry_item = proto_tree_add_text(sub_tree, tvb, entry_offset, entry_length, "MDEP Description");
+ entry_tree = proto_item_add_subtree(entry_item, ett_btsdp_supported_features_mdep_description);
+
+ dissect_data_element(entry_tree, &next_tree, pinfo, tvb, entry_offset);
+ new_offset = get_type_length(tvb, entry_offset, &length);
+ proto_item_set_len(entry_item, (new_offset - entry_offset) + length);
+ entry_offset = new_offset;
+ proto_tree_add_item(next_tree, hf_hdp_supported_features_mdep_description, tvb, entry_offset, length, ENC_ASCII | ENC_NA);
+ proto_item_append_text(entry_item, ": %s", tvb_get_ephemeral_string(tvb, entry_offset, length));
+ entry_offset += length;
+ }
+
+ list_offset = entry_offset;
+ i_feature += 1;
+ }
+ break;
+ case 0x301:
+ proto_tree_add_item(next_tree, hf_hdp_data_exchange, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", val_to_str_const(value, hdp_data_exchange_specification_vals, "Unknown"));
+ break;
+ case 0x302:
+ proto_tree_add_item(next_tree, hf_hdp_support_procedure_reserved_5_7, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hdp_support_procedure_sync_master_role, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hdp_support_procedure_clock_synchronization_protocol, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hdp_support_procedure_reconnect_acceptance, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hdp_support_procedure_reconnect_initiation, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hdp_support_procedure_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
+
+ supported_features = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s%s%s%s",
+ (supported_features & 0x02) ? "ReconnectInitiation " : "",
+ (supported_features & 0x04) ? "ReconnectAcceptance " : "",
+ (supported_features & 0x08) ? "ClockSynchronizationProtocol " : "",
+ (supported_features & 0x10) ? "SyncMasterRole " : "");
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_PAN_GN_SERVICE_UUID:
+ switch (attribute) {
+ case 0x30A:
+ proto_tree_add_item(next_tree, hf_pan_sercurity_description, tvb, offset, 2, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", val_to_str_const(value, pan_security_description_vals, "Unknown"));
+ break;
+ case 0x30D:
+ case 0x200:
+ proto_tree_add_item(next_tree, hf_pan_ipv4_subnet, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x30E:
+ proto_tree_add_item(next_tree, hf_pan_ipv6_subnet, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_PAN_NAP_SERVICE_UUID:
+ switch (attribute) {
+ case 0x30A:
+ proto_tree_add_item(next_tree, hf_pan_sercurity_description, tvb, offset, 2, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", val_to_str_const(value, pan_security_description_vals, "Unknown"));
+ break;
+ case 0x30B:
+ proto_tree_add_item(next_tree, hf_pan_net_access_type, tvb, offset, 2, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", val_to_str_const(value, pan_net_access_type_vals, "Unknown"));
+ break;
+ case 0x30C:
+ proto_tree_add_item(next_tree, hf_pan_max_net_access_rate, tvb, offset, 4, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohl(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%u (0x%08x)", value, value);
+ break;
+ case 0x30D:
+ case 0x200:
+ proto_tree_add_item(next_tree, hf_pan_ipv4_subnet, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x30E:
+ proto_tree_add_item(next_tree, hf_pan_ipv6_subnet, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_PAN_PANU_SERVICE_UUID:
+ switch (attribute) {
+ case 0x30A:
+ proto_tree_add_item(next_tree, hf_pan_sercurity_description, tvb, offset, 2, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", val_to_str_const(value, pan_security_description_vals, "Unknown"));
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_OPP_SERVICE_UUID:
+ switch (attribute) {
+ case 0x200:
+ proto_tree_add_item(next_tree, hf_opp_goep_l2cap_psm, tvb, offset, 2, ENC_BIG_ENDIAN);
+ psm = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%u (0x%02x)", psm, psm);
+ break;
+ case 0x303:
+ list_offset = offset;
+ while (list_offset - offset < size) {
+ dissect_data_element(next_tree, &entry_tree, pinfo, tvb, list_offset);
+ list_offset = get_type_length(tvb, list_offset, &list_length);
+ proto_tree_add_item(entry_tree, hf_opp_supported_format, tvb, list_offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, list_offset);
+
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "%s ", val_to_str_const(value, opp_supported_format_vals, "Unknown"));
+ list_offset += list_length;
+ }
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_DUN_SERVICE_UUID:
+ switch (attribute) {
+ case 0x305:
+ proto_tree_add_item(next_tree, hf_dun_support_audio_feedback, tvb, offset, 1, ENC_BIG_ENDIAN);
+ supported_features = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", supported_features ? "true" : "false");
+ break;
+ case 0x306:
+ proto_tree_add_item(next_tree, hf_dun_escape_sequence, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_HFP_SERVICE_UUID:
+ switch (attribute) {
+ case 0x311:
+ proto_tree_add_item(next_tree, hf_hfp_hf_supported_features_reserved, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hfp_hf_supported_features_wide_band_speech, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hfp_hf_supported_features_remote_volume_control, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hfp_hf_supported_features_voice_recognition_activation, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hfp_hf_supported_features_cli_presentation_capability, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hfp_hf_supported_features_call_waiting_or_three_way_calling, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hfp_hf_supported_features_ec_and_or_nr_function, tvb, offset, 2, ENC_BIG_ENDIAN);
+
+ supported_features = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s%s%s%s%s%s",
+ (supported_features & 0x01) ? "(EC and/or Nr Function) " : "",
+ (supported_features & 0x02) ? "(Call Waiting or Three Way Calling) " : "",
+ (supported_features & 0x04) ? "(CLI Presentation Capability) " : "",
+ (supported_features & 0x08) ? "(Voice Recognition Activation) " : "",
+ (supported_features & 0x10) ? "(Remote Volume Control) " : "",
+ (supported_features & 0x20) ? "(Wide Band Speech) " : "");
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_HFP_GW_SERVICE_UUID:
+ switch (attribute) {
+ case 0x301:
+ proto_tree_add_item(next_tree, hf_hfp_gw_network, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", val_to_str_const(value, hfp_gw_network_vals, "Unknown"));
+ break;
+ case 0x311:
+ proto_tree_add_item(next_tree, hf_hfp_gw_supported_features_reserved, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hfp_gw_supported_features_wide_band_speech, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hfp_gw_supported_features_attach_phone_number_to_voice_tag, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hfp_gw_supported_features_inband_ring_tone_capability, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hfp_gw_supported_features_voice_recognition_function, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hfp_gw_supported_features_ec_and_or_nr_function, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hfp_gw_supported_features_three_way_calling, tvb, offset, 2, ENC_BIG_ENDIAN);
+
+ supported_features = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s%s%s%s%s%s",
+ (supported_features & 0x01) ? "(Three Way Calling) " : "",
+ (supported_features & 0x02) ? "(EC and/or Nr Function) " : "",
+ (supported_features & 0x04) ? "(Voice Recognition Function) " : "",
+ (supported_features & 0x08) ? "(Inband Ring Tone Capability) " : "",
+ (supported_features & 0x10) ? "(Attach a Phone Number to a Voice Tag) " : "",
+ (supported_features & 0x20) ? "(Wide Band Speech) " : "");
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_HID_SERVICE_UUID:
+ switch (attribute) {
+ case 0x200:
+ proto_tree_add_item(next_tree, hf_hid_device_release_number, tvb, offset, 2, ENC_BIG_ENDIAN);
+ version = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%x.%x.%x (0x%04x)", version >> 8, (version >> 4) & 0xF, version & 0xF, version);
+ break;
+ case 0x201:
+ proto_tree_add_item(next_tree, hf_hid_parser_version, tvb, offset, 2, ENC_BIG_ENDIAN);
+ version = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%x.%x.%x (0x%04x)", version >> 8, (version >> 4) & 0xF, version & 0xF, version);
+ break;
+ case 0x202:
+ proto_tree_add_item(next_tree, hf_hid_device_subclass_type, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hid_device_subclass_subtype, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_hid_device_subclass_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s, %s",
+ val_to_str_const(value >> 6, hid_device_subclass_type_vals, "Unknown"),
+ val_to_str_const(((value & 0x3C) >> 2) , hid_device_subclass_subtype_vals, "Unknown"));
+ break;
+ case 0x203:
+ proto_tree_add_item(next_tree, hf_hid_country_code, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", val_to_str_const(value, hid_country_code_vals, "Unknown"));
+ break;
+ case 0x204:
+ proto_tree_add_item(next_tree, hf_hid_virtual_cable, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", value ? "true" : "false");
+ break;
+ case 0x205:
+ proto_tree_add_item(next_tree, hf_hid_reconnect_initiate, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", value ? "true" : "false");
+ break;
+ case 0x206:
+ list_offset = offset;
+ i_feature = 1;
+ while (list_offset - offset < size) {
+ entry_item = proto_tree_add_text(next_tree, tvb, list_offset, size, "Descriptor #%u", i_feature);
+ entry_tree = proto_item_add_subtree(entry_item, ett_btsdp_data_element);
+
+ dissect_data_element(entry_tree, &sub_tree, pinfo, tvb, list_offset);
+ list_offset = get_type_length(tvb, list_offset, &entry_length);
+
+ dissect_data_element(sub_tree, &last_tree, pinfo, tvb, list_offset);
+ list_offset = get_type_length(tvb, list_offset, &entry_length);
+ proto_tree_add_item(last_tree, hf_hid_descriptor_list_type, tvb, list_offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, list_offset);
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "%s", val_to_str_const(value, descriptor_list_type_vals, "Unknown"));
+ proto_item_append_text(entry_item, ": %s", val_to_str_const(value, descriptor_list_type_vals, "Unknown"));
+ list_offset += entry_length;
+
+ dissect_data_element(sub_tree, &last_tree, pinfo, tvb, list_offset);
+ list_offset = get_type_length(tvb, list_offset, &entry_length);
+ proto_tree_add_item(last_tree, hf_hid_descriptor_list_descriptor, tvb, list_offset, entry_length, ENC_NA);
+ list_offset += entry_length;
+
+ i_feature += 1;
+
+ if (list_offset - offset < size)
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, ", ");
+ }
+ break;
+ case 0x207:
+ list_offset = offset;
+ i_feature = 1;
+ while (list_offset - offset < size) {
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "[");
+ entry_item = proto_tree_add_text(next_tree, tvb, list_offset, size, "Language #%u", i_feature);
+ entry_tree = proto_item_add_subtree(entry_item, ett_btsdp_data_element);
+
+ dissect_data_element(entry_tree, &sub_tree, pinfo, tvb, list_offset);
+ list_offset = get_type_length(tvb, list_offset, &entry_length);
+
+ dissect_data_element(sub_tree, &last_tree, pinfo, tvb, list_offset);
+ list_offset = get_type_length(tvb, list_offset, &entry_length);
+ value = tvb_get_ntohs(tvb, list_offset);
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "Lang ID: %s", val_to_str_ext_const(value, &usb_langid_vals_ext, "Unknown"));
+ proto_item_append_text(entry_item, ": Lang ID: %s", val_to_str_ext_const(value, &usb_langid_vals_ext, "Unknown"));
+ proto_tree_add_item(last_tree, hf_sdp_lang_id, tvb, list_offset, entry_length, ENC_ASCII | ENC_NA);
+ list_offset += entry_length;
+
+ dissect_data_element(sub_tree, &last_tree, pinfo, tvb, list_offset);
+ list_offset = get_type_length(tvb, list_offset, &entry_length);
+ value = tvb_get_ntohs(tvb, list_offset);
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, ", Attribute Base: 0x%04x", value);
+ proto_item_append_text(entry_item, ", Attribute Base: 0x%04x", value);
+ proto_tree_add_item(last_tree, hf_sdp_lang_attribute_base, tvb, list_offset, 2, ENC_BIG_ENDIAN);
+ list_offset += entry_length;
+ i_feature += 1;
+
+ if (list_offset - offset < size)
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "], ");
+ else
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "]");
+ }
+ break;
+ case 0x208:
+ proto_tree_add_item(next_tree, hf_hid_sdp_disable, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", value ? "true" : "false");
+ break;
+ case 0x209:
+ proto_tree_add_item(next_tree, hf_hid_battery_power, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", value ? "true" : "false");
+ break;
+ case 0x20A:
+ proto_tree_add_item(next_tree, hf_hid_remote_wake, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", value ? "true" : "false");
+ break;
+ case 0x20B:
+ proto_tree_add_item(next_tree, hf_hid_profile_version, tvb, offset, 2, ENC_BIG_ENDIAN);
+ version = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%x.%x.%x (0x%04x)", version >> 8, (version >> 4) & 0xF, version & 0xF, version);
+ break;
+ case 0x20C:
+ proto_tree_add_item(next_tree, hf_hid_supervision_timeout, tvb, offset, 2, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%u", value);
+ break;
+ case 0x20D:
+ proto_tree_add_item(next_tree, hf_hid_normally_connectable, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", value ? "true" : "false");
+ break;
+ case 0x20E:
+ proto_tree_add_item(next_tree, hf_hid_boot_device, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", value ? "true" : "false");
+ break;
+ case 0x20F:
+ proto_tree_add_item(next_tree, hf_hid_ssr_host_max_latency, tvb, offset, 2, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%u", value);
+ break;
+ case 0x210:
+ proto_tree_add_item(next_tree, hf_hid_ssr_host_min_timeout, tvb, offset, 2, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%u", value);
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_BIP_SERVICE_UUID:
+ case BTSDP_BIP_RESPONDER_SERVICE_UUID:
+ switch (attribute) {
+ case 0x200:
+ proto_tree_add_item(next_tree, hf_bip_goep_l2cap_psm, tvb, offset, 2, ENC_BIG_ENDIAN);
+ psm = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%u (0x%02x)", psm, psm);
+ break;
+ case 0x310:
+ proto_tree_add_item(next_tree, hf_bip_supported_capabilities_reserved_4_7, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_capabilities_displaying, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_capabilities_printing, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_capabilities_capturing, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_capabilities_genering_imaging, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+
+ g_snprintf(str, MAX_SDP_LEN, "%s%s%s%s",
+ (value & 0x01) ? "GeneringImaging " : "",
+ (value & 0x02) ? "Capturing " : "",
+ (value & 0x04) ? "Printing " : "",
+ (value & 0x08) ? "Displaying " : "");
+ break;
+ case 0x311:
+ proto_tree_add_item(next_tree, hf_bip_supported_features_reserved_9_15, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_features_remote_display, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_features_remote_camera, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_features_automatic_archive, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_features_advanced_image_printing, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_features_image_pull, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_features_image_push_display, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_features_image_push_print, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_features_image_push_store, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_features_image_push, tvb, offset, 2, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohs(tvb, offset);
+
+ g_snprintf(str, MAX_SDP_LEN, "%s%s%s%s%s%s%s%s%s",
+ (value & 0x001) ? "ImagePush " : "",
+ (value & 0x002) ? "ImagePushStore " : "",
+ (value & 0x004) ? "ImagePushPrint " : "",
+ (value & 0x008) ? "ImagePushDisplay " : "",
+ (value & 0x010) ? "ImagePull " : "",
+ (value & 0x020) ? "AdvancedImagePrinting " : "",
+ (value & 0x040) ? "AutomatingArchive " : "",
+ (value & 0x080) ? "RemoteCamera " : "",
+ (value & 0x100) ? "RemoteDisplay " : "");
+ break;
+ case 0x312:
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_reserved_17_31, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_get_status, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_reserved_15, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_get_monitoring_image, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_start_archive, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_reserved_12, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_start_print, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_delete_image, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_get_linked_attachment, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_get_linked_thumbnail, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_get_image, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_get_image_property, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_get_images_list, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_remote_display, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_put_linked_thumbnail, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_put_linked_attachment, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_put_image, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_get_capabilities, tvb, offset, 4, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohl(tvb, offset);
+
+ g_snprintf(str, MAX_SDP_LEN, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+ (value & 0x001) ? "GetCapabilities " : "",
+ (value & 0x002) ? "PutImage " : "",
+ (value & 0x004) ? "PutLinkedAttachment " : "",
+ (value & 0x008) ? "PutLinkedThumbnail " : "",
+ (value & 0x010) ? "RemoteDisplay " : "",
+ (value & 0x020) ? "GetImageList " : "",
+ (value & 0x040) ? "GetImageProperty " : "",
+ (value & 0x080) ? "GetImage " : "",
+ (value & 0x100) ? "GetLinkedThumbnail " : "",
+ (value & 0x200) ? "GetLinkedAttachment " : "",
+ (value & 0x400) ? "DeleteImage " : "",
+ (value & 0x800) ? "StartPrint " : "",
+ (value & 0x2000) ? "StartArchive " : "",
+ (value & 0x4000) ? "GetMonitoringImage " : "",
+ (value & 0x10000) ? "GetStatus " : "");
+ break;
+ case 0x313:
+ proto_tree_add_item(next_tree, hf_bip_total_imaging_data_capacity, tvb, offset, 8, ENC_BIG_ENDIAN);
+ value_64 = tvb_get_ntoh64(tvb, offset);
+
+ g_snprintf(str, MAX_SDP_LEN, "%"G_GUINT64_FORMAT, value_64);
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_BIP_REF_OBJ_SERVICE_UUID:
+ switch (attribute) {
+ case 0x200:
+ proto_tree_add_item(next_tree, hf_bip_goep_l2cap_psm, tvb, offset, 2, ENC_BIG_ENDIAN);
+ psm = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%u (0x%02x)", psm, psm);
+ break;
+ case 0x312:
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_reserved_13_31, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_get_partial_image, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_reserved_1_11, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_get_capabilities, tvb, offset, 4, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohl(tvb, offset);
+
+ g_snprintf(str, MAX_SDP_LEN, "%s%s",
+ (value & 0x0001) ? "GetCapabilities " : "",
+ (value & 0x1000) ? "GetPartialImage " : "");
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_BIP_AUTO_ARCH_SERVICE_UUID:
+ switch (attribute) {
+ case 0x200:
+ proto_tree_add_item(next_tree, hf_bip_goep_l2cap_psm, tvb, offset, 2, ENC_BIG_ENDIAN);
+ psm = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%u (0x%02x)", psm, psm);
+ break;
+ case 0x312:
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_reserved_11_31, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_delete_image, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_get_linked_attachment, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_get_linked_thumbnail, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_get_image, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_get_image_property, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_get_images_list, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_reserved_1_4, tvb, offset, 4, ENC_BIG_ENDIAN);
+ proto_tree_add_item(next_tree, hf_bip_supported_functions_get_capabilities, tvb, offset, 4, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohl(tvb, offset);
+
+ g_snprintf(str, MAX_SDP_LEN, "%s%s%s%s%s%s%s",
+ (value & 0x001) ? "GetCapabilities " : "",
+ (value & 0x020) ? "GetImageList " : "",
+ (value & 0x040) ? "GetImageProperty " : "",
+ (value & 0x080) ? "GetImage " : "",
+ (value & 0x100) ? "GetLinkedThumbnail " : "",
+ (value & 0x200) ? "GetLinkedAttachment " : "",
+ (value & 0x400) ? "DeleteImage " : "");
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_BPP_SERVICE_UUID:
+ case BTSDP_BPP_STATUS_SERVICE_UUID:
+ case BTSDP_BPP_DIRECT_PRINTING_SERVICE_UUID:
+ case BTSDP_BPP_REFERENCE_PRINTING_SERVICE_UUID:
+ switch (attribute) {
+ case 0x350:
+ proto_tree_add_item(next_tree, hf_bpp_document_formats_supported, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x352:
+ proto_tree_add_item(next_tree, hf_bpp_character_repertoires_support, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_bytes_to_str(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x354:
+ proto_tree_add_item(next_tree, hf_bpp_xhtml_print_image_formats_supported, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x356:
+ proto_tree_add_item(next_tree, hf_bpp_color_supported, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", value ? "true" : "false");
+ break;
+ case 0x358:
+ proto_tree_add_item(next_tree, hf_bpp_1284_id, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x35A:
+ proto_tree_add_item(next_tree, hf_bpp_printer_name, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x35C:
+ proto_tree_add_item(next_tree, hf_bpp_printer_location, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x35E:
+ proto_tree_add_item(next_tree, hf_bpp_duplex_supported, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", value ? "true" : "false");
+ break;
+ case 0x360:
+ proto_tree_add_item(next_tree, hf_bpp_media_types_supported, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x362:
+ proto_tree_add_item(next_tree, hf_bpp_max_media_width, tvb, offset, 2, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%u", value);
+ break;
+ case 0x364:
+ proto_tree_add_item(next_tree, hf_bpp_max_media_length, tvb, offset, 2, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohs(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%u", value);
+ break;
+ case 0x366:
+ proto_tree_add_item(next_tree, hf_bpp_enhanced_layout_supported, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", value ? "true" : "false");
+ break;
+ case 0x368:
+ proto_tree_add_item(next_tree, hf_bpp_rui_formats_supported, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x370:
+ proto_tree_add_item(next_tree, hf_bpp_reference_printing_rui_supported, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", value ? "true" : "false");
+ break;
+ case 0x372:
+ proto_tree_add_item(next_tree, hf_bpp_direct_printing_rui_supported, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%s", value ? "true" : "false");
+ break;
+ case 0x374:
+ proto_tree_add_item(next_tree, hf_bpp_reference_printing_top_url, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x376:
+ proto_tree_add_item(next_tree, hf_bpp_direct_printing_top_url, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x37A:
+ proto_tree_add_item(next_tree, hf_bpp_device_name, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ case BTSDP_BPP_REFLECTED_UI_SERVICE_UUID:
+ switch (attribute) {
+ case 0x368:
+ proto_tree_add_item(next_tree, hf_bpp_rui_formats_supported, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x378:
+ proto_tree_add_item(next_tree, hf_bpp_printer_admin_rui_top_url, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ default:
+ found = FALSE;
+ }
+ break;
+ default:
+ found = FALSE;
+ }
+
+ if (!found) {
+ found = TRUE;
+ switch (attribute) {
+ case 0x000:
+ proto_tree_add_item(next_tree, hf_sdp_service_record_handle, tvb, offset, 4, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohl(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "0x%08x (%u)", value, value);
+ break;
+ case 0x001:
+ list_offset = offset;
+ while (list_offset - offset < size) {
+ dissect_data_element(next_tree, &entry_tree, pinfo, tvb, list_offset);
+ list_offset = get_type_length(tvb, list_offset, &list_length);
+
+ if (list_length == 2) {
+ proto_tree_add_item(entry_tree, hf_sdp_service_uuid, tvb, list_offset, list_length, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohs(tvb, list_offset);
+ } else {
+ proto_tree_add_item(entry_tree, hf_sdp_service_long_uuid, tvb, list_offset, list_length, ENC_BIG_ENDIAN);
+ value = 0;
+ }
+
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "%s", val_to_str_const(value, vs_service_classes, "Unknown"));
+ list_offset += list_length;
+
+ if (list_offset - offset < size)
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, " -> ");
+ }
+ break;
+ case 0x002:
+ proto_tree_add_item(next_tree, hf_sdp_service_record_state, tvb, offset, 4, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohl(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "0x%08x (%u)", value, value);
+ break;
+ case 0x003:
+ if (size == 2) {
+ proto_tree_add_item(next_tree, hf_sdp_service_uuid, tvb, offset, size, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohs(tvb, offset);
+ } else {
+ proto_tree_add_item(next_tree, hf_sdp_service_long_uuid, tvb, offset, size, ENC_BIG_ENDIAN);
+ value = 0;
+ }
+ g_snprintf(str, MAX_SDP_LEN, "%s", val_to_str_const(value, vs_service_classes, "Unknown"));
+ break;
+ case 0x004:
+ protocol_order = 0;
+ strpos = dissect_protocol_descriptor_list(next_tree, tvb, pinfo,
+ offset, size, str, strpos, &protocol_order);
+ break;
+ case 0x005:
+ list_offset = offset;
+ while (list_offset - offset < size) {
+ dissect_data_element(next_tree, &entry_tree, pinfo, tvb, list_offset);
+ list_offset = get_type_length(tvb, list_offset, &list_length);
+
+ if (list_length == 2) {
+ proto_tree_add_item(entry_tree, hf_sdp_service_uuid, tvb, list_offset, list_length, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohs(tvb, list_offset);
+ } else {
+ proto_tree_add_item(entry_tree, hf_sdp_service_long_uuid, tvb, list_offset, list_length, ENC_BIG_ENDIAN);
+ value = 0;
+ }
+
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "%s", val_to_str_const(value, vs_service_classes, "Unknown"));
+ list_offset += list_length;
+
+ if (list_offset - offset < size)
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, ", ");
+ }
+ break;
+ case 0x006:
+ list_offset = offset;
+ i_feature = 1;
+ while (list_offset - offset < size) {
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "(");
+ entry_item = proto_tree_add_text(next_tree, tvb, list_offset, size, "Language #%u", i_feature);
+ entry_tree = proto_item_add_subtree(entry_item, ett_btsdp_data_element);
+
+ dissect_data_element(entry_tree, &sub_tree, pinfo, tvb, list_offset);
+ list_offset = get_type_length(tvb, list_offset, &entry_length);
+ new_str = tvb_get_ephemeral_string(tvb, list_offset, entry_length);
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "Lang: %s", new_str);
+ proto_item_append_text(entry_item, ": Lang: %s", new_str);
+ proto_tree_add_item(sub_tree, hf_sdp_lang_code, tvb, list_offset, entry_length, ENC_ASCII | ENC_NA);
+ list_offset += entry_length;
+
+ dissect_data_element(entry_tree, &sub_tree, pinfo, tvb, list_offset);
+ list_offset = get_type_length(tvb, list_offset, &entry_length);
+ value = tvb_get_ntohs(tvb, list_offset);
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, ", Encoding: %s", val_to_str_ext_const(value, &wap_mib_enum_vals_character_sets_ext, "Unknown"));
+ proto_item_append_text(entry_item, ", Encoding: %s", val_to_str_ext_const(value, &wap_mib_enum_vals_character_sets_ext, "Unknown"));
+ proto_tree_add_item(sub_tree, hf_sdp_lang_encoding, tvb, list_offset, 2, ENC_BIG_ENDIAN);
+ list_offset += entry_length;
+
+ dissect_data_element(entry_tree, &sub_tree, pinfo, tvb, list_offset);
+ list_offset = get_type_length(tvb, list_offset, &entry_length);
+ value = tvb_get_ntohs(tvb, list_offset);
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, ", Attribute Base: 0x%04x", value);
+ proto_item_append_text(entry_item, ", Attribute Base: 0x%04x", value);
+ proto_tree_add_item(sub_tree, hf_sdp_lang_attribute_base, tvb, list_offset, 2, ENC_BIG_ENDIAN);
+ list_offset += entry_length;
+ i_feature += 1;
+
+ if (list_offset - offset < size)
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "), ");
+ else
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, ")");
+ }
+ break;
+ case 0x007:
+ proto_tree_add_item(next_tree, hf_sdp_service_info_time_to_live, tvb, offset, 4, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohl(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "%u (0x%08x)", value, value);
+ break;
+ case 0x008:
+ proto_tree_add_item(next_tree, hf_sdp_service_availability, tvb, offset, 1, ENC_BIG_ENDIAN);
+ value = tvb_get_guint8(tvb, offset);
+ g_snprintf(str, MAX_SDP_LEN, "0x%02x (%u)", value, value);
+ break;
+ case 0x009:
+ list_offset = offset;
+ i_protocol = 1;
+ while (list_offset - offset < size) {
+ entry_offset = get_type_length(tvb, list_offset, &entry_length);
+ dissect_data_element(next_tree, &sub_tree, pinfo, tvb, list_offset);
+ entry_item = proto_tree_add_text(sub_tree, tvb, entry_offset, entry_length, "Profile Descriptor List #%u", i_protocol);
+ entry_tree = proto_item_add_subtree(entry_item, ett_btsdp_data_element);
+
+ dissect_data_element(entry_tree, &sub_tree, pinfo, tvb, entry_offset);
+ entry_offset = get_type_length(tvb, entry_offset, &entry_length);
+
+ if (entry_length == 2) {
+ proto_tree_add_item(sub_tree, hf_sdp_service_uuid, tvb, entry_offset, entry_length, ENC_BIG_ENDIAN);
+ value = tvb_get_ntohs(tvb, entry_offset);
+ } else {
+ proto_tree_add_item(sub_tree, hf_sdp_service_long_uuid, tvb, entry_offset, entry_length, ENC_BIG_ENDIAN);
+ value = 0;
+ }
+
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "%s", val_to_str_const(value, vs_service_classes, "Unknown"));
+ proto_item_append_text(entry_item, ": %s", val_to_str_const(value, vs_service_classes, "Unknown"));
+
+ entry_offset += entry_length;
+
+ dissect_data_element(entry_tree, &sub_tree, pinfo, tvb, entry_offset);
+ entry_offset = get_type_length(tvb, entry_offset, &entry_length);
+ value = tvb_get_ntohs(tvb, entry_offset);
+
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, " %x.%x", value >> 8, value & 0xFF);
+ proto_item_append_text(entry_item, ", Version %x.%x", value >> 8, value & 0xFF);
+ proto_tree_add_item(sub_tree, hf_sdp_protocol_version, tvb, entry_offset, 2, ENC_BIG_ENDIAN);
+
+ entry_offset += entry_length;
+
+ list_offset = entry_offset;
+
+ if (list_offset - offset < size)
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, ", ");
+ i_protocol += 1;
+ }
+ break;
+ case 0x00A:
+ proto_tree_add_item(next_tree, hf_sdp_service_documentation_url, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x00B:
+ proto_tree_add_item(next_tree, hf_sdp_service_client_executable_url, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x00C:
+ proto_tree_add_item(next_tree, hf_sdp_service_icon_url, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x00D:
+ protocol_order = 1;
+ list_offset = offset;
+ i_protocol = 1;
+ while (list_offset - offset < size) {
+ entry_offset = get_type_length(tvb, list_offset, &entry_length);
+ dissect_data_element(next_tree, &sub_tree, pinfo, tvb, list_offset);
+ entry_item = proto_tree_add_text(sub_tree, tvb, entry_offset, entry_length, "Protocol Descriptor List #%u", i_protocol);
+ entry_tree = proto_item_add_subtree(entry_item, ett_btsdp_data_element);
+
+ list_offset = get_type_length(tvb, list_offset, &list_length);
+
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "[");
+ strpos = dissect_protocol_descriptor_list(entry_tree, tvb,
+ pinfo, list_offset, list_length, str, strpos,
+ &protocol_order);
+
+ list_offset += list_length;
+
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "] ");
+ i_protocol += 1;
+ }
+ break;
+ case 0x100:
+ proto_tree_add_item(next_tree, hf_sdp_service_name, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x101:
+ proto_tree_add_item(next_tree, hf_sdp_service_description, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ case 0x102:
+ proto_tree_add_item(next_tree, hf_sdp_service_provider_name, tvb, offset, size, ENC_ASCII | ENC_NA);
+ new_str = tvb_get_ephemeral_string(tvb, offset, size);
+ g_snprintf(str, MAX_SDP_LEN, "%s", new_str);
+ break;
+ default:
+ found = FALSE;
+ }
+ }
+
+ if (!found) switch (type) {
case 0:
proto_tree_add_text(next_tree, tvb, offset, size, "Nil ");
- if (strpos<MAX_SDP_LEN) {
- g_snprintf(str+strpos, MAX_SDP_LEN-strpos, "Nil ");
+ if (strpos < MAX_SDP_LEN) {
+ g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "Nil ");
}
break;
case 1: {
@@ -1365,7 +2977,7 @@ dissect_sdp_type(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb,
proto_tree_add_text(next_tree, tvb, offset, size,
"unsigned int %d ", val);
if (strpos<MAX_SDP_LEN) {
- g_snprintf(str+strpos, MAX_SDP_LEN-strpos, "%u ", val);
+ g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "%u ", val);
}
break;
}
@@ -1374,7 +2986,7 @@ dissect_sdp_type(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb,
proto_tree_add_text(next_tree, tvb, offset, size,
"signed int %d ", val);
if (strpos < MAX_SDP_LEN) {
- g_snprintf(str+strpos, MAX_SDP_LEN-strpos, "%d ", val);
+ g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "%d ", val);
}
break;
}
@@ -1393,7 +3005,7 @@ dissect_sdp_type(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb,
proto_tree_add_text(next_tree, tvb, offset, size, "%s (0x%s) ", uuid_name, ptr);
if (strpos < MAX_SDP_LEN) {
- g_snprintf(str+strpos, MAX_SDP_LEN-strpos, ": %s", uuid_name);
+ g_snprintf(str + strpos, MAX_SDP_LEN - strpos, ": %s", uuid_name);
}
break;
}
@@ -1404,7 +3016,7 @@ dissect_sdp_type(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb,
proto_tree_add_text(next_tree, tvb, offset, size, "%s \"%s\"",
type == 8 ? "URL" : "String", ptr);
if (strpos < MAX_SDP_LEN) {
- g_snprintf(str+strpos, MAX_SDP_LEN-strpos, "%s ", ptr);
+ g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "%s ", ptr);
}
break;
}
@@ -1414,7 +3026,7 @@ dissect_sdp_type(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb,
proto_tree_add_text(next_tree, tvb, offset, size, "%s",
var ? "true" : "false");
if (strpos < MAX_SDP_LEN) {
- g_snprintf(str+strpos, MAX_SDP_LEN-strpos, "%s ", var?"true":"false");
+ g_snprintf(str+strpos, MAX_SDP_LEN-strpos, "%s ", var ? "true" : "false");
}
break;
}
@@ -1432,13 +3044,13 @@ dissect_sdp_type(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb,
st = proto_item_add_subtree(ti, ett_btsdp_des);
if (strpos < MAX_SDP_LEN) {
- strpos += g_snprintf(str+strpos, MAX_SDP_LEN-strpos, "{ ");
+ strpos += g_snprintf(str+strpos, MAX_SDP_LEN - strpos, "{ ");
}
while (bytes_to_go > 0) {
if (!first) {
- if (strpos<MAX_SDP_LEN) {
- strpos += g_snprintf(str+strpos, MAX_SDP_LEN-strpos, ", ");
+ if (strpos < MAX_SDP_LEN) {
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, ", ");
}
} else {
first = 0;
@@ -1449,14 +3061,14 @@ dissect_sdp_type(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb,
break;
}
if (strpos < MAX_SDP_LEN) {
- strpos += g_snprintf(str+strpos, MAX_SDP_LEN-strpos, "%s ", substr);
+ strpos += g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "%s ", substr);
}
offset += size ;
bytes_to_go -= size;
}
if (strpos < MAX_SDP_LEN) {
- /* strpos += */ g_snprintf(str+strpos, MAX_SDP_LEN-strpos, "} ");
+ g_snprintf(str + strpos, MAX_SDP_LEN - strpos, "} ");
}
break;
}
@@ -1470,9 +3082,41 @@ dissect_sdp_type(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb,
}
static gint
+findDidVendorIdSource(tvbuff_t *tvb, gint service_offset,
+ gint number_of_attributes)
+{
+ gint result = 0;
+ gint search_length;
+ gint search_offset;
+ gint i_number_of_attributes;
+ guint16 attribute;
+
+ search_offset = service_offset;
+ i_number_of_attributes = 0;
+
+ while (i_number_of_attributes < number_of_attributes) {
+ search_offset = get_type_length(tvb, search_offset, &search_length);
+ attribute = tvb_get_ntohs(tvb, search_offset);
+
+ search_offset += search_length;
+ search_offset = get_type_length(tvb, search_offset, &search_length);
+
+ if (attribute == 0x205) {
+ result = get_uint_by_size(tvb, search_offset, 1);
+ }
+
+ search_offset += search_length;
+ i_number_of_attributes += 1;
+ }
+
+ return result;
+}
+
+
+static gint
dissect_sdp_service_attribute(proto_tree *tree, tvbuff_t *tvb, gint offset,
- packet_info *pinfo, guint16 service_uuid,
- service_info_t *service_info)
+ packet_info *pinfo, guint16 service_uuid, gint service_offset,
+ service_info_t *service_info, gint number_of_attributes)
{
proto_tree *attribute_tree;
proto_item *attribute_item;
@@ -1494,6 +3138,164 @@ dissect_sdp_service_attribute(proto_tree *tree, tvbuff_t *tvb, gint offset,
id = tvb_get_ntohs(tvb, offset + 1);
+ switch (service_uuid) {
+ case BTSDP_DID_SERVICE_UUID:
+ name_vals = vs_did_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_did;
+ profile_speficic = "(DID) ";
+
+ service_data = findDidVendorIdSource(tvb, service_offset, number_of_attributes);
+ break;
+ case BTSDP_HID_SERVICE_UUID:
+ name_vals = vs_hid_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_hid;
+ profile_speficic = "(HID) ";
+ break;
+ case BTSDP_SYNC_SERVICE_UUID:
+ name_vals = vs_synch_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_synch;
+ profile_speficic = "(SYNCH) ";
+ break;
+ case BTSDP_PBAP_PCE_SERVICE_UUID:
+ case BTSDP_PBAP_PSE_SERVICE_UUID:
+ case BTSDP_PBAP_SERVICE_UUID:
+ name_vals = vs_pbap_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_pbap;
+ profile_speficic = "(PBAP) ";
+ break;
+ case BTSDP_PAN_NAP_SERVICE_UUID:
+ name_vals = vs_pan_nap_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_pan_nap;
+ profile_speficic = "(PAN NAP) ";
+ break;
+ case BTSDP_PAN_GN_SERVICE_UUID:
+ name_vals = vs_pan_gn_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_pan_gn;
+ profile_speficic = "(PAN GN) ";
+ break;
+ case BTSDP_PAN_PANU_SERVICE_UUID:
+ name_vals = vs_pan_panu_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_pan_panu;
+ profile_speficic = "(PAN PANU) ";
+ break;
+ case BTSDP_OPP_SERVICE_UUID:
+ name_vals = vs_opp_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_opp;
+ profile_speficic = "(OPP) ";
+ break;
+ case BTSDP_MAP_SERVICE_UUID:
+ case BTSDP_MAP_ACCESS_SRV_SERVICE_UUID:
+ name_vals = vs_map_mas_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_map_mas;
+ profile_speficic = "(MAP MAS) ";
+ break;
+ case BTSDP_WAP_SERVICE_UUID:
+ case BTSDP_WAP_CLIENT_SERVICE_UUID:
+ name_vals = vs_wap_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_wap;
+ profile_speficic = "(WAP) ";
+ break;
+ case BTSDP_HDP_SERVICE_UUID:
+ case BTSDP_HDP_SOURCE_SERVICE_UUID:
+ case BTSDP_HDP_SINK_SERVICE_UUID:
+ name_vals = vs_hdp_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_hdp;
+ profile_speficic = "(HDP) ";
+ break;
+ case BTSDP_HSP_SERVICE_UUID:
+ case BTSDP_HSP_HS_SERVICE_UUID:
+ name_vals = vs_hsp_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_hsp;
+ profile_speficic = "(HSP) ";
+ break;
+ case BTSDP_HCRP_SERVICE_UUID:
+ case BTSDP_HCRP_PRINT_SERVICE_UUID:
+ case BTSDP_HCRP_SCAN_SERVICE_UUID:
+ name_vals = vs_hcrp_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_hcrp;
+ profile_speficic = "(HCRP) ";
+ break;
+ case BTSDP_HFP_SERVICE_UUID:
+ name_vals = vs_hfp_gw_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_hfp_hf;
+ profile_speficic = "(HFP HS) ";
+ break;
+ case BTSDP_HFP_GW_SERVICE_UUID:
+ name_vals = vs_hfp_ag_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_hfp_ag;
+ profile_speficic = "(HFP AG) ";
+ break;
+ case BTSDP_GNSS_UUID:
+ case BTSDP_GNSS_SERVER_UUID:
+ name_vals = vs_gnss_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_gnss;
+ profile_speficic = "(GNSS) ";
+ break;
+ case BTSDP_FTP_SERVICE_UUID:
+ name_vals = vs_ftp_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_ftp;
+ profile_speficic = "(FTP) ";
+ break;
+ case BTSDP_FAX_SERVICE_UUID:
+ name_vals = vs_fax_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_fax;
+ profile_speficic = "(FAX) ";
+ break;
+ case BTSDP_CTP_SERVICE_UUID:
+ name_vals = vs_ctp_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_ctp;
+ profile_speficic = "(CTP) ";
+ break;
+ case BTSDP_A2DP_SOURCE_SERVICE_UUID:
+ case BTSDP_A2DP_SINK_SERVICE_UUID:
+ case BTSDP_A2DP_DISTRIBUTION_SERVICE_UUID:
+ name_vals = vs_a2dp_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_a2dp;
+ profile_speficic = "(A2DP) ";
+ break;
+ case BTSDP_AVRCP_TG_SERVICE_UUID:
+ case BTSDP_AVRCP_SERVICE_UUID:
+ case BTSDP_AVRCP_CT_SERVICE_UUID:
+ name_vals = vs_avrcp_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_avrcp;
+ profile_speficic = "(AVRCP) ";
+ break;
+ case BTSDP_BIP_SERVICE_UUID:
+ case BTSDP_BIP_RESPONDER_SERVICE_UUID:
+ name_vals = vs_bip_imaging_responder_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_bip_imaging_responder;
+ profile_speficic = "(BIP IR) ";
+ break;
+ case BTSDP_BIP_AUTO_ARCH_SERVICE_UUID:
+ name_vals = vs_bip_imaging_other_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_bip_imaging_other;
+ profile_speficic = "(BIP IAA) ";
+ break;
+ case BTSDP_BIP_REF_OBJ_SERVICE_UUID:
+ name_vals = vs_bip_imaging_other_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_bip_imaging_other;
+ profile_speficic = "(BIP IRO) ";
+ break;
+ case BTSDP_BPP_SERVICE_UUID:
+ case BTSDP_BPP_STATUS_SERVICE_UUID:
+ case BTSDP_BPP_DIRECT_PRINTING_SERVICE_UUID:
+ case BTSDP_BPP_REFERENCE_PRINTING_SERVICE_UUID:
+ name_vals = vs_bpp_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_bpp;
+ profile_speficic = "(BPP) ";
+ break;
+ case BTSDP_BPP_REFLECTED_UI_SERVICE_UUID:
+ name_vals = vs_bpp_reflected_ui_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_bpp_rui;
+ profile_speficic = "(BPP RUI) ";
+ break;
+ case BTSDP_DUN_SERVICE_UUID:
+ name_vals = vs_dun_attribute_id;
+ hfx_attribute_id = hf_service_attribute_id_dun;
+ profile_speficic = "(DUN) ";
+ break;
+ }
+
if (name_vals && try_val_to_str(id, name_vals)) {
attribute_name = val_to_str(id, name_vals, "Unknown");
} else {
@@ -1545,6 +3347,7 @@ dissect_sdp_service_attribute_list(proto_tree *tree, tvbuff_t *tvb, gint offset,
gint element_length;
gint new_offset;
guint16 service_uuid = 0;
+ gint service_offset;
offset = get_type_length(tvb, offset, &len);
@@ -1581,9 +3384,10 @@ dissect_sdp_service_attribute_list(proto_tree *tree, tvbuff_t *tvb, gint offset,
number_of_attributes += 1;
}
+ service_offset = offset;
while ((offset - start_offset) < len) {
offset = dissect_sdp_service_attribute(next_tree, tvb, offset, pinfo,
- service_uuid, NULL);
+ service_uuid, service_offset, NULL, number_of_attributes);
}
proto_item_set_len(list_item, offset - start_offset);
@@ -2072,10 +3876,1111 @@ proto_register_btsdp(void)
FT_UINT16, BASE_HEX, VALS(vs_general_attribute_id), 0,
NULL, HFILL }
},
+ { &hf_service_attribute_id_a2dp,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_a2dp_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_avrcp,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_avrcp_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_bip_imaging_responder,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_bip_imaging_responder_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_bip_imaging_other,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_bip_imaging_other_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_bpp,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_bpp_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_bpp_rui,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_bpp_reflected_ui_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_ctp,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_ctp_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_did,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_did_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_dun,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_dun_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_fax,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_fax_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_ftp,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_ftp_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_gnss,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_gnss_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_hfp_hf,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_hfp_gw_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_hfp_ag,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_hfp_ag_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_hcrp,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_hcrp_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_hsp,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_hsp_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_hdp,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_hdp_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_hid,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_hid_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_wap,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_wap_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_map_mas,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_map_mas_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_opp,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_opp_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_pan_nap,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_pan_nap_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_pan_gn,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_pan_gn_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_pan_panu,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_pan_panu_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_pbap,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_pbap_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_service_attribute_id_synch,
+ { "Attribute ID", "btsdp.service.attribute",
+ FT_UINT16, BASE_HEX, VALS(vs_synch_attribute_id), 0,
+ NULL, HFILL }
+ },
+ { &hf_did_specification_id,
+ { "Specification ID", "btsdp.service.did.specification_id",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_did_vendor_id,
+ { "Vendor ID", "btsdp.service.did.vendor_id",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_did_vendor_id_bluetooth_sig,
+ { "Vendor ID", "btsdp.service.did.vendor_id",
+ FT_UINT16, BASE_HEX, &bthci_evt_comp_id_ext, 0,
+ NULL, HFILL }
+ },
+ { &hf_did_vendor_id_usb_forum,
+ { "Vendor ID", "btsdp.service.did.vendor_id",
+ FT_UINT16, BASE_HEX, &ext_usb_vendors_vals, 0,
+ NULL, HFILL }
+ },
+ { &hf_did_product_id,
+ { "Product ID", "btsdp.service.did.product_id",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_did_primary_record,
+ { "Primary Record", "btsdp.service.did.primary_record",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_did_version,
+ { "Version", "btsdp.service.did.version",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_did_vendor_id_source,
+ { "Vendor ID Source", "btsdp.service.did.vendor_id_source",
+ FT_UINT16, BASE_HEX, VALS(did_vendor_id_source_vals), 0,
+ NULL, HFILL }
+ },
+ { &hf_a2dp_sink_supported_features_reserved,
+ { "Supported Features: Reserved", "btsdp.service.a2dp.sink.supported_features.reserved",
+ FT_UINT16, BASE_HEX, NULL, 0xFFF0,
+ NULL, HFILL }
+ },
+ { &hf_a2dp_sink_supported_features_amplifier,
+ { "Supported Features: Amplifier", "btsdp.service.a2dp.sink.supported_features.amplifier",
+ FT_BOOLEAN, 16, NULL, 0x0008,
+ NULL, HFILL }
+ },
+ { &hf_a2dp_sink_supported_features_recorder,
+ { "Supported Features: Recorder", "btsdp.service.a2dp.sink.supported_features.recorder",
+ FT_BOOLEAN, 16, NULL, 0x0004,
+ NULL, HFILL }
+ },
+ { &hf_a2dp_sink_supported_features_speaker,
+ { "Supported Features: Speaker", "btsdp.service.a2dp.sink.supported_features.speaker",
+ FT_BOOLEAN, 16, NULL, 0x0002,
+ NULL, HFILL }
+ },
+ { &hf_a2dp_sink_supported_features_headphone,
+ { "Supported Features: Headphone", "btsdp.service.a2dp.sink.supported_features.headphone",
+ FT_BOOLEAN, 16, NULL, 0x0001,
+ NULL, HFILL }
+ },
+ { &hf_a2dp_source_supported_features_reserved,
+ { "Supported Features: Reserved", "btsdp.service.a2dp.source.supported_features.reserved",
+ FT_UINT16, BASE_HEX, NULL, 0xFFF0,
+ NULL, HFILL }
+ },
+ { &hf_a2dp_source_supported_features_mixer,
+ { "Supported Features: Mixer", "btsdp.service.a2dp.source.supported_features.mixer",
+ FT_BOOLEAN, 16, NULL, 0x0008,
+ NULL, HFILL }
+ },
+ { &hf_a2dp_source_supported_features_tuner,
+ { "Supported Features: Tuner", "btsdp.service.a2dp.source.supported_features.tuner",
+ FT_BOOLEAN, 16, NULL, 0x0004,
+ NULL, HFILL }
+ },
+ { &hf_a2dp_source_supported_features_microphone,
+ { "Supported Features: Microphone", "btsdp.service.a2dp.source.supported_features.microphone",
+ FT_BOOLEAN, 16, NULL, 0x0002,
+ NULL, HFILL }
+ },
+ { &hf_a2dp_source_supported_features_player,
+ { "Supported Features: Player", "btsdp.service.a2dp.source.supported_features.player",
+ FT_BOOLEAN, 16, NULL, 0x0001,
+ NULL, HFILL }
+ },
+ { &hf_synch_supported_data_store,
+ { "Supported Data Store", "btsdp.service.synch.supported_data_store",
+ FT_UINT8, BASE_HEX, VALS(synch_supported_data_store_vals), 0,
+ NULL, HFILL }
+ },
+ { &hf_ctp_external_network,
+ { "External Network", "btsdp.service.ctp.external_network",
+ FT_UINT8, BASE_HEX, VALS(ctp_external_network_vals), 0,
+ NULL, HFILL }
+ },
+ { &hf_avrcp_ct_supported_features_reserved_7_15,
+ { "Supported Features: Reserved", "btsdp.service.avrcp.ct.supported_features.reserved",
+ FT_UINT16, BASE_HEX, NULL, 0xFF80,
+ NULL, HFILL }
+ },
+ { &hf_avrcp_ct_supported_features_browsing,
+ { "Supported Features: Browsing", "btsdp.service.avrcp.ct.supported_features.browsing",
+ FT_BOOLEAN, 16, NULL, 0x0040,
+ NULL, HFILL }
+ },
+ { &hf_avrcp_ct_supported_features_reserved_4_5,
+ { "Supported Features: Reserved", "btsdp.service.avrcp.ct.supported_features.reserved",
+ FT_UINT16, BASE_HEX, NULL, 0x0030,
+ NULL, HFILL }
+ },
+ { &hf_avrcp_ct_supported_features_category_4,
+ { "Supported Features: Category 4: Menu", "btsdp.service.avrcp.ct.supported_features.category_4",
+ FT_BOOLEAN, 16, NULL, 0x0008,
+ NULL, HFILL }
+ },
+ { &hf_avrcp_ct_supported_features_category_3,
+ { "Supported Features: Category 3: Tuner", "btsdp.service.avrcp.ct.supported_features.category_3",
+ FT_BOOLEAN, 16, NULL, 0x0004,
+ NULL, HFILL }
+ },
+ { &hf_avrcp_ct_supported_features_category_2,
+ { "Supported Features: Category 2: Monitor/Amplifier", "btsdp.service.avrcp.ct.supported_features.category_2",
+ FT_BOOLEAN, 16, NULL, 0x0002,
+ NULL, HFILL }
+ },
+ { &hf_avrcp_ct_supported_features_category_1,
+ { "Supported Features: Category 1: Player/Recorder", "btsdp.service.avrcp.ct.supported_features.category_1",
+ FT_BOOLEAN, 16, NULL, 0x0001,
+ NULL, HFILL }
+ },
+ { &hf_avrcp_tg_supported_features_reserved_8_15,
+ { "Supported Features: Reserved", "btsdp.service.avrcp.tg.supported_features.reserved",
+ FT_UINT16, BASE_HEX, NULL, 0xFF00,
+ NULL, HFILL }
+ },
+ { &hf_avrcp_tg_supported_features_multiple_player,
+ { "Supported Features: Multiple Player", "btsdp.service.avrcp.tg.supported_features.multiple_player",
+ FT_BOOLEAN, 16, NULL, 0x0080,
+ NULL, HFILL }
+ },
+ { &hf_avrcp_tg_supported_features_browsing,
+ { "Supported Features: Browsing", "btsdp.service.avrcp.tg.supported_features.browsing",
+ FT_BOOLEAN, 16, NULL, 0x0040,
+ NULL, HFILL }
+ },
+ { &hf_avrcp_tg_supported_features_group_navigation,
+ { "Supported Features: Group Navigation", "btsdp.service.avrcp.tg.supported_features.group_navigation",
+ FT_BOOLEAN, 16, NULL, 0x0020,
+ NULL, HFILL }
+ },
+ { &hf_avrcp_tg_supported_features_settings,
+ { "Supported Features: Settings", "btsdp.service.avrcp.tg.supported_features.settings",
+ FT_BOOLEAN, 16, NULL, 0x0010,
+ NULL, HFILL }
+ },
+ { &hf_avrcp_tg_supported_features_category_4,
+ { "Supported Features: Category 4: Menu", "btsdp.service.avrcp.tg.supported_features.category_4",
+ FT_BOOLEAN, 16, NULL, 0x0008,
+ NULL, HFILL }
+ },
+ { &hf_avrcp_tg_supported_features_category_3,
+ { "Supported Features: Category 3: Tuner", "btsdp.service.avrcp.tg.supported_features.category_3",
+ FT_BOOLEAN, 16, NULL, 0x0004,
+ NULL, HFILL }
+ },
+ { &hf_avrcp_tg_supported_features_category_2,
+ { "Supported Features: Category 2: Monitor/Amplifier", "btsdp.service.avrcp.tg.supported_features.category_2",
+ FT_BOOLEAN, 16, NULL, 0x0002,
+ NULL, HFILL }
+ },
+ { &hf_avrcp_tg_supported_features_category_1,
+ { "Supported Features: Category 1: Player/Recorder", "btsdp.service.avrcp.tg.supported_features.category_1",
+ FT_BOOLEAN, 16, NULL, 0x0001,
+ NULL, HFILL }
+ },
+ { &hf_hsp_remote_audio_volume_control,
+ { "Remote Audio Volume Control", "btsdp.service.hsp.remote_audio_volume_control",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_gnss_supported_features,
+ { "Supported Features: Reserved", "btsdp.service.gnss.supported_features.reserved",
+ FT_UINT16, BASE_HEX, NULL, 0xFFFF,
+ NULL, HFILL }
+ },
+ { &hf_pbap_pse_supported_repositories_reserved,
+ { "Supported Repositories: Reserved", "btsdp.service.pbap.pse.supported_repositories.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0xFC,
+ NULL, HFILL }
+ },
+ { &hf_pbap_pse_supported_repositories_sim_card,
+ { "Supported Repositories: SIM Card", "btsdp.service.pbap.pse.supported_repositories.sim_card",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL }
+ },
+ { &hf_pbap_pse_supported_repositories_local_phonebook,
+ { "Supported Repositories: Local Phonebook", "btsdp.service.pbap.pse.supported_repositories.local_phonebook",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL }
+ },
+ { &hf_dun_support_audio_feedback,
+ { "Support: Audio Feedback", "btsdp.dun.support.audio_feedback",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_dun_escape_sequence,
+ { "Escape Sequence", "btsdp.dun.support.escape_sequence",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_fax_support_class_1,
+ { "Support: Fax Class 1", "btsdp.fax.support.class_1",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_fax_support_class_2,
+ { "Support: Fax Class 2.0", "btsdp.fax.support.class_2",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_fax_support_class_2_vendor,
+ { "Support: Fax Class 2 Vendor", "btsdp.fax.support.class_2_vendor",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_fax_support_audio_feedback,
+ { "Support: Audio Feedback", "btsdp.fax.support.audio_feedback",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_ftp_goep_l2cap_psm,
+ { "GOEP L2CAP PSM", "btsdp.ftp.goep_l2cap_psm",
+ FT_UINT16, BASE_DEC_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_map_mas_instance_id,
+ { "MAS Instance ID", "btsdp.map.mas.instance_id",
+ FT_UINT8, BASE_DEC_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_map_mas_supported_message_types_reserved,
+ { "Supported Message Types: Reserved", "btsdp.map.mas.supported_message_types.reserved",
+ FT_UINT8, BASE_DEC_HEX, NULL, 0xF0,
+ NULL, HFILL }
+ },
+ { &hf_map_mas_supported_message_types_mms,
+ { "Supported Message Types: MMS", "btsdp.map.mas.supported_message_types.mms",
+ FT_BOOLEAN, 8, NULL, 0x08,
+ NULL, HFILL }
+ },
+ { &hf_map_mas_supported_message_types_sms_cdma,
+ { "Supported Message Types: SMS CDMA", "btsdp.map.mas.supported_message_types.sms_cdma",
+ FT_BOOLEAN, 8, NULL, 0x04,
+ NULL, HFILL }
+ },
+ { &hf_map_mas_supported_message_types_sms_gsm,
+ { "Supported Message Types: SMS GSM", "btsdp.map.mas.supported_message_types.sms_gsm",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL }
+ },
+ { &hf_map_mas_supported_message_types_email,
+ { "Supported Message Types: Email", "btsdp.map.mas.supported_message_types.email",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL }
+ },
+ { &hf_hcrp_1284_id,
+ { "1284 ID", "btsdp.hcrp.1284_id",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_hcrp_device_location,
+ { "Sevice Location", "btsdp.hcrp.device_location",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_hcrp_device_name,
+ { "Device Name", "btsdp.hcrp.device_name",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_hcrp_friendly_name,
+ { "Friendly Name", "btsdp.hcrp.friendly_name",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_wap_network_address,
+ { "Network Address", "btsdp.wap.network_address",
+ FT_IPv4, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_wap_homepage_url,
+ { "Homepage URL", "btsdp.wap.network_address",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_wap_gateway,
+ { "Gateway", "btsdp.wap.gateway",
+ FT_UINT8, BASE_HEX, VALS(wap_gateway_vals), 0,
+ NULL, HFILL }
+ },
+ { &hf_wap_stack_type,
+ { "Stack Type", "btsdp.wap.stack_type",
+ FT_UINT8, BASE_HEX, VALS(wap_stack_type_vals), 0,
+ NULL, HFILL }
+ },
+ { &hf_hdp_support_procedure_reserved_5_7,
+ { "Support: Reserved", "btsdp.hdp.support.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0xE0,
+ NULL, HFILL }
+ },
+ { &hf_hdp_support_procedure_sync_master_role,
+ { "Support: SyncMaster Role", "btsdp.hdp.support.sync_master_role",
+ FT_BOOLEAN, 8, NULL, 0x10,
+ NULL, HFILL }
+ },
+ { &hf_hdp_support_procedure_clock_synchronization_protocol,
+ { "Support: Clock Synchronization Protocol", "btsdp.hdp.support.clock_synchronization_protocol",
+ FT_BOOLEAN, 8, NULL, 0x08,
+ NULL, HFILL }
+ },
+ { &hf_hdp_support_procedure_reconnect_acceptance,
+ { "Support: Reconnect Acceptance", "btsdp.hdp.support.reconnect_acceptance",
+ FT_BOOLEAN, 8, NULL, 0x04,
+ NULL, HFILL }
+ },
+ { &hf_hdp_support_procedure_reconnect_initiation,
+ { "Support: Reconnect Initiation", "btsdp.hdp.support.reconnect_initiation",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL }
+ },
+ { &hf_hdp_support_procedure_reserved,
+ { "Support: Reserved", "btsdp.hdp.support.reserved",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL }
+ },
+ { &hf_hdp_data_exchange,
+ { "Data Exchange Specification", "btsdp.hdp.data_exchange_specification",
+ FT_UINT8, BASE_HEX, VALS(hdp_data_exchange_specification_vals), 0,
+ NULL, HFILL }
+ },
+ { &hf_hdp_supported_features_mdep_id,
+ { "MDEP ID", "btsdp.hdp.supported_features.mdep_id",
+ FT_UINT8, BASE_DEC_HEX|BASE_RANGE_STRING, RVALS(hdp_mdep_id_rvals), 0,
+ NULL, HFILL }
+ },
+ { &hf_hdp_supported_features_mdep_data_type,
+ { "MDEP Data Type", "btsdp.hdp.supported_features.mdep_data_type",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_hdp_supported_features_mdep_role,
+ { "MDEP Role", "btsdp.hdp.supported_features.mdep_role",
+ FT_UINT8, BASE_HEX, VALS(hdp_mdep_role_vals), 0,
+ NULL, HFILL }
+ },
+ { &hf_hdp_supported_features_mdep_description,
+ { "MDEP Description", "btsdp.hdp.supported_features.mdep_description",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_pan_sercurity_description,
+ { "Security Description", "btsdp.pan.security_description",
+ FT_UINT16, BASE_HEX, VALS(pan_security_description_vals), 0,
+ NULL, HFILL }
+ },
+ { &hf_pan_ipv4_subnet,
+ { "IPv4 Subnet", "btsdp.pan.ipv4_subnet",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_pan_ipv6_subnet,
+ { "IPv6 Subnet", "btsdp.pan.ipv6_subnet",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_pan_net_access_type,
+ { "Net Access Type", "btsdp.pan.net_access_type",
+ FT_UINT16, BASE_HEX, VALS(pan_net_access_type_vals), 0,
+ NULL, HFILL }
+ },
+ { &hf_pan_max_net_access_rate,
+ { "Max Net Access Rate", "btsdp.pan.max_net_access_rate",
+ FT_UINT32, BASE_DEC_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_opp_goep_l2cap_psm,
+ { "GOEP L2CAP PSM", "btsdp.opp.goep_l2cap_psm",
+ FT_UINT16, BASE_DEC_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_opp_supported_format,
+ { "Supported Format", "btsdp.opp.supported_format",
+ FT_UINT8, BASE_HEX, VALS(opp_supported_format_vals), 0,
+ NULL, HFILL }
+ },
+ { &hf_hfp_hf_supported_features_reserved,
+ { "Supported Features: Reserved", "btsdp.service.hfp.hf.supported_features.reserved",
+ FT_UINT16, BASE_HEX, NULL, 0xFFC0,
+ NULL, HFILL }
+ },
+ { &hf_hfp_hf_supported_features_wide_band_speech,
+ { "Supported Features: Wide Band Speech", "btsdp.service.hfp.hf.supported_features.wide_band_speech",
+ FT_BOOLEAN, 16, NULL, 0x0020,
+ NULL, HFILL }
+ },
+ { &hf_hfp_hf_supported_features_remote_volume_control,
+ { "Supported Features: Remote Volume Control", "btsdp.service.hfp.hf.supported_features.remote_volume_control",
+ FT_BOOLEAN, 16, NULL, 0x0010,
+ NULL, HFILL }
+ },
+ { &hf_hfp_hf_supported_features_voice_recognition_activation,
+ { "Supported Features: Voice Recognition Activation", "btsdp.service.hfp.hf.supported_features.voice_recognition_activation",
+ FT_BOOLEAN, 16, NULL, 0x0008,
+ NULL, HFILL }
+ },
+ { &hf_hfp_hf_supported_features_cli_presentation_capability,
+ { "Supported Features: CLI Presentation Capability", "btsdp.service.hfp.hf.supported_features.cli_presentation_capability",
+ FT_BOOLEAN, 16, NULL, 0x0004,
+ NULL, HFILL }
+ },
+ { &hf_hfp_hf_supported_features_call_waiting_or_three_way_calling,
+ { "Supported Features: Call Waiting or Three Way Calling", "btsdp.service.hfp.hf.supported_features.call_waiting_or_three_way_calling",
+ FT_BOOLEAN, 16, NULL, 0x0002,
+ NULL, HFILL }
+ },
+ { &hf_hfp_hf_supported_features_ec_and_or_nr_function,
+ { "Supported Features: EC and/or Nr Function", "btsdp.service.hfp.hf.supported_features.ec_and_or_nr_function",
+ FT_BOOLEAN, 16, NULL, 0x0001,
+ NULL, HFILL }
+ },
+ { &hf_hfp_gw_supported_features_reserved,
+ { "Supported Features: Reserved", "btsdp.service.hfp.gw.supported_features.reserved",
+ FT_UINT16, BASE_HEX, NULL, 0xFFC0,
+ NULL, HFILL }
+ },
+ { &hf_hfp_gw_supported_features_wide_band_speech,
+ { "Supported Features: Wide Band Speech", "btsdp.service.hfp.gw.supported_features.wide_band_speech",
+ FT_BOOLEAN, 16, NULL, 0x0020,
+ NULL, HFILL }
+ },
+ { &hf_hfp_gw_supported_features_attach_phone_number_to_voice_tag,
+ { "Supported Features: Attach a Phone Number to a Voice Tag", "btsdp.service.hfp.gw.supported_features.attach_a_phone_number_to_a_voice_tag",
+ FT_BOOLEAN, 16, NULL, 0x0010,
+ NULL, HFILL }
+ },
+ { &hf_hfp_gw_supported_features_inband_ring_tone_capability,
+ { "Supported Features: Inband Ring Tone Capability", "btsdp.service.hfp.gw.supported_features.inband_ring_tone_capability",
+ FT_BOOLEAN, 16, NULL, 0x0008,
+ NULL, HFILL }
+ },
+ { &hf_hfp_gw_supported_features_voice_recognition_function,
+ { "Supported Features: Voice Recognition Function", "btsdp.service.hfp.gw.supported_features.voice_recognition_function",
+ FT_BOOLEAN, 16, NULL, 0x0004,
+ NULL, HFILL }
+ },
+ { &hf_hfp_gw_supported_features_ec_and_or_nr_function,
+ { "Supported Features: EC and/or Nr Function", "btsdp.service.hfp.gw.supported_features.ec_and_or_nr_function",
+ FT_BOOLEAN, 16, NULL, 0x0002,
+ NULL, HFILL }
+ },
+ { &hf_hfp_gw_supported_features_three_way_calling,
+ { "Supported Features: Three Way Calling", "btsdp.service.hfp.gw.supported_features.three_way_calling",
+ FT_BOOLEAN, 16, NULL, 0x0001,
+ NULL, HFILL }
+ },
+ { &hf_hfp_gw_network,
+ { "Network", "btsdp.service.hfp.gw.network",
+ FT_UINT8, BASE_HEX, VALS(hfp_gw_network_vals), 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_service_uuid,
+ { "Service UUID", "btsdp.service_uuid",
+ FT_UINT16, BASE_HEX, VALS(vs_service_classes), 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_service_long_uuid,
+ { "Service UUID", "btsdp.service_uuid",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_protocol_psm,
+ { "L2CAP PSM", "btsdp.protocol.psm",
+ FT_UINT16, BASE_DEC_HEX, &ext_psm_vals, 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_protocol_channel,
+ { "RFCOMM Channel", "btsdp.protocol.channel",
+ FT_UINT8, BASE_DEC_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_protocol_gatt_handle_start,
+ { "GATT Handle Start", "btsdp.protocol.gatt_handle_start",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_protocol_gatt_handle_end,
+ { "GATT Handle Start", "btsdp.protocol.gatt_handle_end",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_protocol_version,
+ { "Protocol Version", "btsdp.protocol.version",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_protocol_bnep_type,
+ { "BNEP Type", "btsdp.protocol.bnep_type",
+ FT_UINT16, BASE_HEX, VALS(etype_vals), 0,
+ NULL, HFILL }
+ },
{ &hf_sdp_service_record_handle,
{ "Service Record Handle", "btsdp.service_record_handle",
FT_UINT32, BASE_HEX, NULL, 0,
NULL, HFILL }
+ },
+ { &hf_sdp_service_record_state,
+ { "Service Record State", "btsdp.service_record_state",
+ FT_UINT32, BASE_HEX_DEC, NULL, 0,
+ NULL, HFILL }
+ },
+
+ { &hf_sdp_service_info_time_to_live,
+ { "Service Info Time to Live", "btsdp.service_info_time_to_live",
+ FT_UINT32, BASE_DEC_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_service_availability,
+ { "Service Availability", "btsdp.service_availability",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_service_documentation_url,
+ { "Documentation URL", "btsdp.documentation_url",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_service_client_executable_url,
+ { "Service Client Executable URL", "btsdp.service_client_executable_url",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_service_icon_url,
+ { "Icon URL", "btsdp.icon_url",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_service_name,
+ { "Service Name", "btsdp.service_name",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_service_description,
+ { "Service Description", "btsdp.service_description",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_service_provider_name,
+ { "Provider Name", "btsdp.provider_name",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_lang_code,
+ { "Language Code", "btsdp.lang.code",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_lang_id,
+ { "Language ID", "btsdp.lang.id",
+ FT_UINT16, BASE_HEX|BASE_EXT_STRING, &usb_langid_vals_ext, 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_lang_encoding,
+ { "Language Encoding", "btsdp.lang.encoding",
+ FT_UINT16, BASE_HEX|BASE_EXT_STRING, &wap_mib_enum_vals_character_sets_ext, 0,
+ NULL, HFILL }
+ },
+ { &hf_sdp_lang_attribute_base,
+ { "Attribute Base", "btsdp.lang.attribute_base",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_hid_device_release_number,
+ { "Device Release Number", "btsdp.service.hid.device_release_number",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_hid_parser_version,
+ { "Parser Version", "btsdp.service.hid.parser_version",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_hid_device_subclass_type,
+ { "Device Subclass: Type", "btsdp.service.hid.device_subclass.type",
+ FT_UINT8, BASE_HEX, VALS(hid_device_subclass_type_vals), 0xC0,
+ NULL, HFILL }
+ },
+ { &hf_hid_device_subclass_subtype,
+ { "Device Subclass: SubType", "btsdp.service.hid.device_subclass.subtype",
+ FT_UINT8, BASE_HEX, VALS(hid_device_subclass_subtype_vals), 0x3C,
+ NULL, HFILL }
+ },
+ { &hf_hid_device_subclass_reserved,
+ { "Device Subclass: Reserved", "btsdp.service.hid.device_subclass.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0x03,
+ NULL, HFILL }
+ },
+ { &hf_hid_country_code,
+ { "Country Code", "btsdp.service.hid.country_code",
+ FT_UINT8, BASE_DEC_HEX, VALS(hid_country_code_vals), 0,
+ NULL, HFILL }
+ },
+ { &hf_hid_virtual_cable,
+ { "Virtual Cable", "btsdp.service.hid.virtual_cable",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_hid_reconnect_initiate,
+ { "Reconnect Initiate", "btsdp.service.hid.reconnect_initiate",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_hid_sdp_disable,
+ { "SDP Disable", "btsdp.service.hid.sdp_disable",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_hid_battery_power,
+ { "Battery Power", "btsdp.service.hid.battery_power",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_hid_remote_wake,
+ { "Remote Wake", "btsdp.service.hid.remote_wake",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_hid_normally_connectable,
+ { "Normally Connectable", "btsdp.service.hid.normally_connectable",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_hid_boot_device,
+ { "Boot Device", "btsdp.service.hid.boot_device",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_hid_profile_version,
+ { "Profile Version", "btsdp.service.hid.profile_version",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_hid_supervision_timeout,
+ { "Supervision Timeout", "btsdp.service.hid.supervision_timeout",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_hid_ssr_host_max_latency,
+ { "SSR Host Max Latency", "btsdp.service.hid.ssr_host_max_latency",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_hid_ssr_host_min_timeout,
+ { "SSR Host Min Timeout", "btsdp.service.hid.ssr_host_min_timeout",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_hid_descriptor_list_type,
+ { "Descriptor Type", "btsdp.service.hid.descriptor.type",
+ FT_UINT8, BASE_HEX, VALS(descriptor_list_type_vals), 0,
+ NULL, HFILL }
+ },
+ { &hf_hid_descriptor_list_descriptor,
+ { "Descriptor", "btsdp.service.hid.descriptor_list.descriptor",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_capabilities_reserved_4_7,
+ { "Supported Capabilities: Reserved", "btsdp.service.bip.supported_capabilities.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0xF0,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_capabilities_displaying,
+ { "Supported Capabilities: Displaying", "btsdp.service.bip.supported_capabilities.displaying",
+ FT_BOOLEAN, 8, NULL, 0x08,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_capabilities_printing,
+ { "Supported Capabilities: Printing", "btsdp.service.bip.supported_capabilities.printing",
+ FT_BOOLEAN, 8, NULL, 0x04,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_capabilities_capturing,
+ { "Supported Capabilities: Capturing", "btsdp.service.bip.supported_capabilities.capturing",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_capabilities_genering_imaging,
+ { "Supported Capabilities: Genering Imaging", "btsdp.service.bip.supported_capabilities.genering_imaging",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_features_reserved_9_15,
+ { "Supported Features: Reserved", "btsdp.service.bip.supported_features.reserved",
+ FT_UINT16, BASE_HEX, NULL, 0xFE00,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_features_remote_display,
+ { "Supported Features: Remote Display", "btsdp.service.bip.supported_features.remote_display",
+ FT_BOOLEAN, 16, NULL, 0x0100,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_features_remote_camera,
+ { "Supported Features: Remote Camera", "btsdp.service.bip.supported_features.remote_camera",
+ FT_BOOLEAN, 16, NULL, 0x0080,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_features_automatic_archive,
+ { "Supported Features: Automatic Archive", "btsdp.service.bip.supported_features.automatic_archive",
+ FT_BOOLEAN, 16, NULL, 0x0040,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_features_advanced_image_printing,
+ { "Supported Features: Advanced Image Printing","btsdp.service.bip.supported_features.advanced_image_printing",
+ FT_BOOLEAN, 16, NULL, 0x0020,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_features_image_pull,
+ { "Supported Features: Image Pull", "btsdp.service.bip.supported_features.image_pull",
+ FT_BOOLEAN, 16, NULL, 0x0010,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_features_image_push_display,
+ { "Supported Features: Image Push Display", "btsdp.service.bip.supported_features.image_push_display",
+ FT_BOOLEAN, 16, NULL, 0x0008,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_features_image_push_print,
+ { "Supported Features: Image Push Print", "btsdp.service.bip.supported_features.image_push_print",
+ FT_BOOLEAN, 16, NULL, 0x0004,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_features_image_push_store,
+ { "Supported Features: Image Push Store", "btsdp.service.bip.supported_features.image_push_store",
+ FT_BOOLEAN, 16, NULL, 0x0002,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_features_image_push,
+ { "Supported Features: Image Push", "btsdp.service.bip.supported_features.image_push",
+ FT_BOOLEAN, 16, NULL, 0x0001,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_reserved_17_31,
+ { "Supported Functions: Reserved", "btsdp.service.bip.supported_functions.reserved",
+ FT_UINT32, BASE_HEX, NULL, 0xFFFE0000,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_reserved_13_31,
+ { "Supported Functions: Reserved", "btsdp.service.bip.supported_functions.reserved",
+ FT_UINT32, BASE_HEX, NULL, 0xFFFFE000,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_reserved_11_31,
+ { "Supported Functions: Reserved", "btsdp.service.bip.supported_functions.reserved",
+ FT_UINT32, BASE_HEX, NULL, 0xFFFFF800,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_reserved_1_11,
+ { "Supported Functions: Reserved", "btsdp.service.bip.supported_functions.reserved",
+ FT_UINT32, BASE_HEX, NULL, 0x00000FFE,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_reserved_1_4,
+ { "Supported Functions: Reserved", "btsdp.service.bip.supported_functions.reserved",
+ FT_UINT32, BASE_HEX, NULL, 0x0000001E,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_get_status,
+ { "Supported Functions: Get Status", "btsdp.service.bip.supported_functions.get_status",
+ FT_BOOLEAN, 32, NULL, 0x00010000,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_reserved_15,
+ { "Supported Functions: Reserved", "btsdp.service.bip.supported_functions.reserved_15",
+ FT_BOOLEAN, 32, NULL, 0x00008000,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_get_monitoring_image,
+ { "Supported Functions: Get Monitoring Image", "btsdp.service.bip.supported_functions.get_monitoring_image",
+ FT_BOOLEAN, 32, NULL, 0x00004000,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_start_archive,
+ { "Supported Functions: Start Archive", "btsdp.service.bip.supported_functions.start_archive",
+ FT_BOOLEAN, 32, NULL, 0x00002000,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_reserved_12,
+ { "Supported Functions: Reserved", "btsdp.service.bip.supported_functions.reserved_12",
+ FT_BOOLEAN, 32, NULL, 0x00001000,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_get_partial_image,
+ { "Supported Functions: Get Partial Image", "btsdp.service.bip.supported_functions.get_partial_image",
+ FT_BOOLEAN, 32, NULL, 0x00001000,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_start_print,
+ { "Supported Functions: Start Print", "btsdp.service.bip.supported_functions.start_print",
+ FT_BOOLEAN, 32, NULL, 0x00000800,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_delete_image,
+ { "Supported Functions: Delete Image", "btsdp.service.bip.supported_functions.delete_image",
+ FT_BOOLEAN, 32, NULL, 0x00000400,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_get_linked_attachment,
+ { "Supported Functions: Get Linked Attachment","btsdp.service.bip.supported_functions.get_linked_attachment",
+ FT_BOOLEAN, 32, NULL, 0x00000200,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_get_linked_thumbnail,
+ { "Supported Functions: Get Linked Thumbnail", "btsdp.service.bip.supported_functions.get_linked_thumbnail",
+ FT_BOOLEAN, 32, NULL, 0x00000100,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_get_image,
+ { "Supported Functions: Get Image", "btsdp.service.bip.supported_functions.get_image",
+ FT_BOOLEAN, 32, NULL, 0x00000080,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_get_image_property,
+ { "Supported Functions: Get Image Property", "btsdp.service.bip.supported_functions.get_image_property",
+ FT_BOOLEAN, 32, NULL, 0x00000040,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_get_images_list,
+ { "Supported Functions: Get Images List", "btsdp.service.bip.supported_functions.get_images_list",
+ FT_BOOLEAN, 32, NULL, 0x00000020,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_remote_display,
+ { "Supported Functions: Remote Display", "btsdp.service.bip.supported_functions.remote_display",
+ FT_BOOLEAN, 32, NULL, 0x00000010,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_put_linked_thumbnail,
+ { "Supported Functions: Put Linked Thumbnail", "btsdp.service.bip.supported_functions.put_linked_thumbnail",
+ FT_BOOLEAN, 32, NULL, 0x00000008,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_put_linked_attachment,
+ { "Supported Functions: Put Linked Attachment","btsdp.service.bip.supported_functions.put_linked_attachment",
+ FT_BOOLEAN, 32, NULL, 0x00000004,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_put_image,
+ { "Supported Functions: Put Image", "btsdp.service.bip.supported_functions.put_image",
+ FT_BOOLEAN, 32, NULL, 0x00000002,
+ NULL, HFILL }
+ },
+ { &hf_bip_supported_functions_get_capabilities,
+ { "Supported Functions: Get Capabilities", "btsdp.service.bip.supported_functions.get_capabilities",
+ FT_BOOLEAN, 32, NULL, 0x00000001,
+ NULL, HFILL }
+ },
+ { &hf_bip_total_imaging_data_capacity,
+ { "Total Imaging Data Capacity", "btsdp.bip.total_imaging_data_capacity",
+ FT_UINT64, BASE_DEC, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bip_goep_l2cap_psm,
+ { "GOEP L2CAP PSM", "btsdp.bip.goep_l2cap_psm",
+ FT_UINT16, BASE_DEC_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_document_formats_supported,
+ { "Document Formats Supported", "btsdp.service.bpp.document_formats_supported",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_character_repertoires_support,
+ { "Character Repertoires Support", "btsdp.service.bpp.character_repertoires_support",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_xhtml_print_image_formats_supported,
+ { "XHTML Print Image Formats Supported", "btsdp.service.bpp.xhtml_print_image_formats_supported",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_color_supported,
+ { "Color Supported", "btsdp.service.bpp.color_supported",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_1284_id,
+ { "1284 ID", "btsdp.service.bpp.1284_id",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_printer_name,
+ { "Printer Name", "btsdp.service.bpp.printer_name",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_printer_location,
+ { "Printer Location", "btsdp.service.bpp.location",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_duplex_supported,
+ { "Duplex Supported", "btsdp.service.bpp.duplex_supported",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_media_types_supported,
+ { "Media Types Supported", "btsdp.service.bpp.media_types_supported",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_max_media_width,
+ { "Max Media Width", "btsdp.service.bpp.max_media_width",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_max_media_length,
+ { "Max Media Length", "btsdp.service.bpp.max_media_length",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_enhanced_layout_supported,
+ { "Enhanced Layout Supported", "btsdp.service.bpp.enhanced_layout_supported",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_rui_formats_supported,
+ { "RUI Formats Supported", "btsdp.service.bpp.rui_formats_supported",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_reference_printing_rui_supported,
+ { "Reference Printing RUI Supported","btsdp.service.bpp.reference_printing_rui_supported",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_direct_printing_rui_supported,
+ { "Direct Printing RUI Supported", "btsdp.service.bpp.direct_printing_rui_supported",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_reference_printing_top_url,
+ { "Reference Printing Top URL", "btsdp.service.bpp.reference_printing_top_url",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_direct_printing_top_url,
+ { "Direct Printing Top URL", "btsdp.service.bpp.direct_printing_top_url",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_device_name,
+ { "Device Name", "btsdp.service.bpp.device_name",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_bpp_printer_admin_rui_top_url,
+ { "Printer Admin RUI Top URL", "btsdp.service.bpp.printer_admin_rui_top_url",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }
}
};
@@ -2091,7 +4996,13 @@ proto_register_btsdp(void)
&ett_btsdp_continuation_state,
&ett_btsdp_data_element,
&ett_btsdp_data_element_value,
- &ett_btsdp_reassembled
+ &ett_btsdp_reassembled,
+ &ett_btsdp_supported_features,
+ &ett_btsdp_supported_features_mdep_id,
+ &ett_btsdp_supported_features_mdep_data_type,
+ &ett_btsdp_supported_features_mdep_role,
+ &ett_btsdp_supported_features_mdep_description,
+ &ett_btsdp_protocol
};
proto_btsdp = proto_register_protocol("Bluetooth SDP Protocol", "BT SDP", "btsdp");
@@ -2105,9 +5016,6 @@ proto_register_btsdp(void)
continuation_states = se_tree_create(EMEM_TREE_TYPE_RED_BLACK,
"btsdp reassembling by continuation state");
- service_infos = se_tree_create(EMEM_TREE_TYPE_RED_BLACK,
- "btsdp service infos");
- sdp_package.service_infos = service_infos;
btsdp_tap = register_tap("btsdp");
module = prefs_register_protocol(proto_btsdp, NULL);